SyscallHandler.cs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using Ryujinx.Cpu;
  2. using Ryujinx.HLE.HOS.Kernel.Threading;
  3. namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
  4. {
  5. partial class SyscallHandler
  6. {
  7. private readonly KernelContext _context;
  8. public SyscallHandler(KernelContext context)
  9. {
  10. _context = context;
  11. }
  12. public void SvcCall(IExecutionContext context, ulong address, int id)
  13. {
  14. KThread currentThread = KernelStatic.GetCurrentThread();
  15. if (currentThread.Owner != null &&
  16. currentThread.GetUserDisableCount() != 0 &&
  17. currentThread.Owner.PinnedThreads[currentThread.CurrentCore] == null)
  18. {
  19. _context.CriticalSection.Enter();
  20. currentThread.Owner.PinThread(currentThread);
  21. currentThread.SetUserInterruptFlag();
  22. _context.CriticalSection.Leave();
  23. }
  24. if (context.IsAarch32)
  25. {
  26. SyscallDispatch.Dispatch32(_context.Syscall, context, id);
  27. }
  28. else
  29. {
  30. SyscallDispatch.Dispatch64(_context.Syscall, context, id);
  31. }
  32. currentThread.HandlePostSyscall();
  33. }
  34. }
  35. }