SvcThread.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. HThread Thread = Process.HandleTable.GetData<HThread>(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. HThread CurrThread = Process.GetThread(ThreadState.Tpidr);
  46. CurrThread.Thread.StopExecution();
  47. }
  48. private void SvcSleepThread(AThreadState ThreadState)
  49. {
  50. ulong NanoSecs = ThreadState.X0;
  51. HThread CurrThread = Process.GetThread(ThreadState.Tpidr);
  52. if (NanoSecs == 0)
  53. {
  54. Process.Scheduler.Yield(CurrThread);
  55. }
  56. else
  57. {
  58. Process.Scheduler.WaitForSignal(CurrThread, (int)(NanoSecs / 1000000));
  59. }
  60. }
  61. private void SvcGetThreadPriority(AThreadState ThreadState)
  62. {
  63. int Handle = (int)ThreadState.X1;
  64. HThread Thread = Process.HandleTable.GetData<HThread>(Handle);
  65. if (Thread != null)
  66. {
  67. ThreadState.X0 = 0;
  68. ThreadState.X1 = (ulong)Thread.Priority;
  69. }
  70. //TODO: Error codes.
  71. }
  72. private void SvcSetThreadPriority(AThreadState ThreadState)
  73. {
  74. int Handle = (int)ThreadState.X1;
  75. int Prio = (int)ThreadState.X0;
  76. HThread Thread = Process.HandleTable.GetData<HThread>(Handle);
  77. if (Thread != null)
  78. {
  79. Thread.Priority = Prio;
  80. ThreadState.X0 = 0;
  81. }
  82. //TODO: Error codes.
  83. }
  84. private void SvcSetThreadCoreMask(AThreadState ThreadState)
  85. {
  86. ThreadState.X0 = 0;
  87. //TODO: Error codes.
  88. }
  89. private void SvcGetThreadId(AThreadState ThreadState)
  90. {
  91. int Handle = (int)ThreadState.X0;
  92. HThread Thread = Process.HandleTable.GetData<HThread>(Handle);
  93. if (Thread != null)
  94. {
  95. ThreadState.X0 = 0;
  96. ThreadState.X1 = (ulong)Thread.ThreadId;
  97. }
  98. //TODO: Error codes.
  99. }
  100. }
  101. }