aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Common/KernelTransfer.cs2
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs4
-rw-r--r--Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs2
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs57
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs2
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;