diff -r a0b5f8102a00 xen/arch/x86/hvm/svm/nestedsvm.c --- a/xen/arch/x86/hvm/svm/nestedsvm.c Tue Aug 28 22:40:45 2012 +0100 +++ b/xen/arch/x86/hvm/svm/nestedsvm.c Fri Aug 31 11:09:37 2012 +0200 @@ -1164,6 +1164,8 @@ enum hvm_intblk nsvm_intr_blocked(struct return hvm_intblk_svm_gif; if ( nestedhvm_vcpu_in_guestmode(v) ) { + struct vmcb_struct *n2vmcb = nv->nv_n2vmcx; + if ( svm->ns_hostflags.fields.vintrmask ) if ( !svm->ns_hostflags.fields.rflagsif ) return hvm_intblk_rflags_ie; @@ -1176,6 +1178,14 @@ enum hvm_intblk nsvm_intr_blocked(struct */ if ( v->arch.hvm_vcpu.hvm_io.io_state != HVMIO_none ) return hvm_intblk_shadow; + + if ( !nv->nv_vmexit_pending && n2vmcb->exitintinfo.bytes != 0 ) { + /* Give the l2 guest a chance to finish the delivery of + * the last injected interrupt or exception before we + * emulate a VMEXIT (e.g. VMEXIT(INTR) ). + */ + return hvm_intblk_shadow; + } } if ( nv->nv_vmexit_pending ) {