summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorvboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f>2023-05-08 07:04:05 +0000
committervboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f>2023-05-08 07:04:05 +0000
commitc6fad5cfe26cb1e981bd4569e127961c71afe9c1 (patch)
treeaef92f9fa67be5cf9b1e19c7fddb1bce264ba4ba /src
parentbc65d5eb1241ebd97441e5f32f93ca8620b0f022 (diff)
downloadVirtualBox-svn-c6fad5cfe26cb1e981bd4569e127961c71afe9c1.tar.gz
VMM/IEM: Nested VMX: bugref:10318 Clear "NMI unblocked due to IRET" state on completion of IRET emulation.
git-svn-id: https://www.virtualbox.org/svn/vbox/trunk@99651 cfe28804-0f27-0410-a406-dd0f0b0b656f
Diffstat (limited to 'src')
-rw-r--r--src/VBox/VMM/VMMAll/IEMAllCImpl.cpp24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp b/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp
index 0e48d185a71..37ae518beb4 100644
--- a/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp
+++ b/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp
@@ -3977,12 +3977,26 @@ IEM_CIMPL_DEF_1(iemCImpl_iret, IEMMODE, enmEffOpSize)
/*
* Call a mode specific worker.
*/
+ VBOXSTRICTRC rcStrict;
if (IEM_IS_REAL_OR_V86_MODE(pVCpu))
- return IEM_CIMPL_CALL_1(iemCImpl_iret_real_v8086, enmEffOpSize);
- IEM_CTX_IMPORT_RET(pVCpu, CPUMCTX_EXTRN_SREG_MASK | CPUMCTX_EXTRN_GDTR | CPUMCTX_EXTRN_LDTR);
- if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
- return IEM_CIMPL_CALL_1(iemCImpl_iret_64bit, enmEffOpSize);
- return IEM_CIMPL_CALL_1(iemCImpl_iret_prot, enmEffOpSize);
+ rcStrict = IEM_CIMPL_CALL_1(iemCImpl_iret_real_v8086, enmEffOpSize);
+ else
+ {
+ IEM_CTX_IMPORT_RET(pVCpu, CPUMCTX_EXTRN_SREG_MASK | CPUMCTX_EXTRN_GDTR | CPUMCTX_EXTRN_LDTR);
+ if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
+ rcStrict = IEM_CIMPL_CALL_1(iemCImpl_iret_64bit, enmEffOpSize);
+ else
+ rcStrict = IEM_CIMPL_CALL_1(iemCImpl_iret_prot, enmEffOpSize);
+ }
+
+#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
+ /*
+ * Clear NMI unblocking IRET state with the completion of IRET.
+ */
+ if (IEM_VMX_IS_NON_ROOT_MODE(pVCpu))
+ pVCpu->cpum.GstCtx.hwvirt.vmx.fNmiUnblockingIret = false;
+#endif
+ return rcStrict;
}