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;
_CPU_INFO CpuInfo;
*(_DWORD *)CoreId = ApicId;
*(_DWORD *)PackageId = ApicId;
v6 = LpIndex;
CpuInfo = 0i64;
HvlpLpCpuid(LpIndex, 0i64, 0i64, &CpuInfo);
v7 = CpuInfo.AsUINT32[0];
if( CpuInfo.AsUINT32[0] >= 0xB && (HvlpLpCpuid(v6, 0xBui64, 0i64, &CpuInfo), CpuInfo.AsUINT32[1]) )
{
v8 = 0;
do
{
HvlpLpCpuid(v6, 0xBui64, v8++, &CpuInfo);
if( CpuInfo.AsUINT32[2] >> 8 == 1 )
{
*(_DWORD *)CoreId >>= CpuInfo.AsUINT32[0] & 0x1F;
}
else if( CpuInfo.AsUINT32[2] >> 8 == 2 )
{
*(_DWORD *)PackageId >>= CpuInfo.AsUINT32[0] & 0x1F;
}
}
while( LOWORD(CpuInfo._Ebx) );
}
else
{
if( v7 < 4 )
{
v10 = 1;
}
else
{
HvlpLpCpuid(v6, 4ui64, 0i64, &CpuInfo);
_BitScanReverse(&v9, 2 * (CpuInfo.AsUINT32[0] >> 26) + 1);
v10 = 1 << v9;
}
HvlpLpCpuid(v6, 1ui64, 0i64, &CpuInfo);
if( (CpuInfo.AsUINT32[3] & 0x10000000) != 0 )
{
_BitScanReverse(&v11, 2 * BYTE2(CpuInfo._Ebx) - 1);
v12 = 1 << v11;
}
else
{
v12 = v10;
}
*(_DWORD *)CoreId /= (unsigned int)(unsigned __int8)(v12 / v10);
*(_DWORD *)PackageId /= (unsigned int)v12;
}
}Referenced by:
HvlpDiscoverTopologyWorker