VirtualBox

Changeset 62171 in vbox for trunk/src


Ignore:
Timestamp:
Jul 11, 2016 6:30:07 PM (9 years ago)
Author:
vboxsync
Message:

IEM: Working on instruction fetching optimizations (incomplete and disabled).

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

Legend:

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

    r62138 r62171  
    8282//#define IEM_LOG_MEMORY_WRITES
    8383#define IEM_IMPLEMENTS_TASKSWITCH
     84//#define IEM_WITH_CODE_TLB - work in progress
    8485
    8586
     
    733734IEM_STATIC VBOXSTRICTRC     iemRaisePageFault(PVMCPU pVCpu, RTGCPTR GCPtrWhere, uint32_t fAccess, int rc);
    734735IEM_STATIC VBOXSTRICTRC     iemRaiseAlignmentCheckException(PVMCPU pVCpu);
     736#ifdef IEM_WITH_SETJMP
     737DECL_NO_INLINE(IEM_STATIC, DECL_NO_RETURN(void)) iemRaiseGeneralProtectionFault0Jmp(PVMCPU pVCpu);
     738DECL_NO_INLINE(IEM_STATIC, DECL_NO_RETURN(void)) iemRaiseSelectorBoundsJmp(PVMCPU pVCpu, uint32_t iSegReg, uint32_t fAccess);
     739DECL_NO_INLINE(IEM_STATIC, DECL_NO_RETURN(void)) iemRaiseSelectorBoundsBySelectorJmp(PVMCPU pVCpu, RTSEL Sel);
     740DECL_NO_INLINE(IEM_STATIC, DECL_NO_RETURN(void)) iemRaiseSelectorInvalidAccessJmp(PVMCPU pVCpu, uint32_t iSegReg, uint32_t fAccess);
     741#endif
     742
    735743IEM_STATIC VBOXSTRICTRC     iemMemMap(PVMCPU pVCpu, void **ppvMem, size_t cbMem, uint8_t iSegReg, RTGCPTR GCPtrMem, uint32_t fAccess);
    736744IEM_STATIC VBOXSTRICTRC     iemMemCommitAndUnmap(PVMCPU pVCpu, void *pvMem, uint32_t fAccess);
     
    859867    pVCpu->iem.s.uRexIndex          = 127;
    860868    pVCpu->iem.s.iEffSeg            = 127;
     869    pVCpu->iem.s.uFpuOpcode         = UINT16_MAX;
     870# ifdef IEM_WITH_CODE_TLB
     871    pVCpu->iem.s.offInstrNextByte   = UINT16_MAX;
     872    pVCpu->iem.s.pbInstrBuf         = NULL;
     873    pVCpu->iem.s.cbInstrBuf         = UINT16_MAX;
     874    pVCpu->iem.s.cbInstrBufTotal    = UINT16_MAX;
     875    pVCpu->iem.s.offCurInstrStart   = UINT16_MAX;
     876    pVCpu->iem.s.uInstrBufPc        = UINT64_C(0xc0ffc0ffcff0c0ff);
     877# else
    861878    pVCpu->iem.s.offOpcode          = 127;
    862879    pVCpu->iem.s.cbOpcode           = 127;
     880# endif
    863881#endif
    864882
     
    896914#endif
    897915#ifdef VBOX_STRICT
     916# ifdef IEM_WITH_CODE_TLB
     917# else
    898918    pVCpu->iem.s.cbOpcode = 0;
     919# endif
    899920#else
    900921    NOREF(pVCpu);
     
    956977    pVCpu->iem.s.uRexIndex          = 0;
    957978    pVCpu->iem.s.iEffSeg            = X86_SREG_DS;
     979#ifdef IEM_WITH_CODE_TLB
     980    pVCpu->iem.s.pbInstrBuf         = NULL;
     981    pVCpu->iem.s.offInstrNextByte   = 0;
     982    pVCpu->iem.s.offCurInstrStart   = 0;
     983# ifdef VBOX_STRICT
     984    pVCpu->iem.s.cbInstrBuf         = UINT16_MAX;
     985    pVCpu->iem.s.cbInstrBufTotal    = UINT16_MAX;
     986    pVCpu->iem.s.uInstrBufPc        = UINT64_C(0xc0ffc0ffcff0c0ff);
     987# endif
     988#else
    958989    pVCpu->iem.s.offOpcode          = 0;
    959990    pVCpu->iem.s.cbOpcode           = 0;
     991#endif
    960992    pVCpu->iem.s.cActiveMappings    = 0;
    961993    pVCpu->iem.s.iNextMapping       = 0;
     
    10361068    pVCpu->iem.s.uRexIndex          = 0;
    10371069    pVCpu->iem.s.iEffSeg            = X86_SREG_DS;
    1038     // busted and need rewrite:
    1039     //if (pVCpu->iem.s.cbOpcode > pVCpu->iem.s.offOpcode) /* No need to check RIP here because branch instructions will update cbOpcode.  */
    1040     //{
    1041     //    pVCpu->iem.s.cbOpcode      -= pVCpu->iem.s.offOpcode;
    1042     //    memmove(&pVCpu->iem.s.abOpcode[0], &pVCpu->iem.s.abOpcode[pVCpu->iem.s.offOpcode], pVCpu->iem.s.cbOpcode);
    1043     //}
    1044     //else
    1045         pVCpu->iem.s.cbOpcode       = 0;
     1070#ifdef IEM_WITH_CODE_TLB
     1071    if (pVCpu->iem.s.pbInstrBuf)
     1072    {
     1073        uint64_t off = (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT ? pCtx->rip : pCtx->eip + (uint32_t)pCtx->cs.u64Base)
     1074                     - pVCpu->iem.s.uInstrBufPc;
     1075        if (off < pVCpu->iem.s.cbInstrBufTotal)
     1076        {
     1077            pVCpu->iem.s.offInstrNextByte = (uint32_t)off;
     1078            pVCpu->iem.s.offCurInstrStart = (uint16_t)off;
     1079            if ((uint16_t)off + 15 <= pVCpu->iem.s.cbInstrBufTotal)
     1080                pVCpu->iem.s.cbInstrBuf = (uint16_t)off + 15;
     1081            else
     1082                pVCpu->iem.s.cbInstrBuf = pVCpu->iem.s.cbInstrBufTotal;
     1083        }
     1084        else
     1085        {
     1086            pVCpu->iem.s.pbInstrBuf       = NULL;
     1087            pVCpu->iem.s.offInstrNextByte = 0;
     1088            pVCpu->iem.s.offCurInstrStart = 0;
     1089        }
     1090    }
     1091    else
     1092    {
     1093        pVCpu->iem.s.offInstrNextByte = 0;
     1094        pVCpu->iem.s.offCurInstrStart = 0;
     1095    }
     1096#else
     1097    pVCpu->iem.s.cbOpcode           = 0;
    10461098    pVCpu->iem.s.offOpcode          = 0;
     1099#endif
    10471100    Assert(pVCpu->iem.s.cActiveMappings == 0);
    10481101    pVCpu->iem.s.iNextMapping       = 0;
     
    10951148#endif
    10961149    iemInitDecoder(pVCpu, fBypassHandlers);
     1150
     1151#ifdef IEM_WITH_CODE_TLB
     1152    /** @todo Do ITLB lookup here. */
     1153
     1154#else /* !IEM_WITH_CODE_TLB */
    10971155
    10981156    /*
     
    11281186    }
    11291187
    1130 #ifdef VBOX_WITH_RAW_MODE_NOT_R0
     1188# ifdef VBOX_WITH_RAW_MODE_NOT_R0
    11311189    /* Allow interpretation of patch manager code blocks since they can for
    11321190       instance throw #PFs for perfectly good reasons. */
     
    11391197        return VINF_SUCCESS;
    11401198    }
    1141 #endif /* VBOX_WITH_RAW_MODE_NOT_R0 */
     1199# endif /* VBOX_WITH_RAW_MODE_NOT_R0 */
    11421200
    11431201    RTGCPHYS    GCPhys;
     
    11641222     *        TLB... */
    11651223
    1166 #ifdef IEM_VERIFICATION_MODE_FULL
     1224# ifdef IEM_VERIFICATION_MODE_FULL
    11671225    /*
    11681226     * Optimistic optimization: Use unconsumed opcode bytes from the previous
     
    11811239        return VINF_SUCCESS;
    11821240    }
    1183 #endif
     1241# endif
    11841242
    11851243    /*
     
    11871245     */
    11881246    PVM pVM = pVCpu->CTX_SUFF(pVM);
    1189 #if defined(IN_RING3) && defined(VBOX_WITH_RAW_MODE_NOT_R0)
     1247# if defined(IN_RING3) && defined(VBOX_WITH_RAW_MODE_NOT_R0)
    11901248    size_t cbActual;
    11911249    if (   PATMIsEnabled(pVM)
     
    11971255    }
    11981256    else
    1199 #endif
     1257# endif
    12001258    {
    12011259        uint32_t cbLeftOnPage = PAGE_SIZE - (GCPtrPC & PAGE_OFFSET_MASK);
     
    12391297        pVCpu->iem.s.cbOpcode = cbToTryRead;
    12401298    }
    1241 
     1299#endif /* !IEM_WITH_CODE_TLB */
    12421300    return VINF_SUCCESS;
    12431301}
    12441302
    12451303
    1246 /**
    1247  * Try fetch at least @a cbMin bytes more opcodes, raise the appropriate
    1248  * exception if it fails.
    1249  *
    1250  * @returns Strict VBox status code.
     1304#ifdef IEM_WITH_CODE_TLB
     1305
     1306/**
     1307 * Tries to fetches @a cbDst opcode bytes, raise the appropriate exception on
     1308 * failure and jumps.
     1309 *
     1310 * We end up here for a number of reasons:
     1311 *      - pbInstrBuf isn't yet initialized.
     1312 *      - Advancing beyond the buffer boundrary (e.g. cross page).
     1313 *      - Advancing beyond the CS segment limit.
     1314 *      - Fetching from non-mappable page (e.g. MMIO).
     1315 *
    12511316 * @param   pVCpu               The cross context virtual CPU structure of the
    12521317 *                              calling thread.
    1253  * @param   cbMin               The minimum number of bytes relative offOpcode
    1254  *                              that must be read.
    1255  */
    1256 IEM_STATIC VBOXSTRICTRC iemOpcodeFetchMoreBytes(PVMCPU pVCpu, size_t cbMin)
    1257 {
     1318 * @param   pvDst               Where to return the bytes.
     1319 * @param   cbDst               Number of bytes to read.
     1320 *
     1321 * @todo    Make cbDst = 0 a way of initializing pbInstrBuf?
     1322 */
     1323IEM_STATIC void iemOpcodeFetchBytesJmp(PVMCPU pVCpu, size_t cbDst, void *pvDst)
     1324{
     1325    Assert(cbDst <= 8);
     1326    uint32_t offBuf = pVCpu->iem.s.offInstrNextByte;
     1327
     1328    /*
     1329     * We might have a partial buffer match, deal with that first to make the
     1330     * rest simpler.  This is the first part of the cross page/buffer case.
     1331     */
     1332    if (pVCpu->iem.s.pbInstrBuf != NULL)
     1333    {
     1334        if (offBuf < pVCpu->iem.s.cbInstrBuf)
     1335        {
     1336            Assert(offBuf + cbDst > pVCpu->iem.s.cbInstrBuf);
     1337            uint32_t const cbCopy = pVCpu->iem.s.cbInstrBuf - pVCpu->iem.s.offInstrNextByte;
     1338            memcpy(pvDst, &pVCpu->iem.s.pbInstrBuf[offBuf], cbCopy);
     1339
     1340            cbDst  -= cbCopy;
     1341            pvDst   = (uint8_t *)pvDst + cbCopy;
     1342            offBuf += cbCopy;
     1343            pVCpu->iem.s.offInstrNextByte += offBuf;
     1344        }
     1345    }
     1346
     1347    /*
     1348     * Check segment limit, figuring how much we're allowed to access at this point.
     1349     */
     1350    PCPUMCTX pCtx = IEM_GET_CTX(pVCpu);
     1351    RTGCPTR  GCPtrFirst;
     1352    uint32_t cbMaxRead;
     1353    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
     1354    {
     1355        GCPtrFirst = pCtx->rip + (offBuf - pVCpu->iem.s.offCurInstrStart);
     1356        if (RT_LIKELY(IEM_IS_CANONICAL(GCPtrFirst)))
     1357        { /* likely */ }
     1358        else
     1359            iemRaiseGeneralProtectionFault0Jmp(pVCpu);
     1360        cbMaxRead = X86_PAGE_SIZE - ((uint32_t)GCPtrFirst & X86_PAGE_OFFSET_MASK);
     1361    }
     1362    else
     1363    {
     1364        GCPtrFirst = pCtx->eip + (offBuf - pVCpu->iem.s.offCurInstrStart);
     1365        Assert(!(GCPtrFirst & ~(uint32_t)UINT16_MAX) || pVCpu->iem.s.enmCpuMode == IEMMODE_32BIT);
     1366        if (RT_LIKELY((uint32_t)GCPtrFirst <= pCtx->cs.u32Limit))
     1367        { /* likely */ }
     1368        else
     1369            iemRaiseSelectorBoundsJmp(pVCpu, X86_SREG_CS, IEM_ACCESS_INSTRUCTION);
     1370        cbMaxRead = pCtx->cs.u32Limit - (uint32_t)GCPtrFirst + 1;
     1371        if (cbMaxRead != 0)
     1372        { /* likely */ }
     1373        else
     1374        {
     1375            /* Overflowed because address is 0 and limit is max. */
     1376            Assert(GCPtrFirst == 0); Assert(pCtx->cs.u32Limit == UINT32_MAX);
     1377            cbMaxRead = X86_PAGE_SIZE;
     1378        }
     1379        GCPtrFirst = (uint32_t)GCPtrFirst + (uint32_t)pCtx->cs.u64Base;
     1380        uint32_t cbMaxRead2 = X86_PAGE_SIZE - ((uint32_t)GCPtrFirst & X86_PAGE_OFFSET_MASK);
     1381        if (cbMaxRead2 < cbMaxRead)
     1382            cbMaxRead = cbMaxRead2;
     1383        /** @todo testcase: unreal modes, both huge 16-bit and 32-bit. */
     1384    }
     1385
     1386    /*
     1387     * Try use the code TLB to translate the address.
     1388     */
     1389    uint64_t     uTag  = (GCPtrFirst >> X86_PAGE_SHIFT) | pVCpu->iem.s.CodeTlb.uTlbRevision;
     1390    AssertCompile(RT_ELEMENTS(pVCpu->iem.s.CodeTlb.aEntries) == 256);
     1391    PIEMTLBENTRY pTlbe = &pVCpu->iem.s.CodeTlb.aEntries[(uint8_t)uTag];
     1392    if (pTlbe->uTag == uTag)
     1393    {
     1394
     1395    }
     1396
     1397
     1398
    12581399    /*
    12591400     * What we're doing here is very similar to iemMemMap/iemMemBounceBufferMap.
     
    12611402     * First translate CS:rIP to a physical address.
    12621403     */
    1263     PCPUMCTX    pCtx = IEM_GET_CTX(pVCpu);
     1404# if 0 /** @todo later */
    12641405    uint8_t     cbLeft = pVCpu->iem.s.cbOpcode - pVCpu->iem.s.offOpcode; Assert(cbLeft < cbMin);
    12651406    uint32_t    cbToTryRead;
     
    13011442    Assert(cbToTryRead >= cbMin - cbLeft); /* ASSUMPTION based on iemInitDecoderAndPrefetchOpcodes. */
    13021443
    1303 #ifdef VBOX_WITH_RAW_MODE_NOT_R0
     1444# ifdef VBOX_WITH_RAW_MODE_NOT_R0
    13041445    /* Allow interpretation of patch manager code blocks since they can for
    13051446       instance throw #PFs for perfectly good reasons. */
     
    13121453        return VINF_SUCCESS;
    13131454    }
    1314 #endif /* VBOX_WITH_RAW_MODE_NOT_R0 */
     1455# endif /* VBOX_WITH_RAW_MODE_NOT_R0 */
    13151456
    13161457    RTGCPHYS    GCPhys;
     
    13791520    pVCpu->iem.s.cbOpcode += cbToTryRead;
    13801521    Log5(("%.*Rhxs\n", pVCpu->iem.s.cbOpcode, pVCpu->iem.s.abOpcode));
     1522# endif
     1523}
     1524
     1525#else
     1526
     1527/**
     1528 * Try fetch at least @a cbMin bytes more opcodes, raise the appropriate
     1529 * exception if it fails.
     1530 *
     1531 * @returns Strict VBox status code.
     1532 * @param   pVCpu               The cross context virtual CPU structure of the
     1533 *                              calling thread.
     1534 * @param   cbMin               The minimum number of bytes relative offOpcode
     1535 *                              that must be read.
     1536 */
     1537IEM_STATIC VBOXSTRICTRC iemOpcodeFetchMoreBytes(PVMCPU pVCpu, size_t cbMin)
     1538{
     1539    /*
     1540     * What we're doing here is very similar to iemMemMap/iemMemBounceBufferMap.
     1541     *
     1542     * First translate CS:rIP to a physical address.
     1543     */
     1544    PCPUMCTX    pCtx = IEM_GET_CTX(pVCpu);
     1545    uint8_t     cbLeft = pVCpu->iem.s.cbOpcode - pVCpu->iem.s.offOpcode; Assert(cbLeft < cbMin);
     1546    uint32_t    cbToTryRead;
     1547    RTGCPTR     GCPtrNext;
     1548    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
     1549    {
     1550        cbToTryRead = PAGE_SIZE;
     1551        GCPtrNext   = pCtx->rip + pVCpu->iem.s.cbOpcode;
     1552        if (!IEM_IS_CANONICAL(GCPtrNext))
     1553            return iemRaiseGeneralProtectionFault0(pVCpu);
     1554    }
     1555    else
     1556    {
     1557        uint32_t GCPtrNext32 = pCtx->eip;
     1558        Assert(!(GCPtrNext32 & ~(uint32_t)UINT16_MAX) || pVCpu->iem.s.enmCpuMode == IEMMODE_32BIT);
     1559        GCPtrNext32 += pVCpu->iem.s.cbOpcode;
     1560        if (GCPtrNext32 > pCtx->cs.u32Limit)
     1561            return iemRaiseSelectorBounds(pVCpu, X86_SREG_CS, IEM_ACCESS_INSTRUCTION);
     1562        cbToTryRead = pCtx->cs.u32Limit - GCPtrNext32 + 1;
     1563        if (!cbToTryRead) /* overflowed */
     1564        {
     1565            Assert(GCPtrNext32 == 0); Assert(pCtx->cs.u32Limit == UINT32_MAX);
     1566            cbToTryRead = UINT32_MAX;
     1567            /** @todo check out wrapping around the code segment.  */
     1568        }
     1569        if (cbToTryRead < cbMin - cbLeft)
     1570            return iemRaiseSelectorBounds(pVCpu, X86_SREG_CS, IEM_ACCESS_INSTRUCTION);
     1571        GCPtrNext = (uint32_t)pCtx->cs.u64Base + GCPtrNext32;
     1572    }
     1573
     1574    /* Only read up to the end of the page, and make sure we don't read more
     1575       than the opcode buffer can hold. */
     1576    uint32_t cbLeftOnPage = PAGE_SIZE - (GCPtrNext & PAGE_OFFSET_MASK);
     1577    if (cbToTryRead > cbLeftOnPage)
     1578        cbToTryRead = cbLeftOnPage;
     1579    if (cbToTryRead > sizeof(pVCpu->iem.s.abOpcode) - pVCpu->iem.s.cbOpcode)
     1580        cbToTryRead = sizeof(pVCpu->iem.s.abOpcode) - pVCpu->iem.s.cbOpcode;
     1581/** @todo r=bird: Convert assertion into undefined opcode exception? */
     1582    Assert(cbToTryRead >= cbMin - cbLeft); /* ASSUMPTION based on iemInitDecoderAndPrefetchOpcodes. */
     1583
     1584# ifdef VBOX_WITH_RAW_MODE_NOT_R0
     1585    /* Allow interpretation of patch manager code blocks since they can for
     1586       instance throw #PFs for perfectly good reasons. */
     1587    if (pVCpu->iem.s.fInPatchCode)
     1588    {
     1589        size_t cbRead = 0;
     1590        int rc = PATMReadPatchCode(pVCpu->CTX_SUFF(pVM), GCPtrNext, pVCpu->iem.s.abOpcode, cbToTryRead, &cbRead);
     1591        AssertRCReturn(rc, rc);
     1592        pVCpu->iem.s.cbOpcode = (uint8_t)cbRead; Assert(pVCpu->iem.s.cbOpcode == cbRead); Assert(cbRead > 0);
     1593        return VINF_SUCCESS;
     1594    }
     1595# endif /* VBOX_WITH_RAW_MODE_NOT_R0 */
     1596
     1597    RTGCPHYS    GCPhys;
     1598    uint64_t    fFlags;
     1599    int rc = PGMGstGetPage(pVCpu, GCPtrNext, &fFlags, &GCPhys);
     1600    if (RT_FAILURE(rc))
     1601    {
     1602        Log(("iemOpcodeFetchMoreBytes: %RGv - rc=%Rrc\n", GCPtrNext, rc));
     1603        return iemRaisePageFault(pVCpu, GCPtrNext, IEM_ACCESS_INSTRUCTION, rc);
     1604    }
     1605    if (!(fFlags & X86_PTE_US) && pVCpu->iem.s.uCpl == 3)
     1606    {
     1607        Log(("iemOpcodeFetchMoreBytes: %RGv - supervisor page\n", GCPtrNext));
     1608        return iemRaisePageFault(pVCpu, GCPtrNext, IEM_ACCESS_INSTRUCTION, VERR_ACCESS_DENIED);
     1609    }
     1610    if ((fFlags & X86_PTE_PAE_NX) && (pCtx->msrEFER & MSR_K6_EFER_NXE))
     1611    {
     1612        Log(("iemOpcodeFetchMoreBytes: %RGv - NX\n", GCPtrNext));
     1613        return iemRaisePageFault(pVCpu, GCPtrNext, IEM_ACCESS_INSTRUCTION, VERR_ACCESS_DENIED);
     1614    }
     1615    GCPhys |= GCPtrNext & PAGE_OFFSET_MASK;
     1616    Log5(("GCPtrNext=%RGv GCPhys=%RGp cbOpcodes=%#x\n",  GCPtrNext,  GCPhys,  pVCpu->iem.s.cbOpcode));
     1617    /** @todo Check reserved bits and such stuff. PGM is better at doing
     1618     *        that, so do it when implementing the guest virtual address
     1619     *        TLB... */
     1620
     1621    /*
     1622     * Read the bytes at this address.
     1623     *
     1624     * We read all unpatched bytes in iemInitDecoderAndPrefetchOpcodes already,
     1625     * and since PATM should only patch the start of an instruction there
     1626     * should be no need to check again here.
     1627     */
     1628    if (!pVCpu->iem.s.fBypassHandlers)
     1629    {
     1630        VBOXSTRICTRC rcStrict = PGMPhysRead(pVCpu->CTX_SUFF(pVM), GCPhys, &pVCpu->iem.s.abOpcode[pVCpu->iem.s.cbOpcode],
     1631                                            cbToTryRead, PGMACCESSORIGIN_IEM);
     1632        if (RT_LIKELY(rcStrict == VINF_SUCCESS))
     1633        { /* likely */ }
     1634        else if (PGM_PHYS_RW_IS_SUCCESS(rcStrict))
     1635        {
     1636            Log(("iemOpcodeFetchMoreBytes: %RGv/%RGp LB %#x - read status -  rcStrict=%Rrc\n",
     1637                 GCPtrNext, GCPhys, VBOXSTRICTRC_VAL(rcStrict), cbToTryRead));
     1638            rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
     1639        }
     1640        else
     1641        {
     1642            Log((RT_SUCCESS(rcStrict)
     1643                 ? "iemOpcodeFetchMoreBytes: %RGv/%RGp LB %#x - read status - rcStrict=%Rrc\n"
     1644                 : "iemOpcodeFetchMoreBytes: %RGv/%RGp LB %#x - read error - rcStrict=%Rrc (!!)\n",
     1645                 GCPtrNext, GCPhys, VBOXSTRICTRC_VAL(rcStrict), cbToTryRead));
     1646            return rcStrict;
     1647        }
     1648    }
     1649    else
     1650    {
     1651        rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), &pVCpu->iem.s.abOpcode[pVCpu->iem.s.cbOpcode], GCPhys, cbToTryRead);
     1652        if (RT_SUCCESS(rc))
     1653        { /* likely */ }
     1654        else
     1655        {
     1656            Log(("iemOpcodeFetchMoreBytes: %RGv - read error - rc=%Rrc (!!)\n", GCPtrNext, rc));
     1657            return rc;
     1658        }
     1659    }
     1660    pVCpu->iem.s.cbOpcode += cbToTryRead;
     1661    Log5(("%.*Rhxs\n", pVCpu->iem.s.cbOpcode, pVCpu->iem.s.abOpcode));
    13811662
    13821663    return VINF_SUCCESS;
    13831664}
    13841665
     1666#endif /* !IEM_WITH_CODE_TLB */
    13851667#ifndef IEM_WITH_SETJMP
    13861668
     
    14381720DECL_NO_INLINE(IEM_STATIC, uint8_t) iemOpcodeGetNextU8SlowJmp(PVMCPU pVCpu)
    14391721{
     1722# ifdef IEM_WITH_CODE_TLB
     1723    uint8_t u8;
     1724    iemOpcodeFetchBytesJmp(pVCpu, sizeof(u8), &u8);
     1725    return u8;
     1726# else
    14401727    VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pVCpu, 1);
    14411728    if (rcStrict == VINF_SUCCESS)
    14421729        return pVCpu->iem.s.abOpcode[pVCpu->iem.s.offOpcode++];
    14431730    longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     1731# endif
    14441732}
    14451733
     
    14531741DECLINLINE(uint8_t) iemOpcodeGetNextU8Jmp(PVMCPU pVCpu)
    14541742{
     1743# ifdef IEM_WITH_CODE_TLB
     1744    uintptr_t       offBuf = pVCpu->iem.s.offInstrNextByte;
     1745    uint8_t const  *pbBuf  = pVCpu->iem.s.pbInstrBuf;
     1746    if (RT_LIKELY(   pbBuf != NULL
     1747                  && offBuf < pVCpu->iem.s.cbInstrBuf))
     1748    {
     1749        pVCpu->iem.s.offInstrNextByte = (uint32_t)offBuf + 1;
     1750        return pbBuf[offBuf];
     1751    }
     1752# else
    14551753    uintptr_t offOpcode = pVCpu->iem.s.offOpcode;
    14561754    if (RT_LIKELY((uint8_t)offOpcode < pVCpu->iem.s.cbOpcode))
     
    14591757        return pVCpu->iem.s.abOpcode[offOpcode];
    14601758    }
     1759# endif
    14611760    return iemOpcodeGetNextU8SlowJmp(pVCpu);
    14621761}
     
    17602059DECL_NO_INLINE(IEM_STATIC, uint16_t) iemOpcodeGetNextU16SlowJmp(PVMCPU pVCpu)
    17612060{
     2061# ifdef IEM_WITH_CODE_TLB
     2062    uint16_t u16;
     2063    iemOpcodeFetchBytesJmp(pVCpu, sizeof(u16), &u16);
     2064    return u16;
     2065# else
    17622066    VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pVCpu, 2);
    17632067    if (rcStrict == VINF_SUCCESS)
     
    17652069        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
    17662070        pVCpu->iem.s.offOpcode += 2;
    1767 # ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     2071#  ifdef IEM_USE_UNALIGNED_DATA_ACCESS
    17682072        return *(uint16_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
     2073#  else
     2074        return RT_MAKE_U16(pVCpu->iem.s.abOpcode[offOpcode], pVCpu->iem.s.abOpcode[offOpcode + 1]);
     2075#  endif
     2076    }
     2077    longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     2078# endif
     2079}
     2080
     2081
     2082/**
     2083 * Fetches the next opcode word, longjmp on error.
     2084 *
     2085 * @returns The opcode word.
     2086 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     2087 */
     2088DECLINLINE(uint16_t) iemOpcodeGetNextU16Jmp(PVMCPU pVCpu)
     2089{
     2090# ifdef IEM_WITH_CODE_TLB
     2091    uintptr_t       offBuf = pVCpu->iem.s.offInstrNextByte;
     2092    uint8_t const  *pbBuf  = pVCpu->iem.s.pbInstrBuf;
     2093    if (RT_LIKELY(   pbBuf != NULL
     2094                  && offBuf + 2 <= pVCpu->iem.s.cbInstrBuf))
     2095    {
     2096        pVCpu->iem.s.offInstrNextByte = (uint32_t)offBuf + 2;
     2097#  ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     2098        return *(uint16_t const *)&pbBuf[offBuf];
     2099#  else
     2100        return RT_MAKE_U16(pbBuf[offBuf], pbBuf[offBuf + 1]);
     2101#  endif
     2102    }
    17692103# else
    1770         return RT_MAKE_U16(pVCpu->iem.s.abOpcode[offOpcode], pVCpu->iem.s.abOpcode[offOpcode + 1]);
    1771 # endif
    1772     }
    1773     longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    1774 }
    1775 
    1776 
    1777 /**
    1778  * Fetches the next opcode word, longjmp on error.
    1779  *
    1780  * @returns The opcode word.
    1781  * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    1782  */
    1783 DECLINLINE(uint16_t) iemOpcodeGetNextU16Jmp(PVMCPU pVCpu)
    1784 {
    17852104    uintptr_t const offOpcode = pVCpu->iem.s.offOpcode;
    17862105    if (RT_LIKELY((uint8_t)offOpcode + 2 <= pVCpu->iem.s.cbOpcode))
    17872106    {
    17882107        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 2;
    1789 # ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     2108#  ifdef IEM_USE_UNALIGNED_DATA_ACCESS
    17902109        return *(uint16_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
    1791 # else
     2110#  else
    17922111        return RT_MAKE_U16(pVCpu->iem.s.abOpcode[offOpcode], pVCpu->iem.s.abOpcode[offOpcode + 1]);
     2112#  endif
     2113    }
    17932114# endif
    1794     }
    17952115    return iemOpcodeGetNextU16SlowJmp(pVCpu);
    17962116}
     
    20462366DECL_NO_INLINE(IEM_STATIC, uint32_t) iemOpcodeGetNextU32SlowJmp(PVMCPU pVCpu)
    20472367{
     2368# ifdef IEM_WITH_CODE_TLB
     2369    uint32_t u32;
     2370    iemOpcodeFetchBytesJmp(pVCpu, sizeof(u32), &u32);
     2371    return u32;
     2372# else
    20482373    VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pVCpu, 4);
    20492374    if (rcStrict == VINF_SUCCESS)
     
    20512376        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
    20522377        pVCpu->iem.s.offOpcode = offOpcode + 4;
    2053 # ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     2378#  ifdef IEM_USE_UNALIGNED_DATA_ACCESS
    20542379        return *(uint32_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
    2055 # else
     2380#  else
    20562381        return RT_MAKE_U32_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
    20572382                                   pVCpu->iem.s.abOpcode[offOpcode + 1],
    20582383                                   pVCpu->iem.s.abOpcode[offOpcode + 2],
    20592384                                   pVCpu->iem.s.abOpcode[offOpcode + 3]);
     2385#  endif
     2386    }
     2387    longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    20602388# endif
    2061     }
    2062     longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    20632389}
    20642390
     
    20722398DECLINLINE(uint32_t) iemOpcodeGetNextU32Jmp(PVMCPU pVCpu)
    20732399{
     2400# ifdef IEM_WITH_CODE_TLB
     2401    uintptr_t       offBuf = pVCpu->iem.s.offInstrNextByte;
     2402    uint8_t const  *pbBuf  = pVCpu->iem.s.pbInstrBuf;
     2403    if (RT_LIKELY(   pbBuf != NULL
     2404                  && offBuf + 4 <= pVCpu->iem.s.cbInstrBuf))
     2405    {
     2406        pVCpu->iem.s.offInstrNextByte = (uint32_t)offBuf + 4;
     2407#  ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     2408        return *(uint32_t const *)&pbBuf[offBuf];
     2409#  else
     2410        return RT_MAKE_U32_FROM_U8(pbBuf[offBuf],
     2411                                   pbBuf[offBuf + 1],
     2412                                   pbBuf[offBuf + 2],
     2413                                   pbBuf[offBuf + 3]);
     2414#  endif
     2415    }
     2416# else
    20742417    uintptr_t const offOpcode = pVCpu->iem.s.offOpcode;
    20752418    if (RT_LIKELY((uint8_t)offOpcode + 4 <= pVCpu->iem.s.cbOpcode))
    20762419    {
    20772420        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 4;
    2078 # ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     2421#  ifdef IEM_USE_UNALIGNED_DATA_ACCESS
    20792422        return *(uint32_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
    2080 # else
     2423#  else
    20812424        return RT_MAKE_U32_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
    20822425                                   pVCpu->iem.s.abOpcode[offOpcode + 1],
    20832426                                   pVCpu->iem.s.abOpcode[offOpcode + 2],
    20842427                                   pVCpu->iem.s.abOpcode[offOpcode + 3]);
     2428#  endif
     2429    }
    20852430# endif
    2086     }
    20872431    return iemOpcodeGetNextU32SlowJmp(pVCpu);
    20882432}
     
    23592703DECL_NO_INLINE(IEM_STATIC, uint64_t) iemOpcodeGetNextU64SlowJmp(PVMCPU pVCpu)
    23602704{
     2705# ifdef IEM_WITH_CODE_TLB
     2706    uint64_t u64;
     2707    iemOpcodeFetchBytesJmp(pVCpu, sizeof(u64), &u64);
     2708    return u64;
     2709# else
    23612710    VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pVCpu, 8);
    23622711    if (rcStrict == VINF_SUCCESS)
     
    23642713        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
    23652714        pVCpu->iem.s.offOpcode = offOpcode + 8;
    2366 # ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     2715#  ifdef IEM_USE_UNALIGNED_DATA_ACCESS
    23672716        return *(uint64_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
    2368 # else
     2717#  else
    23692718        return RT_MAKE_U64_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
    23702719                                   pVCpu->iem.s.abOpcode[offOpcode + 1],
     
    23752724                                   pVCpu->iem.s.abOpcode[offOpcode + 6],
    23762725                                   pVCpu->iem.s.abOpcode[offOpcode + 7]);
     2726#  endif
     2727    }
     2728    longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    23772729# endif
    2378     }
    2379     longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    23802730}
    23812731
     
    23892739DECLINLINE(uint64_t) iemOpcodeGetNextU64Jmp(PVMCPU pVCpu)
    23902740{
     2741# ifdef IEM_WITH_CODE_TLB
     2742    uintptr_t       offBuf = pVCpu->iem.s.offInstrNextByte;
     2743    uint8_t const  *pbBuf  = pVCpu->iem.s.pbInstrBuf;
     2744    if (RT_LIKELY(   pbBuf != NULL
     2745                  && offBuf + 8 <= pVCpu->iem.s.cbInstrBuf))
     2746    {
     2747        pVCpu->iem.s.offInstrNextByte = (uint32_t)offBuf + 8;
     2748#  ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     2749        return *(uint64_t const *)&pbBuf[offBuf];
     2750#  else
     2751        return RT_MAKE_U64_FROM_U8(pbBuf[offBuf],
     2752                                   pbBuf[offBuf + 1],
     2753                                   pbBuf[offBuf + 2],
     2754                                   pbBuf[offBuf + 3],
     2755                                   pbBuf[offBuf + 4],
     2756                                   pbBuf[offBuf + 5],
     2757                                   pbBuf[offBuf + 6],
     2758                                   pbBuf[offBuf + 7]);
     2759#  endif
     2760    }
     2761# else
    23912762    uintptr_t const offOpcode = pVCpu->iem.s.offOpcode;
    23922763    if (RT_LIKELY((uint8_t)offOpcode + 8 <= pVCpu->iem.s.cbOpcode))
    23932764    {
    23942765        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 8;
    2395 # ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     2766#  ifdef IEM_USE_UNALIGNED_DATA_ACCESS
    23962767        return *(uint64_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
    2397 # else
     2768#  else
    23982769        return RT_MAKE_U64_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
    23992770                                   pVCpu->iem.s.abOpcode[offOpcode + 1],
     
    24042775                                   pVCpu->iem.s.abOpcode[offOpcode + 6],
    24052776                                   pVCpu->iem.s.abOpcode[offOpcode + 7]);
     2777#  endif
     2778    }
    24062779# endif
    2407     }
    24082780    return iemOpcodeGetNextU64SlowJmp(pVCpu);
    24092781}
     
    44204792#endif
    44214793
     4794#ifndef IEM_WITH_CODE_TLB /** @todo we're doing it afterwards too, that should suffice... */
    44224795    /*
    44234796     * Flush prefetch buffer
    44244797     */
    44254798    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     4799#endif
    44264800
    44274801    /*
     
    45314905
    45324906    /* Flush the prefetch buffer. */
    4533     pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     4907#ifdef IEM_WITH_CODE_TLB
     4908    pVCpu->iem.s.pbInstrBuf = NULL;
     4909#else
     4910    pVCpu->iem.s.cbOpcode = IEM_GET_INSTR_LEN(pVCpu);
     4911#endif
    45344912
    45354913    /*
     
    52735651        case IEMMODE_16BIT:
    52745652        {
    5275             uint16_t uNewIp = pCtx->ip + offNextInstr + pVCpu->iem.s.offOpcode;
     5653            uint16_t uNewIp = pCtx->ip + offNextInstr + IEM_GET_INSTR_LEN(pVCpu);
    52765654            if (   uNewIp > pCtx->cs.u32Limit
    52775655                && pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT) /* no need to check for non-canonical. */
     
    52865664            Assert(pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT);
    52875665
    5288             uint32_t uNewEip = pCtx->eip + offNextInstr + pVCpu->iem.s.offOpcode;
     5666            uint32_t uNewEip = pCtx->eip + offNextInstr + IEM_GET_INSTR_LEN(pVCpu);
    52895667            if (uNewEip > pCtx->cs.u32Limit)
    52905668                return iemRaiseGeneralProtectionFault0(pVCpu);
     
    52975675            Assert(pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT);
    52985676
    5299             uint64_t uNewRip = pCtx->rip + offNextInstr + pVCpu->iem.s.offOpcode;
     5677            uint64_t uNewRip = pCtx->rip + offNextInstr + IEM_GET_INSTR_LEN(pVCpu);
    53005678            if (!IEM_IS_CANONICAL(uNewRip))
    53015679                return iemRaiseGeneralProtectionFault0(pVCpu);
     
    53095687    pCtx->eflags.Bits.u1RF = 0;
    53105688
     5689#ifndef IEM_WITH_CODE_TLB
    53115690    /* Flush the prefetch buffer. */
    5312     pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     5691    pVCpu->iem.s.cbOpcode = IEM_GET_INSTR_LEN(pVCpu);
     5692#endif
    53135693
    53145694    return VINF_SUCCESS;
     
    53315711    Assert(pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT);
    53325712
    5333     uint16_t uNewIp = pCtx->ip + offNextInstr + pVCpu->iem.s.offOpcode;
     5713    uint16_t uNewIp = pCtx->ip + offNextInstr + IEM_GET_INSTR_LEN(pVCpu);
    53345714    if (   uNewIp > pCtx->cs.u32Limit
    53355715        && pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT) /* no need to check for non-canonical. */
     
    53395719    pCtx->eflags.Bits.u1RF = 0;
    53405720
     5721#ifndef IEM_WITH_CODE_TLB
    53415722    /* Flush the prefetch buffer. */
    5342     pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     5723    pVCpu->iem.s.cbOpcode = IEM_GET_INSTR_LEN(pVCpu);
     5724#endif
    53435725
    53445726    return VINF_SUCCESS;
     
    53655747        Assert(pCtx->rip <= UINT32_MAX); Assert(pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT);
    53665748
    5367         uint32_t uNewEip = pCtx->eip + offNextInstr + pVCpu->iem.s.offOpcode;
     5749        uint32_t uNewEip = pCtx->eip + offNextInstr + IEM_GET_INSTR_LEN(pVCpu);
    53685750        if (uNewEip > pCtx->cs.u32Limit)
    53695751            return iemRaiseGeneralProtectionFault0(pVCpu);
     
    53745756        Assert(pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT);
    53755757
    5376         uint64_t uNewRip = pCtx->rip + offNextInstr + pVCpu->iem.s.offOpcode;
     5758        uint64_t uNewRip = pCtx->rip + offNextInstr + IEM_GET_INSTR_LEN(pVCpu);
    53775759        if (!IEM_IS_CANONICAL(uNewRip))
    53785760            return iemRaiseGeneralProtectionFault0(pVCpu);
     
    53815763    pCtx->eflags.Bits.u1RF = 0;
    53825764
     5765#ifndef IEM_WITH_CODE_TLB
    53835766    /* Flush the prefetch buffer. */
    5384     pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     5767    pVCpu->iem.s.cbOpcode = IEM_GET_INSTR_LEN(pVCpu);
     5768#endif
    53855769
    53865770    return VINF_SUCCESS;
     
    54405824    pCtx->eflags.Bits.u1RF = 0;
    54415825
     5826#ifndef IEM_WITH_CODE_TLB
    54425827    /* Flush the prefetch buffer. */
    5443     pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     5828    pVCpu->iem.s.cbOpcode = IEM_GET_INSTR_LEN(pVCpu);
     5829#endif
    54445830
    54455831    return VINF_SUCCESS;
     
    55045890IEM_STATIC void iemRegUpdateRipKeepRF(PVMCPU pVCpu)
    55055891{
    5506     return iemRegAddToRipKeepRF(pVCpu, pVCpu->iem.s.offOpcode);
     5892    return iemRegAddToRipKeepRF(pVCpu, IEM_GET_INSTR_LEN(pVCpu));
    55075893}
    55085894#endif
     
    55465932IEM_STATIC void iemRegUpdateRipAndClearRF(PVMCPU pVCpu)
    55475933{
    5548     return iemRegAddToRipAndClearRF(pVCpu, pVCpu->iem.s.offOpcode);
     5934    return iemRegAddToRipAndClearRF(pVCpu, IEM_GET_INSTR_LEN(pVCpu));
    55495935}
    55505936
     
    58756261DECLINLINE(void) iemFpuUpdateOpcodeAndIpWorker(PVMCPU pVCpu, PCPUMCTX pCtx, PX86FXSTATE pFpuCtx)
    58766262{
    5877     pFpuCtx->FOP       = pVCpu->iem.s.abOpcode[pVCpu->iem.s.offFpuOpcode]
    5878                        | ((uint16_t)(pVCpu->iem.s.abOpcode[pVCpu->iem.s.offFpuOpcode - 1] & 0x7) << 8);
     6263    Assert(pVCpu->iem.s.uFpuOpcode != UINT16_MAX);
     6264    pFpuCtx->FOP = pVCpu->iem.s.uFpuOpcode;
    58796265    /** @todo x87.CS and FPUIP needs to be kept seperately. */
    58806266    if (IEM_IS_REAL_OR_V86_MODE(pVCpu))
     
    1038910775 * @sa      IEM_DECL_IMPL_C_TYPE_0 and IEM_CIMPL_DEF_0.
    1039010776 */
    10391 #define IEM_MC_CALL_CIMPL_0(a_pfnCImpl)                 return (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode)
     10777#define IEM_MC_CALL_CIMPL_0(a_pfnCImpl)                 return (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu))
    1039210778
    1039310779/**
     
    1039810784 * @param   a0              The argument.
    1039910785 */
    10400 #define IEM_MC_CALL_CIMPL_1(a_pfnCImpl, a0)             return (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode, a0)
     10786#define IEM_MC_CALL_CIMPL_1(a_pfnCImpl, a0)             return (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0)
    1040110787
    1040210788/**
     
    1040810794 * @param   a1              The second extra argument.
    1040910795 */
    10410 #define IEM_MC_CALL_CIMPL_2(a_pfnCImpl, a0, a1)         return (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode, a0, a1)
     10796#define IEM_MC_CALL_CIMPL_2(a_pfnCImpl, a0, a1)         return (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1)
    1041110797
    1041210798/**
     
    1041910805 * @param   a2              The third extra argument.
    1042010806 */
    10421 #define IEM_MC_CALL_CIMPL_3(a_pfnCImpl, a0, a1, a2)     return (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode, a0, a1, a2)
     10807#define IEM_MC_CALL_CIMPL_3(a_pfnCImpl, a0, a1, a2)     return (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1, a2)
    1042210808
    1042310809/**
     
    1043110817 * @param   a3              The fourth extra argument.
    1043210818 */
    10433 #define IEM_MC_CALL_CIMPL_4(a_pfnCImpl, a0, a1, a2, a3)     return (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode, a0, a1, a2, a3)
     10819#define IEM_MC_CALL_CIMPL_4(a_pfnCImpl, a0, a1, a2, a3)     return (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1, a2, a3)
    1043410820
    1043510821/**
     
    1044410830 * @param   a4              The fifth extra argument.
    1044510831 */
    10446 #define IEM_MC_CALL_CIMPL_5(a_pfnCImpl, a0, a1, a2, a3, a4) return (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode, a0, a1, a2, a3, a4)
     10832#define IEM_MC_CALL_CIMPL_5(a_pfnCImpl, a0, a1, a2, a3, a4) return (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1, a2, a3, a4)
    1044710833
    1044810834/**
     
    1045510841 * @sa      IEM_DECL_IMPL_C_TYPE_0 and IEM_CIMPL_DEF_0.
    1045610842 */
    10457 #define IEM_MC_DEFER_TO_CIMPL_0(a_pfnCImpl)             (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode)
     10843#define IEM_MC_DEFER_TO_CIMPL_0(a_pfnCImpl)             (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu))
    1045810844
    1045910845/**
     
    1046610852 * @param   a0              The argument.
    1046710853 */
    10468 #define IEM_MC_DEFER_TO_CIMPL_1(a_pfnCImpl, a0)         (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode, a0)
     10854#define IEM_MC_DEFER_TO_CIMPL_1(a_pfnCImpl, a0)         (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0)
    1046910855
    1047010856/**
     
    1047810864 * @param   a1              The second extra argument.
    1047910865 */
    10480 #define IEM_MC_DEFER_TO_CIMPL_2(a_pfnCImpl, a0, a1)     (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode, a0, a1)
     10866#define IEM_MC_DEFER_TO_CIMPL_2(a_pfnCImpl, a0, a1)     (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1)
    1048110867
    1048210868/**
     
    1049110877 * @param   a2              The third extra argument.
    1049210878 */
    10493 #define IEM_MC_DEFER_TO_CIMPL_3(a_pfnCImpl, a0, a1, a2) (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode, a0, a1, a2)
     10879#define IEM_MC_DEFER_TO_CIMPL_3(a_pfnCImpl, a0, a1, a2) (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1, a2)
    1049410880
    1049510881/**
     
    1096811354        } \
    1096911355    } while (0)
     11356
    1097011357/**
    1097111358 * Done decoding, raise \#UD exception if any lock, repz or repnz prefixes
     
    1115111538        {
    1115211539            IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64EffAddr);
    11153             u64EffAddr += pCtx->rip + pVCpu->iem.s.offOpcode + cbImm;
     11540            u64EffAddr += pCtx->rip + IEM_GET_INSTR_LEN(pVCpu) + cbImm;
    1115411541        }
    1115511542        else
     
    1128311670
    1128411671
     11672/**
     11673 * Calculates the effective address of a ModR/M memory operand.
     11674 *
     11675 * Meant to be used via IEM_MC_CALC_RM_EFF_ADDR.
     11676 *
     11677 * @return  Strict VBox status code.
     11678 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     11679 * @param   bRm                 The ModRM byte.
     11680 * @param   cbImm               The size of any immediate following the
     11681 *                              effective address opcode bytes. Important for
     11682 *                              RIP relative addressing.
     11683 * @param   pGCPtrEff           Where to return the effective address.
     11684 * @param   offRsp              RSP displacement.
     11685 */
     11686IEM_STATIC VBOXSTRICTRC iemOpHlpCalcRmEffAddrEx(PVMCPU pVCpu, uint8_t bRm, uint8_t cbImm, PRTGCPTR pGCPtrEff, int8_t offRsp)
     11687{
     11688    Log5(("iemOpHlpCalcRmEffAddr: bRm=%#x\n", bRm));
     11689    PCCPUMCTX pCtx = IEM_GET_CTX(pVCpu);
     11690# define SET_SS_DEF() \
     11691    do \
     11692    { \
     11693        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SEG_MASK)) \
     11694            pVCpu->iem.s.iEffSeg = X86_SREG_SS; \
     11695    } while (0)
     11696
     11697    if (pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT)
     11698    {
     11699/** @todo Check the effective address size crap! */
     11700        if (pVCpu->iem.s.enmEffAddrMode == IEMMODE_16BIT)
     11701        {
     11702            uint16_t u16EffAddr;
     11703
     11704            /* Handle the disp16 form with no registers first. */
     11705            if ((bRm & (X86_MODRM_MOD_MASK | X86_MODRM_RM_MASK)) == 6)
     11706                IEM_OPCODE_GET_NEXT_U16(&u16EffAddr);
     11707            else
     11708            {
     11709                /* Get the displacment. */
     11710                switch ((bRm >> X86_MODRM_MOD_SHIFT) & X86_MODRM_MOD_SMASK)
     11711                {
     11712                    case 0:  u16EffAddr = 0;                             break;
     11713                    case 1:  IEM_OPCODE_GET_NEXT_S8_SX_U16(&u16EffAddr); break;
     11714                    case 2:  IEM_OPCODE_GET_NEXT_U16(&u16EffAddr);       break;
     11715                    default: AssertFailedReturn(VERR_IEM_IPE_1); /* (caller checked for these) */
     11716                }
     11717
     11718                /* Add the base and index registers to the disp. */
     11719                switch (bRm & X86_MODRM_RM_MASK)
     11720                {
     11721                    case 0: u16EffAddr += pCtx->bx + pCtx->si; break;
     11722                    case 1: u16EffAddr += pCtx->bx + pCtx->di; break;
     11723                    case 2: u16EffAddr += pCtx->bp + pCtx->si; SET_SS_DEF(); break;
     11724                    case 3: u16EffAddr += pCtx->bp + pCtx->di; SET_SS_DEF(); break;
     11725                    case 4: u16EffAddr += pCtx->si;            break;
     11726                    case 5: u16EffAddr += pCtx->di;            break;
     11727                    case 6: u16EffAddr += pCtx->bp;            SET_SS_DEF(); break;
     11728                    case 7: u16EffAddr += pCtx->bx;            break;
     11729                }
     11730            }
     11731
     11732            *pGCPtrEff = u16EffAddr;
     11733        }
     11734        else
     11735        {
     11736            Assert(pVCpu->iem.s.enmEffAddrMode == IEMMODE_32BIT);
     11737            uint32_t u32EffAddr;
     11738
     11739            /* Handle the disp32 form with no registers first. */
     11740            if ((bRm & (X86_MODRM_MOD_MASK | X86_MODRM_RM_MASK)) == 5)
     11741                IEM_OPCODE_GET_NEXT_U32(&u32EffAddr);
     11742            else
     11743            {
     11744                /* Get the register (or SIB) value. */
     11745                switch ((bRm & X86_MODRM_RM_MASK))
     11746                {
     11747                    case 0: u32EffAddr = pCtx->eax; break;
     11748                    case 1: u32EffAddr = pCtx->ecx; break;
     11749                    case 2: u32EffAddr = pCtx->edx; break;
     11750                    case 3: u32EffAddr = pCtx->ebx; break;
     11751                    case 4: /* SIB */
     11752                    {
     11753                        uint8_t bSib; IEM_OPCODE_GET_NEXT_U8(&bSib);
     11754
     11755                        /* Get the index and scale it. */
     11756                        switch ((bSib >> X86_SIB_INDEX_SHIFT) & X86_SIB_INDEX_SMASK)
     11757                        {
     11758                            case 0: u32EffAddr = pCtx->eax; break;
     11759                            case 1: u32EffAddr = pCtx->ecx; break;
     11760                            case 2: u32EffAddr = pCtx->edx; break;
     11761                            case 3: u32EffAddr = pCtx->ebx; break;
     11762                            case 4: u32EffAddr = 0; /*none */ break;
     11763                            case 5: u32EffAddr = pCtx->ebp; break;
     11764                            case 6: u32EffAddr = pCtx->esi; break;
     11765                            case 7: u32EffAddr = pCtx->edi; break;
     11766                            IEM_NOT_REACHED_DEFAULT_CASE_RET();
     11767                        }
     11768                        u32EffAddr <<= (bSib >> X86_SIB_SCALE_SHIFT) & X86_SIB_SCALE_SMASK;
     11769
     11770                        /* add base */
     11771                        switch (bSib & X86_SIB_BASE_MASK)
     11772                        {
     11773                            case 0: u32EffAddr += pCtx->eax; break;
     11774                            case 1: u32EffAddr += pCtx->ecx; break;
     11775                            case 2: u32EffAddr += pCtx->edx; break;
     11776                            case 3: u32EffAddr += pCtx->ebx; break;
     11777                            case 4:
     11778                                u32EffAddr += pCtx->esp + offRsp;
     11779                                SET_SS_DEF();
     11780                                break;
     11781                            case 5:
     11782                                if ((bRm & X86_MODRM_MOD_MASK) != 0)
     11783                                {
     11784                                    u32EffAddr += pCtx->ebp;
     11785                                    SET_SS_DEF();
     11786                                }
     11787                                else
     11788                                {
     11789                                    uint32_t u32Disp;
     11790                                    IEM_OPCODE_GET_NEXT_U32(&u32Disp);
     11791                                    u32EffAddr += u32Disp;
     11792                                }
     11793                                break;
     11794                            case 6: u32EffAddr += pCtx->esi; break;
     11795                            case 7: u32EffAddr += pCtx->edi; break;
     11796                            IEM_NOT_REACHED_DEFAULT_CASE_RET();
     11797                        }
     11798                        break;
     11799                    }
     11800                    case 5: u32EffAddr = pCtx->ebp; SET_SS_DEF(); break;
     11801                    case 6: u32EffAddr = pCtx->esi; break;
     11802                    case 7: u32EffAddr = pCtx->edi; break;
     11803                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
     11804                }
     11805
     11806                /* Get and add the displacement. */
     11807                switch ((bRm >> X86_MODRM_MOD_SHIFT) & X86_MODRM_MOD_SMASK)
     11808                {
     11809                    case 0:
     11810                        break;
     11811                    case 1:
     11812                    {
     11813                        int8_t i8Disp; IEM_OPCODE_GET_NEXT_S8(&i8Disp);
     11814                        u32EffAddr += i8Disp;
     11815                        break;
     11816                    }
     11817                    case 2:
     11818                    {
     11819                        uint32_t u32Disp; IEM_OPCODE_GET_NEXT_U32(&u32Disp);
     11820                        u32EffAddr += u32Disp;
     11821                        break;
     11822                    }
     11823                    default:
     11824                        AssertFailedReturn(VERR_IEM_IPE_2); /* (caller checked for these) */
     11825                }
     11826
     11827            }
     11828            if (pVCpu->iem.s.enmEffAddrMode == IEMMODE_32BIT)
     11829                *pGCPtrEff = u32EffAddr;
     11830            else
     11831            {
     11832                Assert(pVCpu->iem.s.enmEffAddrMode == IEMMODE_16BIT);
     11833                *pGCPtrEff = u32EffAddr & UINT16_MAX;
     11834            }
     11835        }
     11836    }
     11837    else
     11838    {
     11839        uint64_t u64EffAddr;
     11840
     11841        /* Handle the rip+disp32 form with no registers first. */
     11842        if ((bRm & (X86_MODRM_MOD_MASK | X86_MODRM_RM_MASK)) == 5)
     11843        {
     11844            IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64EffAddr);
     11845            u64EffAddr += pCtx->rip + IEM_GET_INSTR_LEN(pVCpu) + cbImm;
     11846        }
     11847        else
     11848        {
     11849            /* Get the register (or SIB) value. */
     11850            switch ((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB)
     11851            {
     11852                case  0: u64EffAddr = pCtx->rax; break;
     11853                case  1: u64EffAddr = pCtx->rcx; break;
     11854                case  2: u64EffAddr = pCtx->rdx; break;
     11855                case  3: u64EffAddr = pCtx->rbx; break;
     11856                case  5: u64EffAddr = pCtx->rbp; SET_SS_DEF(); break;
     11857                case  6: u64EffAddr = pCtx->rsi; break;
     11858                case  7: u64EffAddr = pCtx->rdi; break;
     11859                case  8: u64EffAddr = pCtx->r8;  break;
     11860                case  9: u64EffAddr = pCtx->r9;  break;
     11861                case 10: u64EffAddr = pCtx->r10; break;
     11862                case 11: u64EffAddr = pCtx->r11; break;
     11863                case 13: u64EffAddr = pCtx->r13; break;
     11864                case 14: u64EffAddr = pCtx->r14; break;
     11865                case 15: u64EffAddr = pCtx->r15; break;
     11866                /* SIB */
     11867                case 4:
     11868                case 12:
     11869                {
     11870                    uint8_t bSib; IEM_OPCODE_GET_NEXT_U8(&bSib);
     11871
     11872                    /* Get the index and scale it. */
     11873                    switch (((bSib >> X86_SIB_INDEX_SHIFT) & X86_SIB_INDEX_SMASK) | pVCpu->iem.s.uRexIndex)
     11874                    {
     11875                        case  0: u64EffAddr = pCtx->rax; break;
     11876                        case  1: u64EffAddr = pCtx->rcx; break;
     11877                        case  2: u64EffAddr = pCtx->rdx; break;
     11878                        case  3: u64EffAddr = pCtx->rbx; break;
     11879                        case  4: u64EffAddr = 0; /*none */ break;
     11880                        case  5: u64EffAddr = pCtx->rbp; break;
     11881                        case  6: u64EffAddr = pCtx->rsi; break;
     11882                        case  7: u64EffAddr = pCtx->rdi; break;
     11883                        case  8: u64EffAddr = pCtx->r8;  break;
     11884                        case  9: u64EffAddr = pCtx->r9;  break;
     11885                        case 10: u64EffAddr = pCtx->r10; break;
     11886                        case 11: u64EffAddr = pCtx->r11; break;
     11887                        case 12: u64EffAddr = pCtx->r12; break;
     11888                        case 13: u64EffAddr = pCtx->r13; break;
     11889                        case 14: u64EffAddr = pCtx->r14; break;
     11890                        case 15: u64EffAddr = pCtx->r15; break;
     11891                        IEM_NOT_REACHED_DEFAULT_CASE_RET();
     11892                    }
     11893                    u64EffAddr <<= (bSib >> X86_SIB_SCALE_SHIFT) & X86_SIB_SCALE_SMASK;
     11894
     11895                    /* add base */
     11896                    switch ((bSib & X86_SIB_BASE_MASK) | pVCpu->iem.s.uRexB)
     11897                    {
     11898                        case  0: u64EffAddr += pCtx->rax; break;
     11899                        case  1: u64EffAddr += pCtx->rcx; break;
     11900                        case  2: u64EffAddr += pCtx->rdx; break;
     11901                        case  3: u64EffAddr += pCtx->rbx; break;
     11902                        case  4: u64EffAddr += pCtx->rsp + offRsp; SET_SS_DEF(); break;
     11903                        case  6: u64EffAddr += pCtx->rsi; break;
     11904                        case  7: u64EffAddr += pCtx->rdi; break;
     11905                        case  8: u64EffAddr += pCtx->r8;  break;
     11906                        case  9: u64EffAddr += pCtx->r9;  break;
     11907                        case 10: u64EffAddr += pCtx->r10; break;
     11908                        case 11: u64EffAddr += pCtx->r11; break;
     11909                        case 12: u64EffAddr += pCtx->r12; break;
     11910                        case 14: u64EffAddr += pCtx->r14; break;
     11911                        case 15: u64EffAddr += pCtx->r15; break;
     11912                        /* complicated encodings */
     11913                        case 5:
     11914                        case 13:
     11915                            if ((bRm & X86_MODRM_MOD_MASK) != 0)
     11916                            {
     11917                                if (!pVCpu->iem.s.uRexB)
     11918                                {
     11919                                    u64EffAddr += pCtx->rbp;
     11920                                    SET_SS_DEF();
     11921                                }
     11922                                else
     11923                                    u64EffAddr += pCtx->r13;
     11924                            }
     11925                            else
     11926                            {
     11927                                uint32_t u32Disp;
     11928                                IEM_OPCODE_GET_NEXT_U32(&u32Disp);
     11929                                u64EffAddr += (int32_t)u32Disp;
     11930                            }
     11931                            break;
     11932                        IEM_NOT_REACHED_DEFAULT_CASE_RET();
     11933                    }
     11934                    break;
     11935                }
     11936                IEM_NOT_REACHED_DEFAULT_CASE_RET();
     11937            }
     11938
     11939            /* Get and add the displacement. */
     11940            switch ((bRm >> X86_MODRM_MOD_SHIFT) & X86_MODRM_MOD_SMASK)
     11941            {
     11942                case 0:
     11943                    break;
     11944                case 1:
     11945                {
     11946                    int8_t i8Disp;
     11947                    IEM_OPCODE_GET_NEXT_S8(&i8Disp);
     11948                    u64EffAddr += i8Disp;
     11949                    break;
     11950                }
     11951                case 2:
     11952                {
     11953                    uint32_t u32Disp;
     11954                    IEM_OPCODE_GET_NEXT_U32(&u32Disp);
     11955                    u64EffAddr += (int32_t)u32Disp;
     11956                    break;
     11957                }
     11958                IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* (caller checked for these) */
     11959            }
     11960
     11961        }
     11962
     11963        if (pVCpu->iem.s.enmEffAddrMode == IEMMODE_64BIT)
     11964            *pGCPtrEff = u64EffAddr;
     11965        else
     11966        {
     11967            Assert(pVCpu->iem.s.enmEffAddrMode == IEMMODE_32BIT);
     11968            *pGCPtrEff = u64EffAddr & UINT32_MAX;
     11969        }
     11970    }
     11971
     11972    Log5(("iemOpHlpCalcRmEffAddr: EffAddr=%#010RGv\n", *pGCPtrEff));
     11973    return VINF_SUCCESS;
     11974}
     11975
     11976
    1128511977#ifdef IEM_WITH_SETJMP
    1128611978/**
     
    1145312145    {
    1145412146        IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64EffAddr);
    11455         u64EffAddr += pCtx->rip + pVCpu->iem.s.offOpcode + cbImm;
     12147        u64EffAddr += pCtx->rip + IEM_GET_INSTR_LEN(pVCpu) + cbImm;
    1145612148    }
    1145712149    else
     
    1275513447    }
    1275613448//#ifdef DEBUG
    12757 //    AssertMsg(pVCpu->iem.s.offOpcode == cbInstr || rcStrict != VINF_SUCCESS, ("%u %u\n", pVCpu->iem.s.offOpcode, cbInstr));
     13449//    AssertMsg(IEM_GET_INSTR_LEN(pVCpu) == cbInstr || rcStrict != VINF_SUCCESS, ("%u %u\n", IEM_GET_INSTR_LEN(pVCpu), cbInstr));
    1275813450//#endif
    1275913451
     
    1291613608    {
    1291713609        iemInitDecoder(pVCpu, false);
     13610#ifdef IEM_WITH_CODE_TLB
     13611        pVCpu->iem.s.uInstrBufPc      = OpcodeBytesPC;
     13612        pVCpu->iem.s.pbInstrBuf       = (uint8_t const *)pvOpcodeBytes;
     13613        pVCpu->iem.s.cbInstrBufTotal  = (uint16_t)RT_MIN(X86_PAGE_SIZE, cbOpcodeBytes);
     13614        pVCpu->iem.s.offCurInstrStart = 0;
     13615        pVCpu->iem.s.offInstrNextByte = 0;
     13616#else
    1291813617        pVCpu->iem.s.cbOpcode = (uint8_t)RT_MIN(cbOpcodeBytes, sizeof(pVCpu->iem.s.abOpcode));
    1291913618        memcpy(pVCpu->iem.s.abOpcode, pvOpcodeBytes, pVCpu->iem.s.cbOpcode);
     13619#endif
    1292013620        rcStrict = VINF_SUCCESS;
    1292113621    }
     
    1296613666    {
    1296713667        iemInitDecoder(pVCpu, true);
     13668#ifdef IEM_WITH_CODE_TLB
     13669        pVCpu->iem.s.uInstrBufPc      = OpcodeBytesPC;
     13670        pVCpu->iem.s.pbInstrBuf       = (uint8_t const *)pvOpcodeBytes;
     13671        pVCpu->iem.s.cbInstrBufTotal  = (uint16_t)RT_MIN(X86_PAGE_SIZE, cbOpcodeBytes);
     13672        pVCpu->iem.s.offCurInstrStart = 0;
     13673        pVCpu->iem.s.offInstrNextByte = 0;
     13674#else
    1296813675        pVCpu->iem.s.cbOpcode = (uint8_t)RT_MIN(cbOpcodeBytes, sizeof(pVCpu->iem.s.abOpcode));
    1296913676        memcpy(pVCpu->iem.s.abOpcode, pvOpcodeBytes, pVCpu->iem.s.cbOpcode);
     13677#endif
    1297013678        rcStrict = VINF_SUCCESS;
    1297113679    }
     
    1300813716    {
    1300913717        iemInitDecoder(pVCpu, true);
     13718#ifdef IEM_WITH_CODE_TLB
     13719        pVCpu->iem.s.uInstrBufPc      = OpcodeBytesPC;
     13720        pVCpu->iem.s.pbInstrBuf       = (uint8_t const *)pvOpcodeBytes;
     13721        pVCpu->iem.s.cbInstrBufTotal  = (uint16_t)RT_MIN(X86_PAGE_SIZE, cbOpcodeBytes);
     13722        pVCpu->iem.s.offCurInstrStart = 0;
     13723        pVCpu->iem.s.offInstrNextByte = 0;
     13724#else
    1301013725        pVCpu->iem.s.cbOpcode = (uint8_t)RT_MIN(cbOpcodeBytes, sizeof(pVCpu->iem.s.abOpcode));
    1301113726        memcpy(pVCpu->iem.s.abOpcode, pvOpcodeBytes, pVCpu->iem.s.cbOpcode);
     13727#endif
    1301213728        rcStrict = VINF_SUCCESS;
    1301313729    }
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r62076 r62171  
    760760    pCtx->eflags.Bits.u1RF = 0;
    761761
     762#ifndef IEM_WITH_CODE_TLB
    762763    /* Flush the prefetch buffer. */
    763764    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     765#endif
    764766    return VINF_SUCCESS;
    765767}
     
    786788    pCtx->eflags.Bits.u1RF = 0;
    787789
     790#ifndef IEM_WITH_CODE_TLB
    788791    /* Flush the prefetch buffer. */
    789792    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     793#endif
    790794    return VINF_SUCCESS;
    791795}
     
    830834    pCtx->eflags.Bits.u1RF = 0;
    831835
     836#ifndef IEM_WITH_CODE_TLB
    832837    /* Flush the prefetch buffer. */
    833838    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     839#endif
    834840    return VINF_SUCCESS;
    835841}
     
    856862    pCtx->eflags.Bits.u1RF = 0;
    857863
     864#ifndef IEM_WITH_CODE_TLB
    858865    /* Flush the prefetch buffer. */
    859866    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     867#endif
    860868    return VINF_SUCCESS;
    861869}
     
    883891    pCtx->eflags.Bits.u1RF = 0;
    884892
     893#ifndef IEM_WITH_CODE_TLB
    885894    /* Flush the prefetch buffer. */
    886895    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     896#endif
    887897    return VINF_SUCCESS;
    888898}
     
    909919    pCtx->eflags.Bits.u1RF = 0;
    910920
     921#ifndef IEM_WITH_CODE_TLB
    911922    /* Flush the prefetch buffer. */
    912923    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     924#endif
    913925
    914926    return VINF_SUCCESS;
     
    16451657
    16461658    /* Flush the prefetch buffer. */
     1659# ifdef IEM_WITH_CODE_TLB
     1660    pVCpu->iem.s.pbInstrBuf = NULL;
     1661# else
    16471662    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     1663# endif
    16481664    return VINF_SUCCESS;
    16491665#endif
     
    18701886
    18711887    /* Flush the prefetch buffer. */
     1888#ifdef IEM_WITH_CODE_TLB
     1889    pVCpu->iem.s.pbInstrBuf = NULL;
     1890#else
    18721891    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     1892#endif
    18731893
    18741894    return VINF_SUCCESS;
     
    20932113
    20942114    /* Flush the prefetch buffer. */
     2115#ifdef IEM_WITH_CODE_TLB
     2116    pVCpu->iem.s.pbInstrBuf = NULL;
     2117#else
    20952118    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    2096 
     2119#endif
    20972120    return VINF_SUCCESS;
    20982121}
     
    24972520
    24982521    /* Flush the prefetch buffer. */
     2522#ifdef IEM_WITH_CODE_TLB
     2523    pVCpu->iem.s.pbInstrBuf = NULL;
     2524#else
    24992525    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     2526#endif
    25002527    return VINF_SUCCESS;
    25012528}
     
    25702597
    25712598    /* Flush the prefetch buffer. */
     2599#ifndef IEM_WITH_CODE_TLB
    25722600    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     2601#endif
    25732602
    25742603    return VINF_SUCCESS;
     
    28932922
    28942923    /* Flush the prefetch buffer. */
     2924#ifdef IEM_WITH_CODE_TLB
     2925    pVCpu->iem.s.pbInstrBuf = NULL;
     2926#else
    28952927    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     2928#endif
    28962929
    28972930    return VINF_SUCCESS;
     
    29723005
    29733006    /* Flush the prefetch buffer. */
     3007#ifdef IEM_WITH_CODE_TLB
     3008    pVCpu->iem.s.pbInstrBuf = NULL;
     3009#else
    29743010    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     3011#endif
    29753012
    29763013    return VINF_SUCCESS;
     
    34073444
    34083445    /* Flush the prefetch buffer. */
     3446#ifdef IEM_WITH_CODE_TLB
     3447    pVCpu->iem.s.pbInstrBuf = NULL;
     3448#else
    34093449    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     3450#endif
    34103451
    34113452    return VINF_SUCCESS;
     
    37073748
    37083749    /* Flush the prefetch buffer. */
     3750#ifdef IEM_WITH_CODE_TLB
     3751    pVCpu->iem.s.pbInstrBuf = NULL;
     3752#else
    37093753    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     3754#endif
    37103755
    37113756    return VINF_SUCCESS;
     
    38333878
    38343879    /* Flush the prefetch buffer. */
     3880#ifdef IEM_WITH_CODE_TLB
     3881    pVCpu->iem.s.pbInstrBuf = NULL;
     3882#else
    38353883    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     3884#endif
    38363885
    38373886    return VINF_SUCCESS;
     
    39373986
    39383987    /* Flush the prefetch buffer. */
     3988#ifdef IEM_WITH_CODE_TLB
     3989    pVCpu->iem.s.pbInstrBuf = NULL;
     3990#else
    39393991    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
     3992#endif
    39403993
    39413994    return VINF_SUCCESS;
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r62111 r62171  
    1085410854#ifndef TST_IEM_CHECK_MC
    1085510855    /* Calc effective address with modified ESP. */
    10856     uint8_t const   offOpcodeSaved = pVCpu->iem.s.offOpcode;
     10856/** @todo testcase */
     10857    PCPUMCTX        pCtx     = IEM_GET_CTX(pVCpu);
    1085710858    RTGCPTR         GCPtrEff;
    1085810859    VBOXSTRICTRC    rcStrict;
    10859     rcStrict = iemOpHlpCalcRmEffAddr(pVCpu, bRm, 0, &GCPtrEff);
     10860    switch (pVCpu->iem.s.enmEffOpSize)
     10861    {
     10862        case IEMMODE_16BIT: rcStrict = iemOpHlpCalcRmEffAddrEx(pVCpu, bRm, 0, &GCPtrEff, 2); break;
     10863        case IEMMODE_32BIT: rcStrict = iemOpHlpCalcRmEffAddrEx(pVCpu, bRm, 0, &GCPtrEff, 4); break;
     10864        case IEMMODE_64BIT: rcStrict = iemOpHlpCalcRmEffAddrEx(pVCpu, bRm, 0, &GCPtrEff, 8); break;
     10865        IEM_NOT_REACHED_DEFAULT_CASE_RET();
     10866    }
    1086010867    if (rcStrict != VINF_SUCCESS)
    1086110868        return rcStrict;
    10862     pVCpu->iem.s.offOpcode = offOpcodeSaved;
    10863 
    10864     PCPUMCTX        pCtx     = IEM_GET_CTX(pVCpu);
    10865     uint64_t const  RspSaved = pCtx->rsp;
    10866     switch (pVCpu->iem.s.enmEffOpSize)
    10867     {
    10868         case IEMMODE_16BIT: iemRegAddToRsp(pVCpu, pCtx, 2); break;
    10869         case IEMMODE_32BIT: iemRegAddToRsp(pVCpu, pCtx, 4); break;
    10870         case IEMMODE_64BIT: iemRegAddToRsp(pVCpu, pCtx, 8); break;
    10871         IEM_NOT_REACHED_DEFAULT_CASE_RET();
    10872     }
    10873     rcStrict = iemOpHlpCalcRmEffAddr(pVCpu, bRm, 0, &GCPtrEff);
    10874     Assert(rcStrict == VINF_SUCCESS);
    10875     IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    10876     pCtx->rsp = RspSaved;
     10869    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1087710870
    1087810871    /* Perform the operation - this should be CImpl. */
     
    1370913702FNIEMOP_DEF(iemOp_EscF0)
    1371013703{
    13711     pVCpu->iem.s.offFpuOpcode = pVCpu->iem.s.offOpcode - 1;
    1371213704    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     13705    pVCpu->iem.s.uFpuOpcode = RT_MAKE_U16(bRm, 0xd8 & 0x7);
    1371313706
    1371413707    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    1449514488FNIEMOP_DEF(iemOp_EscF1)
    1449614489{
    14497     pVCpu->iem.s.offFpuOpcode = pVCpu->iem.s.offOpcode - 1;
    1449814490    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     14491    pVCpu->iem.s.uFpuOpcode = RT_MAKE_U16(bRm, 0xd9 & 0x7);
     14492
    1449914493    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    1450014494    {
     
    1484414838FNIEMOP_DEF(iemOp_EscF2)
    1484514839{
    14846     pVCpu->iem.s.offFpuOpcode = pVCpu->iem.s.offOpcode - 1;
    1484714840    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     14841    pVCpu->iem.s.uFpuOpcode = RT_MAKE_U16(bRm, 0xda & 0x7);
    1484814842    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    1484914843    {
     
    1530415298FNIEMOP_DEF(iemOp_EscF3)
    1530515299{
    15306     pVCpu->iem.s.offFpuOpcode = pVCpu->iem.s.offOpcode - 1;
    1530715300    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     15301    pVCpu->iem.s.uFpuOpcode = RT_MAKE_U16(bRm, 0xdb & 0x7);
    1530815302    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    1530915303    {
     
    1558815582FNIEMOP_DEF(iemOp_EscF4)
    1558915583{
    15590     pVCpu->iem.s.offFpuOpcode = pVCpu->iem.s.offOpcode - 1;
    1559115584    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     15585    pVCpu->iem.s.uFpuOpcode = RT_MAKE_U16(bRm, 0xdc & 0x7);
    1559215586    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    1559315587    {
     
    1589815892FNIEMOP_DEF(iemOp_EscF5)
    1589915893{
    15900     pVCpu->iem.s.offFpuOpcode = pVCpu->iem.s.offOpcode - 1;
    1590115894    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     15895    pVCpu->iem.s.uFpuOpcode = RT_MAKE_U16(bRm, 0xdd & 0x7);
    1590215896    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    1590315897    {
     
    1614516139FNIEMOP_DEF(iemOp_EscF6)
    1614616140{
    16147     pVCpu->iem.s.offFpuOpcode = pVCpu->iem.s.offOpcode - 1;
    1614816141    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     16142    pVCpu->iem.s.uFpuOpcode = RT_MAKE_U16(bRm, 0xde & 0x7);
    1614916143    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    1615016144    {
     
    1660716601        case IEMMODE_16BIT:
    1660816602            IEM_MC_BEGIN(0,0);
    16609             if (-(int8_t)pVCpu->iem.s.offOpcode != i8Imm)
     16603            if (-(int8_t)IEM_GET_INSTR_LEN(pVCpu) != i8Imm)
    1661016604            {
    1661116605                IEM_MC_SUB_GREG_U16(X86_GREG_xCX, 1);
     
    1662616620        case IEMMODE_32BIT:
    1662716621            IEM_MC_BEGIN(0,0);
    16628             if (-(int8_t)pVCpu->iem.s.offOpcode != i8Imm)
     16622            if (-(int8_t)IEM_GET_INSTR_LEN(pVCpu) != i8Imm)
    1662916623            {
    1663016624                IEM_MC_SUB_GREG_U32(X86_GREG_xCX, 1);
     
    1664516639        case IEMMODE_64BIT:
    1664616640            IEM_MC_BEGIN(0,0);
    16647             if (-(int8_t)pVCpu->iem.s.offOpcode != i8Imm)
     16641            if (-(int8_t)IEM_GET_INSTR_LEN(pVCpu) != i8Imm)
    1664816642            {
    1664916643                IEM_MC_SUB_GREG_U64(X86_GREG_xCX, 1);
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r62076 r62171  
    319319} IEMTLBENTRY;
    320320AssertCompileSize(IEMTLBENTRY, 32);
     321/** Pointer to an IEM TLB entry. */
     322typedef IEMTLBENTRY *PIEMTLBENTRY;
    321323
    322324/** @name IEMTLBE_F_XXX - TLB entry flags (IEMTLBENTRY::fFlagsAndPhysRev)
     
    391393typedef struct IEMCPU
    392394{
    393     /** Pointer to the CPU context - ring-3 context. */
    394     R3PTRTYPE(PCPUMCTX)     pCtxR3;
    395     /** Pointer to the CPU context - ring-0 context. */
    396     R0PTRTYPE(PCPUMCTX)     pCtxR0;
    397     /** Pointer to the CPU context - raw-mode context. */
    398     RCPTRTYPE(PCPUMCTX)     pCtxRC;
    399 
    400395    /** Info status code that needs to be propagated to the IEM caller.
    401396     * This cannot be passed internally, as it would complicate all success
     
    403398     * to get right.  Instead, we'll store status codes to pass on here.  Each
    404399     * source of these codes will perform appropriate sanity checks. */
    405     int32_t                 rcPassUp;
     400    int32_t                 rcPassUp;                                                                       /* 0x00 */
    406401
    407402    /** The current CPU execution mode (CS). */
    408     IEMMODE                 enmCpuMode;
     403    IEMMODE                 enmCpuMode;                                                                     /* 0x04 */
    409404    /** The CPL. */
    410     uint8_t                 uCpl;
     405    uint8_t                 uCpl;                                                                           /* 0x08 */
    411406
    412407    /** Whether to bypass access handlers or not. */
    413     bool                    fBypassHandlers;
     408    bool                    fBypassHandlers;                                                                /* 0x09 */
    414409    /** Indicates that we're interpreting patch code - RC only! */
    415     bool                    fInPatchCode;
     410    bool                    fInPatchCode;                                                                   /* 0x0a */
    416411
    417412    /** @name Decoder state.
    418413     * @{ */
    419     /** The current offset into abOpcodes. */
    420     uint8_t                 offOpcode;
    421     /** The size of what has currently been fetched into abOpcodes. */
    422     uint8_t                 cbOpcode;
    423 
    424     /** The effective segment register (X86_SREG_XXX). */
    425     uint8_t                 iEffSeg;
    426 
     414#ifdef IEM_WITH_CODE_TLB
     415    /** Unused. */
     416    uint8_t                 bUnused0;                                                                       /* 0x0b */
     417    /** The offset of the next instruction byte. */
     418    uint32_t                offInstrNextByte;                                                               /* 0x0c */
     419    /** Pointer to the page containing RIP, user specified buffer or abOpcode.
     420     * This can be NULL if the page isn't mappable for some reason, in which
     421     * case we'll do fallback stuff.
     422     *
     423     * If we're executing an instruction from a user specified buffer,
     424     * IEMExecOneWithPrefetchedByPC and friends, this is not necessarily a page
     425     * aligned pointer but pointer to the user data.
     426     *
     427     * For instructions crossing pages, this will start on the first page and be
     428     * advanced to the next page by the time we've decoded the instruction.  This
     429     * therefore precludes stuff like <tt>pbInstrBuf[offInstrNextByte + cbInstrBuf - cbCurInstr]</tt>
     430     */
     431    uint8_t const          *pbInstrBuf;                                                                     /* 0x10 */
     432# if defined(IN_RC) && HC_ARCH_BITS != 32
     433    uint32_t                uInstrBufHigh; /** The high dword of the host context pbInstrBuf member. */
     434# endif
     435    /** The program counter corresponding to pbInstrBuf.
     436     * This is set to a non-canonical address when we need to invalidate it. */
     437    uint64_t                uInstrBufPc;                                                                    /* 0x18 */
     438    /** The number of bytes available at pbInstrBuf for the current instruction.
     439     * This takes the max opcode length into account so that doesn't need to be
     440     * checked separately. */
     441    uint32_t                cbInstrBuf;                                                                     /* 0x20 */
     442    /** The number of bytes available at pbInstrBuf in total (for IEMExecLots).
     443     * This takes the CS segment limit into account. */
     444    uint16_t                cbInstrBufTotal;                                                                /* 0x24 */
     445    /** Offset into pbInstrBuf of the first byte of the current instruction. */
     446    uint16_t                offCurInstrStart;                                                               /* 0x26 */
     447
     448    /** The prefix mask (IEM_OP_PRF_XXX). */
     449    uint32_t                fPrefixes;                                                                      /* 0x28 */
    427450    /** The extra REX ModR/M register field bit (REX.R << 3). */
    428     uint8_t                 uRexReg;
     451    uint8_t                 uRexReg;                                                                        /* 0x2c */
    429452    /** The extra REX ModR/M r/m field, SIB base and opcode reg bit
    430453     * (REX.B << 3). */
    431     uint8_t                 uRexB;
     454    uint8_t                 uRexB;                                                                          /* 0x2d */
     455    /** The extra REX SIB index field bit (REX.X << 3). */
     456    uint8_t                 uRexIndex;                                                                      /* 0x2e */
     457
     458    /** The effective segment register (X86_SREG_XXX). */
     459    uint8_t                 iEffSeg;                                                                        /* 0x2f */
     460
     461#else
     462    /** The current offset into abOpcodes. */
     463    uint8_t                 offOpcode;                                                                      /*       0x0b */
     464    /** The size of what has currently been fetched into abOpcodes. */
     465    uint8_t                 cbOpcode;                                                                       /*       0x0c */
     466
     467    /** The effective segment register (X86_SREG_XXX). */
     468    uint8_t                 iEffSeg;                                                                        /*       0x0d */
     469
     470    /** The extra REX ModR/M register field bit (REX.R << 3). */
     471    uint8_t                 uRexReg;                                                                        /*       0x0e */
     472    /** The extra REX ModR/M r/m field, SIB base and opcode reg bit
     473     * (REX.B << 3). */
     474    uint8_t                 uRexB;                                                                          /*       0x0f */
    432475    /** The prefix mask (IEM_OP_PRF_XXX). */
    433     uint32_t                fPrefixes;
     476    uint32_t                fPrefixes;                                                                      /*       0x10 */
    434477    /** The extra REX SIB index field bit (REX.X << 3). */
    435     uint8_t                 uRexIndex;
    436 
    437     /** Offset into abOpcodes where the FPU instruction starts.
    438      * Only set by the FPU escape opcodes (0xd8-0xdf) and used later on when the
    439      * instruction result is committed. */
    440     uint8_t                 offFpuOpcode;
     478    uint8_t                 uRexIndex;                                                                      /*       0x14 */
    441479
    442480    /** Explicit alignment padding. */
    443     uint8_t                 abAlignment1[2];
     481    uint8_t                 abAlignment1[3];                                                                /*       0x15 */
     482#endif
    444483
    445484    /** The effective operand mode . */
    446     IEMMODE                 enmEffOpSize;
     485    IEMMODE                 enmEffOpSize;                                                                   /* 0x30, 0x18 */
    447486    /** The default addressing mode . */
    448     IEMMODE                 enmDefAddrMode;
     487    IEMMODE                 enmDefAddrMode;                                                                 /* 0x34, 0x1c */
    449488    /** The effective addressing mode . */
    450     IEMMODE                 enmEffAddrMode;
     489    IEMMODE                 enmEffAddrMode;                                                                 /* 0x38, 0x20 */
    451490    /** The default operand mode . */
    452     IEMMODE                 enmDefOpSize;
     491    IEMMODE                 enmDefOpSize;                                                                   /* 0x3c, 0x24 */
     492
     493    /** The FPU opcode (FOP). */
     494    uint16_t                uFpuOpcode;                                                                     /* 0x40, 0x28 */
     495    /** Align the opcode buffer on a dword boundrary. */
     496    uint8_t                 abAlignment2a[2];                                                               /* 0x42, 0x2a */
    453497
    454498    /** The opcode bytes. */
    455     uint8_t                 abOpcode[15];
     499    uint8_t                 abOpcode[15];                                                                   /* 0x44, 0x2c */
    456500    /** Explicit alignment padding. */
    457     uint8_t                 abAlignment2[HC_ARCH_BITS == 64 ? 5 : 5];
     501#ifdef IEM_WITH_CODE_TLB
     502    uint8_t                 abAlignment2b[1+4];                                                             /* 0x53 */
     503#else
     504    uint8_t                 abAlignment2b[1+28];                                                            /*       0x3b */
     505#endif
    458506    /** @} */
    459507
     508
    460509    /** The flags of the current exception / interrupt. */
    461     uint32_t                fCurXcpt;
     510    uint32_t                fCurXcpt;                                                                       /* 0x58, 0x58 */
    462511    /** The current exception / interrupt. */
    463512    uint8_t                 uCurXcpt;
     
    524573    /** Pointer set jump buffer - raw-mode context. */
    525574    RCPTRTYPE(jmp_buf *)    pJmpBufRC;
    526 
    527575
    528576    /** @name Statistics
     
    549597    /** Number of long jumps. */
    550598    uint32_t                cLongJumps;
    551     uint32_t                uPadding; /**< Alignment padding. */
     599    uint32_t                uAlignment6; /**< Alignment padding. */
    552600#ifdef IEM_VERIFICATION_MODE_FULL
    553601    /** The Number of I/O port reads that has been performed. */
     
    574622     *  emR3ExecuteInstruction and iemExecVerificationModeCheck. */
    575623    uint8_t                 cVerifyDepth;
    576     bool                    afAlignment2[2];
     624    bool                    afAlignment7[2];
    577625    /** Mask of undefined eflags.
    578626     * The verifier will any difference in these flags. */
     
    605653    /** @} */
    606654
    607     uint32_t                au32Alignment6[HC_ARCH_BITS == 64 ? 1 + 4 + 8 : 1 + 2 + 4]; /**< Alignment padding. */
     655    uint32_t                au32Alignment8[HC_ARCH_BITS == 64 ? 1 + 2 + 8 : 1 + 2]; /**< Alignment padding. */
    608656
    609657    /** Data TLB.
     
    613661     * @remarks Must be 64-byte aligned. */
    614662    IEMTLB                  CodeTlb;
     663
     664    /** Pointer to the CPU context - ring-3 context.
     665     * @todo put inside IEM_VERIFICATION_MODE_FULL++. */
     666    R3PTRTYPE(PCPUMCTX)     pCtxR3;
     667    /** Pointer to the CPU context - ring-0 context. */
     668    R0PTRTYPE(PCPUMCTX)     pCtxR0;
     669    /** Pointer to the CPU context - raw-mode context. */
     670    RCPTRTYPE(PCPUMCTX)     pCtxRC;
     671    /** Alignment padding. */
     672    RTRCPTR                 uAlignment9;
    615673
    616674#ifdef IEM_VERIFICATION_MODE_FULL
     
    642700#if !defined(IEM_VERIFICATION_MODE_FULL) && !defined(IEM_VERIFICATION_MODE) \
    643701 && !defined(IEM_VERIFICATION_MODE_MINIMAL) && defined(VMCPU_INCL_CPUM_GST_CTX)
    644 # define IEM_GET_CTX(a_pVCpu) (&(a_pVCpu)->cpum.GstCtx)
     702# define IEM_GET_CTX(a_pVCpu)           (&(a_pVCpu)->cpum.GstCtx)
    645703#else
    646 # define IEM_GET_CTX(a_pVCpu) ((a_pVCpu)->iem.s.CTX_SUFF(pCtx))
     704# define IEM_GET_CTX(a_pVCpu)           ((a_pVCpu)->iem.s.CTX_SUFF(pCtx))
    647705#endif
    648706
     
    652710 */
    653711#if IEM_CFG_TARGET_CPU != IEMTARGETCPU_DYNAMIC
    654 # define IEM_GET_TARGET_CPU(a_pVCpu)   (IEM_CFG_TARGET_CPU)
     712# define IEM_GET_TARGET_CPU(a_pVCpu)    (IEM_CFG_TARGET_CPU)
    655713#else
    656 # define IEM_GET_TARGET_CPU(a_pVCpu)   ((a_pVCpu)->iem.s.uTargetCpu)
    657 #endif
     714# define IEM_GET_TARGET_CPU(a_pVCpu)    ((a_pVCpu)->iem.s.uTargetCpu)
     715#endif
     716
     717/** @def Gets the instruction length. */
     718#ifdef IEM_WITH_CODE_TLB
     719# define IEM_GET_INSTR_LEN(a_pVCpu)     ((a_pVCpu)->iem.s.offInstrNextByte - (uint32_t)(a_pVCpu)->iem.s.offCurInstrStart)
     720#else
     721# define IEM_GET_INSTR_LEN(a_pVCpu)     ((a_pVCpu)->iem.s.offOpcode)
     722#endif
     723
    658724
    659725/** @name IEM_ACCESS_XXX - Access details.
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