summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2011-03-10 23:06:13 +0000
committerjkim <jkim@FreeBSD.org>2011-03-10 23:06:13 +0000
commita52b39f6a4183beb419e150a1884e73d7b499f5f (patch)
treef7d32c4db2168ad1759d1427f37d94b77c32f173
parent675238071fad7df825f65449f42752e44361faa4 (diff)
downloadFreeBSD-src-a52b39f6a4183beb419e150a1884e73d7b499f5f.zip
FreeBSD-src-a52b39f6a4183beb419e150a1884e73d7b499f5f.tar.gz
Turn off pointless P-state invariant TSC detection based on CPU model
on a virtual machine.
-rw-r--r--sys/x86/x86/tsc.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/sys/x86/x86/tsc.c b/sys/x86/x86/tsc.c
index 052535b..3e0300b 100644
--- a/sys/x86/x86/tsc.c
+++ b/sys/x86/x86/tsc.c
@@ -105,20 +105,23 @@ init_TSC(void)
switch (cpu_vendor_id) {
case CPU_VENDOR_AMD:
- if ((amd_pminfo & AMDPM_TSC_INVARIANT) ||
- CPUID_TO_FAMILY(cpu_id) >= 0x10)
+ if ((amd_pminfo & AMDPM_TSC_INVARIANT) != 0 ||
+ (vm_guest == VM_GUEST_NO &&
+ CPUID_TO_FAMILY(cpu_id) >= 0x10))
tsc_is_invariant = 1;
break;
case CPU_VENDOR_INTEL:
- if ((amd_pminfo & AMDPM_TSC_INVARIANT) ||
- (CPUID_TO_FAMILY(cpu_id) == 0x6 &&
+ if ((amd_pminfo & AMDPM_TSC_INVARIANT) != 0 ||
+ (vm_guest == VM_GUEST_NO &&
+ ((CPUID_TO_FAMILY(cpu_id) == 0x6 &&
CPUID_TO_MODEL(cpu_id) >= 0xe) ||
(CPUID_TO_FAMILY(cpu_id) == 0xf &&
- CPUID_TO_MODEL(cpu_id) >= 0x3))
+ CPUID_TO_MODEL(cpu_id) >= 0x3))))
tsc_is_invariant = 1;
break;
case CPU_VENDOR_CENTAUR:
- if (CPUID_TO_FAMILY(cpu_id) == 0x6 &&
+ if (vm_guest == VM_GUEST_NO &&
+ CPUID_TO_FAMILY(cpu_id) == 0x6 &&
CPUID_TO_MODEL(cpu_id) >= 0xf &&
(rdmsr(0x1203) & 0x100000000ULL) == 0)
tsc_is_invariant = 1;
OpenPOWER on IntegriCloud