diff options
Diffstat (limited to 'Ryujinx.Core/OsHle/Svc/SvcThread.cs')
| -rw-r--r-- | Ryujinx.Core/OsHle/Svc/SvcThread.cs | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/Ryujinx.Core/OsHle/Svc/SvcThread.cs b/Ryujinx.Core/OsHle/Svc/SvcThread.cs new file mode 100644 index 00000000..a635edb1 --- /dev/null +++ b/Ryujinx.Core/OsHle/Svc/SvcThread.cs @@ -0,0 +1,85 @@ +using ChocolArm64.State; +using Ryujinx.Core.OsHle.Handles; + +namespace Ryujinx.Core.OsHle.Svc +{ + partial class SvcHandler + { + private void SvcCreateThread(AThreadState ThreadState) + { + long EntryPoint = (long)ThreadState.X1; + long ArgsPtr = (long)ThreadState.X2; + long StackTop = (long)ThreadState.X3; + int Priority = (int)ThreadState.X4; + int ProcessorId = (int)ThreadState.X5; + + if (Ns.Os.TryGetProcess(ThreadState.ProcessId, out Process Process)) + { + if (ProcessorId == -2) + { + //TODO: Get this value from the NPDM file. + ProcessorId = 0; + } + + int Handle = Process.MakeThread( + EntryPoint, + StackTop, + ArgsPtr, + Priority, + ProcessorId); + + ThreadState.X0 = (int)SvcResult.Success; + ThreadState.X1 = (ulong)Handle; + } + + //TODO: Error codes. + } + + private void SvcStartThread(AThreadState ThreadState) + { + int Handle = (int)ThreadState.X0; + + HThread Thread = Ns.Os.Handles.GetData<HThread>(Handle); + + if (Thread != null) + { + Process.Scheduler.StartThread(Thread); + + ThreadState.X0 = (int)SvcResult.Success; + } + + //TODO: Error codes. + } + + private void SvcSleepThread(AThreadState ThreadState) + { + ulong NanoSecs = ThreadState.X0; + + HThread CurrThread = Process.GetThread(ThreadState.Tpidr); + + if (NanoSecs == 0) + { + Process.Scheduler.Yield(CurrThread); + } + else + { + Process.Scheduler.WaitForSignal(CurrThread, (int)(NanoSecs / 1000000)); + } + } + + private void SvcGetThreadPriority(AThreadState ThreadState) + { + int Handle = (int)ThreadState.X1; + + HThread Thread = Ns.Os.Handles.GetData<HThread>(Handle); + + if (Thread != null) + { + ThreadState.X1 = (ulong)Thread.Priority; + ThreadState.X0 = (int)SvcResult.Success; + } + + //TODO: Error codes. + } + } +}
\ No newline at end of file |
