KernelStatic.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using Ryujinx.HLE.HOS.Kernel.Common;
  2. using Ryujinx.HLE.HOS.Kernel.Memory;
  3. using Ryujinx.HLE.HOS.Kernel.Process;
  4. using Ryujinx.HLE.HOS.Kernel.Threading;
  5. using System;
  6. using System.Threading;
  7. namespace Ryujinx.HLE.HOS.Kernel
  8. {
  9. static class KernelStatic
  10. {
  11. [ThreadStatic]
  12. private static KernelContext Context;
  13. [ThreadStatic]
  14. private static KThread CurrentThread;
  15. public static KernelResult StartInitialProcess(
  16. KernelContext context,
  17. ProcessCreationInfo creationInfo,
  18. ReadOnlySpan<int> capabilities,
  19. int mainThreadPriority,
  20. ThreadStart customThreadStart)
  21. {
  22. KProcess process = new KProcess(context);
  23. KernelResult result = process.Initialize(
  24. creationInfo,
  25. capabilities,
  26. context.ResourceLimit,
  27. MemoryRegion.Service,
  28. null,
  29. customThreadStart);
  30. if (result != KernelResult.Success)
  31. {
  32. return result;
  33. }
  34. process.DefaultCpuCore = 3;
  35. context.Processes.TryAdd(process.Pid, process);
  36. return process.Start(mainThreadPriority, 0x1000UL);
  37. }
  38. internal static void SetKernelContext(KernelContext context, KThread thread)
  39. {
  40. Context = context;
  41. CurrentThread = thread;
  42. }
  43. internal static KThread GetCurrentThread()
  44. {
  45. return CurrentThread;
  46. }
  47. internal static KProcess GetCurrentProcess()
  48. {
  49. return GetCurrentThread().Owner;
  50. }
  51. internal static KProcess GetProcessByPid(ulong pid)
  52. {
  53. if (Context.Processes.TryGetValue(pid, out KProcess process))
  54. {
  55. return process;
  56. }
  57. return null;
  58. }
  59. }
  60. }