Pablo Greco e6a3ae
From 92fad7ff756d40b231399a1eeedb7caca9ab321e Mon Sep 17 00:00:00 2001
Pablo Greco e6a3ae
From: Paolo Bonzini <pbonzini@redhat.com>
Pablo Greco e6a3ae
Date: Fri, 22 Nov 2019 11:53:45 +0000
Pablo Greco e6a3ae
Subject: [PATCH 12/16] target/i386: work around KVM_GET_MSRS bug for secondary
Pablo Greco e6a3ae
 execution controls
Pablo Greco e6a3ae
Pablo Greco e6a3ae
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
Pablo Greco e6a3ae
Message-id: <20191122115348.25000-13-pbonzini@redhat.com>
Pablo Greco e6a3ae
Patchwork-id: 92609
Pablo Greco e6a3ae
O-Subject: [RHEL8.2/rhel qemu-kvm PATCH 12/15] target/i386: work around KVM_GET_MSRS bug for secondary execution controls
Pablo Greco e6a3ae
Bugzilla: 1689270
Pablo Greco e6a3ae
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Eduardo Habkost <ehabkost@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Maxim Levitsky <mlevitsk@redhat.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Some secondary controls are automatically enabled/disabled based on the CPUID
Pablo Greco e6a3ae
values that are set for the guest.  However, they are still available at a
Pablo Greco e6a3ae
global level and therefore should be present when KVM_GET_MSRS is sent to
Pablo Greco e6a3ae
/dev/kvm.
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Unfortunately KVM forgot to include those, so fix that.
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Pablo Greco e6a3ae
(cherry picked from commit 048c95163b472ed737a2f0dca4f4e23a82ac2f8a)
Pablo Greco e6a3ae
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
Pablo Greco e6a3ae
---
Pablo Greco e6a3ae
 target/i386/kvm.c | 17 +++++++++++++++++
Pablo Greco e6a3ae
 1 file changed, 17 insertions(+)
Pablo Greco e6a3ae
Pablo Greco e6a3ae
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
Pablo Greco e6a3ae
index 512d7d5..6366172 100644
Pablo Greco e6a3ae
--- a/target/i386/kvm.c
Pablo Greco e6a3ae
+++ b/target/i386/kvm.c
Pablo Greco e6a3ae
@@ -460,6 +460,23 @@ uint64_t kvm_arch_get_supported_msr_feature(KVMState *s, uint32_t index)
Pablo Greco e6a3ae
     value = msr_data.entries[0].data;
Pablo Greco e6a3ae
     switch (index) {
Pablo Greco e6a3ae
     case MSR_IA32_VMX_PROCBASED_CTLS2:
Pablo Greco e6a3ae
+        /* KVM forgot to add these bits for some time, do this ourselves.  */
Pablo Greco e6a3ae
+        if (kvm_arch_get_supported_cpuid(s, 0xD, 1, R_ECX) & CPUID_XSAVE_XSAVES) {
Pablo Greco e6a3ae
+            value |= (uint64_t)VMX_SECONDARY_EXEC_XSAVES << 32;
Pablo Greco e6a3ae
+        }
Pablo Greco e6a3ae
+        if (kvm_arch_get_supported_cpuid(s, 1, 0, R_ECX) & CPUID_EXT_RDRAND) {
Pablo Greco e6a3ae
+            value |= (uint64_t)VMX_SECONDARY_EXEC_RDRAND_EXITING << 32;
Pablo Greco e6a3ae
+        }
Pablo Greco e6a3ae
+        if (kvm_arch_get_supported_cpuid(s, 7, 0, R_EBX) & CPUID_7_0_EBX_INVPCID) {
Pablo Greco e6a3ae
+            value |= (uint64_t)VMX_SECONDARY_EXEC_ENABLE_INVPCID << 32;
Pablo Greco e6a3ae
+        }
Pablo Greco e6a3ae
+        if (kvm_arch_get_supported_cpuid(s, 7, 0, R_EBX) & CPUID_7_0_EBX_RDSEED) {
Pablo Greco e6a3ae
+            value |= (uint64_t)VMX_SECONDARY_EXEC_RDSEED_EXITING << 32;
Pablo Greco e6a3ae
+        }
Pablo Greco e6a3ae
+        if (kvm_arch_get_supported_cpuid(s, 0x80000001, 0, R_EDX) & CPUID_EXT2_RDTSCP) {
Pablo Greco e6a3ae
+            value |= (uint64_t)VMX_SECONDARY_EXEC_RDTSCP << 32;
Pablo Greco e6a3ae
+        }
Pablo Greco e6a3ae
+        /* fall through */
Pablo Greco e6a3ae
     case MSR_IA32_VMX_TRUE_PINBASED_CTLS:
Pablo Greco e6a3ae
     case MSR_IA32_VMX_TRUE_PROCBASED_CTLS:
Pablo Greco e6a3ae
     case MSR_IA32_VMX_TRUE_ENTRY_CTLS:
Pablo Greco e6a3ae
-- 
Pablo Greco e6a3ae
1.8.3.1
Pablo Greco e6a3ae