VirtualBox

Changeset 65778 in vbox


Ignore:
Timestamp:
Feb 13, 2017 5:38:28 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
113502
Message:

IEM: Correted invalid opcode decoding in group 12, 13, and 14.

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

Legend:

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

    r65773 r65778  
    549549
    550550
    551 /** Invalid opcode where intel requires Mod R/M sequence. */
    552 FNIEMOP_DEF(iemOp_InvalidNeedRM)
    553 {
    554     IEMOP_MNEMONIC(InvalidNeedRM, "InvalidNeedRM");
     551/** Invalid with RM byte where intel requires 8-byte immediate.
     552 * Intel will also need SIB and displacement if bRm indicates memory. */
     553FNIEMOPRM_DEF(iemOp_InvalidWithRMNeedImm8)
     554{
     555    IEMOP_MNEMONIC(InvalidWithRMNeedImm8, "InvalidWithRMNeedImm8");
    555556    if (pVCpu->iem.s.enmCpuVendor == CPUMCPUVENDOR_INTEL)
    556557    {
    557         uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); RT_NOREF(bRm);
    558558#ifndef TST_IEM_CHECK_MC
    559559        if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     
    565565        }
    566566#endif
     567        uint8_t bImm8;  IEM_OPCODE_GET_NEXT_U8(&bImm8);  RT_NOREF(bRm);
    567568        IEMOP_HLP_DONE_DECODING();
    568569    }
     
    571572
    572573
    573 /** Invalid opcode where intel requires Mod R/M sequence and 8-byte
    574  *  immediate. */
    575 FNIEMOP_DEF(iemOp_InvalidNeedRMImm8)
    576 {
    577     IEMOP_MNEMONIC(InvalidNeedRMImm8, "InvalidNeedRMImm8");
     574/** Invalid opcode where intel requires Mod R/M sequence. */
     575FNIEMOP_DEF(iemOp_InvalidNeedRM)
     576{
     577    IEMOP_MNEMONIC(InvalidNeedRM, "InvalidNeedRM");
    578578    if (pVCpu->iem.s.enmCpuVendor == CPUMCPUVENDOR_INTEL)
    579579    {
    580         uint8_t bRm;  IEM_OPCODE_GET_NEXT_U8(&bRm); RT_NOREF(bRm);
     580        uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); RT_NOREF(bRm);
    581581#ifndef TST_IEM_CHECK_MC
    582582        if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     
    588588        }
    589589#endif
     590        IEMOP_HLP_DONE_DECODING();
     591    }
     592    return IEMOP_RAISE_INVALID_OPCODE();
     593}
     594
     595
     596/** Invalid opcode where intel requires Mod R/M sequence and 8-byte
     597 *  immediate. */
     598FNIEMOP_DEF(iemOp_InvalidNeedRMImm8)
     599{
     600    IEMOP_MNEMONIC(InvalidNeedRMImm8, "InvalidNeedRMImm8");
     601    if (pVCpu->iem.s.enmCpuVendor == CPUMCPUVENDOR_INTEL)
     602    {
     603        uint8_t bRm;  IEM_OPCODE_GET_NEXT_U8(&bRm);  RT_NOREF(bRm);
     604#ifndef TST_IEM_CHECK_MC
     605        if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     606        {
     607            RTGCPTR      GCPtrEff;
     608            VBOXSTRICTRC rcStrict = iemOpHlpCalcRmEffAddr(pVCpu, bRm, 0, &GCPtrEff);
     609            if (rcStrict != VINF_SUCCESS)
     610                return rcStrict;
     611        }
     612#endif
    590613        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); RT_NOREF(bImm);
    591614        IEMOP_HLP_DONE_DECODING();
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r65775 r65778  
    29432943{
    29442944    /** @todo decode imm8? */
    2945     /* /0 */ IEMOP_X4(iemOp_InvalidWithRM),
    2946     /* /1 */ IEMOP_X4(iemOp_InvalidWithRM),
    2947     /* /2 */ iemOp_Grp12_psrlw_Nq_Ib,           iemOp_Grp12_vpsrlw_Hx_Ux_Ib,    iemOp_InvalidWithRM, iemOp_InvalidWithRM,
    2948     /* /3 */ IEMOP_X4(iemOp_InvalidWithRM),
    2949     /* /4 */ iemOp_Grp12_psraw_Nq_Ib,           iemOp_Grp12_vpsraw_Hx_Ux_Ib,    iemOp_InvalidWithRM, iemOp_InvalidWithRM,
    2950     /* /5 */ IEMOP_X4(iemOp_InvalidWithRM),
    2951     /* /6 */ iemOp_Grp12_psllw_Nq_Ib,           iemOp_Grp12_vpsllw_Hx_Ux_Ib,    iemOp_InvalidWithRM, iemOp_InvalidWithRM,
    2952     /* /7 */ IEMOP_X4(iemOp_InvalidWithRM)
     2945    /* /0 */ IEMOP_X4(iemOp_InvalidWithRMNeedImm8),
     2946    /* /1 */ IEMOP_X4(iemOp_InvalidWithRMNeedImm8),
     2947    /* /2 */ iemOp_Grp12_psrlw_Nq_Ib,   iemOp_Grp12_vpsrlw_Hx_Ux_Ib, iemOp_InvalidWithRMNeedImm8, iemOp_InvalidWithRMNeedImm8,
     2948    /* /3 */ IEMOP_X4(iemOp_InvalidWithRMNeedImm8),
     2949    /* /4 */ iemOp_Grp12_psraw_Nq_Ib,   iemOp_Grp12_vpsraw_Hx_Ux_Ib, iemOp_InvalidWithRMNeedImm8, iemOp_InvalidWithRMNeedImm8,
     2950    /* /5 */ IEMOP_X4(iemOp_InvalidWithRMNeedImm8),
     2951    /* /6 */ iemOp_Grp12_psllw_Nq_Ib,   iemOp_Grp12_vpsllw_Hx_Ux_Ib, iemOp_InvalidWithRMNeedImm8, iemOp_InvalidWithRMNeedImm8,
     2952    /* /7 */ IEMOP_X4(iemOp_InvalidWithRMNeedImm8)
    29532953};
    29542954
     
    29622962        return FNIEMOP_CALL_1(g_apfnGroup12RegReg[  ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) * 4
    29632963                                                  + pVCpu->iem.s.idxPrefix], bRm);
    2964     /** @todo decode SIB, disp, Ib? */
    2965     return IEMOP_RAISE_INVALID_OPCODE();
     2964    return FNIEMOP_CALL_1(iemOp_InvalidWithRMNeedImm8, bRm);
    29662965}
    29672966
     
    29922991{
    29932992    /** @todo decode imm8? */
    2994     /* /0 */ IEMOP_X4(iemOp_InvalidWithRM),
    2995     /* /1 */ IEMOP_X4(iemOp_InvalidWithRM),
    2996     /* /2 */ iemOp_Grp13_psrld_Nq_Ib,           iemOp_Grp13_vpsrld_Hx_Ux_Ib,    iemOp_InvalidWithRM, iemOp_InvalidWithRM,
    2997     /* /3 */ IEMOP_X4(iemOp_InvalidWithRM),
    2998     /* /4 */ iemOp_Grp13_psrad_Nq_Ib,           iemOp_Grp13_vpsrad_Hx_Ux_Ib,    iemOp_InvalidWithRM, iemOp_InvalidWithRM,
    2999     /* /5 */ IEMOP_X4(iemOp_InvalidWithRM),
    3000     /* /6 */ iemOp_Grp13_pslld_Nq_Ib,           iemOp_Grp13_vpslld_Hx_Ux_Ib,    iemOp_InvalidWithRM, iemOp_InvalidWithRM,
    3001     /* /7 */ IEMOP_X4(iemOp_InvalidWithRM)
     2993    /* /0 */ IEMOP_X4(iemOp_InvalidWithRMNeedImm8),
     2994    /* /1 */ IEMOP_X4(iemOp_InvalidWithRMNeedImm8),
     2995    /* /2 */ iemOp_Grp13_psrld_Nq_Ib,   iemOp_Grp13_vpsrld_Hx_Ux_Ib, iemOp_InvalidWithRMNeedImm8, iemOp_InvalidWithRMNeedImm8,
     2996    /* /3 */ IEMOP_X4(iemOp_InvalidWithRMNeedImm8),
     2997    /* /4 */ iemOp_Grp13_psrad_Nq_Ib,   iemOp_Grp13_vpsrad_Hx_Ux_Ib, iemOp_InvalidWithRMNeedImm8, iemOp_InvalidWithRMNeedImm8,
     2998    /* /5 */ IEMOP_X4(iemOp_InvalidWithRMNeedImm8),
     2999    /* /6 */ iemOp_Grp13_pslld_Nq_Ib,   iemOp_Grp13_vpslld_Hx_Ux_Ib, iemOp_InvalidWithRMNeedImm8, iemOp_InvalidWithRMNeedImm8,
     3000    /* /7 */ IEMOP_X4(iemOp_InvalidWithRMNeedImm8)
    30023001};
    30033002
     
    30103009        return FNIEMOP_CALL_1(g_apfnGroup13RegReg[ ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) * 4
    30113010                                                  + pVCpu->iem.s.idxPrefix], bRm);
    3012     /** @todo decode SIB, disp, Ib? */
    3013     return IEMOP_RAISE_INVALID_OPCODE();
     3011    return FNIEMOP_CALL_1(iemOp_InvalidWithRMNeedImm8, bRm);
    30143012}
    30153013
     
    30393037{
    30403038    /** @todo decode imm8? */
    3041     /* /0 */ IEMOP_X4(iemOp_InvalidWithRM),
    3042     /* /1 */ IEMOP_X4(iemOp_InvalidWithRM),
    3043     /* /2 */ iemOp_Grp14_psrlq_Nq_Ib,           iemOp_Grp14_vpsrlq_Hx_Ux_Ib,    iemOp_InvalidWithRM, iemOp_InvalidWithRM,
    3044     /* /3 */ iemOp_InvalidWithRM,               iemOp_Grp14_vpsrldq_Hx_Ux_Ib,   iemOp_InvalidWithRM, iemOp_InvalidWithRM,
    3045     /* /4 */ IEMOP_X4(iemOp_InvalidWithRM),
    3046     /* /5 */ IEMOP_X4(iemOp_InvalidWithRM),
    3047     /* /6 */ iemOp_Grp14_psllq_Nq_Ib,           iemOp_Grp14_vpsllq_Hx_Ux_Ib,    iemOp_InvalidWithRM, iemOp_InvalidWithRM,
    3048     /* /7 */ iemOp_InvalidWithRM,               iemOp_Grp14_vpslldq_Hx_Ux_Ib,   iemOp_InvalidWithRM, iemOp_InvalidWithRM,
     3039    /* /0 */ IEMOP_X4(iemOp_InvalidWithRMNeedImm8),
     3040    /* /1 */ IEMOP_X4(iemOp_InvalidWithRMNeedImm8),
     3041    /* /2 */ iemOp_Grp14_psrlq_Nq_Ib,     iemOp_Grp14_vpsrlq_Hx_Ux_Ib,  iemOp_InvalidWithRMNeedImm8, iemOp_InvalidWithRMNeedImm8,
     3042    /* /3 */ iemOp_InvalidWithRMNeedImm8, iemOp_Grp14_vpsrldq_Hx_Ux_Ib, iemOp_InvalidWithRMNeedImm8, iemOp_InvalidWithRMNeedImm8,
     3043    /* /4 */ IEMOP_X4(iemOp_InvalidWithRMNeedImm8),
     3044    /* /5 */ IEMOP_X4(iemOp_InvalidWithRMNeedImm8),
     3045    /* /6 */ iemOp_Grp14_psllq_Nq_Ib,     iemOp_Grp14_vpsllq_Hx_Ux_Ib,  iemOp_InvalidWithRMNeedImm8, iemOp_InvalidWithRMNeedImm8,
     3046    /* /7 */ iemOp_InvalidWithRMNeedImm8, iemOp_Grp14_vpslldq_Hx_Ux_Ib, iemOp_InvalidWithRMNeedImm8, iemOp_InvalidWithRMNeedImm8,
    30493047};
    30503048
     
    30583056        return FNIEMOP_CALL_1(g_apfnGroup14RegReg[ ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) * 4
    30593057                                                  + pVCpu->iem.s.idxPrefix], bRm);
    3060     /** @todo decode SIB, disp, Ib? */
    3061     return IEMOP_RAISE_INVALID_OPCODE();
     3058    return FNIEMOP_CALL_1(iemOp_InvalidWithRMNeedImm8, bRm);
    30623059}
    30633060
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette