aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs')
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs73
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