aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Process
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Process')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs2
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Process/IProcessContext.cs5
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs17
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Process/ProcessContext.cs9
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Process/ProcessExecutionContext.cs44
5 files changed, 64 insertions, 13 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs b/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs
index e0cd4fbf..0a78a26d 100644
--- a/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs
@@ -115,7 +115,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
string GetReg(int x)
{
- var v = x == 32 ? (ulong)thread.LastPc : context.GetX(x);
+ var v = x == 32 ? context.Pc : context.GetX(x);
if (!AnalyzePointer(out PointerInfo info, v, thread))
{
return $"0x{v:x16}";
diff --git a/Ryujinx.HLE/HOS/Kernel/Process/IProcessContext.cs b/Ryujinx.HLE/HOS/Kernel/Process/IProcessContext.cs
index 707e6d98..c8063a62 100644
--- a/Ryujinx.HLE/HOS/Kernel/Process/IProcessContext.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Process/IProcessContext.cs
@@ -1,4 +1,4 @@
-using ARMeilleure.State;
+using Ryujinx.Cpu;
using Ryujinx.Memory;
using System;
@@ -8,7 +8,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
{
IVirtualMemoryManager AddressSpace { get; }
- void Execute(ExecutionContext context, ulong codeAddress);
+ IExecutionContext CreateExecutionContext(ExceptionCallbacks exceptionCallbacks);
+ void Execute(IExecutionContext context, ulong codeAddress);
void InvalidateCacheRegion(ulong address, ulong size);
}
}
diff --git a/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
index b10737b4..0caeacad 100644
--- a/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
@@ -1,4 +1,3 @@
-using ARMeilleure.State;
using Ryujinx.Common;
using Ryujinx.Common.Logging;
using Ryujinx.Cpu;
@@ -744,14 +743,16 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
}
}
- public void SubscribeThreadEventHandlers(ARMeilleure.State.ExecutionContext context)
+ public IExecutionContext CreateExecutionContext()
{
- context.Interrupt += InterruptHandler;
- context.SupervisorCall += KernelContext.SyscallHandler.SvcCall;
- context.Undefined += UndefinedInstructionHandler;
+ return Context?.CreateExecutionContext(new ExceptionCallbacks(
+ InterruptHandler,
+ null,
+ KernelContext.SyscallHandler.SvcCall,
+ UndefinedInstructionHandler));
}
- private void InterruptHandler(object sender, EventArgs e)
+ private void InterruptHandler(IExecutionContext context)
{
KThread currentThread = KernelStatic.GetCurrentThread();
@@ -1093,12 +1094,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
return false;
}
- private void UndefinedInstructionHandler(object sender, InstUndefinedEventArgs e)
+ private void UndefinedInstructionHandler(IExecutionContext context, ulong address, int opCode)
{
KernelStatic.GetCurrentThread().PrintGuestStackTrace();
KernelStatic.GetCurrentThread()?.PrintGuestRegisterPrintout();
- throw new UndefinedInstructionException(e.Address, e.OpCode);
+ throw new UndefinedInstructionException(address, opCode);
}
protected override void Destroy() => Context.Dispose();
diff --git a/Ryujinx.HLE/HOS/Kernel/Process/ProcessContext.cs b/Ryujinx.HLE/HOS/Kernel/Process/ProcessContext.cs
index bb3a1557..87296830 100644
--- a/Ryujinx.HLE/HOS/Kernel/Process/ProcessContext.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Process/ProcessContext.cs
@@ -1,4 +1,4 @@
-using ARMeilleure.State;
+using Ryujinx.Cpu;
using Ryujinx.Memory;
using System;
@@ -13,7 +13,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
AddressSpace = asManager;
}
- public void Execute(ExecutionContext context, ulong codeAddress)
+ public IExecutionContext CreateExecutionContext(ExceptionCallbacks exceptionCallbacks)
+ {
+ return new ProcessExecutionContext();
+ }
+
+ public void Execute(IExecutionContext context, ulong codeAddress)
{
throw new NotSupportedException();
}
diff --git a/Ryujinx.HLE/HOS/Kernel/Process/ProcessExecutionContext.cs b/Ryujinx.HLE/HOS/Kernel/Process/ProcessExecutionContext.cs
new file mode 100644
index 00000000..a0841252
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Kernel/Process/ProcessExecutionContext.cs
@@ -0,0 +1,44 @@
+using ARMeilleure.State;
+using Ryujinx.Cpu;
+
+namespace Ryujinx.HLE.HOS.Kernel.Process
+{
+ class ProcessExecutionContext : IExecutionContext
+ {
+ public ulong Pc => 0UL;
+
+ public ulong CntfrqEl0 { get => 0; set { } }
+ public ulong CntpctEl0 => 0UL;
+
+ public long TpidrEl0 { get => 0; set { } }
+ public long TpidrroEl0 { get => 0; set { } }
+
+ public uint Pstate { get => 0; set { } }
+
+ public uint Fpcr { get => 0; set { } }
+ public uint Fpsr { get => 0; set { } }
+
+ public bool IsAarch32 { get => false; set { } }
+
+ public bool Running { get; private set; } = true;
+
+ public ulong GetX(int index) => 0UL;
+ public void SetX(int index, ulong value) { }
+
+ public V128 GetV(int index) => default;
+ public void SetV(int index, V128 value) { }
+
+ public void RequestInterrupt()
+ {
+ }
+
+ public void StopRunning()
+ {
+ Running = false;
+ }
+
+ public void Dispose()
+ {
+ }
+ }
+} \ No newline at end of file