diff -r 4c54e80a6659 xen/arch/x86/hvm/svm/nestedsvm.c --- a/xen/arch/x86/hvm/svm/nestedsvm.c Thu Jun 30 12:43:57 2011 +0200 +++ b/xen/arch/x86/hvm/svm/nestedsvm.c Fri Jul 01 16:05:28 2011 +0200 @@ -28,6 +28,10 @@ #include /* for local_event_delivery_(en|dis)able */ #include /* p2m_get_pagetable, p2m_get_nestedp2m */ + +#define NSVM_ERROR_VVMCB 1 +#define NSVM_ERROR_VMENTRY 2 + static void nestedsvm_vcpu_clgi(struct vcpu *v) { @@ -620,13 +624,13 @@ static int nsvm_vmcb_prepare4vmrun(struc 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 */ @@ -722,7 +726,15 @@ nsvm_vcpu_vmrun(struct vcpu *v, struct c * 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);