HvlpDiscoverTopologyAmd

VOID __stdcall HvlpDiscoverTopologyAmd(UINT64 LpIndex, UINT64 ApicId, UINT64 *PackageId, UINT64 *CoreId){
  unsigned int v6; 
  unsigned int v7; 
  unsigned int v8; 
  unsigned int v9; 
  unsigned int v10; 
  int v11; 
  _CPU_INFO CpuInfo; 

  v6 = ApicId;
  v7 = 1;
  CpuInfo = 0i64;
  v8 = 1;
  v9 = LpIndex;
  HvlpLpCpuid(LpIndex, 0x80000000ui64, 0i64, &CpuInfo);
  v10 = CpuInfo.AsUINT32[0];
  if( CpuInfo.AsUINT32[0] >= 0x80000008 )
  {
    HvlpLpCpuid(v9, 0x80000008ui64, 0i64, &CpuInfo);
    LOWORD(v11) = LOWORD(CpuInfo._Ecx) >> 12;
    if( !(LOWORD(CpuInfo._Ecx) >> 12) )
      _BitScanReverse((unsigned int *)&v11, 2 * LOBYTE(CpuInfo._Ecx) + 1);
    v8 = 1 << v11;
    if( v10 >= 0x8000001E )
    {
      HvlpLpCpuid(v9, 0x80000001ui64, 0i64, &CpuInfo);
      if( (CpuInfo.AsUINT32[2] & 0x400000) != 0 )
      {
        HvlpLpCpuid(v9, 0x8000001Eui64, 0i64, &CpuInfo);
        v7 = BYTE1(CpuInfo._Ebx) + 1;
        v8 /= v7;
      }
    }
  }
  *(_DWORD *)PackageId = v6 / (v8 * v7);
  *(_DWORD *)CoreId = v6 / v7;
}

Referenced by:

HvlpDiscoverTopologyWorker