diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallHandler.cs')
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallHandler.cs | 57 |
1 files changed, 57 insertions, 0 deletions
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 |