diff options
author | vboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f> | 2023-05-08 07:04:05 +0000 |
---|---|---|
committer | vboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f> | 2023-05-08 07:04:05 +0000 |
commit | c6fad5cfe26cb1e981bd4569e127961c71afe9c1 (patch) | |
tree | aef92f9fa67be5cf9b1e19c7fddb1bce264ba4ba /src | |
parent | bc65d5eb1241ebd97441e5f32f93ca8620b0f022 (diff) | |
download | VirtualBox-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.cpp | 24 |
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; } |