diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/SupervisorCall')
5 files changed, 35 insertions, 8 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs index 59d56b4d..2dd9d807 100644 --- a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs +++ b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs @@ -2655,6 +2655,13 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall }; } + public KernelResult SynchronizePreemptionState() + { + KernelStatic.GetCurrentThread().SynchronizePreemptionState(); + + return KernelResult.Success; + } + private bool IsPointingInsideKernel(ulong address) { return (address + 0x1000000000) < 0xffffff000; diff --git a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall32.cs b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall32.cs index bb1cc8ad..d955807d 100644 --- a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall32.cs +++ b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall32.cs @@ -491,5 +491,10 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall { return _syscall.SignalToAddress(address, type, value, count); } + + public KernelResult SynchronizePreemptionState32() + { + return _syscall.SynchronizePreemptionState(); + } } } diff --git a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall64.cs b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall64.cs index 97ded4b5..fc826552 100644 --- a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall64.cs +++ b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall64.cs @@ -405,5 +405,10 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall { return _syscall.SignalToAddress(address, type, value, count); } + + public KernelResult SynchronizePreemptionState64() + { + return _syscall.SynchronizePreemptionState(); + } } } 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(); } } diff --git a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallTable.cs b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallTable.cs index 7e9f08c0..178dc029 100644 --- a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallTable.cs +++ b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SyscallTable.cs @@ -71,6 +71,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall { 0x33, nameof(Syscall64.GetThreadContext364) }, { 0x34, nameof(Syscall64.WaitForAddress64) }, { 0x35, nameof(Syscall64.SignalToAddress64) }, + { 0x36, nameof(Syscall64.SynchronizePreemptionState64) }, { 0x37, nameof(Syscall64.GetResourceLimitPeakValue64) }, { 0x40, nameof(Syscall64.CreateSession64) }, { 0x41, nameof(Syscall64.AcceptSession64) }, @@ -145,6 +146,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall { 0x33, nameof(Syscall32.GetThreadContext332) }, { 0x34, nameof(Syscall32.WaitForAddress32) }, { 0x35, nameof(Syscall32.SignalToAddress32) }, + { 0x36, nameof(Syscall32.SynchronizePreemptionState32) }, { 0x37, nameof(Syscall32.GetResourceLimitPeakValue32) }, { 0x40, nameof(Syscall32.CreateSession32) }, { 0x41, nameof(Syscall32.AcceptSession32) }, |
