VirtualBox

Ignore:
Timestamp:
Jul 28, 2023 10:22:22 PM (19 months ago)
Author:
vboxsync
Message:

VMM/IEM: More on recompiling branch instruction. bugref:10369

File:
1 edited

Legend:

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

    r100714 r100731  
    792792    IEMOP_HLP_NO_64BIT();
    793793    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    794     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIR | IEM_CIMPL_F_END_TB/*?*/,
     794    /** @todo eliminate END_TB here */
     795    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_END_TB,
    795796                                iemCImpl_pop_Sreg, X86_SREG_CS, pVCpu->iem.s.enmEffOpSize);
    796797}
     
    50185019     */
    50195020    uint8_t const iSegReg = IEM_GET_MODRM_REG_8(bRm);
    5020     if (   iSegReg > X86_SREG_GS)
     5021    if (iSegReg > X86_SREG_GS)
    50215022        IEMOP_RAISE_INVALID_OPCODE_RET(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
    50225023
     
    51595160     */
    51605161    uint8_t const iSegReg = IEM_GET_MODRM_REG_8(bRm);
     5162    /** @todo r=bird: What does 8086 do here wrt CS? */
    51615163    if (   iSegReg == X86_SREG_CS
    51625164        || iSegReg > X86_SREG_GS)
     
    56825684    uint16_t u16Sel;  IEM_OPCODE_GET_NEXT_U16(&u16Sel);
    56835685    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5684     IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_BRANCH_UNCOND | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT,
     5686    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_BRANCH_DIRECT | IEM_CIMPL_F_BRANCH_FAR
     5687                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT,
    56855688                                iemCImpl_callf, u16Sel, off32Seg, pVCpu->iem.s.enmEffOpSize);
    56865689}
     
    72077210    {
    72087211        case IEMMODE_16BIT:
    7209             IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIR, iemCImpl_retn_iw_16, u16Imm);
     7212            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_retn_iw_16, u16Imm);
    72107213        case IEMMODE_32BIT:
    7211             IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIR, iemCImpl_retn_iw_32, u16Imm);
     7214            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_retn_iw_32, u16Imm);
    72127215        case IEMMODE_64BIT:
    7213             IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIR, iemCImpl_retn_iw_64, u16Imm);
     7216            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_retn_iw_64, u16Imm);
    72147217        IEM_NOT_REACHED_DEFAULT_CASE_RET();
    72157218    }
     
    72287231    {
    72297232        case IEMMODE_16BIT:
    7230             IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIR, iemCImpl_retn_16);
     7233            IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_retn_16);
    72317234        case IEMMODE_32BIT:
    7232             IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIR, iemCImpl_retn_32);
     7235            IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_retn_32);
    72337236        case IEMMODE_64BIT:
    7234             IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIR, iemCImpl_retn_64);
     7237            IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_retn_64);
    72357238        IEM_NOT_REACHED_DEFAULT_CASE_RET();
    72367239    }
     
    75167519    uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
    75177520    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    7518     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH_INDIR, iemCImpl_retf, pVCpu->iem.s.enmEffOpSize, u16Imm);
     7521    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_MODE,
     7522                                iemCImpl_retf, pVCpu->iem.s.enmEffOpSize, u16Imm);
    75197523}
    75207524
     
    75277531    IEMOP_MNEMONIC(retf, "retf");
    75287532    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    7529     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH_INDIR, iemCImpl_retf, pVCpu->iem.s.enmEffOpSize, 0);
     7533    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_MODE,
     7534                                iemCImpl_retf, pVCpu->iem.s.enmEffOpSize, 0);
    75307535}
    75317536
     
    75387543    IEMOP_MNEMONIC(int3, "int3");
    75397544    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    7540     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH_INDIR | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
     7545    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
     7546                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
    75417547                                iemCImpl_int, X86_XCPT_BP, IEMINT_INT3);
    75427548}
     
    75517557    uint8_t u8Int; IEM_OPCODE_GET_NEXT_U8(&u8Int);
    75527558    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    7553     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH_INDIR | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
     7559    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
     7560                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
    75547561                                iemCImpl_int, u8Int, IEMINT_INTN);
    75557562}
     
    75637570    IEMOP_MNEMONIC(into, "into");
    75647571    IEMOP_HLP_NO_64BIT();
    7565     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH_INDIR | IEM_CIMPL_F_BRANCH_COND | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
     7572    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_CONDITIONAL
     7573                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
    75667574                                iemCImpl_int, X86_XCPT_OF, IEMINT_INTO);
    75677575}
     
    75757583    IEMOP_MNEMONIC(iret, "iret");
    75767584    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    7577     IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH_INDIR | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT,
     7585    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
     7586                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT,
    75787587                                iemCImpl_iret, pVCpu->iem.s.enmEffOpSize);
    75797588}
     
    1148411493        {
    1148511494            uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
    11486             IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_UNCOND, iemCImpl_call_rel_16, (int16_t)u16Imm);
     11495            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_RELATIVE, iemCImpl_call_rel_16, (int16_t)u16Imm);
    1148711496        }
    1148811497
     
    1149011499        {
    1149111500            uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
    11492             IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_UNCOND, iemCImpl_call_rel_32, (int32_t)u32Imm);
     11501            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_RELATIVE, iemCImpl_call_rel_32, (int32_t)u32Imm);
    1149311502        }
    1149411503
     
    1149611505        {
    1149711506            uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
    11498             IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_UNCOND, iemCImpl_call_rel_64, u64Imm);
     11507            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_RELATIVE, iemCImpl_call_rel_64, u64Imm);
    1149911508        }
    1150011509
     
    1155511564    uint16_t u16Sel;  IEM_OPCODE_GET_NEXT_U16(&u16Sel);
    1155611565    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    11557     IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_BRANCH_UNCOND | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT,
     11566    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_BRANCH_DIRECT | IEM_CIMPL_F_BRANCH_FAR
     11567                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT,
    1155811568                                iemCImpl_FarJmp, u16Sel, off32Seg, pVCpu->iem.s.enmEffOpSize);
    1155911569}
     
    1164111651    IEMOP_HLP_MIN_386();
    1164211652    /** @todo testcase! */
    11643     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH_INDIR | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
     11653    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
     11654                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
    1164411655                                iemCImpl_int, X86_XCPT_DB, IEMINT_INT1);
    1164511656}
     
    1264012651                IEM_MC_ARG(uint16_t, u16Target, 0);
    1264112652                IEM_MC_FETCH_GREG_U16(u16Target, IEM_GET_MODRM_RM(pVCpu, bRm));
    12642                 IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIR, iemCImpl_call_16, u16Target);
     12653                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_call_16, u16Target);
    1264312654                IEM_MC_END();
    1264412655                break;
     
    1264912660                IEM_MC_ARG(uint32_t, u32Target, 0);
    1265012661                IEM_MC_FETCH_GREG_U32(u32Target, IEM_GET_MODRM_RM(pVCpu, bRm));
    12651                 IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIR, iemCImpl_call_32, u32Target);
     12662                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_call_32, u32Target);
    1265212663                IEM_MC_END();
    1265312664                break;
     
    1265812669                IEM_MC_ARG(uint64_t, u64Target, 0);
    1265912670                IEM_MC_FETCH_GREG_U64(u64Target, IEM_GET_MODRM_RM(pVCpu, bRm));
    12660                 IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIR, iemCImpl_call_64, u64Target);
     12671                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_call_64, u64Target);
    1266112672                IEM_MC_END();
    1266212673                break;
     
    1267712688                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1267812689                IEM_MC_FETCH_MEM_U16(u16Target, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    12679                 IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIR, iemCImpl_call_16, u16Target);
     12690                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_call_16, u16Target);
    1268012691                IEM_MC_END();
    1268112692                break;
     
    1268812699                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1268912700                IEM_MC_FETCH_MEM_U32(u32Target, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    12690                 IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIR, iemCImpl_call_32, u32Target);
     12701                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_call_32, u32Target);
    1269112702                IEM_MC_END();
    1269212703                break;
     
    1269912710                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1270012711                IEM_MC_FETCH_MEM_U64(u64Target, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    12701                 IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIR, iemCImpl_call_64, u64Target);
     12712                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_call_64, u64Target);
    1270212713                IEM_MC_END();
    1270312714                break;
     
    1273512746            IEM_MC_FETCH_MEM_U16(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
    1273612747            IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 2); \
    12737             IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_BRANCH_INDIR | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT, \
     12748            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR \
     12749                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT, \
    1273812750                                a_fnCImpl, u16Sel, offSeg, enmEffOpSize); \
    1273912751            IEM_MC_END(); \
     
    1275012762            IEM_MC_FETCH_MEM_U32(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
    1275112763            IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 4); \
    12752             IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_BRANCH_INDIR | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT, \
     12764            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR \
     12765                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT, \
    1275312766                                a_fnCImpl, u16Sel, offSeg, enmEffOpSize); \
    1275412767            IEM_MC_END(); \
     
    1276612779            IEM_MC_FETCH_MEM_U64(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
    1276712780            IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 8); \
    12768             IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_BRANCH_INDIR | IEM_CIMPL_F_MODE /* no gates */, \
     12781            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_MODE /* no gates */, \
    1276912782                                a_fnCImpl, u16Sel, offSeg, enmEffOpSize); \
    1277012783            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