diff options
Diffstat (limited to 'src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs')
-rw-r--r-- | src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs b/src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs new file mode 100644 index 00000000..c66f4b57 --- /dev/null +++ b/src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs @@ -0,0 +1,73 @@ +using Ryujinx.HLE.HOS.Kernel.Memory; +using Ryujinx.HLE.HOS.Kernel.Process; +using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; +using System; +using System.Threading; + +namespace Ryujinx.HLE.HOS.Kernel +{ + static class KernelStatic + { + [ThreadStatic] + private static KernelContext Context; + + [ThreadStatic] + private static KThread CurrentThread; + + public static Result StartInitialProcess( + KernelContext context, + ProcessCreationInfo creationInfo, + ReadOnlySpan<uint> capabilities, + int mainThreadPriority, + ThreadStart customThreadStart) + { + KProcess process = new KProcess(context); + + Result result = process.Initialize( + creationInfo, + capabilities, + context.ResourceLimit, + MemoryRegion.Service, + null, + customThreadStart); + + if (result != Result.Success) + { + return result; + } + + process.DefaultCpuCore = 3; + + context.Processes.TryAdd(process.Pid, process); + + return process.Start(mainThreadPriority, 0x1000UL); + } + + internal static void SetKernelContext(KernelContext context, KThread thread) + { + Context = context; + CurrentThread = thread; + } + + internal static KThread GetCurrentThread() + { + return CurrentThread; + } + + internal static KProcess GetCurrentProcess() + { + return GetCurrentThread().Owner; + } + + internal static KProcess GetProcessByPid(ulong pid) + { + if (Context.Processes.TryGetValue(pid, out KProcess process)) + { + return process; + } + + return null; + } + } +}
\ No newline at end of file |