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.