From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Egger Subject: [PATCH] nestedsvm: fix handling of invalid virtual vmcb Date: Fri, 1 Jul 2011 16:10:34 +0200 Message-ID: <4E0DD55A.5080308@amd.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------000908070405060100090205" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: "xen-devel@lists.xensource.com" List-Id: xen-devel@lists.xenproject.org --------------000908070405060100090205 Content-Type: text/plain; charset="ISO-8859-15"; format=flowed Content-Transfer-Encoding: 7bit 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 -- ---to satisfy European Law for business letters: Advanced Micro Devices GmbH Einsteinring 24, 85689 Dornach b. Muenchen Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen Registergericht Muenchen, HRB Nr. 43632 --------------000908070405060100090205 Content-Type: text/plain; name="xen_nh_fix_invalid_vvmcb.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="xen_nh_fix_invalid_vvmcb.diff" Content-Description: xen_nh_fix_invalid_vvmcb.diff 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); --------------000908070405060100090205 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --------------000908070405060100090205--