Changeset 105125 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Jul 3, 2024 8:07:48 PM (7 months ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp
r105098 r105125 819 819 return rcStrict; 820 820 821 /** @todo Is the popf VME \#GP(0) delivered after updating RSP+RIP 822 * or before? */ 823 if ( ( (u16Value & X86_EFL_IF) 824 && (fEflOld & X86_EFL_VIP)) 825 || (u16Value & X86_EFL_TF) ) 821 if ( ( (u16Value & X86_EFL_IF) 822 && (fEflOld & X86_EFL_VIP)) 823 || (u16Value & X86_EFL_TF) ) 826 824 return iemRaiseGeneralProtectionFault0(pVCpu); 827 825 828 fEflNew = u16Value | (fEflOld & UINT32_C(0xffff0000) & ~X86_EFL_VIF);829 fEflNew |= (fEflNew & X86_EFL_IF) << (19 - 9);830 fEflNew &= X86_EFL_POPF_BITS & ~(X86_EFL_IOPL | X86_EFL_IF);831 fEflNew |= ~(X86_EFL_POPF_BITS & ~(X86_EFL_IOPL | X86_EFL_IF)) & fEflOld;826 fEflNew = X86_EFL_RA1_MASK 827 | (u16Value & ~(X86_EFL_IF | X86_EFL_IOPL | X86_EFL_RAZ_MASK)) 828 | (fEflOld & (UINT32_C(0xffff0000) | X86_EFL_IF | X86_EFL_IOPL) & ~(X86_EFL_VIF | X86_EFL_RF)) 829 | ((uint32_t)(u16Value & X86_EFL_IF) << (X86_EFL_VIF_BIT - X86_EFL_IF_BIT)); 832 830 833 831 pVCpu->cpum.GstCtx.rsp = TmpRsp.u; -
trunk/src/VBox/VMM/include/IEMInline.h
r105072 r105125 2098 2098 * Stacks} 2099 2099 */ 2100 template<uint32_t const a_fTF = X86_EFL_TF> 2100 2101 static VBOXSTRICTRC iemFinishInstructionWithFlagsSet(PVMCPUCC pVCpu, int rcNormal) RT_NOEXCEPT 2101 2102 { … … 2103 2104 * Normally we're just here to clear RF and/or interrupt shadow bits. 2104 2105 */ 2105 if (RT_LIKELY((pVCpu->cpum.GstCtx.eflags.uBoth & ( X86_EFL_TF | CPUMCTX_DBG_HIT_DRX_MASK | CPUMCTX_DBG_DBGF_MASK)) == 0))2106 if (RT_LIKELY((pVCpu->cpum.GstCtx.eflags.uBoth & (a_fTF | CPUMCTX_DBG_HIT_DRX_MASK | CPUMCTX_DBG_DBGF_MASK)) == 0)) 2106 2107 pVCpu->cpum.GstCtx.eflags.uBoth &= ~(X86_EFL_RF | CPUMCTX_INHIBIT_SHADOW); 2107 2108 else … … 2111 2112 */ 2112 2113 VBOXSTRICTRC rcStrict; 2113 if (pVCpu->cpum.GstCtx.eflags.uBoth & ( X86_EFL_TF | CPUMCTX_DBG_HIT_DRX_MASK))2114 if (pVCpu->cpum.GstCtx.eflags.uBoth & (a_fTF | CPUMCTX_DBG_HIT_DRX_MASK)) 2114 2115 { 2115 2116 IEM_CTX_IMPORT_RET(pVCpu, CPUMCTX_EXTRN_DR6); 2116 2117 pVCpu->cpum.GstCtx.dr[6] &= ~X86_DR6_B_MASK; 2117 if (pVCpu->cpum.GstCtx.eflags.uBoth & X86_EFL_TF)2118 if (pVCpu->cpum.GstCtx.eflags.uBoth & a_fTF) 2118 2119 pVCpu->cpum.GstCtx.dr[6] |= X86_DR6_BS; 2119 2120 pVCpu->cpum.GstCtx.dr[6] |= (pVCpu->cpum.GstCtx.eflags.uBoth & CPUMCTX_DBG_HIT_DRX_MASK_NONSILENT) … … 2862 2863 iemRegAddToRip(pVCpu, cbInstr); 2863 2864 if (!(fEflOld & X86_EFL_TF)) 2864 return iemRegFinishClearingRF(pVCpu, VINF_SUCCESS); 2865 { 2866 /* Specialized iemRegFinishClearingRF edition here that doesn't check X86_EFL_TF. */ 2867 AssertCompile(CPUMCTX_INHIBIT_SHADOW < UINT32_MAX); 2868 if (RT_LIKELY(!( pVCpu->cpum.GstCtx.eflags.uBoth 2869 & (X86_EFL_RF | CPUMCTX_INHIBIT_SHADOW | CPUMCTX_DBG_HIT_DRX_MASK | CPUMCTX_DBG_DBGF_MASK)) )) 2870 return VINF_SUCCESS; 2871 return iemFinishInstructionWithFlagsSet<0 /*a_fTF*/>(pVCpu, VINF_SUCCESS); /* TF=0, so ignore it. */ 2872 } 2865 2873 return iemFinishInstructionWithTfSet(pVCpu); 2866 2874 }
Note:
See TracChangeset
for help on using the changeset viewer.