aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcHandler.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-12-18 03:33:36 -0200
committerGitHub <noreply@github.com>2018-12-18 03:33:36 -0200
commit0039bb639493b2d1e2764cae380311ba8e87704b (patch)
tree63a912a95c8261775c2acb8a5b9ca0f10ad4ae33 /Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcHandler.cs
parent2534a7f10c627810e6e0272b4cc9758e90f733c1 (diff)
Refactor SVC handler (#540)
* Refactor SVC handler * Get rid of KernelErr * Split kernel code files into multiple folders
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcHandler.cs')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcHandler.cs61
1 files changed, 61 insertions, 0 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcHandler.cs b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcHandler.cs
new file mode 100644
index 00000000..08340b06
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcHandler.cs
@@ -0,0 +1,61 @@
+using ChocolArm64.Events;
+using ChocolArm64.Memory;
+using ChocolArm64.State;
+using Ryujinx.HLE.HOS.Ipc;
+using Ryujinx.HLE.HOS.Kernel.Ipc;
+using Ryujinx.HLE.HOS.Kernel.Process;
+using Ryujinx.HLE.HOS.Kernel.Threading;
+using System;
+
+namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
+{
+ partial class SvcHandler
+ {
+ private Switch _device;
+ private KProcess _process;
+ private Horizon _system;
+ private MemoryManager _memory;
+
+ private struct HleIpcMessage
+ {
+ public KThread Thread { get; private set; }
+ public KSession Session { get; private set; }
+ public IpcMessage Message { get; private set; }
+ public long MessagePtr { get; private set; }
+
+ public HleIpcMessage(
+ KThread thread,
+ KSession session,
+ IpcMessage message,
+ long messagePtr)
+ {
+ Thread = thread;
+ Session = session;
+ Message = message;
+ MessagePtr = messagePtr;
+ }
+ }
+
+ public SvcHandler(Switch device, KProcess process)
+ {
+ _device = device;
+ _process = process;
+ _system = device.System;
+ _memory = process.CpuMemory;
+ }
+
+ public void SvcCall(object sender, InstExceptionEventArgs e)
+ {
+ Action<SvcHandler, CpuThreadState> svcFunc = SvcTable.GetSvcFunc(e.Id);
+
+ if (svcFunc == null)
+ {
+ throw new NotImplementedException($"SVC 0x{e.Id:X4} is not implemented.");
+ }
+
+ CpuThreadState threadState = (CpuThreadState)sender;
+
+ svcFunc(this, threadState);
+ }
+ }
+} \ No newline at end of file