62547e
From f96220d64a31a4a52b2d132a503048579946f982 Mon Sep 17 00:00:00 2001
1be5c7
From: Vitaly Kuznetsov <vkuznets@redhat.com>
1be5c7
Date: Thu, 18 Aug 2022 17:01:13 +0200
62547e
Subject: [PATCH 3/3] i386: do kvm_put_msr_feature_control() first thing when
1be5c7
 vCPU is reset
1be5c7
62547e
RH-Author: Miroslav Rezanina <mrezanin@redhat.com>
62547e
RH-MergeRequest: 219: Synchronize qemu-6.2.0-20.el8.1 build from RHEL 8.7 to RHEL 8.8
62547e
RH-Bugzilla: 2125271
62547e
RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com>
62547e
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
62547e
RH-Commit: [2/2] 08e1e67db96801e4a35aa6b60a93b2c2f1641220
1be5c7
1be5c7
kvm_put_sregs2() fails to reset 'locked' CR4/CR0 bits upon vCPU reset when
1be5c7
it is in VMX root operation. Do kvm_put_msr_feature_control() before
1be5c7
kvm_put_sregs2() to (possibly) kick vCPU out of VMX root operation. It also
1be5c7
seems logical to do kvm_put_msr_feature_control() before
1be5c7
kvm_put_nested_state() and not after it, especially when 'real' nested
1be5c7
state is set.
1be5c7
1be5c7
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
1be5c7
Message-Id: <20220818150113.479917-3-vkuznets@redhat.com>
1be5c7
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
1be5c7
(cherry picked from commit 45ed68a1a3a19754ade954d75a3c9d13ff560e5c)
1be5c7
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
1be5c7
---
1be5c7
 target/i386/kvm/kvm.c | 17 ++++++++++++-----
1be5c7
 1 file changed, 12 insertions(+), 5 deletions(-)
1be5c7
1be5c7
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
1be5c7
index 81d729dc40..a06221d3e5 100644
1be5c7
--- a/target/i386/kvm/kvm.c
1be5c7
+++ b/target/i386/kvm/kvm.c
1be5c7
@@ -4255,6 +4255,18 @@ int kvm_arch_put_registers(CPUState *cpu, int level)
1be5c7
 
1be5c7
     assert(cpu_is_stopped(cpu) || qemu_cpu_is_self(cpu));
1be5c7
 
1be5c7
+    /*
1be5c7
+     * Put MSR_IA32_FEATURE_CONTROL first, this ensures the VM gets out of VMX
1be5c7
+     * root operation upon vCPU reset. kvm_put_msr_feature_control() should also
1be5c7
+     * preceed kvm_put_nested_state() when 'real' nested state is set.
1be5c7
+     */
1be5c7
+    if (level >= KVM_PUT_RESET_STATE) {
1be5c7
+        ret = kvm_put_msr_feature_control(x86_cpu);
1be5c7
+        if (ret < 0) {
1be5c7
+            return ret;
1be5c7
+        }
1be5c7
+    }
1be5c7
+
1be5c7
     /* must be before kvm_put_nested_state so that EFER.SVME is set */
1be5c7
     ret = kvm_put_sregs(x86_cpu);
1be5c7
     if (ret < 0) {
1be5c7
@@ -4266,11 +4278,6 @@ int kvm_arch_put_registers(CPUState *cpu, int level)
1be5c7
         if (ret < 0) {
1be5c7
             return ret;
1be5c7
         }
1be5c7
-
1be5c7
-        ret = kvm_put_msr_feature_control(x86_cpu);
1be5c7
-        if (ret < 0) {
1be5c7
-            return ret;
1be5c7
-        }
1be5c7
     }
1be5c7
 
1be5c7
     if (level == KVM_PUT_FULL_STATE) {
1be5c7
-- 
62547e
2.35.3
1be5c7