Changeset 77610 in vbox for trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
- Timestamp:
- Mar 8, 2019 10:31:35 AM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 129238
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r77576 r77610 987 987 IEM_STATIC VBOXSTRICTRC iemVmxVmexitInitIpi(PVMCPU pVCpu); 988 988 IEM_STATIC VBOXSTRICTRC iemVmxVmexitIntWindow(PVMCPU pVCpu); 989 IEM_STATIC VBOXSTRICTRC iemVmxVmexitNmiWindow(PVMCPU pVCpu); 989 990 IEM_STATIC VBOXSTRICTRC iemVmxVmexitMtf(PVMCPU pVCpu); 990 991 IEM_STATIC VBOXSTRICTRC iemVmxVirtApicAccessMem(PVMCPU pVCpu, uint16_t offAccess, size_t cbAccess, void *pvData, uint32_t fAccess); … … 5537 5538 #endif 5538 5539 5540 /* 5541 * Evaluate whether NMI blocking should be in effect. 5542 * Normally, NMI blocking is in effect whenever we inject an NMI. 5543 */ 5544 bool fBlockNmi; 5545 if ( u8Vector == X86_XCPT_NMI 5546 && (fFlags & IEM_XCPT_FLAGS_T_CPU_XCPT)) 5547 fBlockNmi = true; 5548 5539 5549 #ifdef VBOX_WITH_NESTED_HWVIRT_VMX 5540 5550 if (IEM_VMX_IS_NON_ROOT_MODE(pVCpu)) … … 5543 5553 if (rcStrict0 != VINF_VMX_INTERCEPT_NOT_ACTIVE) 5544 5554 return rcStrict0; 5555 5556 /* If virtual-NMI blocking is in effect for the nested-guest, guest NMIs are not blocked. */ 5557 if (pVCpu->cpum.GstCtx.hwvirt.vmx.fVirtNmiBlocking) 5558 { 5559 Assert(CPUMIsGuestVmxPinCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PIN_CTLS_VIRT_NMI)); 5560 fBlockNmi = false; 5561 } 5545 5562 } 5546 5563 #endif … … 5569 5586 } 5570 5587 #endif 5588 5589 /* 5590 * Set NMI blocking if necessary. 5591 */ 5592 if ( fBlockNmi 5593 && !VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_BLOCK_NMIS)) 5594 VMCPU_FF_SET(pVCpu, VMCPU_FF_BLOCK_NMIS); 5571 5595 5572 5596 /* … … 14038 14062 Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_VMX_MTF)); 14039 14063 } 14040 /* * Finally, check if the VMX preemption timer has expired. */14064 /* VMX preemption timer takes priority over NMI-window exits. */ 14041 14065 else if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_VMX_PREEMPT_TIMER)) 14042 14066 { … … 14049 14073 Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_VMX_PREEMPT_TIMER)); 14050 14074 } 14075 } 14076 /* NMI-window VM-exit. */ 14077 else if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_VMX_NMI_WINDOW)) 14078 { 14079 rcStrict = iemVmxVmexitNmiWindow(pVCpu); 14080 Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_VMX_NMI_WINDOW)); 14051 14081 } 14052 14082 } … … 14741 14771 fFlags |= IEM_XCPT_FLAGS_ERR; 14742 14772 break; 14743 14744 case X86_XCPT_NMI:14745 VMCPU_FF_SET(pVCpu, VMCPU_FF_BLOCK_NMIS);14746 break;14747 14773 } 14748 14774 break; … … 15895 15921 15896 15922 /** 15923 * Interface for HM and EM to emulate VM-exits for NMI-windows. 15924 * 15925 * @returns Strict VBox status code. 15926 * @param pVCpu The cross context virtual CPU structure of the calling EMT. 15927 * @thread EMT(pVCpu) 15928 */ 15929 VMM_INT_DECL(VBOXSTRICTRC) IEMExecVmxVmexitNmiWindow(PVMCPU pVCpu) 15930 { 15931 VBOXSTRICTRC rcStrict = iemVmxVmexitNmiWindow(pVCpu); 15932 if (pVCpu->iem.s.cActiveMappings) 15933 iemMemRollback(pVCpu); 15934 return iemExecStatusCodeFiddling(pVCpu, rcStrict); 15935 } 15936 15937 15938 /** 15897 15939 * Interface for HM and EM to emulate VM-exits Monitor-Trap Flag (MTF). 15898 15940 * … … 15949 15991 rcStrict = iemVmxVmreadMem(pVCpu, cbInstr, iEffSeg, enmEffAddrMode, GCPtrDst, uFieldEnc, pExitInfo); 15950 15992 } 15951 if (pVCpu->iem.s.cActiveMappings) 15952 iemMemRollback(pVCpu); 15953 return iemExecStatusCodeFiddling(pVCpu, rcStrict); 15993 Assert(!pVCpu->iem.s.cActiveMappings); 15994 return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict); 15954 15995 } 15955 15996 … … 15989 16030 uint32_t const uFieldEnc = iemGRegFetchU64(pVCpu, pExitInfo->InstrInfo.VmreadVmwrite.iReg2); 15990 16031 VBOXSTRICTRC rcStrict = iemVmxVmwrite(pVCpu, cbInstr, iEffSeg, enmEffAddrMode, u64Val, uFieldEnc, pExitInfo); 15991 if (pVCpu->iem.s.cActiveMappings) 15992 iemMemRollback(pVCpu); 15993 return iemExecStatusCodeFiddling(pVCpu, rcStrict); 16032 Assert(!pVCpu->iem.s.cActiveMappings); 16033 return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict); 15994 16034 } 15995 16035 … … 16015 16055 RTGCPTR const GCPtrVmcs = pExitInfo->GCPtrEffAddr; 16016 16056 VBOXSTRICTRC rcStrict = iemVmxVmptrld(pVCpu, cbInstr, iEffSeg, GCPtrVmcs, pExitInfo); 16017 if (pVCpu->iem.s.cActiveMappings) 16018 iemMemRollback(pVCpu); 16019 return iemExecStatusCodeFiddling(pVCpu, rcStrict); 16057 Assert(!pVCpu->iem.s.cActiveMappings); 16058 return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict); 16020 16059 } 16021 16060 … … 16041 16080 RTGCPTR const GCPtrVmcs = pExitInfo->GCPtrEffAddr; 16042 16081 VBOXSTRICTRC rcStrict = iemVmxVmptrst(pVCpu, cbInstr, iEffSeg, GCPtrVmcs, pExitInfo); 16043 if (pVCpu->iem.s.cActiveMappings) 16044 iemMemRollback(pVCpu); 16045 return iemExecStatusCodeFiddling(pVCpu, rcStrict); 16082 Assert(!pVCpu->iem.s.cActiveMappings); 16083 return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict); 16046 16084 } 16047 16085 … … 16067 16105 RTGCPTR const GCPtrVmcs = pExitInfo->GCPtrEffAddr; 16068 16106 VBOXSTRICTRC rcStrict = iemVmxVmclear(pVCpu, cbInstr, iEffSeg, GCPtrVmcs, pExitInfo); 16069 if (pVCpu->iem.s.cActiveMappings) 16070 iemMemRollback(pVCpu); 16071 return iemExecStatusCodeFiddling(pVCpu, rcStrict); 16107 Assert(!pVCpu->iem.s.cActiveMappings); 16108 return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict); 16072 16109 } 16073 16110 … … 16090 16127 iemInitExec(pVCpu, false /*fBypassHandlers*/); 16091 16128 VBOXSTRICTRC rcStrict = iemVmxVmlaunchVmresume(pVCpu, cbInstr, uInstrId); 16092 if (pVCpu->iem.s.cActiveMappings) 16093 iemMemRollback(pVCpu); 16094 return iemExecStatusCodeFiddling(pVCpu, rcStrict); 16129 Assert(!pVCpu->iem.s.cActiveMappings); 16130 return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict); 16095 16131 } 16096 16132 … … 16116 16152 RTGCPTR const GCPtrVmxon = pExitInfo->GCPtrEffAddr; 16117 16153 VBOXSTRICTRC rcStrict = iemVmxVmxon(pVCpu, cbInstr, iEffSeg, GCPtrVmxon, pExitInfo); 16118 if (pVCpu->iem.s.cActiveMappings) 16119 iemMemRollback(pVCpu); 16120 return iemExecStatusCodeFiddling(pVCpu, rcStrict); 16154 Assert(!pVCpu->iem.s.cActiveMappings); 16155 return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict); 16121 16156 } 16122 16157
Note:
See TracChangeset
for help on using the changeset viewer.