Work around an emulator problem where virtual CPU advertises TSC is P-state
invariant and APERF/MPERF MSRs exist but these MSRs never tick. When we calculate effective frequency from cpu_est_clockrate(), it caused panic of division-by-zero. Now we test whether these MSRs actually increase to avoid such foot-shooting. Reported by: dim Tested by: dim
This commit is contained in:
parent
9289984d4b
commit
0e78005e5c
@ -183,8 +183,18 @@ probe_tsc_freq(void)
|
||||
|
||||
if (cpu_high >= 6) {
|
||||
do_cpuid(6, regs);
|
||||
if ((regs[2] & CPUID_PERF_STAT) != 0)
|
||||
tsc_perf_stat = 1;
|
||||
if ((regs[2] & CPUID_PERF_STAT) != 0) {
|
||||
/*
|
||||
* XXX Some emulators expose host CPUID without actual
|
||||
* support for these MSRs. We must test whether they
|
||||
* really work.
|
||||
*/
|
||||
wrmsr(MSR_MPERF, 0);
|
||||
wrmsr(MSR_APERF, 0);
|
||||
DELAY(10);
|
||||
if (rdmsr(MSR_MPERF) > 0 && rdmsr(MSR_APERF) > 0)
|
||||
tsc_perf_stat = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (tsc_skip_calibration) {
|
||||
|
Loading…
Reference in New Issue
Block a user