|
|
3e20b48 |
From: "Michael S. Tsirkin" <mst@redhat.com>
|
|
|
3e20b48 |
Date: Fri, 24 Oct 2014 17:07:19 +0200
|
|
|
3e20b48 |
Subject: [PATCH] kvm: x86: don't kill guest on unknown exit reason
|
|
|
3e20b48 |
|
|
|
3e20b48 |
KVM_EXIT_UNKNOWN is a kvm bug, we don't really know whether it was
|
|
|
3e20b48 |
triggered by a priveledged application. Let's not kill the guest: WARN
|
|
|
3e20b48 |
and inject #UD instead.
|
|
|
3e20b48 |
|
|
|
3e20b48 |
Cc: stable@vger.kernel.org
|
|
|
3e20b48 |
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
|
|
3e20b48 |
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
3e20b48 |
---
|
|
|
3e20b48 |
arch/x86/kvm/svm.c | 6 +++---
|
|
|
3e20b48 |
arch/x86/kvm/vmx.c | 6 +++---
|
|
|
3e20b48 |
2 files changed, 6 insertions(+), 6 deletions(-)
|
|
|
3e20b48 |
|
|
|
3e20b48 |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
|
|
|
3e20b48 |
index e2de97daa03c..78dadc36fc78 100644
|
|
|
3e20b48 |
--- a/arch/x86/kvm/svm.c
|
|
|
3e20b48 |
+++ b/arch/x86/kvm/svm.c
|
|
|
3e20b48 |
@@ -3534,9 +3534,9 @@ static int handle_exit(struct kvm_vcpu *vcpu)
|
|
|
3e20b48 |
|
|
|
3e20b48 |
if (exit_code >= ARRAY_SIZE(svm_exit_handlers)
|
|
|
3e20b48 |
|| !svm_exit_handlers[exit_code]) {
|
|
|
3e20b48 |
- kvm_run->exit_reason = KVM_EXIT_UNKNOWN;
|
|
|
3e20b48 |
- kvm_run->hw.hardware_exit_reason = exit_code;
|
|
|
3e20b48 |
- return 0;
|
|
|
3e20b48 |
+ WARN_ONCE(1, "vmx: unexpected exit reason 0x%x\n", exit_code);
|
|
|
3e20b48 |
+ kvm_queue_exception(vcpu, UD_VECTOR);
|
|
|
3e20b48 |
+ return 1;
|
|
|
3e20b48 |
}
|
|
|
3e20b48 |
|
|
|
3e20b48 |
return svm_exit_handlers[exit_code](svm);
|
|
|
3e20b48 |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
|
|
|
3e20b48 |
index 12dd2b2e655c..41a5426c8edb 100644
|
|
|
3e20b48 |
--- a/arch/x86/kvm/vmx.c
|
|
|
3e20b48 |
+++ b/arch/x86/kvm/vmx.c
|
|
|
3e20b48 |
@@ -7065,10 +7065,10 @@ static int vmx_handle_exit(struct kvm_vcpu *vcpu)
|
|
|
3e20b48 |
&& kvm_vmx_exit_handlers[exit_reason])
|
|
|
3e20b48 |
return kvm_vmx_exit_handlers[exit_reason](vcpu);
|
|
|
3e20b48 |
else {
|
|
|
3e20b48 |
- vcpu->run->exit_reason = KVM_EXIT_UNKNOWN;
|
|
|
3e20b48 |
- vcpu->run->hw.hardware_exit_reason = exit_reason;
|
|
|
3e20b48 |
+ WARN_ONCE(1, "vmx: unexpected exit reason 0x%x\n", exit_reason);
|
|
|
3e20b48 |
+ kvm_queue_exception(vcpu, UD_VECTOR);
|
|
|
3e20b48 |
+ return 1;
|
|
|
3e20b48 |
}
|
|
|
3e20b48 |
- return 0;
|
|
|
3e20b48 |
}
|
|
|
3e20b48 |
|
|
|
3e20b48 |
static void update_cr8_intercept(struct kvm_vcpu *vcpu, int tpr, int irr)
|
|
|
3e20b48 |
--
|
|
|
3e20b48 |
1.9.3
|
|
|
3e20b48 |
|