From ea5dd0b2815f376a9f7ab20743d7cfe3c60331c4 Mon Sep 17 00:00:00 2001 From: fearlessTobi Date: Tue, 5 Jun 2018 15:35:24 +0200 Subject: [PATCH] Implement SvcGetThreadCoreMask --- Ryujinx.Core/OsHle/Kernel/SvcHandler.cs | 1 + Ryujinx.Core/OsHle/Kernel/SvcThread.cs | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/Ryujinx.Core/OsHle/Kernel/SvcHandler.cs b/Ryujinx.Core/OsHle/Kernel/SvcHandler.cs index 3a9166e4e8..70ed385333 100644 --- a/Ryujinx.Core/OsHle/Kernel/SvcHandler.cs +++ b/Ryujinx.Core/OsHle/Kernel/SvcHandler.cs @@ -47,6 +47,7 @@ namespace Ryujinx.Core.OsHle.Kernel { 0x0b, SvcSleepThread }, { 0x0c, SvcGetThreadPriority }, { 0x0d, SvcSetThreadPriority }, + { 0x0e, SvcGetThreadCoreMask }, { 0x0f, SvcSetThreadCoreMask }, { 0x10, SvcGetCurrentProcessorNumber }, { 0x12, SvcClearEvent }, diff --git a/Ryujinx.Core/OsHle/Kernel/SvcThread.cs b/Ryujinx.Core/OsHle/Kernel/SvcThread.cs index 8aa26dd3f7..f2ab8fc62a 100644 --- a/Ryujinx.Core/OsHle/Kernel/SvcThread.cs +++ b/Ryujinx.Core/OsHle/Kernel/SvcThread.cs @@ -139,6 +139,28 @@ namespace Ryujinx.Core.OsHle.Kernel } } + private void SvcGetThreadCoreMask(AThreadState ThreadState) + { + int Handle = (int)ThreadState.X2; + + Ns.Log.PrintDebug(LogClass.KernelSvc, "Handle = " + Handle.ToString("x8")); + + KThread Thread = GetThread(ThreadState.Tpidr, Handle); + + if (Thread != null) + { + ThreadState.X0 = 0; + ThreadState.X1 = (ulong)Thread.IdealCore; + ThreadState.X2 = (ulong)Thread.CoreMask; + } + else + { + Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!"); + + ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); + } + } + private void SvcSetThreadCoreMask(AThreadState ThreadState) { //FIXME: This is wrong, but the "correct" way to handle