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:
Jung-uk Kim 2011-04-14 17:50:26 +00:00
parent 9289984d4b
commit 0e78005e5c

View File

@ -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) {