VirtualBox

Changeset 96435 in vbox


Ignore:
Timestamp:
Aug 23, 2022 10:40:19 AM (2 years ago)
Author:
vboxsync
Message:

VMM/IEM: Implement [v]lddqu instructions, bugref:9898

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/vm.h

    r96407 r96435  
    146146        struct IEMCPU       s;
    147147#endif
    148         uint8_t             padding[28736];     /* multiple of 64 */
     148        uint8_t             padding[32832];     /* multiple of 64 */
    149149    } iem;
    150150
     
    327327    } em;
    328328
    329     /** Align the structure size on 16384 boundrary for arm64 purposes. */
    330     uint8_t                 abStructPadding[4096];
    331329} VMCPU;
    332330
    333331
    334332#ifndef VBOX_FOR_DTRACE_LIB
     333/* Make sure the structure size is aligned on a 16384 boundary for arm64 purposes. */
    335334AssertCompileSizeAlignment(VMCPU, 16384);
    336335
  • trunk/include/VBox/vmm/vm.mac

    r96407 r96435  
    5858
    5959    alignb 64
    60     .iem                    resb 28736
     60    .iem                    resb 32832
    6161
    6262    alignb 64
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r96407 r96435  
    1131611316/*  Opcode      0x0f 0xf0 - invalid */
    1131711317/*  Opcode 0x66 0x0f 0xf0 - invalid */
     11318
     11319
    1131811320/** Opcode 0xf2 0x0f 0xf0 - lddqu Vx, Mx */
    11319 FNIEMOP_STUB(iemOp_lddqu_Vx_Mx);
     11321FNIEMOP_DEF(iemOp_lddqu_Vx_Mx)
     11322{
     11323    IEMOP_MNEMONIC2(RM_MEM, LDDQU, lddqu, Vdq_WO, Mx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
     11324    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     11325    if (IEM_IS_MODRM_REG_MODE(bRm))
     11326    {
     11327        /*
     11328         * Register, register - (not implemented, assuming it raises \#UD).
     11329         */
     11330        return IEMOP_RAISE_INVALID_OPCODE();
     11331    }
     11332    else
     11333    {
     11334        /*
     11335         * Register, memory.
     11336         */
     11337        IEM_MC_BEGIN(0, 2);
     11338        IEM_MC_LOCAL(RTUINT128U, u128Tmp);
     11339        IEM_MC_LOCAL(RTGCPTR,    GCPtrEffSrc);
     11340
     11341        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     11342        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     11343        IEM_MC_MAYBE_RAISE_SSE3_RELATED_XCPT();
     11344        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
     11345        IEM_MC_FETCH_MEM_U128(u128Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     11346        IEM_MC_STORE_XREG_U128(IEM_GET_MODRM_REG(pVCpu, bRm), u128Tmp);
     11347
     11348        IEM_MC_ADVANCE_RIP();
     11349        IEM_MC_END();
     11350    }
     11351    return VINF_SUCCESS;
     11352}
    1132011353
    1132111354
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r96407 r96435  
    46154615/*  Opcode VEX.0F 0xf0 - invalid */
    46164616/*  Opcode VEX.66.0F 0xf0 - invalid */
     4617
     4618
    46174619/** Opcode VEX.F2.0F 0xf0 - vlddqu Vx, Mx */
    4618 FNIEMOP_STUB(iemOp_vlddqu_Vx_Mx);
     4620FNIEMOP_DEF(iemOp_vlddqu_Vx_Mx)
     4621{
     4622    IEMOP_MNEMONIC2(VEX_RM_MEM, VLDDQU, vlddqu, Vx_WO, Mx, DISOPTYPE_HARMLESS | DISOPTYPE_AVX, IEMOPHINT_IGNORES_OP_SIZES);
     4623    Assert(pVCpu->iem.s.uVexLength <= 1);
     4624    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     4625    if (IEM_IS_MODRM_REG_MODE(bRm))
     4626    {
     4627        /*
     4628         * Register, register - (not implemented, assuming it raises \#UD).
     4629         */
     4630        return IEMOP_RAISE_INVALID_OPCODE();
     4631    }
     4632    else if (pVCpu->iem.s.uVexLength == 0)
     4633    {
     4634        /*
     4635         * Register, memory128.
     4636         */
     4637        IEM_MC_BEGIN(0, 2);
     4638        IEM_MC_LOCAL(RTUINT128U, u128Tmp);
     4639        IEM_MC_LOCAL(RTGCPTR,    GCPtrEffSrc);
     4640
     4641        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     4642        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     4643        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     4644        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     4645
     4646        IEM_MC_FETCH_MEM_U128(u128Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     4647        IEM_MC_STORE_YREG_U128_ZX_VLMAX(IEM_GET_MODRM_REG(pVCpu, bRm), u128Tmp);
     4648
     4649        IEM_MC_ADVANCE_RIP();
     4650        IEM_MC_END();
     4651    }
     4652    else
     4653    {
     4654        /*
     4655         * Register, memory256.
     4656         */
     4657        IEM_MC_BEGIN(0, 2);
     4658        IEM_MC_LOCAL(RTUINT256U, u256Tmp);
     4659        IEM_MC_LOCAL(RTGCPTR,    GCPtrEffSrc);
     4660
     4661        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     4662        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     4663        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     4664        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     4665
     4666        IEM_MC_FETCH_MEM_U256(u256Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     4667        IEM_MC_STORE_YREG_U256_ZX_VLMAX(IEM_GET_MODRM_REG(pVCpu, bRm), u256Tmp);
     4668
     4669        IEM_MC_ADVANCE_RIP();
     4670        IEM_MC_END();
     4671    }
     4672    return VINF_SUCCESS;
     4673}
     4674
    46194675
    46204676/*  Opcode VEX.0F 0xf1 - invalid */
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