Changeset 87040 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Dec 4, 2020 6:28:01 AM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 141724
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h
r84505 r87040 3528 3528 * If the interrupt is pending and we -do- need to acknowledge the interrupt 3529 3529 * on VM-exit, postpone VM-exit till after the interrupt controller has been 3530 * acknowledged that the interrupt has been consumed. 3530 * acknowledged that the interrupt has been consumed. Callers would have to call 3531 * us again after getting the vector (and ofc, with fIntPending with false). 3531 3532 */ 3532 3533 return VINF_VMX_INTERCEPT_NOT_ACTIVE; … … 3536 3537 * If the interrupt is no longer pending (i.e. it has been acknowledged) and the 3537 3538 * "External interrupt exiting" and "Acknowledge interrupt on VM-exit" controls are 3538 * all set, we cause the VM-exit now. We need to record the external interrupt that3539 * just occurred in the VM-exit interruption information field.3539 * all set, we need to record the vector of the external interrupt in the 3540 * VM-exit interruption information field. Otherwise, mark this field as invalid. 3540 3541 * 3541 3542 * See Intel spec. 27.2.2 "Information for VM Exits Due to Vectored Events". 3542 3543 */ 3544 uint32_t uExitIntInfo; 3543 3545 if (pVmcs->u32ExitCtls & VMX_EXIT_CTLS_ACK_EXT_INT) 3544 3546 { 3545 bool const fNmiUnblocking = pVCpu->cpum.GstCtx.hwvirt.vmx.fNmiUnblockingIret; 3546 uint32_t const uExitIntInfo = RT_BF_MAKE(VMX_BF_EXIT_INT_INFO_VECTOR, uVector) 3547 | RT_BF_MAKE(VMX_BF_EXIT_INT_INFO_TYPE, VMX_EXIT_INT_INFO_TYPE_EXT_INT) 3548 | RT_BF_MAKE(VMX_BF_EXIT_INT_INFO_NMI_UNBLOCK_IRET, fNmiUnblocking) 3549 | RT_BF_MAKE(VMX_BF_EXIT_INT_INFO_VALID, 1); 3550 iemVmxVmcsSetExitIntInfo(pVCpu, uExitIntInfo); 3551 return iemVmxVmexit(pVCpu, VMX_EXIT_EXT_INT, 0 /* u64ExitQual */); 3552 } 3547 bool const fNmiUnblocking = pVCpu->cpum.GstCtx.hwvirt.vmx.fNmiUnblockingIret; 3548 uExitIntInfo = RT_BF_MAKE(VMX_BF_EXIT_INT_INFO_VECTOR, uVector) 3549 | RT_BF_MAKE(VMX_BF_EXIT_INT_INFO_TYPE, VMX_EXIT_INT_INFO_TYPE_EXT_INT) 3550 | RT_BF_MAKE(VMX_BF_EXIT_INT_INFO_NMI_UNBLOCK_IRET, fNmiUnblocking) 3551 | RT_BF_MAKE(VMX_BF_EXIT_INT_INFO_VALID, 1); 3552 } 3553 else 3554 uExitIntInfo = 0; 3555 iemVmxVmcsSetExitIntInfo(pVCpu, uExitIntInfo); 3556 3557 /* 3558 * Cause the VM-exit whether or not the vector has been stored 3559 * in the VM-exit interruption-information field. 3560 */ 3561 return iemVmxVmexit(pVCpu, VMX_EXIT_EXT_INT, 0 /* u64ExitQual */); 3553 3562 } 3554 3563
Note:
See TracChangeset
for help on using the changeset viewer.