From 75852ba185ed98a7f23b1be9fbb0c0e508b14244 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Fri, 9 Oct 2009 16:08:25 +0200 Subject: [PATCH] --- yaml --- r: 172295 b: refs/heads/master c: 8d23c4662427507f432c96ac4fa3b76f0a8360cd h: refs/heads/master i: 172293: 6e23b586d390cf7fb80f5289efe786cb09975d61 172291: f8e78abf6c78b269e15db2d38fbe67485f7ff4d9 172287: f95a71c45e4727f6d3e87027a383d0209cd61fa7 v: v3 --- [refs] | 2 +- trunk/arch/x86/kvm/svm.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 8fec66ef9270..9d7ddfd9d2ee 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e3267cbbbfbcbe9c18833e89b10beabb1117cb55 +refs/heads/master: 8d23c4662427507f432c96ac4fa3b76f0a8360cd diff --git a/trunk/arch/x86/kvm/svm.c b/trunk/arch/x86/kvm/svm.c index 279a2ae21b4f..e37285446cb7 100644 --- a/trunk/arch/x86/kvm/svm.c +++ b/trunk/arch/x86/kvm/svm.c @@ -1615,6 +1615,22 @@ static int nested_svm_vmexit(struct vcpu_svm *svm) nested_vmcb->control.exit_info_2 = vmcb->control.exit_info_2; nested_vmcb->control.exit_int_info = vmcb->control.exit_int_info; nested_vmcb->control.exit_int_info_err = vmcb->control.exit_int_info_err; + + /* + * If we emulate a VMRUN/#VMEXIT in the same host #vmexit cycle we have + * to make sure that we do not lose injected events. So check event_inj + * here and copy it to exit_int_info if it is valid. + * Exit_int_info and event_inj can't be both valid because the case + * below only happens on a VMRUN instruction intercept which has + * no valid exit_int_info set. + */ + if (vmcb->control.event_inj & SVM_EVTINJ_VALID) { + struct vmcb_control_area *nc = &nested_vmcb->control; + + nc->exit_int_info = vmcb->control.event_inj; + nc->exit_int_info_err = vmcb->control.event_inj_err; + } + nested_vmcb->control.tlb_ctl = 0; nested_vmcb->control.event_inj = 0; nested_vmcb->control.event_inj_err = 0;