diff -r f3766f97b786 xen/arch/x86/hvm/svm/nestedsvm.c --- a/xen/arch/x86/hvm/svm/nestedsvm.c Mon May 09 14:29:12 2011 +0200 +++ b/xen/arch/x86/hvm/svm/nestedsvm.c Tue May 10 11:11:10 2011 +0200 @@ -708,17 +708,21 @@ nsvm_vcpu_vmrun(struct vcpu *v, struct c /* save host state */ ret = nsvm_vcpu_vmentry(v, regs, inst_len); + + /* Switch vcpu to guest mode. In the error case + * this ensures the host mode is restored correctly + * and l1 guest keeps alive. */ + nestedhvm_vcpu_enter_guestmode(v); + if (ret) { gdprintk(XENLOG_ERR, "nsvm_vcpu_vmentry failed, injecting #UD\n"); hvm_inject_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE, 0); + /* Must happen after hvm_inject_exception or it doesn't work right. */ nv->nv_vmswitch_in_progress = 0; return 1; } - /* Switch vcpu to guest mode - */ - nestedhvm_vcpu_enter_guestmode(v); nv->nv_vmswitch_in_progress = 0; return 0; } @@ -1381,7 +1385,7 @@ asmlinkage void nsvm_vcpu_switch(struct int ret; ASSERT(!nv->nv_vmexit_pending); ret = nsvm_vcpu_vmrun(v, regs); - if (ret < 0) + if (ret) goto vmexit; ASSERT(nestedhvm_vcpu_in_guestmode(v));