Changeset 103709 in vbox
- Timestamp:
- Mar 6, 2024 4:29:13 PM (12 months ago)
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/disopcode-x86-amd64.h
r103699 r103709 609 609 OP_AESKEYGEN, 610 610 OP_RORX, 611 OP_RDPID, 611 612 OP_RDRAND, 612 613 OP_RDSEED, … … 805 806 OP_VMCLEAR, 806 807 OP_VMLAUNCH, 807 OP_VMOFF,808 808 OP_VMRESUME, 809 809 OP_VMPTRLD, … … 1079 1079 OP_VPSLLD, 1080 1080 OP_VPSLLQ, 1081 OP_VPSLLDQ, 1081 1082 OP_VPSLLVD, 1082 1083 OP_VPSLLW, -
trunk/src/VBox/Disassembler/DisasmCore-x86-amd64.cpp
r103698 r103709 98 98 static FNDISPARSEX86 ParseGrp10; 99 99 static FNDISPARSEX86 ParseGrp12; 100 static FNDISPARSEX86 ParseVGrp12; 100 101 static FNDISPARSEX86 ParseGrp13; 102 static FNDISPARSEX86 ParseVGrp13; 101 103 static FNDISPARSEX86 ParseGrp14; 104 static FNDISPARSEX86 ParseVGrp14; 102 105 static FNDISPARSEX86 ParseGrp15; 106 static FNDISPARSEX86 ParseVGrp15; 103 107 static FNDISPARSEX86 ParseGrp16; 104 static FNDISPARSEX86 ParseGrp17; 108 static FNDISPARSEX86 ParseVGrp17; 109 static FNDISPARSEX86 ParseVGrp17; 105 110 static FNDISPARSEX86 ParseModFence; 106 111 static FNDISPARSEX86 ParseNopPause; … … 150 155 ParseGrp10, 151 156 ParseGrp12, 157 ParseVGrp12, 152 158 ParseGrp13, 159 ParseVGrp13, 153 160 ParseGrp14, 161 ParseVGrp14, 154 162 ParseGrp15, 163 ParseVGrp15, 155 164 ParseGrp16, 156 Parse Grp17,165 ParseVGrp17, 157 166 ParseModFence, 158 167 ParseYv, … … 201 210 ParseGrp10, 202 211 ParseGrp12, 212 ParseVGrp12, 203 213 ParseGrp13, 214 ParseVGrp13, 204 215 ParseGrp14, 216 ParseVGrp14, 205 217 ParseGrp15, 218 ParseVGrp15, 206 219 ParseGrp16, 207 Parse Grp17,220 ParseVGrp17, 208 221 ParseModFence, 209 222 ParseYv, … … 1692 1705 1693 1706 if (pDis->uCpuMode == DISCPUMODE_64BIT) 1694 {1695 1707 pDis->x86.uOpMode = (pDis->x86.fRexPrefix & DISPREFIX_REX_FLAGS_W ? DISCPUMODE_64BIT : DISCPUMODE_32BIT); 1696 }1697 1708 else 1698 1709 pDis->x86.uOpMode = pDis->uCpuMode; … … 1763 1774 pDis->x86.fPrefix &= ~DISPREFIX_OPSIZE; 1764 1775 if (pDis->uCpuMode == DISCPUMODE_64BIT) 1765 {1766 1776 pDis->x86.uOpMode = (pDis->x86.fRexPrefix & DISPREFIX_REX_FLAGS_W ? DISCPUMODE_64BIT : DISCPUMODE_32BIT); 1767 }1768 1777 else 1769 1778 pDis->x86.uOpMode = pDis->uCpuMode; … … 1788 1797 pDis->x86.fPrefix &= ~DISPREFIX_OPSIZE; 1789 1798 if (pDis->uCpuMode == DISCPUMODE_64BIT) 1790 {1791 1799 pDis->x86.uOpMode = (pDis->x86.fRexPrefix & DISPREFIX_REX_FLAGS_W ? DISCPUMODE_64BIT : DISCPUMODE_32BIT); 1792 }1793 1800 else 1794 1801 pDis->x86.uOpMode = pDis->uCpuMode; … … 1861 1868 pDis->x86.fPrefix &= ~DISPREFIX_OPSIZE; 1862 1869 if (pDis->uCpuMode == DISCPUMODE_64BIT) 1863 {1864 1870 pDis->x86.uOpMode = (pDis->x86.fRexPrefix & DISPREFIX_REX_FLAGS_W ? DISCPUMODE_64BIT : DISCPUMODE_32BIT); 1865 }1866 1871 else 1867 1872 pDis->x86.uOpMode = pDis->uCpuMode; 1868 1869 1873 } 1870 1874 } … … 2070 2074 RT_NOREF_PV(pParam); 2071 2075 2076 uint8_t const bRm = disReadByte(pDis, offInstr); 2077 uint8_t const idx = MODRM_REG(bRm); 2078 if (MODRM_MOD(bRm) != X86_MOD_REG) 2079 { 2080 if (pDis->x86.bLastPrefix == OP_OPSIZE /*0xf3*/) 2081 pOp = &g_aMapX86_Group9_mem_66[idx]; 2082 else if (pDis->x86.bLastPrefix == OP_REPE /*0xf3*/) 2083 { 2084 pDis->x86.fPrefix &= ~DISPREFIX_REP; 2085 pOp = &g_aMapX86_Group9_mem_f3[idx]; 2086 } 2087 /** @todo bLastPrefix is also set for OP_SEG & OP_ADDRSIZE which aren't relevant here or to any other of the table */ 2088 else if (pDis->x86.bLastPrefix != OP_LOCK && pDis->x86.bLastPrefix != OP_REPNE) 2089 pOp = &g_aMapX86_Group9_mem_none[idx]; 2090 else 2091 pOp = &g_InvalidOpcode[0]; 2092 } 2093 else 2094 { 2095 if (pDis->x86.bLastPrefix == OP_REPE /*0xf3*/) 2096 { 2097 pDis->x86.fPrefix &= ~DISPREFIX_REP; 2098 pOp = &g_aMapX86_Group9_mod11_f3[idx]; 2099 } 2100 /** @todo bLastPrefix is also set for OP_SEG & OP_ADDRSIZE which aren't relevant here or to any other of the table */ 2101 else if (pDis->x86.bLastPrefix != OP_LOCK && pDis->x86.bLastPrefix != OP_REPNE) 2102 pOp = &g_aMapX86_Group9_mod11_none[idx]; 2103 else 2104 pOp = &g_InvalidOpcode[0]; 2105 } 2106 2107 return disParseInstruction(offInstr, pOp, pDis); 2108 } 2109 //***************************************************************************** 2110 //***************************************************************************** 2111 static size_t ParseGrp10(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 2112 { 2113 RT_NOREF_PV(pParam); 2114 2072 2115 uint8_t modrm = disReadByte(pDis, offInstr); 2073 2116 uint8_t reg = MODRM_REG(modrm); 2074 2117 2075 pOp = &g_aMapX86_Group 9[reg];2118 pOp = &g_aMapX86_Group10[reg]; 2076 2119 2077 2120 return disParseInstruction(offInstr, pOp, pDis); 2078 2121 } 2079 //***************************************************************************** 2080 //***************************************************************************** 2081 static size_t ParseGrp10(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 2122 2123 2124 /** 2125 * Parses non-vex group 12. 2126 */ 2127 static size_t ParseGrp12(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 2082 2128 { 2083 2129 RT_NOREF_PV(pParam); 2084 2130 2085 uint8_t modrm = disReadByte(pDis, offInstr); 2086 uint8_t reg = MODRM_REG(modrm); 2087 2088 pOp = &g_aMapX86_Group10[reg]; 2131 uint8_t const bRm = disReadByte(pDis, offInstr); 2132 uint8_t idx = MODRM_REG(bRm); 2133 if (pDis->x86.fPrefix & DISPREFIX_OPSIZE) 2134 idx += 8; /* 2nd table */ 2135 pOp = &g_aMapX86_Group12[idx]; 2089 2136 2090 2137 return disParseInstruction(offInstr, pOp, pDis); 2091 2138 } 2092 //***************************************************************************** 2093 //***************************************************************************** 2094 static size_t ParseGrp12(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 2139 2140 2141 /** 2142 * Parses vex group 12. 2143 */ 2144 static size_t ParseVGrp12(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 2095 2145 { 2096 2146 RT_NOREF_PV(pParam); 2097 2147 2098 uint8_t modrm = disReadByte(pDis, offInstr); 2099 uint8_t reg = MODRM_REG(modrm); 2100 2148 uint8_t const bRm = disReadByte(pDis, offInstr); 2149 if ((pDis->x86.bVexByte2 & DISPREFIX_VEX_F_PP_MASK) == DISPREFIX_VEX_F_PP_66) 2150 pOp = &g_aMapX86_VGroup12[MODRM_REG(bRm)]; 2151 else 2152 pOp = &g_InvalidOpcode[0]; 2153 2154 return disParseInstruction(offInstr, pOp, pDis); 2155 } 2156 2157 2158 /** 2159 * Parses non-vex group 13. 2160 */ 2161 static size_t ParseGrp13(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 2162 { 2163 RT_NOREF_PV(pParam); 2164 2165 uint8_t const bRm = disReadByte(pDis, offInstr); 2166 uint8_t idx = MODRM_REG(bRm); 2101 2167 if (pDis->x86.fPrefix & DISPREFIX_OPSIZE) 2102 reg += 8; /* 2nd table */ 2103 2104 pOp = &g_aMapX86_Group12[reg]; 2168 idx += 8; /* 2nd table */ 2169 pOp = &g_aMapX86_Group13[idx]; 2105 2170 2106 2171 return disParseInstruction(offInstr, pOp, pDis); 2107 2172 } 2108 //***************************************************************************** 2109 //***************************************************************************** 2110 static size_t ParseGrp13(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 2173 2174 2175 /** 2176 * Parses vex group 13. 2177 */ 2178 static size_t ParseVGrp13(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 2111 2179 { 2112 2180 RT_NOREF_PV(pParam); 2113 2181 2114 uint8_t modrm = disReadByte(pDis, offInstr); 2115 uint8_t reg = MODRM_REG(modrm); 2116 if (!(pDis->x86.fPrefix & DISPREFIX_VEX)) 2117 { 2118 if (pDis->x86.fPrefix & DISPREFIX_OPSIZE) 2119 reg += 8; /* 2nd table */ 2120 pOp = &g_aMapX86_Group13[reg]; 2121 } 2122 else 2123 pOp = &g_aMapX86_VGroup13[(pDis->x86.bVexByte2 & DISPREFIX_VEX_F_PP_MASK) == DISPREFIX_VEX_F_PP_66 ? reg + 8 : reg]; 2182 uint8_t const bRm = disReadByte(pDis, offInstr); 2183 if ((pDis->x86.bVexByte2 & DISPREFIX_VEX_F_PP_MASK) == DISPREFIX_VEX_F_PP_66) 2184 pOp = &g_aMapX86_VGroup13[MODRM_REG(bRm)]; 2185 else 2186 pOp = &g_InvalidOpcode[0]; 2124 2187 2125 2188 return disParseInstruction(offInstr, pOp, pDis); 2126 2189 } 2127 //***************************************************************************** 2128 //***************************************************************************** 2190 2191 2192 /** 2193 * Parses non-vex group 14. 2194 */ 2129 2195 static size_t ParseGrp14(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 2130 2196 { 2131 2197 RT_NOREF_PV(pParam); 2132 2198 2133 uint8_t modrm = disReadByte(pDis, offInstr);2134 uint8_t reg = MODRM_REG(modrm);2199 uint8_t const bRm = disReadByte(pDis, offInstr); 2200 uint8_t idx = MODRM_REG(bRm); 2135 2201 if (pDis->x86.fPrefix & DISPREFIX_OPSIZE) 2136 reg += 8; /* 2nd table */ 2137 2138 pOp = &g_aMapX86_Group14[reg]; 2202 idx += 8; /* 2nd table */ 2203 pOp = &g_aMapX86_Group14[idx]; 2139 2204 2140 2205 return disParseInstruction(offInstr, pOp, pDis); 2141 2206 } 2142 //***************************************************************************** 2143 //***************************************************************************** 2207 2208 2209 /** 2210 * Parses vex group 14. 2211 */ 2212 static size_t ParseVGrp14(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 2213 { 2214 RT_NOREF_PV(pParam); 2215 2216 uint8_t const bRm = disReadByte(pDis, offInstr); 2217 if ((pDis->x86.bVexByte2 & DISPREFIX_VEX_F_PP_MASK) == DISPREFIX_VEX_F_PP_66) 2218 pOp = &g_aMapX86_VGroup14[MODRM_REG(bRm)]; 2219 else 2220 pOp = &g_InvalidOpcode[0]; 2221 2222 return disParseInstruction(offInstr, pOp, pDis); 2223 } 2224 2225 2226 /** 2227 * Parses non-vex group 15. 2228 */ 2144 2229 static size_t ParseGrp15(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 2145 2230 { 2146 2231 RT_NOREF_PV(pParam); 2147 2232 2148 uint8_t modrm = disReadByte(pDis, offInstr); 2149 uint8_t mod = MODRM_MOD(modrm); 2150 uint8_t reg = MODRM_REG(modrm); 2151 uint8_t rm = MODRM_RM(modrm); 2152 2153 if (mod == 3 && rm == 0) 2154 pOp = &g_aMapX86_Group15_mod11_rm000[reg]; 2155 else 2156 pOp = &g_aMapX86_Group15_mem[reg]; 2233 uint8_t const bRm = disReadByte(pDis, offInstr); 2234 uint8_t idx = MODRM_REG(bRm); 2235 if (MODRM_MOD(bRm) != X86_MOD_REG) 2236 pOp = &g_aMapX86_Group15_mem[idx]; 2237 else if (pDis->x86.bLastPrefix == OP_REPE /*0xf3*/) 2238 { 2239 pDis->x86.fPrefix &= ~DISPREFIX_REP; 2240 pOp = &g_aMapX86_Group15_mod11[idx + 8]; 2241 } 2242 /** @todo bLastPrefix is also set for OP_SEG & OP_ADDRSIZE which aren't relevant here or to any other of the table */ 2243 else if (pDis->x86.bLastPrefix != OP_LOCK && pDis->x86.bLastPrefix != OP_REPNE && pDis->x86.bLastPrefix != OP_OPSIZE) 2244 pOp = &g_aMapX86_Group15_mod11[idx]; 2245 else 2246 pOp = &g_InvalidOpcode[0]; 2157 2247 2158 2248 return disParseInstruction(offInstr, pOp, pDis); 2159 2249 } 2160 //***************************************************************************** 2161 //***************************************************************************** 2250 2251 2252 /** 2253 * Parses vex group 15. 2254 */ 2255 static size_t ParseVGrp15(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 2256 { 2257 RT_NOREF_PV(pParam); 2258 2259 uint8_t const bRm = disReadByte(pDis, offInstr); 2260 if ((pDis->x86.bVexByte2 & DISPREFIX_VEX_F_PP_MASK) == DISPREFIX_VEX_F_PP_NONE) 2261 pOp = &g_aMapX86_VGroup15[MODRM_REG(bRm)]; 2262 else 2263 pOp = &g_InvalidOpcode[0]; 2264 2265 return disParseInstruction(offInstr, pOp, pDis); 2266 } 2267 2268 2269 /** 2270 * Parses group 16. 2271 */ 2162 2272 static size_t ParseGrp16(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 2163 2273 { 2164 2274 RT_NOREF_PV(pParam); 2165 2275 2166 uint8_t modrm = disReadByte(pDis, offInstr);2167 pOp = &g_aMapX86_Group16[MODRM_REG( modrm)];2276 uint8_t const bRm = disReadByte(pDis, offInstr); 2277 pOp = &g_aMapX86_Group16[MODRM_REG(bRm)]; 2168 2278 2169 2279 return disParseInstruction(offInstr, pOp, pDis); … … 2174 2284 * Parses (vex) group 17. 2175 2285 */ 2176 static size_t Parse Grp17(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)2286 static size_t ParseVGrp17(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam) 2177 2287 { 2178 2288 RT_NOREF_PV(pParam); 2179 2289 2180 2290 uint8_t const bRm = disReadByte(pDis, offInstr); 2181 pOp = &g_aMapX86_ Group17[(MODRM_REG(bRm) << 1) | (pDis->x86.bVexDestReg & 1)];2291 pOp = &g_aMapX86_VGroup17[(MODRM_REG(bRm) << 1) | (pDis->x86.bVexDestReg & 1)]; 2182 2292 2183 2293 return disParseInstruction(offInstr, pOp, pDis); -
trunk/src/VBox/Disassembler/DisasmInternal-x86-amd64.h
r103698 r103709 75 75 IDX_ParseGrp10, 76 76 IDX_ParseGrp12, 77 IDX_ParseVGrp12, 77 78 IDX_ParseGrp13, 79 IDX_ParseVGrp13, 78 80 IDX_ParseGrp14, 81 IDX_ParseVGrp14, 79 82 IDX_ParseGrp15, 83 IDX_ParseVGrp15, 80 84 IDX_ParseGrp16, 81 IDX_Parse Grp17,85 IDX_ParseVGrp17, 82 86 IDX_ParseModFence, 83 87 IDX_ParseYv, … … 197 201 extern const DISOPCODE g_aMapX86_Group7_mod11_reg111[8]; 198 202 extern const DISOPCODE g_aMapX86_Group8[8]; 199 extern const DISOPCODE g_aMapX86_Group9[8]; 203 extern const DISOPCODE g_aMapX86_Group9_mem_none[8]; 204 extern const DISOPCODE g_aMapX86_Group9_mem_66[8]; 205 extern const DISOPCODE g_aMapX86_Group9_mem_f3[8]; 206 extern const DISOPCODE g_aMapX86_Group9_mod11_none[8]; 207 extern const DISOPCODE g_aMapX86_Group9_mod11_f3[8]; 200 208 extern const DISOPCODE g_aMapX86_Group10[8]; 201 209 extern const DISOPCODE g_aMapX86_Group11[8*2]; 202 210 extern const DISOPCODE g_aMapX86_Group12[8*2]; 211 extern const DISOPCODE g_aMapX86_VGroup12[8]; 203 212 extern const DISOPCODE g_aMapX86_Group13[8*2]; 204 extern const DISOPCODE g_aMapX86_VGroup13[8 *2];213 extern const DISOPCODE g_aMapX86_VGroup13[8]; 205 214 extern const DISOPCODE g_aMapX86_Group14[8*2]; 215 extern const DISOPCODE g_aMapX86_VGroup14[8]; 206 216 extern const DISOPCODE g_aMapX86_Group15_mem[8]; 207 extern const DISOPCODE g_aMapX86_Group15_mod11_rm000[8]; 217 extern const DISOPCODE g_aMapX86_Group15_mod11[8*2]; 218 extern const DISOPCODE g_aMapX86_VGroup15[8]; 208 219 extern const DISOPCODE g_aMapX86_Group16[8]; 209 extern const DISOPCODE g_aMapX86_ Group17[8*2];220 extern const DISOPCODE g_aMapX86_VGroup17[8*2]; 210 221 extern const DISOPCODE g_aMapX86_NopPause[2]; 211 222 /** @} */ -
trunk/src/VBox/Disassembler/DisasmTables-x86-amd64.cpp
r103698 r103709 1229 1229 INVALID_OPCODE, 1230 1230 INVALID_OPCODE, 1231 INVALID_OPCODE,1231 OP("Grp9", IDX_ParseGrp9, 0, 0, OP_GRP9, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 1232 1232 INVALID_OPCODE, 1233 1233 INVALID_OPCODE, … … 3063 3063 OP("vmlaunch", 0, 0, 0, OP_VMLAUNCH, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS ), 3064 3064 OP("vmresume", 0, 0, 0, OP_VMRESUME, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS ), 3065 OP("vm off", 0, 0, 0, OP_VMOFF,OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS ),3065 OP("vmxoff", 0, 0, 0, OP_VMXOFF, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS ), 3066 3066 INVALID_OPCODE, 3067 3067 INVALID_OPCODE, … … 3118 3118 }; 3119 3119 3120 const DISOPCODE g_aMapX86_Group9[8] = 3121 { 3122 /* 0F C7 */ 3123 INVALID_OPCODE_MOD_RM(0x ),3120 /* 0F C7 mode=mem index by /reg - w/o SSE prefix */ 3121 const DISOPCODE g_aMapX86_Group9_mem_none[8] = 3122 { 3123 INVALID_OPCODE_MOD_RM(0x0), 3124 3124 OP("cmpxchg8b %Mq", IDX_ParseModRM, 0, 0, OP_CMPXCHG8B, OP_PARM_Mq, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3125 INVALID_OPCODE_MOD_RM(0x), 3126 INVALID_OPCODE_MOD_RM(0x), 3127 INVALID_OPCODE_MOD_RM(0x), 3128 INVALID_OPCODE_MOD_RM(0x), 3125 INVALID_OPCODE_MOD_RM(0x2), 3126 INVALID_OPCODE_MOD_RM(0x3), 3127 INVALID_OPCODE_MOD_RM(0x4), 3128 INVALID_OPCODE_MOD_RM(0x5), 3129 OP("vmptrld %M", IDX_ParseModRM, 0, 0, OP_VMPTRLD, OP_PARM_Mq, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3130 OP("vmptrst %M", IDX_ParseModRM, 0, 0, OP_VMPTRST, OP_PARM_Mq, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3131 }; 3132 3133 /* 0F C7 mode=mem index by /reg - w/ 0x66 SSE prefix */ 3134 const DISOPCODE g_aMapX86_Group9_mem_66[8] = 3135 { 3136 INVALID_OPCODE_MOD_RM(0x0), 3137 INVALID_OPCODE_MOD_RM(0x1), 3138 INVALID_OPCODE_MOD_RM(0x2), 3139 INVALID_OPCODE_MOD_RM(0x3), 3140 INVALID_OPCODE_MOD_RM(0x4), 3141 INVALID_OPCODE_MOD_RM(0x5), 3142 OP("vmclear %M", IDX_ParseModRM, 0, 0, OP_VMCLEAR, OP_PARM_Mq, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3143 INVALID_OPCODE_MOD_RM(0x7), 3144 }; 3145 3146 /* 0F C7 mode=mem index by /reg - w/ 0xf3 SSE prefix */ 3147 const DISOPCODE g_aMapX86_Group9_mem_f3[8] = 3148 { 3149 INVALID_OPCODE_MOD_RM(0x0), 3150 INVALID_OPCODE_MOD_RM(0x1), 3151 INVALID_OPCODE_MOD_RM(0x2), 3152 INVALID_OPCODE_MOD_RM(0x3), 3153 INVALID_OPCODE_MOD_RM(0x4), 3154 INVALID_OPCODE_MOD_RM(0x5), 3155 OP("vmxon %M", IDX_ParseModRM, 0, 0, OP_VMXON, OP_PARM_Mq, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3156 INVALID_OPCODE_MOD_RM(0x7), 3157 }; 3158 3159 /* 0F C7 mode=reg index by /reg - w/o SSE prefix */ 3160 const DISOPCODE g_aMapX86_Group9_mod11_none[8] = 3161 { 3162 INVALID_OPCODE_MOD_RM(0x0), 3163 INVALID_OPCODE_MOD_RM(0x1), 3164 INVALID_OPCODE_MOD_RM(0x2), 3165 INVALID_OPCODE_MOD_RM(0x3), 3166 INVALID_OPCODE_MOD_RM(0x4), 3167 INVALID_OPCODE_MOD_RM(0x5), 3129 3168 OP("rdrand %Ev", IDX_ParseModRM, 0, 0, OP_RDRAND, OP_PARM_Ev, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3130 3169 OP("rdseed %Ev", IDX_ParseModRM, 0, 0, OP_RDSEED, OP_PARM_Ev, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3131 3170 }; 3132 3171 3172 /* 0F C7 mode=reg index by /reg - w/ 0xf3 SSE prefix */ 3173 const DISOPCODE g_aMapX86_Group9_mod11_f3[8] = 3174 { 3175 INVALID_OPCODE_MOD_RM(0x0), 3176 INVALID_OPCODE_MOD_RM(0x1), 3177 INVALID_OPCODE_MOD_RM(0x2), 3178 INVALID_OPCODE_MOD_RM(0x3), 3179 INVALID_OPCODE_MOD_RM(0x4), 3180 INVALID_OPCODE_MOD_RM(0x5), 3181 INVALID_OPCODE_MOD_RM(0x6), 3182 OP("rdpid %Ev", IDX_ParseModRM, 0, 0, OP_RDPID, OP_PARM_Ev, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3183 }; 3184 3185 /* 0F B9 - UD1 */ 3133 3186 const DISOPCODE g_aMapX86_Group10[8] = 3134 3187 { 3135 /* 0F B9 */3136 3188 INVALID_OPCODE_MOD_RM(0x), 3137 3189 INVALID_OPCODE_MOD_RM(0x), … … 3171 3223 const DISOPCODE g_aMapX86_Group12[8*2] = 3172 3224 { 3173 INVALID_OPCODE_MOD_RM(0x ),3174 INVALID_OPCODE_MOD_RM(0x ),3225 INVALID_OPCODE_MOD_RM(0x0), 3226 INVALID_OPCODE_MOD_RM(0x1), 3175 3227 OP("psrlw %Pq,%Ib", IDX_ParseModRM, IDX_ParseImmByte, 0, OP_PSRLW, OP_PARM_Pq, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3176 INVALID_OPCODE_MOD_RM(0x ),3228 INVALID_OPCODE_MOD_RM(0x3), 3177 3229 OP("psraw %Pq,%Ib", IDX_ParseModRM, IDX_ParseImmByte, 0, OP_PSRAW, OP_PARM_Pq, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3178 INVALID_OPCODE_MOD_RM(0x ),3230 INVALID_OPCODE_MOD_RM(0x5), 3179 3231 OP("psllw %Pq,%Ib", IDX_ParseModRM, IDX_ParseImmByte, 0, OP_PSLLW, OP_PARM_Pq, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3180 INVALID_OPCODE_MOD_RM(0x ),3232 INVALID_OPCODE_MOD_RM(0x7), 3181 3233 3182 3234 /* Group 12 with prefix 0x66 */ 3183 INVALID_OPCODE_MOD_RM(0x ),3184 INVALID_OPCODE_MOD_RM(0x ),3235 INVALID_OPCODE_MOD_RM(0x8), 3236 INVALID_OPCODE_MOD_RM(0x9), 3185 3237 OP("psrlw %Pdq,%Ib", IDX_ParseModRM, IDX_ParseImmByte, 0, OP_PSRLW, OP_PARM_Pdq, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3186 INVALID_OPCODE_MOD_RM(0x ),3238 INVALID_OPCODE_MOD_RM(0xb), 3187 3239 OP("psraw %Pdq,%Ib", IDX_ParseModRM, IDX_ParseImmByte, 0, OP_PSRAW, OP_PARM_Pdq, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3188 INVALID_OPCODE_MOD_RM(0x ),3240 INVALID_OPCODE_MOD_RM(0xd), 3189 3241 OP("psllw %Pdq,%Ib", IDX_ParseModRM, IDX_ParseImmByte, 0, OP_PSLLW, OP_PARM_Pdq, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3190 INVALID_OPCODE_MOD_RM(0x), 3242 INVALID_OPCODE_MOD_RM(0xf), 3243 }; 3244 3245 /* vex map1 0x72 w/ prefix 0x66 (VEX.pp=1) */ 3246 const DISOPCODE g_aMapX86_VGroup12[8] = 3247 { 3248 /* 0 format string, parse param #1, parse param #2, parse param #3, parse param #4, opcode, param #1, param #2, param #3, param #4, flags */ 3249 INVALID_OPCODE_MOD_RM(0x0), 3250 INVALID_OPCODE_MOD_RM(0x1), 3251 OPVEX("vpsrlw %Hx,%Ux,%Ib", IDX_ParseVexDest, IDX_ParseModRM, IDX_ParseImmByte, 0, OP_VPSRLW, OP_PARM_Hx, OP_PARM_Ux, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3252 INVALID_OPCODE_MOD_RM(0x4), 3253 OPVEX("vpsraw %Hx,%Ux,%Ib", IDX_ParseVexDest, IDX_ParseModRM, IDX_ParseImmByte, 0, OP_VPSRAW, OP_PARM_Hx, OP_PARM_Ux, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3254 INVALID_OPCODE_MOD_RM(0x5), 3255 OPVEX("vpsllw %Hx,%Ux,%Ib", IDX_ParseVexDest, IDX_ParseModRM, IDX_ParseImmByte, 0, OP_VPSLLW, OP_PARM_Hx, OP_PARM_Ux, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3256 INVALID_OPCODE_MOD_RM(0x7), 3257 /* format string, parse param #1, parse param #2, parse param #3, parse param #4, opcode, param #1, param #2, param #3, param #4, flags */ 3191 3258 }; 3192 3259 … … 3214 3281 }; 3215 3282 3216 /* vex map1 0x72 */3217 const DISOPCODE g_aMapX86_VGroup13[8 *2] =3283 /* vex map1 0x72 w/ prefix 0x66 (VEX.pp=1) */ 3284 const DISOPCODE g_aMapX86_VGroup13[8] = 3218 3285 { 3219 3286 /* 0 format string, parse param #1, parse param #2, parse param #3, parse param #4, opcode, param #1, param #2, param #3, param #4, flags */ 3220 /* No prefix */ 3221 INVALID_OPCODE_MOD_RM(0x00), 3222 INVALID_OPCODE_MOD_RM(0x01), 3223 INVALID_OPCODE_MOD_RM(0x02), 3224 INVALID_OPCODE_MOD_RM(0x03), 3225 INVALID_OPCODE_MOD_RM(0x04), 3226 INVALID_OPCODE_MOD_RM(0x05), 3227 INVALID_OPCODE_MOD_RM(0x06), 3228 INVALID_OPCODE_MOD_RM(0x07), 3229 3230 /* Group 13 with prefix 0x66 */ 3231 INVALID_OPCODE_MOD_RM(0x08), 3232 INVALID_OPCODE_MOD_RM(0x09), 3287 INVALID_OPCODE_MOD_RM(0x0), 3288 INVALID_OPCODE_MOD_RM(0x1), 3233 3289 OPVEX("vpsrld %Hx,%Ux,%Ib", IDX_ParseVexDest, IDX_ParseModRM, IDX_ParseImmByte, 0, OP_VPSRLD, OP_PARM_Hx, OP_PARM_Ux, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3234 INVALID_OPCODE_MOD_RM(0x 0b),3290 INVALID_OPCODE_MOD_RM(0x3), 3235 3291 OPVEX("vpsrad %Hx,%Ux,%Ib", IDX_ParseVexDest, IDX_ParseModRM, IDX_ParseImmByte, 0, OP_VPSRAD, OP_PARM_Hx, OP_PARM_Ux, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3236 INVALID_OPCODE_MOD_RM(0x 0d),3292 INVALID_OPCODE_MOD_RM(0x5), 3237 3293 OPVEX("vpslld %Hx,%Ux,%Ib", IDX_ParseVexDest, IDX_ParseModRM, IDX_ParseImmByte, 0, OP_VPSLLD, OP_PARM_Hx, OP_PARM_Ux, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3238 INVALID_OPCODE_MOD_RM(0x 0f),3294 INVALID_OPCODE_MOD_RM(0x7), 3239 3295 /* format string, parse param #1, parse param #2, parse param #3, parse param #4, opcode, param #1, param #2, param #3, param #4, flags */ 3240 3296 }; … … 3263 3319 }; 3264 3320 3265 3266 /* 0xF 0xAE */ 3321 /* vex map1 0x73 w/ prefix 0x66 (VEX.pp=1) */ 3322 const DISOPCODE g_aMapX86_VGroup14[8] = 3323 { 3324 /* 0 format string, parse param #1, parse param #2, parse param #3, parse param #4, opcode, param #1, param #2, param #3, param #4, flags */ 3325 INVALID_OPCODE_MOD_RM(0x0), 3326 INVALID_OPCODE_MOD_RM(0x1), 3327 OPVEX("vpsrlq %Hx,%Ux,%Ib", IDX_ParseVexDest, IDX_ParseModRM, IDX_ParseImmByte, 0, OP_VPSRLQ, OP_PARM_Hx, OP_PARM_Ux, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3328 OPVEX("vpsrldq %Hx,%Ux,%Ib", IDX_ParseVexDest, IDX_ParseModRM, IDX_ParseImmByte, 0, OP_VPSRLDQ, OP_PARM_Hx, OP_PARM_Ux, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3329 INVALID_OPCODE_MOD_RM(0x4), 3330 INVALID_OPCODE_MOD_RM(0x5), 3331 OPVEX("vpsllq %Hx,%Ux,%Ib", IDX_ParseVexDest, IDX_ParseModRM, IDX_ParseImmByte, 0, OP_VPSLLQ, OP_PARM_Hx, OP_PARM_Ux, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3332 OPVEX("vpslldq %Hx,%Ux,%Ib", IDX_ParseVexDest, IDX_ParseModRM, IDX_ParseImmByte, 0, OP_VPSLLDQ, OP_PARM_Hx, OP_PARM_Ux, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3333 /* format string, parse param #1, parse param #2, parse param #3, parse param #4, opcode, param #1, param #2, param #3, param #4, flags */ 3334 }; 3335 3336 3337 /* 0xF 0xAE in memory mode */ 3267 3338 const DISOPCODE g_aMapX86_Group15_mem[8] = 3268 3339 { … … 3277 3348 }; 3278 3349 3279 /* 0xF 0xAE */ 3280 const DISOPCODE g_aMapX86_Group15_mod11_rm000[8] = 3281 { 3282 INVALID_OPCODE_MOD_RM(0x), 3283 INVALID_OPCODE_MOD_RM(0x), 3284 INVALID_OPCODE_MOD_RM(0x), 3285 INVALID_OPCODE_MOD_RM(0x), 3286 INVALID_OPCODE_MOD_RM(0x), 3287 /** @todo mfence + lfence + sfence instructions do not require rm=0, 3288 * they work for any RM value. See bs2-cpu-instr-1.asm for details. */ 3350 /* 0xF 0xAE in register mode. f3 used in indexing. */ 3351 const DISOPCODE g_aMapX86_Group15_mod11[8*2] = 3352 { 3353 /* No prefix: */ 3354 INVALID_OPCODE_MOD_RM(0x0), 3355 INVALID_OPCODE_MOD_RM(0x1), 3356 INVALID_OPCODE_MOD_RM(0x2), 3357 INVALID_OPCODE_MOD_RM(0x3), 3358 INVALID_OPCODE_MOD_RM(0x4), 3289 3359 OP("lfence", IDX_ParseModFence, 0, 0, OP_LFENCE, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3290 3360 OP("mfence", IDX_ParseModFence, 0, 0, OP_MFENCE, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3291 3361 OP("sfence", IDX_ParseModFence, 0, 0, OP_SFENCE, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3292 }; 3362 /* 0xf3 prefix: */ 3363 OP("rdfsbase %Ev", IDX_ParseModRM, 0, 0, OP_RDFSBASE, OP_PARM_Ev, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3364 OP("rdgsbase %Ev", IDX_ParseModRM, 0, 0, OP_RDGSBASE, OP_PARM_Ev, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3365 OP("wrfsbase %Ev", IDX_ParseModRM, 0, 0, OP_WRFSBASE, OP_PARM_Ev, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3366 OP("wrgsbase %Ev", IDX_ParseModRM, 0, 0, OP_WRGSBASE, OP_PARM_Ev, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3367 INVALID_OPCODE_MOD_RM(0xc), 3368 INVALID_OPCODE_MOD_RM(0xd), 3369 INVALID_OPCODE_MOD_RM(0xe), 3370 INVALID_OPCODE_MOD_RM(0xf), 3371 }; 3372 3373 /* vex map1 0xae w/o prefix (VEX.pp=0) */ 3374 const DISOPCODE g_aMapX86_VGroup15[8] = 3375 { 3376 /* 0 format string, parse param #1, parse param #2, parse param #3, parse param #4, opcode, param #1, param #2, param #3, param #4, flags */ 3377 INVALID_OPCODE_MOD_RM(0x0), 3378 INVALID_OPCODE_MOD_RM(0x1), 3379 OPVEX("vldmxcsr %M", IDX_ParseModRM, 0, 0, 0, OP_VLDMXCSR, OP_PARM_M, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3380 OPVEX("vstmxcsr %M", IDX_ParseModRM, 0, 0, 0, OP_VSTMXCSR, OP_PARM_M, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3381 INVALID_OPCODE_MOD_RM(0x4), 3382 INVALID_OPCODE_MOD_RM(0x5), 3383 INVALID_OPCODE_MOD_RM(0x6), 3384 INVALID_OPCODE_MOD_RM(0x7), 3385 /* format string, parse param #1, parse param #2, parse param #3, parse param #4, opcode, param #1, param #2, param #3, param #4, flags */ 3386 }; 3387 3388 3293 3389 3294 3390 /* 0xF 0x18 */ … … 3510 3606 /* 7 */ 3511 3607 OPVEX("vpshufd %Vx,%Wx,%Ib", IDX_ParseModRM, IDX_UseModRM, IDX_ParseImmByte, 0, OP_VPSHUFD, OP_PARM_Vx, OP_PARM_Wx, OP_PARM_Ib, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3512 INVALID_OPCODE,3513 OP("vgroup13", IDX_Parse Grp13,0, 0, OP_GRP13, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),3514 OP VEX("vpsrldq %Hx,%Ux,%Ib", IDX_ParseVexDest, IDX_ParseModRM, IDX_ParseImmByte, 0, OP_VPSRLDQ, OP_PARM_Hx, OP_PARM_Ux, OP_PARM_Ib,OP_PARM_NONE, DISOPTYPE_HARMLESS),3608 OP("vgroup12", IDX_ParseVGrp12, 0, 0, OP_GRP12, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3609 OP("vgroup13", IDX_ParseVGrp13, 0, 0, OP_GRP13, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3610 OP("vgroup14", IDX_ParseVGrp14, 0, 0, OP_GRP14, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3515 3611 OPVEX("vpcmpeqb %Vx,%Hx,%Wx", IDX_ParseModRM, IDX_ParseVexDest, IDX_UseModRM, 0, OP_VPCMPEQB, OP_PARM_Vx, OP_PARM_Hx, OP_PARM_Wx, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3516 3612 OPVEX("vpcmpeqw %Vx,%Hx,%Wx", IDX_ParseModRM, IDX_ParseVexDest, IDX_UseModRM, 0, OP_VPCMPEQW, OP_PARM_Vx, OP_PARM_Hx, OP_PARM_Wx, OP_PARM_NONE, DISOPTYPE_HARMLESS), … … 3533 3629 3534 3630 /* a */ 3535 INVALID_OPCODE_BLOCK 3631 INVALID_OPCODE, 3632 INVALID_OPCODE, 3633 INVALID_OPCODE, 3634 INVALID_OPCODE, 3635 INVALID_OPCODE, 3636 INVALID_OPCODE, 3637 INVALID_OPCODE, 3638 INVALID_OPCODE, 3639 INVALID_OPCODE, 3640 INVALID_OPCODE, 3641 INVALID_OPCODE, 3642 INVALID_OPCODE, 3643 INVALID_OPCODE, 3644 OP("vgroup15", IDX_ParseVGrp15, 0, 0, OP_GRP15, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3645 INVALID_OPCODE, 3536 3646 3537 3647 /* b */ … … 3898 4008 3899 4009 /** Indexed by: (/r << 1) | VEX.L */ 3900 const DISOPCODE g_aMapX86_ Group17[8*2] =4010 const DISOPCODE g_aMapX86_VGroup17[8*2] = 3901 4011 { 3902 4012 /* 0 format string, parse param #1, parse param #2, parse param #3, parse param #4, opcode, param #1, param #2, param #3, param #4, flags */ … … 3924 4034 /* 0xf2 format string, parse param #1, parse param #2, parse param #3, parse param #4, opcode, param #1, param #2, param #3, param #4, flags */ 3925 4035 OPVEX("andn %Gy,%By,%Ey", IDX_ParseModRM, IDX_ParseVexDest, IDX_UseModRM, 0, OP_ANDN, OP_PARM_Gy, OP_PARM_By, OP_PARM_Ey, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3926 OPVEX("vgroup17", IDX_Parse Grp17,0, 0, 0, OP_GRP17, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),4036 OPVEX("vgroup17", IDX_ParseVGrp17, 0, 0, 0, OP_GRP17, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS), 3927 4037 INVALID_OPCODE, 3928 4038 OPVEX("bzhi %Gy,%By,%Ey", IDX_ParseModRM, IDX_ParseVexDest, IDX_UseModRM, 0, OP_BZHI, OP_PARM_Gy, OP_PARM_By, OP_PARM_Ey, OP_PARM_NONE, DISOPTYPE_HARMLESS), -
trunk/src/VBox/Disassembler/testcase/tstDisasm-1A.asm
r103698 r103709 489 489 db 066h 490 490 vpsrldq xmm1, xmm2, 3 491 vpsllq xmm15, xmm8, 99 491 492 492 493 ; group 7 stuff. … … 508 509 swpgs 509 510 rdtscp 511 rdfsbase rax 512 wrgsbase r15 513 rdrand rax 514 vmxon [rax] 510 515 511 516 ret
Note:
See TracChangeset
for help on using the changeset viewer.