VirtualBox

Changeset 99958 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
May 24, 2023 2:47:30 PM (21 months ago)
Author:
vboxsync
Message:

IEM: Consistently use DONE_VEX_DECODING_EX macros to check for CPU feature bits. Removed the non-EX variants of the macros as they are no longer used.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap2.cpp.h

    r99335 r99958  
    11001100{
    11011101    IEMOP_MNEMONIC3(VEX_RVM, ANDN, andn, Gy, By, Ey, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO);
    1102     if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fBmi1)
    1103         return iemOp_InvalidNeedRM(pVCpu);
    11041102    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF | X86_EFL_PF);
    11051103    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     
    11091107         * Register, register.
    11101108         */
    1111         IEMOP_HLP_DONE_VEX_DECODING_L0();
     1109        IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi1);
    11121110        if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
    11131111        {
     
    11581156            IEM_MC_LOCAL(RTGCPTR,           GCPtrEffSrc);
    11591157            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1160             IEMOP_HLP_DONE_VEX_DECODING_L0();
     1158            IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi1);
    11611159            IEM_MC_FETCH_MEM_U64(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    11621160            IEM_MC_FETCH_GREG_U64(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu));
     
    11771175            IEM_MC_LOCAL(RTGCPTR,           GCPtrEffSrc);
    11781176            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1179             IEMOP_HLP_DONE_VEX_DECODING_L0();
     1177            IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi1);
    11801178            IEM_MC_FETCH_MEM_U32(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    11811179            IEM_MC_FETCH_GREG_U32(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu));
     
    12031201/** Body for the vex group 17 instructions. */
    12041202#define IEMOP_BODY_By_Ey(a_Instr) \
    1205     if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fBmi1) \
    1206         return iemOp_InvalidWithRM(pVCpu, bRm); /* decode memory variant? */ \
    12071203    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF | X86_EFL_PF); \
    12081204    if (IEM_IS_MODRM_REG_MODE(bRm)) \
     
    12111207         * Register, register. \
    12121208         */ \
    1213         IEMOP_HLP_DONE_VEX_DECODING_L0(); \
     1209        IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi1); \
    12141210        if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W) \
    12151211        { \
     
    12551251            IEM_MC_LOCAL(RTGCPTR,           GCPtrEffSrc); \
    12561252            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
    1257             IEMOP_HLP_DONE_VEX_DECODING_L0(); \
     1253            IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi1); \
    12581254            IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
    12591255            IEM_MC_REF_GREG_U64(pDst,  IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
     
    12721268            IEM_MC_LOCAL(RTGCPTR,           GCPtrEffSrc); \
    12731269            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
    1274             IEMOP_HLP_DONE_VEX_DECODING_L0(); \
     1270            IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi1); \
    12751271            IEM_MC_FETCH_MEM_U32(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
    12761272            IEM_MC_REF_GREG_U32(pDst,  IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
     
    13541350/** Body for BZHI, BEXTR, ++; assumes VEX.L must be 0. */
    13551351#define IEMOP_BODY_Gy_Ey_By(a_Instr, a_fFeatureMember, a_fUndefFlags) \
    1356     if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->a_fFeatureMember) \
    1357         return iemOp_InvalidNeedRM(pVCpu); \
    13581352    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(a_fUndefFlags); \
    13591353    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \
     
    13631357         * Register, register. \
    13641358         */ \
    1365         IEMOP_HLP_DONE_VEX_DECODING_L0(); \
     1359        IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \
    13661360        if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W) \
    13671361        { \
     
    14141408            IEM_MC_LOCAL(RTGCPTR,           GCPtrEffSrc); \
    14151409            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
    1416             IEMOP_HLP_DONE_VEX_DECODING_L0(); \
     1410            IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \
    14171411            IEM_MC_FETCH_MEM_U64(uSrc1, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
    14181412            IEM_MC_FETCH_GREG_U64(uSrc2, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
     
    14341428            IEM_MC_LOCAL(RTGCPTR,           GCPtrEffSrc); \
    14351429            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
    1436             IEMOP_HLP_DONE_VEX_DECODING_L0(); \
     1430            IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \
    14371431            IEM_MC_FETCH_MEM_U32(uSrc1, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
    14381432            IEM_MC_FETCH_GREG_U32(uSrc2, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
     
    14511445/** Body for SARX, SHLX, SHRX; assumes VEX.L must be 0. */
    14521446#define IEMOP_BODY_Gy_Ey_By_NoEflags(a_Instr, a_fFeatureMember, a_fUndefFlags) \
    1453     if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->a_fFeatureMember) \
    1454         return iemOp_InvalidNeedRM(pVCpu); \
    14551447    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(a_fUndefFlags); \
    14561448    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \
     
    14601452         * Register, register. \
    14611453         */ \
    1462         IEMOP_HLP_DONE_VEX_DECODING_L0(); \
     1454        IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \
    14631455        if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W) \
    14641456        { \
     
    15041496            IEM_MC_LOCAL(RTGCPTR,           GCPtrEffSrc); \
    15051497            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
    1506             IEMOP_HLP_DONE_VEX_DECODING_L0(); \
     1498            IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \
    15071499            IEM_MC_FETCH_MEM_U64(uSrc1, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
    15081500            IEM_MC_FETCH_GREG_U64(uSrc2, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
     
    15211513            IEM_MC_LOCAL(RTGCPTR,           GCPtrEffSrc); \
    15221514            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
    1523             IEMOP_HLP_DONE_VEX_DECODING_L0(); \
     1515            IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \
    15241516            IEM_MC_FETCH_MEM_U32(uSrc1, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
    15251517            IEM_MC_FETCH_GREG_U32(uSrc2, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
     
    15451537/** Body for PDEP and PEXT (similar to ANDN, except no EFLAGS). */
    15461538#define IEMOP_BODY_Gy_By_Ey_NoEflags(a_Instr, a_fFeatureMember) \
    1547     if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->a_fFeatureMember) \
    1548         return iemOp_InvalidNeedRM(pVCpu); \
    15491539    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \
    15501540    if (IEM_IS_MODRM_REG_MODE(bRm)) \
     
    15531543         * Register, register. \
    15541544         */ \
    1555         IEMOP_HLP_DONE_VEX_DECODING_L0(); \
     1545        IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \
    15561546        if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W) \
    15571547        { \
     
    15991589            IEM_MC_LOCAL(RTGCPTR,           GCPtrEffSrc); \
    16001590            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
    1601             IEMOP_HLP_DONE_VEX_DECODING_L0(); \
     1591            IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \
    16021592            IEM_MC_FETCH_MEM_U64(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
    16031593            IEM_MC_FETCH_GREG_U64(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
     
    16171607            IEM_MC_LOCAL(RTGCPTR,           GCPtrEffSrc); \
    16181608            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
    1619             IEMOP_HLP_DONE_VEX_DECODING_L0(); \
     1609            IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeatureMember); \
    16201610            IEM_MC_FETCH_MEM_U32(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
    16211611            IEM_MC_FETCH_GREG_U32(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
     
    16571647{
    16581648    IEMOP_MNEMONIC4(VEX_RVM, MULX, mulx, Gy, By, Ey, rDX, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO);
    1659     if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fBmi2)
    1660         return iemOp_InvalidNeedRM(pVCpu);
    16611649    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    16621650    if (IEM_IS_MODRM_REG_MODE(bRm))
     
    16651653         * Register, register.
    16661654         */
    1667         IEMOP_HLP_DONE_VEX_DECODING_L0();
     1655        IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi2);
    16681656        if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
    16691657        {
     
    17151703            IEM_MC_LOCAL(RTGCPTR,           GCPtrEffSrc);
    17161704            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1717             IEMOP_HLP_DONE_VEX_DECODING_L0();
     1705            IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi2);
    17181706            IEM_MC_FETCH_MEM_U64(uSrc2,  pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    17191707            IEM_MC_FETCH_GREG_U64(uSrc1, X86_GREG_xDX);
     
    17341722            IEM_MC_LOCAL(RTGCPTR,           GCPtrEffSrc);
    17351723            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1736             IEMOP_HLP_DONE_VEX_DECODING_L0();
     1724            IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi2);
    17371725            IEM_MC_FETCH_MEM_U32(uSrc2,  pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    17381726            IEM_MC_FETCH_GREG_U32(uSrc1, X86_GREG_xDX);
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap3.cpp.h

    r99335 r99958  
    887887{
    888888    IEMOP_MNEMONIC3(VEX_RMI, RORX, rorx, Gy, Ey, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO | IEMOPHINT_VEX_V_ZERO);
    889     if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fBmi2)
    890         return iemOp_InvalidNeedRMImm8(pVCpu);
    891889    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    892890    if (IEM_IS_MODRM_REG_MODE(bRm))
     
    896894         */
    897895        uint8_t bImm8; IEM_OPCODE_GET_NEXT_U8(&bImm8);
    898         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     896        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fBmi2);
    899897        if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
    900898        {
     
    937935            uint8_t bImm8; IEM_OPCODE_GET_NEXT_U8(&bImm8);
    938936            IEM_MC_ARG_CONST(uint64_t,      uSrc2,   bImm8, 2);
    939             IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     937            IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fBmi2);
    940938            IEM_MC_FETCH_MEM_U64(uSrc1, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    941939            IEM_MC_REF_GREG_U64(pDst, IEM_GET_MODRM_REG(pVCpu, bRm));
     
    953951            uint8_t bImm8; IEM_OPCODE_GET_NEXT_U8(&bImm8);
    954952            IEM_MC_ARG_CONST(uint32_t,      uSrc2,   bImm8, 2);
    955             IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     953            IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fBmi2);
    956954            IEM_MC_FETCH_MEM_U32(uSrc1, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    957955            IEM_MC_REF_GREG_U32(pDst, IEM_GET_MODRM_REG(pVCpu, bRm));
  • trunk/src/VBox/VMM/include/IEMOpHlp.h

    r99686 r99958  
    453453/**
    454454 * Done decoding VEX instruction, raise \#UD exception if any lock, rex, repz,
    455  * repnz or size prefixes are present, or if in real or v8086 mode.
    456  */
    457 #define IEMOP_HLP_DONE_VEX_DECODING() \
    458     do \
    459     { \
    460         if (RT_LIKELY(   !(  pVCpu->iem.s.fPrefixes \
    461                            & (IEM_OP_PRF_LOCK | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REX)) \
    462                       && !IEM_IS_REAL_OR_V86_MODE(pVCpu) )) \
    463         { /* likely */ } \
    464         else \
    465             return IEMOP_RAISE_INVALID_OPCODE(); \
    466     } while (0)
    467 
    468 /**
    469  * Done decoding VEX instruction, raise \#UD exception if any lock, rex, repz,
    470455 * repnz or size prefixes are present, if in real or v8086 mode, or if the
    471  * a_fFeature is present in the guest CPU.
     456 * a_fFeature is not present in the guest CPU.
    472457 */
    473458#define IEMOP_HLP_DONE_VEX_DECODING_EX(a_fFeature) \
     
    485470/**
    486471 * Done decoding VEX instruction, raise \#UD exception if any lock, rex, repz,
    487  * repnz or size prefixes are present, or if in real or v8086 mode.
    488  */
    489 #define IEMOP_HLP_DONE_VEX_DECODING_L0() \
    490     do \
    491     { \
    492         if (RT_LIKELY(   !(  pVCpu->iem.s.fPrefixes \
    493                            & (IEM_OP_PRF_LOCK | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REX)) \
    494                       && !IEM_IS_REAL_OR_V86_MODE(pVCpu) \
    495                       && pVCpu->iem.s.uVexLength == 0)) \
    496         { /* likely */ } \
    497         else \
    498             return IEMOP_RAISE_INVALID_OPCODE(); \
    499     } while (0)
    500 
    501 /**
    502  * Done decoding VEX instruction, raise \#UD exception if any lock, rex, repz,
    503  * repnz or size prefixes are present, or if in real or v8086 mode.
     472 * repnz or size prefixes are present, or if in real or v8086 mode, or if the
     473 * a_fFeature is not present in the guest CPU.
    504474 */
    505475#define IEMOP_HLP_DONE_VEX_DECODING_L0_EX(a_fFeature) \
     
    516486    } while (0)
    517487
    518 
    519 /**
    520  * Done decoding VEX instruction, raise \#UD exception if any lock, rex, repz,
    521  * repnz or size prefixes are present, or if the VEX.VVVV field doesn't indicate
    522  * register 0, or if in real or v8086 mode.
    523  */
    524 #define IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV() \
    525     do \
    526     { \
    527         if (RT_LIKELY(   !(  pVCpu->iem.s.fPrefixes \
    528                            & (IEM_OP_PRF_LOCK | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REX)) \
    529                       && !pVCpu->iem.s.uVex3rdReg \
    530                       && !IEM_IS_REAL_OR_V86_MODE(pVCpu) )) \
    531         { /* likely */ } \
    532         else \
    533             return IEMOP_RAISE_INVALID_OPCODE(); \
    534     } while (0)
    535 
    536488/**
    537489 * Done decoding VEX instruction, raise \#UD exception if any lock, rex, repz,
     
    548500                      && !IEM_IS_REAL_OR_V86_MODE(pVCpu) \
    549501                      && IEM_GET_GUEST_CPU_FEATURES(pVCpu)->a_fFeature )) \
    550         { /* likely */ } \
    551         else \
    552             return IEMOP_RAISE_INVALID_OPCODE(); \
    553     } while (0)
    554 
    555 /**
    556  * Done decoding VEX, no V, L=0.
    557  * Raises \#UD exception if rex, rep, opsize or lock prefixes are present, if
    558  * we're in real or v8086 mode, if VEX.V!=0xf, or if VEX.L!=0.
    559  */
    560 #define IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV() \
    561     do \
    562     { \
    563         if (RT_LIKELY(   !(  pVCpu->iem.s.fPrefixes \
    564                            & (IEM_OP_PRF_LOCK | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REX)) \
    565                       && pVCpu->iem.s.uVexLength == 0 \
    566                       && pVCpu->iem.s.uVex3rdReg == 0 \
    567                       && !IEM_IS_REAL_OR_V86_MODE(pVCpu))) \
    568502        { /* likely */ } \
    569503        else \
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