Changeset 41796 in vbox
- Timestamp:
- Jun 17, 2012 1:40:36 AM (12 years ago)
- Location:
- trunk/src/VBox/Disassembler
- Files:
-
- 3 edited
-
DisasmCore.cpp (modified) (22 diffs)
-
DisasmInternal.h (modified) (1 diff)
-
DisasmTables.cpp (modified) (19 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Disassembler/DisasmCore.cpp
r41795 r41796 77 77 static FNDISPARSE ParseImmQword; 78 78 static FNDISPARSE ParseImmQword_SizeOnly; 79 static FNDISPARSE ParseInvOpModRm; 79 80 80 81 static FNDISPARSE ParseTwoByteEsc; … … 156 157 ParseThreeByteEsc4, 157 158 ParseThreeByteEsc5, 158 ParseImmAddrF 159 ParseImmAddrF, 160 ParseInvOpModRm 159 161 }; 160 162 … … 202 204 ParseThreeByteEsc4, 203 205 ParseThreeByteEsc5, 204 ParseImmAddrF_SizeOnly 206 ParseImmAddrF_SizeOnly, 207 ParseInvOpModRm 205 208 }; 206 209 … … 1282 1285 static size_t ParseModFence(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 1283 1286 { 1284 ////AssertMsgFailed(("??\n"));1285 //nothing to do apparently1286 1287 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; 1288 1290 } 1289 1291 //***************************************************************************** … … 1843 1845 //***************************************************************************** 1844 1846 //***************************************************************************** 1847 static 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 //***************************************************************************** 1845 1855 static size_t ParseTwoByteEsc(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 1846 1856 { … … 2019 2029 2020 2030 pOp = &g_aMapX86_Group1[idx+reg]; 2021 //little hack to make sure the ModRM byte is included in the returned size2022 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)2023 offInstr++;2024 2031 2025 2032 return disParseInstruction(offInstr, pOp, pDis); … … 2057 2064 pOp = &g_aMapX86_Group2[idx+reg]; 2058 2065 2059 //little hack to make sure the ModRM byte is included in the returned size2060 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)2061 offInstr++;2062 2063 2066 return disParseInstruction(offInstr, pOp, pDis); 2064 2067 } … … 2075 2078 pOp = &g_aMapX86_Group3[idx+reg]; 2076 2079 2077 //little hack to make sure the ModRM byte is included in the returned size2078 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)2079 offInstr++;2080 2081 2080 return disParseInstruction(offInstr, pOp, pDis); 2082 2081 } … … 2092 2091 pOp = &g_aMapX86_Group4[reg]; 2093 2092 2094 //little hack to make sure the ModRM byte is included in the returned size2095 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)2096 offInstr++;2097 2098 2093 return disParseInstruction(offInstr, pOp, pDis); 2099 2094 } … … 2108 2103 2109 2104 pOp = &g_aMapX86_Group5[reg]; 2110 2111 //little hack to make sure the ModRM byte is included in the returned size2112 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)2113 offInstr++;2114 2105 2115 2106 return disParseInstruction(offInstr, pOp, pDis); … … 2123 2114 static size_t Parse3DNow(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 2124 2115 { 2125 #ifdef DEBUG_Sander 2126 //needs testing 2127 AssertMsgFailed(("Test me\n")); 2128 #endif 2116 /** @todo This code needs testing! */ 2129 2117 2130 2118 uint8_t ModRM = disReadByte(pDis, offInstr); … … 2139 2127 pOp = &g_aTwoByteMapX86_3DNow[opcode]; 2140 2128 2141 //little hack to make sure the ModRM byte is included in the returned size2142 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)2143 offInstr++; /* for illegal opcodes */2144 2145 2129 size_t offStrict = disParseInstruction(offInstr, pOp, pDis); 2146 2130 Assert(offStrict == offRet - 1); NOREF(offStrict); /* the imm8_opcode */ … … 2157 2141 2158 2142 pOp = &g_aMapX86_Group6[reg]; 2159 2160 //little hack to make sure the ModRM byte is included in the returned size2161 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)2162 offInstr++;2163 2143 2164 2144 return disParseInstruction(offInstr, pOp, pDis); … … 2183 2163 pOp = &g_aMapX86_Group7_mem[reg]; 2184 2164 2165 /* Cannot easily skip this hack because of monitor and vmcall! */ 2185 2166 //little hack to make sure the ModRM byte is included in the returned size 2186 2167 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) … … 2200 2181 pOp = &g_aMapX86_Group8[reg]; 2201 2182 2202 //little hack to make sure the ModRM byte is included in the returned size2203 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)2204 offInstr++;2205 2206 2183 return disParseInstruction(offInstr, pOp, pDis); 2207 2184 } … … 2217 2194 pOp = &g_aMapX86_Group9[reg]; 2218 2195 2219 //little hack to make sure the ModRM byte is included in the returned size2220 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)2221 offInstr++;2222 2223 2196 return disParseInstruction(offInstr, pOp, pDis); 2224 2197 } … … 2234 2207 pOp = &g_aMapX86_Group10[reg]; 2235 2208 2236 //little hack to make sure the ModRM byte is included in the returned size2237 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)2238 offInstr++;2239 2240 2209 return disParseInstruction(offInstr, pOp, pDis); 2241 2210 } … … 2250 2219 2251 2220 if (pDis->fPrefix & DISPREFIX_OPSIZE) 2252 reg += 8; / /2nd table2221 reg += 8; /* 2nd table */ 2253 2222 2254 2223 pOp = &g_aMapX86_Group12[reg]; 2255 2256 //little hack to make sure the ModRM byte is included in the returned size2257 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)2258 offInstr++;2259 2224 2260 2225 return disParseInstruction(offInstr, pOp, pDis); … … 2269 2234 uint8_t reg = MODRM_REG(modrm); 2270 2235 if (pDis->fPrefix & DISPREFIX_OPSIZE) 2271 reg += 8; / /2nd table2236 reg += 8; /* 2nd table */ 2272 2237 2273 2238 pOp = &g_aMapX86_Group13[reg]; 2274 2275 //little hack to make sure the ModRM byte is included in the returned size2276 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)2277 offInstr++;2278 2239 2279 2240 return disParseInstruction(offInstr, pOp, pDis); … … 2288 2249 uint8_t reg = MODRM_REG(modrm); 2289 2250 if (pDis->fPrefix & DISPREFIX_OPSIZE) 2290 reg += 8; / /2nd table2251 reg += 8; /* 2nd table */ 2291 2252 2292 2253 pOp = &g_aMapX86_Group14[reg]; 2293 2294 //little hack to make sure the ModRM byte is included in the returned size2295 size_t size = 0;2296 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)2297 offInstr++;2298 2254 2299 2255 return disParseInstruction(offInstr, pOp, pDis); … … 2315 2271 pOp = &g_aMapX86_Group15_mem[reg]; 2316 2272 2317 //little hack to make sure the ModRM byte is included in the returned size2318 size_t size = 0;2319 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)2320 offInstr++;2321 2322 2273 return disParseInstruction(offInstr, pOp, pDis); 2323 2274 } … … 2330 2281 uint8_t modrm = disReadByte(pDis, offInstr); 2331 2282 pOp = &g_aMapX86_Group16[MODRM_REG(modrm)]; 2332 2333 //little hack to make sure the ModRM byte is included in the returned size2334 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)2335 offInstr++;2336 2283 2337 2284 return disParseInstruction(offInstr, pOp, pDis); -
trunk/src/VBox/Disassembler/DisasmInternal.h
r41790 r41796 71 71 #define IDX_ParseThreeByteEsc5 39 72 72 #define IDX_ParseImmAddrF 40 73 #define IDX_ParseMax (IDX_ParseImmAddrF+1) 73 #define IDX_ParseInvOpModRM 41 74 #define IDX_ParseMax (IDX_ParseInvOpModRM+1) 74 75 /** @} */ 75 76 -
trunk/src/VBox/Disassembler/DisasmTables.cpp
r41726 r41796 37 37 #define INVALID_OPCODE \ 38 38 OP(SZINVALID_OPCODE, 0, 0, 0, OP_INVALID, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_INVALID) 39 40 39 #define INVALID_OPCODE_BLOCK \ 41 40 INVALID_OPCODE,\ … … 55 54 INVALID_OPCODE,\ 56 55 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, 57 76 58 77 /* Invalid opcode */ … … 1478 1497 { 1479 1498 /* 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, 1491 1510 OP("pi2fw %Pq,%Qq", IDX_ParseModRM, IDX_UseModRM, 0, OP_PI2FW, OP_PARM_Pq, OP_PARM_Qq, OP_PARM_NONE, DISOPTYPE_HARMLESS), 1492 1511 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, 1495 1514 1496 1515 /* 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, 1508 1527 OP("pf2iw %Pq,%Qq", IDX_ParseModRM, IDX_UseModRM, 0, OP_PF2IW, OP_PARM_Pq, OP_PARM_Qq, OP_PARM_NONE, DISOPTYPE_HARMLESS), 1509 1528 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, 1512 1531 1513 1532 /* 2 */ 1514 INVALID_OPCODE_BLOCK 1533 INVALID_OPCODE_BLOCK_MOD_RM 1515 1534 1516 1535 /* 3 */ 1517 INVALID_OPCODE_BLOCK 1536 INVALID_OPCODE_BLOCK_MOD_RM 1518 1537 1519 1538 /* 4 */ 1520 INVALID_OPCODE_BLOCK 1539 INVALID_OPCODE_BLOCK_MOD_RM 1521 1540 1522 1541 /* 5 */ 1523 INVALID_OPCODE_BLOCK 1542 INVALID_OPCODE_BLOCK_MOD_RM 1524 1543 1525 1544 /* 6 */ 1526 INVALID_OPCODE_BLOCK 1545 INVALID_OPCODE_BLOCK_MOD_RM 1527 1546 1528 1547 /* 7 */ 1529 INVALID_OPCODE_BLOCK 1548 INVALID_OPCODE_BLOCK_MOD_RM 1530 1549 1531 1550 /* 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, 1542 1561 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, 1546 1565 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, 1548 1567 1549 1568 /* 9 */ 1550 1569 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, 1554 1573 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, 1556 1575 OP("pfrcp %Pq,%Qq", IDX_ParseModRM, IDX_UseModRM, 0, OP_PFRCP, OP_PARM_Pq, OP_PARM_Qq, OP_PARM_NONE, DISOPTYPE_HARMLESS), 1557 1576 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, 1560 1579 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, 1564 1583 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, 1566 1585 1567 1586 /* a */ 1568 1587 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, 1572 1591 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, 1574 1593 OP("pfrcpit1 %Pq,%Qq", IDX_ParseModRM, IDX_UseModRM, 0, OP_PFRCPIT1,OP_PARM_Pq, OP_PARM_Qq, OP_PARM_NONE, DISOPTYPE_HARMLESS), 1575 1594 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, 1578 1597 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, 1582 1601 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, 1584 1603 1585 1604 /* b */ 1586 1605 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, 1590 1609 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, 1592 1611 OP("pfrcpit2 %Pq,%Qq", IDX_ParseModRM, IDX_UseModRM, 0, OP_PFRCPIT2,OP_PARM_Pq, OP_PARM_Qq, OP_PARM_NONE, DISOPTYPE_HARMLESS), 1593 1612 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, 1597 1616 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, 1601 1620 OP("pavgusb %Pq,%Qq", IDX_ParseModRM, IDX_UseModRM, 0, OP_PAVGUSB, OP_PARM_Pq, OP_PARM_Qq, OP_PARM_NONE, DISOPTYPE_HARMLESS), 1602 1621 1603 1622 /* c */ 1604 INVALID_OPCODE_BLOCK 1623 INVALID_OPCODE_BLOCK_MOD_RM 1605 1624 1606 1625 /* d */ 1607 INVALID_OPCODE_BLOCK 1626 INVALID_OPCODE_BLOCK_MOD_RM 1608 1627 1609 1628 /* e */ 1610 INVALID_OPCODE_BLOCK 1629 INVALID_OPCODE_BLOCK_MOD_RM 1611 1630 1612 1631 /* f */ 1613 INVALID_OPCODE_BLOCK 1632 INVALID_OPCODE_BLOCK_MOD_RM 1614 1633 }; 1615 1634 … … 2421 2440 OP("test %Eb,%Ib", IDX_ParseModRM, IDX_ParseImmByte,0, OP_TEST, OP_PARM_Eb, OP_PARM_Ib , OP_PARM_NONE, DISOPTYPE_HARMLESS), 2422 2441 //AMD manual claims test?? 2423 INVALID_OPCODE ,2442 INVALID_OPCODE_MOD_RM, 2424 2443 OP("not %Eb", IDX_ParseModRM, 0, 0, OP_NOT, OP_PARM_Eb, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 2425 2444 OP("neg %Eb", IDX_ParseModRM, 0, 0, OP_NEG, OP_PARM_Eb, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), … … 2432 2451 OP("test %Ev,%Iz", IDX_ParseModRM, IDX_ParseImmZ, 0, OP_TEST, OP_PARM_Ev, OP_PARM_Iz , OP_PARM_NONE, DISOPTYPE_HARMLESS), 2433 2452 //AMD manual claims test?? 2434 INVALID_OPCODE ,2453 INVALID_OPCODE_MOD_RM, 2435 2454 OP("not %Ev", IDX_ParseModRM, 0, 0, OP_NOT, OP_PARM_Ev, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 2436 2455 OP("neg %Ev", IDX_ParseModRM, 0, 0, OP_NEG, OP_PARM_Ev, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), … … 2446 2465 OP("inc %Eb", IDX_ParseModRM, 0, 0, OP_INC, OP_PARM_Eb, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 2447 2466 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, 2454 2473 }; 2455 2474 … … 2464 2483 OP("jmp %Ep", IDX_ParseModRM, 0, 0, OP_JMP, OP_PARM_Ep, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_CONTROLFLOW | DISOPTYPE_UNCOND_CONTROLFLOW), 2465 2484 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, 2467 2486 }; 2468 2487 … … 2477 2496 OP("verr %Ew", IDX_ParseModRM, 0, 0, OP_VERR, OP_PARM_Ew, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP), 2478 2497 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. */ 2483 2503 const DISOPCODE g_aMapX86_Group7_mem[8] = 2484 2504 { … … 2494 2514 }; 2495 2515 2516 /* Note!! Group 7 is NOT using the INVALID_OPCODE_MOD_RM because of monitor and vmcall. */ 2496 2517 const DISOPCODE g_aMapX86_Group7_mod11_rm000[8] = 2497 2518 { … … 2507 2528 }; 2508 2529 2530 /* Note!! Group 7 is NOT using the INVALID_OPCODE_MOD_RM because of monitor and vmcall. */ 2509 2531 const DISOPCODE g_aMapX86_Group7_mod11_rm001[8] = 2510 2532 { … … 2523 2545 { 2524 2546 /* 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, 2529 2551 OP("bt %Ev,%Ib", IDX_ParseModRM, IDX_ParseImmByte, 0, OP_BT, OP_PARM_Ev, OP_PARM_Ib , OP_PARM_NONE, DISOPTYPE_HARMLESS), 2530 2552 OP("bts %Ev,%Ib", IDX_ParseModRM, IDX_ParseImmByte, 0, OP_BTS, OP_PARM_Ev, OP_PARM_Ib , OP_PARM_NONE, DISOPTYPE_HARMLESS), … … 2536 2558 { 2537 2559 /* 0F C7 */ 2538 INVALID_OPCODE ,2560 INVALID_OPCODE_MOD_RM, 2539 2561 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, 2546 2568 }; 2547 2569 … … 2549 2571 { 2550 2572 /* 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, 2559 2581 }; 2560 2582 … … 2586 2608 const DISOPCODE g_aMapX86_Group12[8*2] = 2587 2609 { 2588 INVALID_OPCODE ,2589 INVALID_OPCODE ,2610 INVALID_OPCODE_MOD_RM, 2611 INVALID_OPCODE_MOD_RM, 2590 2612 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, 2592 2614 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, 2594 2616 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, 2596 2618 2597 2619 /* Group 12 with prefix 0x66 */ 2598 INVALID_OPCODE ,2599 INVALID_OPCODE ,2620 INVALID_OPCODE_MOD_RM, 2621 INVALID_OPCODE_MOD_RM, 2600 2622 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, 2602 2624 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, 2604 2626 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, 2606 2628 }; 2607 2629 … … 2609 2631 const DISOPCODE g_aMapX86_Group13[8*2] = 2610 2632 { 2611 INVALID_OPCODE ,2612 INVALID_OPCODE ,2633 INVALID_OPCODE_MOD_RM, 2634 INVALID_OPCODE_MOD_RM, 2613 2635 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, 2615 2637 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, 2617 2639 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, 2619 2641 2620 2642 /* Group 13 with prefix 0x66 */ 2621 INVALID_OPCODE ,2622 INVALID_OPCODE ,2643 INVALID_OPCODE_MOD_RM, 2644 INVALID_OPCODE_MOD_RM, 2623 2645 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, 2625 2647 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, 2627 2649 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, 2629 2651 }; 2630 2652 … … 2632 2654 const DISOPCODE g_aMapX86_Group14[8*2] = 2633 2655 { 2634 INVALID_OPCODE ,2635 INVALID_OPCODE ,2656 INVALID_OPCODE_MOD_RM, 2657 INVALID_OPCODE_MOD_RM, 2636 2658 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, 2640 2662 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, 2642 2664 2643 2665 /* Group 14 with prefix 0x66 */ 2644 INVALID_OPCODE ,2645 INVALID_OPCODE ,2666 INVALID_OPCODE_MOD_RM, 2667 INVALID_OPCODE_MOD_RM, 2646 2668 OP("psrlq %Wdq,%Ib", IDX_ParseModRM, IDX_ParseImmByte,0, OP_PSRLD, OP_PARM_Wdq, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 2647 2669 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, 2650 2672 OP("psllq %Wdq,%Ib", IDX_ParseModRM, IDX_ParseImmByte,0, OP_PSLLD, OP_PARM_Wdq, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 2651 2673 OP("pslldq %Wdq,%Ib", IDX_ParseModRM, IDX_ParseImmByte,0, OP_PSLLDQ, OP_PARM_Wdq, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), … … 2660 2682 OP("ldmxcsr %M", IDX_ParseModRM, 0, 0, OP_LDMXCSR, OP_PARM_M, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 2661 2683 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, 2665 2687 OP("clflush %Mb", IDX_ParseModRM, 0, 0, OP_CLFLUSH, OP_PARM_Mb, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 2666 2688 }; … … 2669 2691 const DISOPCODE g_aMapX86_Group15_mod11_rm000[8] = 2670 2692 { 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, 2676 2698 OP("lfence", IDX_ParseModFence, 0, 0, OP_LFENCE, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 2677 2699 OP("mfence", IDX_ParseModFence, 0, 0, OP_MFENCE, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), … … 2686 2708 OP("prefetcht1 %Mb", IDX_ParseModRM, 0, 0, OP_PREFETCH,OP_PARM_Mb, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 2687 2709 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, 2692 2714 }; 2693 2715
Note:
See TracChangeset
for help on using the changeset viewer.

