PpmPerfSelectProcessorState
VOID __stdcall PpmPerfSelectProcessorState(_KPRCB *Prcb){
_ETHREAD *CurrentThread;
int v2;
unsigned __int8 v3;
__int64 v5;
_ETHREAD *NextThread;
_PPM_ENGINE_SETTINGS *v7;
char v8;
bool v9;
unsigned int PerfBoostMode;
_BOOL8 v11;
unsigned int v12;
char v13;
unsigned __int8 v14;
unsigned int v15;
unsigned int v16;
unsigned int v17;
unsigned int SListFaultAddress;
unsigned __int8 v19;
unsigned int RspBase;
unsigned int StackBase;
unsigned int v22;
unsigned int v23;
int v24;
int v25;
unsigned int v26;
bool v27;
unsigned int v28;
unsigned int v29;
unsigned int v30;
ULONG ActivityId;
const _EVENT_DESCRIPTOR *v32;
REGHANDLE v33;
__int64 v34;
UINT64 Keyword;
unsigned __int8 v36;
unsigned int v37;
unsigned int v38;
char v39;
unsigned int v40;
bool v41;
bool v42;
char v43;
char v44;
unsigned int v45;
int v46;
char v47;
unsigned __int8 v48;
unsigned int v49;
int v50;
unsigned int v51;
unsigned int v52;
unsigned int v53;
unsigned int v54;
__int64 v55;
__int64 v56;
_EVENT_DATA_DESCRIPTOR UserData;
unsigned int *v58;
__int64 v59;
unsigned int *v60;
__int64 v61;
unsigned int *v62;
__int64 v63;
__int64 *v64;
__int64 v65;
CurrentThread = Prcb->CurrentThread;
v2 = 0;
v3 = PpmMfBufferingThreshold;
v5 = *(_QWORD *)&Prcb->_MxCsr;
NextThread = Prcb->NextThread;
v56 = *(_QWORD *)&CurrentThread->Tcb.gap0[8];
v46 = 0;
v51 = 0;
v50 = 1;
if( (unsigned int)PpmMfBufferingThreshold > 0x64 )
v3 = 100;
v7 = (_PPM_ENGINE_SETTINGS *)(2736i64 * *(&stru_140C23628 + 441) + *(&stru_140C00F40 + 365) + 40i64);
if( NextThread
&& *(&stru_140C00F40 + 365) == PpmLowPowerProfile
&& *(&stru_140C23628 + 1828)
&& NextThread->Tcb.WaitBlockFill4[9] < v3 )
{
v2 = 4096;
v7 = &PpmDefaultProfile.Settings[*(&stru_140C23628 + 441)];
v46 = 4096;
}
if( (unsigned __int8)PpmHeteroNominalPerformanceClasses > 1u )
{
if( *(_QWORD *)&Prcb->_MxCsr )
{
v8 = *(_BYTE *)(*(_QWORD *)&Prcb->_MxCsr + 205i64);
goto LABEL_8;
}
}
else if( BYTE4(Prcb->PriorityState) )
{
v8 = Prcb->HalReserved[1];
LABEL_8:
v9 = v8 != 0;
goto LABEL_9;
}
v9 = 0;
LABEL_9:
PerfBoostMode = v7->PerfBoostMode;
v11 = v9;
v55 = v9;
v12 = v7->PerfDecreaseThreshold[v9];
v13 = v7->PerfDecreasePolicy[v9];
v14 = v7->ParkingPerfState[v9];
v54 = v7->PerfDecreaseTime[v9];
v53 = v7->PerfIncreaseTime[v9];
v48 = v7->PerfIncreasePolicy[v9];
v47 = v13;
v52 = v7->PerfIncreaseThreshold[v9];
v49 = v12;
v15 = (v12 + v52) >> 1;
if( !NextThread )
goto LABEL_12;
v16 = v7->ResponsivenessEnableThreshold[v9];
v17 = v7->ResponsivenessDisableThreshold[v11];
if( v16 == v17 )
{
BYTE4(CurrentThread->Tcb.StackBase) = 0;
goto LABEL_12;
}
v39 = BYTE4(CurrentThread->Tcb.StackBase);
v40 = *(_DWORD *)&NextThread->Tcb.WaitBlockFill11[16];
if( v39 )
{
v41 = v40 <= v17;
v2 = v46;
if( v41 )
{
++BYTE5(CurrentThread->Tcb.StackBase);
v2 = v46 | 0x80000;
v46 |= 0x80000u;
if( BYTE5(CurrentThread->Tcb.StackBase) >= v7->ResponsivenessDisableTime[v11] )
{
WORD2(CurrentThread->Tcb.StackBase) = 0;
v39 = 0;
}
goto LABEL_78;
}
}
else
{
v27 = v40 < v16;
v2 = v46;
if( !v27 )
{
++BYTE5(CurrentThread->Tcb.StackBase);
v2 = v46 | 0x100000;
v46 |= 0x100000u;
if( BYTE5(CurrentThread->Tcb.StackBase) >= v7->ResponsivenessEnableTime[v11] )
{
WORD2(CurrentThread->Tcb.StackBase) = 1;
v39 = 1;
}
goto LABEL_78;
}
}
BYTE5(CurrentThread->Tcb.StackBase) = 0;
LABEL_78:
v42 = v39 == 0;
v13 = v47;
if( !v42 )
{
v2 |= 0x200000u;
v46 = v2;
}
LABEL_12:
if( ((PerfBoostMode - 1) & 0xFFFFFFFD) != 0 )
{
if( PerfBoostMode - 5 <= 1 || PpmPerfBoostAtGuaranteed )
SListFaultAddress = (unsigned int)CurrentThread->Tcb.SListFaultAddress;
else
SListFaultAddress = 100;
}
else
{
SListFaultAddress = *(_DWORD *)(v5 + 320);
}
if( !*(_BYTE *)(v5 + 360) )
{
StackBase = SListFaultAddress;
v24 = v2 | 0x40000;
v25 = v50;
goto LABEL_35;
}
if( BYTE4(Prcb->PriorityState) && BYTE4(Prcb->HalReserved[1]) && v14 )
{
StackBase = SListFaultAddress;
v24 = v2 | 1;
v25 = 1;
if( v14 == 1 )
StackBase = 1;
goto LABEL_35;
}
v19 = PpmPerfIdealAggressiveIncreaseThreshold;
if( (unsigned __int8)PpmPerfIdealAggressiveIncreaseThreshold > 0x64u )
v19 = 100;
if( !(_BYTE)v15 )
{
v43 = v48;
if( !v48 )
v43 = 2;
v48 = v43;
v44 = v13;
if( !v13 )
v44 = 2;
v47 = v44;
}
RspBase = Prcb->RspBase;
StackBase = (unsigned int)CurrentThread->Tcb.StackBase;
if( PpmPerfCalculateActualUtilization )
{
v51 = RspBase / HIWORD(Prcb->PrcbLock);
v22 = v51;
if( PpmPerfCalculateActualUtilization == 2 )
StackBase = CurrentThread->Tcb.CycleTime;
}
else
{
v22 = RspBase / StackBase;
v51 = RspBase / StackBase;
}
v23 = StackBase;
if( v22 > v52 )
{
if( StackBase < SListFaultAddress )
{
if( v48 == 2 )
{
v24 = v46 | 0x40;
}
else
{
if( v48 )
{
if( v48 == 1 )
{
StackBase += PpmPerfSingleStepSize;
v24 = v46 | 0x20;
}
else if( v48 == 3 )
{
if( v22 < v19 )
v45 = RspBase / (unsigned __int8)v15;
else
v45 = RspBase / v49;
StackBase = v45;
v24 = v46 | 0x80;
}
else
{
v24 = v46;
}
}
else
{
v38 = RspBase / (unsigned __int8)v15;
v24 = v46 | 0x10;
StackBase = v38;
}
if( StackBase < SListFaultAddress )
goto LABEL_28;
}
StackBase = SListFaultAddress;
LABEL_28:
v25 = v50;
goto LABEL_29;
}
LABEL_27:
v24 = v46;
goto LABEL_28;
}
if( v22 >= v49 || StackBase <= 1 )
goto LABEL_27;
v25 = 3;
if( v47 == 1 )
{
v24 = v46 | 0x200;
if( StackBase > PpmPerfSingleStepSize )
{
StackBase -= PpmPerfSingleStepSize;
goto LABEL_29;
}
LABEL_102:
StackBase = 1;
v24 |= 0x400u;
goto LABEL_29;
}
if( !v47 )
{
v37 = (unsigned __int8)v15;
v24 = v46 | 0x100;
StackBase = RspBase / v37;
goto LABEL_29;
}
v24 = v46;
if( v47 == 2 )
goto LABEL_102;
LABEL_29:
if( *(&PopIrpWorkerControlEvent + 313) == 5 )
goto LABEL_32;
v26 = *(_DWORD *)(v5 + 760);
v27 = StackBase < v23;
if( StackBase > v23 )
{
if( v26 < v53 )
{
LABEL_103:
v24 |= 0x800u;
StackBase = v23;
goto LABEL_32;
}
v27 = StackBase < v23;
}
if( v27 && v26 < v54 )
goto LABEL_103;
LABEL_32:
if( NextThread )
{
v28 = NextThread->Tcb.WaitBlockFill4[11];
if( (_BYTE)v28 )
{
v24 |= 0x10000u;
NextThread->Tcb.WaitBlockFill4[11] = 0;
if( StackBase <= v28 )
StackBase = v28;
}
v29 = NextThread->Tcb.WaitBlockFill4[12];
if( (_BYTE)v29 )
{
v24 |= 0x20000u;
NextThread->Tcb.WaitBlockFill4[12] = 0;
if( StackBase <= v29 )
StackBase = v29;
}
}
LABEL_35:
v30 = (*(__int64(__fastcall **)(__int64, _QWORD, _QWORD, _QWORD, unsigned int, unsigned int, int, _QWORD, _QWORD))(v5 + 280))(
v56,
StackBase,
*(unsigned int *)(v5 + 328),
SListFaultAddress,
v7->EnergyPerfPreference[v55],
v7->AutonomousActivityWindow,
v25,
0i64,
0i64);
ActivityId = 0;
LODWORD(CurrentThread->Tcb.StackBase) = v30;
v52 = v30;
LODWORD(v55) = v24;
v53 = StackBase;
v54 = v51;
v49 = 0;
if( BYTE4(Prcb->PriorityState) )
{
v32 = &PPM_ETW_PERF_SELECT_PROCESSOR_STATE;
LOWORD(v49) = LOBYTE(Prcb[-1].StaticAffinity.KeFlushTbDeepIdleAffinity.Bitmap[0]);
BYTE2(v49) = BYTE1(Prcb[-1].StaticAffinity.KeFlushTbDeepIdleAffinity.Bitmap[0]);
*(_QWORD *)&UserData.Size = 3i64;
}
else
{
v32 = (const _EVENT_DESCRIPTOR *)PPM_ETW_PERF_SELECT_PROCESSOR_STATE_HV;
v49 = *(_DWORD *)&Prcb->CurrentThread->Tcb.gap0[20];
*(_QWORD *)&UserData.Size = 4i64;
}
UserData.Ptr = (unsigned __int64)&v49;
if( PpmEtwRegistered )
{
v33 = PpmEtwHandle;
if( PpmEtwHandle )
{
if( (v34 = *(_QWORD *)(PpmEtwHandle + 32), Keyword = v32->Keyword, *(_DWORD *)(v34 + 96))
&& ((v36 = *(_BYTE *)(v34 + 100), v32->Level <= v36) || !v36)
&& ((*(_DWORD *)(v34 + 104) & 0x40) != 0 && !Keyword
|| (Keyword & *(_QWORD *)(v34 + 112)) != 0 && (*(_QWORD *)(v34 + 120) & Keyword) == *(_QWORD *)(v34 + 120))
|| *(_BYTE *)(PpmEtwHandle + 101)
&& EtwpLevelKeywordEnabled((_TRACE_ENABLE_INFO *)(*(_QWORD *)(PpmEtwHandle + 40) + 96i64), v32->Level, Keyword) )
{
v59 = 4i64;
v58 = &v54;
v61 = 4i64;
v60 = &v53;
v63 = 4i64;
v62 = &v52;
v65 = 4i64;
v64 = &v55;
EtwWriteEx(v33, v32, 0i64, ActivityId, ActivityId, ActivityId, 5u, &UserData);
}
}
}
}Referenced by:
PpmPerfSelectProcessorStates