aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcThread.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcThread.cs')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcThread.cs82
1 files changed, 82 insertions, 0 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcThread.cs b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcThread.cs
index 9e681c80..101fb192 100644
--- a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcThread.cs
+++ b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcThread.cs
@@ -19,6 +19,17 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
return CreateThread(entrypoint, argsPtr, stackTop, priority, cpuCore, out handle);
}
+ public KernelResult CreateThread32(
+ [R(1)] uint entrypoint,
+ [R(2)] uint argsPtr,
+ [R(3)] uint stackTop,
+ [R(0)] int priority,
+ [R(4)] int cpuCore,
+ [R(1)] out int handle)
+ {
+ return CreateThread(entrypoint, argsPtr, stackTop, priority, cpuCore, out handle);
+ }
+
private KernelResult CreateThread(
ulong entrypoint,
ulong argsPtr,
@@ -83,6 +94,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
return StartThread(handle);
}
+ public KernelResult StartThread32([R(0)] int handle)
+ {
+ return StartThread(handle);
+ }
+
private KernelResult StartThread(int handle)
{
KThread thread = _process.HandleTable.GetKThread(handle);
@@ -113,6 +129,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
ExitThread();
}
+ public void ExitThread32()
+ {
+ ExitThread();
+ }
+
private void ExitThread()
{
KThread currentThread = _system.Scheduler.GetCurrentThread();
@@ -127,6 +148,13 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
SleepThread(timeout);
}
+ public void SleepThread32([R(0)] uint timeoutLow, [R(1)] uint timeoutHigh)
+ {
+ long timeout = (long)(timeoutLow | ((ulong)timeoutHigh << 32));
+
+ SleepThread(timeout);
+ }
+
private void SleepThread(long timeout)
{
KThread currentThread = _system.Scheduler.GetCurrentThread();
@@ -151,6 +179,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
return GetThreadPriority(handle, out priority);
}
+ public KernelResult GetThreadPriority32([R(1)] int handle, [R(1)] out int priority)
+ {
+ return GetThreadPriority(handle, out priority);
+ }
+
private KernelResult GetThreadPriority(int handle, out int priority)
{
KThread thread = _process.HandleTable.GetKThread(handle);
@@ -174,6 +207,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
return SetThreadPriority(handle, priority);
}
+ public KernelResult SetThreadPriority32([R(0)] int handle, [R(1)] int priority)
+ {
+ return SetThreadPriority(handle, priority);
+ }
+
public KernelResult SetThreadPriority(int handle, int priority)
{
// TODO: NPDM check.
@@ -195,6 +233,16 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
return GetThreadCoreMask(handle, out preferredCore, out affinityMask);
}
+ public KernelResult GetThreadCoreMask32([R(2)] int handle, [R(1)] out int preferredCore, [R(2)] out int affinityMaskLow, [R(3)] out int affinityMaskHigh)
+ {
+ KernelResult result = GetThreadCoreMask(handle, out preferredCore, out long affinityMask);
+
+ affinityMaskLow = (int)(affinityMask >> 32);
+ affinityMaskHigh = (int)(affinityMask & uint.MaxValue);
+
+ return result;
+ }
+
private KernelResult GetThreadCoreMask(int handle, out int preferredCore, out long affinityMask)
{
KThread thread = _process.HandleTable.GetKThread(handle);
@@ -220,6 +268,13 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
return SetThreadCoreMask(handle, preferredCore, affinityMask);
}
+ public KernelResult SetThreadCoreMask32([R(0)] int handle, [R(1)] int preferredCore, [R(2)] uint affinityMaskLow, [R(3)] uint affinityMaskHigh)
+ {
+ long affinityMask = (long)(affinityMaskLow | ((ulong)affinityMaskHigh << 32));
+
+ return SetThreadCoreMask(handle, preferredCore, affinityMask);
+ }
+
private KernelResult SetThreadCoreMask(int handle, int preferredCore, long affinityMask)
{
KProcess currentProcess = _system.Scheduler.GetCurrentProcess();
@@ -271,11 +326,28 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
return _system.Scheduler.GetCurrentThread().CurrentCore;
}
+ public int GetCurrentProcessorNumber32()
+ {
+ return _system.Scheduler.GetCurrentThread().CurrentCore;
+ }
+
public KernelResult GetThreadId64([R(1)] int handle, [R(1)] out long threadUid)
{
return GetThreadId(handle, out threadUid);
}
+ public KernelResult GetThreadId32([R(1)] int handle, [R(1)] out uint threadUidLow, [R(2)] out uint threadUidHigh)
+ {
+ long threadUid;
+
+ KernelResult result = GetThreadId(handle, out threadUid);
+
+ threadUidLow = (uint)(threadUid >> 32);
+ threadUidHigh = (uint)(threadUid & uint.MaxValue);
+
+ return result;
+ }
+
private KernelResult GetThreadId(int handle, out long threadUid)
{
KThread thread = _process.HandleTable.GetKThread(handle);
@@ -299,6 +371,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
return SetThreadActivity(handle, pause);
}
+ public KernelResult SetThreadActivity32([R(0)] int handle, [R(1)] bool pause)
+ {
+ return SetThreadActivity(handle, pause);
+ }
+
private KernelResult SetThreadActivity(int handle, bool pause)
{
KThread thread = _process.HandleTable.GetObject<KThread>(handle);
@@ -326,6 +403,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
return GetThreadContext3(address, handle);
}
+ public KernelResult GetThreadContext332([R(0)] uint address, [R(1)] int handle)
+ {
+ return GetThreadContext3(address, handle);
+ }
+
private KernelResult GetThreadContext3(ulong address, int handle)
{
KProcess currentProcess = _system.Scheduler.GetCurrentProcess();