Add explicit detection of KVM hypervisor
Set vm_guest to a new enum value (VM_GUEST_KVM) when kvm is detected and use vm_guest in conditionals testing for KVM. Also, fix a conditional checking if we're running in a VM which caught only the generic VM case, but not more specific VMs (KVM, VMWare, etc.). (Spotted by: vangyzen). Differential revision: https://reviews.freebsd.org/D7172 Sponsored by: Dell Inc. Approved by: kib (mentor), vangyzen (mentor) Reviewed by: alc MFC after: 4 weeks
This commit is contained in:
parent
5a1456e79e
commit
5908cb719e
@ -1224,7 +1224,7 @@ pmap_init(void)
|
||||
* include at least one feature that is only supported by older Intel
|
||||
* or newer AMD processors.
|
||||
*/
|
||||
if (vm_guest == VM_GUEST_VM && (cpu_feature & CPUID_SS) == 0 &&
|
||||
if (vm_guest != VM_GUEST_NO && (cpu_feature & CPUID_SS) == 0 &&
|
||||
(cpu_feature2 & (CPUID2_SSSE3 | CPUID2_SSE41 | CPUID2_AESNI |
|
||||
CPUID2_AVX | CPUID2_XSAVE)) == 0 && (amd_feature2 & (AMDID2_XOP |
|
||||
AMDID2_FMA4)) == 0)
|
||||
|
@ -794,7 +794,7 @@ pmap_init(void)
|
||||
* include at least one feature that is only supported by older Intel
|
||||
* or newer AMD processors.
|
||||
*/
|
||||
if (vm_guest == VM_GUEST_VM && (cpu_feature & CPUID_SS) == 0 &&
|
||||
if (vm_guest != VM_GUEST_NO && (cpu_feature & CPUID_SS) == 0 &&
|
||||
(cpu_feature2 & (CPUID2_SSSE3 | CPUID2_SSE41 | CPUID2_AESNI |
|
||||
CPUID2_AVX | CPUID2_XSAVE)) == 0 && (amd_feature2 & (AMDID2_XOP |
|
||||
AMDID2_FMA4)) == 0)
|
||||
|
@ -148,6 +148,7 @@ static const char *const vm_guest_sysctl_names[] = {
|
||||
"xen",
|
||||
"hv",
|
||||
"vmware",
|
||||
"kvm",
|
||||
NULL
|
||||
};
|
||||
CTASSERT(nitems(vm_guest_sysctl_names) - 1 == VM_LAST);
|
||||
|
@ -74,7 +74,7 @@ extern int vm_guest; /* Running as virtual machine guest? */
|
||||
* Keep in sync with vm_guest_sysctl_names[].
|
||||
*/
|
||||
enum VM_GUEST { VM_GUEST_NO = 0, VM_GUEST_VM, VM_GUEST_XEN, VM_GUEST_HV,
|
||||
VM_GUEST_VMWARE, VM_LAST };
|
||||
VM_GUEST_VMWARE, VM_GUEST_KVM, VM_LAST };
|
||||
|
||||
#if defined(WITNESS) || defined(INVARIANT_SUPPORT)
|
||||
void kassert_panic(const char *fmt, ...) __printflike(1, 2);
|
||||
|
@ -1300,6 +1300,8 @@ identify_hypervisor(void)
|
||||
vm_guest = VM_GUEST_VMWARE;
|
||||
else if (strcmp(hv_vendor, "Microsoft Hv") == 0)
|
||||
vm_guest = VM_GUEST_HV;
|
||||
else if (strcmp(hv_vendor, "KVMKVMKVM") == 0)
|
||||
vm_guest = VM_GUEST_KVM;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -499,8 +499,7 @@ native_lapic_init(vm_paddr_t addr)
|
||||
ver = lapic_read32(LAPIC_VERSION);
|
||||
if ((ver & APIC_VER_EOI_SUPPRESSION) != 0) {
|
||||
lapic_eoi_suppression = 1;
|
||||
if (vm_guest == VM_GUEST_VM &&
|
||||
!strcmp(hv_vendor, "KVMKVMKVM")) {
|
||||
if (vm_guest == VM_GUEST_KVM) {
|
||||
if (bootverbose)
|
||||
printf(
|
||||
"KVM -- disabling lapic eoi suppression\n");
|
||||
|
Loading…
Reference in New Issue
Block a user