PpmHeteroUpdateHgsConfiguration
INT8 __stdcall PpmHeteroUpdateHgsConfiguration(){
INT8 v0;
int v2;
__int64 HwFeedbackTableIndex;
char v4;
_KAFFINITY_EX *p_Affinity;
int v6;
_KPRCB *Prcb;
NTSTATUS IsEmptyAffinity;
int v9;
_KPRCB *v10;
unsigned int v11;
NTSTATUS v12;
unsigned __int8 v13;
int v14;
_KPRCB *v15;
unsigned int v16;
int v17;
__int64 v18;
int v19;
_KPRCB *v20;
unsigned int v21;
NTSTATUS v22;
unsigned __int8 v23;
unsigned int v24;
int v25;
__int64 v26;
int v27;
_KPRCB *v28;
UINT64 ProcIndex;
_KAFFINITY_ENUMERATION_CONTEXT Context;
unsigned __int64 v31;
_KAFFINITY_EX v32;
_KAFFINITY_EX Affinity;
*(_DWORD *)(&Context.CurrentIndex + 1) = 0;
*(&Context.CurrentIndex + 3) = 0;
LODWORD(ProcIndex) = 0;
memset(Affinity.Bitmap, 0i64, sizeof(Affinity.Bitmap));
memset(v32.Bitmap, 0i64, sizeof(v32.Bitmap));
v0 = 0;
if( PpmHeteroHgsEnabled )
{
if( !KeIsEmptyAffinityEx(&PpmCheckRegistered.Count) )
{
v31 = __readmsr(0x1B1u);
if( (v31 & 0x4000000) != 0 )
{
*(_DWORD *)&Affinity.Count = 1310721;
PpmHeteroHgsPopulated = 1;
memset(&Affinity.Reserved, 0i64, 0xA4u);
*(_DWORD *)&v32.Count = 1310721;
memset(&v32.Reserved, 0i64, 0xA4u);
Context.CurrentMask = PpmCheckRegistered.Bitmap[0];
Context.CurrentIndex = 0;
Context.Affinity = &PpmCheckRegistered;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( v2 )
break;
HwFeedbackTableIndex = KeGetPrcb((unsigned int)ProcIndex)->PowerState.HwFeedbackTableIndex;
if( !*(_BYTE *)(PpmHeteroHgsInterface + 8 * HwFeedbackTableIndex + 16)
|| (v4 = *(_BYTE *)(PpmHeteroHgsInterface + 8 * HwFeedbackTableIndex + 17), p_Affinity = &v32, !v4) )
{
p_Affinity = &Affinity;
}
KeAddProcessorAffinityEx(&p_Affinity->Count, (unsigned int)ProcIndex);
}
if( KeIsEmptyAffinityEx(&v32.Count) )
{
Context.CurrentMask = PpmCheckRegistered.Bitmap[0];
Context.CurrentIndex = 0;
Context.Affinity = &PpmCheckRegistered;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( v6 )
break;
Prcb = KeGetPrcb((unsigned int)ProcIndex);
if( Prcb->PowerState.HwFeedbackEfficiencyClass )
{
v0 = 1;
Prcb->PowerState.HwFeedbackEfficiencyClass = 0;
}
if( Prcb->PowerState.HwFeedbackPerformanceClass )
{
v0 = 1;
Prcb->PowerState.HwFeedbackPerformanceClass = 0;
}
if( Prcb->PowerState.HwFeedbackParkHint )
{
v0 = 1;
Prcb->PowerState.HwFeedbackParkHint = 0;
}
}
}
else
{
IsEmptyAffinity = KeIsEmptyAffinityEx(&Affinity.Count);
Context.CurrentIndex = 0;
Context.Affinity = &Affinity;
Context.CurrentMask = Affinity.Bitmap[0];
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( v9 )
break;
v10 = KeGetPrcb((unsigned int)ProcIndex);
if( v10->PowerState.HwFeedbackEfficiencyClass )
{
v0 = 1;
v10->PowerState.HwFeedbackEfficiencyClass = 0;
}
if( v10->PowerState.HwFeedbackPerformanceClass )
{
v0 = 1;
v10->PowerState.HwFeedbackPerformanceClass = 0;
}
if( v10->PowerState.HwFeedbackParkHint != 1 )
{
v0 = 1;
v10->PowerState.HwFeedbackParkHint = 1;
}
}
v11 = -1;
v12 = KeCountSetBitsAffinityEx(&v32.Count);
if( v12 )
{
v13 = IsEmptyAffinity == 0;
do
{
Context.CurrentMask = v32.Bitmap[0];
Context.Affinity = &v32;
Context.CurrentIndex = 0;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( v14 )
break;
v15 = KeGetPrcb((unsigned int)ProcIndex);
if( v15->PowerState.HwFeedbackParkHint )
{
v0 = 1;
v15->PowerState.HwFeedbackParkHint = 0;
}
}
v16 = -1;
Context.CurrentMask = v32.Bitmap[0];
Context.Affinity = &v32;
Context.CurrentIndex = 0;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( v17 )
break;
v18 = KeGetPrcb((unsigned int)ProcIndex)->PowerState.HwFeedbackTableIndex;
if( (v11 == -1 || *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v18 + 16) > v11)
&& v16 >= *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v18 + 16) )
{
v16 = *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v18 + 16);
}
}
Context.CurrentMask = v32.Bitmap[0];
Context.Affinity = &v32;
Context.CurrentIndex = 0;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( v19 )
break;
v20 = KeGetPrcb((unsigned int)ProcIndex);
if( *(unsigned __int8 *)(PpmHeteroHgsInterface + 8i64 * v20->PowerState.HwFeedbackTableIndex + 16) == v16 )
{
if( v20->PowerState.HwFeedbackPerformanceClass != v13 )
{
v0 = 1;
v20->PowerState.HwFeedbackPerformanceClass = v13;
}
--v12;
}
}
v11 = v16;
++v13;
}
while( v12 );
}
v21 = -1;
v22 = KeCountSetBitsAffinityEx(&v32.Count);
if( v22 )
{
v23 = IsEmptyAffinity == 0;
do
{
Context.CurrentMask = v32.Bitmap[0];
v24 = -1;
Context.Affinity = &v32;
Context.CurrentIndex = 0;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( v25 )
break;
v26 = KeGetPrcb((unsigned int)ProcIndex)->PowerState.HwFeedbackTableIndex;
if( (v21 == -1 || *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v26 + 17) > v21)
&& v24 >= *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v26 + 17) )
{
v24 = *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v26 + 17);
}
}
Context.CurrentMask = v32.Bitmap[0];
Context.Affinity = &v32;
Context.CurrentIndex = 0;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( v27 )
break;
v28 = KeGetPrcb((unsigned int)ProcIndex);
if( *(unsigned __int8 *)(PpmHeteroHgsInterface + 8i64 * v28->PowerState.HwFeedbackTableIndex + 17) == v24 )
{
if( v28->PowerState.HwFeedbackEfficiencyClass != v23 )
{
v0 = 1;
v28->PowerState.HwFeedbackEfficiencyClass = v23;
}
--v22;
}
}
++v23;
v21 = v24;
}
while( v22 );
}
}
v31 = __readmsr(0x1B1u) & 0xFFFFFFFFFBFFFFFFui64;
__writemsr(0x1B1u, v31);
}
}
}
return v0;
}Referenced by:
PopInitializeHeteroProcessors