ensure that initial local apic id is sane on AMD 10h systems

Summary:
The Initial Local APIC ID is returned by CPUID function 1 (in EBX).
On AMD Family 10h systems the way that ID is built is controlled by
an MSR bit (InitApicIdCpuIdLo).  BKDG instructs BIOS to set it in a
certain way, but a BIOS can be buggy.  In that case the ID can confuse
tools that use it, e.g. hwloc.
For example, on a system that I own real Local APIC IDs are configured
as 0, 1, 2, 3, but IDs reported via CPUID.1 are 0, 0x40, 0x80, 0xc0.
See: https://github.com/open-mpi/hwloc/issues/183

Reviewed by:	kib
MFC after:	2 weeks
Differential Revision: https://reviews.freebsd.org/D6060
This commit is contained in:
Andriy Gapon 2016-04-28 08:29:57 +00:00
parent 341134426f
commit e5e4452078

View File

@ -80,6 +80,19 @@ init_amd(void)
wrmsr(0xc0011029, rdmsr(0xc0011029) | 1);
break;
}
/*
* BIOS may fail to set InitApicIdCpuIdLo to 1 as it should per BKDG.
* So, do it here or otherwise some tools could be confused by
* Initial Local APIC ID reported with CPUID Function 1 in EBX.
*/
if (CPUID_TO_FAMILY(cpu_id) == 0x10) {
if ((cpu_feature2 & CPUID2_HV) == 0) {
msr = rdmsr(MSR_NB_CFG1);
msr |= (uint64_t)1 << 54;
wrmsr(MSR_NB_CFG1, msr);
}
}
}
/*