HvlpDiscoverTopologyIntel
VOID __stdcall HvlpDiscoverTopologyIntel(UINT64 LpIndex, UINT64 ApicId, UINT64 *PackageId, UINT64 *CoreId){
unsigned int v6;
unsigned int v7;
unsigned int v8;
unsigned int v9;
unsigned __int8 v10;
unsigned int v11;
unsigned __int8 v12;
UINT64 a4[2];
*(_DWORD *)CoreId = ApicId;
*(_DWORD *)PackageId = ApicId;
v6 = LpIndex;
*(_OWORD *)a4 = 0i64;
HvlpLpCpuid(LpIndex, 0i64, 0i64, a4);
v7 = a4[0];
if( LODWORD(a4[0]) >= 0xB && (HvlpLpCpuid(v6, 11i64, 0i64, a4), HIDWORD(a4[0])) )
{
v8 = 0;
do
{
HvlpLpCpuid(v6, 11i64, v8++, a4);
if( LODWORD(a4[1]) >> 8 == 1 )
{
*(_DWORD *)CoreId >>= a4[0] & 0x1F;
}
else if( LODWORD(a4[1]) >> 8 == 2 )
{
*(_DWORD *)PackageId >>= a4[0] & 0x1F;
}
}
while( WORD2(a4[0]) );
}
else
{
if( v7 < 4 )
{
v10 = 1;
}
else
{
HvlpLpCpuid(v6, 4i64, 0i64, a4);
_BitScanReverse(&v9, 2 * (LODWORD(a4[0]) >> 26) + 1);
v10 = 1 << v9;
}
HvlpLpCpuid(v6, 1i64, 0i64, a4);
if( (a4[1] & 0x1000000000000000i64) != 0 )
{
_BitScanReverse(&v11, 2 * BYTE6(a4[0]) - 1);
v12 = 1 << v11;
}
else
{
v12 = v10;
}
*(_DWORD *)CoreId /= (unsigned int)(unsigned __int8)(v12 / v10);
*(_DWORD *)PackageId /= (unsigned int)v12;
}
}Referenced by:
HvlpDiscoverTopologyWorker