Changeset 47740 in vbox for trunk/src/VBox
- Timestamp:
- Aug 14, 2013 7:55:03 PM (11 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/Makefile.kmk
r47652 r47740 66 66 # VMM_COMMON_DEFS += VBOX_WITH_NS_ACCOUNTING_STATS 67 67 68 # Special IEM debug mode which compares the result with REM.68 # Special IEM debug mode which compares the result with HM/REM 69 69 ifdef IEM_VERIFICATION_MODE 70 VMM_COMMON_DEFS += IEM_VERIFICATION_MODE IEM_VERIFICATION_MODE_FULL 70 VMM_COMMON_DEFS += IEM_VERIFICATION_MODE IEM_VERIFICATION_MODE_FULL IEM_VERIFICATION_MODE_FULL_HM 71 71 endif 72 72 -
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r47713 r47740 729 729 static VBOXSTRICTRC iemVerifyFakeIOPortWrite(PIEMCPU pIemCpu, RTIOPORT Port, uint32_t u32Value, size_t cbValue); 730 730 731 static void iemHlpLoadNullDataSelectorProt(PCPUMSELREG pSReg, RTSEL uRpl);732 731 733 732 … … 2229 2228 2230 2229 /** 2230 * Loads a NULL data selector into when coming from V8086 mode. 2231 * 2232 * @param pIemCpu The IEM per CPU instance data. 2233 * @param pSReg Pointer to the segment register. 2234 */ 2235 static void iemHlpLoadNullDataSelectorOnV86Xcpt(PIEMCPU pIemCpu, PCPUMSELREG pSReg) 2236 { 2237 pSReg->Sel = 0; 2238 pSReg->ValidSel = 0; 2239 if (IEM_IS_GUEST_CPU_INTEL(pIemCpu) && !IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu)) 2240 { 2241 /* VT-x (Intel 3960x) doesn't change the base and limit, clears and sets the following attributes */ 2242 pSReg->Attr.u &= X86DESCATTR_DT | X86DESCATTR_TYPE | X86DESCATTR_DPL | X86DESCATTR_G | X86DESCATTR_D; 2243 pSReg->Attr.u |= X86DESCATTR_UNUSABLE; 2244 } 2245 else 2246 { 2247 pSReg->fFlags = CPUMSELREG_FLAGS_VALID; 2248 /** @todo check this on AMD-V */ 2249 pSReg->u64Base = 0; 2250 pSReg->u32Limit = 0; 2251 } 2252 } 2253 2254 2255 /** 2231 2256 * Implements exceptions and interrupts for protected mode. 2232 2257 * … … 2396 2421 } 2397 2422 2398 uint32_t fEfl = IEMMISC_GET_EFL(pIemCpu, pCtx);2399 2423 uint8_t const uNewCpl = DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_CONF 2400 2424 ? pIemCpu->uCpl : DescCS.Legacy.Gen.u2Dpl; 2425 uint32_t fEfl = IEMMISC_GET_EFL(pIemCpu, pCtx); 2426 if ( !(fFlags & IEM_XCPT_FLAGS_T_SOFT_INT) 2427 && (u8Vector != X86_XCPT_DE || (fFlags & IEM_XCPT_FLAGS_T_EXT_INT)) 2428 && !IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu)) 2429 fEfl |= X86_EFL_RF; /* Vagueness is all I've found on this so far... */ /** @todo Automatically pushing EFLAGS.RF. */ 2401 2430 2402 2431 /* From V8086 mode only go to CPL 0. */ … … 2527 2556 if (fEfl & X86_EFL_VM) 2528 2557 { 2529 iemHlpLoadNullDataSelector Prot(&pCtx->gs, 0);2530 iemHlpLoadNullDataSelector Prot(&pCtx->fs, 0);2531 iemHlpLoadNullDataSelector Prot(&pCtx->es, 0);2532 iemHlpLoadNullDataSelector Prot(&pCtx->ds, 0);2558 iemHlpLoadNullDataSelectorOnV86Xcpt(pIemCpu, &pCtx->gs); 2559 iemHlpLoadNullDataSelectorOnV86Xcpt(pIemCpu, &pCtx->fs); 2560 iemHlpLoadNullDataSelectorOnV86Xcpt(pIemCpu, &pCtx->es); 2561 iemHlpLoadNullDataSelectorOnV86Xcpt(pIemCpu, &pCtx->ds); 2533 2562 } 2534 2563 } … … 3812 3841 * Updates the RIP/EIP/IP to point to the next instruction. 3813 3842 * 3843 * This function leaves the EFLAGS.RF flag alone. 3844 * 3814 3845 * @param pIemCpu The per CPU data. 3815 3846 * @param cbInstr The number of bytes to add. 3816 3847 */ 3817 static void iemRegAddToRip (PIEMCPU pIemCpu, uint8_t cbInstr)3848 static void iemRegAddToRipKeepRF(PIEMCPU pIemCpu, uint8_t cbInstr) 3818 3849 { 3819 3850 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx); … … 3839 3870 3840 3871 3872 #if 0 3841 3873 /** 3842 3874 * Updates the RIP/EIP/IP to point to the next instruction. … … 3844 3876 * @param pIemCpu The per CPU data. 3845 3877 */ 3846 static void iemRegUpdateRip(PIEMCPU pIemCpu) 3847 { 3848 return iemRegAddToRip(pIemCpu, pIemCpu->offOpcode); 3878 static void iemRegUpdateRipKeepRF(PIEMCPU pIemCpu) 3879 { 3880 return iemRegAddToRipKeepRF(pIemCpu, pIemCpu->offOpcode); 3881 } 3882 #endif 3883 3884 3885 3886 /** 3887 * Updates the RIP/EIP/IP to point to the next instruction and clears EFLAGS.RF. 3888 * 3889 * @param pIemCpu The per CPU data. 3890 * @param cbInstr The number of bytes to add. 3891 */ 3892 static void iemRegAddToRipAndClearRF(PIEMCPU pIemCpu, uint8_t cbInstr) 3893 { 3894 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx); 3895 3896 pCtx->eflags.Bits.u1RF = 0; 3897 3898 switch (pIemCpu->enmCpuMode) 3899 { 3900 case IEMMODE_16BIT: 3901 Assert(pCtx->rip <= UINT16_MAX); 3902 pCtx->eip += cbInstr; 3903 pCtx->eip &= UINT32_C(0xffff); 3904 break; 3905 3906 case IEMMODE_32BIT: 3907 pCtx->eip += cbInstr; 3908 Assert(pCtx->rip <= UINT32_MAX); 3909 break; 3910 3911 case IEMMODE_64BIT: 3912 pCtx->rip += cbInstr; 3913 break; 3914 default: AssertFailed(); 3915 } 3916 } 3917 3918 3919 /** 3920 * Updates the RIP/EIP/IP to point to the next instruction and clears EFLAGS.RF. 3921 * 3922 * @param pIemCpu The per CPU data. 3923 */ 3924 static void iemRegUpdateRipAndClearRF(PIEMCPU pIemCpu) 3925 { 3926 return iemRegAddToRipAndClearRF(pIemCpu, pIemCpu->offOpcode); 3849 3927 } 3850 3928 … … 5128 5206 * The upper boundary is defined by the B bit, not the G bit! 5129 5207 */ 5130 if ( GCPtrFirst32 < pSel->u32Limit + 15131 || GCPtrLast32 > (pSel->Attr.n.u1DefBig ? 0xFFFFFFFF : 0xFFFF))5208 if ( GCPtrFirst32 < pSel->u32Limit + UINT32_C(1) 5209 || GCPtrLast32 > (pSel->Attr.n.u1DefBig ? UINT32_MAX : UINT32_C(0xffff))) 5132 5210 return iemRaiseSelectorBounds(pIemCpu, iSegReg, fAccess); 5133 5134 5211 } 5135 5212 *pGCPtrMem = GCPtrFirst32 += (uint32_t)pSel->u64Base; … … 5269 5346 /* Force the alternative path so we can ignore writes. */ 5270 5347 if ((fAccess & IEM_ACCESS_TYPE_WRITE) && !pIemCpu->fNoRem) 5348 { 5349 if (IEM_FULL_VERIFICATION_ENABLED(pIemCpu)) 5350 { 5351 int rc2 = PGMPhysIemQueryAccess(IEMCPU_TO_VM(pIemCpu), GCPhysMem, 5352 RT_BOOL(fAccess & IEM_ACCESS_TYPE_WRITE), pIemCpu->fBypassHandlers); 5353 if (RT_FAILURE(rc2)) 5354 pIemCpu->fProblematicMemory = true; 5355 } 5271 5356 return VERR_PGM_PHYS_TLB_CATCH_ALL; 5357 } 5272 5358 #endif 5273 5359 #ifdef IEM_LOG_MEMORY_WRITES … … 5291 5377 /*Log(("PGMPhysIemGCPhys2Ptr %Rrc pLock=%.*Rhxs\n", rc, sizeof(*pLock), pLock));*/ 5292 5378 AssertMsg(rc == VINF_SUCCESS || RT_FAILURE_NP(rc), ("%Rrc\n", rc)); 5379 5380 #ifdef IEM_VERIFICATION_MODE_FULL 5381 if (RT_FAILURE(rc) && IEM_FULL_VERIFICATION_ENABLED(pIemCpu)) 5382 pIemCpu->fProblematicMemory = true; 5383 #endif 5293 5384 return rc; 5294 5385 } … … 5508 5599 GCPhysSecond &= ~(RTGCPHYS)PAGE_OFFSET_MASK; 5509 5600 5601 #ifdef IEM_VERIFICATION_MODE_FULL 5602 /* 5603 * Detect problematic memory when verifying so we can select 5604 * the right execution engine. (TLB: Redo this.) 5605 */ 5606 if (IEM_FULL_VERIFICATION_ENABLED(pIemCpu)) 5607 { 5608 int rc2 = PGMPhysIemQueryAccess(IEMCPU_TO_VM(pIemCpu), GCPhysFirst, 5609 RT_BOOL(fAccess & IEM_ACCESS_TYPE_WRITE), pIemCpu->fBypassHandlers); 5610 if (RT_SUCCESS(rc2)) 5611 rc2 = PGMPhysIemQueryAccess(IEMCPU_TO_VM(pIemCpu), GCPhysSecond, 5612 RT_BOOL(fAccess & IEM_ACCESS_TYPE_WRITE), pIemCpu->fBypassHandlers); 5613 if (RT_FAILURE(rc2)) 5614 pIemCpu->fProblematicMemory = true; 5615 } 5616 #endif 5617 5618 5510 5619 /* 5511 5620 * Read in the current memory content if it's a read, execute or partial … … 7106 7215 } while (0) 7107 7216 7108 #define IEM_MC_ADVANCE_RIP() iemRegUpdateRip (pIemCpu)7217 #define IEM_MC_ADVANCE_RIP() iemRegUpdateRipAndClearRF(pIemCpu) 7109 7218 #define IEM_MC_REL_JMP_S8(a_i8) IEM_MC_RETURN_ON_FAILURE(iemRegRipRelativeJumpS8(pIemCpu, a_i8)) 7110 7219 #define IEM_MC_REL_JMP_S16(a_i16) IEM_MC_RETURN_ON_FAILURE(iemRegRipRelativeJumpS16(pIemCpu, a_i16)) … … 8544 8653 pIemCpu->fIgnoreRaxRdx = false; 8545 8654 pIemCpu->fOverlappingMovs = false; 8655 pIemCpu->fProblematicMemory = false; 8546 8656 pIemCpu->fUndefinedEFlags = 0; 8547 8657 … … 8877 8987 * @param pIemCpu The IEM per CPU data. 8878 8988 * @param pEvtRec The write record. 8879 */ 8880 static void iemVerifyWriteRecord(PIEMCPU pIemCpu, PIEMVERIFYEVTREC pEvtRec) 8989 * @param fRem Set if REM was doing the other executing. If clear 8990 * it was HM. 8991 */ 8992 static void iemVerifyWriteRecord(PIEMCPU pIemCpu, PIEMVERIFYEVTREC pEvtRec, bool fRem) 8881 8993 { 8882 8994 uint8_t abBuf[sizeof(pEvtRec->u.RamWrite.ab)]; RT_ZERO(abBuf); … … 8900 9012 if (pEvtRec->u.RamWrite.cb != 512) 8901 9013 { 9014 const char *pszWho = fRem ? "rem" : HMR3IsVmxEnabled(IEMCPU_TO_VM(pIemCpu)->pUVM) ? "vmx" : "svm"; 8902 9015 RTAssertMsg1(NULL, __LINE__, __FILE__, __PRETTY_FUNCTION__); 8903 9016 RTAssertMsg2Weak("Memory at %RGv differs\n", pEvtRec->u.RamWrite.GCPhys); 8904 RTAssertMsg2Add(" REM: %.*Rhxs\n"8905 " IEM: %.*Rhxs\n",8906 p EvtRec->u.RamWrite.cb, abBuf,9017 RTAssertMsg2Add("%s: %.*Rhxs\n" 9018 "iem: %.*Rhxs\n", 9019 pszWho, pEvtRec->u.RamWrite.cb, abBuf, 8907 9020 pEvtRec->u.RamWrite.cb, pEvtRec->u.RamWrite.ab); 8908 9021 iemVerifyAssertAddRecordDump(pEvtRec); … … 8935 9048 * Execute the instruction in REM. 8936 9049 */ 9050 bool fRem = false; 8937 9051 PVM pVM = IEMCPU_TO_VM(pIemCpu); 8938 9052 PVMCPU pVCpu = IEMCPU_TO_VMCPU(pIemCpu); 8939 9053 VBOXSTRICTRC rc = VERR_EM_CANNOT_EXEC_GUEST; 8940 #if 19054 #ifdef IEM_VERIFICATION_MODE_FULL_HM 8941 9055 if ( HMIsEnabled(pVM) 8942 9056 && pIemCpu->cIOReads == 0 8943 && pIemCpu->cIOWrites == 0) 8944 { 9057 && pIemCpu->cIOWrites == 0 9058 && !pIemCpu->fProblematicMemory) 9059 { 9060 unsigned iLoops = 0; 8945 9061 do 9062 { 8946 9063 rc = EMR3HmSingleInstruction(pVM, pVCpu, EM_ONE_INS_FLAGS_RIP_CHANGE); 8947 while ( rc == VINF_SUCCESS 8948 || ( rc == VINF_EM_DBG_STEPPED 8949 && VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS) 8950 && EMGetInhibitInterruptsPC(pVCpu) == pOrgCtx->rip) ); 9064 iLoops++; 9065 } while ( rc == VINF_SUCCESS 9066 || ( rc == VINF_EM_DBG_STEPPED 9067 && VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS) 9068 && EMGetInhibitInterruptsPC(pVCpu) == pOrgCtx->rip) 9069 || ( pOrgCtx->rip < pDebugCtx->rip 9070 && (pDebugCtx->rip - pOrgCtx->rip) < 15) 9071 && iLoops < 32); 8951 9072 } 8952 9073 #endif … … 8963 9084 AssertRC(rc); 8964 9085 EMRemUnlock(pVM); 9086 fRem = true; 8965 9087 } 8966 9088 … … 8972 9094 { 8973 9095 //Log(("REM and IEM ends up with different registers!\n")); 9096 const char *pszWho = fRem ? "rem" : HMR3IsVmxEnabled(pVM->pUVM) ? "vmx" : "svm"; 8974 9097 8975 9098 # define CHECK_FIELD(a_Field) \ 8976 do \ 9099 do \ 9100 { \ 9101 if (pOrgCtx->a_Field != pDebugCtx->a_Field) \ 8977 9102 { \ 8978 if (pOrgCtx->a_Field != pDebugCtx->a_Field) \9103 switch (sizeof(pOrgCtx->a_Field)) \ 8979 9104 { \ 8980 switch (sizeof(pOrgCtx->a_Field)) \ 8981 { \ 8982 case 1: RTAssertMsg2Weak(" %8s differs - iem=%02x - rem=%02x\n", #a_Field, pDebugCtx->a_Field, pOrgCtx->a_Field); break; \ 8983 case 2: RTAssertMsg2Weak(" %8s differs - iem=%04x - rem=%04x\n", #a_Field, pDebugCtx->a_Field, pOrgCtx->a_Field); break; \ 8984 case 4: RTAssertMsg2Weak(" %8s differs - iem=%08x - rem=%08x\n", #a_Field, pDebugCtx->a_Field, pOrgCtx->a_Field); break; \ 8985 case 8: RTAssertMsg2Weak(" %8s differs - iem=%016llx - rem=%016llx\n", #a_Field, pDebugCtx->a_Field, pOrgCtx->a_Field); break; \ 8986 default: RTAssertMsg2Weak(" %8s differs\n", #a_Field); break; \ 8987 } \ 8988 cDiffs++; \ 9105 case 1: RTAssertMsg2Weak(" %8s differs - iem=%02x - %s=%02x\n", #a_Field, pDebugCtx->a_Field, pszWho, pOrgCtx->a_Field); break; \ 9106 case 2: RTAssertMsg2Weak(" %8s differs - iem=%04x - %s=%04x\n", #a_Field, pDebugCtx->a_Field, pszWho, pOrgCtx->a_Field); break; \ 9107 case 4: RTAssertMsg2Weak(" %8s differs - iem=%08x - %s=%08x\n", #a_Field, pDebugCtx->a_Field, pszWho, pOrgCtx->a_Field); break; \ 9108 case 8: RTAssertMsg2Weak(" %8s differs - iem=%016llx - %s=%016llx\n", #a_Field, pDebugCtx->a_Field, pszWho, pOrgCtx->a_Field); break; \ 9109 default: RTAssertMsg2Weak(" %8s differs\n", #a_Field); break; \ 8989 9110 } \ 8990 } while (0) 9111 cDiffs++; \ 9112 } \ 9113 } while (0) 8991 9114 8992 9115 # define CHECK_BIT_FIELD(a_Field) \ 8993 do \ 9116 do \ 9117 { \ 9118 if (pOrgCtx->a_Field != pDebugCtx->a_Field) \ 8994 9119 { \ 8995 if (pOrgCtx->a_Field != pDebugCtx->a_Field) \ 8996 { \ 8997 RTAssertMsg2Weak(" %8s differs - iem=%02x - rem=%02x\n", #a_Field, pDebugCtx->a_Field, pOrgCtx->a_Field); \ 8998 cDiffs++; \ 8999 } \ 9000 } while (0) 9120 RTAssertMsg2Weak(" %8s differs - iem=%02x - %s=%02x\n", #a_Field, pDebugCtx->a_Field, pszWho, pOrgCtx->a_Field); \ 9121 cDiffs++; \ 9122 } \ 9123 } while (0) 9001 9124 9002 9125 # define CHECK_SEL(a_Sel) \ 9003 9004 9005 9006 9007 9008 9009 9010 9126 do \ 9127 { \ 9128 CHECK_FIELD(a_Sel.Sel); \ 9129 CHECK_FIELD(a_Sel.Attr.u); \ 9130 CHECK_FIELD(a_Sel.u64Base); \ 9131 CHECK_FIELD(a_Sel.u32Limit); \ 9132 CHECK_FIELD(a_Sel.fFlags); \ 9133 } while (0) 9011 9134 9012 9135 #if 1 /* The recompiler doesn't update these the intel way. */ 9013 pOrgCtx->fpu.FOP = pDebugCtx->fpu.FOP; 9014 pOrgCtx->fpu.FPUIP = pDebugCtx->fpu.FPUIP; 9015 pOrgCtx->fpu.CS = pDebugCtx->fpu.CS; 9016 pOrgCtx->fpu.Rsrvd1 = pDebugCtx->fpu.Rsrvd1; 9017 pOrgCtx->fpu.FPUDP = pDebugCtx->fpu.FPUDP; 9018 pOrgCtx->fpu.DS = pDebugCtx->fpu.DS; 9019 pOrgCtx->fpu.Rsrvd2 = pDebugCtx->fpu.Rsrvd2; 9020 pOrgCtx->fpu.MXCSR_MASK = pDebugCtx->fpu.MXCSR_MASK; /* only for the time being - old snapshots here. */ 9021 if ((pOrgCtx->fpu.FSW & X86_FSW_TOP_MASK) == (pDebugCtx->fpu.FSW & X86_FSW_TOP_MASK)) 9022 pOrgCtx->fpu.FSW = pDebugCtx->fpu.FSW; 9136 if (fRem) 9137 { 9138 pOrgCtx->fpu.FOP = pDebugCtx->fpu.FOP; 9139 pOrgCtx->fpu.FPUIP = pDebugCtx->fpu.FPUIP; 9140 pOrgCtx->fpu.CS = pDebugCtx->fpu.CS; 9141 pOrgCtx->fpu.Rsrvd1 = pDebugCtx->fpu.Rsrvd1; 9142 pOrgCtx->fpu.FPUDP = pDebugCtx->fpu.FPUDP; 9143 pOrgCtx->fpu.DS = pDebugCtx->fpu.DS; 9144 pOrgCtx->fpu.Rsrvd2 = pDebugCtx->fpu.Rsrvd2; 9145 //pOrgCtx->fpu.MXCSR_MASK = pDebugCtx->fpu.MXCSR_MASK; 9146 if ((pOrgCtx->fpu.FSW & X86_FSW_TOP_MASK) == (pDebugCtx->fpu.FSW & X86_FSW_TOP_MASK)) 9147 pOrgCtx->fpu.FSW = pDebugCtx->fpu.FSW; 9148 } 9023 9149 #endif 9024 9150 if (memcmp(&pOrgCtx->fpu, &pDebugCtx->fpu, sizeof(pDebugCtx->fpu))) … … 9069 9195 if ((pOrgCtx->rflags.u & fFlagsMask) != (pDebugCtx->rflags.u & fFlagsMask)) 9070 9196 { 9071 RTAssertMsg2Weak(" rflags differs - iem=%08llx rem=%08llx\n", pDebugCtx->rflags.u, pOrgCtx->rflags.u);9197 RTAssertMsg2Weak(" rflags differs - iem=%08llx %s=%08llx\n", pDebugCtx->rflags.u, pszWho, pOrgCtx->rflags.u); 9072 9198 CHECK_BIT_FIELD(rflags.Bits.u1CF); 9073 9199 CHECK_BIT_FIELD(rflags.Bits.u1Reserved0); … … 9085 9211 CHECK_BIT_FIELD(rflags.Bits.u1NT); 9086 9212 CHECK_BIT_FIELD(rflags.Bits.u1Reserved3); 9087 CHECK_BIT_FIELD(rflags.Bits.u1RF); 9213 if (fRem) 9214 CHECK_BIT_FIELD(rflags.Bits.u1RF); 9088 9215 CHECK_BIT_FIELD(rflags.Bits.u1VM); 9089 9216 CHECK_BIT_FIELD(rflags.Bits.u1AC); … … 9116 9243 CHECK_SEL(gs); 9117 9244 CHECK_FIELD(cr0); 9118 /* Klugde #1: REM fetches code and accross the page boundrary and faults on the next page, while we execute 9245 9246 /* Klugde #1: REM fetches code and across the page boundrary and faults on the next page, while we execute 9119 9247 the faulting instruction first: 001b:77f61ff3 66 8b 42 02 mov ax, word [edx+002h] (NT4SP1) */ 9120 9248 /* Kludge #2: CR2 differs slightly on cross page boundrary faults, we report the last address of the access … … 9122 9250 if (pOrgCtx->cr2 != pDebugCtx->cr2) 9123 9251 { 9124 if (pIemCpu->uOldCs == 0x1b && pIemCpu->uOldRip == 0x77f61ff3 )9252 if (pIemCpu->uOldCs == 0x1b && pIemCpu->uOldRip == 0x77f61ff3 && fRem) 9125 9253 { /* ignore */ } 9126 9254 else if ( (pOrgCtx->cr2 & ~(uint64_t)3) == (pDebugCtx->cr2 & ~(uint64_t)3) 9127 && (pOrgCtx->cr2 & PAGE_OFFSET_MASK) == 0) 9255 && (pOrgCtx->cr2 & PAGE_OFFSET_MASK) == 0 9256 && fRem) 9128 9257 { /* ignore */ } 9129 9258 else … … 9137 9266 CHECK_FIELD(dr[3]); 9138 9267 CHECK_FIELD(dr[6]); 9139 if ( (pOrgCtx->dr[7] & ~X86_DR7_RA1_MASK) != (pDebugCtx->dr[7] & ~X86_DR7_RA1_MASK)) /* REM 'mov drX,greg' bug.*/9268 if (!fRem || (pOrgCtx->dr[7] & ~X86_DR7_RA1_MASK) != (pDebugCtx->dr[7] & ~X86_DR7_RA1_MASK)) /* REM 'mov drX,greg' bug.*/ 9140 9269 CHECK_FIELD(dr[7]); 9141 9270 CHECK_FIELD(gdtr.cbGdt); … … 9188 9317 { 9189 9318 if (pIemRec->enmEvent == IEMVERIFYEVENT_RAM_WRITE) 9190 iemVerifyWriteRecord(pIemCpu, pIemRec );9319 iemVerifyWriteRecord(pIemCpu, pIemRec, fRem); 9191 9320 pIemRec = pIemRec->pNext; 9192 9321 } … … 9238 9367 { 9239 9368 if (pIemRec->enmEvent == IEMVERIFYEVENT_RAM_WRITE) 9240 iemVerifyWriteRecord(pIemCpu, pIemRec );9369 iemVerifyWriteRecord(pIemCpu, pIemRec, fRem); 9241 9370 pIemRec = pIemRec->pNext; 9242 9371 } -
trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h
r47699 r47740 183 183 pCtx->eflags.u &= ~(fToUpdate | fUndefined); 184 184 pCtx->eflags.u |= (fToUpdate | fUndefined) & fEFlags; 185 #ifdef IEM_VERIFICATION_MODE_FULL 186 pIemCpu->fUndefinedEFlags |= fUndefined; 187 #endif 185 188 } 186 189 … … 190 193 * visible parts, in protected mode. 191 194 * 195 * @param pIemCpu The IEM state of the calling EMT. 192 196 * @param pSReg Pointer to the segment register. 193 197 * @param uRpl The RPL. 194 198 */ 195 static void iemHlpLoadNullDataSelectorProt(P CPUMSELREG pSReg, RTSEL uRpl)199 static void iemHlpLoadNullDataSelectorProt(PIEMCPU pIemCpu, PCPUMSELREG pSReg, RTSEL uRpl) 196 200 { 197 201 /** @todo Testcase: write a testcase checking what happends when loading a NULL … … 200 204 pSReg->ValidSel = uRpl; 201 205 pSReg->fFlags = CPUMSELREG_FLAGS_VALID; 202 pSReg->u64Base = 0; 203 pSReg->u32Limit = 0; 204 pSReg->Attr.u = X86DESCATTR_UNUSABLE; 206 if (IEM_IS_GUEST_CPU_INTEL(pIemCpu) && !IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu)) 207 { 208 /* VT-x (Intel 3960x) observed doing something like this. */ 209 pSReg->Attr.u = X86DESCATTR_UNUSABLE | X86DESCATTR_G | X86DESCATTR_D; 210 pSReg->u32Limit = UINT32_MAX; 211 pSReg->u64Base = 0; 212 } 213 else 214 { 215 pSReg->Attr.u = X86DESCATTR_UNUSABLE; 216 pSReg->u32Limit = 0; 217 pSReg->u64Base = 0; 218 } 205 219 } 206 220 … … 225 239 && (pSReg->Attr.n.u4Type & (X86_SEL_TYPE_CODE | X86_SEL_TYPE_CONF)) 226 240 != (X86_SEL_TYPE_CODE | X86_SEL_TYPE_CONF)) /* not conforming code */ 227 iemHlpLoadNullDataSelectorProt(p SReg, 0);241 iemHlpLoadNullDataSelectorProt(pIemCpu, pSReg, 0); 228 242 } 229 243 … … 288 302 { 289 303 pCtx->rsp = TmpRsp.u; 290 iemRegAddToRip (pIemCpu, cbInstr);304 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 291 305 } 292 306 } … … 309 323 { 310 324 iemRegAddToRsp(pIemCpu, pCtx, 16); 311 iemRegAddToRip (pIemCpu, cbInstr);325 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 312 326 } 313 327 } … … 369 383 #endif 370 384 pCtx->rsp = TmpRsp.u; 371 iemRegAddToRip (pIemCpu, cbInstr);385 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 372 386 } 373 387 } … … 390 404 { 391 405 iemRegAddToRsp(pIemCpu, pCtx, 32); 392 iemRegAddToRip (pIemCpu, cbInstr);406 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 393 407 } 394 408 } … … 440 454 { 441 455 pCtx->rsp = TmpRsp.u; 442 iemRegAddToRip (pIemCpu, cbInstr);456 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 443 457 } 444 458 } … … 462 476 { 463 477 iemRegSubFromRsp(pIemCpu, pCtx, 16); 464 iemRegAddToRip (pIemCpu, cbInstr);478 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 465 479 } 466 480 } … … 512 526 { 513 527 pCtx->rsp = TmpRsp.u; 514 iemRegAddToRip (pIemCpu, cbInstr);528 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 515 529 } 516 530 } … … 534 548 { 535 549 iemRegSubFromRsp(pIemCpu, pCtx, 32); 536 iemRegAddToRip (pIemCpu, cbInstr);550 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 537 551 } 538 552 } … … 591 605 return rcStrict; 592 606 593 iemRegAddToRip (pIemCpu, cbInstr);607 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 594 608 return VINF_SUCCESS; 595 609 } … … 730 744 Assert(fEflNew & RT_BIT_32(1)); 731 745 IEMMISC_SET_EFL(pIemCpu, pCtx, fEflNew); 732 iemRegAddToRip (pIemCpu, cbInstr);746 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 733 747 734 748 return VINF_SUCCESS; … … 755 769 756 770 pCtx->rip = uNewPC; 771 pCtx->eflags.Bits.u1RF = 0; 757 772 return VINF_SUCCESS; 758 759 773 } 760 774 … … 778 792 779 793 pCtx->rip = uNewPC; 794 pCtx->eflags.Bits.u1RF = 0; 780 795 return VINF_SUCCESS; 781 796 } … … 801 816 802 817 pCtx->rip = uNewPC; 818 pCtx->eflags.Bits.u1RF = 0; 803 819 return VINF_SUCCESS; 804 805 820 } 806 821 … … 824 839 825 840 pCtx->rip = uNewPC; 841 pCtx->eflags.Bits.u1RF = 0; 826 842 return VINF_SUCCESS; 827 843 } … … 847 863 848 864 pCtx->rip = uNewPC; 865 pCtx->eflags.Bits.u1RF = 0; 849 866 return VINF_SUCCESS; 850 851 867 } 852 868 … … 870 886 871 887 pCtx->rip = uNewPC; 888 pCtx->eflags.Bits.u1RF = 0; 872 889 return VINF_SUCCESS; 873 890 } … … 885 902 IEM_CIMPL_DEF_4(iemCImpl_BranchTaskSegment, uint16_t, uSel, IEMBRANCH, enmBranch, IEMMODE, enmEffOpSize, PIEMSELDESC, pDesc) 886 903 { 887 /* Call various functions to do the work. */904 /* Call various functions to do the work. Clear RF? */ 888 905 IEM_RETURN_ASPECT_NOT_IMPLEMENTED(); 889 906 } … … 901 918 IEM_CIMPL_DEF_4(iemCImpl_BranchTaskGate, uint16_t, uSel, IEMBRANCH, enmBranch, IEMMODE, enmEffOpSize, PIEMSELDESC, pDesc) 902 919 { 903 /* Call various functions to do the work. */920 /* Call various functions to do the work. Don't clear RF */ 904 921 IEM_RETURN_ASPECT_NOT_IMPLEMENTED(); 905 922 } … … 917 934 IEM_CIMPL_DEF_4(iemCImpl_BranchCallGate, uint16_t, uSel, IEMBRANCH, enmBranch, IEMMODE, enmEffOpSize, PIEMSELDESC, pDesc) 918 935 { 919 /* Call various functions to do the work. */936 /* Call various functions to do the work. Clear RF. */ 920 937 IEM_RETURN_ASPECT_NOT_IMPLEMENTED(); 921 938 } … … 1017 1034 pCtx->cs.fFlags = CPUMSELREG_FLAGS_VALID; 1018 1035 pCtx->cs.u64Base = (uint32_t)uSel << 4; 1036 pCtx->eflags.Bits.u1RF = 0; 1019 1037 return VINF_SUCCESS; 1020 1038 } … … 1131 1149 pCtx->cs.u32Limit = cbLimit; 1132 1150 pCtx->cs.u64Base = u64Base; 1151 pCtx->eflags.Bits.u1RF = 0; 1133 1152 /** @todo check if the hidden bits are loaded correctly for 64-bit 1134 1153 * mode. */ … … 1194 1213 pCtx->cs.fFlags = CPUMSELREG_FLAGS_VALID; 1195 1214 pCtx->cs.u64Base = (uint32_t)uSel << 4; 1215 pCtx->eflags.Bits.u1RF = 0; 1196 1216 return VINF_SUCCESS; 1197 1217 } … … 1346 1366 pCtx->cs.u32Limit = cbLimit; 1347 1367 pCtx->cs.u64Base = u64Base; 1368 pCtx->eflags.Bits.u1RF = 0; 1348 1369 /** @todo check if the hidden bits are loaded correctly for 64-bit 1349 1370 * mode. */ … … 1417 1438 pCtx->cs.fFlags = CPUMSELREG_FLAGS_VALID; 1418 1439 pCtx->cs.u64Base = (uint32_t)uNewCs << 4; 1440 pCtx->eflags.Bits.u1RF = 0; 1419 1441 /** @todo do we load attribs and limit as well? */ 1420 1442 if (cbPop) … … 1669 1691 if (cbPop) 1670 1692 iemRegAddToRsp(pIemCpu, pCtx, cbPop); 1693 pCtx->eflags.Bits.u1RF = 0; 1671 1694 1672 1695 /* Done! */ … … 1733 1756 if (cbPop) 1734 1757 iemRegAddToRsp(pIemCpu, pCtx, cbPop); 1758 pCtx->eflags.Bits.u1RF = 0; 1735 1759 } 1736 1760 return VINF_SUCCESS; … … 1801 1825 if (cbPop) 1802 1826 iemRegAddToRsp(pIemCpu, pCtx, cbPop); 1827 pCtx->eflags.Bits.u1RF = 0; 1803 1828 1804 1829 return VINF_SUCCESS; … … 1915 1940 pCtx->rbp = NewRbp.u; 1916 1941 pCtx->rsp = NewRsp.u; 1917 iemRegAddToRip (pIemCpu, cbInstr);1942 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 1918 1943 1919 1944 return VINF_SUCCESS; … … 1972 1997 pCtx->rbp = NewRbp.u; 1973 1998 pCtx->rsp = NewRsp.u; 1974 iemRegAddToRip (pIemCpu, cbInstr);1999 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 1975 2000 1976 2001 return VINF_SUCCESS; … … 3082 3107 #endif 3083 3108 CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_HIDDEN_SEL_REGS); 3084 iemRegAddToRip (pIemCpu, cbInstr);3109 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 3085 3110 return VINF_SUCCESS; 3086 3111 } … … 3112 3137 3113 3138 *pSel = uSel; /* Not RPL, remember :-) */ 3114 iemHlpLoadNullDataSelectorProt(p Hid, uSel);3139 iemHlpLoadNullDataSelectorProt(pIemCpu, pHid, uSel); 3115 3140 if (iSegReg == X86_SREG_SS) 3116 3141 pHid->Attr.u |= pIemCpu->uCpl << X86DESCATTR_DPL_SHIFT; … … 3119 3144 CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_HIDDEN_SEL_REGS); 3120 3145 3121 iemRegAddToRip (pIemCpu, cbInstr);3146 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 3122 3147 return VINF_SUCCESS; 3123 3148 } … … 3230 3255 3231 3256 CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_HIDDEN_SEL_REGS); 3232 iemRegAddToRip (pIemCpu, cbInstr);3257 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 3233 3258 return VINF_SUCCESS; 3234 3259 } … … 3459 3484 pIemCpu->CTX_SUFF(pCtx)->eflags.Bits.u1ZF = fAccessible; 3460 3485 3461 iemRegAddToRip (pIemCpu, cbInstr);3486 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 3462 3487 return VINF_SUCCESS; 3463 3488 } … … 3565 3590 /* commit flags value and advance rip. */ 3566 3591 pIemCpu->CTX_SUFF(pCtx)->eflags.Bits.u1ZF = fDescOk; 3567 iemRegAddToRip (pIemCpu, cbInstr);3592 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 3568 3593 3569 3594 return VINF_SUCCESS; … … 3619 3644 } 3620 3645 if (rcStrict == VINF_SUCCESS) 3621 iemRegAddToRip (pIemCpu, cbInstr);3646 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 3622 3647 } 3623 3648 return rcStrict; … … 3642 3667 VBOXSTRICTRC rcStrict = iemMemStoreDataXdtr(pIemCpu, pCtx->gdtr.cbGdt, pCtx->gdtr.pGdt, iEffSeg, GCPtrEffDst, enmEffOpSize); 3643 3668 if (rcStrict == VINF_SUCCESS) 3644 iemRegAddToRip (pIemCpu, cbInstr);3669 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 3645 3670 return rcStrict; 3646 3671 } … … 3676 3701 pCtx->idtr.pIdt = GCPtrBase; 3677 3702 } 3678 iemRegAddToRip (pIemCpu, cbInstr);3703 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 3679 3704 } 3680 3705 return rcStrict; … … 3699 3724 VBOXSTRICTRC rcStrict = iemMemStoreDataXdtr(pIemCpu, pCtx->idtr.cbIdt, pCtx->idtr.pIdt, iEffSeg, GCPtrEffDst, enmEffOpSize); 3700 3725 if (rcStrict == VINF_SUCCESS) 3701 iemRegAddToRip (pIemCpu, cbInstr);3726 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 3702 3727 return rcStrict; 3703 3728 } … … 3744 3769 pCtx->ldtr.ValidSel = uNewLdt; 3745 3770 pCtx->ldtr.fFlags = CPUMSELREG_FLAGS_VALID; 3746 pCtx->ldtr.Attr.u = X86DESCATTR_UNUSABLE; 3747 if (!IEM_IS_GUEST_CPU_AMD(pIemCpu) || !IEM_VERIFICATION_ENABLED(pIemCpu)) /* See bs-cpu-hidden-regs-1 on AMD. */ 3748 { 3771 if (!IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu)) 3772 { 3773 pCtx->ldtr.Attr.u = X86DESCATTR_UNUSABLE; 3774 pCtx->ldtr.u64Base = pCtx->ldtr.u32Limit = 0; /* For verfication against REM. */ 3775 } 3776 else if (IEM_IS_GUEST_CPU_AMD(pIemCpu)) 3777 { 3778 /* AMD-V seems to leave the base and limit alone. */ 3779 pCtx->ldtr.Attr.u = X86DESCATTR_UNUSABLE; 3780 } 3781 else if (!IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu)) 3782 { 3783 /* VT-x (Intel 3960x) seems to be doing the following. */ 3784 pCtx->ldtr.Attr.u = X86DESCATTR_UNUSABLE | X86DESCATTR_G | X86DESCATTR_D; 3749 3785 pCtx->ldtr.u64Base = 0; 3750 pCtx->ldtr.u32Limit = 0;3751 } 3752 3753 iemRegAddToRip (pIemCpu, cbInstr);3786 pCtx->ldtr.u32Limit = UINT32_MAX; 3787 } 3788 3789 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 3754 3790 return VINF_SUCCESS; 3755 3791 } … … 3814 3850 pCtx->ldtr.u64Base = u64Base; 3815 3851 3816 iemRegAddToRip (pIemCpu, cbInstr);3852 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 3817 3853 return VINF_SUCCESS; 3818 3854 } … … 3935 3971 pCtx->tr.u64Base = u64Base; 3936 3972 3937 iemRegAddToRip (pIemCpu, cbInstr);3973 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 3938 3974 return VINF_SUCCESS; 3939 3975 } … … 3980 4016 *(uint64_t *)iemGRegRef(pIemCpu, iGReg) = (uint32_t)crX; 3981 4017 3982 iemRegAddToRip (pIemCpu, cbInstr);4018 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 3983 4019 return VINF_SUCCESS; 3984 4020 } … … 4278 4314 if (rcStrict != VINF_SUCCESS) 4279 4315 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict); 4280 iemRegAddToRip (pIemCpu, cbInstr);4316 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 4281 4317 } 4282 4318 … … 4409 4445 *(uint64_t *)iemGRegRef(pIemCpu, iGReg) = (uint32_t)drX; 4410 4446 4411 iemRegAddToRip (pIemCpu, cbInstr);4447 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 4412 4448 return VINF_SUCCESS; 4413 4449 } … … 4505 4541 pCtx->dr[iDrReg] = uNewDrX; 4506 4542 4507 iemRegAddToRip (pIemCpu, cbInstr);4543 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 4508 4544 return VINF_SUCCESS; 4509 4545 } … … 4524 4560 4525 4561 int rc = PGMInvalidatePage(IEMCPU_TO_VMCPU(pIemCpu), GCPtrPage); 4526 iemRegAddToRip (pIemCpu, cbInstr);4562 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 4527 4563 4528 4564 if (rc == VINF_SUCCESS) … … 4567 4603 #endif 4568 4604 4569 iemRegAddToRip (pIemCpu, cbInstr);4605 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 4570 4606 return VINF_SUCCESS; 4571 4607 } … … 4602 4638 pCtx->rdx = uValue.s.Hi; 4603 4639 4604 iemRegAddToRip (pIemCpu, cbInstr);4640 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 4605 4641 return VINF_SUCCESS; 4606 4642 } … … 4647 4683 } 4648 4684 4649 iemRegAddToRip (pIemCpu, cbInstr);4685 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 4650 4686 return VINF_SUCCESS; 4651 4687 } … … 4686 4722 default: AssertFailedReturn(VERR_INTERNAL_ERROR_3); 4687 4723 } 4688 iemRegAddToRip (pIemCpu, cbInstr);4724 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 4689 4725 pIemCpu->cPotentialExits++; 4690 4726 if (rcStrict != VINF_SUCCESS) … … 4756 4792 if (IOM_SUCCESS(rcStrict)) 4757 4793 { 4758 iemRegAddToRip (pIemCpu, cbInstr);4794 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 4759 4795 pIemCpu->cPotentialExits++; 4760 4796 if (rcStrict != VINF_SUCCESS) … … 4828 4864 /* Commit. */ 4829 4865 IEMMISC_SET_EFL(pIemCpu, pCtx, fEfl); 4830 iemRegAddToRip (pIemCpu, cbInstr);4866 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 4831 4867 Log2(("CLI: %#x -> %#x\n", fEflOld, fEfl)); NOREF(fEflOld); 4832 4868 return VINF_SUCCESS; … … 4874 4910 /* Commit. */ 4875 4911 IEMMISC_SET_EFL(pIemCpu, pCtx, fEfl); 4876 iemRegAddToRip (pIemCpu, cbInstr);4877 if ((!(fEflOld & X86_EFL_IF) && (fEfl & X86_EFL_IF)) || IEM_ VERIFICATION_ENABLED(pIemCpu))4912 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 4913 if ((!(fEflOld & X86_EFL_IF) && (fEfl & X86_EFL_IF)) || IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu)) 4878 4914 EMSetInhibitInterruptsPC(IEMCPU_TO_VMCPU(pIemCpu), pCtx->rip); 4879 4915 Log2(("STI: %#x -> %#x\n", fEflOld, fEfl)); … … 4889 4925 if (pIemCpu->uCpl != 0) 4890 4926 return iemRaiseGeneralProtectionFault0(pIemCpu); 4891 iemRegAddToRip (pIemCpu, cbInstr);4927 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 4892 4928 return VINF_EM_HALT; 4893 4929 } … … 4943 4979 Assert(rcStrict == VINF_SUCCESS); 4944 4980 4945 iemRegAddToRip (pIemCpu, cbInstr);4981 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 4946 4982 return rcStrict; 4947 4983 } … … 4999 5035 VBOXSTRICTRC rcStrict = EMMonitorWaitPerform(IEMCPU_TO_VMCPU(pIemCpu), uEax, uEcx); 5000 5036 5001 iemRegAddToRip (pIemCpu, cbInstr);5037 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 5002 5038 return rcStrict; 5003 5039 } … … 5028 5064 pCtx->gs.u64Base = uOtherGsBase; 5029 5065 5030 iemRegAddToRip (pIemCpu, cbInstr);5066 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 5031 5067 return VINF_SUCCESS; 5032 5068 } … … 5046 5082 pCtx->rdx &= UINT32_C(0xffffffff); 5047 5083 5048 iemRegAddToRip (pIemCpu, cbInstr);5084 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 5049 5085 return VINF_SUCCESS; 5050 5086 } … … 5067 5103 X86_EFL_OF | X86_EFL_AF | X86_EFL_CF); 5068 5104 5069 iemRegAddToRip (pIemCpu, cbInstr);5105 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 5070 5106 return VINF_SUCCESS; 5071 5107 } … … 5090 5126 X86_EFL_OF | X86_EFL_AF | X86_EFL_CF); 5091 5127 5092 iemRegAddToRip (pIemCpu, cbInstr);5128 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 5093 5129 return VINF_SUCCESS; 5094 5130 } … … 5183 5219 5184 5220 iemHlpUsedFpu(pIemCpu); 5185 iemRegAddToRip (pIemCpu, cbInstr);5221 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 5186 5222 return VINF_SUCCESS; 5187 5223 } … … 5280 5316 return rcStrict; 5281 5317 5282 iemRegAddToRip (pIemCpu, cbInstr);5318 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 5283 5319 return VINF_SUCCESS; 5284 5320 } … … 5393 5429 5394 5430 iemHlpUsedFpu(pIemCpu); 5395 iemRegAddToRip (pIemCpu, cbInstr);5431 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 5396 5432 return VINF_SUCCESS; 5397 5433 } … … 5549 5585 5550 5586 /* Note: C0, C1, C2 and C3 are documented as undefined, we leave them untouched! */ 5551 iemRegAddToRip (pIemCpu, cbInstr);5587 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 5552 5588 return VINF_SUCCESS; 5553 5589 } … … 5597 5633 5598 5634 iemHlpUsedFpu(pIemCpu); 5599 iemRegAddToRip (pIemCpu, cbInstr);5635 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 5600 5636 return VINF_SUCCESS; 5601 5637 } … … 5626 5662 5627 5663 iemHlpUsedFpu(pIemCpu); 5628 iemRegAddToRip (pIemCpu, cbInstr);5664 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 5629 5665 return VINF_SUCCESS; 5630 5666 } … … 5661 5697 5662 5698 iemHlpUsedFpu(pIemCpu); 5663 iemRegAddToRip (pIemCpu, cbInstr);5699 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 5664 5700 return VINF_SUCCESS; 5665 5701 } … … 5685 5721 /* Note: C0, C1, C2 and C3 are documented as undefined, we leave them untouched! */ 5686 5722 iemHlpUsedFpu(pIemCpu); 5687 iemRegAddToRip (pIemCpu, cbInstr);5723 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 5688 5724 return VINF_SUCCESS; 5689 5725 } … … 5734 5770 iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx); 5735 5771 iemHlpUsedFpu(pIemCpu); 5736 iemRegAddToRip (pIemCpu, cbInstr);5772 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 5737 5773 return VINF_SUCCESS; 5738 5774 } … … 5803 5839 iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx); 5804 5840 iemHlpUsedFpu(pIemCpu); 5805 iemRegAddToRip (pIemCpu, cbInstr);5841 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 5806 5842 return VINF_SUCCESS; 5807 5843 } -
trunk/src/VBox/VMM/VMMAll/IEMAllCImplStrInstr.cpp.h
r47707 r47740 76 76 if (uCounterReg == 0) 77 77 { 78 iemRegAddToRip (pIemCpu, cbInstr);78 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 79 79 return VINF_SUCCESS; 80 80 } … … 214 214 * Done. 215 215 */ 216 iemRegAddToRip (pIemCpu, cbInstr);216 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 217 217 return VINF_SUCCESS; 218 218 } … … 232 232 if (uCounterReg == 0) 233 233 { 234 iemRegAddToRip (pIemCpu, cbInstr);234 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 235 235 return VINF_SUCCESS; 236 236 } … … 370 370 * Done. 371 371 */ 372 iemRegAddToRip (pIemCpu, cbInstr);372 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 373 373 return VINF_SUCCESS; 374 374 } … … 388 388 if (uCounterReg == 0) 389 389 { 390 iemRegAddToRip (pIemCpu, cbInstr);390 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 391 391 return VINF_SUCCESS; 392 392 } … … 492 492 * Done. 493 493 */ 494 iemRegAddToRip (pIemCpu, cbInstr);494 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 495 495 return VINF_SUCCESS; 496 496 } … … 510 510 if (uCounterReg == 0) 511 511 { 512 iemRegAddToRip (pIemCpu, cbInstr);512 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 513 513 return VINF_SUCCESS; 514 514 } … … 613 613 * Done. 614 614 */ 615 iemRegAddToRip (pIemCpu, cbInstr);615 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 616 616 return VINF_SUCCESS; 617 617 } … … 633 633 if (uCounterReg == 0) 634 634 { 635 iemRegAddToRip (pIemCpu, cbInstr);635 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 636 636 return VINF_SUCCESS; 637 637 } … … 776 776 * Done. 777 777 */ 778 iemRegAddToRip (pIemCpu, cbInstr);778 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 779 779 return VINF_SUCCESS; 780 780 } … … 794 794 if (uCounterReg == 0) 795 795 { 796 iemRegAddToRip (pIemCpu, cbInstr);796 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 797 797 return VINF_SUCCESS; 798 798 } … … 896 896 * Done. 897 897 */ 898 iemRegAddToRip (pIemCpu, cbInstr);898 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 899 899 return VINF_SUCCESS; 900 900 } … … 914 914 if (uCounterReg == 0) 915 915 { 916 iemRegAddToRip (pIemCpu, cbInstr);916 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 917 917 return VINF_SUCCESS; 918 918 } … … 1008 1008 * Done. 1009 1009 */ 1010 iemRegAddToRip (pIemCpu, cbInstr);1010 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 1011 1011 return VINF_SUCCESS; 1012 1012 } … … 1064 1064 else 1065 1065 pCtx->ADDR_rDI -= OP_SIZE / 8; 1066 iemRegAddToRip (pIemCpu, cbInstr);1066 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 1067 1067 } 1068 1068 /* iemMemMap already check permissions, so this may only be real errors … … 1101 1101 if (uCounterReg == 0) 1102 1102 { 1103 iemRegAddToRip (pIemCpu, cbInstr);1103 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 1104 1104 return VINF_SUCCESS; 1105 1105 } … … 1181 1181 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict); 1182 1182 if (uCounterReg == 0) 1183 iemRegAddToRip (pIemCpu, cbInstr);1183 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 1184 1184 } 1185 1185 iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_W, puMem, &PgLockMem); … … 1236 1236 { 1237 1237 if (uCounterReg == 0) 1238 iemRegAddToRip (pIemCpu, cbInstr);1238 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 1239 1239 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict); 1240 1240 return rcStrict; … … 1246 1246 * Done. 1247 1247 */ 1248 iemRegAddToRip (pIemCpu, cbInstr);1248 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 1249 1249 return VINF_SUCCESS; 1250 1250 } … … 1286 1286 else 1287 1287 pCtx->ADDR_rSI -= OP_SIZE / 8; 1288 iemRegAddToRip (pIemCpu, cbInstr);1288 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 1289 1289 if (rcStrict != VINF_SUCCESS) 1290 1290 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict); … … 1319 1319 if (uCounterReg == 0) 1320 1320 { 1321 iemRegAddToRip (pIemCpu, cbInstr);1321 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 1322 1322 return VINF_SUCCESS; 1323 1323 } … … 1390 1390 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict); 1391 1391 if (uCounterReg == 0) 1392 iemRegAddToRip (pIemCpu, cbInstr);1392 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 1393 1393 } 1394 1394 iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem); … … 1441 1441 { 1442 1442 if (uCounterReg == 0) 1443 iemRegAddToRip (pIemCpu, cbInstr);1443 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 1444 1444 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict); 1445 1445 } … … 1452 1452 * Done. 1453 1453 */ 1454 iemRegAddToRip (pIemCpu, cbInstr);1454 iemRegAddToRipAndClearRF(pIemCpu, cbInstr); 1455 1455 return VINF_SUCCESS; 1456 1456 } -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
r47669 r47740 10190 10190 { 10191 10191 pCtx->rsp = TmpRsp.u; 10192 iemRegUpdateRip (pIemCpu);10192 iemRegUpdateRipAndClearRF(pIemCpu); 10193 10193 } 10194 10194 return rcStrict; -
trunk/src/VBox/VMM/include/IEMInternal.h
r47568 r47740 261 261 * was executed, causing the memory write records to be incorrrect. */ 262 262 bool fOverlappingMovs; 263 /** Set if there are problematic memory accesses (MMIO, write monitored, ++). */ 264 bool fProblematicMemory; 263 265 /** This is used to communicate a CPL changed caused by IEMInjectTrap that 264 266 * CPUM doesn't yet reflect. */ 265 267 uint8_t uInjectCpl; 266 bool afAlignment2[ 4];268 bool afAlignment2[3]; 267 269 /** Mask of undefined eflags. 268 270 * The verifier will any difference in these flags. */ … … 534 536 * Tests if full verification mode is enabled. 535 537 * 536 * This expands to @c false when IEM_VERIFICATION_MODE is not defined and538 * This expands to @c false when IEM_VERIFICATION_MODE_FULL is not defined and 537 539 * should therefore cause the compiler to eliminate the verification branch 538 540 * of an if statement. */ … … 541 543 #else 542 544 # define IEM_FULL_VERIFICATION_ENABLED(a_pIemCpu) (false) 545 #endif 546 547 /** 548 * Tests if full verification mode is enabled again REM. 549 * 550 * This expands to @c false when IEM_VERIFICATION_MODE_FULL is not defined and 551 * should therefore cause the compiler to eliminate the verification branch 552 * of an if statement. */ 553 #ifdef IEM_VERIFICATION_MODE_FULL 554 # ifdef IEM_VERIFICATION_MODE_FULL_HM 555 # define IEM_FULL_VERIFICATION_REM_ENABLED(a_pIemCpu) (!(a_pIemCpu)->fNoRem && !HMIsEnabled(IEMCPU_TO_VM(a_pIemCpu))) 556 # else 557 # define IEM_FULL_VERIFICATION_REM_ENABLED(a_pIemCpu) (!(a_pIemCpu)->fNoRem) 558 # endif 559 #else 560 # define IEM_FULL_VERIFICATION_REM_ENABLED(a_pIemCpu) (false) 543 561 #endif 544 562
Note:
See TracChangeset
for help on using the changeset viewer.