Changeset 61968 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Jun 30, 2016 5:42:31 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 108414
- Location:
- trunk/src/VBox/VMM/VMMAll
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r61899 r61968 896 896 * Initializes the decoder state. 897 897 * 898 * iemReInitDecoder is mostly a copy of this function. 899 * 898 900 * @param pIemCpu The per CPU IEM state. 899 901 * @param fBypassHandlers Whether to bypass access handlers. … … 974 976 #endif 975 977 } 978 979 980 /** 981 * Reinitializes the decoder state 2nd+ loop of IEMExecLots. 982 * 983 * This is mostly a copy of iemInitDecoder. 984 * 985 * @param pVCpu The cross context virtual CPU structure of the calling EMT. 986 * @param pIemCpu The per CPU IEM state. 987 */ 988 DECLINLINE(void) iemReInitDecoder(PVMCPU pVCpu, PIEMCPU pIemCpu) 989 { 990 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx); 991 992 Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_IEM)); 993 994 #if defined(VBOX_STRICT) && (defined(IEM_VERIFICATION_MODE_FULL) || !defined(VBOX_WITH_RAW_MODE_NOT_R0)) 995 Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pCtx->cs)); 996 Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pCtx->ss)); 997 Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pCtx->es)); 998 Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pCtx->ds)); 999 Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pCtx->fs)); 1000 Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pCtx->gs)); 1001 Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pCtx->ldtr)); 1002 Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pCtx->tr)); 1003 #endif 1004 1005 pIemCpu->uCpl = CPUMGetGuestCPL(pVCpu); /** @todo this should be updated during execution! */ 1006 #ifdef IEM_VERIFICATION_MODE_FULL 1007 if (pIemCpu->uInjectCpl != UINT8_MAX) 1008 pIemCpu->uCpl = pIemCpu->uInjectCpl; 1009 #endif 1010 IEMMODE enmMode = iemCalcCpuMode(pCtx); 1011 pIemCpu->enmCpuMode = enmMode; /** @todo this should be updated during execution! */ 1012 pIemCpu->enmDefAddrMode = enmMode; /** @todo check if this is correct... */ 1013 pIemCpu->enmEffAddrMode = enmMode; 1014 if (enmMode != IEMMODE_64BIT) 1015 { 1016 pIemCpu->enmDefOpSize = enmMode; /** @todo check if this is correct... */ 1017 pIemCpu->enmEffOpSize = enmMode; 1018 } 1019 else 1020 { 1021 pIemCpu->enmDefOpSize = IEMMODE_32BIT; 1022 pIemCpu->enmEffOpSize = IEMMODE_32BIT; 1023 } 1024 pIemCpu->fPrefixes = 0; 1025 pIemCpu->uRexReg = 0; 1026 pIemCpu->uRexB = 0; 1027 pIemCpu->uRexIndex = 0; 1028 pIemCpu->iEffSeg = X86_SREG_DS; 1029 if (pIemCpu->cbOpcode > pIemCpu->offOpcode) /* No need to check RIP here because branch instructions will update cbOpcode. */ 1030 { 1031 pIemCpu->cbOpcode -= pIemCpu->offOpcode; 1032 memmove(&pIemCpu->abOpcode[0], &pIemCpu->abOpcode[pIemCpu->offOpcode], pIemCpu->cbOpcode); 1033 } 1034 else 1035 pIemCpu->cbOpcode = 0; 1036 pIemCpu->offOpcode = 0; 1037 Assert(pIemCpu->cActiveMappings == 0); 1038 pIemCpu->iNextMapping = 0; 1039 Assert(pIemCpu->rcPassUp == VINF_SUCCESS); 1040 Assert(pIemCpu->fBypassHandlers == false); 1041 #ifdef VBOX_WITH_RAW_MODE_NOT_R0 1042 if (!pIemCpu->fInPatchCode) 1043 { /* likely */ } 1044 else 1045 { 1046 pIemCpu->fInPatchCode = pIemCpu->uCpl == 0 1047 && pCtx->cs.u64Base == 0 1048 && pCtx->cs.u32Limit == UINT32_MAX 1049 && PATMIsPatchGCAddr(IEMCPU_TO_VM(pIemCpu), pCtx->eip); 1050 if (!pIemCpu->fInPatchCode) 1051 CPUMRawLeave(pVCpu, VINF_SUCCESS); 1052 } 1053 #endif 1054 1055 #ifdef DBGFTRACE_ENABLED 1056 switch (enmMode) 1057 { 1058 case IEMMODE_64BIT: 1059 RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "I64/%u %08llx", pIemCpu->uCpl, pCtx->rip); 1060 break; 1061 case IEMMODE_32BIT: 1062 RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "I32/%u %04x:%08x", pIemCpu->uCpl, pCtx->cs.Sel, pCtx->eip); 1063 break; 1064 case IEMMODE_16BIT: 1065 RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "I16/%u %04x:%04x", pIemCpu->uCpl, pCtx->cs.Sel, pCtx->eip); 1066 break; 1067 } 1068 #endif 1069 } 1070 976 1071 977 1072 … … 1753 1848 } while (0) 1754 1849 #else 1755 # define IEM_OPCODE_GET_NEXT_U16_ZX_U32(a_pu32) (*(a_pu32) = (int16_t)iemOpcodeGetNextU16Jmp(pIemCpu))1850 # define IEM_OPCODE_GET_NEXT_U16_ZX_U32(a_pu32) (*(a_pu32) = iemOpcodeGetNextU16Jmp(pIemCpu)) 1756 1851 #endif 1757 1852 … … 1816 1911 } while (0) 1817 1912 #else 1818 # define IEM_OPCODE_GET_NEXT_U16_ZX_U64(a_pu64) (*(a_pu64) = (int16_t)iemOpcodeGetNextU16Jmp(pIemCpu))1913 # define IEM_OPCODE_GET_NEXT_U16_ZX_U64(a_pu64) (*(a_pu64) = iemOpcodeGetNextU16Jmp(pIemCpu)) 1819 1914 #endif 1820 1915 … … 2035 2130 } while (0) 2036 2131 #else 2037 # define IEM_OPCODE_GET_NEXT_U32_ZX_U64(a_pu64) (*(a_pu64) = (int32_t)iemOpcodeGetNextU32Jmp(pIemCpu))2132 # define IEM_OPCODE_GET_NEXT_U32_ZX_U64(a_pu64) (*(a_pu64) = iemOpcodeGetNextU32Jmp(pIemCpu)) 2038 2133 #endif 2039 2134 … … 4270 4365 4271 4366 /* 4367 * Flush prefetch buffer 4368 */ 4369 pIemCpu->cbOpcode = pIemCpu->offOpcode; 4370 4371 /* 4272 4372 * Perform the V8086 IOPL check and upgrade the fault without nesting. 4273 4373 */ … … 4374 4474 else 4375 4475 rcStrict = iemRaiseXcptOrIntInProtMode( pIemCpu, pCtx, cbInstr, u8Vector, fFlags, uErr, uCr2); 4476 4477 /* Flush the prefetch buffer. */ 4478 pIemCpu->cbOpcode = pIemCpu->offOpcode; 4376 4479 4377 4480 /* … … 5091 5194 5092 5195 pCtx->eflags.Bits.u1RF = 0; 5196 5197 /* Flush the prefetch buffer. */ 5198 pIemCpu->cbOpcode = pIemCpu->offOpcode; 5199 5093 5200 return VINF_SUCCESS; 5094 5201 } … … 5118 5225 pCtx->eflags.Bits.u1RF = 0; 5119 5226 5227 /* Flush the prefetch buffer. */ 5228 pIemCpu->cbOpcode = pIemCpu->offOpcode; 5229 5120 5230 return VINF_SUCCESS; 5121 5231 } … … 5156 5266 } 5157 5267 pCtx->eflags.Bits.u1RF = 0; 5268 5269 /* Flush the prefetch buffer. */ 5270 pIemCpu->cbOpcode = pIemCpu->offOpcode; 5271 5158 5272 return VINF_SUCCESS; 5159 5273 } … … 5211 5325 5212 5326 pCtx->eflags.Bits.u1RF = 0; 5327 5328 /* Flush the prefetch buffer. */ 5329 pIemCpu->cbOpcode = pIemCpu->offOpcode; 5330 5213 5331 return VINF_SUCCESS; 5214 5332 } … … 9421 9539 #define IEM_MC_SET_RIP_U32(a_u32NewIP) IEM_MC_RETURN_ON_FAILURE(iemRegRipJump((pIemCpu), (a_u32NewIP))) 9422 9540 #define IEM_MC_SET_RIP_U64(a_u64NewIP) IEM_MC_RETURN_ON_FAILURE(iemRegRipJump((pIemCpu), (a_u64NewIP))) 9423 9424 9541 #define IEM_MC_RAISE_DIVIDE_ERROR() return iemRaiseDivideError(pIemCpu) 9425 9542 #define IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE() \ … … 12367 12484 * IEMExecOneWithPrefetchedByPC. 12368 12485 * 12486 * Similar code is found in IEMExecLots. 12487 * 12369 12488 * @return Strict VBox status code. 12370 12489 * @param pVCpu The cross context virtual CPU structure of the calling EMT. … … 12385 12504 rcStrict = FNIEMOP_CALL(g_apfnOneByteMap[b]); 12386 12505 } 12506 else 12507 pIemCpu->cLongJumps++; 12387 12508 pIemCpu->CTX_SUFF(pJmpBuf) = pSavedJmpBuf; 12388 12509 #else … … 12393 12514 pIemCpu->cInstructions++; 12394 12515 if (pIemCpu->cActiveMappings > 0) 12516 { 12517 Assert(rcStrict != VINF_SUCCESS); 12395 12518 iemMemRollback(pIemCpu); 12519 } 12396 12520 //#ifdef DEBUG 12397 12521 // AssertMsg(pIemCpu->offOpcode == cbInstr || rcStrict != VINF_SUCCESS, ("%u %u\n", pIemCpu->offOpcode, cbInstr)); … … 12418 12542 rcStrict = FNIEMOP_CALL(g_apfnOneByteMap[b]); 12419 12543 } 12544 else 12545 pIemCpu->cLongJumps++; 12420 12546 pIemCpu->CTX_SUFF(pJmpBuf) = pSavedJmpBuf; 12421 12547 #else … … 12426 12552 pIemCpu->cInstructions++; 12427 12553 if (pIemCpu->cActiveMappings > 0) 12554 { 12555 Assert(rcStrict != VINF_SUCCESS); 12428 12556 iemMemRollback(pIemCpu); 12557 } 12429 12558 } 12430 12559 EMSetInhibitInterruptsPC(pVCpu, UINT64_C(0x7777555533331111)); … … 12671 12800 12672 12801 12673 VMMDECL(VBOXSTRICTRC) IEMExecLots(PVMCPU pVCpu) 12674 { 12675 PIEMCPU pIemCpu = &pVCpu->iem.s; 12676 12802 VMMDECL(VBOXSTRICTRC) IEMExecLots(PVMCPU pVCpu, uint32_t *pcInstructions) 12803 { 12804 PIEMCPU pIemCpu = &pVCpu->iem.s; 12805 uint32_t const cInstructionsAtStart = pIemCpu->cInstructions; 12806 12807 #if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3) 12677 12808 /* 12678 * See if there is an interrupt pending in TRPM andinject it if we can.12809 * See if there is an interrupt pending in TRPM, inject it if we can. 12679 12810 */ 12680 #if !defined(IEM_VERIFICATION_MODE_FULL) || !defined(IN_RING3)12681 12811 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx); 12682 12812 # ifdef IEM_VERIFICATION_MODE_FULL … … 12696 12826 TRPMResetTrap(pVCpu); 12697 12827 } 12698 #else12699 iemExecVerificationModeSetup(pIemCpu);12700 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);12701 #endif12702 12828 12703 12829 /* 12704 12830 * Log the state. 12705 12831 */ 12706 # ifdef LOG_ENABLED12832 # ifdef LOG_ENABLED 12707 12833 iemLogCurInstr(pVCpu, pCtx, true); 12708 # endif12834 # endif 12709 12835 12710 12836 /* … … 12715 12841 rcStrict = iemExecOneInner(pVCpu, pIemCpu, true); 12716 12842 12717 #if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3)12718 12843 /* 12719 12844 * Assert some sanity. 12720 12845 */ 12721 12846 rcStrict = iemExecVerificationModeCheck(pIemCpu, rcStrict); 12722 #endif 12847 12848 /* 12849 * Log and return. 12850 */ 12851 if (rcStrict != VINF_SUCCESS) 12852 LogFlow(("IEMExecLots: cs:rip=%04x:%08RX64 ss:rsp=%04x:%08RX64 EFL=%06x - rcStrict=%Rrc\n", 12853 pCtx->cs.Sel, pCtx->rip, pCtx->ss.Sel, pCtx->rsp, pCtx->eflags.u, VBOXSTRICTRC_VAL(rcStrict))); 12854 if (pcInstructions) 12855 *pcInstructions = pIemCpu->cInstructions - cInstructionsAtStart; 12856 return rcStrict; 12857 12858 #else /* Not verification mode */ 12859 12860 /* 12861 * See if there is an interrupt pending in TRPM, inject it if we can. 12862 */ 12863 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx); 12864 # ifdef IEM_VERIFICATION_MODE_FULL 12865 pIemCpu->uInjectCpl = UINT8_MAX; 12866 # endif 12867 if ( pCtx->eflags.Bits.u1IF 12868 && TRPMHasTrap(pVCpu) 12869 && EMGetInhibitInterruptsPC(pVCpu) != pCtx->rip) 12870 { 12871 uint8_t u8TrapNo; 12872 TRPMEVENT enmType; 12873 RTGCUINT uErrCode; 12874 RTGCPTR uCr2; 12875 int rc2 = TRPMQueryTrapAll(pVCpu, &u8TrapNo, &enmType, &uErrCode, &uCr2, NULL /* pu8InstLen */); AssertRC(rc2); 12876 IEMInjectTrap(pVCpu, u8TrapNo, enmType, (uint16_t)uErrCode, uCr2, 0 /* cbInstr */); 12877 if (!IEM_VERIFICATION_ENABLED(pIemCpu)) 12878 TRPMResetTrap(pVCpu); 12879 } 12880 12881 /* 12882 * Initial decoder init w/ prefetch, then setup setjmp. 12883 */ 12884 VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pIemCpu, false); 12885 if (rcStrict == VINF_SUCCESS) 12886 { 12887 # ifdef IEM_WITH_SETJMP 12888 jmp_buf JmpBuf; 12889 jmp_buf *pSavedJmpBuf = pIemCpu->CTX_SUFF(pJmpBuf); 12890 pIemCpu->CTX_SUFF(pJmpBuf) = &JmpBuf; 12891 pIemCpu->cActiveMappings = 0; 12892 if ((rcStrict = setjmp(JmpBuf)) == 0) 12893 # endif 12894 { 12895 /* 12896 * The run loop. We limit ourselves to 2048 instructions right now. 12897 */ 12898 PVM pVM = pVCpu->CTX_SUFF(pVM); 12899 uint32_t cInstr = 2048; 12900 for (;;) 12901 { 12902 /* 12903 * Log the state. 12904 */ 12905 # ifdef LOG_ENABLED 12906 iemLogCurInstr(pVCpu, pCtx, true); 12907 # endif 12908 12909 /* 12910 * Do the decoding and emulation. 12911 */ 12912 uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b); 12913 rcStrict = FNIEMOP_CALL(g_apfnOneByteMap[b]); 12914 if (RT_LIKELY(rcStrict == VINF_SUCCESS)) 12915 { 12916 Assert(pIemCpu->cActiveMappings == 0); 12917 pIemCpu->cInstructions++; 12918 if (RT_LIKELY(pIemCpu->rcPassUp == VINF_SUCCESS)) 12919 { 12920 if (RT_LIKELY( !VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_ALL_MASK & ~VMCPU_FF_INHIBIT_INTERRUPTS) 12921 && !VM_FF_IS_PENDING(pVM, VM_FF_ALL_MASK) 12922 && cInstr-- > 0 )) 12923 { 12924 iemReInitDecoder(pVCpu, pIemCpu); 12925 continue; 12926 } 12927 } 12928 } 12929 else if (pIemCpu->cActiveMappings > 0) /** @todo This should only happen when rcStrict != VINF_SUCCESS! */ 12930 iemMemRollback(pIemCpu); 12931 rcStrict = iemExecStatusCodeFiddling(pIemCpu, rcStrict); 12932 break; 12933 } 12934 } 12935 # ifdef IEM_WITH_SETJMP 12936 else 12937 { 12938 if (pIemCpu->cActiveMappings > 0) 12939 iemMemRollback(pIemCpu); 12940 pIemCpu->cLongJumps++; 12941 } 12942 # endif 12943 12944 /* 12945 * Assert hidden register sanity (also done in iemInitDecoder and iemReInitDecoder). 12946 */ 12947 Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->cs)); 12948 Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->ss)); 12949 # if defined(IEM_VERIFICATION_MODE_FULL) 12950 Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->es)); 12951 Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->ds)); 12952 Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->fs)); 12953 Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->gs)); 12954 # endif 12955 } 12723 12956 12724 12957 /* 12725 12958 * Maybe re-enter raw-mode and log. 12726 12959 */ 12727 # ifdef IN_RC12960 # ifdef IN_RC 12728 12961 rcStrict = iemRCRawMaybeReenter(pIemCpu, pVCpu, pIemCpu->CTX_SUFF(pCtx), rcStrict); 12729 # endif12962 # endif 12730 12963 if (rcStrict != VINF_SUCCESS) 12731 12964 LogFlow(("IEMExecLots: cs:rip=%04x:%08RX64 ss:rsp=%04x:%08RX64 EFL=%06x - rcStrict=%Rrc\n", 12732 12965 pCtx->cs.Sel, pCtx->rip, pCtx->ss.Sel, pCtx->rsp, pCtx->eflags.u, VBOXSTRICTRC_VAL(rcStrict))); 12966 if (pcInstructions) 12967 *pcInstructions = pIemCpu->cInstructions - cInstructionsAtStart; 12733 12968 return rcStrict; 12969 #endif /* Not verification mode */ 12734 12970 } 12735 12971 -
trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h
r61636 r61968 759 759 pCtx->rip = uNewPC; 760 760 pCtx->eflags.Bits.u1RF = 0; 761 762 /* Flush the prefetch buffer. */ 763 pIemCpu->cbOpcode = pIemCpu->offOpcode; 761 764 return VINF_SUCCESS; 762 765 } … … 782 785 pCtx->rip = uNewPC; 783 786 pCtx->eflags.Bits.u1RF = 0; 787 788 /* Flush the prefetch buffer. */ 789 pIemCpu->cbOpcode = pIemCpu->offOpcode; 784 790 return VINF_SUCCESS; 785 791 } … … 823 829 pCtx->rip = uNewPC; 824 830 pCtx->eflags.Bits.u1RF = 0; 831 832 /* Flush the prefetch buffer. */ 833 pIemCpu->cbOpcode = pIemCpu->offOpcode; 825 834 return VINF_SUCCESS; 826 835 } … … 846 855 pCtx->rip = uNewPC; 847 856 pCtx->eflags.Bits.u1RF = 0; 857 858 /* Flush the prefetch buffer. */ 859 pIemCpu->cbOpcode = pIemCpu->offOpcode; 848 860 return VINF_SUCCESS; 849 861 } … … 870 882 pCtx->rip = uNewPC; 871 883 pCtx->eflags.Bits.u1RF = 0; 884 885 /* Flush the prefetch buffer. */ 886 pIemCpu->cbOpcode = pIemCpu->offOpcode; 872 887 return VINF_SUCCESS; 873 888 } … … 893 908 pCtx->rip = uNewPC; 894 909 pCtx->eflags.Bits.u1RF = 0; 910 911 /* Flush the prefetch buffer. */ 912 pIemCpu->cbOpcode = pIemCpu->offOpcode; 913 895 914 return VINF_SUCCESS; 896 915 } … … 1625 1644 } 1626 1645 pCtx->eflags.Bits.u1RF = 0; 1646 1647 /* Flush the prefetch buffer. */ 1648 pIemCpu->cbOpcode = pIemCpu->offOpcode; 1627 1649 return VINF_SUCCESS; 1628 1650 #endif … … 1847 1869 /** @todo check if the hidden bits are loaded correctly for 64-bit 1848 1870 * mode. */ 1871 1872 /* Flush the prefetch buffer. */ 1873 pIemCpu->cbOpcode = pIemCpu->offOpcode; 1874 1849 1875 return VINF_SUCCESS; 1850 1876 } … … 2066 2092 /** @todo check if the hidden bits are loaded correctly for 64-bit 2067 2093 * mode. */ 2094 2095 /* Flush the prefetch buffer. */ 2096 pIemCpu->cbOpcode = pIemCpu->offOpcode; 2097 2068 2098 return VINF_SUCCESS; 2069 2099 } … … 2466 2496 pCtx->eflags.Bits.u1RF = 0; 2467 2497 } 2498 2499 /* Flush the prefetch buffer. */ 2500 pIemCpu->cbOpcode = pIemCpu->offOpcode; 2468 2501 return VINF_SUCCESS; 2469 2502 } … … 2536 2569 pCtx->rsp = NewRsp.u; 2537 2570 pCtx->eflags.Bits.u1RF = 0; 2571 2572 /* Flush the prefetch buffer. */ 2573 pIemCpu->cbOpcode = pIemCpu->offOpcode; 2538 2574 2539 2575 return VINF_SUCCESS; … … 2857 2893 IEMMISC_SET_EFL(pIemCpu, pCtx, uNewFlags); 2858 2894 2895 /* Flush the prefetch buffer. */ 2896 pIemCpu->cbOpcode = pIemCpu->offOpcode; 2897 2859 2898 return VINF_SUCCESS; 2860 2899 } … … 2932 2971 pCtx->rsp = uNewEsp; /** @todo check this out! */ 2933 2972 pIemCpu->uCpl = 3; 2973 2974 /* Flush the prefetch buffer. */ 2975 pIemCpu->cbOpcode = pIemCpu->offOpcode; 2934 2976 2935 2977 return VINF_SUCCESS; … … 3364 3406 /* Done! */ 3365 3407 } 3408 3409 /* Flush the prefetch buffer. */ 3410 pIemCpu->cbOpcode = pIemCpu->offOpcode; 3411 3366 3412 return VINF_SUCCESS; 3367 3413 } … … 3661 3707 } 3662 3708 3709 /* Flush the prefetch buffer. */ 3710 pIemCpu->cbOpcode = pIemCpu->offOpcode; 3711 3663 3712 return VINF_SUCCESS; 3664 3713 } … … 3785 3834 pCtx->ss.fFlags = CPUMSELREG_FLAGS_VALID; 3786 3835 3836 /* Flush the prefetch buffer. */ 3837 pIemCpu->cbOpcode = pIemCpu->offOpcode; 3838 3787 3839 return VINF_SUCCESS; 3788 3840 } … … 3885 3937 /** @todo Testcase: verify that SS.u1Long and SS.u1DefBig are left unchanged 3886 3938 * on sysret. */ 3939 3940 /* Flush the prefetch buffer. */ 3941 pIemCpu->cbOpcode = pIemCpu->offOpcode; 3887 3942 3888 3943 return VINF_SUCCESS;
Note:
See TracChangeset
for help on using the changeset viewer.