VirtualBox

Changeset 101952 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Nov 8, 2023 2:17:53 AM (13 months ago)
Author:
vboxsync
Message:

VMM/IEM: Corrected wrong immediate manipulation using locals (and IEM_MC_ASSIGN) in iemOp_insertps_Vdq_UdqMd_Ib. bugref:10371

File:
1 edited

Legend:

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

    r101387 r101952  
    835835         */
    836836        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
    837         IEM_MC_BEGIN(0, 3, IEM_MC_F_NOT_286_OR_OLDER, 0);
     837        IEM_MC_BEGIN(0, 1, IEM_MC_F_NOT_286_OR_OLDER, 0);
    838838        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse41);
     839        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     840        IEM_MC_PREPARE_SSE_USAGE();
     841
     842        IEM_MC_LOCAL(uint32_t, uSrc);
     843        IEM_MC_FETCH_XREG_U32(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm), (bImm >> 6) & 3);
     844        IEM_MC_CLEAR_XREG_U32_MASK(IEM_GET_MODRM_REG(pVCpu, bRm), bImm);
     845        IEM_MC_STORE_XREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), (bImm >> 4) & 3, uSrc);
     846
     847        IEM_MC_ADVANCE_RIP_AND_FINISH();
     848        IEM_MC_END();
     849    }
     850    else
     851    {
     852        /*
     853         * XMM, [mem32].
     854         */
     855        IEM_MC_BEGIN(0, 2, IEM_MC_F_NOT_286_OR_OLDER, 0);
     856        IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
     857        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
     858        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     859
     860        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse41);
     861        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     862        IEM_MC_PREPARE_SSE_USAGE();
     863
    839864        IEM_MC_LOCAL(uint32_t,  uSrc);
    840         IEM_MC_LOCAL(uint8_t,   uSrcSel);
    841         IEM_MC_LOCAL(uint8_t,   uDstSel);
    842         IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    843         IEM_MC_PREPARE_SSE_USAGE();
    844         IEM_MC_ASSIGN(uSrcSel, bImm);
    845         IEM_MC_SHR_LOCAL_U8(uSrcSel, 6);
    846         IEM_MC_AND_LOCAL_U8(uSrcSel, 3);
    847         IEM_MC_FETCH_XREG_U32(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm), uSrcSel);
    848         IEM_MC_ASSIGN(uDstSel, bImm);
    849         IEM_MC_SHR_LOCAL_U8(uDstSel, 4);
    850         IEM_MC_AND_LOCAL_U8(uDstSel, 3);
     865        IEM_MC_FETCH_MEM_U32(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    851866        IEM_MC_CLEAR_XREG_U32_MASK(IEM_GET_MODRM_REG(pVCpu, bRm), bImm);
    852         IEM_MC_STORE_XREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), uDstSel, uSrc);
    853         IEM_MC_ADVANCE_RIP_AND_FINISH();
    854         IEM_MC_END();
    855     }
    856     else
    857     {
    858         /*
    859          * XMM, [mem32].
    860          */
    861         IEM_MC_BEGIN(0, 3, IEM_MC_F_NOT_286_OR_OLDER, 0);
    862         IEM_MC_LOCAL(uint32_t,  uSrc);
    863         IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
    864         IEM_MC_LOCAL(uint8_t,   uDstSel);
    865 
    866         IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
    867         uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
    868         IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse41);
    869         IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    870         IEM_MC_PREPARE_SSE_USAGE();
    871 
    872         IEM_MC_FETCH_MEM_U32(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    873         IEM_MC_ASSIGN(uDstSel, bImm);
    874         IEM_MC_SHR_LOCAL_U8(uDstSel, 4);
    875         IEM_MC_AND_LOCAL_U8(uDstSel, 3);
    876         IEM_MC_CLEAR_XREG_U32_MASK(IEM_GET_MODRM_REG(pVCpu, bRm), bImm);
    877         IEM_MC_STORE_XREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), uDstSel, uSrc);
     867        IEM_MC_STORE_XREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), (bImm >> 4) & 3, uSrc);
    878868        IEM_MC_ADVANCE_RIP_AND_FINISH();
    879869        IEM_MC_END();
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