VirtualBox

Changeset 60185 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Mar 24, 2016 5:39:40 PM (9 years ago)
Author:
vboxsync
Message:

IEM: Fixed a couple of edge cases and broken verification mode.

  • Update enmCpuMode after loading hidden CS flags (prep for recompiling).
  • Fixed retf in 64-bit mode where we would load CS.BASE with zero when returning to 16-bit or 32-bit code.
  • Fixed ESP/SP handling for protected mode exception injection.
  • Implemented the two string I/O notification functions that would assert in verification mode.
  • The IEMExec* methods must call iemUninitExec to undo poisoning of decoding data members as it will otherwise interfere with verification mode opcode fetching optimizations and other stuff.

The above makes the current bs3-cpu-basic-2 code work in --execute-all-in-iem mode.

Location:
trunk/src/VBox/VMM
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r59986 r60185  
    763763
    764764/**
     765 * Calculates the CPU mode.
     766 *
     767 * This is mainly for updating IEMCPU::enmCpuMode.
     768 *
     769 * @returns CPU mode.
     770 * @param   pCtx        The register context for the CPU.
     771 */
     772DECLINLINE(IEMMODE) iemCalcCpuMode(PCPUMCTX pCtx)
     773{
     774    if (CPUMIsGuestIn64BitCodeEx(pCtx))
     775        return IEMMODE_64BIT;
     776    if (pCtx->cs.Attr.n.u1DefBig) /** @todo check if this is correct... */
     777        return IEMMODE_32BIT;
     778    return IEMMODE_16BIT;
     779}
     780
     781
     782/**
    765783 * Initializes the execution state.
    766784 *
    767785 * @param   pIemCpu             The per CPU IEM state.
    768786 * @param   fBypassHandlers     Whether to bypass access handlers.
     787 *
     788 * @remarks Callers of this must call iemUninitExec() to undo potentially fatal
     789 *          side-effects in strict builds.
    769790 */
    770791DECLINLINE(void) iemInitExec(PIEMCPU pIemCpu, bool fBypassHandlers)
     
    791812#endif
    792813    pIemCpu->uCpl               = CPUMGetGuestCPL(pVCpu);
    793     IEMMODE enmMode = CPUMIsGuestIn64BitCodeEx(pCtx)
    794                     ? IEMMODE_64BIT
    795                     : pCtx->cs.Attr.n.u1DefBig /** @todo check if this is correct... */
    796                     ? IEMMODE_32BIT
    797                     : IEMMODE_16BIT;
    798     pIemCpu->enmCpuMode         = enmMode;
     814    pIemCpu->enmCpuMode         = iemCalcCpuMode(pCtx);
    799815#ifdef VBOX_STRICT
    800816    pIemCpu->enmDefAddrMode     = (IEMMODE)0xc0fe;
     
    823839        CPUMRawLeave(pVCpu, VINF_SUCCESS);
    824840#endif
     841
     842#ifdef IEM_VERIFICATION_MODE_FULL
     843    pIemCpu->fNoRemSavedByExec = pIemCpu->fNoRem;
     844    pIemCpu->fNoRem = true;
     845#endif
     846}
     847
     848
     849/**
     850 * Counterpart to #iemInitExec that undoes evil strict-build stuff.
     851 *
     852 * @param   pIemCpu             The per CPU IEM state.
     853 */
     854DECLINLINE(void) iemUninitExec(PIEMCPU pIemCpu)
     855{
     856#ifdef IEM_VERIFICATION_MODE_FULL
     857    pIemCpu->fNoRem = pIemCpu->fNoRemSavedByExec;
     858#endif
     859#ifdef VBOX_STRICT
     860    pIemCpu->cbOpcode = 0;
     861#else
     862    NOREF(pIemCpu);
     863#endif
    825864}
    826865
     
    859898        pIemCpu->uCpl           = pIemCpu->uInjectCpl;
    860899#endif
    861     IEMMODE enmMode = CPUMIsGuestIn64BitCodeEx(pCtx)
    862                     ? IEMMODE_64BIT
    863                     : pCtx->cs.Attr.n.u1DefBig /** @todo check if this is correct... */
    864                     ? IEMMODE_32BIT
    865                     : IEMMODE_16BIT;
     900    IEMMODE enmMode = iemCalcCpuMode(pCtx);
    866901    pIemCpu->enmCpuMode         = enmMode;
    867902    pIemCpu->enmDefAddrMode     = enmMode;  /** @todo check if this is correct... */
     
    10081043    {
    10091044        uint8_t cbNew = cbOldOpcodes - (uint8_t)offPrevOpcodes;
     1045        Assert(cbNew <= RT_ELEMENTS(pIemCpu->abOpcode));
    10101046        memmove(&pIemCpu->abOpcode[0], &pIemCpu->abOpcode[offPrevOpcodes], cbNew);
    10111047        pIemCpu->cbOpcode = cbNew;
     
    21012137    VBOXSTRICTRC rcStrict;
    21022138    Assert(uCpl < 4);
    2103     *puEsp  = 0; /* make gcc happy */
    2104     *pSelSS = 0; /* make gcc happy */
    21052139
    21062140    switch (pCtx->tr.Attr.n.u4Type)
     
    21192153            }
    21202154
     2155/** @todo check actual access pattern here. */
    21212156            uint32_t u32Tmp = 0; /* gcc maybe... */
    21222157            rcStrict = iemMemFetchSysU32(pIemCpu, &u32Tmp, UINT8_MAX, pCtx->tr.u64Base + off);
     
    21432178            }
    21442179
     2180/** @todo check actual access pattern here. */
    21452181            uint64_t u64Tmp;
    21462182            rcStrict = iemMemFetchSysU64(pIemCpu, &u64Tmp, UINT8_MAX, pCtx->tr.u64Base + off);
     
    21552191
    21562192        default:
    2157             AssertFailedReturn(VERR_IEM_IPE_4);
    2158     }
     2193            AssertFailed();
     2194            rcStrict = VERR_IEM_IPE_4;
     2195            break;
     2196    }
     2197
     2198    *puEsp  = 0; /* make gcc happy */
     2199    *pSelSS = 0; /* make gcc happy */
    21592200    return rcStrict;
    21602201}
     
    35663607         *      - 16-bit TSS, 32-bit handler
    35673608         *      - 32-bit TSS, 16-bit handler */
    3568         pCtx->rsp               = uNewEsp - cbStackFrame;
     3609        if (!pCtx->ss.Attr.n.u1DefBig)
     3610            pCtx->sp            = (uint16_t)(uNewEsp - cbStackFrame);
     3611        else
     3612            pCtx->rsp           = uNewEsp - cbStackFrame;
    35693613        pIemCpu->uCpl           = uNewCpl;
    35703614
     
    64196463DECLINLINE(int) iemMapLookup(PIEMCPU pIemCpu, void *pvMem, uint32_t fAccess)
    64206464{
     6465    Assert(pIemCpu->cActiveMappings < RT_ELEMENTS(pIemCpu->aMemMappings));
    64216466    fAccess &= IEM_ACCESS_WHAT_MASK | IEM_ACCESS_TYPE_MASK;
    64226467    if (   pIemCpu->aMemMappings[0].pv == pvMem
     
    69737018    Assert(cbMem <= 64 || cbMem == 512 || cbMem == 108 || cbMem == 104 || cbMem == 94); /* 512 is the max! */
    69747019    Assert(~(fAccess & ~(IEM_ACCESS_TYPE_MASK | IEM_ACCESS_WHAT_MASK)));
     7020    Assert(pIemCpu->cActiveMappings < RT_ELEMENTS(pIemCpu->aMemMappings));
    69757021
    69767022    unsigned iMemMap = pIemCpu->iNextMapping;
     
    70707116        if (fAccess != IEM_ACCESS_INVALID)
    70717117        {
     7118            AssertMsg(!(fAccess & ~IEM_ACCESS_VALID_MASK) && fAccess != 0, ("%#x\n", fAccess));
    70727119            pIemCpu->aMemMappings[iMemMap].fAccess = IEM_ACCESS_INVALID;
    70737120            if (!(fAccess & IEM_ACCESS_BOUNCE_BUFFERED))
     
    999310040    pEvtRec->enmEvent = IEMVERIFYEVENT_IOPORT_READ;
    999410041    pEvtRec->u.IOPortRead.Port    = Port;
    9995     pEvtRec->u.IOPortRead.cbValue = (uint32_t)cbValue;
     10042    pEvtRec->u.IOPortRead.cbValue = (uint8_t)cbValue;
    999610043    pEvtRec->pNext = *pIemCpu->ppOtherEvtRecNext;
    999710044    *pIemCpu->ppOtherEvtRecNext = pEvtRec;
     
    1001210059    pEvtRec->enmEvent = IEMVERIFYEVENT_IOPORT_WRITE;
    1001310060    pEvtRec->u.IOPortWrite.Port     = Port;
    10014     pEvtRec->u.IOPortWrite.cbValue  = (uint32_t)cbValue;
     10061    pEvtRec->u.IOPortWrite.cbValue  = (uint8_t)cbValue;
    1001510062    pEvtRec->u.IOPortWrite.u32Value = u32Value;
    1001610063    pEvtRec->pNext = *pIemCpu->ppOtherEvtRecNext;
     
    1002110068VMM_INT_DECL(void)   IEMNotifyIOPortReadString(PVM pVM, RTIOPORT Port, void *pvDst, RTGCUINTREG cTransfers, size_t cbValue)
    1002210069{
    10023     AssertFailed();
     10070    PVMCPU              pVCpu = VMMGetCpu(pVM);
     10071    if (!pVCpu)
     10072        return;
     10073    PIEMCPU             pIemCpu = &pVCpu->iem.s;
     10074    PIEMVERIFYEVTREC    pEvtRec = iemVerifyAllocRecord(pIemCpu);
     10075    if (!pEvtRec)
     10076        return;
     10077    pEvtRec->enmEvent = IEMVERIFYEVENT_IOPORT_STR_READ;
     10078    pEvtRec->u.IOPortStrRead.Port       = Port;
     10079    pEvtRec->u.IOPortStrRead.cbValue    = (uint8_t)cbValue;
     10080    pEvtRec->u.IOPortStrRead.cTransfers = cTransfers;
     10081    pEvtRec->pNext = *pIemCpu->ppOtherEvtRecNext;
     10082    *pIemCpu->ppOtherEvtRecNext = pEvtRec;
    1002410083}
    1002510084
     
    1002710086VMM_INT_DECL(void)   IEMNotifyIOPortWriteString(PVM pVM, RTIOPORT Port, void const *pvSrc, RTGCUINTREG cTransfers, size_t cbValue)
    1002810087{
    10029     AssertFailed();
     10088    PVMCPU              pVCpu = VMMGetCpu(pVM);
     10089    if (!pVCpu)
     10090        return;
     10091    PIEMCPU             pIemCpu = &pVCpu->iem.s;
     10092    PIEMVERIFYEVTREC    pEvtRec = iemVerifyAllocRecord(pIemCpu);
     10093    if (!pEvtRec)
     10094        return;
     10095    pEvtRec->enmEvent = IEMVERIFYEVENT_IOPORT_STR_WRITE;
     10096    pEvtRec->u.IOPortStrWrite.Port       = Port;
     10097    pEvtRec->u.IOPortStrWrite.cbValue    = (uint8_t)cbValue;
     10098    pEvtRec->u.IOPortStrWrite.cTransfers = cTransfers;
     10099    pEvtRec->pNext = *pIemCpu->ppOtherEvtRecNext;
     10100    *pIemCpu->ppOtherEvtRecNext = pEvtRec;
    1003010101}
    1003110102
     
    1004710118        pEvtRec->enmEvent = IEMVERIFYEVENT_IOPORT_READ;
    1004810119        pEvtRec->u.IOPortRead.Port    = Port;
    10049         pEvtRec->u.IOPortRead.cbValue = (uint32_t)cbValue;
     10120        pEvtRec->u.IOPortRead.cbValue = (uint8_t)cbValue;
    1005010121        pEvtRec->pNext = *pIemCpu->ppIemEvtRecNext;
    1005110122        *pIemCpu->ppIemEvtRecNext = pEvtRec;
     
    1007310144        pEvtRec->enmEvent = IEMVERIFYEVENT_IOPORT_WRITE;
    1007410145        pEvtRec->u.IOPortWrite.Port     = Port;
    10075         pEvtRec->u.IOPortWrite.cbValue  = (uint32_t)cbValue;
     10146        pEvtRec->u.IOPortWrite.cbValue  = (uint8_t)cbValue;
    1007610147        pEvtRec->u.IOPortWrite.u32Value = u32Value;
    1007710148        pEvtRec->pNext = *pIemCpu->ppIemEvtRecNext;
     
    1015310224                            pEvtRec->u.IOPortWrite.cbValue,
    1015410225                            pEvtRec->u.IOPortWrite.u32Value);
     10226            break;
     10227        case IEMVERIFYEVENT_IOPORT_STR_READ:
     10228            RTAssertMsg2Add("I/O PORT STRING READ from %#6x, %d bytes, %#x times\n",
     10229                            pEvtRec->u.IOPortStrWrite.Port,
     10230                            pEvtRec->u.IOPortStrWrite.cbValue,
     10231                            pEvtRec->u.IOPortStrWrite.cTransfers);
     10232            break;
     10233        case IEMVERIFYEVENT_IOPORT_STR_WRITE:
     10234            RTAssertMsg2Add("I/O PORT STRING WRITE  to %#6x, %d bytes, %#x times\n",
     10235                            pEvtRec->u.IOPortStrWrite.Port,
     10236                            pEvtRec->u.IOPortStrWrite.cbValue,
     10237                            pEvtRec->u.IOPortStrWrite.cTransfers);
    1015510238            break;
    1015610239        case IEMVERIFYEVENT_RAM_READ:
     
    1058310666            {
    1058410667                case IEMVERIFYEVENT_IOPORT_READ:
    10585                     fEquals = pIemRec->u.IOPortRead.Port        == pOtherRec->u.IOPortRead.Port
    10586                            && pIemRec->u.IOPortRead.cbValue     == pOtherRec->u.IOPortRead.cbValue;
     10668                    fEquals = pIemRec->u.IOPortRead.Port            == pOtherRec->u.IOPortRead.Port
     10669                           && pIemRec->u.IOPortRead.cbValue         == pOtherRec->u.IOPortRead.cbValue;
    1058710670                    break;
    1058810671                case IEMVERIFYEVENT_IOPORT_WRITE:
    10589                     fEquals = pIemRec->u.IOPortWrite.Port       == pOtherRec->u.IOPortWrite.Port
    10590                            && pIemRec->u.IOPortWrite.cbValue    == pOtherRec->u.IOPortWrite.cbValue
    10591                            && pIemRec->u.IOPortWrite.u32Value   == pOtherRec->u.IOPortWrite.u32Value;
     10672                    fEquals = pIemRec->u.IOPortWrite.Port           == pOtherRec->u.IOPortWrite.Port
     10673                           && pIemRec->u.IOPortWrite.cbValue        == pOtherRec->u.IOPortWrite.cbValue
     10674                           && pIemRec->u.IOPortWrite.u32Value       == pOtherRec->u.IOPortWrite.u32Value;
     10675                    break;
     10676                case IEMVERIFYEVENT_IOPORT_STR_READ:
     10677                    fEquals = pIemRec->u.IOPortStrRead.Port         == pOtherRec->u.IOPortStrRead.Port
     10678                           && pIemRec->u.IOPortStrRead.cbValue      == pOtherRec->u.IOPortStrRead.cbValue
     10679                           && pIemRec->u.IOPortStrRead.cTransfers   == pOtherRec->u.IOPortStrRead.cTransfers;
     10680                    break;
     10681                case IEMVERIFYEVENT_IOPORT_STR_WRITE:
     10682                    fEquals = pIemRec->u.IOPortStrWrite.Port        == pOtherRec->u.IOPortStrWrite.Port
     10683                           && pIemRec->u.IOPortStrWrite.cbValue     == pOtherRec->u.IOPortStrWrite.cbValue
     10684                           && pIemRec->u.IOPortStrWrite.cTransfers  == pOtherRec->u.IOPortStrWrite.cTransfers;
    1059210685                    break;
    1059310686                case IEMVERIFYEVENT_RAM_READ:
    10594                     fEquals = pIemRec->u.RamRead.GCPhys         == pOtherRec->u.RamRead.GCPhys
    10595                            && pIemRec->u.RamRead.cb             == pOtherRec->u.RamRead.cb;
     10687                    fEquals = pIemRec->u.RamRead.GCPhys             == pOtherRec->u.RamRead.GCPhys
     10688                           && pIemRec->u.RamRead.cb                 == pOtherRec->u.RamRead.cb;
    1059610689                    break;
    1059710690                case IEMVERIFYEVENT_RAM_WRITE:
    10598                     fEquals = pIemRec->u.RamWrite.GCPhys        == pOtherRec->u.RamWrite.GCPhys
    10599                            && pIemRec->u.RamWrite.cb            == pOtherRec->u.RamWrite.cb
     10691                    fEquals = pIemRec->u.RamWrite.GCPhys            == pOtherRec->u.RamWrite.GCPhys
     10692                           && pIemRec->u.RamWrite.cb                == pOtherRec->u.RamWrite.cb
    1060010693                           && !memcmp(pIemRec->u.RamWrite.ab, pOtherRec->u.RamWrite.ab, pIemRec->u.RamWrite.cb);
    1060110694                    break;
     
    1134511438    }
    1134611439
     11440    iemUninitExec(pIemCpu);
    1134711441    return iemExecStatusCodeFiddling(pIemCpu, rcStrict);
    1134811442}
     
    1146211556    }
    1146311557
     11558    iemUninitExec(pIemCpu);
    1146411559    return iemExecStatusCodeFiddling(pIemCpu, rcStrict);
    1146511560}
     
    1148711582    iemInitExec(pIemCpu, false /*fBypassHandlers*/);
    1148811583    VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_2(iemCImpl_mov_Cd_Rd, iCrReg, iGReg);
     11584    iemUninitExec(pIemCpu);
    1148911585    return iemExecStatusCodeFiddling(pIemCpu, rcStrict);
    1149011586}
     
    1151111607    iemInitExec(pIemCpu, false /*fBypassHandlers*/);
    1151211608    VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_2(iemCImpl_mov_Rd_Cd, iGReg, iCrReg);
     11609    iemUninitExec(pIemCpu);
    1151311610    return iemExecStatusCodeFiddling(pIemCpu, rcStrict);
    1151411611}
     
    1153111628    iemInitExec(pIemCpu, false /*fBypassHandlers*/);
    1153211629    VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_0(iemCImpl_clts);
     11630    iemUninitExec(pIemCpu);
    1153311631    return iemExecStatusCodeFiddling(pIemCpu, rcStrict);
    1153411632}
     
    1155211650    iemInitExec(pIemCpu, false /*fBypassHandlers*/);
    1155311651    VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_1(iemCImpl_lmsw, uValue);
     11652    iemUninitExec(pIemCpu);
    1155411653    return iemExecStatusCodeFiddling(pIemCpu, rcStrict);
    1155511654}
     
    1157411673    iemInitExec(pIemCpu, false /*fBypassHandlers*/);
    1157511674    VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_0(iemCImpl_xsetbv);
     11675    iemUninitExec(pIemCpu);
    1157611676    return iemExecStatusCodeFiddling(pIemCpu, rcStrict);
    1157711677}
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r60118 r60185  
    11761176        pCtx->cs.u32Limit = cbLimit;
    11771177        pCtx->cs.u64Base  = u64Base;
     1178        pIemCpu->enmCpuMode = iemCalcCpuMode(pCtx);
    11781179    }
    11791180    else
     
    15061507            pCtx->cs.u32Limit = cbLimit;
    15071508            pCtx->cs.u64Base  = u64Base;
     1509            pIemCpu->enmCpuMode = iemCalcCpuMode(pCtx);
    15081510        }
    15091511        else
     
    15971599            pCtx->cs.u32Limit = cbLimit;
    15981600            pCtx->cs.u64Base  = u64Base;
     1601            pIemCpu->enmCpuMode  = iemCalcCpuMode(pCtx);
    15991602        }
    16001603    }
     
    18151818    pCtx->cs.u32Limit    = cbLimit;
    18161819    pCtx->cs.u64Base     = u64Base;
     1820    pIemCpu->enmCpuMode  = iemCalcCpuMode(pCtx);
    18171821    pCtx->eflags.Bits.u1RF = 0;
    18181822    /** @todo check if the hidden bits are loaded correctly for 64-bit
     
    20332037    pCtx->cs.u32Limit    = cbLimit;
    20342038    pCtx->cs.u64Base     = u64Base;
     2039    pIemCpu->enmCpuMode  = iemCalcCpuMode(pCtx);
    20352040    pCtx->eflags.Bits.u1RF = 0;
    20362041    /** @todo check if the hidden bits are loaded correctly for 64-bit
     
    22812286        uint32_t cbLimitCs = X86DESC_LIMIT_G(&DescCs.Legacy);
    22822287
    2283         if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     2288        /** @todo Testcase: Is this correct? */
     2289        if (   DescCs.Legacy.Gen.u1Long
     2290            && IEM_IS_LONG_MODE(pIemCpu) )
    22842291        {
    22852292            if (!IEM_IS_CANONICAL(uNewRip))
     
    23402347        pCtx->cs.u32Limit       = cbLimitCs;
    23412348        pCtx->cs.u64Base        = u64Base;
     2349        pIemCpu->enmCpuMode     = iemCalcCpuMode(pCtx);
    23422350        pCtx->rsp               = uNewOuterRsp;
    23432351        pCtx->ss.Sel            = uNewOuterSs;
     
    23752383        uint32_t cbLimitCs = X86DESC_LIMIT_G(&DescCs.Legacy);
    23762384
    2377         if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     2385        /** @todo Testcase: Is this correct? */
     2386        if (   DescCs.Legacy.Gen.u1Long
     2387            && IEM_IS_LONG_MODE(pIemCpu) )
    23782388        {
    23792389            if (!IEM_IS_CANONICAL(uNewRip))
     
    24262436        /** @todo check if the hidden bits are loaded correctly for 64-bit
    24272437         *        mode.  */
     2438        pIemCpu->enmCpuMode = iemCalcCpuMode(pCtx);
    24282439        if (cbPop)
    24292440            iemRegAddToRsp(pIemCpu, pCtx, cbPop);
     
    32343245        pCtx->cs.u32Limit   = cbLimitCS;
    32353246        pCtx->cs.u64Base    = X86DESC_BASE(&DescCS.Legacy);
     3247        pIemCpu->enmCpuMode = iemCalcCpuMode(pCtx);
    32363248        if (!pCtx->ss.Attr.n.u1DefBig)
    32373249            pCtx->sp        = (uint16_t)uNewESP;
     
    33043316        pCtx->cs.u32Limit   = cbLimitCS;
    33053317        pCtx->cs.u64Base    = X86DESC_BASE(&DescCS.Legacy);
     3318        pIemCpu->enmCpuMode = iemCalcCpuMode(pCtx);
    33063319        pCtx->rsp           = uNewRsp;
    33073320        /* Done! */
     
    35653578    pCtx->cs.u32Limit   = cbLimitCS;
    35663579    pCtx->cs.u64Base    = X86DESC_BASE(&DescCS.Legacy);
     3580    pIemCpu->enmCpuMode = iemCalcCpuMode(pCtx);
    35673581    if (pCtx->cs.Attr.n.u1Long || pCtx->cs.Attr.n.u1DefBig)
    35683582        pCtx->rsp       = uNewRsp;
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r58994 r60185  
    1220612206FNIEMOP_DEF(iemOp_int_3)
    1220712207{
     12208    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1220812209    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_int, X86_XCPT_BP, true /*fIsBpInstr*/);
    1220912210}
     
    1221412215{
    1221512216    uint8_t u8Int; IEM_OPCODE_GET_NEXT_U8(&u8Int);
     12217    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1221612218    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_int, u8Int, false /*fIsBpInstr*/);
    1221712219}
  • trunk/src/VBox/VMM/VMMAll/TMAllCpu.cpp

    r58126 r60185  
    2626#include <VBox/vmm/vm.h>
    2727#include <VBox/vmm/gim.h>
     28#include <VBox/vmm/dbgf.h>
    2829#include <VBox/sup.h>
    2930
     
    238239VMM_INT_DECL(bool) TMCpuTickCanUseRealTSC(PVM pVM, PVMCPU pVCpu, uint64_t *poffRealTsc, bool *pfParavirtTsc)
    239240{
    240     Assert(pVCpu->tm.s.fTSCTicking);
     241    Assert(pVCpu->tm.s.fTSCTicking || DBGFIsStepping(pVCpu));
    241242
    242243    *pfParavirtTsc = pVM->tm.s.fParavirtTscEnabled;
     
    350351                                                        bool *pfOffsettedTsc, bool *pfParavirtTsc)
    351352{
    352     Assert(pVCpu->tm.s.fTSCTicking);
     353    Assert(pVCpu->tm.s.fTSCTicking || DBGFIsStepping(pVCpu));
    353354
    354355    *pfParavirtTsc = pVM->tm.s.fParavirtTscEnabled;
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r58127 r60185  
    175175    IEMVERIFYEVENT_IOPORT_READ,
    176176    IEMVERIFYEVENT_IOPORT_WRITE,
     177    IEMVERIFYEVENT_IOPORT_STR_READ,
     178    IEMVERIFYEVENT_IOPORT_STR_WRITE,
    177179    IEMVERIFYEVENT_RAM_WRITE,
    178180    IEMVERIFYEVENT_RAM_READ
     
    198200        {
    199201            RTIOPORT    Port;
    200             uint32_t    cbValue;
     202            uint8_t     cbValue;
    201203        } IOPortRead;
    202204
     
    205207        {
    206208            RTIOPORT    Port;
    207             uint32_t    cbValue;
     209            uint8_t     cbValue;
    208210            uint32_t    u32Value;
    209211        } IOPortWrite;
     212
     213        /** IEMVERIFYEVENT_IOPORT_STR_READ */
     214        struct
     215        {
     216            RTIOPORT    Port;
     217            uint8_t     cbValue;
     218            RTGCUINTREG cTransfers;
     219        } IOPortStrRead;
     220
     221        /** IEMVERIFYEVENT_IOPORT_STR_WRITE */
     222        struct
     223        {
     224            RTIOPORT    Port;
     225            uint8_t     cbValue;
     226            RTGCUINTREG cTransfers;
     227        } IOPortStrWrite;
    210228
    211229        /** IEMVERIFYEVENT_RAM_READ */
     
    303321     * This is used to skip past really slow bits.  */
    304322    bool                    fNoRem;
     323    /** Saved fNoRem flag used by #iemInitExec and #iemUninitExec. */
     324    bool                    fNoRemSavedByExec;
    305325    /** Indicates that RAX and RDX differences should be ignored since RDTSC
    306326     *  and RDTSCP are timing sensitive.  */
     
    488508/** Used in aMemMappings to indicate that the entry is bounce buffered. */
    489509#define IEM_ACCESS_BOUNCE_BUFFERED      UINT32_C(0x00000200)
     510/** Valid bit mask. */
     511#define IEM_ACCESS_VALID_MASK           UINT32_C(0x000003ff)
    490512/** Read+write data alias. */
    491513#define IEM_ACCESS_DATA_RW              (IEM_ACCESS_TYPE_READ  | IEM_ACCESS_TYPE_WRITE | IEM_ACCESS_WHAT_DATA)
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette