PpmIdleCheckCoordinatedStateEligibility
UINT64 __stdcall PpmIdleCheckCoordinatedStateEligibility(
_KPRCB *Prcb,
UINT64 PreselectState,
UINT64 RemainingLatency,
UINT64 ExpectedIdle,
UINT64 StateIndex,
UINT64 EntryPriority,
UINT64 *ProcessorState,
_PPM_COORDINATED_SELECTION *CoordinatedSelection){
unsigned int v8;
__int64 v9;
unsigned int v10;
_PPM_IDLE_STATES *IdleStates;
__int64 v13;
_KAFFINITY_EX *SecondaryMask;
__int64 v15;
int v16;
unsigned int v17;
UINT64 v18;
UINT64 v19;
unsigned int v20;
UINT64 Dependencies;
unsigned int StateIndexa;
v8 = StateIndex;
v9 = PpmPlatformStates;
v10 = RemainingLatency;
IdleStates = Prcb->PowerState.IdleStates;
v13 = 384i64 * (unsigned int)StateIndex;
SecondaryMask = &IdleStates->SecondaryProcessorMask;
StateIndexa = CoordinatedSelection->SelectedStates;
if( *(_BYTE *)(v13 + PpmPlatformStates + 121) )
{
if( !IdleStates->PrepareInfo.Constraints.PlatformIdle )
{
v15 = Prcb->ClockOwner != 0 ? 0xFFFFFFFFi64 : 2147483660i64;
LABEL_21:
PpmIdleRollbackCoordinatedSelection(CoordinatedSelection, StateIndexa);
return v15;
}
}
else
{
KeIsSubsetAffinityEx((_KAFFINITY_EX *)(v13 + PpmPlatformStates + 128), &IdleStates->DeepIdleSnapshot);
if( !v16 )
{
LABEL_5:
v15 = 0xFFFFFFFFi64;
goto LABEL_21;
}
}
if( _InterlockedCompareExchange(
(volatile signed __int32 *)(v13 + v9 + 320),
((_DWORD)EntryPriority << 27) | KeGetPcr()->Prcb.Number & 0xFFF | 0x1000000,
0) )
{
goto LABEL_5;
}
CoordinatedSelection->Selection[CoordinatedSelection->SelectedStates++] = v8;
v17 = PpmCheckIdleVeto((_PPM_VETO_ACCOUNTING *)(v13 + v9 + 80));
if( v17 )
{
v15 = v17 | 0x100000000i64;
goto LABEL_21;
}
if( *(_DWORD *)(v13 + v9 + 72) > v10 )
{
v15 = 2147483650i64;
goto LABEL_21;
}
if( *(_DWORD *)(v13 + v9 + 384) )
goto LABEL_20;
if( *(unsigned int *)(v13 + v9 + 76) > v19 )
{
v15 = 2147483651i64;
goto LABEL_21;
}
LODWORD(Dependencies) = *(_DWORD *)(v13 + v9 + 124);
v15 = PpmIdleCheckCoordinatedDependencies(
Prcb,
v20,
v18,
v10 - *(_DWORD *)(v13 + v9 + 72),
v19,
Dependencies,
*(_PPM_SELECTION_DEPENDENCY **)(v13 + v9 + 312),
ProcessorState,
CoordinatedSelection,
SecondaryMask);
if( v15 )
goto LABEL_21;
if( *(_DWORD *)ProcessorState == -1 )
{
v15 = 2147483649i64;
goto LABEL_21;
}
if( PpmIdleWaitForDependentTransitions(SecondaryMask) < 0 )
{
v15 = 2147483653i64;
goto LABEL_21;
}
if( *(_DWORD *)(v13 + v9 + 384) )
{
LABEL_20:
v15 = 2147483652i64;
goto LABEL_21;
}
return v15;
}Referenced by:
PpmIdleCheckCoordinatedDependency
PpmIdleSelectStates