SvcHandler.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using ChocolArm64.Events;
  2. using ChocolArm64.Memory;
  3. using ChocolArm64.State;
  4. using Ryujinx.HLE.HOS.Ipc;
  5. using Ryujinx.HLE.HOS.Kernel.Ipc;
  6. using Ryujinx.HLE.HOS.Kernel.Process;
  7. using Ryujinx.HLE.HOS.Kernel.Threading;
  8. using System;
  9. namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
  10. {
  11. partial class SvcHandler
  12. {
  13. private Switch _device;
  14. private KProcess _process;
  15. private Horizon _system;
  16. private MemoryManager _memory;
  17. private struct HleIpcMessage
  18. {
  19. public KThread Thread { get; private set; }
  20. public KSession Session { get; private set; }
  21. public IpcMessage Message { get; private set; }
  22. public long MessagePtr { get; private set; }
  23. public HleIpcMessage(
  24. KThread thread,
  25. KSession session,
  26. IpcMessage message,
  27. long messagePtr)
  28. {
  29. Thread = thread;
  30. Session = session;
  31. Message = message;
  32. MessagePtr = messagePtr;
  33. }
  34. }
  35. public SvcHandler(Switch device, KProcess process)
  36. {
  37. _device = device;
  38. _process = process;
  39. _system = device.System;
  40. _memory = process.CpuMemory;
  41. }
  42. public void SvcCall(object sender, InstExceptionEventArgs e)
  43. {
  44. Action<SvcHandler, CpuThreadState> svcFunc = SvcTable.GetSvcFunc(e.Id);
  45. if (svcFunc == null)
  46. {
  47. throw new NotImplementedException($"SVC 0x{e.Id:X4} is not implemented.");
  48. }
  49. CpuThreadState threadState = (CpuThreadState)sender;
  50. svcFunc(this, threadState);
  51. }
  52. }
  53. }