aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/OsHle/Kernel
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-06-26 01:09:32 -0300
committergdkchan <gab.dark.100@gmail.com>2018-06-26 01:10:15 -0300
commit65105c2a3bf136202decd5ec1f5d9626d636033b (patch)
treec877fcc5656aaeabfadd12f5cc8c5da5e72deb42 /Ryujinx.HLE/OsHle/Kernel
parentc81809352865a9d3be4f9ce20beea4ae39373934 (diff)
Implement SvcGetThreadContext3
Diffstat (limited to 'Ryujinx.HLE/OsHle/Kernel')
-rw-r--r--Ryujinx.HLE/OsHle/Kernel/KernelErr.cs2
-rw-r--r--Ryujinx.HLE/OsHle/Kernel/SvcHandler.cs3
-rw-r--r--Ryujinx.HLE/OsHle/Kernel/SvcThread.cs111
3 files changed, 115 insertions, 1 deletions
diff --git a/Ryujinx.HLE/OsHle/Kernel/KernelErr.cs b/Ryujinx.HLE/OsHle/Kernel/KernelErr.cs
index 643e5f68..ad4fdfb6 100644
--- a/Ryujinx.HLE/OsHle/Kernel/KernelErr.cs
+++ b/Ryujinx.HLE/OsHle/Kernel/KernelErr.cs
@@ -13,5 +13,7 @@ namespace Ryujinx.HLE.OsHle.Kernel
public const int Canceled = 118;
public const int CountOutOfRange = 119;
public const int InvalidInfo = 120;
+ public const int InvalidThread = 122;
+ public const int InvalidState = 125;
}
} \ No newline at end of file
diff --git a/Ryujinx.HLE/OsHle/Kernel/SvcHandler.cs b/Ryujinx.HLE/OsHle/Kernel/SvcHandler.cs
index f3a5fae0..5b6279e3 100644
--- a/Ryujinx.HLE/OsHle/Kernel/SvcHandler.cs
+++ b/Ryujinx.HLE/OsHle/Kernel/SvcHandler.cs
@@ -72,7 +72,8 @@ namespace Ryujinx.HLE.OsHle.Kernel
{ 0x29, SvcGetInfo },
{ 0x2c, SvcMapPhysicalMemory },
{ 0x2d, SvcUnmapPhysicalMemory },
- { 0x32, SvcSetThreadActivity }
+ { 0x32, SvcSetThreadActivity },
+ { 0x33, SvcGetThreadContext3 }
};
this.Ns = Ns;
diff --git a/Ryujinx.HLE/OsHle/Kernel/SvcThread.cs b/Ryujinx.HLE/OsHle/Kernel/SvcThread.cs
index 4501867f..543d9fd2 100644
--- a/Ryujinx.HLE/OsHle/Kernel/SvcThread.cs
+++ b/Ryujinx.HLE/OsHle/Kernel/SvcThread.cs
@@ -280,5 +280,116 @@ namespace Ryujinx.HLE.OsHle.Kernel
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
}
}
+
+ private void SvcGetThreadContext3(AThreadState ThreadState)
+ {
+ long Position = (long)ThreadState.X0;
+ int Handle = (int)ThreadState.X1;
+
+ KThread Thread = Process.HandleTable.GetData<KThread>(Handle);
+
+ if (Thread == null)
+ {
+ Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!");
+
+ ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
+
+ return;
+ }
+
+ if (Process.GetThread(ThreadState.Tpidr) == Thread)
+ {
+ Ns.Log.PrintWarning(LogClass.KernelSvc, $"Thread handle 0x{Handle:x8} is current thread!");
+
+ ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidThread);
+
+ return;
+ }
+
+ if (Process.Scheduler.IsThreadRunning(Thread))
+ {
+ Ns.Log.PrintWarning(LogClass.KernelSvc, $"Thread handle 0x{Handle:x8} is running!");
+
+ ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidState);
+
+ return;
+ }
+
+ Memory.WriteUInt64(Position + 0x0, ThreadState.X0);
+ Memory.WriteUInt64(Position + 0x8, ThreadState.X1);
+ Memory.WriteUInt64(Position + 0x10, ThreadState.X2);
+ Memory.WriteUInt64(Position + 0x18, ThreadState.X3);
+ Memory.WriteUInt64(Position + 0x20, ThreadState.X4);
+ Memory.WriteUInt64(Position + 0x28, ThreadState.X5);
+ Memory.WriteUInt64(Position + 0x30, ThreadState.X6);
+ Memory.WriteUInt64(Position + 0x38, ThreadState.X7);
+ Memory.WriteUInt64(Position + 0x40, ThreadState.X8);
+ Memory.WriteUInt64(Position + 0x48, ThreadState.X9);
+ Memory.WriteUInt64(Position + 0x50, ThreadState.X10);
+ Memory.WriteUInt64(Position + 0x58, ThreadState.X11);
+ Memory.WriteUInt64(Position + 0x60, ThreadState.X12);
+ Memory.WriteUInt64(Position + 0x68, ThreadState.X13);
+ Memory.WriteUInt64(Position + 0x70, ThreadState.X14);
+ Memory.WriteUInt64(Position + 0x78, ThreadState.X15);
+ Memory.WriteUInt64(Position + 0x80, ThreadState.X16);
+ Memory.WriteUInt64(Position + 0x88, ThreadState.X17);
+ Memory.WriteUInt64(Position + 0x90, ThreadState.X18);
+ Memory.WriteUInt64(Position + 0x98, ThreadState.X19);
+ Memory.WriteUInt64(Position + 0xa0, ThreadState.X20);
+ Memory.WriteUInt64(Position + 0xa8, ThreadState.X21);
+ Memory.WriteUInt64(Position + 0xb0, ThreadState.X22);
+ Memory.WriteUInt64(Position + 0xb8, ThreadState.X23);
+ Memory.WriteUInt64(Position + 0xc0, ThreadState.X24);
+ Memory.WriteUInt64(Position + 0xc8, ThreadState.X25);
+ Memory.WriteUInt64(Position + 0xd0, ThreadState.X26);
+ Memory.WriteUInt64(Position + 0xd8, ThreadState.X27);
+ Memory.WriteUInt64(Position + 0xe0, ThreadState.X28);
+ Memory.WriteUInt64(Position + 0xe8, ThreadState.X29);
+ Memory.WriteUInt64(Position + 0xf0, ThreadState.X30);
+ Memory.WriteUInt64(Position + 0xf8, ThreadState.X31);
+
+ Memory.WriteInt64(Position + 0x100, Thread.LastPc);
+
+ Memory.WriteUInt64(Position + 0x108, (ulong)ThreadState.Psr);
+
+ Memory.WriteVector128(Position + 0x110, ThreadState.V0);
+ Memory.WriteVector128(Position + 0x120, ThreadState.V1);
+ Memory.WriteVector128(Position + 0x130, ThreadState.V2);
+ Memory.WriteVector128(Position + 0x140, ThreadState.V3);
+ Memory.WriteVector128(Position + 0x150, ThreadState.V4);
+ Memory.WriteVector128(Position + 0x160, ThreadState.V5);
+ Memory.WriteVector128(Position + 0x170, ThreadState.V6);
+ Memory.WriteVector128(Position + 0x180, ThreadState.V7);
+ Memory.WriteVector128(Position + 0x190, ThreadState.V8);
+ Memory.WriteVector128(Position + 0x1a0, ThreadState.V9);
+ Memory.WriteVector128(Position + 0x1b0, ThreadState.V10);
+ Memory.WriteVector128(Position + 0x1c0, ThreadState.V11);
+ Memory.WriteVector128(Position + 0x1d0, ThreadState.V12);
+ Memory.WriteVector128(Position + 0x1e0, ThreadState.V13);
+ Memory.WriteVector128(Position + 0x1f0, ThreadState.V14);
+ Memory.WriteVector128(Position + 0x200, ThreadState.V15);
+ Memory.WriteVector128(Position + 0x210, ThreadState.V16);
+ Memory.WriteVector128(Position + 0x220, ThreadState.V17);
+ Memory.WriteVector128(Position + 0x230, ThreadState.V18);
+ Memory.WriteVector128(Position + 0x240, ThreadState.V19);
+ Memory.WriteVector128(Position + 0x250, ThreadState.V20);
+ Memory.WriteVector128(Position + 0x260, ThreadState.V21);
+ Memory.WriteVector128(Position + 0x270, ThreadState.V22);
+ Memory.WriteVector128(Position + 0x280, ThreadState.V23);
+ Memory.WriteVector128(Position + 0x290, ThreadState.V24);
+ Memory.WriteVector128(Position + 0x2a0, ThreadState.V25);
+ Memory.WriteVector128(Position + 0x2b0, ThreadState.V26);
+ Memory.WriteVector128(Position + 0x2c0, ThreadState.V27);
+ Memory.WriteVector128(Position + 0x2d0, ThreadState.V28);
+ Memory.WriteVector128(Position + 0x2e0, ThreadState.V29);
+ Memory.WriteVector128(Position + 0x2f0, ThreadState.V30);
+ Memory.WriteVector128(Position + 0x300, ThreadState.V31);
+
+ Memory.WriteInt32(Position + 0x310, ThreadState.Fpcr);
+ Memory.WriteInt32(Position + 0x314, ThreadState.Fpsr);
+ Memory.WriteInt64(Position + 0x318, ThreadState.Tpidr);
+
+ ThreadState.X0 = 0;
+ }
}
} \ No newline at end of file