aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/KernelStatic.cs')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/KernelStatic.cs57
1 files changed, 41 insertions, 16 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs b/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs
index c7deadae..2446ace4 100644
--- a/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs
+++ b/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs
@@ -1,6 +1,9 @@
-using Ryujinx.HLE.HOS.Kernel.Threading;
+using Ryujinx.HLE.HOS.Kernel.Common;
+using Ryujinx.HLE.HOS.Kernel.Memory;
+using Ryujinx.HLE.HOS.Kernel.Process;
+using Ryujinx.HLE.HOS.Kernel.Threading;
using System;
-using System.Threading.Tasks;
+using System.Threading;
namespace Ryujinx.HLE.HOS.Kernel
{
@@ -9,30 +12,52 @@ namespace Ryujinx.HLE.HOS.Kernel
[ThreadStatic]
private static KernelContext Context;
- public static void YieldUntilCompletion(Action action)
+ [ThreadStatic]
+ private static KThread CurrentThread;
+
+ public static KernelResult StartInitialProcess(
+ KernelContext context,
+ ProcessCreationInfo creationInfo,
+ ReadOnlySpan<int> capabilities,
+ int mainThreadPriority,
+ ThreadStart customThreadStart)
{
- YieldUntilCompletion(Task.Factory.StartNew(action));
- }
+ KProcess process = new KProcess(context);
- public static void YieldUntilCompletion(Task task)
- {
- KThread currentThread = Context.Scheduler.GetCurrentThread();
+ KernelResult result = process.Initialize(
+ creationInfo,
+ capabilities,
+ context.ResourceLimit,
+ MemoryRegion.Service,
+ null,
+ customThreadStart);
- Context.CriticalSection.Enter();
+ if (result != KernelResult.Success)
+ {
+ return result;
+ }
- currentThread.Reschedule(ThreadSchedState.Paused);
+ process.DefaultCpuCore = 3;
- task.ContinueWith((antecedent) =>
- {
- currentThread.Reschedule(ThreadSchedState.Running);
- });
+ context.Processes.TryAdd(process.Pid, process);
- Context.CriticalSection.Leave();
+ return process.Start(mainThreadPriority, 0x1000UL);
}
- internal static void SetKernelContext(KernelContext context)
+ 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;
}
}
}