PpmCheckInitProcessors
VOID __stdcall PpmCheckInitProcessors(INT64 ecx0){
int v1;
int v2;
_KPRCB *Prcb;
int v4;
_KPRCB *v5;
unsigned int v6;
UINT64 a5;
UINT64 ProcIndex;
_KAFFINITY_ENUMERATION_CONTEXT Context;
_KAFFINITY_ENUMERATION_CONTEXT v10;
_KAFFINITY_EX Result;
_KAFFINITY_EX Affinity;
v1 = ecx0;
memset(&Affinity, 0i64, sizeof(Affinity));
*(_DWORD *)(&Context.CurrentIndex + 1) = 0;
*(&Context.CurrentIndex + 3) = 0;
memset(&Result, 0i64, sizeof(Result));
a5 = 0i64;
if( v1 )
{
*(_DWORD *)&Result.Count = 1310721;
memset(&Result.Reserved, 0i64, 0xA4u);
}
else
{
PpmAcquireLock((_PPM_LOCK *)((char *)&stru_140C23628 + 1048));
KeQueryActiveProcessorAffinity((INT64)&Affinity);
if( !(unsigned __int8)KeSubtractAffinityEx(&Affinity.Count, (INT8 *)&PpmCheckRegistered, (INT8 *)&Result) )
{
PpmReleaseLock((INT64 *)&stru_140C23628 + 131);
return;
}
}
KeOrAffinityEx((INT8 *)&PpmCheckRegistered, &Result.Count, (INT8 *)&PpmCheckRegistered);
if( !KeIsEmptyAffinityEx(&Result.Count) )
{
Context.CurrentMask = Result.Bitmap[0];
Context.Affinity = &Result;
Context.CurrentIndex = 0;
while( 1 )
{
KeEnumerateNextProcessor((UINT64 *)((char *)&a5 + 4), &Context);
if( v2 )
break;
Prcb = KeGetPrcb(HIDWORD(a5));
PpmAllocatePerfCheck((_KPRCB *)&Prcb->PowerState.CheckContext);
}
PopExecuteOnTargetProcessors(
&Result,
(INT64 *)PpmCheckProcessorInit,
0i64,
0i64,
a5,
ProcIndex,
(UINT64)Context.Affinity);
}
PpmParkRegisterParking();
if( (KeGetCurrentPrcb()->FeatureBits & 0x8000000000i64) != 0 )
{
*(&stru_140C23628 + 882) |= 0x400u;
LODWORD(a5) = a5 | 0x400;
PpmUpdateProcessorPolicy((_PPM_POLICY_ACTION_MASK *)&a5);
}
PpmCheckReInit();
PpmCheckApplyParkConstraints();
*(_DWORD *)(&v10.CurrentIndex + 1) = 0;
*(&v10.CurrentIndex + 3) = 0;
LODWORD(ProcIndex) = 0;
if( KeGetCurrentPrcb()->PowerState.Hypervisor == ProcHypervisorPresent
&& HvlIsRootPowerSchedulerQosPresent()
&& !PpmPerfVmQosSupported )
{
PpmAcquireLock((_PPM_LOCK *)((char *)&stru_140C23628 + 1048));
v10.CurrentMask = PpmCheckRegistered.Bitmap[0];
v10.CurrentIndex = 0;
v10.Affinity = &PpmCheckRegistered;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &v10);
if( v4 )
break;
v5 = KeGetPrcb((unsigned int)ProcIndex);
v6 = PpmPerfQosTransitionHysteresisOverride;
if( PpmPerfQosTransitionHysteresisOverride == -1 )
v6 = PpmPerfQosTransitionHysteresis;
v5->PowerState.QosTransitionHysteresis = PpmConvertTime(v6, 0xF4240ui64, 1000000i64 * v5->MHz);
}
PpmPerfQosManageIdleProcessors = 0;
PpmPerfVmQosSupported = 1;
PpmReinitializeHeteroEngine(1);
}
}Referenced by:
PoInitSystem
PopNewProcessorCallback
PpmReapplyPerfPolicy