diff options
-rw-r--r-- | arch/x86/kvm/svm.c | 16 |
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; |