Commit 048c9516 authored by Paolo Bonzini's avatar Paolo Bonzini
Browse files

target/i386: work around KVM_GET_MSRS bug for secondary execution controls



Some secondary controls are automatically enabled/disabled based on the CPUID
values that are set for the guest.  However, they are still available at a
global level and therefore should be present when KVM_GET_MSRS is sent to
/dev/kvm.

Unfortunately KVM forgot to include those, so fix that.

Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 20a78b02
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -479,6 +479,23 @@ uint64_t kvm_arch_get_supported_msr_feature(KVMState *s, uint32_t index)
    value = msr_data.entries[0].data;
    switch (index) {
    case MSR_IA32_VMX_PROCBASED_CTLS2:
        /* KVM forgot to add these bits for some time, do this ourselves.  */
        if (kvm_arch_get_supported_cpuid(s, 0xD, 1, R_ECX) & CPUID_XSAVE_XSAVES) {
            value |= (uint64_t)VMX_SECONDARY_EXEC_XSAVES << 32;
        }
        if (kvm_arch_get_supported_cpuid(s, 1, 0, R_ECX) & CPUID_EXT_RDRAND) {
            value |= (uint64_t)VMX_SECONDARY_EXEC_RDRAND_EXITING << 32;
        }
        if (kvm_arch_get_supported_cpuid(s, 7, 0, R_EBX) & CPUID_7_0_EBX_INVPCID) {
            value |= (uint64_t)VMX_SECONDARY_EXEC_ENABLE_INVPCID << 32;
        }
        if (kvm_arch_get_supported_cpuid(s, 7, 0, R_EBX) & CPUID_7_0_EBX_RDSEED) {
            value |= (uint64_t)VMX_SECONDARY_EXEC_RDSEED_EXITING << 32;
        }
        if (kvm_arch_get_supported_cpuid(s, 0x80000001, 0, R_EDX) & CPUID_EXT2_RDTSCP) {
            value |= (uint64_t)VMX_SECONDARY_EXEC_RDTSCP << 32;
        }
        /* fall through */
    case MSR_IA32_VMX_TRUE_PINBASED_CTLS:
    case MSR_IA32_VMX_TRUE_PROCBASED_CTLS:
    case MSR_IA32_VMX_TRUE_ENTRY_CTLS: