diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel')
| -rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Common/KernelTransfer.cs | 2 | ||||
| -rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs | 4 | ||||
| -rw-r--r-- | Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs | 2 | ||||
| -rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs | 57 | ||||
| -rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs | 2 |
5 files changed, 40 insertions, 27 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Common/KernelTransfer.cs b/Ryujinx.HLE/HOS/Kernel/Common/KernelTransfer.cs index 3002b6a9..53e539a2 100644 --- a/Ryujinx.HLE/HOS/Kernel/Common/KernelTransfer.cs +++ b/Ryujinx.HLE/HOS/Kernel/Common/KernelTransfer.cs @@ -50,7 +50,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Common if (currentProcess.CpuMemory.IsMapped(address) && currentProcess.CpuMemory.IsMapped(address + (ulong)size - 1)) { - value = MemoryHelper.ReadAsciiString(currentProcess.CpuMemory, (long)address, size); + value = MemoryHelper.ReadAsciiString(currentProcess.CpuMemory, address, size); return true; } diff --git a/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs index 429c23e3..15ab82b8 100644 --- a/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs +++ b/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs @@ -340,7 +340,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process UserExceptionContextAddress = userExceptionContextAddress; - MemoryHelper.FillWithZeros(CpuMemory, (long)userExceptionContextAddress, KTlsPageInfo.TlsEntrySize); + MemoryHelper.FillWithZeros(CpuMemory, userExceptionContextAddress, KTlsPageInfo.TlsEntrySize); Name = creationInfo.Name; @@ -461,7 +461,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process { pageInfo = new KTlsPageInfo(tlsPageVa); - MemoryHelper.FillWithZeros(CpuMemory, (long)tlsPageVa, KMemoryManager.PageSize); + MemoryHelper.FillWithZeros(CpuMemory, tlsPageVa, KMemoryManager.PageSize); } return result; diff --git a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs index 418a02f0..238f1226 100644 --- a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs +++ b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs @@ -1431,7 +1431,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall { KProcess process = KernelStatic.GetCurrentProcess(); - string str = MemoryHelper.ReadAsciiString(process.CpuMemory, (long)strPtr, (long)size); + string str = MemoryHelper.ReadAsciiString(process.CpuMemory, strPtr, (long)size); Logger.Warning?.Print(LogClass.KernelSvc, str); } diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs index e427f24d..0982ceff 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs @@ -22,8 +22,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading private struct SchedulingState { - public bool NeedsScheduling; - public KThread SelectedThread; + public volatile bool NeedsScheduling; + public volatile KThread SelectedThread; } private SchedulingState _state; @@ -349,31 +349,29 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading nextThread ??= _idleThread; - if (currentThread == nextThread) + if (currentThread != nextThread) { - return; - } + long previousTicks = LastContextSwitchTime; + long currentTicks = PerformanceCounter.ElapsedTicks; + long ticksDelta = currentTicks - previousTicks; - long previousTicks = LastContextSwitchTime; - long currentTicks = PerformanceCounter.ElapsedTicks; - long ticksDelta = currentTicks - previousTicks; + currentThread.AddCpuTime(ticksDelta); - currentThread.AddCpuTime(ticksDelta); - - if (currentProcess != null) - { - currentProcess.AddCpuTime(ticksDelta); - } + if (currentProcess != null) + { + currentProcess.AddCpuTime(ticksDelta); + } - LastContextSwitchTime = currentTicks; + LastContextSwitchTime = currentTicks; - if (currentProcess != null) - { - _previousThread = !currentThread.TerminationRequested && currentThread.ActiveCore == _coreId ? currentThread : null; - } - else if (currentThread == _idleThread) - { - _previousThread = null; + if (currentProcess != null) + { + _previousThread = !currentThread.TerminationRequested && currentThread.ActiveCore == _coreId ? currentThread : null; + } + else if (currentThread == _idleThread) + { + _previousThread = null; + } } if (nextThread.CurrentCore != _coreId) @@ -469,6 +467,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { KThread currentThread = KernelStatic.GetCurrentThread(); + if (!currentThread.IsSchedulable) + { + return; + } + context.CriticalSection.Enter(); if (currentThread.SchedFlags != ThreadSchedState.Running) @@ -491,6 +494,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { KThread currentThread = KernelStatic.GetCurrentThread(); + if (!currentThread.IsSchedulable) + { + return; + } + context.CriticalSection.Enter(); if (currentThread.SchedFlags != ThreadSchedState.Running) @@ -550,6 +558,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { KThread currentThread = KernelStatic.GetCurrentThread(); + if (!currentThread.IsSchedulable) + { + return; + } + context.CriticalSection.Enter(); if (currentThread.SchedFlags != ThreadSchedState.Running) diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs index b95b1e8e..7ba9e43a 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs @@ -161,7 +161,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading TlsDramAddress = owner.MemoryManager.GetDramAddressFromVa(_tlsAddress); - MemoryHelper.FillWithZeros(owner.CpuMemory, (long)_tlsAddress, KTlsPageInfo.TlsEntrySize); + MemoryHelper.FillWithZeros(owner.CpuMemory, _tlsAddress, KTlsPageInfo.TlsEntrySize); } bool is64Bits; |
