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