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