SvcThread.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using ChocolArm64.Memory;
  2. using ChocolArm64.State;
  3. using Ryujinx.OsHle.Handles;
  4. using System.Threading;
  5. namespace Ryujinx.OsHle.Svc
  6. {
  7. partial class SvcHandler
  8. {
  9. private static void SvcCreateThread(Switch Ns, ARegisters Registers, AMemory Memory)
  10. {
  11. long EntryPoint = (long)Registers.X1;
  12. long ArgsPtr = (long)Registers.X2;
  13. long StackTop = (long)Registers.X3;
  14. int Priority = (int)Registers.X4;
  15. int ProcessorId = (int)Registers.X5;
  16. if (Ns.Os.TryGetProcess(Registers.ProcessId, out Process Process))
  17. {
  18. int Handle = Process.MakeThread(
  19. EntryPoint,
  20. StackTop,
  21. ArgsPtr,
  22. Priority,
  23. ProcessorId);
  24. Registers.X0 = (int)SvcResult.Success;
  25. Registers.X1 = (ulong)Handle;
  26. }
  27. //TODO: Error codes.
  28. }
  29. private static void SvcStartThread(Switch Ns, ARegisters Registers, AMemory Memory)
  30. {
  31. int Handle = (int)Registers.X0;
  32. HThread HndData = Ns.Os.Handles.GetData<HThread>(Handle);
  33. if (HndData != null)
  34. {
  35. HndData.Thread.Execute();
  36. Registers.X0 = (int)SvcResult.Success;
  37. }
  38. //TODO: Error codes.
  39. }
  40. private static void SvcSleepThread(Switch Ns, ARegisters Registers, AMemory Memory)
  41. {
  42. ulong NanoSecs = Registers.X0;
  43. if (NanoSecs == 0)
  44. {
  45. Thread.Yield();
  46. }
  47. else
  48. {
  49. Thread.Sleep((int)(NanoSecs / 1000000));
  50. }
  51. }
  52. private static void SvcGetThreadPriority(Switch Ns, ARegisters Registers, AMemory Memory)
  53. {
  54. int Handle = (int)Registers.X1;
  55. HThread HndData = Ns.Os.Handles.GetData<HThread>(Handle);
  56. if (HndData != null)
  57. {
  58. Registers.X1 = (ulong)HndData.Thread.Priority;
  59. Registers.X0 = (int)SvcResult.Success;
  60. }
  61. //TODO: Error codes.
  62. }
  63. }
  64. }