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