From d370c89a442287b43fb59e9778a893b465d5f09d Mon Sep 17 00:00:00 2001 From: ergo720 <45463469+ergo720@users.noreply.github.com> Date: Wed, 20 Mar 2019 14:16:25 +0100 Subject: [PATCH] Fix a bug in KiClockIsr affecting slower host CPUs --- src/core/kernel/exports/EmuKrnlKi.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/kernel/exports/EmuKrnlKi.cpp b/src/core/kernel/exports/EmuKrnlKi.cpp index 543416bbd..1cb489da4 100644 --- a/src/core/kernel/exports/EmuKrnlKi.cpp +++ b/src/core/kernel/exports/EmuKrnlKi.cpp @@ -135,6 +135,7 @@ xboxkrnl::VOID xboxkrnl::KiClockIsr( LARGE_INTEGER InterruptTime; LARGE_INTEGER HostSystemTime; ULONG Hand; + DWORD OldKeTickCount; OldIrql = KfRaiseIrql(CLOCK_LEVEL); @@ -156,6 +157,7 @@ xboxkrnl::VOID xboxkrnl::KiClockIsr( KeSystemTime.High1Time = HostSystemTime.u.HighPart; // Update the tick counter + OldKeTickCount = KeTickCount; KeTickCount += ScalingFactor; // Because this function must be fast to continuously update the kernel clocks, if somebody else is currently @@ -166,7 +168,7 @@ xboxkrnl::VOID xboxkrnl::KiClockIsr( Hand = KeTickCount & (TIMER_TABLE_SIZE - 1); if (KiTimerTableListHead[Hand].Entry.Flink != &KiTimerTableListHead[Hand].Entry && (ULONGLONG)InterruptTime.QuadPart >= KiTimerTableListHead[Hand].Time.QuadPart) { - KeInsertQueueDpc(&KiTimerExpireDpc, (PVOID)&KeTickCount, 0); + KeInsertQueueDpc(&KiTimerExpireDpc, (PVOID)OldKeTickCount, 0); } KiTimerMtx.Acquired = false; KiTimerMtx.Mtx.unlock();