From 15d1cc806b1b978bab83d8bb426a124d9f0f788c Mon Sep 17 00:00:00 2001 From: gdkchan Date: Mon, 4 May 2020 00:41:29 -0300 Subject: Move kernel state out of the Horizon class (#1107) * Move kernel state from Horizon to KernelContext * Merge syscalls partial classes, split 32 and 64-bit variants * Sort usings --- .../HOS/Kernel/SupervisorCall/SyscallHandler.cs | 57 ++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallHandler.cs (limited to 'Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallHandler.cs') diff --git a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallHandler.cs b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallHandler.cs new file mode 100644 index 00000000..2d1a3eea --- /dev/null +++ b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallHandler.cs @@ -0,0 +1,57 @@ +using ARMeilleure.State; +using Ryujinx.HLE.HOS.Kernel.Threading; +using System; + +namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall +{ + partial class SyscallHandler + { + private readonly KernelContext _context; + private readonly Syscall32 _syscall32; + private readonly Syscall64 _syscall64; + + public SyscallHandler(KernelContext context) + { + _context = context; + _syscall32 = new Syscall32(context.Syscall); + _syscall64 = new Syscall64(context.Syscall); + } + + public void SvcCall(object sender, InstExceptionEventArgs e) + { + ExecutionContext context = (ExecutionContext)sender; + + if (context.IsAarch32) + { + var svcFunc = SyscallTable.SvcTable32[e.Id]; + + if (svcFunc == null) + { + throw new NotImplementedException($"SVC 0x{e.Id:X4} is not implemented."); + } + + svcFunc(_syscall32, context); + } + else + { + var svcFunc = SyscallTable.SvcTable64[e.Id]; + + if (svcFunc == null) + { + throw new NotImplementedException($"SVC 0x{e.Id:X4} is not implemented."); + } + + svcFunc(_syscall64, context); + } + + PostSvcHandler(); + } + + private void PostSvcHandler() + { + KThread currentThread = _context.Scheduler.GetCurrentThread(); + + currentThread.HandlePostSyscall(); + } + } +} \ No newline at end of file -- cgit v1.2.3