diff options
author | Mary <me@thog.eu> | 2021-12-30 10:55:06 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-30 10:55:06 +0100 |
commit | e96ef6d53250b72d084f7e6baf13e9bab485bca2 (patch) | |
tree | 5701772c89dbad3bf51bdf736714f9feb889472a /Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallHandler.cs | |
parent | 8544b1445b33381fca63714249ac36598c413004 (diff) |
kernel: Implement thread pinning support (#2840)
* kernel: Implement Thread pinning support
This commit adds support for 8.x thread pinning changes and implement SynchronizePreemptionState syscall.
Based on kernel 13.x reverse.
* Address gdkchan's comment
* kernel: fix missing critical section leave in SetActivity
Fix Unity games
* Implement missing bits on the interrupt handler and inline update pinning function as it cannot be generic
* Fix some bugs in SetActivity and SetCoreAndAffinityMask
* Address gdkchan's comments
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallHandler.cs')
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallHandler.cs | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallHandler.cs b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallHandler.cs index b4e7a0bf..5e795d35 100644 --- a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallHandler.cs +++ b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallHandler.cs @@ -19,7 +19,22 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall public void SvcCall(object sender, InstExceptionEventArgs e) { - ExecutionContext context = (ExecutionContext)sender; + KThread currentThread = KernelStatic.GetCurrentThread(); + + if (currentThread.Owner != null && + currentThread.GetUserDisableCount() != 0 && + currentThread.Owner.PinnedThreads[currentThread.CurrentCore] == null) + { + _context.CriticalSection.Enter(); + + currentThread.Owner.PinThread(currentThread); + + currentThread.SetUserInterruptFlag(); + + _context.CriticalSection.Leave(); + } + + ExecutionContext context = (ExecutionContext)sender; if (context.IsAarch32) { @@ -44,13 +59,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall svcFunc(_syscall64, context); } - PostSvcHandler(); - } - - private void PostSvcHandler() - { - KThread currentThread = KernelStatic.GetCurrentThread(); - currentThread.HandlePostSyscall(); } } |