VirtualBox

Changeset 66957 in vbox for trunk


Ignore:
Timestamp:
May 18, 2017 4:21:24 PM (7 years ago)
Author:
vboxsync
Message:

IEM: Some VEX related regression fixes and cleanups.

Location:
trunk/src/VBox
Files:
7 edited

Legend:

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

    r66950 r66957  
    369369 */
    370370#define IEM_IS_CANONICAL(a_u64Addr)         X86_IS_CANONICAL(a_u64Addr)
     371
     372/**
     373 * Gets the effective VEX.VVVV value.
     374 *
     375 * The 4th bit is ignored if not 64-bit code.
     376 * @returns effective V-register value.
     377 * @param   a_pVCpu         The cross context virtual CPU structure of the calling thread.
     378 */
     379#define IEM_GET_EFFECTIVE_VVVV(a_pVCpu) \
     380    ((a_pVCpu)->iem.s.enmCpuMode == IEMMODE_64BIT ? (a_pVCpu)->iem.s.uVex3rdReg : (a_pVCpu)->iem.s.uVex3rdReg & 7)
    371381
    372382/** @def IEM_USE_UNALIGNED_DATA_ACCESS
     
    1271512725 * repnz or size prefixes are present, or if in real or v8086 mode.
    1271612726 */
    12717 #define IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX() \
     12727#define IEMOP_HLP_DONE_VEX_DECODING() \
    1271812728    do \
    1271912729    { \
     
    1273012740 * repnz or size prefixes are present, or if in real or v8086 mode.
    1273112741 */
    12732 #define IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_L0() \
     12742#define IEMOP_HLP_DONE_VEX_DECODING_L0() \
    1273312743    do \
    1273412744    { \
     
    1274812758 * register 0, or if in real or v8086 mode.
    1274912759 */
    12750 #define IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV() \
     12760#define IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV() \
    1275112761    do \
    1275212762    { \
     
    1275812768        else \
    1275912769            return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     12770    } while (0)
     12771
     12772/**
     12773 * Done decoding VEX, no V, L=0.
     12774 * Raises \#UD exception if rex, rep, opsize or lock prefixes are present, if
     12775 * we're in real or v8086 mode, if VEX.V!=0xf, or if VEX.L!=0.
     12776 */
     12777#define IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV() \
     12778    do \
     12779    { \
     12780        if (RT_LIKELY(   !(  pVCpu->iem.s.fPrefixes \
     12781                           & (IEM_OP_PRF_LOCK | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REX)) \
     12782                      && pVCpu->iem.s.uVexLength == 0 \
     12783                      && pVCpu->iem.s.uVex3rdReg == 0 \
     12784                      && !IEM_IS_REAL_OR_V86_MODE(pVCpu))) \
     12785        { /* likely */ } \
     12786        else \
     12787            return IEMOP_RAISE_INVALID_OPCODE(); \
    1276012788    } while (0)
    1276112789
     
    1279712825
    1279812826
    12799 /**
    12800  * Done decoding VEX.
    12801  * Raises \#UD exception if rex, rep, opsize or lock prefixes are present, or if
    12802  * we're in real or v8086 mode.
    12803  */
    12804 #define IEMOP_HLP_DONE_VEX_DECODING() \
    12805     do \
    12806     { \
    12807         if (RT_LIKELY(   !(  pVCpu->iem.s.fPrefixes \
    12808                            & (IEM_OP_PRF_LOCK | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REX)) \
    12809                       && !IEM_IS_REAL_OR_V86_MODE(pVCpu) )) \
    12810         { /* likely */ } \
    12811         else \
    12812             return IEMOP_RAISE_INVALID_OPCODE(); \
    12813     } while (0)
    12814 
    12815 /**
    12816  * Done decoding VEX, no V, no L.
    12817  * Raises \#UD exception if rex, rep, opsize or lock prefixes are present, if
    12818  * we're in real or v8086 mode, if VEX.V!=0xf, or if VEX.L!=0.
    12819  */
    12820 #define IEMOP_HLP_DONE_VEX_DECODING_L_ZERO_NO_VVV() \
    12821     do \
    12822     { \
    12823         if (RT_LIKELY(   !(  pVCpu->iem.s.fPrefixes \
    12824                            & (IEM_OP_PRF_LOCK | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REX)) \
    12825                       && pVCpu->iem.s.uVexLength == 0 \
    12826                       && pVCpu->iem.s.uVex3rdReg == 0 \
    12827                       && !IEM_IS_REAL_OR_V86_MODE(pVCpu))) \
    12828         { /* likely */ } \
    12829         else \
    12830             return IEMOP_RAISE_INVALID_OPCODE(); \
    12831     } while (0)
    12832 
    1283312827#ifdef VBOX_WITH_NESTED_HWVIRT
    1283412828/** Check and handles SVM nested-guest control & instruction intercept. */
     
    1284812842    } while (0)
    1284912843
    12850 #else
     12844#else  /* !VBOX_WITH_NESTED_HWVIRT */
    1285112845# define IEMOP_HLP_SVM_CTRL_INTERCEPT(a_pVCpu, a_Intercept, a_uExitCode, a_uExitInfo1, a_uExitInfo2)    do { } while (0)
    1285212846# define IEMOP_HLP_SVM_READ_CR_INTERCEPT(a_pVCpu, a_uCr, a_uExitInfo1, a_uExitInfo2)                    do { } while (0)
    12853 
    12854 #endif /* VBOX_WITH_NESTED_HWVIRT */
     12847#endif /* !VBOX_WITH_NESTED_HWVIRT */
    1285512848
    1285612849
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h

    r66901 r66957  
    43574357            pVCpu->iem.s.uRexIndex  = (~bRm >> (6 - 3)) & 0x8;
    43584358            pVCpu->iem.s.uRexB      = (~bRm >> (5 - 3)) & 0x8;
    4359             pVCpu->iem.s.uVex3rdReg = (~bXop2 >> 3) & (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT ? 0xf : 0x7);
     4359            pVCpu->iem.s.uVex3rdReg = (~bXop2 >> 3) & 0xf;
    43604360            pVCpu->iem.s.uVexLength = (bXop2 >> 2) & 1;
    43614361            pVCpu->iem.s.idxPrefix  = bXop2 & 0x3;
     
    62326232            pVCpu->iem.s.uRexIndex  = (~bRm >> (6 - 3)) & 0x8;
    62336233            pVCpu->iem.s.uRexB      = (~bRm >> (5 - 3)) & 0x8;
    6234             pVCpu->iem.s.uVex3rdReg = (~bVex2 >> 3) & (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT ? 0xf : 0x7);
     6234            pVCpu->iem.s.uVex3rdReg = (~bVex2 >> 3) & 0xf;
    62356235            pVCpu->iem.s.uVexLength = (bVex2 >> 2) & 1;
    62366236            pVCpu->iem.s.idxPrefix  = bVex2 & 0x3;
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r66950 r66957  
    481481    'mmx':                   'DISOPTYPE_MMX',                   ##< MMX,MMXExt,3DNow,++ instruction. Not implemented yet!
    482482    'fpu':                   'DISOPTYPE_FPU',                   ##< FPU instruction. Not implemented yet!
    483     'ignores_op_size':       '',                                ##< Ignores both operand size prefixes.
     483    'ignores_op_size':       '',                                ##< Ignores both operand size prefixes (66h + REX.W).
     484    'ignores_vex_l':         '',                                ##< Ignores VEX.L.
    484485    'lock_allowed':          '',                                ##< Lock prefix allowed.
    485486};
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r66950 r66957  
    6969         * Register, register.
    7070         */
    71         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     71        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    7272        IEM_MC_BEGIN(0, 0);
    7373        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     
    9292
    9393        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    94         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     94        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    9595        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    9696        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    112112
    113113        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    114         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     114        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    115115        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    116116        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    145145         * Register, register.
    146146         */
    147         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     147        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    148148        IEM_MC_BEGIN(0, 0);
    149149        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     
    168168
    169169        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    170         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     170        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    171171        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    172172        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    188188
    189189        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    190         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     190        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    191191        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    192192        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    221221         * @note        HssHi refers to bits 127:32.
    222222         */
    223         IEMOP_MNEMONIC3(VEX_RVM, VMOVSS, vmovss, Vss_WO, HssHi, Uss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    224         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX();
     223        IEMOP_MNEMONIC3(VEX_RVM, VMOVSS, vmovss, Vss_WO, HssHi, Uss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_IGNORES_VEX_L);
     224        IEMOP_HLP_DONE_VEX_DECODING();
    225225        IEM_MC_BEGIN(0, 0);
    226226
     
    229229        IEM_MC_MERGE_YREG_U32_U96_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    230230                                           (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB /*U32*/,
    231                                            pVCpu->iem.s.uVex3rdReg /*Hss*/);
     231                                            IEM_GET_EFFECTIVE_VVVV(pVCpu) /*Hss*/);
    232232        IEM_MC_ADVANCE_RIP();
    233233        IEM_MC_END();
     
    247247         * @optest      op1=0 op2=-22 -> op1=-22
    248248         */
    249         IEMOP_MNEMONIC2(VEX_XM, VMOVSS, vmovss, VssZx_WO, Md, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     249        IEMOP_MNEMONIC2(VEX_XM, VMOVSS, vmovss, VssZx_WO, Md, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_IGNORES_VEX_L);
    250250        IEM_MC_BEGIN(0, 2);
    251251        IEM_MC_LOCAL(uint32_t,                  uSrc);
     
    253253
    254254        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    255         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     255        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    256256        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    257257        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    287287         * @optest      op1=3 op2=0x42 op3=0x77 -> op1=0x420000000000000077
    288288         */
    289         IEMOP_MNEMONIC3(VEX_RVM, VMOVSD, vmovsd, Vsd_WO, HsdHi, Usd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    290         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX();
     289        IEMOP_MNEMONIC3(VEX_RVM, VMOVSD, vmovsd, Vsd_WO, HsdHi, Usd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_IGNORES_VEX_L);
     290        IEMOP_HLP_DONE_VEX_DECODING();
    291291        IEM_MC_BEGIN(0, 0);
    292292
     
    295295        IEM_MC_MERGE_YREG_U64_U64_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    296296                                           (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB /*U32*/,
    297                                            pVCpu->iem.s.uVex3rdReg /*Hss*/);
     297                                           IEM_GET_EFFECTIVE_VVVV(pVCpu) /*Hss*/);
    298298        IEM_MC_ADVANCE_RIP();
    299299        IEM_MC_END();
     
    313313         * @optest      op1=0 op2=-22 -> op1=-22
    314314         */
    315         IEMOP_MNEMONIC2(VEX_XM, VMOVSD, vmovsd, VsdZx_WO, Mq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     315        IEMOP_MNEMONIC2(VEX_XM, VMOVSD, vmovsd, VsdZx_WO, Mq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_IGNORES_VEX_L);
    316316        IEM_MC_BEGIN(0, 2);
    317317        IEM_MC_LOCAL(uint64_t,                  uSrc);
     
    319319
    320320        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    321         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     321        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    322322        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    323323        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    353353         * Register, register.
    354354         */
    355         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     355        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    356356        IEM_MC_BEGIN(0, 0);
    357357        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     
    376376
    377377        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    378         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     378        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    379379        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    380380        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    396396
    397397        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    398         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     398        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    399399        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    400400        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    429429         * Register, register.
    430430         */
    431         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     431        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    432432        IEM_MC_BEGIN(0, 0);
    433433        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     
    452452
    453453        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    454         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     454        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    455455        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    456456        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    472472
    473473        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    474         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     474        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    475475        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    476476        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    504504         * @optest      op1=3 op2=0x42 op3=0x77 -> op1=0x4200000077
    505505         */
    506         IEMOP_MNEMONIC3(VEX_MVR, VMOVSS, vmovss, Uss_WO, HssHi, Vss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    507         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX();
     506        IEMOP_MNEMONIC3(VEX_MVR, VMOVSS, vmovss, Uss_WO, HssHi, Vss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_IGNORES_VEX_L);
     507        IEMOP_HLP_DONE_VEX_DECODING();
    508508        IEM_MC_BEGIN(0, 0);
    509509
     
    512512        IEM_MC_MERGE_YREG_U32_U96_ZX_VLMAX((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB /*U32*/,
    513513                                           ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    514                                            pVCpu->iem.s.uVex3rdReg /*Hss*/);
     514                                           IEM_GET_EFFECTIVE_VVVV(pVCpu) /*Hss*/);
    515515        IEM_MC_ADVANCE_RIP();
    516516        IEM_MC_END();
     
    530530         * @optest      op1=0 op2=-22 -> op1=-22
    531531         */
    532         IEMOP_MNEMONIC2(VEX_MR, VMOVSS, vmovss, Md_WO, Vss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     532        IEMOP_MNEMONIC2(VEX_MR, VMOVSS, vmovss, Md_WO, Vss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_IGNORES_VEX_L);
    533533        IEM_MC_BEGIN(0, 2);
    534534        IEM_MC_LOCAL(uint32_t,                  uSrc);
     
    536536
    537537        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    538         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     538        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    539539        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    540540        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    570570         * @optest      op2=0x42 op3=0x77 -> op1=0x420000000000000077
    571571         */
    572         IEMOP_MNEMONIC3(VEX_MVR, VMOVSD, vmovsd, Usd_WO, HsdHi, Vsd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    573         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX();
     572        IEMOP_MNEMONIC3(VEX_MVR, VMOVSD, vmovsd, Usd_WO, HsdHi, Vsd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_IGNORES_VEX_L);
     573        IEMOP_HLP_DONE_VEX_DECODING();
    574574        IEM_MC_BEGIN(0, 0);
    575575
     
    578578        IEM_MC_MERGE_YREG_U64_U64_ZX_VLMAX((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
    579579                                           ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    580                                            pVCpu->iem.s.uVex3rdReg /*Hss*/);
     580                                           IEM_GET_EFFECTIVE_VVVV(pVCpu) /*Hss*/);
    581581        IEM_MC_ADVANCE_RIP();
    582582        IEM_MC_END();
     
    596596         * @optest      op1=0 op2=-22 -> op1=-22
    597597         */
    598         IEMOP_MNEMONIC2(VEX_MR, VMOVSD, vmovsd, Mq_WO, Vsd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     598        IEMOP_MNEMONIC2(VEX_MR, VMOVSD, vmovsd, Mq_WO, Vsd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_IGNORES_VEX_L);
    599599        IEM_MC_BEGIN(0, 2);
    600600        IEM_MC_LOCAL(uint64_t,                  uSrc);
     
    602602
    603603        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    604         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     604        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    605605        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    606606        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    637637        IEMOP_MNEMONIC3(VEX_RVM, VMOVHLPS, vmovhlps, Vq_WO, HqHi, UqHi, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    638638
    639         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_L0();
     639        IEMOP_HLP_DONE_VEX_DECODING_L0();
    640640        IEM_MC_BEGIN(0, 0);
    641641
     
    644644        IEM_MC_MERGE_YREG_U64HI_U64_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    645645                                             (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
    646                                              pVCpu->iem.s.uVex3rdReg /*Hq*/);
     646                                             IEM_GET_EFFECTIVE_VVVV(pVCpu) /*Hq*/);
    647647
    648648        IEM_MC_ADVANCE_RIP();
     
    672672
    673673        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    674         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_L0();
     674        IEMOP_HLP_DONE_VEX_DECODING_L0();
    675675        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    676676        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    679679        IEM_MC_MERGE_YREG_U64LOCAL_U64_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    680680                                                uSrc,
    681                                                 pVCpu->iem.s.uVex3rdReg /*Hq*/);
     681                                                IEM_GET_EFFECTIVE_VVVV(pVCpu) /*Hq*/);
    682682
    683683        IEM_MC_ADVANCE_RIP();
     
    712712
    713713        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    714         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_L0();
     714        IEMOP_HLP_DONE_VEX_DECODING_L0();
    715715        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    716716        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    719719        IEM_MC_MERGE_YREG_U64LOCAL_U64_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    720720                                                uSrc,
    721                                                 pVCpu->iem.s.uVex3rdReg /*Hq*/);
     721                                                IEM_GET_EFFECTIVE_VVVV(pVCpu) /*Hq*/);
    722722
    723723        IEM_MC_ADVANCE_RIP();
     
    751751 *                 op2=0xbbbbbbbb00000004cccccccc00000003dddddddd00000002eeeeeeee00000001
    752752 *              -> op1=0x0000000400000004000000030000000300000002000000020000000100000001
    753  * @oponly
    754753 */
    755754FNIEMOP_DEF(iemOp_vmovsldup_Vx_Wx)
     
    763762         * Register, register.
    764763         */
    765         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     764        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    766765        if (pVCpu->iem.s.uVexLength == 0)
    767766        {
     
    810809
    811810            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    812             IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     811            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    813812            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    814813            IEM_MC_PREPARE_AVX_USAGE();
     
    832831
    833832            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    834             IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     833            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    835834            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    836835            IEM_MC_PREPARE_AVX_USAGE();
     
    25702569{
    25712570    IEMOP_MNEMONIC1(VEX_M_MEM, VSTMXCSR, vstmxcsr, Md_WO, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    2572     if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fAvx)
    2573         return IEMOP_RAISE_INVALID_OPCODE();
    2574 
    25752571    IEM_MC_BEGIN(2, 0);
    25762572    IEM_MC_ARG(uint8_t,         iEffSeg,                                 0);
    25772573    IEM_MC_ARG(RTGCPTR,         GCPtrEff,                                1);
    25782574    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
    2579     IEMOP_HLP_DONE_VEX_DECODING_L_ZERO_NO_VVV();
     2575    IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
    25802576    IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    25812577    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r66950 r66957  
    550550    /** Prefix index (VEX.pp) for two byte and three byte tables. */
    551551    uint8_t                 idxPrefix;                                                                      /* 0x30, 0x16 */
    552     /** 3rd VEX/EVEX/XOP register. */
     552    /** 3rd VEX/EVEX/XOP register.
     553     * Please use IEM_GET_EFFECTIVE_VVVV to access.  */
    553554    uint8_t                 uVex3rdReg;                                                                     /* 0x31, 0x17 */
    554555    /** The VEX/EVEX/XOP length field. */
     
    957958/** Allowed with the lock prefix. */
    958959#define IEMOPHINT_LOCK_ALLOWED      RT_BIT_32(11)
     960/** The VEX.L value is ignored (aka LIG). */
     961#define IEMOPHINT_IGNORES_VEX_L     RT_BIT_32(12)
     962
    959963/** Hint to IEMAllInstructionPython.py that this macro should be skipped.  */
    960964#define IEMOPHINT_SKIP_PYTHON       RT_BIT_32(31)
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r66950 r66957  
    119119#define IEMOP_HLP_DEFAULT_64BIT_OP_SIZE()                   do { } while (0)
    120120#define IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE(a_szPrf)      do { } while (0)
    121 #define IEMOP_HLP_DONE_VEX_DECODING_L_ZERO_NO_VVV()         do { } while (0)
     121#define IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV()         do { } while (0)
    122122#define IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX()            do { } while (0)
    123 #define IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX()             do { } while (0)
    124 #define IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_L0()      do { } while (0)
    125 #define IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV() do { } while (0)
     123#define IEMOP_HLP_DONE_VEX_DECODING()             do { } while (0)
     124#define IEMOP_HLP_DONE_VEX_DECODING_L0()      do { } while (0)
     125#define IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV() do { } while (0)
    126126#define IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES()                                    do { } while (0)
    127127
    128128
    129129#define IEMOP_HLP_DONE_DECODING()                           do { } while (0)
    130 #define IEMOP_HLP_DONE_VEX_DECODING()                       do { } while (0)
    131130
    132131#define IEMOP_HLP_SVM_CTRL_INTERCEPT(a_pVCpu, a_Intercept, a_uExitCode, a_uExitInfo1, a_uExitInfo2) do { } while (0)
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r66950 r66957  
    29292929    else if (iEncoding == 2)
    29302930    {
    2931         off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0x7 /*~V*/, 0 /*L*/, 1 /*~R*/, 1 /*~X*/, 1 /*~B*/, 0 /*W*/);
     2931        off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0x7 /*~V-invalid*/, 0 /*L*/, 1 /*~R*/, 1 /*~X*/, 1 /*~B*/, 0 /*W*/);
    29322932        off = Bs3Cg1InsertOpcodes(pThis, off) - 1;
    29332933        off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off,
     
    30213021            off = Bs3Cg1InsertOpcodes(pThis, off);
    30223022            pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 1, 0);
    3023             pThis->aOperands[pThis->iRmOp ].enmLocation = pThis->aOperands[pThis->iRegOp].enmLocationReg;
     3023            pThis->aOperands[pThis->iRmOp ].enmLocation = pThis->aOperands[pThis->iRmOp].enmLocationReg;
    30243024            pThis->aOperands[pThis->iRmOp ].idxField = pThis->aOperands[pThis->iRmOp ].idxFieldBase + 0;
    30253025            pThis->aOperands[pThis->iRegOp].idxField = pThis->aOperands[pThis->iRegOp].idxFieldBase + 1;
     
    34113411            return Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_Lig_OR_ViceVersa(pThis, iEncoding);
    34123412
    3413         case BS3CG1ENC_VEX_MODRM_Md_WO:
    3414             return Bs3Cg1EncodeNext_VEX_MODRM_Md_WO(pThis, iEncoding);
    3415 
    34163413#endif /* BS3CG1_WITH_VEX */
    34173414
     
    34393436bool BS3_NEAR_CODE Bs3Cg1EncodePrep(PBS3CG1STATE pThis)
    34403437{
    3441     unsigned iRing = 4;
    3442     while (iRing-- > 0)
    3443         pThis->aSavedSegRegs[iRing].ds = pThis->aInitialCtxs[iRing].ds;
     3438    unsigned i = 4;
     3439    while (i-- > 0)
     3440        pThis->aSavedSegRegs[i].ds = pThis->aInitialCtxs[i].ds;
     3441
     3442    i = RT_ELEMENTS(pThis->aOperands);
     3443    while (i-- > 0)
     3444    {
     3445        pThis->aOperands[i].enmLocationReg  = BS3CG1OPLOC_INVALID;
     3446        pThis->aOperands[i].enmLocationMem  = BS3CG1OPLOC_INVALID;
     3447        pThis->aOperands[i].idxFieldBase    = BS3CG1DST_INVALID;
     3448    }
    34443449
    34453450    pThis->iRmOp            = RT_ELEMENTS(pThis->aOperands) - 1;
     
    36023607
    36033608        case BS3CG1ENC_MODRM_Md_WO:
    3604         case BS3CG1ENC_VEX_MODRM_Md_WO:
    36053609            pThis->iRmOp             = 0;
    36063610            pThis->aOperands[0].cbOp = 4;
     
    37593763            break;
    37603764
     3765        case BS3CG1ENC_VEX_MODRM_Md_WO:
     3766            pThis->pfnEncoder        = Bs3Cg1EncodeNext_VEX_MODRM_Md_WO;
     3767            pThis->iRmOp             = 0;
     3768            pThis->aOperands[0].cbOp = 4;
     3769            pThis->aOperands[0].enmLocation = BS3CG1OPLOC_MEM_WO;
     3770            break;
     3771
    37613772        case BS3CG1ENC_VEX_MODRM_Md_WO_Vss:
    37623773            pThis->pfnEncoder        = Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_Lig_OR_ViceVersa;
     
    38223833            pThis->aOperands[0].enmLocation     = BS3CG1OPLOC_CTX_ZX_VLMAX;
    38233834            pThis->aOperands[0].enmLocationReg  = BS3CG1OPLOC_CTX_ZX_VLMAX;
    3824             pThis->aOperands[0].enmLocationMem  = BS3CG1OPLOC_MEM;
     3835            pThis->aOperands[0].enmLocationMem  = BS3CG1OPLOC_MEM_WO;
    38253836            pThis->aOperands[1].enmLocation     = BS3CG1OPLOC_CTX;
    38263837            pThis->aOperands[0].idxFieldBase    = BS3CG1DST_XMM0;
     
    53915402                                    Bs3Cg1CheckResult(pThis, bTestXcptExpected, false /*fInvalidEncodingPgFault*/, iEncoding);
    53925403                                }
     5404                                else if (   !pThis->fInvalidEncoding
     5405                                         && pThis->bAlignmentXcpt == UINT8_MAX
     5406                                         && pThis->bValueXcpt     == UINT8_MAX)
     5407                                {
     5408                                    Bs3TestPrintf("Bs3Cg1RunContextModifier(out): iEncoding=%u iTest=%u\n", iEncoding, pThis->iTest);
     5409                                    ASMHalt();
     5410                                }
    53935411
    53945412                                /*
     
    54245442                                }
    54255443                            }
    5426 #if 1
    5427                             else ASMHalt();
    5428 #endif
     5444                            else
     5445                            {
     5446                                Bs3TestPrintf("Bs3Cg1RunContextModifier(in): iEncoding=%u iTest=%u\n", iEncoding, pThis->iTest);
     5447                                ASMHalt();
     5448                            }
    54295449                        }
    54305450                        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