# HG changeset patch
# User Christoph Egger <Christoph.Egger@xxxxxxx>
# Date 1309549680 -3600
# Node ID 177ddb2f4ebf4e71471129de7e197a8cba19b777
# Parent 2ad4262cac39616506f3c0e0dba6ae3590412ace
nestedsvm: fix handling of invalid virtual vmcb
When the l1 guest sets up an invalid vmcb then inject VMEXIT(#INVALID)
rather having the host sitting in an endless loop of injecting #UD.
Signed-off-by: Christoph Egger <Christoph.Egger@xxxxxxx>
---
diff -r 2ad4262cac39 -r 177ddb2f4ebf xen/arch/x86/hvm/svm/nestedsvm.c
--- a/xen/arch/x86/hvm/svm/nestedsvm.c Fri Jul 01 20:46:54 2011 +0100
+++ b/xen/arch/x86/hvm/svm/nestedsvm.c Fri Jul 01 20:48:00 2011 +0100
@@ -28,6 +28,10 @@
#include <asm/event.h> /* for local_event_delivery_(en|dis)able */
#include <asm/p2m.h> /* p2m_get_pagetable, p2m_get_nestedp2m */
+
+#define NSVM_ERROR_VVMCB 1
+#define NSVM_ERROR_VMENTRY 2
+
static void
nestedsvm_vcpu_clgi(struct vcpu *v)
{
@@ -616,13 +620,13 @@
rc = svm_vmcb_isvalid(__func__, ns_vmcb, 1);
if (rc) {
gdprintk(XENLOG_ERR, "virtual vmcb invalid\n");
- return rc;
+ return NSVM_ERROR_VVMCB;
}
rc = svm_vmcb_isvalid(__func__, n2vmcb, 1);
if (rc) {
gdprintk(XENLOG_ERR, "n2vmcb invalid\n");
- return rc;
+ return NSVM_ERROR_VMENTRY;
}
/* Switch guest registers to l2 guest */
@@ -718,7 +722,15 @@
* and l1 guest keeps alive. */
nestedhvm_vcpu_enter_guestmode(v);
- if (ret) {
+ switch (ret) {
+ case 0:
+ break;
+ case NSVM_ERROR_VVMCB:
+ gdprintk(XENLOG_ERR, "inject VMEXIT(INVALID)\n");
+ svm->ns_vmexit.exitcode = VMEXIT_INVALID;
+ return -1;
+ case NSVM_ERROR_VMENTRY:
+ default:
gdprintk(XENLOG_ERR,
"nsvm_vcpu_vmentry failed, injecting #UD\n");
hvm_inject_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE, 0);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|