Apply fix to un-cripple max cpu id on BSP earlier.

We need to know actual value for the standard extended features before
ifuncs are resolved.

Reported and tested by:	madpilot
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
This commit is contained in:
kib 2018-11-12 19:17:26 +00:00
parent f3e91215c4
commit 47d30bf79e
3 changed files with 16 additions and 6 deletions

View File

@ -1581,6 +1581,7 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
identify_cpu1();
identify_hypervisor();
identify_cpu_fixup_bsp();
identify_cpu2();
initializecpucache();

View File

@ -129,6 +129,7 @@ void dump_drop_page(vm_paddr_t);
void finishidentcpu(void);
void identify_cpu1(void);
void identify_cpu2(void);
void identify_cpu_fixup_bsp(void);
void identify_hypervisor(void);
void initializecpu(void);
void initializecpucache(void);

View File

@ -1467,6 +1467,19 @@ identify_cpu2(void)
}
}
void
identify_cpu_fixup_bsp(void)
{
u_int regs[4];
cpu_vendor_id = find_cpu_vendor_id();
if (fix_cpuid()) {
do_cpuid(0, regs);
cpu_high = regs[0];
}
}
/*
* Final stage of CPU identification.
*/
@ -1478,12 +1491,7 @@ finishidentcpu(void)
u_char ccr3;
#endif
cpu_vendor_id = find_cpu_vendor_id();
if (fix_cpuid()) {
do_cpuid(0, regs);
cpu_high = regs[0];
}
identify_cpu_fixup_bsp();
if (cpu_high >= 5 && (cpu_feature2 & CPUID2_MON) != 0) {
do_cpuid(5, regs);