VirtualBox

Changeset 102331 in vbox for trunk


Ignore:
Timestamp:
Nov 27, 2023 3:48:50 PM (15 months ago)
Author:
vboxsync
Message:

VMM/IEM: IEM_MC_REF_XXX must NOT have any IEM_MC_FETCH_XXX following them or the guest register shadowing goes bad. bugref:10371

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

Legend:

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

    r102077 r102331  
    90049004        IEM_MC_ARG(uint8_t,     cShiftArg,  1);
    90059005        IEM_MC_ARG(uint32_t *,  pEFlags,    2);
     9006        IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    90069007        IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm));
    9007         IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    90089008        IEM_MC_REF_EFLAGS(pEFlags);
    90099009        IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags);
     
    90689068                IEM_MC_ARG(uint8_t,         cShiftArg,  1);
    90699069                IEM_MC_ARG(uint32_t *,      pEFlags,    2);
     9070                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    90709071                IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm));
    9071                 IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    90729072                IEM_MC_REF_EFLAGS(pEFlags);
    90739073                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags);
     
    90829082                IEM_MC_ARG(uint8_t,         cShiftArg,  1);
    90839083                IEM_MC_ARG(uint32_t *,      pEFlags,    2);
     9084                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    90849085                IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm));
    9085                 IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    90869086                IEM_MC_REF_EFLAGS(pEFlags);
    90879087                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags);
     
    90979097                IEM_MC_ARG(uint8_t,         cShiftArg,  1);
    90989098                IEM_MC_ARG(uint32_t *,      pEFlags,    2);
     9099                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    90999100                IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm));
    9100                 IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    91019101                IEM_MC_REF_EFLAGS(pEFlags);
    91029102                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags);
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstPython.py

    r102313 r102331  
    26922692        return "Block is missing IEMOP_HLP_DONE_*DECODING* invocation!";
    26932693
     2694    def checkForFetchAfterRef(self, aoStmts, asRegRefClasses):
     2695        """
     2696        Checks that the register references are placed after register fetches
     2697        from the same register class.
     2698        Returns None on success, error string on failure.
     2699
     2700        Example:
     2701                SHL CH, CL
     2702
     2703        If the CH reference is created first, the fetching of CL will cause the
     2704        RCX guest register to have an active shadow register when it's being
     2705        updated.  The shadow register will then be stale after the SHL operation
     2706        completes, without us noticing.
     2707
     2708        It's easier to ensure we've got correct code than complicating the
     2709        recompiler code with safeguards here.
     2710        """
     2711        for iStmt, oStmt in enumerate(aoStmts):
     2712            if not oStmt.isCppStmt():
     2713                offRef = oStmt.sName.find("_REF_");
     2714                if offRef > 0:
     2715                    if oStmt.sName not in ('IEM_MC_REF_LOCAL', ):
     2716                        if oStmt.sName in ('IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80',
     2717                                           'IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80',
     2718                                           'IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80_FIRST',):
     2719                            sClass = 'FPUREG';
     2720                        else:
     2721                            offUnderscore = oStmt.sName.find('_', offRef + 5);
     2722                            if offUnderscore > 0:
     2723                                assert offUnderscore > offRef;
     2724                                sClass = oStmt.sName[offRef + 5 : offUnderscore];
     2725                            else:
     2726                                sClass = oStmt.sName[offRef + 5];
     2727                        asRegRefClasses[sClass] = True;
     2728                else:
     2729                    offFetch = oStmt.sName.find("_FETCH_");
     2730                    if offFetch > 0:
     2731                        sClass = oStmt.sName[offFetch + 7 : ];
     2732                        if not sClass.startswith("MEM"):
     2733                            offUnderscore = sClass.find('_');
     2734                            if offUnderscore >= 0:
     2735                                assert offUnderscore > 0;
     2736                                sClass = sClass[:offUnderscore];
     2737                            if sClass in asRegRefClasses:
     2738                                return "statement #%u: %s following REF! That'll mess up guest register shadowing" \
     2739                                     % (iStmt + 1, oStmt.sName,);
     2740
     2741            # Go into branches.
     2742            if isinstance(oStmt, McStmtCond):
     2743                sRet = self.checkForFetchAfterRef(oStmt.aoIfBranch, asRegRefClasses);
     2744                if sRet:
     2745                    return sRet;
     2746                sRet = self.checkForFetchAfterRef(oStmt.aoElseBranch, asRegRefClasses);
     2747                if sRet:
     2748                    return sRet;
     2749        return None;
     2750
    26942751    def check(self):
    26952752        """
     
    27052762
    27062763        sRet = self.checkForDoneDecoding(aoStmts);
     2764        if sRet:
     2765            asRet.append(sRet);
     2766
     2767        sRet = self.checkForFetchAfterRef(aoStmts, {});
    27072768        if sRet:
    27082769            asRet.append(sRet);
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstThree0f38.cpp.h

    r102011 r102331  
    18141814        IEM_MC_ARG(uint32_t *,          puDst, 0);
    18151815        IEM_MC_ARG(uint8_t,             uSrc,  1);
     1816        IEM_MC_FETCH_GREG_U8(uSrc,  IEM_GET_MODRM_RM(pVCpu, bRm));
    18161817        IEM_MC_REF_GREG_U32(puDst,  IEM_GET_MODRM_REG(pVCpu, bRm));
    1817         IEM_MC_FETCH_GREG_U8(uSrc,  IEM_GET_MODRM_RM(pVCpu, bRm));
    18181818        IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fSse42, iemAImpl_crc32_u8, iemAImpl_crc32_u8_fallback), puDst, uSrc);
    18191819        IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm));
     
    19331933                IEM_MC_ARG(uint32_t *,          puDst, 0);
    19341934                IEM_MC_ARG(uint16_t,            uSrc,  1);
     1935                IEM_MC_FETCH_GREG_U16(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
    19351936                IEM_MC_REF_GREG_U32(puDst,  IEM_GET_MODRM_REG(pVCpu, bRm));
    1936                 IEM_MC_FETCH_GREG_U16(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
    19371937                IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fSse42, iemAImpl_crc32_u16, iemAImpl_crc32_u16_fallback),
    19381938                                         puDst, uSrc);
     
    19471947                IEM_MC_ARG(uint32_t *,          puDst, 0);
    19481948                IEM_MC_ARG(uint32_t,            uSrc,  1);
     1949                IEM_MC_FETCH_GREG_U32(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
    19491950                IEM_MC_REF_GREG_U32(puDst,  IEM_GET_MODRM_REG(pVCpu, bRm));
    1950                 IEM_MC_FETCH_GREG_U32(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
    19511951                IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fSse42, iemAImpl_crc32_u32, iemAImpl_crc32_u32_fallback),
    19521952                                         puDst, uSrc);
     
    19611961                IEM_MC_ARG(uint32_t *,          puDst, 0);
    19621962                IEM_MC_ARG(uint64_t,            uSrc,  1);
     1963                IEM_MC_FETCH_GREG_U64(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
    19631964                IEM_MC_REF_GREG_U32(puDst,  IEM_GET_MODRM_REG(pVCpu, bRm));
    1964                 IEM_MC_FETCH_GREG_U64(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
    19651965                IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fSse42, iemAImpl_crc32_u64, iemAImpl_crc32_u64_fallback),
    19661966                                         puDst, uSrc);
     
    20802080                IEM_MC_ARG(uint32_t *,      pEFlags,                1); \
    20812081                IEM_MC_ARG(uint64_t,        u64Src,                 2); \
     2082                IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    20822083                IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    2083                 IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    20842084                IEM_MC_REF_EFLAGS(pEFlags); \
    20852085                IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAdx, iemAImpl_## a_Variant ##_u64, iemAImpl_## a_Variant ##_u64_fallback), \
     
    21152115                IEM_MC_ARG(uint32_t *,      pEFlags,                1); \
    21162116                IEM_MC_ARG(uint32_t,        u32Src,                 2); \
     2117                IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    21172118                IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    2118                 IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    21192119                IEM_MC_REF_EFLAGS(pEFlags); \
    21202120                IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAdx, iemAImpl_## a_Variant ##_u32, iemAImpl_## a_Variant ##_u32_fallback), \
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstThree0f3a.cpp.h

    r102012 r102331  
    486486        IEM_MC_PREPARE_FPU_USAGE();
    487487        IEM_MC_FPU_TO_MMX_MODE();
     488        IEM_MC_FETCH_MREG_U64(uSrc, IEM_GET_MODRM_RM_8(bRm));
    488489        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
    489         IEM_MC_FETCH_MREG_U64(uSrc, IEM_GET_MODRM_RM_8(bRm));
    490490        IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_palignr_u64, iemAImpl_palignr_u64_fallback),
    491491                                 pDst, uSrc, bImmArg);
     
    12681268            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    12691269            IEM_MC_PREPARE_SSE_USAGE();
     1270            IEM_MC_FETCH_XREG_PAIR_U128_AND_RAX_RDX_U64(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    12701271            IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX);
    1271             IEM_MC_FETCH_XREG_PAIR_U128_AND_RAX_RDX_U64(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    12721272            IEM_MC_REF_EFLAGS(pEFlags);
    12731273            IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse42,
     
    13281328            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    13291329            IEM_MC_PREPARE_SSE_USAGE();
     1330            IEM_MC_FETCH_XREG_PAIR_U128_AND_EAX_EDX_U32_SX_U64(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    13301331            IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX);
    1331             IEM_MC_FETCH_XREG_PAIR_U128_AND_EAX_EDX_U32_SX_U64(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    13321332            IEM_MC_REF_EFLAGS(pEFlags);
    13331333            IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse42,
     
    14581458        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    14591459        IEM_MC_PREPARE_SSE_USAGE();
     1460        IEM_MC_FETCH_XREG_PAIR_U128(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    14601461        IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX);
    1461         IEM_MC_FETCH_XREG_PAIR_U128(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    14621462        IEM_MC_REF_EFLAGS(pEFlags);
    14631463        IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse42,
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstTwoByte0f.cpp.h

    r102029 r102331  
    95679567
    95689568                IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_REG(pVCpu, bRm));
     9569                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    95699570                IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm));
    9570                 IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    95719571                IEM_MC_REF_EFLAGS(pEFlags);
    95729572                IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU16, pu16Dst, u16Src, cShiftArg, pEFlags);
     
    95859585
    95869586                IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_REG(pVCpu, bRm));
     9587                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    95879588                IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm));
    9588                 IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    95899589                IEM_MC_REF_EFLAGS(pEFlags);
    95909590                IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU32, pu32Dst, u32Src, cShiftArg, pEFlags);
     
    96049604
    96059605                IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm));
     9606                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    96069607                IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm));
    9607                 IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    96089608                IEM_MC_REF_EFLAGS(pEFlags);
    96099609                IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU64, pu64Dst, u64Src, cShiftArg, pEFlags);
     
    1035810358                IEM_MC_ARG(uint32_t *,      pEFlags,                3);
    1035910359
     10360#ifndef RT_ARCH_X86
     10361                IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm));
     10362#endif
    1036010363                IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm));
    1036110364                IEM_MC_REF_GREG_U64(pu64Rax, X86_GREG_xAX);
     
    1036810371                    IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64_locked, pu64Dst, pu64Rax, pu64Src, pEFlags);
    1036910372#else
    10370                 IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm));
    1037110373                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    1037210374                    IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64, pu64Dst, pu64Rax, u64Src, pEFlags);
     
    1037710379                IEM_MC_ADVANCE_RIP_AND_FINISH();
    1037810380                IEM_MC_END();
     10381                break;
    1037910382                break;
    1038010383
     
    1046510468                IEMOP_HLP_DONE_DECODING();
    1046610469                IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10470#ifndef RT_ARCH_X86
     10471                IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm));
     10472#endif
    1046710473                IEM_MC_FETCH_GREG_U64(u64Rax, X86_GREG_xAX);
    1046810474                IEM_MC_FETCH_EFLAGS(EFlags);
     
    1047510481                    IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64_locked, pu64Dst, pu64Rax, pu64Src, pEFlags);
    1047610482#else
    10477                 IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm));
    1047810483                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    1047910484                    IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64, pu64Dst, pu64Rax, u64Src, pEFlags);
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap2.cpp.h

    r101850 r102331  
    574574            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); \
    575575            IEM_MC_PREPARE_AVX_USAGE(); \
     576            IEM_MC_FETCH_XREG_U64(uSrc,  IEM_GET_MODRM_RM(pVCpu, bRm), 0 /* a_iQword*/); \
    576577            IEM_MC_REF_XREG_U128(puDst,  IEM_GET_MODRM_REG(pVCpu, bRm)); \
    577             IEM_MC_FETCH_XREG_U64(uSrc,  IEM_GET_MODRM_RM(pVCpu, bRm), 0 /* a_iQword*/); \
    578578            IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_ ## a_Instr ## _u128, \
    579579                                                                 iemAImpl_## a_Instr ## _u128_fallback), \
     
    619619            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); \
    620620            IEM_MC_PREPARE_AVX_USAGE(); \
     621            IEM_MC_FETCH_MEM_U ## a_SrcWidth (uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
    621622            IEM_MC_REF_XREG_U128(puDst,  IEM_GET_MODRM_REG(pVCpu, bRm)); \
    622             IEM_MC_FETCH_MEM_U ## a_SrcWidth (uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
    623623            IEM_MC_CALL_VOID_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fAvx2, iemAImpl_ ## a_Instr ## _u128, \
    624624                                                                 iemAImpl_ ## a_Instr ## _u128_fallback), \
     
    16511651            IEM_MC_ARG(uint64_t,            uSrc2,   2);
    16521652            IEM_MC_ARG(uint32_t *,          pEFlags, 3);
    1653             IEM_MC_REF_GREG_U64(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm));
    16541653            IEM_MC_FETCH_GREG_U64(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu));
    16551654            IEM_MC_FETCH_GREG_U64(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm));
     1655            IEM_MC_REF_GREG_U64(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm));
    16561656            IEM_MC_REF_EFLAGS(pEFlags);
    16571657            IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fBmi1, iemAImpl_andn_u64, iemAImpl_andn_u64_fallback),
     
    16681668            IEM_MC_ARG(uint32_t,            uSrc2,   2);
    16691669            IEM_MC_ARG(uint32_t *,          pEFlags, 3);
    1670             IEM_MC_REF_GREG_U32(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm));
    16711670            IEM_MC_FETCH_GREG_U32(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu));
    16721671            IEM_MC_FETCH_GREG_U32(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm));
     1672            IEM_MC_REF_GREG_U32(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm));
    16731673            IEM_MC_REF_EFLAGS(pEFlags);
    16741674            IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fBmi1, iemAImpl_andn_u32, iemAImpl_andn_u32_fallback),
     
    17511751            IEM_MC_ARG(uint64_t,            uSrc,    1); \
    17521752            IEM_MC_ARG(uint32_t *,          pEFlags, 2); \
     1753            IEM_MC_FETCH_GREG_U64(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    17531754            IEM_MC_REF_GREG_U64(pDst,   IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
    1754             IEM_MC_FETCH_GREG_U64(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    17551755            IEM_MC_REF_EFLAGS(pEFlags); \
    17561756            IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fBmi1, iemAImpl_ ## a_Instr ## _u64, \
     
    17661766            IEM_MC_ARG(uint32_t,            uSrc,    1); \
    17671767            IEM_MC_ARG(uint32_t *,          pEFlags, 2); \
     1768            IEM_MC_FETCH_GREG_U32(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    17681769            IEM_MC_REF_GREG_U32(pDst,   IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
    1769             IEM_MC_FETCH_GREG_U32(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    17701770            IEM_MC_REF_EFLAGS(pEFlags); \
    17711771            IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fBmi1, iemAImpl_ ## a_Instr ## _u32, \
     
    19031903            IEM_MC_ARG(uint64_t,            uSrc2,   2); \
    19041904            IEM_MC_ARG(uint32_t *,          pEFlags, 3); \
    1905             IEM_MC_REF_GREG_U64(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm)); \
    19061905            IEM_MC_FETCH_GREG_U64(uSrc1, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    19071906            IEM_MC_FETCH_GREG_U64(uSrc2, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
     1907            IEM_MC_REF_GREG_U64(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm)); \
    19081908            IEM_MC_REF_EFLAGS(pEFlags); \
    19091909            IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(a_fFeatureMember, iemAImpl_ ## a_Instr ## _u64, \
     
    19211921            IEM_MC_ARG(uint32_t,            uSrc2,   2); \
    19221922            IEM_MC_ARG(uint32_t *,          pEFlags, 3); \
    1923             IEM_MC_REF_GREG_U32(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm)); \
    19241923            IEM_MC_FETCH_GREG_U32(uSrc1, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    19251924            IEM_MC_FETCH_GREG_U32(uSrc2, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
     1925            IEM_MC_REF_GREG_U32(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm)); \
    19261926            IEM_MC_REF_EFLAGS(pEFlags); \
    19271927            IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(a_fFeatureMember, iemAImpl_ ## a_Instr ## _u32, \
     
    19981998            IEM_MC_ARG(uint64_t,            uSrc1,   1); \
    19991999            IEM_MC_ARG(uint64_t,            uSrc2,   2); \
    2000             IEM_MC_REF_GREG_U64(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm)); \
    20012000            IEM_MC_FETCH_GREG_U64(uSrc1, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    20022001            IEM_MC_FETCH_GREG_U64(uSrc2, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
     2002            IEM_MC_REF_GREG_U64(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm)); \
    20032003            IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(a_fFeatureMember, iemAImpl_ ## a_Instr ## _u64, \
    20042004                                                                 iemAImpl_ ## a_Instr ## _u64_fallback), pDst, uSrc1, uSrc2); \
     
    20132013            IEM_MC_ARG(uint32_t,            uSrc1,   1); \
    20142014            IEM_MC_ARG(uint32_t,            uSrc2,   2); \
    2015             IEM_MC_REF_GREG_U32(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm)); \
    20162015            IEM_MC_FETCH_GREG_U32(uSrc1, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    20172016            IEM_MC_FETCH_GREG_U32(uSrc2, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
     2017            IEM_MC_REF_GREG_U32(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm)); \
    20182018            IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(a_fFeatureMember, iemAImpl_ ## a_Instr ## _u32, \
    20192019                                                                 iemAImpl_ ## a_Instr ## _u32_fallback), pDst, uSrc1, uSrc2); \
     
    20902090            IEM_MC_ARG(uint64_t,            uSrc1,   1); \
    20912091            IEM_MC_ARG(uint64_t,            uSrc2,   2); \
    2092             IEM_MC_REF_GREG_U64(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm)); \
    20932092            IEM_MC_FETCH_GREG_U64(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
    20942093            IEM_MC_FETCH_GREG_U64(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm)); \
     2094            IEM_MC_REF_GREG_U64(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm)); \
    20952095            IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(a_fFeatureMember, \
    20962096                                                                 iemAImpl_ ## a_Instr ## _u64, \
     
    21062106            IEM_MC_ARG(uint32_t,            uSrc1,   1); \
    21072107            IEM_MC_ARG(uint32_t,            uSrc2,   2); \
    2108             IEM_MC_REF_GREG_U32(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm)); \
    21092108            IEM_MC_FETCH_GREG_U32(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
    21102109            IEM_MC_FETCH_GREG_U32(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm)); \
     2110            IEM_MC_REF_GREG_U32(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm)); \
    21112111            IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(a_fFeatureMember, \
    21122112                                                                 iemAImpl_ ## a_Instr ## _u32, \
     
    22022202            IEM_MC_ARG(uint64_t,            uSrc1,   2);
    22032203            IEM_MC_ARG(uint64_t,            uSrc2,   3);
     2204            IEM_MC_FETCH_GREG_U64(uSrc1, X86_GREG_xDX);
     2205            IEM_MC_FETCH_GREG_U64(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm));
    22042206            IEM_MC_REF_GREG_U64(pDst1,   IEM_GET_MODRM_REG(pVCpu, bRm));
    22052207            IEM_MC_REF_GREG_U64(pDst2,   IEM_GET_EFFECTIVE_VVVV(pVCpu));
    2206             IEM_MC_FETCH_GREG_U64(uSrc1, X86_GREG_xDX);
    2207             IEM_MC_FETCH_GREG_U64(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm));
    22082208            IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fBmi2, iemAImpl_mulx_u64, iemAImpl_mulx_u64_fallback),
    22092209                                     pDst1, pDst2, uSrc1, uSrc2);
     
    22192219            IEM_MC_ARG(uint32_t,            uSrc1,   2);
    22202220            IEM_MC_ARG(uint32_t,            uSrc2,   3);
     2221            IEM_MC_FETCH_GREG_U32(uSrc1, X86_GREG_xDX);
     2222            IEM_MC_FETCH_GREG_U32(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm));
    22212223            IEM_MC_REF_GREG_U32(pDst1,   IEM_GET_MODRM_REG(pVCpu, bRm));
    22222224            IEM_MC_REF_GREG_U32(pDst2,   IEM_GET_EFFECTIVE_VVVV(pVCpu));
    2223             IEM_MC_FETCH_GREG_U32(uSrc1, X86_GREG_xDX);
    2224             IEM_MC_FETCH_GREG_U32(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm));
    22252225            IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fBmi2, iemAImpl_mulx_u32, iemAImpl_mulx_u32_fallback),
    22262226                                     pDst1, pDst2, uSrc1, uSrc2);
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap3.cpp.h

    r101850 r102331  
    11361136            IEM_MC_ARG(uint64_t,            uSrc1,   1);
    11371137            IEM_MC_ARG_CONST(uint64_t,      uSrc2,   bImm8, 2);
     1138            IEM_MC_FETCH_GREG_U64(uSrc1, IEM_GET_MODRM_RM(pVCpu, bRm));
    11381139            IEM_MC_REF_GREG_U64(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm));
    1139             IEM_MC_FETCH_GREG_U64(uSrc1, IEM_GET_MODRM_RM(pVCpu, bRm));
    11401140            IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_rorx_u64, pDst, uSrc1, uSrc2);
    11411141            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    11491149            IEM_MC_ARG(uint32_t,            uSrc1,   1);
    11501150            IEM_MC_ARG_CONST(uint32_t,      uSrc2,   bImm8, 2);
     1151            IEM_MC_FETCH_GREG_U32(uSrc1, IEM_GET_MODRM_RM(pVCpu, bRm));
    11511152            IEM_MC_REF_GREG_U32(pDst,    IEM_GET_MODRM_REG(pVCpu, bRm));
    1152             IEM_MC_FETCH_GREG_U32(uSrc1, IEM_GET_MODRM_RM(pVCpu, bRm));
    11531153            IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_rorx_u32, pDst, uSrc1, uSrc2);
    11541154            IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm));
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