KiSelectIdleProcessor

_KPRCB *__stdcall KiSelectIdleProcessor(
        UINT64 AffinityMask,
        _KPRCB *CurrentPrcb,
        _KNODE *PreferredNode,
        _KPRCB *PreferredPrcb){
  _KPRCB *v5; 
  UINT64 v9; 
  __int64 v10; 
  char v11; 
  int v12; 
  unsigned __int64 IdleNonParkedCpuSet; 
  UINT64 v14; 
  UINT64 v15; 
  unsigned __int8 GroupIndex; 
  unsigned __int64 v17; 
  UINT64 IdleCandidateSet[4]; 
  char v20; 
  char v21; 

  v5 = 0i64;
  if( PreferredPrcb )
  {
LABEL_4:
    IdleNonParkedCpuSet = PreferredNode->IdleNonParkedCpuSet;
    v14 = AffinityMask & PreferredNode->IdleNonParkedCpuSet;
    v15 = v14;
    IdleCandidateSet[0] = v14;
    if( v21 )
    {
      if( v14 )
      {
LABEL_6:
        if( (PreferredNode->Flags._bf_0 & 0x20) == 0 )
          goto LABEL_15;
        if( v20 && KiFindRankBiasedIdleSmtSet((__int64)PreferredPrcb, IdleCandidateSet) )
        {
LABEL_12:
          v14 = IdleCandidateSet[0];
          goto LABEL_15;
        }
        v14 = IdleCandidateSet[0];
        if( (IdleCandidateSet[0] & PreferredNode->IdleSmtSet) != 0 )
        {
          if( !v20
            || (unsigned int)((0x101010101010101i64
                             * ((((IdleNonParkedCpuSet - ((IdleNonParkedCpuSet >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
                               + (((IdleNonParkedCpuSet - ((IdleNonParkedCpuSet >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
                               + ((((IdleNonParkedCpuSet - ((IdleNonParkedCpuSet >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
                                 + (((IdleNonParkedCpuSet - ((IdleNonParkedCpuSet >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24 >= KiPerfIsoEnabled )
          {
            v14 = IdleCandidateSet[0] & PreferredNode->IdleSmtSet;
LABEL_15:
            if( (v14 & PreferredPrcb->GroupSetMember) != 0 )
            {
              return PreferredPrcb;
            }
            else
            {
              if( (v14 & PreferredPrcb->CoreProcessorSet) != 0 )
              {
                v14 &= PreferredPrcb->CoreProcessorSet;
              }
              else if( (KiCacheAwareScheduling & 1) != 0 && (v14 & PreferredPrcb->LLCMask) != 0 )
              {
                v14 &= PreferredPrcb->LLCMask;
              }
              GroupIndex = PreferredPrcb->GroupIndex;
              _BitScanForward64(&v17, __ROR8__(v14, GroupIndex));
              return *(&KiProcessorBlock
                     + (unsigned int)KiProcessorNumberToIndexMappingTable[64 * PreferredPrcb->Group
                                                                        + (((unsigned __int8)v17 + GroupIndex) & 0x3F)]);
            }
          }
        }
        else if( !v20 )
        {
          if( CurrentPrcb->ParentNode != PreferredNode )
            goto LABEL_15;
          KiReduceByEffectiveIdleSmtSet(CurrentPrcb, IdleCandidateSet);
          goto LABEL_12;
        }
        return v5;
      }
      IdleNonParkedCpuSet = PreferredNode->IdleCpuSet & PreferredNode->SoftParkedSet;
      v14 = AffinityMask & IdleNonParkedCpuSet;
      IdleCandidateSet[0] = AffinityMask & IdleNonParkedCpuSet;
      v15 = AffinityMask & IdleNonParkedCpuSet;
    }
    if( !v15 )
      return v5;
    goto LABEL_6;
  }
  v9 = AffinityMask & PreferredNode->Affinity.Mask;
  if( v9 )
  {
    v10 = (__int64)*(&KiProcessorBlock + PreferredNode->ThreadSeed);
    v11 = *(_BYTE *)(v10 + 209);
    v12 = *(unsigned __int8 *)(v10 + 208);
    _BitScanForward64((unsigned __int64 *)&v10, __ROR8__(v9, v11));
    PreferredPrcb = *(&KiProcessorBlock
                    + (unsigned int)KiProcessorNumberToIndexMappingTable[64 * v12 + (((_BYTE)v10 + v11) & 0x3F)]);
    goto LABEL_4;
  }
  return 0i64;
}

Referenced by:

KiChooseTargetProcessor