KiSetProcessorIdle
VOID __stdcall KiSetProcessorIdle(_KPRCB *Prcb, UINT64 Idle, UINT64 IdleSchedule){
_KNODE *ParentNode;
int IdleState;
_BYTE *SchedulerAssist;
int v6;
unsigned __int64 CoreProcessorSet;
unsigned __int64 v8;
int v9;
ParentNode = Prcb->ParentNode;
IdleState = Prcb->IdleState;
if( (_DWORD)Idle )
{
SchedulerAssist = Prcb->SchedulerAssist;
if( SchedulerAssist )
SchedulerAssist[16] = 1;
Prcb->IdleSchedule = IdleSchedule;
if( (IdleState & 1) != 0 )
{
v6 = IdleState - 1;
Prcb->IdleState = v6;
if( !v6 )
_interlockedbittestandset64((volatile signed __int32 *)ParentNode, Prcb->GroupIndex);
_interlockedbittestandset64((volatile signed __int32 *)&ParentNode->IdleCpuSet, Prcb->GroupIndex);
CoreProcessorSet = Prcb->CoreProcessorSet;
if( (ParentNode->IdleCpuSet & CoreProcessorSet) == CoreProcessorSet )
{
_InterlockedOr64((volatile signed __int64 *)&ParentNode->IdleSmtSet, CoreProcessorSet);
}
else
{
v8 = Prcb->CoreProcessorSet & ~ParentNode->IdleCpuSet;
if( ((v8 - 1) & v8) == 0 )
_InterlockedOr64((volatile signed __int64 *)&ParentNode->NonPairedSmtSet, v8);
}
_interlockedbittestandreset64((volatile signed __int32 *)&ParentNode->NonPairedSmtSet, Prcb->GroupIndex);
}
}
else
{
Prcb->IdleSchedule = 0;
if( (IdleState & 1) != 0 )
__fastfail(0x21u);
v9 = IdleState + 1;
Prcb->IdleState = v9;
if( v9 == 1 )
_interlockedbittestandreset64((volatile signed __int32 *)ParentNode, Prcb->GroupIndex);
_interlockedbittestandreset64((volatile signed __int32 *)&ParentNode->IdleCpuSet, Prcb->GroupIndex);
_InterlockedAnd64((volatile signed __int64 *)&ParentNode->IdleSmtSet, ~Prcb->CoreProcessorSet);
_InterlockedAnd64((volatile signed __int64 *)&ParentNode->NonPairedSmtSet, ~Prcb->CoreProcessorSet);
if( (Prcb->CoreProcessorSet & ~ParentNode->IdleCpuSet) == Prcb->GroupSetMember )
_interlockedbittestandset64((volatile signed __int32 *)&ParentNode->NonPairedSmtSet, Prcb->GroupIndex);
}
}Referenced by:
KeTransitionProcessorParkState
KiCompleteKernelInit
KiGroupSchedulingGenerationEnd
KiSchedulerApc
KiSearchForNewThread
KiSelectNextThread