KVM: x86: skip host CPUID call for hypervisor leaves
authorPaolo Bonzini <pbonzini@redhat.com>
Thu, 28 Oct 2021 17:15:55 +0000 (13:15 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 10 Feb 2022 18:47:16 +0000 (13:47 -0500)
Hypervisor leaves are always synthesized by __do_cpuid_func; just return
zeroes and do not ask the host.  Even on nested virtualization, a value
from another hypervisor would be bogus, because all hypercalls and MSRs
are processed by KVM.

Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/cpuid.c

index 494d4d3..ff756cd 100644 (file)
@@ -712,9 +712,17 @@ static struct kvm_cpuid_entry2 *do_host_cpuid(struct kvm_cpuid_array *array,
 
        entry = &array->entries[array->nent++];
 
+       memset(entry, 0, sizeof(*entry));
        entry->function = function;
        entry->index = index;
-       entry->flags = 0;
+       switch (function & 0xC0000000) {
+       case 0x40000000:
+               /* Hypervisor leaves are always synthesized by __do_cpuid_func.  */
+               return entry;
+
+       default:
+               break;
+       }
 
        cpuid_count(entry->function, entry->index,
                    &entry->eax, &entry->ebx, &entry->ecx, &entry->edx);