Blame SOURCES/kvm-target-i386-do-not-set-unsupported-VMX-secondary-exe.patch

22c213
From 77cdcccc49ba988e3b5bcb66decdee2e99fdcd72 Mon Sep 17 00:00:00 2001
22c213
From: Vitaly Kuznetsov <vkuznets@redhat.com>
22c213
Date: Tue, 14 Apr 2020 15:00:36 +0100
22c213
Subject: [PATCH] target/i386: do not set unsupported VMX secondary execution
22c213
 controls
22c213
22c213
RH-Author: Vitaly Kuznetsov <vkuznets@redhat.com>
22c213
Message-id: <20200414150036.625732-2-vkuznets@redhat.com>
22c213
Patchwork-id: 94674
22c213
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 1/1] target/i386: do not set unsupported VMX secondary execution controls
22c213
Bugzilla: 1822682
22c213
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
22c213
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
22c213
22c213
Commit 048c95163b4 ("target/i386: work around KVM_GET_MSRS bug for
22c213
secondary execution controls") added a workaround for KVM pre-dating
22c213
commit 6defc591846d ("KVM: nVMX: include conditional controls in /dev/kvm
22c213
KVM_GET_MSRS") which wasn't setting certain available controls. The
22c213
workaround uses generic CPUID feature bits to set missing VMX controls.
22c213
22c213
It was found that in some cases it is possible to observe hosts which
22c213
have certain CPUID features but lack the corresponding VMX control.
22c213
22c213
In particular, it was reported that Azure VMs have RDSEED but lack
22c213
VMX_SECONDARY_EXEC_RDSEED_EXITING; attempts to enable this feature
22c213
bit result in QEMU abort.
22c213
22c213
Resolve the issue but not applying the workaround when we don't have
22c213
to. As there is no good way to find out if KVM has the fix itself, use
22c213
95c5c7c77c ("KVM: nVMX: list VMX MSRs in KVM_GET_MSR_INDEX_LIST") instead
22c213
as these [are supposed to] come together.
22c213
22c213
Fixes: 048c95163b4 ("target/i386: work around KVM_GET_MSRS bug for secondary execution controls")
22c213
Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
22c213
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
22c213
Message-Id: <20200331162752.1209928-1-vkuznets@redhat.com>
22c213
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
22c213
(cherry picked from commit 4a910e1f6ab4155ec8b24c49b2585cc486916985)
22c213
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
22c213
---
22c213
 target/i386/kvm.c | 41 ++++++++++++++++++++++++++---------------
22c213
 1 file changed, 26 insertions(+), 15 deletions(-)
22c213
22c213
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
22c213
index 99840ca..fcc8f7d 100644
22c213
--- a/target/i386/kvm.c
22c213
+++ b/target/i386/kvm.c
22c213
@@ -106,6 +106,7 @@ static bool has_msr_arch_capabs;
22c213
 static bool has_msr_core_capabs;
22c213
 static bool has_msr_vmx_vmfunc;
22c213
 static bool has_msr_ucode_rev;
22c213
+static bool has_msr_vmx_procbased_ctls2;
22c213
 
22c213
 static uint32_t has_architectural_pmu_version;
22c213
 static uint32_t num_architectural_pmu_gp_counters;
22c213
@@ -490,21 +491,28 @@ uint64_t kvm_arch_get_supported_msr_feature(KVMState *s, uint32_t index)
22c213
     value = msr_data.entries[0].data;
22c213
     switch (index) {
22c213
     case MSR_IA32_VMX_PROCBASED_CTLS2:
22c213
-        /* KVM forgot to add these bits for some time, do this ourselves.  */
22c213
-        if (kvm_arch_get_supported_cpuid(s, 0xD, 1, R_ECX) & CPUID_XSAVE_XSAVES) {
22c213
-            value |= (uint64_t)VMX_SECONDARY_EXEC_XSAVES << 32;
22c213
-        }
22c213
-        if (kvm_arch_get_supported_cpuid(s, 1, 0, R_ECX) & CPUID_EXT_RDRAND) {
22c213
-            value |= (uint64_t)VMX_SECONDARY_EXEC_RDRAND_EXITING << 32;
22c213
-        }
22c213
-        if (kvm_arch_get_supported_cpuid(s, 7, 0, R_EBX) & CPUID_7_0_EBX_INVPCID) {
22c213
-            value |= (uint64_t)VMX_SECONDARY_EXEC_ENABLE_INVPCID << 32;
22c213
-        }
22c213
-        if (kvm_arch_get_supported_cpuid(s, 7, 0, R_EBX) & CPUID_7_0_EBX_RDSEED) {
22c213
-            value |= (uint64_t)VMX_SECONDARY_EXEC_RDSEED_EXITING << 32;
22c213
-        }
22c213
-        if (kvm_arch_get_supported_cpuid(s, 0x80000001, 0, R_EDX) & CPUID_EXT2_RDTSCP) {
22c213
-            value |= (uint64_t)VMX_SECONDARY_EXEC_RDTSCP << 32;
22c213
+        if (!has_msr_vmx_procbased_ctls2) {
22c213
+            /* KVM forgot to add these bits for some time, do this ourselves. */
22c213
+            if (kvm_arch_get_supported_cpuid(s, 0xD, 1, R_ECX) &
22c213
+                CPUID_XSAVE_XSAVES) {
22c213
+                value |= (uint64_t)VMX_SECONDARY_EXEC_XSAVES << 32;
22c213
+            }
22c213
+            if (kvm_arch_get_supported_cpuid(s, 1, 0, R_ECX) &
22c213
+                CPUID_EXT_RDRAND) {
22c213
+                value |= (uint64_t)VMX_SECONDARY_EXEC_RDRAND_EXITING << 32;
22c213
+            }
22c213
+            if (kvm_arch_get_supported_cpuid(s, 7, 0, R_EBX) &
22c213
+                CPUID_7_0_EBX_INVPCID) {
22c213
+                value |= (uint64_t)VMX_SECONDARY_EXEC_ENABLE_INVPCID << 32;
22c213
+            }
22c213
+            if (kvm_arch_get_supported_cpuid(s, 7, 0, R_EBX) &
22c213
+                CPUID_7_0_EBX_RDSEED) {
22c213
+                value |= (uint64_t)VMX_SECONDARY_EXEC_RDSEED_EXITING << 32;
22c213
+            }
22c213
+            if (kvm_arch_get_supported_cpuid(s, 0x80000001, 0, R_EDX) &
22c213
+                CPUID_EXT2_RDTSCP) {
22c213
+                value |= (uint64_t)VMX_SECONDARY_EXEC_RDTSCP << 32;
22c213
+            }
22c213
         }
22c213
         /* fall through */
22c213
     case MSR_IA32_VMX_TRUE_PINBASED_CTLS:
22c213
@@ -2060,6 +2068,9 @@ static int kvm_get_supported_msrs(KVMState *s)
22c213
             case MSR_IA32_UCODE_REV:
22c213
                 has_msr_ucode_rev = true;
22c213
                 break;
22c213
+            case MSR_IA32_VMX_PROCBASED_CTLS2:
22c213
+                has_msr_vmx_procbased_ctls2 = true;
22c213
+                break;
22c213
             }
22c213
         }
22c213
     }
22c213
-- 
22c213
1.8.3.1
22c213