KiIdleLoop
VOID __stdcall __noreturn KiIdleLoop(){
struct _KPRCB *CurrentPrcb;
_ETHREAD *IdleThread;
int v2;
_ETHREAD *NextThread;
unsigned __int64 v4;
unsigned __int64 v5;
void *retaddr;
if( (_BYTE)KeSmapEnabled )
__clac();
retaddr = 0i64;
CurrentPrcb = KeGetCurrentPrcb();
while( 1 )
{
while( 1 )
{
if( HvlEnableIdleYield )
_mm_pause();
_enable();
_disable();
if( (CurrentPrcb->DpcRequestSummary & 0x3F) != 0 )
KiRetireDpcList(CurrentPrcb);
if( CurrentPrcb->QuantumEnd )
{
CurrentPrcb->QuantumEnd = 0;
_enable();
KiQuantumEnd();
_disable();
}
_InterlockedOr8((volatile signed __int8 *)&CurrentPrcb->IdleHalt, 1u);
if( !CurrentPrcb->NextThread )
break;
CurrentPrcb->IdleHalt = 0;
_enable();
IdleThread = CurrentPrcb->IdleThread;
if( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) )
{
v2 = 0;
do
{
do
{
++v2;
_mm_pause();
}
while( (CurrentPrcb->PrcbLock & 1) != 0 );
}
while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) );
}
NextThread = CurrentPrcb->NextThread;
CurrentPrcb->NextThread = 0i64;
if( NextThread != IdleThread )
{
_disable();
++CurrentPrcb->NestingLevel;
v4 = __rdtsc();
v5 = (((unsigned __int64)HIDWORD(v4) << 32) | (unsigned int)v4) - CurrentPrcb->StartCycles;
IdleThread->Tcb.CycleTime += v5;
CurrentPrcb->StartCycles += v5;
_enable();
CurrentPrcb->CurrentThread = NextThread;
NextThread->Tcb.WaitBlockFill6[68] = 2;
_InterlockedAnd64((volatile signed __int64 *)&CurrentPrcb->PrcbLock, 0i64);
goto LABEL_23;
}
CurrentPrcb->PrcbLock = 0i64;
}
if( CurrentPrcb->IdleSchedule )
{
CurrentPrcb->IdleHalt = 0;
_enable();
if( KiIdleSchedule(CurrentPrcb) )
{
LABEL_23:
CurrentPrcb->InterruptRequest |= (CurrentPrcb->DpcRequestSummary & 0x2F) != 0;
if( (_BYTE)KeSmapEnabled )
__stac();
SwapContext();
if( (_BYTE)KeSmapEnabled )
__clac();
}
}
else
{
if( (CurrentPrcb->DpcRequestSummary & 0x3F) == 0 )
{
if( (_BYTE)KeSmapEnabled )
__stac();
__writecr8(0i64);
PoIdle(CurrentPrcb);
_enable();
__writecr8(2ui64);
if( (_BYTE)KeSmapEnabled )
__clac();
}
CurrentPrcb->IdleHalt = 0;
}
}
}Referenced by:
KiSystemStartup