SvcThread.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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 = (int)SvcResult.Success;
  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 = Ns.Os.Handles.GetData<HThread>(Handle);
  36. if (Thread != null)
  37. {
  38. Process.Scheduler.StartThread(Thread);
  39. ThreadState.X0 = (int)SvcResult.Success;
  40. }
  41. //TODO: Error codes.
  42. }
  43. private void SvcSleepThread(AThreadState ThreadState)
  44. {
  45. ulong NanoSecs = ThreadState.X0;
  46. HThread CurrThread = Process.GetThread(ThreadState.Tpidr);
  47. if (NanoSecs == 0)
  48. {
  49. Process.Scheduler.Yield(CurrThread);
  50. }
  51. else
  52. {
  53. Process.Scheduler.WaitForSignal(CurrThread, (int)(NanoSecs / 1000000));
  54. }
  55. }
  56. private void SvcGetThreadPriority(AThreadState ThreadState)
  57. {
  58. int Handle = (int)ThreadState.X1;
  59. HThread Thread = Ns.Os.Handles.GetData<HThread>(Handle);
  60. if (Thread != null)
  61. {
  62. ThreadState.X1 = (ulong)Thread.Priority;
  63. ThreadState.X0 = (int)SvcResult.Success;
  64. }
  65. //TODO: Error codes.
  66. }
  67. }
  68. }