SvcThread.cs 2.3 KB

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