VirtualBox

Changeset 103709 in vbox


Ignore:
Timestamp:
Mar 6, 2024 4:29:13 PM (12 months ago)
Author:
vboxsync
Message:

DIS: Fixed up all VEX groups and added a few missing instructions.

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/disopcode-x86-amd64.h

    r103699 r103709  
    609609    OP_AESKEYGEN,
    610610    OP_RORX,
     611    OP_RDPID,
    611612    OP_RDRAND,
    612613    OP_RDSEED,
     
    805806    OP_VMCLEAR,
    806807    OP_VMLAUNCH,
    807     OP_VMOFF,
    808808    OP_VMRESUME,
    809809    OP_VMPTRLD,
     
    10791079    OP_VPSLLD,
    10801080    OP_VPSLLQ,
     1081    OP_VPSLLDQ,
    10811082    OP_VPSLLVD,
    10821083    OP_VPSLLW,
  • trunk/src/VBox/Disassembler/DisasmCore-x86-amd64.cpp

    r103698 r103709  
    9898static FNDISPARSEX86 ParseGrp10;
    9999static FNDISPARSEX86 ParseGrp12;
     100static FNDISPARSEX86 ParseVGrp12;
    100101static FNDISPARSEX86 ParseGrp13;
     102static FNDISPARSEX86 ParseVGrp13;
    101103static FNDISPARSEX86 ParseGrp14;
     104static FNDISPARSEX86 ParseVGrp14;
    102105static FNDISPARSEX86 ParseGrp15;
     106static FNDISPARSEX86 ParseVGrp15;
    103107static FNDISPARSEX86 ParseGrp16;
    104 static FNDISPARSEX86 ParseGrp17;
     108static FNDISPARSEX86 ParseVGrp17;
     109static FNDISPARSEX86 ParseVGrp17;
    105110static FNDISPARSEX86 ParseModFence;
    106111static FNDISPARSEX86 ParseNopPause;
     
    150155    ParseGrp10,
    151156    ParseGrp12,
     157    ParseVGrp12,
    152158    ParseGrp13,
     159    ParseVGrp13,
    153160    ParseGrp14,
     161    ParseVGrp14,
    154162    ParseGrp15,
     163    ParseVGrp15,
    155164    ParseGrp16,
    156     ParseGrp17,
     165    ParseVGrp17,
    157166    ParseModFence,
    158167    ParseYv,
     
    201210    ParseGrp10,
    202211    ParseGrp12,
     212    ParseVGrp12,
    203213    ParseGrp13,
     214    ParseVGrp13,
    204215    ParseGrp14,
     216    ParseVGrp14,
    205217    ParseGrp15,
     218    ParseVGrp15,
    206219    ParseGrp16,
    207     ParseGrp17,
     220    ParseVGrp17,
    208221    ParseModFence,
    209222    ParseYv,
     
    16921705
    16931706                if (pDis->uCpuMode == DISCPUMODE_64BIT)
    1694                 {
    16951707                    pDis->x86.uOpMode = (pDis->x86.fRexPrefix & DISPREFIX_REX_FLAGS_W ? DISCPUMODE_64BIT : DISCPUMODE_32BIT);
    1696                 }
    16971708                else
    16981709                    pDis->x86.uOpMode  = pDis->uCpuMode;
     
    17631774                pDis->x86.fPrefix &= ~DISPREFIX_OPSIZE;
    17641775                if (pDis->uCpuMode == DISCPUMODE_64BIT)
    1765                 {
    17661776                    pDis->x86.uOpMode = (pDis->x86.fRexPrefix & DISPREFIX_REX_FLAGS_W ? DISCPUMODE_64BIT : DISCPUMODE_32BIT);
    1767                 }
    17681777                else
    17691778                    pDis->x86.uOpMode  = pDis->uCpuMode;
     
    17881797                pDis->x86.fPrefix &= ~DISPREFIX_OPSIZE;
    17891798                if (pDis->uCpuMode == DISCPUMODE_64BIT)
    1790                 {
    17911799                    pDis->x86.uOpMode = (pDis->x86.fRexPrefix & DISPREFIX_REX_FLAGS_W ? DISCPUMODE_64BIT : DISCPUMODE_32BIT);
    1792                 }
    17931800                else
    17941801                    pDis->x86.uOpMode  = pDis->uCpuMode;
     
    18611868            pDis->x86.fPrefix &= ~DISPREFIX_OPSIZE;
    18621869            if (pDis->uCpuMode == DISCPUMODE_64BIT)
    1863             {
    18641870                pDis->x86.uOpMode = (pDis->x86.fRexPrefix & DISPREFIX_REX_FLAGS_W ? DISCPUMODE_64BIT : DISCPUMODE_32BIT);
    1865             }
    18661871            else
    18671872                pDis->x86.uOpMode  = pDis->uCpuMode;
    1868 
    18691873        }
    18701874    }
     
    20702074    RT_NOREF_PV(pParam);
    20712075
     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//*****************************************************************************
     2111static size_t ParseGrp10(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
     2112{
     2113    RT_NOREF_PV(pParam);
     2114
    20722115    uint8_t modrm = disReadByte(pDis, offInstr);
    20732116    uint8_t reg   = MODRM_REG(modrm);
    20742117
    2075     pOp = &g_aMapX86_Group9[reg];
     2118    pOp = &g_aMapX86_Group10[reg];
    20762119
    20772120    return disParseInstruction(offInstr, pOp, pDis);
    20782121}
    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 */
     2127static size_t ParseGrp12(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
    20822128{
    20832129    RT_NOREF_PV(pParam);
    20842130
    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];
    20892136
    20902137    return disParseInstruction(offInstr, pOp, pDis);
    20912138}
    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 */
     2144static size_t ParseVGrp12(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
    20952145{
    20962146    RT_NOREF_PV(pParam);
    20972147
    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 */
     2161static 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);
    21012167    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];
    21052170
    21062171    return disParseInstruction(offInstr, pOp, pDis);
    21072172}
    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 */
     2178static size_t ParseVGrp13(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
    21112179{
    21122180    RT_NOREF_PV(pParam);
    21132181
    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];
    21242187
    21252188    return disParseInstruction(offInstr, pOp, pDis);
    21262189}
    2127 //*****************************************************************************
    2128 //*****************************************************************************
     2190
     2191
     2192/**
     2193 * Parses non-vex group 14.
     2194 */
    21292195static size_t ParseGrp14(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
    21302196{
    21312197    RT_NOREF_PV(pParam);
    21322198
    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);
    21352201    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];
    21392204
    21402205    return disParseInstruction(offInstr, pOp, pDis);
    21412206}
    2142 //*****************************************************************************
    2143 //*****************************************************************************
     2207
     2208
     2209/**
     2210 * Parses vex group 14.
     2211 */
     2212static 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 */
    21442229static size_t ParseGrp15(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
    21452230{
    21462231    RT_NOREF_PV(pParam);
    21472232
    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];
    21572247
    21582248    return disParseInstruction(offInstr, pOp, pDis);
    21592249}
    2160 //*****************************************************************************
    2161 //*****************************************************************************
     2250
     2251
     2252/**
     2253 * Parses vex group 15.
     2254 */
     2255static 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 */
    21622272static size_t ParseGrp16(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
    21632273{
    21642274    RT_NOREF_PV(pParam);
    21652275
    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)];
    21682278
    21692279    return disParseInstruction(offInstr, pOp, pDis);
     
    21742284 * Parses (vex) group 17.
    21752285 */
    2176 static size_t ParseGrp17(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
     2286static size_t ParseVGrp17(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
    21772287{
    21782288    RT_NOREF_PV(pParam);
    21792289
    21802290    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)];
    21822292
    21832293    return disParseInstruction(offInstr, pOp, pDis);
  • trunk/src/VBox/Disassembler/DisasmInternal-x86-amd64.h

    r103698 r103709  
    7575  IDX_ParseGrp10,
    7676  IDX_ParseGrp12,
     77  IDX_ParseVGrp12,
    7778  IDX_ParseGrp13,
     79  IDX_ParseVGrp13,
    7880  IDX_ParseGrp14,
     81  IDX_ParseVGrp14,
    7982  IDX_ParseGrp15,
     83  IDX_ParseVGrp15,
    8084  IDX_ParseGrp16,
    81   IDX_ParseGrp17,
     85  IDX_ParseVGrp17,
    8286  IDX_ParseModFence,
    8387  IDX_ParseYv,
     
    197201extern const DISOPCODE g_aMapX86_Group7_mod11_reg111[8];
    198202extern const DISOPCODE g_aMapX86_Group8[8];
    199 extern const DISOPCODE g_aMapX86_Group9[8];
     203extern const DISOPCODE g_aMapX86_Group9_mem_none[8];
     204extern const DISOPCODE g_aMapX86_Group9_mem_66[8];
     205extern const DISOPCODE g_aMapX86_Group9_mem_f3[8];
     206extern const DISOPCODE g_aMapX86_Group9_mod11_none[8];
     207extern const DISOPCODE g_aMapX86_Group9_mod11_f3[8];
    200208extern const DISOPCODE g_aMapX86_Group10[8];
    201209extern const DISOPCODE g_aMapX86_Group11[8*2];
    202210extern const DISOPCODE g_aMapX86_Group12[8*2];
     211extern const DISOPCODE g_aMapX86_VGroup12[8];
    203212extern const DISOPCODE g_aMapX86_Group13[8*2];
    204 extern const DISOPCODE g_aMapX86_VGroup13[8*2];
     213extern const DISOPCODE g_aMapX86_VGroup13[8];
    205214extern const DISOPCODE g_aMapX86_Group14[8*2];
     215extern const DISOPCODE g_aMapX86_VGroup14[8];
    206216extern const DISOPCODE g_aMapX86_Group15_mem[8];
    207 extern const DISOPCODE g_aMapX86_Group15_mod11_rm000[8];
     217extern const DISOPCODE g_aMapX86_Group15_mod11[8*2];
     218extern const DISOPCODE g_aMapX86_VGroup15[8];
    208219extern const DISOPCODE g_aMapX86_Group16[8];
    209 extern const DISOPCODE g_aMapX86_Group17[8*2];
     220extern const DISOPCODE g_aMapX86_VGroup17[8*2];
    210221extern const DISOPCODE g_aMapX86_NopPause[2];
    211222/** @} */
  • trunk/src/VBox/Disassembler/DisasmTables-x86-amd64.cpp

    r103698 r103709  
    12291229    INVALID_OPCODE,
    12301230    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),
    12321232    INVALID_OPCODE,
    12331233    INVALID_OPCODE,
     
    30633063    OP("vmlaunch",           0,                  0,          0,          OP_VMLAUNCH, OP_PARM_NONE,      OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
    30643064    OP("vmresume",           0,                  0,          0,          OP_VMRESUME, OP_PARM_NONE,      OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS ),
    3065     OP("vmoff",              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 ),
    30663066    INVALID_OPCODE,
    30673067    INVALID_OPCODE,
     
    31183118};
    31193119
    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 */
     3121const DISOPCODE g_aMapX86_Group9_mem_none[8] =
     3122{
     3123    INVALID_OPCODE_MOD_RM(0x0),
    31243124    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 */
     3134const 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 */
     3147const 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 */
     3160const 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),
    31293168    OP("rdrand %Ev",         IDX_ParseModRM,     0,             0,       OP_RDRAND,    OP_PARM_Ev,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    31303169    OP("rdseed %Ev",         IDX_ParseModRM,     0,             0,       OP_RDSEED,    OP_PARM_Ev,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    31313170};
    31323171
     3172/* 0F C7 mode=reg index by /reg - w/ 0xf3 SSE prefix */
     3173const 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 */
    31333186const DISOPCODE g_aMapX86_Group10[8] =
    31343187{
    3135     /* 0F B9 */
    31363188    INVALID_OPCODE_MOD_RM(0x),
    31373189    INVALID_OPCODE_MOD_RM(0x),
     
    31713223const DISOPCODE g_aMapX86_Group12[8*2] =
    31723224{
    3173     INVALID_OPCODE_MOD_RM(0x),
    3174     INVALID_OPCODE_MOD_RM(0x),
     3225    INVALID_OPCODE_MOD_RM(0x0),
     3226    INVALID_OPCODE_MOD_RM(0x1),
    31753227    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),
    31773229    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),
    31793231    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),
    31813233
    31823234    /* 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),
    31853237    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),
    31873239    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),
    31893241    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) */
     3246const 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 */
    31913258};
    31923259
     
    32143281};
    32153282
    3216 /* vex map1 0x72 */
    3217 const DISOPCODE g_aMapX86_VGroup13[8*2] =
     3283/* vex map1 0x72 w/ prefix 0x66 (VEX.pp=1) */
     3284const DISOPCODE g_aMapX86_VGroup13[8] =
    32183285{
    32193286    /* 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),
    32333289    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(0x0b),
     3290    INVALID_OPCODE_MOD_RM(0x3),
    32353291    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(0x0d),
     3292    INVALID_OPCODE_MOD_RM(0x5),
    32373293    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(0x0f),
     3294    INVALID_OPCODE_MOD_RM(0x7),
    32393295    /*     format string,                   parse param #1,     parse param #2,     parse param #3,     parse param #4,     opcode,             param #1,     param #2,     param #3,     param #4,     flags */
    32403296};
     
    32633319};
    32643320
    3265 
    3266 /* 0xF 0xAE */
     3321/* vex map1 0x73 w/ prefix 0x66 (VEX.pp=1) */
     3322const 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 */
    32673338const DISOPCODE g_aMapX86_Group15_mem[8] =
    32683339{
     
    32773348};
    32783349
    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. */
     3351const 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),
    32893359    OP("lfence",             IDX_ParseModFence,  0,          0,          OP_LFENCE,  OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    32903360    OP("mfence",             IDX_ParseModFence,  0,          0,          OP_MFENCE,  OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    32913361    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) */
     3374const 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
    32933389
    32943390/* 0xF 0x18 */
     
    35103606    /* 7 */
    35113607    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_ParseGrp13,                0,                   0,                          OP_GRP13,           OP_PARM_NONE, OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
    3514     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),
     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),
    35153611    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),
    35163612    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),
     
    35333629
    35343630    /* 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,
    35363646
    35373647    /* b */
     
    38984008
    38994009/** Indexed by: (/r << 1) | VEX.L */
    3900 const DISOPCODE g_aMapX86_Group17[8*2] =
     4010const DISOPCODE g_aMapX86_VGroup17[8*2] =
    39014011{
    39024012    /* 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 */
     
    39244034    /* 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 */
    39254035    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_ParseGrp17,     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),
    39274037    INVALID_OPCODE,
    39284038    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  
    489489        db 066h
    490490        vpsrldq xmm1, xmm2, 3
     491        vpsllq xmm15, xmm8, 99
    491492
    492493        ; group 7 stuff.
     
    508509        swpgs
    509510        rdtscp
     511        rdfsbase rax
     512        wrgsbase r15
     513        rdrand rax
     514        vmxon [rax]
    510515
    511516        ret
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