PpmParkCalculateCoreParkingMask
INT64 __fastcall PpmParkCalculateCoreParkingMask(){
INT64 result;
unsigned int v1;
unsigned int v2;
_QWORD *v3;
__int64 v4;
unsigned int v5;
unsigned int v6;
__int64 v7;
__int64 *v8;
__int64 v9;
UINT64 v10;
int v11;
__int64 v12;
__int64 v13;
UINT64 v14;
unsigned int v15;
UINT64 v16;
unsigned __int64 v17;
__int64 v18;
__int16 v19;
__int64 v20;
__int64 v21;
__int64 v22;
UINT8 v23;
UINT64 v24;
__int16 v25;
__int64 v26;
__int16 v27;
__int64 v28;
__int64 v29;
UINT64 v30;
UINT64 v31;
__int64 v32;
__int64 v33;
__int64 v34;
CHAR v35;
unsigned int v36;
unsigned int v37;
unsigned int v38;
unsigned int v39;
unsigned int v40;
int v41;
unsigned int v42;
unsigned int v43;
bool v44;
CHAR v45;
UINT64 v46;
UINT64 v47;
_EVENT_DESCRIPTOR *v48;
UINT64 v49;
UINT64 v50;
UINT64 UnparkCount;
UINT64 a6;
INT64 PlatformPark;
UINT64 v54;
UINT64 v55;
__int128 v56;
__int64 v57;
UINT64 IsolatedCores;
unsigned int v59;
UINT64 a2;
unsigned int v61;
__int64 v62;
UINT64 a10;
__int64 v64;
_QWORD *a1;
unsigned __int64 v66;
UINT64 a9;
_QWORD *v68;
__int64 v69;
UINT64 OsUnpark;
unsigned __int16 *v71[2];
__int16 v72;
int v73;
__int16 v74;
UINT64 v75;
int a11;
UINT64 ProcessorNumber;
unsigned int v78;
result = 0i64;
v56 = 0i64;
v57 = 0i64;
LODWORD(v75) = 0;
IsolatedCores = 0i64;
a9 = 0i64;
a10 = 0i64;
if( !PpmIsParkingEnabled )
goto LABEL_2;
v1 = 0;
v59 = 0;
v69 = (__int64)PpmCurrentProfile + 2736 * dword_140C23D0C;
v2 = 100 * *(unsigned __int8 *)(v69 + 164);
v61 = v2;
if( !(_DWORD)PpmParkNumNodes )
goto LABEL_84;
do
{
v3 = (_QWORD *)(PpmParkNodes + 272i64 * v1);
a1 = v3;
if( (*((_BYTE *)v3 + 146) & 1) != 0 )
goto LABEL_83;
v4 = 0i64;
v5 = *((unsigned __int8 *)v3 + 135);
v3[5] = v3[4];
v6 = *((unsigned __int8 *)v3 + 137);
v73 = 0;
v74 = 0;
if( (unsigned __int8)v5 >= (unsigned __int8)v6 )
v5 = v6;
LODWORD(ProcessorNumber) = 0;
v72 = *((_WORD *)v3 + 2);
v71[1] = *((unsigned __int16 **)v3 + 1);
v78 = v5;
v71[0] = 0i64;
while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, v71) )
{
KeGetPrcb((unsigned int)ProcessorNumber);
if( *(_DWORD *)(v7 + 33172) >= v2 )
v4 |= *(_QWORD *)(v7 + 200);
}
v8 = v3 + 7;
v62 = v4;
v68 = v3 + 7;
v9 = 0i64;
LODWORD(ProcessorNumber) = 0;
v64 = 0i64;
do
{
v10 = *(v8 - 5);
a2 = v10;
if( !v10 )
break;
v11 = 0x100000;
if( (unsigned __int8)PpmParkGranularity <= 1u )
{
v12 = *v8;
}
else
{
v12 = 0i64;
LOWORD(v57) = *((_WORD *)v3 + 2);
*((_QWORD *)&v56 + 1) = *v8;
*(_QWORD *)&v56 = 0i64;
while( !(unsigned int)KeEnumerateNextProcessor(&v75, (unsigned __int16 **)&v56) )
{
KeGetPrcb((unsigned int)v75);
v12 |= *(_QWORD *)(v13 + 33880);
}
}
v14 = v10 & v12;
OsUnpark = v14;
if( v14 )
v11 = 1114112;
a11 = v11;
v15 = v5;
if( *((unsigned __int8 *)v3 + v9 + 128)
- ((unsigned int)((0x101010101010101i64
* ((((v14 - ((v14 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v14 - ((v14 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
+ ((((v14 - ((v14 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v14 - ((v14 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24) <= v5 )
v15 = *((unsigned __int8 *)v3 + v9 + 128)
- ((unsigned int)((0x101010101010101i64
* ((((v14 - ((v14 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v14 - ((v14 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
+ ((((v14 - ((v14 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v14 - ((v14 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24);
v16 = 0i64;
LODWORD(v17) = 0;
v54 = 0i64;
if( !KiClockTimerPerCpu )
{
LODWORD(v75) = KiClockTimerOwner;
KeGetPrcb((unsigned int)KiClockTimerOwner);
v19 = *((_WORD *)v3 + 2);
if( *(unsigned __int8 *)(v18 + 208) == v19 )
{
v20 = *(_QWORD *)(v18 + 200);
if( (v20 & v10) != 0 )
{
*(_QWORD *)&v56 = 0i64;
LOWORD(v57) = v19;
*((_QWORD *)&v56 + 1) = v20;
while( !(unsigned int)KeEnumerateNextProcessor(&v75, (unsigned __int16 **)&v56) && (unsigned int)v17 < v15 )
{
KeGetPrcb((unsigned int)v75);
v22 = *(_QWORD *)(v21 + 200);
if( (v22 & v14) == 0 )
{
if( (unsigned __int8)PpmParkGranularity > 1u )
v22 = *(_QWORD *)(v21 + 33880);
v11 |= 0x100u;
a11 = v11;
v16 |= v22;
v17 = (0x101010101010101i64
* ((((v16 - ((v16 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v16 - ((v16 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
+ ((((v16 - ((v16 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v16 - ((v16 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
}
}
v3 = a1;
v10 = a2;
v54 = v16;
}
}
}
v23 = KeCpuSetQueryUnparkRecommendation(*((unsigned __int16 *)v3 + 2), v10, &IsolatedCores);
v66 = v23;
if( v23 )
{
v24 = IsolatedCores;
if( (unsigned __int8)PpmParkGranularity > 1u )
{
v25 = *((_WORD *)v3 + 2);
*(_QWORD *)&v56 = 0i64;
LOWORD(v57) = v25;
*((_QWORD *)&v56 + 1) = IsolatedCores;
while( !(unsigned int)KeEnumerateNextProcessor(&v75, (unsigned __int16 **)&v56) )
{
KeGetPrcb((unsigned int)v75);
v24 |= *(_QWORD *)(v26 + 33880);
}
IsolatedCores = v24;
v66 = (0x101010101010101i64
* ((((v24 - ((v24 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v24 - ((v24 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
+ ((((v24 - ((v24 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v24 - ((v24 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
}
v27 = *((_WORD *)v3 + 2);
*(_QWORD *)&v56 = 0i64;
LOWORD(v57) = v27;
*((_QWORD *)&v56 + 1) = v24;
while( !(unsigned int)KeEnumerateNextProcessor(&v75, (unsigned __int16 **)&v56) && (unsigned int)v17 < v15 )
{
KeGetPrcb((unsigned int)v75);
v29 = *(_QWORD *)(v28 + 200);
if( (v29 & v14) == 0 )
{
if( (unsigned __int8)PpmParkGranularity > 1u )
v29 = *(_QWORD *)(v28 + 33880);
v11 |= 0x10u;
v54 |= v29;
a11 = v11;
v17 = (0x101010101010101i64
* ((((v54 - ((v54 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v54 - ((v54 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
+ ((((v54 - ((v54 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v54 - ((v54 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
}
}
}
LOWORD(v57) = *((_WORD *)v3 + 2);
v30 = a2 & v62 & v3[5];
*(_QWORD *)&v56 = 0i64;
v31 = v54;
*((_QWORD *)&v56 + 1) = v30;
while( !(unsigned int)KeEnumerateNextProcessor(&v75, (unsigned __int16 **)&v56) && (unsigned int)v17 < v15 )
{
KeGetPrcb((unsigned int)v75);
v33 = *(_QWORD *)(v32 + 200);
if( (v33 & v14) == 0 )
{
if( (unsigned __int8)PpmParkGranularity > 1u )
v33 = *(_QWORD *)(v32 + 33880);
v11 |= 0x20000u;
a11 = v11;
v31 |= v33;
v17 = (0x101010101010101i64
* ((((v31 - ((v31 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v31 - ((v31 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
+ ((((v31 - ((v31 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
+ (((v31 - ((v31 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
}
}
v34 = v64;
v35 = IsolatedCores;
v55 = v31;
v3 = a1;
v36 = *((unsigned __int8 *)a1 + v64 + 130);
if( (unsigned int)v17 < v36 && (unsigned int)v17 < v15 )
{
v11 |= 4u;
a11 = v11;
if( v36 >= v15 )
v36 = v15;
LODWORD(v17) = v36;
}
v37 = *((unsigned __int8 *)a1 + v64 + 132);
v38 = v15;
if( v15 > v37 && (unsigned int)v17 < v15 )
{
v11 |= 8u;
v38 = *((unsigned __int8 *)a1 + v64 + 132);
a11 = v11;
if( v37 <= (unsigned int)v17 )
v38 = v17;
}
if( PpmPerfMaxOverrideEnabled )
{
v39 = *((unsigned __int8 *)a1 + v64 + 128);
v11 |= 0x40000u;
}
else
{
if( (_DWORD)ProcessorNumber || !*((_BYTE *)a1 + 139) )
{
v40 = *((unsigned __int8 *)a1 + v64 + 138);
v41 = *((unsigned __int8 *)a1 + v64 + 128);
if( (unsigned __int8)v40 >= (unsigned __int8)v41 )
v40 = *((unsigned __int8 *)a1 + v64 + 128);
v39 = v40;
if( PpmCheckLatencyBoostActive
&& (v41 * (unsigned int)*(unsigned __int8 *)(v69 + v64 + 119) + 50) / 0x64 > v40 )
{
v11 |= 0x40u;
v39 = (v41 * (unsigned int)*(unsigned __int8 *)(v69 + v64 + 119) + 50) / 0x64;
a11 = v11;
}
if( (unsigned __int8)PpmParkGranularity > 1u )
v39 = (unsigned __int8)PpmParkGranularity
- 1
+ v39
- ((unsigned __int8)PpmParkGranularity - 1 + v39) % (unsigned __int8)PpmParkGranularity;
goto LABEL_75;
}
v39 = *((unsigned __int8 *)a1 + 128);
v11 |= 0x80u;
}
a11 = v11;
LABEL_75:
v42 = v39 + v66;
*((_BYTE *)a1 + v64 + 138) = v39;
v43 = v17;
if( v42 >= v38 )
v42 = v38;
if( v42 > (unsigned int)v17 )
v43 = v42;
v78 -= v38;
v44 = PpmParkSoftParkingEnabled == 0;
*((_BYTE *)v3 + v34 + 143) = v43;
if( v44 )
{
v38 = v43;
a11 = v11 | 0x200000;
}
v45 = OsUnpark;
v46 = a2 & v62;
LODWORD(a6) = v38;
LODWORD(UnparkCount) = v43;
PpmParkComputeUnparkMask(
*((_WORD *)v3 + 2),
a2,
a2 & v3[5],
a2 & v62,
UnparkCount,
a6,
OsUnpark,
v55,
&a9,
&a10,
&a11);
v47 = ~a2;
LOBYTE(v48) = v43;
v49 = a9 | a10 | v3[4] & ~a2;
v3[4] = v49;
v3[6] = a10 | v47 & v49;
PlatformPark = v46;
LODWORD(v46) = ProcessorNumber;
PpmEventTraceSoftCoreParkingSelection(
v3,
(unsigned int)ProcessorNumber,
v48,
v38,
v17,
v45,
v55,
PlatformPark,
v35,
a11);
v8 = v68 + 1;
v5 = v78;
v9 = v64 + 1;
LODWORD(ProcessorNumber) = v46 + 1;
++v64;
++v68;
}
while( (unsigned int)(v46 + 1) < 2 );
v1 = v59;
v2 = v61;
LABEL_83:
v59 = ++v1;
}
while( v1 < (unsigned int)PpmParkNumNodes );
LABEL_84:
PpmParkComputeDiff();
if( PpmParkLpiEngaged != (PpmParkLpiCap != 0) || (result = 0i64, *(_DWORD *)PpmParkLpiCapChanged) )
result = 1i64;
PpmParkLpiEngaged = PpmParkLpiCap != 0;
*(_DWORD *)PpmParkLpiCapChanged = 0;
if( (_DWORD)result )
PpmEventLPICoreParking(v50);
LABEL_2:
LOBYTE(result) = 1;
return result;
}Referenced by:
No references.