diff --git a/ntoskrnl/ke/amd64/krnlinit.c b/ntoskrnl/ke/amd64/krnlinit.c index d7aea4db738..11bc3d34a4b 100644 --- a/ntoskrnl/ke/amd64/krnlinit.c +++ b/ntoskrnl/ke/amd64/krnlinit.c @@ -197,7 +197,8 @@ KiSystemStartupBootStack(VOID) /* If there's no thread scheduled, put this CPU in the Idle summary */ KiAcquirePrcbLock(Prcb); - if (!Prcb->NextThread) KiIdleSummary |= (ULONG_PTR)1 << Prcb->Number; + if (!Prcb->NextThread) + InterlockedBitTestAndSetAffinity(&KiIdleSummary, Prcb->Number); KiReleasePrcbLock(Prcb); /* Raise back to HIGH_LEVEL and clear the PRCB for the loader block */ diff --git a/ntoskrnl/ke/amd64/stubs.c b/ntoskrnl/ke/amd64/stubs.c index 98c420ade8f..b4e6377a138 100644 --- a/ntoskrnl/ke/amd64/stubs.c +++ b/ntoskrnl/ke/amd64/stubs.c @@ -101,6 +101,9 @@ KiIdleLoop(VOID) PKPRCB Prcb = KeGetCurrentPrcb(); PKTHREAD OldThread, NewThread; + /* Set idle summary bit */ + InterlockedBitTestAndSetAffinity(&KiIdleSummary, Prcb->Number); + /* Now loop forever */ while (TRUE) { @@ -144,9 +147,15 @@ KiIdleLoop(VOID) KfRaiseIrql(SYNCH_LEVEL); #endif + /* Clear idle summary bit */ + InterlockedBitTestAndResetAffinity(&KiIdleSummary, Prcb->Number); + /* Switch away from the idle thread */ KiSwapContext(APC_LEVEL, OldThread); + /* Set idle summary bit */ + InterlockedBitTestAndSetAffinity(&KiIdleSummary, Prcb->Number); + #ifdef CONFIG_SMP /* Go back to DISPATCH_LEVEL */ KeLowerIrql(DISPATCH_LEVEL);