Rewrite scheduler context switch code (#1786)
* Rewrite scheduler context switch code * Fix race in UnmapIpcRestorePermission * Fix thread exit issue that could leave the scheduler in a invalid state * Change context switch method to not wait on guest thread, remove spin wait, use SignalAndWait to pass control * Remove multi-core setting (it is always on now) * Re-enable assert * Remove multicore from default config and schema * Fix race in KTimeManager
This commit is contained in:
parent
3484265d37
commit
48278905d1
37 changed files with 1080 additions and 1160 deletions
|
@ -26,7 +26,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public KernelResult GetProcessId(int handle, out long pid)
|
||||
{
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KProcess process = currentProcess.HandleTable.GetKProcess(handle);
|
||||
|
||||
|
@ -86,7 +86,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidThread;
|
||||
}
|
||||
|
||||
KHandleTable handleTable = _context.Scheduler.GetCurrentProcess().HandleTable;
|
||||
KHandleTable handleTable = KernelStatic.GetCurrentProcess().HandleTable;
|
||||
|
||||
KProcess process = new KProcess(_context);
|
||||
|
||||
|
@ -137,7 +137,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public KernelResult StartProcess(int handle, int priority, int cpuCore, ulong mainThreadStackSize)
|
||||
{
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess().HandleTable.GetObject<KProcess>(handle);
|
||||
KProcess process = KernelStatic.GetCurrentProcess().HandleTable.GetObject<KProcess>(handle);
|
||||
|
||||
if (process == null)
|
||||
{
|
||||
|
@ -198,7 +198,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.NotFound;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KernelResult result = currentProcess.HandleTable.ReserveHandle(out handle);
|
||||
|
||||
|
@ -225,7 +225,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public KernelResult SendSyncRequest(int handle)
|
||||
{
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KClientSession session = currentProcess.HandleTable.GetObject<KClientSession>(handle);
|
||||
|
||||
|
@ -254,7 +254,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KernelResult result = currentProcess.MemoryManager.BorrowIpcBuffer(messagePtr, messageSize);
|
||||
|
||||
|
@ -303,7 +303,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KernelResult result = currentProcess.MemoryManager.BorrowIpcBuffer(messagePtr, messageSize);
|
||||
|
||||
|
@ -363,7 +363,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
serverSessionHandle = 0;
|
||||
clientSessionHandle = 0;
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KResourceLimit resourceLimit = currentProcess.ResourceLimit;
|
||||
|
||||
|
@ -424,7 +424,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
{
|
||||
sessionHandle = 0;
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KServerPort serverPort = currentProcess.HandleTable.GetObject<KServerPort>(portHandle);
|
||||
|
||||
|
@ -485,7 +485,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.MaximumExceeded;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
ulong copySize = (ulong)((long)handlesCount * 4);
|
||||
|
||||
|
@ -513,7 +513,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
{
|
||||
handleIndex = 0;
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KSynchronizationObject[] syncObjs = new KSynchronizationObject[handles.Length];
|
||||
|
||||
|
@ -582,7 +582,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.MaximumExceeded;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
ulong copySize = (ulong)((long)handlesCount * 4);
|
||||
|
||||
|
@ -681,7 +681,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
KPort port = new KPort(_context, maxSessions, isLight, (long)namePtr);
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KernelResult result = currentProcess.HandleTable.GenerateHandle(port.ClientPort, out clientPortHandle);
|
||||
|
||||
|
@ -733,7 +733,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
KPort port = new KPort(_context, maxSessions, false, 0);
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KernelResult result = currentProcess.HandleTable.GenerateHandle(port.ServerPort, out handle);
|
||||
|
||||
|
@ -756,7 +756,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
{
|
||||
clientSessionHandle = 0;
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KClientPort clientPort = currentProcess.HandleTable.GetObject<KClientPort>(clientPortHandle);
|
||||
|
||||
|
@ -814,7 +814,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidSize;
|
||||
}
|
||||
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
return process.MemoryManager.SetHeapSize(size, out position);
|
||||
}
|
||||
|
@ -843,7 +843,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidCombination;
|
||||
}
|
||||
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KernelResult result = process.MemoryManager.SetMemoryAttribute(
|
||||
position,
|
||||
|
@ -871,7 +871,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
if (!currentProcess.MemoryManager.InsideAddrSpace(src, size))
|
||||
{
|
||||
|
@ -885,7 +885,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidMemRange;
|
||||
}
|
||||
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
return process.MemoryManager.Map(dst, src, size);
|
||||
}
|
||||
|
@ -907,7 +907,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
if (!currentProcess.MemoryManager.InsideAddrSpace(src, size))
|
||||
{
|
||||
|
@ -921,14 +921,14 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidMemRange;
|
||||
}
|
||||
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
return process.MemoryManager.Unmap(dst, src, size);
|
||||
}
|
||||
|
||||
public KernelResult QueryMemory(ulong infoPtr, ulong position, out ulong pageInfo)
|
||||
{
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KMemoryInfo blkInfo = process.MemoryManager.QueryMemory(position);
|
||||
|
||||
|
@ -968,7 +968,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidPermission;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KSharedMemory sharedMemory = currentProcess.HandleTable.GetObject<KSharedMemory>(handle);
|
||||
|
||||
|
@ -1009,7 +1009,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidMemState;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KSharedMemory sharedMemory = currentProcess.HandleTable.GetObject<KSharedMemory>(handle);
|
||||
|
||||
|
@ -1056,7 +1056,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidPermission;
|
||||
}
|
||||
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KResourceLimit resourceLimit = process.ResourceLimit;
|
||||
|
||||
|
@ -1112,7 +1112,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidMemRange;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
if ((currentProcess.PersonalMmHeapPagesCount & 0xfffffffffffff) == 0)
|
||||
{
|
||||
|
@ -1125,7 +1125,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidMemRange;
|
||||
}
|
||||
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
return process.MemoryManager.MapPhysicalMemory(address, size);
|
||||
}
|
||||
|
@ -1147,7 +1147,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidMemRange;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
if ((currentProcess.PersonalMmHeapPagesCount & 0xfffffffffffff) == 0)
|
||||
{
|
||||
|
@ -1160,7 +1160,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidMemRange;
|
||||
}
|
||||
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
return process.MemoryManager.UnmapPhysicalMemory(address, size);
|
||||
}
|
||||
|
@ -1177,7 +1177,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidSize;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KProcess targetProcess = currentProcess.HandleTable.GetObject<KProcess>(handle);
|
||||
|
||||
|
@ -1214,7 +1214,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidSize;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KProcess targetProcess = currentProcess.HandleTable.GetObject<KProcess>(handle);
|
||||
|
||||
|
@ -1259,7 +1259,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidPermission;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KProcess targetProcess = currentProcess.HandleTable.GetObject<KProcess>(handle);
|
||||
|
||||
|
@ -1285,7 +1285,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public KernelResult TerminateProcess(int handle)
|
||||
{
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
process = process.HandleTable.GetObject<KProcess>(handle);
|
||||
|
||||
|
@ -1293,7 +1293,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
if (process != null)
|
||||
{
|
||||
if (process == _context.Scheduler.GetCurrentProcess())
|
||||
if (process == KernelStatic.GetCurrentProcess())
|
||||
{
|
||||
result = KernelResult.Success;
|
||||
process.DecrementToZeroWhileTerminatingCurrent();
|
||||
|
@ -1314,12 +1314,12 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public void ExitProcess()
|
||||
{
|
||||
_context.Scheduler.GetCurrentProcess().TerminateCurrentProcess();
|
||||
KernelStatic.GetCurrentProcess().TerminateCurrentProcess();
|
||||
}
|
||||
|
||||
public KernelResult SignalEvent(int handle)
|
||||
{
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KWritableEvent writableEvent = process.HandleTable.GetObject<KWritableEvent>(handle);
|
||||
|
||||
|
@ -1343,7 +1343,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
{
|
||||
KernelResult result;
|
||||
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KWritableEvent writableEvent = process.HandleTable.GetObject<KWritableEvent>(handle);
|
||||
|
||||
|
@ -1363,14 +1363,14 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public KernelResult CloseHandle(int handle)
|
||||
{
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
return currentProcess.HandleTable.CloseHandle(handle) ? KernelResult.Success : KernelResult.InvalidHandle;
|
||||
}
|
||||
|
||||
public KernelResult ResetSignal(int handle)
|
||||
{
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KReadableEvent readableEvent = currentProcess.HandleTable.GetObject<KReadableEvent>(handle);
|
||||
|
||||
|
@ -1399,12 +1399,12 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public ulong GetSystemTick()
|
||||
{
|
||||
return _context.Scheduler.GetCurrentThread().Context.CntpctEl0;
|
||||
return KernelStatic.GetCurrentThread().Context.CntpctEl0;
|
||||
}
|
||||
|
||||
public void Break(ulong reason)
|
||||
{
|
||||
KThread currentThread = _context.Scheduler.GetCurrentThread();
|
||||
KThread currentThread = KernelStatic.GetCurrentThread();
|
||||
|
||||
if ((reason & (1UL << 31)) == 0)
|
||||
{
|
||||
|
@ -1429,7 +1429,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public void OutputDebugString(ulong strPtr, ulong size)
|
||||
{
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
string str = MemoryHelper.ReadAsciiString(process.CpuMemory, (long)strPtr, (long)size);
|
||||
|
||||
|
@ -1466,7 +1466,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidCombination;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KProcess process = currentProcess.HandleTable.GetKProcess(handle);
|
||||
|
||||
|
@ -1537,7 +1537,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidCombination;
|
||||
}
|
||||
|
||||
value = _context.Scheduler.GetCurrentProcess().Debug ? 1 : 0;
|
||||
value = KernelStatic.GetCurrentProcess().Debug ? 1 : 0;
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -1554,7 +1554,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidCombination;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
if (currentProcess.ResourceLimit != null)
|
||||
{
|
||||
|
@ -1581,14 +1581,14 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidHandle;
|
||||
}
|
||||
|
||||
int currentCore = _context.Scheduler.GetCurrentThread().CurrentCore;
|
||||
int currentCore = KernelStatic.GetCurrentThread().CurrentCore;
|
||||
|
||||
if (subId != -1 && subId != currentCore)
|
||||
{
|
||||
return KernelResult.InvalidCombination;
|
||||
}
|
||||
|
||||
value = _context.Scheduler.CoreContexts[currentCore].TotalIdleTimeTicks;
|
||||
value = KTimeManager.ConvertHostTicksToTicks(_context.Schedulers[currentCore].TotalIdleTimeTicks);
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -1605,8 +1605,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidCombination;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
value = currentProcess.RandomEntropy[subId];
|
||||
|
||||
|
@ -1620,14 +1619,14 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidCombination;
|
||||
}
|
||||
|
||||
KThread thread = _context.Scheduler.GetCurrentProcess().HandleTable.GetKThread(handle);
|
||||
KThread thread = KernelStatic.GetCurrentProcess().HandleTable.GetKThread(handle);
|
||||
|
||||
if (thread == null)
|
||||
{
|
||||
return KernelResult.InvalidHandle;
|
||||
}
|
||||
|
||||
KThread currentThread = _context.Scheduler.GetCurrentThread();
|
||||
KThread currentThread = KernelStatic.GetCurrentThread();
|
||||
|
||||
int currentCore = currentThread.CurrentCore;
|
||||
|
||||
|
@ -1636,13 +1635,13 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.Success;
|
||||
}
|
||||
|
||||
KCoreContext coreContext = _context.Scheduler.CoreContexts[currentCore];
|
||||
KScheduler scheduler = _context.Schedulers[currentCore];
|
||||
|
||||
long timeDelta = PerformanceCounter.ElapsedMilliseconds - coreContext.LastContextSwitchTime;
|
||||
long timeDelta = PerformanceCounter.ElapsedTicks - scheduler.LastContextSwitchTime;
|
||||
|
||||
if (subId != -1)
|
||||
{
|
||||
value = KTimeManager.ConvertMillisecondsToTicks(timeDelta);
|
||||
value = KTimeManager.ConvertHostTicksToTicks(timeDelta);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1653,7 +1652,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
totalTimeRunning += timeDelta;
|
||||
}
|
||||
|
||||
value = KTimeManager.ConvertMillisecondsToTicks(totalTimeRunning);
|
||||
value = KTimeManager.ConvertHostTicksToTicks(totalTimeRunning);
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -1669,7 +1668,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
{
|
||||
KEvent Event = new KEvent(_context);
|
||||
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KernelResult result = process.HandleTable.GenerateHandle(Event.WritableEvent, out wEventHandle);
|
||||
|
||||
|
@ -1701,7 +1700,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
if (maxCount != 0)
|
||||
{
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
ulong copySize = (ulong)maxCount * 8;
|
||||
|
||||
|
@ -1807,7 +1806,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
{
|
||||
handle = 0;
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
if (cpuCore == -2)
|
||||
{
|
||||
|
@ -1844,7 +1843,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
if (result == KernelResult.Success)
|
||||
{
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
result = process.HandleTable.GenerateHandle(thread, out handle);
|
||||
}
|
||||
|
@ -1860,7 +1859,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public KernelResult StartThread(int handle)
|
||||
{
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KThread thread = process.HandleTable.GetKThread(handle);
|
||||
|
||||
|
@ -1887,35 +1886,31 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public void ExitThread()
|
||||
{
|
||||
KThread currentThread = _context.Scheduler.GetCurrentThread();
|
||||
|
||||
_context.Scheduler.ExitThread(currentThread);
|
||||
KThread currentThread = KernelStatic.GetCurrentThread();
|
||||
|
||||
currentThread.Exit();
|
||||
}
|
||||
|
||||
public void SleepThread(long timeout)
|
||||
{
|
||||
KThread currentThread = _context.Scheduler.GetCurrentThread();
|
||||
|
||||
if (timeout < 1)
|
||||
{
|
||||
switch (timeout)
|
||||
{
|
||||
case 0: currentThread.Yield(); break;
|
||||
case -1: currentThread.YieldWithLoadBalancing(); break;
|
||||
case -2: currentThread.YieldAndWaitForLoadBalancing(); break;
|
||||
case 0: KScheduler.Yield(_context); break;
|
||||
case -1: KScheduler.YieldWithLoadBalancing(_context); break;
|
||||
case -2: KScheduler.YieldToAnyThread(_context); break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
currentThread.Sleep(timeout);
|
||||
KernelStatic.GetCurrentThread().Sleep(timeout);
|
||||
}
|
||||
}
|
||||
|
||||
public KernelResult GetThreadPriority(int handle, out int priority)
|
||||
{
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KThread thread = process.HandleTable.GetKThread(handle);
|
||||
|
||||
|
@ -1937,7 +1932,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
{
|
||||
// TODO: NPDM check.
|
||||
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KThread thread = process.HandleTable.GetKThread(handle);
|
||||
|
||||
|
@ -1953,7 +1948,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public KernelResult GetThreadCoreMask(int handle, out int preferredCore, out long affinityMask)
|
||||
{
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KThread thread = process.HandleTable.GetKThread(handle);
|
||||
|
||||
|
@ -1975,7 +1970,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public KernelResult SetThreadCoreMask(int handle, int preferredCore, long affinityMask)
|
||||
{
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
if (preferredCore == -2)
|
||||
{
|
||||
|
@ -2009,7 +2004,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
}
|
||||
}
|
||||
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KThread thread = process.HandleTable.GetKThread(handle);
|
||||
|
||||
|
@ -2023,12 +2018,12 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public int GetCurrentProcessorNumber()
|
||||
{
|
||||
return _context.Scheduler.GetCurrentThread().CurrentCore;
|
||||
return KernelStatic.GetCurrentThread().CurrentCore;
|
||||
}
|
||||
|
||||
public KernelResult GetThreadId(int handle, out long threadUid)
|
||||
{
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KThread thread = process.HandleTable.GetKThread(handle);
|
||||
|
||||
|
@ -2048,7 +2043,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public KernelResult SetThreadActivity(int handle, bool pause)
|
||||
{
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KThread thread = process.HandleTable.GetObject<KThread>(handle);
|
||||
|
||||
|
@ -2062,7 +2057,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidHandle;
|
||||
}
|
||||
|
||||
if (thread == _context.Scheduler.GetCurrentThread())
|
||||
if (thread == KernelStatic.GetCurrentThread())
|
||||
{
|
||||
return KernelResult.InvalidThread;
|
||||
}
|
||||
|
@ -2072,8 +2067,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public KernelResult GetThreadContext3(ulong address, int handle)
|
||||
{
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KThread currentThread = _context.Scheduler.GetCurrentThread();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
KThread currentThread = KernelStatic.GetCurrentThread();
|
||||
|
||||
KThread thread = currentProcess.HandleTable.GetObject<KThread>(handle);
|
||||
|
||||
|
@ -2190,13 +2185,13 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.MaximumExceeded;
|
||||
}
|
||||
|
||||
KThread currentThread = _context.Scheduler.GetCurrentThread();
|
||||
KThread currentThread = KernelStatic.GetCurrentThread();
|
||||
|
||||
var syncObjs = new Span<KSynchronizationObject>(currentThread.WaitSyncObjects).Slice(0, handlesCount);
|
||||
|
||||
if (handlesCount != 0)
|
||||
{
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
if (currentProcess.MemoryManager.AddrSpaceStart > handlesPtr)
|
||||
{
|
||||
|
@ -2267,7 +2262,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public KernelResult CancelSynchronization(int handle)
|
||||
{
|
||||
KProcess process = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess process = KernelStatic.GetCurrentProcess();
|
||||
|
||||
KThread thread = process.HandleTable.GetKThread(handle);
|
||||
|
||||
|
@ -2293,7 +2288,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidAddress;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
return currentProcess.AddressArbiter.ArbitrateLock(ownerHandle, mutexAddress, requesterHandle);
|
||||
}
|
||||
|
@ -2310,7 +2305,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidAddress;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
return currentProcess.AddressArbiter.ArbitrateUnlock(mutexAddress);
|
||||
}
|
||||
|
@ -2331,7 +2326,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidAddress;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
return currentProcess.AddressArbiter.WaitProcessWideKeyAtomic(
|
||||
mutexAddress,
|
||||
|
@ -2342,7 +2337,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
public KernelResult SignalProcessWideKey(ulong address, int count)
|
||||
{
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
currentProcess.AddressArbiter.SignalProcessWideKey(address, count);
|
||||
|
||||
|
@ -2361,7 +2356,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidAddress;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
return type switch
|
||||
{
|
||||
|
@ -2387,7 +2382,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.InvalidAddress;
|
||||
}
|
||||
|
||||
KProcess currentProcess = _context.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
return type switch
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue