VirtualBox

Changeset 13241

Show
Ignore:
Timestamp:
10/14/08 11:30:41 (3 months ago)
Author:
vboxsync
Message:

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

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/include/VBox/disopcode.h

    r9851 r13241  
    239239#define OP_MOVQ         192 
    240240#define OP_PSHUFW       193 
     241#define OP_3B_ESC4      194 
     242#define OP_3B_ESC5      195 
    241243 
    242244#define OP_PCMPEQB      196 
     
    384386#define OP_MOVNTDQ      354 
    385387 
    386 #define OP_PMASKMOVDQU  369 
    387  
    388  
    389  
    390  
     388#define OP_PSHUFB       355 
     389#define OP_PHADDW       356 
     390#define OP_PHADDD       357 
     391#define OP_PHADDSW      358 
     392#define OP_PMADDUBSW    359 
     393#define OP_PHSUBW       360 
     394#define OP_PHSUBD       361 
     395#define OP_PHSUBSW      362 
     396#define OP_PSIGNB       363 
     397#define OP_PSIGNW       364 
     398#define OP_PSIGND       365 
     399#define OP_PMULHRSW     366 
     400#define OP_PBLENDVB     367 
     401#define OP_BLENDVPS     368 
     402#define OP_BLENDVPD     369 
     403#define OP_PTEST        370 
     404#define OP_PABSB        371 
     405#define OP_PABSW        372 
     406#define OP_PABSD        373 
     407 
     408#define OP_PMASKMOVDQU  376 
    391409#define OP_MOVSD        377 
    392410#define OP_CVTSI2SD     378 
     
    598616#define OP_VMPTRLD      658 
    599617#define OP_VMPTRST      659 
     618#define OP_INVEPT       660 
     619#define OP_INVVPID      661 
    600620 
    601621/* 64 bits instruction */ 
     
    781801#define OP_PARM_Mp              (OP_PARM_M+OP_PARM_p) 
    782802#define OP_PARM_Mq              (OP_PARM_M+OP_PARM_q) 
     803#define OP_PARM_Mdq             (OP_PARM_M+OP_PARM_dq) 
    783804#define OP_PARM_Ms              (OP_PARM_M+OP_PARM_s) 
    784805#define OP_PARM_Ob              (OP_PARM_O+OP_PARM_b) 
  • 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 

© 2008 Sun Microsystems, Inc.
ContactPrivacy policy