VirtualBox

Changeset 41796 in vbox


Ignore:
Timestamp:
Jun 17, 2012 1:40:36 AM (12 years ago)
Author:
vboxsync
Message:

DIS: Dropped most of the little hacks in the groups for dealing with instructions that doesn't actually parse modrm bytes. Only group 7 and the FPU instructions are left with this hack.

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

Legend:

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

    r41795 r41796  
    7777static FNDISPARSE ParseImmQword;
    7878static FNDISPARSE ParseImmQword_SizeOnly;
     79static FNDISPARSE ParseInvOpModRm;
    7980
    8081static FNDISPARSE ParseTwoByteEsc;
     
    156157    ParseThreeByteEsc4,
    157158    ParseThreeByteEsc5,
    158     ParseImmAddrF
     159    ParseImmAddrF,
     160    ParseInvOpModRm
    159161};
    160162
     
    202204    ParseThreeByteEsc4,
    203205    ParseThreeByteEsc5,
    204     ParseImmAddrF_SizeOnly
     206    ParseImmAddrF_SizeOnly,
     207    ParseInvOpModRm
    205208};
    206209
     
    12821285static size_t ParseModFence(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
    12831286{
    1284     ////AssertMsgFailed(("??\n"));
    1285     //nothing to do apparently
    12861287    NOREF(pOp); NOREF(pParam); NOREF(pDis);
    1287     return offInstr;
     1288    /* Note! Only used in group 15, so we must account for the mod/rm byte. */
     1289    return offInstr + 1;
    12881290}
    12891291//*****************************************************************************
     
    18431845//*****************************************************************************
    18441846//*****************************************************************************
     1847static size_t ParseInvOpModRm(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
     1848{
     1849    /* This is used to avoid a bunch of special hacks to get the ModRM byte
     1850       included when encountering invalid opcodes in groups. */
     1851    return offInstr + 1;
     1852}
     1853//*****************************************************************************
     1854//*****************************************************************************
    18451855static size_t ParseTwoByteEsc(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
    18461856{
     
    20192029
    20202030    pOp = &g_aMapX86_Group1[idx+reg];
    2021     //little hack to make sure the ModRM byte is included in the returned size
    2022     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
    2023         offInstr++;
    20242031
    20252032    return disParseInstruction(offInstr, pOp, pDis);
     
    20572064    pOp = &g_aMapX86_Group2[idx+reg];
    20582065
    2059     //little hack to make sure the ModRM byte is included in the returned size
    2060     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
    2061         offInstr++;
    2062 
    20632066    return disParseInstruction(offInstr, pOp, pDis);
    20642067}
     
    20752078    pOp = &g_aMapX86_Group3[idx+reg];
    20762079
    2077     //little hack to make sure the ModRM byte is included in the returned size
    2078     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
    2079         offInstr++;
    2080 
    20812080    return disParseInstruction(offInstr, pOp, pDis);
    20822081}
     
    20922091    pOp = &g_aMapX86_Group4[reg];
    20932092
    2094     //little hack to make sure the ModRM byte is included in the returned size
    2095     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
    2096         offInstr++;
    2097 
    20982093    return disParseInstruction(offInstr, pOp, pDis);
    20992094}
     
    21082103
    21092104    pOp = &g_aMapX86_Group5[reg];
    2110 
    2111     //little hack to make sure the ModRM byte is included in the returned size
    2112     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
    2113         offInstr++;
    21142105
    21152106    return disParseInstruction(offInstr, pOp, pDis);
     
    21232114static size_t Parse3DNow(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
    21242115{
    2125 #ifdef DEBUG_Sander
    2126     //needs testing
    2127     AssertMsgFailed(("Test me\n"));
    2128 #endif
     2116    /** @todo This code needs testing! */
    21292117
    21302118    uint8_t ModRM = disReadByte(pDis, offInstr);
     
    21392127    pOp = &g_aTwoByteMapX86_3DNow[opcode];
    21402128
    2141     //little hack to make sure the ModRM byte is included in the returned size
    2142     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
    2143         offInstr++;                 /* for illegal opcodes */
    2144 
    21452129    size_t offStrict = disParseInstruction(offInstr, pOp, pDis);
    21462130    Assert(offStrict == offRet - 1);  NOREF(offStrict);   /* the imm8_opcode */
     
    21572141
    21582142    pOp = &g_aMapX86_Group6[reg];
    2159 
    2160     //little hack to make sure the ModRM byte is included in the returned size
    2161     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
    2162         offInstr++;
    21632143
    21642144    return disParseInstruction(offInstr, pOp, pDis);
     
    21832163        pOp = &g_aMapX86_Group7_mem[reg];
    21842164
     2165    /* Cannot easily skip this hack because of monitor and vmcall! */
    21852166    //little hack to make sure the ModRM byte is included in the returned size
    21862167    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
     
    22002181    pOp = &g_aMapX86_Group8[reg];
    22012182
    2202     //little hack to make sure the ModRM byte is included in the returned size
    2203     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
    2204         offInstr++;
    2205 
    22062183    return disParseInstruction(offInstr, pOp, pDis);
    22072184}
     
    22172194    pOp = &g_aMapX86_Group9[reg];
    22182195
    2219     //little hack to make sure the ModRM byte is included in the returned size
    2220     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
    2221         offInstr++;
    2222 
    22232196    return disParseInstruction(offInstr, pOp, pDis);
    22242197}
     
    22342207    pOp = &g_aMapX86_Group10[reg];
    22352208
    2236     //little hack to make sure the ModRM byte is included in the returned size
    2237     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
    2238         offInstr++;
    2239 
    22402209    return disParseInstruction(offInstr, pOp, pDis);
    22412210}
     
    22502219
    22512220    if (pDis->fPrefix & DISPREFIX_OPSIZE)
    2252         reg += 8;   //2nd table
     2221        reg += 8;   /* 2nd table */
    22532222
    22542223    pOp = &g_aMapX86_Group12[reg];
    2255 
    2256     //little hack to make sure the ModRM byte is included in the returned size
    2257     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
    2258         offInstr++;
    22592224
    22602225    return disParseInstruction(offInstr, pOp, pDis);
     
    22692234    uint8_t reg   = MODRM_REG(modrm);
    22702235    if (pDis->fPrefix & DISPREFIX_OPSIZE)
    2271         reg += 8;   //2nd table
     2236        reg += 8;   /* 2nd table */
    22722237
    22732238    pOp = &g_aMapX86_Group13[reg];
    2274 
    2275     //little hack to make sure the ModRM byte is included in the returned size
    2276     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
    2277         offInstr++;
    22782239
    22792240    return disParseInstruction(offInstr, pOp, pDis);
     
    22882249    uint8_t reg   = MODRM_REG(modrm);
    22892250    if (pDis->fPrefix & DISPREFIX_OPSIZE)
    2290         reg += 8;   //2nd table
     2251        reg += 8;   /* 2nd table */
    22912252
    22922253    pOp = &g_aMapX86_Group14[reg];
    2293 
    2294     //little hack to make sure the ModRM byte is included in the returned size
    2295     size_t size = 0;
    2296     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
    2297         offInstr++;
    22982254
    22992255    return disParseInstruction(offInstr, pOp, pDis);
     
    23152271        pOp = &g_aMapX86_Group15_mem[reg];
    23162272
    2317     //little hack to make sure the ModRM byte is included in the returned size
    2318     size_t size = 0;
    2319     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
    2320         offInstr++;
    2321 
    23222273    return disParseInstruction(offInstr, pOp, pDis);
    23232274}
     
    23302281    uint8_t modrm = disReadByte(pDis, offInstr);
    23312282    pOp = &g_aMapX86_Group16[MODRM_REG(modrm)];
    2332 
    2333     //little hack to make sure the ModRM byte is included in the returned size
    2334     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
    2335         offInstr++;
    23362283
    23372284    return disParseInstruction(offInstr, pOp, pDis);
  • trunk/src/VBox/Disassembler/DisasmInternal.h

    r41790 r41796  
    7171#define IDX_ParseThreeByteEsc5      39
    7272#define IDX_ParseImmAddrF           40
    73 #define IDX_ParseMax                (IDX_ParseImmAddrF+1)
     73#define IDX_ParseInvOpModRM         41
     74#define IDX_ParseMax                (IDX_ParseInvOpModRM+1)
    7475/** @}  */
    7576
  • trunk/src/VBox/Disassembler/DisasmTables.cpp

    r41726 r41796  
    3737#define INVALID_OPCODE  \
    3838    OP(SZINVALID_OPCODE,     0,              0,          0,          OP_INVALID, OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_INVALID)
    39 
    4039#define INVALID_OPCODE_BLOCK \
    4140    INVALID_OPCODE,\
     
    5554    INVALID_OPCODE,\
    5655    INVALID_OPCODE,
     56
     57#define INVALID_OPCODE_MOD_RM \
     58    OP(SZINVALID_OPCODE,     IDX_ParseInvOpModRM, 0,     0,          OP_INVALID, OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_INVALID)
     59#define INVALID_OPCODE_BLOCK_MOD_RM \
     60    INVALID_OPCODE_MOD_RM,\
     61    INVALID_OPCODE_MOD_RM,\
     62    INVALID_OPCODE_MOD_RM,\
     63    INVALID_OPCODE_MOD_RM,\
     64    INVALID_OPCODE_MOD_RM,\
     65    INVALID_OPCODE_MOD_RM,\
     66    INVALID_OPCODE_MOD_RM,\
     67    INVALID_OPCODE_MOD_RM,\
     68    INVALID_OPCODE_MOD_RM,\
     69    INVALID_OPCODE_MOD_RM,\
     70    INVALID_OPCODE_MOD_RM,\
     71    INVALID_OPCODE_MOD_RM,\
     72    INVALID_OPCODE_MOD_RM,\
     73    INVALID_OPCODE_MOD_RM,\
     74    INVALID_OPCODE_MOD_RM,\
     75    INVALID_OPCODE_MOD_RM,
    5776
    5877/* Invalid opcode */
     
    14781497{
    14791498    /* 0 */
    1480     INVALID_OPCODE,
    1481     INVALID_OPCODE,
    1482     INVALID_OPCODE,
    1483     INVALID_OPCODE,
    1484     INVALID_OPCODE,
    1485     INVALID_OPCODE,
    1486     INVALID_OPCODE,
    1487     INVALID_OPCODE,
    1488     INVALID_OPCODE,
    1489     INVALID_OPCODE,
    1490     INVALID_OPCODE,
     1499    INVALID_OPCODE_MOD_RM,
     1500    INVALID_OPCODE_MOD_RM,
     1501    INVALID_OPCODE_MOD_RM,
     1502    INVALID_OPCODE_MOD_RM,
     1503    INVALID_OPCODE_MOD_RM,
     1504    INVALID_OPCODE_MOD_RM,
     1505    INVALID_OPCODE_MOD_RM,
     1506    INVALID_OPCODE_MOD_RM,
     1507    INVALID_OPCODE_MOD_RM,
     1508    INVALID_OPCODE_MOD_RM,
     1509    INVALID_OPCODE_MOD_RM,
    14911510    OP("pi2fw %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PI2FW,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    14921511    OP("pi2fd %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PI2FD,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1493     INVALID_OPCODE,
    1494     INVALID_OPCODE,
     1512    INVALID_OPCODE_MOD_RM,
     1513    INVALID_OPCODE_MOD_RM,
    14951514
    14961515    /* 1 */
    1497     INVALID_OPCODE,
    1498     INVALID_OPCODE,
    1499     INVALID_OPCODE,
    1500     INVALID_OPCODE,
    1501     INVALID_OPCODE,
    1502     INVALID_OPCODE,
    1503     INVALID_OPCODE,
    1504     INVALID_OPCODE,
    1505     INVALID_OPCODE,
    1506     INVALID_OPCODE,
    1507     INVALID_OPCODE,
     1516    INVALID_OPCODE_MOD_RM,
     1517    INVALID_OPCODE_MOD_RM,
     1518    INVALID_OPCODE_MOD_RM,
     1519    INVALID_OPCODE_MOD_RM,
     1520    INVALID_OPCODE_MOD_RM,
     1521    INVALID_OPCODE_MOD_RM,
     1522    INVALID_OPCODE_MOD_RM,
     1523    INVALID_OPCODE_MOD_RM,
     1524    INVALID_OPCODE_MOD_RM,
     1525    INVALID_OPCODE_MOD_RM,
     1526    INVALID_OPCODE_MOD_RM,
    15081527    OP("pf2iw %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PF2IW,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    15091528    OP("pf2id %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PF2ID,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1510     INVALID_OPCODE,
    1511     INVALID_OPCODE,
     1529    INVALID_OPCODE_MOD_RM,
     1530    INVALID_OPCODE_MOD_RM,
    15121531
    15131532    /* 2 */
    1514     INVALID_OPCODE_BLOCK
     1533    INVALID_OPCODE_BLOCK_MOD_RM
    15151534
    15161535    /* 3 */
    1517     INVALID_OPCODE_BLOCK
     1536    INVALID_OPCODE_BLOCK_MOD_RM
    15181537
    15191538    /* 4 */
    1520     INVALID_OPCODE_BLOCK
     1539    INVALID_OPCODE_BLOCK_MOD_RM
    15211540
    15221541    /* 5 */
    1523     INVALID_OPCODE_BLOCK
     1542    INVALID_OPCODE_BLOCK_MOD_RM
    15241543
    15251544    /* 6 */
    1526     INVALID_OPCODE_BLOCK
     1545    INVALID_OPCODE_BLOCK_MOD_RM
    15271546
    15281547    /* 7 */
    1529     INVALID_OPCODE_BLOCK
     1548    INVALID_OPCODE_BLOCK_MOD_RM
    15301549
    15311550    /* 8 */
    1532     INVALID_OPCODE,
    1533     INVALID_OPCODE,
    1534     INVALID_OPCODE,
    1535     INVALID_OPCODE,
    1536     INVALID_OPCODE,
    1537     INVALID_OPCODE,
    1538     INVALID_OPCODE,
    1539     INVALID_OPCODE,
    1540     INVALID_OPCODE,
    1541     INVALID_OPCODE,
     1551    INVALID_OPCODE_MOD_RM,
     1552    INVALID_OPCODE_MOD_RM,
     1553    INVALID_OPCODE_MOD_RM,
     1554    INVALID_OPCODE_MOD_RM,
     1555    INVALID_OPCODE_MOD_RM,
     1556    INVALID_OPCODE_MOD_RM,
     1557    INVALID_OPCODE_MOD_RM,
     1558    INVALID_OPCODE_MOD_RM,
     1559    INVALID_OPCODE_MOD_RM,
     1560    INVALID_OPCODE_MOD_RM,
    15421561    OP("pfnacc %Pq,%Qq",     IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFNACC,  OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1543     INVALID_OPCODE,
    1544     INVALID_OPCODE,
    1545     INVALID_OPCODE,
     1562    INVALID_OPCODE_MOD_RM,
     1563    INVALID_OPCODE_MOD_RM,
     1564    INVALID_OPCODE_MOD_RM,
    15461565    OP("pfpnacc %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFPNACC, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1547     INVALID_OPCODE,
     1566    INVALID_OPCODE_MOD_RM,
    15481567
    15491568    /* 9 */
    15501569    OP("pfcmpge %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFCMPGE, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1551     INVALID_OPCODE,
    1552     INVALID_OPCODE,
    1553     INVALID_OPCODE,
     1570    INVALID_OPCODE_MOD_RM,
     1571    INVALID_OPCODE_MOD_RM,
     1572    INVALID_OPCODE_MOD_RM,
    15541573    OP("pfmin %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFMIN,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1555     INVALID_OPCODE,
     1574    INVALID_OPCODE_MOD_RM,
    15561575    OP("pfrcp %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFRCP,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    15571576    OP("pfrsqrt %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFRSQRT, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1558     INVALID_OPCODE,
    1559     INVALID_OPCODE,
     1577    INVALID_OPCODE_MOD_RM,
     1578    INVALID_OPCODE_MOD_RM,
    15601579    OP("pfsub %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFSUB,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1561     INVALID_OPCODE,
    1562     INVALID_OPCODE,
    1563     INVALID_OPCODE,
     1580    INVALID_OPCODE_MOD_RM,
     1581    INVALID_OPCODE_MOD_RM,
     1582    INVALID_OPCODE_MOD_RM,
    15641583    OP("pfadd %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFADD,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1565     INVALID_OPCODE,
     1584    INVALID_OPCODE_MOD_RM,
    15661585
    15671586    /* a */
    15681587    OP("pfcmpgt %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFCMPGT, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1569     INVALID_OPCODE,
    1570     INVALID_OPCODE,
    1571     INVALID_OPCODE,
     1588    INVALID_OPCODE_MOD_RM,
     1589    INVALID_OPCODE_MOD_RM,
     1590    INVALID_OPCODE_MOD_RM,
    15721591    OP("pfmax %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFMAX,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1573     INVALID_OPCODE,
     1592    INVALID_OPCODE_MOD_RM,
    15741593    OP("pfrcpit1 %Pq,%Qq",   IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFRCPIT1,OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    15751594    OP("pfrsqrtit1 %Pq,%Qq", IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFRSQRTIT1,  OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1576     INVALID_OPCODE,
    1577     INVALID_OPCODE,
     1595    INVALID_OPCODE_MOD_RM,
     1596    INVALID_OPCODE_MOD_RM,
    15781597    OP("pfsubr %Pq,%Qq",     IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFSUBR,  OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1579     INVALID_OPCODE,
    1580     INVALID_OPCODE,
    1581     INVALID_OPCODE,
     1598    INVALID_OPCODE_MOD_RM,
     1599    INVALID_OPCODE_MOD_RM,
     1600    INVALID_OPCODE_MOD_RM,
    15821601    OP("pfacc %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFACC,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1583     INVALID_OPCODE,
     1602    INVALID_OPCODE_MOD_RM,
    15841603
    15851604    /* b */
    15861605    OP("pfcmpeq %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFCMPEQ, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1587     INVALID_OPCODE,
    1588     INVALID_OPCODE,
    1589     INVALID_OPCODE,
     1606    INVALID_OPCODE_MOD_RM,
     1607    INVALID_OPCODE_MOD_RM,
     1608    INVALID_OPCODE_MOD_RM,
    15901609    OP("pfmul %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFMUL,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1591     INVALID_OPCODE,
     1610    INVALID_OPCODE_MOD_RM,
    15921611    OP("pfrcpit2 %Pq,%Qq",   IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFRCPIT2,OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    15931612    OP("pfmulhrw %Pq,%Qq",   IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFMULHRW,OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1594     INVALID_OPCODE,
    1595     INVALID_OPCODE,
    1596     INVALID_OPCODE,
     1613    INVALID_OPCODE_MOD_RM,
     1614    INVALID_OPCODE_MOD_RM,
     1615    INVALID_OPCODE_MOD_RM,
    15971616    OP("pswapd %Pq,%Qq",     IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFSWAPD, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1598     INVALID_OPCODE,
    1599     INVALID_OPCODE,
    1600     INVALID_OPCODE,
     1617    INVALID_OPCODE_MOD_RM,
     1618    INVALID_OPCODE_MOD_RM,
     1619    INVALID_OPCODE_MOD_RM,
    16011620    OP("pavgusb %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PAVGUSB, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    16021621
    16031622    /* c */
    1604     INVALID_OPCODE_BLOCK
     1623    INVALID_OPCODE_BLOCK_MOD_RM
    16051624
    16061625    /* d */
    1607     INVALID_OPCODE_BLOCK
     1626    INVALID_OPCODE_BLOCK_MOD_RM
    16081627
    16091628    /* e */
    1610     INVALID_OPCODE_BLOCK
     1629    INVALID_OPCODE_BLOCK_MOD_RM
    16111630
    16121631    /* f */
    1613     INVALID_OPCODE_BLOCK
     1632    INVALID_OPCODE_BLOCK_MOD_RM
    16141633};
    16151634
     
    24212440    OP("test %Eb,%Ib",       IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_TEST,   OP_PARM_Eb,         OP_PARM_Ib ,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    24222441    //AMD manual claims test??
    2423     INVALID_OPCODE,
     2442    INVALID_OPCODE_MOD_RM,
    24242443    OP("not %Eb",            IDX_ParseModRM,     0,          0,          OP_NOT,     OP_PARM_Eb,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    24252444    OP("neg %Eb",            IDX_ParseModRM,     0,          0,          OP_NEG,     OP_PARM_Eb,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     
    24322451    OP("test %Ev,%Iz",       IDX_ParseModRM,     IDX_ParseImmZ,  0,          OP_TEST,    OP_PARM_Ev,         OP_PARM_Iz ,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    24332452    //AMD manual claims test??
    2434     INVALID_OPCODE,
     2453    INVALID_OPCODE_MOD_RM,
    24352454    OP("not %Ev",            IDX_ParseModRM,     0,          0,          OP_NOT,     OP_PARM_Ev,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    24362455    OP("neg %Ev",            IDX_ParseModRM,     0,          0,          OP_NEG,     OP_PARM_Ev,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     
    24462465    OP("inc %Eb",            IDX_ParseModRM,     0,          0,          OP_INC,     OP_PARM_Eb,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    24472466    OP("dec %Eb",            IDX_ParseModRM,     0,          0,          OP_DEC,     OP_PARM_Eb,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2448     INVALID_OPCODE,
    2449     INVALID_OPCODE,
    2450     INVALID_OPCODE,
    2451     INVALID_OPCODE,
    2452     INVALID_OPCODE,
    2453     INVALID_OPCODE,
     2467    INVALID_OPCODE_MOD_RM,
     2468    INVALID_OPCODE_MOD_RM,
     2469    INVALID_OPCODE_MOD_RM,
     2470    INVALID_OPCODE_MOD_RM,
     2471    INVALID_OPCODE_MOD_RM,
     2472    INVALID_OPCODE_MOD_RM,
    24542473};
    24552474
     
    24642483    OP("jmp %Ep",            IDX_ParseModRM,     0,          0,          OP_JMP,     OP_PARM_Ep,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_CONTROLFLOW | DISOPTYPE_UNCOND_CONTROLFLOW),
    24652484    OP("push %Ev",           IDX_ParseModRM,     0,          0,          OP_PUSH,    OP_PARM_Ev,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_DEFAULT_64_OP_SIZE),
    2466     INVALID_OPCODE,
     2485    INVALID_OPCODE_MOD_RM,
    24672486};
    24682487
     
    24772496    OP("verr %Ew",           IDX_ParseModRM,     0,          0,          OP_VERR,    OP_PARM_Ew,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP),
    24782497    OP("verw %Ew",           IDX_ParseModRM,     0,          0,          OP_VERW,    OP_PARM_Ew,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP),
    2479     INVALID_OPCODE,
    2480     INVALID_OPCODE,
    2481 };
    2482 
     2498    INVALID_OPCODE_MOD_RM,
     2499    INVALID_OPCODE_MOD_RM,
     2500};
     2501
     2502/* Note!! Group 7 is NOT using the INVALID_OPCODE_MOD_RM because of monitor and vmcall. */
    24832503const DISOPCODE g_aMapX86_Group7_mem[8] =
    24842504{
     
    24942514};
    24952515
     2516/* Note!! Group 7 is NOT using the INVALID_OPCODE_MOD_RM because of monitor and vmcall. */
    24962517const DISOPCODE g_aMapX86_Group7_mod11_rm000[8] =
    24972518{
     
    25072528};
    25082529
     2530/* Note!! Group 7 is NOT using the INVALID_OPCODE_MOD_RM because of monitor and vmcall. */
    25092531const DISOPCODE g_aMapX86_Group7_mod11_rm001[8] =
    25102532{
     
    25232545{
    25242546    /* 0F BA */
    2525     INVALID_OPCODE,
    2526     INVALID_OPCODE,
    2527     INVALID_OPCODE,
    2528     INVALID_OPCODE,
     2547    INVALID_OPCODE_MOD_RM,
     2548    INVALID_OPCODE_MOD_RM,
     2549    INVALID_OPCODE_MOD_RM,
     2550    INVALID_OPCODE_MOD_RM,
    25292551    OP("bt %Ev,%Ib",         IDX_ParseModRM,     IDX_ParseImmByte,       0,          OP_BT,      OP_PARM_Ev,         OP_PARM_Ib ,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    25302552    OP("bts %Ev,%Ib",        IDX_ParseModRM,     IDX_ParseImmByte,       0,          OP_BTS,     OP_PARM_Ev,         OP_PARM_Ib ,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     
    25362558{
    25372559    /* 0F C7 */
    2538     INVALID_OPCODE,
     2560    INVALID_OPCODE_MOD_RM,
    25392561    OP("cmpxchg8b %Mq",      IDX_ParseModRM,     0,          0,          OP_CMPXCHG8B, OP_PARM_Mq,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2540     INVALID_OPCODE,
    2541     INVALID_OPCODE,
    2542     INVALID_OPCODE,
    2543     INVALID_OPCODE,
    2544     INVALID_OPCODE,
    2545     INVALID_OPCODE,
     2562    INVALID_OPCODE_MOD_RM,
     2563    INVALID_OPCODE_MOD_RM,
     2564    INVALID_OPCODE_MOD_RM,
     2565    INVALID_OPCODE_MOD_RM,
     2566    INVALID_OPCODE_MOD_RM,
     2567    INVALID_OPCODE_MOD_RM,
    25462568};
    25472569
     
    25492571{
    25502572    /* 0F B9 */
    2551     INVALID_OPCODE,
    2552     INVALID_OPCODE,
    2553     INVALID_OPCODE,
    2554     INVALID_OPCODE,
    2555     INVALID_OPCODE,
    2556     INVALID_OPCODE,
    2557     INVALID_OPCODE,
    2558     INVALID_OPCODE,
     2573    INVALID_OPCODE_MOD_RM,
     2574    INVALID_OPCODE_MOD_RM,
     2575    INVALID_OPCODE_MOD_RM,
     2576    INVALID_OPCODE_MOD_RM,
     2577    INVALID_OPCODE_MOD_RM,
     2578    INVALID_OPCODE_MOD_RM,
     2579    INVALID_OPCODE_MOD_RM,
     2580    INVALID_OPCODE_MOD_RM,
    25592581};
    25602582
     
    25862608const DISOPCODE g_aMapX86_Group12[8*2] =
    25872609{
    2588     INVALID_OPCODE,
    2589     INVALID_OPCODE,
     2610    INVALID_OPCODE_MOD_RM,
     2611    INVALID_OPCODE_MOD_RM,
    25902612    OP("psrlw %Pq,%Ib",      IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRLW,  OP_PARM_Pq,         OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2591     INVALID_OPCODE,
     2613    INVALID_OPCODE_MOD_RM,
    25922614    OP("psraw %Pq,%Ib",      IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRAW,  OP_PARM_Pq,         OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2593     INVALID_OPCODE,
     2615    INVALID_OPCODE_MOD_RM,
    25942616    OP("psllw %Pq,%Ib",      IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSLLW,  OP_PARM_Pq,         OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2595     INVALID_OPCODE,
     2617    INVALID_OPCODE_MOD_RM,
    25962618
    25972619    /* Group 12 with prefix 0x66 */
    2598     INVALID_OPCODE,
    2599     INVALID_OPCODE,
     2620    INVALID_OPCODE_MOD_RM,
     2621    INVALID_OPCODE_MOD_RM,
    26002622    OP("psrlw %Pdq,%Ib",     IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRLW,  OP_PARM_Pdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2601     INVALID_OPCODE,
     2623    INVALID_OPCODE_MOD_RM,
    26022624    OP("psraw %Pdq,%Ib",     IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRAW,  OP_PARM_Pdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2603     INVALID_OPCODE,
     2625    INVALID_OPCODE_MOD_RM,
    26042626    OP("psllw %Pdq,%Ib",     IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSLLW,  OP_PARM_Pdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2605     INVALID_OPCODE,
     2627    INVALID_OPCODE_MOD_RM,
    26062628};
    26072629
     
    26092631const DISOPCODE g_aMapX86_Group13[8*2] =
    26102632{
    2611     INVALID_OPCODE,
    2612     INVALID_OPCODE,
     2633    INVALID_OPCODE_MOD_RM,
     2634    INVALID_OPCODE_MOD_RM,
    26132635    OP("psrld %Pq,%Ib",      IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRLD,  OP_PARM_Pq,         OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2614     INVALID_OPCODE,
     2636    INVALID_OPCODE_MOD_RM,
    26152637    OP("psrad %Pq,%Ib",      IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRAD,  OP_PARM_Pq,         OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2616     INVALID_OPCODE,
     2638    INVALID_OPCODE_MOD_RM,
    26172639    OP("pslld %Pq,%Ib",      IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSLLD,  OP_PARM_Pq,         OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2618     INVALID_OPCODE,
     2640    INVALID_OPCODE_MOD_RM,
    26192641
    26202642    /* Group 13 with prefix 0x66 */
    2621     INVALID_OPCODE,
    2622     INVALID_OPCODE,
     2643    INVALID_OPCODE_MOD_RM,
     2644    INVALID_OPCODE_MOD_RM,
    26232645    OP("psrld %Wdq,%Ib",     IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRLD,  OP_PARM_Wdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2624     INVALID_OPCODE,
     2646    INVALID_OPCODE_MOD_RM,
    26252647    OP("psrad %Wdq,%Ib",     IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRAD,  OP_PARM_Wdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2626     INVALID_OPCODE,
     2648    INVALID_OPCODE_MOD_RM,
    26272649    OP("pslld %Wdq,%Ib",     IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSLLD,  OP_PARM_Wdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2628     INVALID_OPCODE,
     2650    INVALID_OPCODE_MOD_RM,
    26292651};
    26302652
     
    26322654const DISOPCODE g_aMapX86_Group14[8*2] =
    26332655{
    2634     INVALID_OPCODE,
    2635     INVALID_OPCODE,
     2656    INVALID_OPCODE_MOD_RM,
     2657    INVALID_OPCODE_MOD_RM,
    26362658    OP("psrlq %Pq,%Ib",      IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRLQ,  OP_PARM_Pq,         OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2637     INVALID_OPCODE,
    2638     INVALID_OPCODE,
    2639     INVALID_OPCODE,
     2659    INVALID_OPCODE_MOD_RM,
     2660    INVALID_OPCODE_MOD_RM,
     2661    INVALID_OPCODE_MOD_RM,
    26402662    OP("psllq %Pq,%Ib",      IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSLLQ,  OP_PARM_Pq,         OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2641     INVALID_OPCODE,
     2663    INVALID_OPCODE_MOD_RM,
    26422664
    26432665    /* Group 14 with prefix 0x66 */
    2644     INVALID_OPCODE,
    2645     INVALID_OPCODE,
     2666    INVALID_OPCODE_MOD_RM,
     2667    INVALID_OPCODE_MOD_RM,
    26462668    OP("psrlq %Wdq,%Ib",     IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRLD,  OP_PARM_Wdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    26472669    OP("psrldq %Wdq,%Ib",    IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRLDQ, OP_PARM_Wdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2648     INVALID_OPCODE,
    2649     INVALID_OPCODE,
     2670    INVALID_OPCODE_MOD_RM,
     2671    INVALID_OPCODE_MOD_RM,
    26502672    OP("psllq %Wdq,%Ib",     IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSLLD,  OP_PARM_Wdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    26512673    OP("pslldq %Wdq,%Ib",    IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSLLDQ, OP_PARM_Wdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     
    26602682    OP("ldmxcsr %M",         IDX_ParseModRM,     0,          0,          OP_LDMXCSR, OP_PARM_M,          OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    26612683    OP("stmxcsr %M",         IDX_ParseModRM,     0,          0,          OP_STMXCSR, OP_PARM_M,          OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2662     INVALID_OPCODE,
    2663     INVALID_OPCODE,
    2664     INVALID_OPCODE,
     2684    INVALID_OPCODE_MOD_RM,
     2685    INVALID_OPCODE_MOD_RM,
     2686    INVALID_OPCODE_MOD_RM,
    26652687    OP("clflush %Mb",        IDX_ParseModRM,     0,          0,          OP_CLFLUSH, OP_PARM_Mb,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    26662688};
     
    26692691const DISOPCODE g_aMapX86_Group15_mod11_rm000[8] =
    26702692{
    2671     INVALID_OPCODE,
    2672     INVALID_OPCODE,
    2673     INVALID_OPCODE,
    2674     INVALID_OPCODE,
    2675     INVALID_OPCODE,
     2693    INVALID_OPCODE_MOD_RM,
     2694    INVALID_OPCODE_MOD_RM,
     2695    INVALID_OPCODE_MOD_RM,
     2696    INVALID_OPCODE_MOD_RM,
     2697    INVALID_OPCODE_MOD_RM,
    26762698    OP("lfence",             IDX_ParseModFence,  0,          0,          OP_LFENCE,  OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    26772699    OP("mfence",             IDX_ParseModFence,  0,          0,          OP_MFENCE,  OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     
    26862708    OP("prefetcht1 %Mb",   IDX_ParseModRM, 0,          0,          OP_PREFETCH,OP_PARM_Mb,        OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    26872709    OP("prefetcht2 %Mb",   IDX_ParseModRM, 0,          0,          OP_PREFETCH,OP_PARM_Mb,        OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    2688     INVALID_OPCODE,
    2689     INVALID_OPCODE,
    2690     INVALID_OPCODE,
    2691     INVALID_OPCODE,
     2710    INVALID_OPCODE_MOD_RM,
     2711    INVALID_OPCODE_MOD_RM,
     2712    INVALID_OPCODE_MOD_RM,
     2713    INVALID_OPCODE_MOD_RM,
    26922714};
    26932715
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