SvcThread.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using ChocolArm64.State;
  2. using Ryujinx.Core.OsHle.Handles;
  3. namespace Ryujinx.Core.OsHle.Svc
  4. {
  5. partial class SvcHandler
  6. {
  7. private void SvcCreateThread(AThreadState ThreadState)
  8. {
  9. long EntryPoint = (long)ThreadState.X1;
  10. long ArgsPtr = (long)ThreadState.X2;
  11. long StackTop = (long)ThreadState.X3;
  12. int Priority = (int)ThreadState.X4;
  13. int ProcessorId = (int)ThreadState.X5;
  14. if (Ns.Os.TryGetProcess(ThreadState.ProcessId, out Process Process))
  15. {
  16. if (ProcessorId == -2)
  17. {
  18. //TODO: Get this value from the NPDM file.
  19. ProcessorId = 0;
  20. }
  21. int Handle = Process.MakeThread(
  22. EntryPoint,
  23. StackTop,
  24. ArgsPtr,
  25. Priority,
  26. ProcessorId);
  27. ThreadState.X0 = 0;
  28. ThreadState.X1 = (ulong)Handle;
  29. }
  30. //TODO: Error codes.
  31. }
  32. private void SvcStartThread(AThreadState ThreadState)
  33. {
  34. int Handle = (int)ThreadState.X0;
  35. KThread Thread = Process.HandleTable.GetData<KThread>(Handle);
  36. if (Thread != null)
  37. {
  38. Process.Scheduler.StartThread(Thread);
  39. ThreadState.X0 = 0;
  40. }
  41. //TODO: Error codes.
  42. }
  43. private void SvcExitThread(AThreadState ThreadState)
  44. {
  45. KThread CurrThread = Process.GetThread(ThreadState.Tpidr);
  46. CurrThread.Thread.StopExecution();
  47. CurrThread.Handle.Set();
  48. }
  49. private void SvcSleepThread(AThreadState ThreadState)
  50. {
  51. ulong NanoSecs = ThreadState.X0;
  52. KThread CurrThread = Process.GetThread(ThreadState.Tpidr);
  53. if (NanoSecs == 0)
  54. {
  55. Process.Scheduler.Yield(CurrThread);
  56. }
  57. else
  58. {
  59. Process.Scheduler.WaitForSignal(CurrThread, (int)(NanoSecs / 1000000));
  60. }
  61. }
  62. private void SvcGetThreadPriority(AThreadState ThreadState)
  63. {
  64. int Handle = (int)ThreadState.X1;
  65. KThread Thread = Process.HandleTable.GetData<KThread>(Handle);
  66. if (Thread != null)
  67. {
  68. ThreadState.X0 = 0;
  69. ThreadState.X1 = (ulong)Thread.Priority;
  70. }
  71. //TODO: Error codes.
  72. }
  73. private void SvcSetThreadPriority(AThreadState ThreadState)
  74. {
  75. int Prio = (int)ThreadState.X0;
  76. int Handle = (int)ThreadState.X1;
  77. KThread Thread = Process.HandleTable.GetData<KThread>(Handle);
  78. if (Thread != null)
  79. {
  80. Thread.Priority = Prio;
  81. ThreadState.X0 = 0;
  82. }
  83. //TODO: Error codes.
  84. }
  85. private void SvcSetThreadCoreMask(AThreadState ThreadState)
  86. {
  87. ThreadState.X0 = 0;
  88. //TODO: Error codes.
  89. }
  90. private void SvcGetThreadId(AThreadState ThreadState)
  91. {
  92. int Handle = (int)ThreadState.X0;
  93. KThread Thread = Process.HandleTable.GetData<KThread>(Handle);
  94. if (Thread != null)
  95. {
  96. ThreadState.X0 = 0;
  97. ThreadState.X1 = (ulong)Thread.ThreadId;
  98. }
  99. //TODO: Error codes.
  100. }
  101. }
  102. }