VirtualBox

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


Ignore:
Timestamp:
Mar 20, 2024 1:50:22 PM (11 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
162336
Message:

VMM/IEM: vpblendvb is supposed to raise #UD if VEX.W isn't zero. bugref:9898

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

Legend:

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

    r103955 r103959  
    11941194        {
    11951195            IEM_MC_BEGIN(4, 4, IEM_MC_F_NOT_286_OR_OLDER, 0);
    1196             IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx2);
     1196            IEMOP_HLP_DONE_VEX_DECODING_W0_EX(fAvx2);
    11971197            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    11981198            IEM_MC_PREPARE_AVX_USAGE();
     
    12221222        {
    12231223            IEM_MC_BEGIN(4, 0, IEM_MC_F_NOT_286_OR_OLDER, 0);
    1224             IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
     1224            IEMOP_HLP_DONE_VEX_DECODING_W0_EX(fAvx);
    12251225            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    12261226            IEM_MC_PREPARE_AVX_USAGE();
     
    12521252            uint8_t bOp4; IEM_OPCODE_GET_NEXT_U8(&bOp4);
    12531253
    1254             IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx2);
     1254            IEMOP_HLP_DONE_VEX_DECODING_W0_EX(fAvx2);
    12551255            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    12561256            IEM_MC_PREPARE_AVX_USAGE();
     
    12841284            uint8_t bOp4; IEM_OPCODE_GET_NEXT_U8(&bOp4);
    12851285
    1286             IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
     1286            IEMOP_HLP_DONE_VEX_DECODING_W0_EX(fAvx);
    12871287            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    12881288            IEM_MC_PREPARE_AVX_USAGE();
     
    13121312FNIEMOP_DEF(iemOp_vpblendvb_Vx_Hx_Wx_Lx)
    13131313{
    1314     IEMOP_MNEMONIC4(VEX_RVMR, VPBLENDVB, vpblendvb, Vx_WO, Hx, Wx, Lx, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO | IEMOPHINT_VEX_W_ZERO);
     1314    /** @todo testcase: cover VEX.W=1 and check that it triggers \#UD on both real
     1315     *        and emulated hardware. */
     1316    IEMOP_MNEMONIC4(VEX_RVMR, VPBLENDVB, vpblendvb, Vx_WO, Hx, Wx, Lx, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_W_ZERO);
    13151317    IEMOPBLENDOP_INIT_VARS(vpblendvb);
    13161318    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Lx, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
  • trunk/src/VBox/VMM/include/IEMOpHlp.h

    r103922 r103959  
    601601    } while (0)
    602602
     603/**
     604 * Done decoding VEX, L=0 and W=0.
     605 * Raises \#UD exception if rex, rep, opsize or lock prefixes are present,
     606 * if we're in real or v8086 mode, if VEX.L!=0, if VEX.W!=0, or if the
     607 * a_fFeature is not present in the guest CPU.
     608 */
     609#define IEMOP_HLP_DONE_VEX_DECODING_L0_AND_W0_EX(a_fFeature) \
     610    do \
     611    { \
     612        if (RT_LIKELY(   !(  pVCpu->iem.s.fPrefixes \
     613                           & (IEM_OP_PRF_LOCK | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REX \
     614                              | IEM_OP_PRF_SIZE_REX_W /*VEX.W*/)) \
     615                      && pVCpu->iem.s.uVexLength == 0 \
     616                      && !IEM_IS_REAL_OR_V86_MODE(pVCpu) \
     617                      && IEM_GET_GUEST_CPU_FEATURES(pVCpu)->a_fFeature )) \
     618        { /* likely */ } \
     619        else \
     620            IEMOP_RAISE_INVALID_OPCODE_RET(); \
     621    } while (0)
     622
     623
    603624#define IEMOP_HLP_DECODED_NL_1(a_uDisOpNo, a_fIemOpFlags, a_uDisParam0, a_fDisOpType) \
    604625    do \
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