VirtualBox

Changeset 13241 in vbox for trunk/src


Ignore:
Timestamp:
Oct 14, 2008 9:30:41 AM (16 years ago)
Author:
vboxsync
Message:

Added support for three byte opcodes (not complete; just to test invept & invvpid)

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Disassembler/DisasmCore.cpp

    r12790 r13241  
    113113    ParseNopPause,
    114114    ParseImmByteSX,
    115     ParseImmZ
     115    ParseImmZ,
     116    ParseThreeByteEsc4,
     117    ParseThreeByteEsc5
    116118};
    117119
     
    155157    ParseNopPause,
    156158    ParseImmByteSX_SizeOnly,
    157     ParseImmZ_SizeOnly
     159    ParseImmZ_SizeOnly,
     160    ParseThreeByteEsc4,
     161    ParseThreeByteEsc5
    158162};
    159163
     
    17291733    int           size    = sizeof(uint8_t);
    17301734
    1731     //2nd byte
     1735    /* 2nd byte */
    17321736    pCpu->opcode = DISReadByte(pCpu, lpszCodeBlock);
     1737
     1738    /* default to the non-prefixed table. */
    17331739    pOpcode      = &g_aTwoByteMapX86[pCpu->opcode];
    17341740
     
    17741780        }
    17751781    }
     1782
     1783    size += ParseInstruction(lpszCodeBlock+size, pOpcode, pCpu);
     1784    return size;
     1785}
     1786//*****************************************************************************
     1787//*****************************************************************************
     1788unsigned ParseThreeByteEsc4(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
     1789{
     1790    const OPCODE *pOpcode;
     1791    int           size    = sizeof(uint8_t);
     1792
     1793    /* 3rd byte */
     1794    pCpu->opcode = DISReadByte(pCpu, lpszCodeBlock);
     1795
     1796    /* default to the non-prefixed table. */
     1797    if (g_apThreeByteMapX86_0F38[pCpu->opcode >> 4])
     1798    {
     1799        pOpcode = g_apThreeByteMapX86_0F38[pCpu->opcode >> 4];
     1800        pOpcode = &pOpcode[pCpu->opcode & 0xf];
     1801    }
     1802    else
     1803        pOpcode = &g_InvalidOpcode[0];
     1804
     1805    /* Handle opcode table extensions that rely on the address, repne prefix byte.  */
     1806    /** @todo Should we take the first or last prefix byte in case of multiple prefix bytes??? */
     1807    switch (pCpu->lastprefix)
     1808    {
     1809    case OP_OPSIZE: /* 0x66 */
     1810        if (g_apThreeByteMapX86_660F38[pCpu->opcode >> 4])
     1811        {
     1812            pOpcode = g_apThreeByteMapX86_660F38[pCpu->opcode >> 4];
     1813            pOpcode = &pOpcode[pCpu->opcode & 0xf];
     1814
     1815            if (pOpcode->opcode != OP_INVALID)
     1816            {
     1817                /* Table entry is valid, so use the extension table. */
     1818
     1819                /* Cancel prefix changes. */
     1820                pCpu->prefix &= ~PREFIX_OPSIZE;
     1821                pCpu->opmode  = pCpu->mode;
     1822            }
     1823        }
     1824        break;
     1825
     1826    case OP_REPNE:   /* 0xF2 */
     1827        if (g_apThreeByteMapX86_F20F38[pCpu->opcode >> 4])
     1828        {
     1829            pOpcode = g_apThreeByteMapX86_F20F38[pCpu->opcode >> 4];
     1830            pOpcode = &pOpcode[pCpu->opcode & 0xf];
     1831
     1832            if (pOpcode->opcode != OP_INVALID)
     1833            {
     1834                /* Table entry is valid, so use the extension table. */
     1835           
     1836                /* Cancel prefix changes. */
     1837                pCpu->prefix &= ~PREFIX_REPNE;
     1838            }
     1839        }
     1840        break;
     1841    }
     1842
     1843    size += ParseInstruction(lpszCodeBlock+size, pOpcode, pCpu);
     1844    return size;
     1845}
     1846//*****************************************************************************
     1847//*****************************************************************************
     1848unsigned ParseThreeByteEsc5(RTUINTPTR lpszCodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
     1849{
     1850    const OPCODE *pOpcode;
     1851    int           size    = sizeof(uint8_t);
     1852
     1853    /* 3rd byte */
     1854    pCpu->opcode = DISReadByte(pCpu, lpszCodeBlock);
     1855
     1856    /** @todo Should we take the first or last prefix byte in case of multiple prefix bytes??? */
     1857    Assert(pCpu->lastprefix == OP_OPSIZE);
     1858
     1859    /* default to the non-prefixed table. */
     1860    if (g_apThreeByteMapX86_660F3A[pCpu->opcode >> 4])
     1861    {
     1862        pOpcode = g_apThreeByteMapX86_660F3A[pCpu->opcode >> 4];
     1863        pOpcode = &pOpcode[pCpu->opcode & 0xf];
     1864
     1865        if (pOpcode->opcode != OP_INVALID)
     1866        {
     1867            /* Table entry is valid, so use the extension table. */
     1868
     1869            /* Cancel prefix changes. */
     1870            pCpu->prefix &= ~PREFIX_OPSIZE;
     1871            pCpu->opmode  = pCpu->mode;
     1872        }
     1873    }
     1874    else
     1875        pOpcode = &g_InvalidOpcode[0];
    17761876
    17771877    size += ParseInstruction(lpszCodeBlock+size, pOpcode, pCpu);
  • trunk/src/VBox/Disassembler/DisasmInternal.h

    r9761 r13241  
    7070#define IDX_ParseImmByteSX          36
    7171#define IDX_ParseImmZ               37
    72 #define IDX_ParseMax                (IDX_ParseImmZ+1)
     72#define IDX_ParseThreeByteEsc4      38
     73#define IDX_ParseThreeByteEsc5      39
     74#define IDX_ParseMax                (IDX_ParseThreeByteEsc5+1)
    7375
    7476#ifdef IN_RING0
     
    117119
    118120unsigned ParseTwoByteEsc(RTUINTPTR pu8CodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu);
     121unsigned ParseThreeByteEsc4(RTUINTPTR pu8CodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu);
     122unsigned ParseThreeByteEsc5(RTUINTPTR pu8CodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu);
    119123unsigned ParseImmGrpl(RTUINTPTR pu8CodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu);
    120124unsigned ParseShiftGrp2(RTUINTPTR pu8CodeBlock, PCOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu);
  • trunk/src/VBox/Disassembler/DisasmTables.cpp

    r13088 r13241  
    7979    INVALID_OPCODE,
    8080
     81/* Invalid opcode */
     82const OPCODE g_InvalidOpcode[1] =
     83{
     84    INVALID_OPCODE
     85};
     86
    8187/* Tables for the elegant Intel X86 instruction set */
    82 
    8388const OPCODE g_aOneByteMapX86[256] =
    8489{
     
    454459    INVALID_OPCODE,
    455460    INVALID_OPCODE,
    456     INVALID_OPCODE,
     461    OP("3 byte escape A4",   IDX_ParseThreeByteEsc4,0,              0,        OP_3B_ESC4,  OP_PARM_NONE,      OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS),
    457462    INVALID_OPCODE,
    458463    INVALID_OPCODE,
     
    725730
    726731    /* 3 */
    727 #if 1
    728     INVALID_OPCODE_BLOCK
    729 #else
    730     /** @todo */
    731732    INVALID_OPCODE,
    732733    INVALID_OPCODE,
     
    745746    INVALID_OPCODE,
    746747    INVALID_OPCODE,
    747 #endif
    748748
    749749    /* 4 */
     
    932932
    933933    /* 3 */
    934     INVALID_OPCODE_BLOCK
     934    INVALID_OPCODE,
     935    INVALID_OPCODE,
     936    INVALID_OPCODE,
     937    INVALID_OPCODE,
     938    INVALID_OPCODE,
     939    INVALID_OPCODE,
     940    INVALID_OPCODE,
     941    INVALID_OPCODE,
     942    OP("3 byte escape A4",   IDX_ParseThreeByteEsc4,0,              0,        OP_3B_ESC4,  OP_PARM_NONE,      OP_PARM_NONE,   OP_PARM_NONE,   OPTYPE_HARMLESS),
     943    INVALID_OPCODE,
     944    INVALID_OPCODE,
     945    INVALID_OPCODE,
     946    INVALID_OPCODE,
     947    INVALID_OPCODE,
     948    INVALID_OPCODE,
     949    INVALID_OPCODE,
    935950
    936951    /* 4 */
     
    12171232    /* f */
    12181233    INVALID_OPCODE_BLOCK
     1234};
     1235
     1236/** Three byte opcode map (0xF 0x38 0x0x) */
     1237const OPCODE g_aThreeByteMapX86_0F38_0[16] =
     1238{
     1239    /* 0 */
     1240    OP("pshufb %Pq,%Qq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSHUFB,      OP_PARM_Pq,          OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1241    OP("phaddw %Pq,%Qq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PHADDW,      OP_PARM_Pq,          OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1242    OP("phaddd %Pq,%Qq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PHADDD,      OP_PARM_Pq,          OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1243    OP("phaddsw %Pq,%Qq",       IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PHADDSW,     OP_PARM_Pq,          OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1244    OP("pmaddubsw %Pq,%Qq",     IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PMADDUBSW,   OP_PARM_Pq,          OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1245    OP("phsubw %Pq,%Qq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PHSUBW,      OP_PARM_Pq,          OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1246    OP("phsubd %Pq,%Qq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PHSUBD,      OP_PARM_Pq,          OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1247    OP("phsubsw %Pq,%Qq",       IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PHSUBSW,     OP_PARM_Pq,          OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1248    OP("psignb %Pq,%Qq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSIGNB,      OP_PARM_Pq,          OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1249    OP("psignw %Pq,%Qq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSIGNW,      OP_PARM_Pq,          OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1250    OP("psignd %Pq,%Qq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSIGND,      OP_PARM_Pq,          OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1251    OP("pmulhrsw %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PMULHRSW,    OP_PARM_Pq,          OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1252    INVALID_OPCODE,
     1253    INVALID_OPCODE,
     1254    INVALID_OPCODE,
     1255    INVALID_OPCODE,
     1256};
     1257
     1258/** Three byte opcode map (0x0F 0x38 0x1x) */
     1259const OPCODE g_aThreeByteMapX86_0F38_1[16] =
     1260{
     1261    /* 1 */
     1262    INVALID_OPCODE,
     1263    INVALID_OPCODE,
     1264    INVALID_OPCODE,
     1265    INVALID_OPCODE,
     1266    INVALID_OPCODE,
     1267    INVALID_OPCODE,
     1268    INVALID_OPCODE,
     1269    INVALID_OPCODE,
     1270    INVALID_OPCODE,
     1271    INVALID_OPCODE,
     1272    INVALID_OPCODE,
     1273    INVALID_OPCODE,
     1274    OP("pabsb %Pq,%Qq",           IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PABSB,     OP_PARM_Pq,          OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1275    OP("pabsw %Pq,%Qq",           IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PABSW,     OP_PARM_Pq,          OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1276    OP("pabsd %Pq,%Qq",           IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PABSD,     OP_PARM_Pq,          OP_PARM_Qq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1277    INVALID_OPCODE,
     1278};
     1279
     1280/* These tables are mostly sparse, so use another level of indirection to save space. */
     1281const OPCODE *g_apThreeByteMapX86_0F38[16] =
     1282{
     1283    /* 0 */
     1284    &g_aThreeByteMapX86_0F38_0[0],
     1285
     1286    /* 1 */
     1287    &g_aThreeByteMapX86_0F38_1[0],
     1288
     1289    /* 2 */
     1290    NULL,
     1291
     1292    /* 3 */
     1293    NULL,
     1294
     1295    /* 4 */
     1296    NULL,
     1297
     1298    /* 5 */
     1299    NULL,
     1300
     1301    /* 6 */
     1302    NULL,
     1303
     1304    /* 7 */
     1305    NULL,
     1306
     1307    /* 8 */
     1308    NULL,
     1309
     1310    /* 9 */
     1311    NULL,
     1312
     1313    /* a */
     1314    NULL,
     1315
     1316    /* b */
     1317    NULL,
     1318
     1319    /* c */
     1320    NULL,
     1321
     1322    /* d */
     1323    NULL,
     1324
     1325    /* e */
     1326    NULL,
     1327
     1328    /* f */
     1329    NULL,
     1330};
     1331
     1332/** Three byte opcode map (0x66 0x0F 0x38 0x0x) */
     1333const OPCODE g_aThreeByteMapX86_660F38_0[16] =
     1334{
     1335    /* 0 */
     1336    OP("pshufb %Vdq,%Wdq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSHUFB,      OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1337    OP("phaddw %Vdq,%Wdq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PHADDW,      OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1338    OP("phaddd %Vdq,%Wdq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PHADDD,      OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1339    OP("phaddsw %Vdq,%Wdq",       IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PHADDSW,     OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1340    OP("pmaddubsw %Vdq,%Wdq",     IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PMADDUBSW,   OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1341    OP("phsubw %Vdq,%Wdq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PHSUBW,      OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1342    OP("phsubd %Vdq,%Wdq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PHSUBD,      OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1343    OP("phsubsw %Vdq,%Wdq",       IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PHSUBSW,     OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1344    OP("psignb %Vdq,%Wdq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSIGNB,      OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1345    OP("psignw %Vdq,%Wdq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSIGNW,      OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1346    OP("psignd %Vdq,%Wdq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSIGND,      OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1347    OP("pmulhrsw %Vdq,%Wdq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PMULHRSW,    OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1348    INVALID_OPCODE,
     1349    INVALID_OPCODE,
     1350    INVALID_OPCODE,
     1351    INVALID_OPCODE,
     1352};
     1353
     1354/** Three byte opcode map (0x66 0x0F 0x38 0x1x) */
     1355const OPCODE g_aThreeByteMapX86_660F38_1[16] =
     1356{
     1357    /* 1 */
     1358    OP("pblendvb %Vdq,%Wdq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PBLENDVB,    OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1359    INVALID_OPCODE,
     1360    INVALID_OPCODE,
     1361    INVALID_OPCODE,
     1362    OP("blendvps %Vdq,%Wdq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_BLENDVPS,    OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1363    OP("blendvpd %Vdq,%Wdq",        IDX_ParseModRM,     IDX_UseModRM,   0,          OP_BLENDVPD,    OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1364    INVALID_OPCODE,
     1365    OP("ptest %Vdq,%Wdq",           IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PTEST,       OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1366    INVALID_OPCODE,
     1367    INVALID_OPCODE,
     1368    INVALID_OPCODE,
     1369    INVALID_OPCODE,
     1370    OP("pabsb %Vdq,%Wdq",           IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PABSB,       OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1371    OP("pabsw %Vdq,%Wdq",           IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PABSW,       OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1372    OP("pabsd %Vdq,%Wdq",           IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PABSD,       OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1373    INVALID_OPCODE,
     1374};
     1375
     1376/** @todo remainder missing (too lazy now) */
     1377
     1378/** Three byte opcode map (0x66 0x0F 0x38 0x8x) */
     1379const OPCODE g_aThreeByteMapX86_660F38_8[16] =
     1380{
     1381    /* 8 */
     1382    OP("invept %Gd,%Mdq",       IDX_ParseModRM,     IDX_UseModRM,   0,          OP_INVEPT,      OP_PARM_Gd,          OP_PARM_Mdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1383    OP("invvpid %Gd,%Mdq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_INVEPT,      OP_PARM_Gd,          OP_PARM_Mdq,     OP_PARM_NONE,   OPTYPE_HARMLESS),
     1384    INVALID_OPCODE,
     1385    INVALID_OPCODE,
     1386    INVALID_OPCODE,
     1387    INVALID_OPCODE,
     1388    INVALID_OPCODE,
     1389    INVALID_OPCODE,
     1390    INVALID_OPCODE,
     1391    INVALID_OPCODE,
     1392    INVALID_OPCODE,
     1393    INVALID_OPCODE,
     1394    INVALID_OPCODE,
     1395    INVALID_OPCODE,
     1396    INVALID_OPCODE,
     1397    INVALID_OPCODE,
     1398};
     1399
     1400/** Three byte opcode map with prefix 0x66 (0xF 0x38) */
     1401const OPCODE *g_apThreeByteMapX86_660F38[16] =
     1402{
     1403    /* 0 */
     1404    &g_aThreeByteMapX86_660F38_0[0],
     1405
     1406    /* 1 */
     1407    &g_aThreeByteMapX86_660F38_1[0],
     1408
     1409    /* 2 */
     1410    NULL,
     1411
     1412    /* 3 */
     1413    NULL,
     1414
     1415    /* 4 */
     1416    NULL,
     1417
     1418    /* 5 */
     1419    NULL,
     1420
     1421    /* 6 */
     1422    NULL,
     1423
     1424    /* 7 */
     1425    NULL,
     1426
     1427    /* 8 */
     1428    &g_aThreeByteMapX86_660F38_8[0],
     1429
     1430    /* 9 */
     1431    NULL,
     1432
     1433    /* a */
     1434    NULL,
     1435
     1436    /* b */
     1437    NULL,
     1438
     1439    /* c */
     1440    NULL,
     1441
     1442    /* d */
     1443    NULL,
     1444
     1445    /* e */
     1446    NULL,
     1447
     1448    /* f */
     1449    NULL,
     1450};
     1451
     1452/** Three byte opcode map with prefix 0xF2 (0xF 0x38) */
     1453/** @todo remainder missing (too lazy now) */
     1454const OPCODE *g_apThreeByteMapX86_F20F38[16] =
     1455{
     1456    /* 0 */
     1457    NULL,
     1458
     1459    /* 1 */
     1460    NULL,
     1461
     1462    /* 2 */
     1463    NULL,
     1464
     1465    /* 3 */
     1466    NULL,
     1467
     1468    /* 4 */
     1469    NULL,
     1470
     1471    /* 5 */
     1472    NULL,
     1473
     1474    /* 6 */
     1475    NULL,
     1476
     1477    /* 7 */
     1478    NULL,
     1479
     1480    /* 8 */
     1481    NULL,
     1482
     1483    /* 9 */
     1484    NULL,
     1485
     1486    /* a */
     1487    NULL,
     1488
     1489    /* b */
     1490    NULL,
     1491
     1492    /* c */
     1493    NULL,
     1494
     1495    /* d */
     1496    NULL,
     1497
     1498    /* e */
     1499    NULL,
     1500
     1501    /* f */
     1502    NULL,
     1503};
     1504
     1505/** Three byte opcode map with prefix 0x66 (0xF 0x3A) */
     1506/** @todo remainder missing (too lazy now) */
     1507const OPCODE *g_apThreeByteMapX86_660F3A[16] =
     1508{
     1509    /* 0 */
     1510    NULL,
     1511
     1512    /* 1 */
     1513    NULL,
     1514
     1515    /* 2 */
     1516    NULL,
     1517
     1518    /* 3 */
     1519    NULL,
     1520
     1521    /* 4 */
     1522    NULL,
     1523
     1524    /* 5 */
     1525    NULL,
     1526
     1527    /* 6 */
     1528    NULL,
     1529
     1530    /* 7 */
     1531    NULL,
     1532
     1533    /* 8 */
     1534    NULL,
     1535
     1536    /* 9 */
     1537    NULL,
     1538
     1539    /* a */
     1540    NULL,
     1541
     1542    /* b */
     1543    NULL,
     1544
     1545    /* c */
     1546    NULL,
     1547
     1548    /* d */
     1549    NULL,
     1550
     1551    /* e */
     1552    NULL,
     1553
     1554    /* f */
     1555    NULL,
    12191556};
    12201557
  • trunk/src/VBox/Disassembler/DisasmTables.h

    r8299 r13241  
    2626#include <VBox/dis.h>
    2727
     28extern const OPCODE g_InvalidOpcode[1];
     29
    2830extern const OPCODE g_aOneByteMapX86[256];
    2931extern const OPCODE g_aOneByteMapX64[256];
     
    3840/** Two byte opcode map with prefix 0xF3 */
    3941extern const OPCODE g_aTwoByteMapX86_PFF3[256];
     42
     43/** Three byte opcode map (0xF 0x38) */
     44extern const OPCODE *g_apThreeByteMapX86_0F38[16];
     45
     46/** Three byte opcode map with prefix 0x66 (0xF 0x38) */
     47extern const OPCODE *g_apThreeByteMapX86_660F38[16];
     48
     49/** Three byte opcode map with prefix 0xF2 (0xF 0x38) */
     50extern const OPCODE *g_apThreeByteMapX86_F20F38[16];
     51
     52/** Three byte opcode map with prefix 0x66 (0xF 0x3A) */
     53extern const OPCODE *g_apThreeByteMapX86_660F3A[16];
    4054
    4155/** Opcode extensions (Group tables)
  • trunk/src/VBox/Disassembler/DisasmTestA.asm

    r11464 r13241  
    3434align 16
    3535BEGINPROC   TestProc
     36;    invept      eax, qword [ecx]
     37    DB          0x66, 0x0F, 0x38, 0x80, 0x1
     38;    invept      eax, qword [ecx]
     39    DB          0x66, 0x0F, 0x38, 0x81, 0x1
     40      mov   eax, dword [ecx]
    3641      mov   word [edi], 0123ah
    3742      movzx eax,byte  [edx]
     
    7176align 16
    7277BEGINPROC TestProc64
     78 ;    invept      rdi, qword [rsi]
     79    DB          0x66, 0x0F, 0x38, 0x80, 0x3E
     80;    invept      rcx, qword [rdx]
     81    DB          0x66, 0x0F, 0x38, 0x80, 0xA
     82    ;invvpid     rdi, qword [rsi]
     83    DB          0x66, 0x0F, 0x38, 0x81, 0x3E
     84;    invvpid     rcx, qword [rdx]
     85    DB          0x66, 0x0F, 0x38, 0x81, 0xA
     86      mov   rdi, [rsi]
     87      mov   rcx, [rdx]
    7388      db 48h
    7489      db 0c7h
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