diff options
author | jkim <jkim@FreeBSD.org> | 2011-03-10 23:06:13 +0000 |
---|---|---|
committer | jkim <jkim@FreeBSD.org> | 2011-03-10 23:06:13 +0000 |
commit | a52b39f6a4183beb419e150a1884e73d7b499f5f (patch) | |
tree | f7d32c4db2168ad1759d1427f37d94b77c32f173 | |
parent | 675238071fad7df825f65449f42752e44361faa4 (diff) | |
download | FreeBSD-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.c | 15 |
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; |