aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kvm/svm.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 279a2ae21b4f..e37285446cb7 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -1615,6 +1615,22 @@ static int nested_svm_vmexit(struct vcpu_svm *svm)
1615 nested_vmcb->control.exit_info_2 = vmcb->control.exit_info_2; 1615 nested_vmcb->control.exit_info_2 = vmcb->control.exit_info_2;
1616 nested_vmcb->control.exit_int_info = vmcb->control.exit_int_info; 1616 nested_vmcb->control.exit_int_info = vmcb->control.exit_int_info;
1617 nested_vmcb->control.exit_int_info_err = vmcb->control.exit_int_info_err; 1617 nested_vmcb->control.exit_int_info_err = vmcb->control.exit_int_info_err;
1618
1619 /*
1620 * If we emulate a VMRUN/#VMEXIT in the same host #vmexit cycle we have
1621 * to make sure that we do not lose injected events. So check event_inj
1622 * here and copy it to exit_int_info if it is valid.
1623 * Exit_int_info and event_inj can't be both valid because the case
1624 * below only happens on a VMRUN instruction intercept which has
1625 * no valid exit_int_info set.
1626 */
1627 if (vmcb->control.event_inj & SVM_EVTINJ_VALID) {
1628 struct vmcb_control_area *nc = &nested_vmcb->control;
1629
1630 nc->exit_int_info = vmcb->control.event_inj;
1631 nc->exit_int_info_err = vmcb->control.event_inj_err;
1632 }
1633
1618 nested_vmcb->control.tlb_ctl = 0; 1634 nested_vmcb->control.tlb_ctl = 0;
1619 nested_vmcb->control.event_inj = 0; 1635 nested_vmcb->control.event_inj = 0;
1620 nested_vmcb->control.event_inj_err = 0; 1636 nested_vmcb->control.event_inj_err = 0;