VirtualBox

Ignore:
Timestamp:
Sep 29, 2024 1:14:19 AM (5 months ago)
Author:
vboxsync
Message:

VMM/IEM: Reworked the div, idiv, mul and imul assembly workers and how we raise division error exceptions. The latter is to simplify eflags management. bugref:10720

File:
1 edited

Legend:

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

    r106061 r106179  
    1456414564        IEM_MC_BEGIN(0, 0); \
    1456514565        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     14566        IEM_MC_ARG(uint8_t,         u8Value,    1); \
     14567        IEM_MC_FETCH_GREG_U8(u8Value, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    1456614568        IEM_MC_ARG(uint16_t *,      pu16AX,     0); \
    14567         IEM_MC_ARG(uint8_t,         u8Value,    1); \
    14568         IEM_MC_ARG(uint32_t *,      pEFlags,    2); \
     14569        IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX); \
     14570        IEM_MC_ARG_EFLAGS(          fEFlagsIn,  2); \
     14571        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pfnU8, pu16AX, u8Value, fEFlagsIn); \
    1456914572        \
    14570         IEM_MC_FETCH_GREG_U8(u8Value, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    14571         IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX); \
    14572         IEM_MC_REF_EFLAGS(pEFlags); \
    14573         IEM_MC_CALL_AIMPL_3(int32_t, rc, pfnU8, pu16AX, u8Value, pEFlags); \
    14574         IEM_MC_IF_LOCAL_IS_Z(rc) { \
    14575             IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    14576         } IEM_MC_ELSE() { \
    14577             IEM_MC_RAISE_DIVIDE_ERROR(); \
    14578         } IEM_MC_ENDIF(); \
    14579         \
     14573        IEM_MC_RAISE_DIVIDE_ERROR_IF_LOCAL_IS_ZERO(fEFlagsRet); \
     14574        IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
     14575        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    1458014576        IEM_MC_END(); \
    1458114577    } \
     
    1458414580        /* memory access. */ \
    1458514581        IEM_MC_BEGIN(0, 0); \
    14586         IEM_MC_ARG(uint16_t *,      pu16AX,     0); \
    14587         IEM_MC_ARG(uint8_t,         u8Value,    1); \
    14588         IEM_MC_ARG(uint32_t *,      pEFlags,    2); \
    1458914582        IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    14590         \
    1459114583        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    1459214584        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     14585        \
     14586        IEM_MC_ARG(uint8_t,         u8Value,    1); \
    1459314587        IEM_MC_FETCH_MEM_U8(u8Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     14588        IEM_MC_ARG(uint16_t *,      pu16AX,     0); \
    1459414589        IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX); \
    14595         IEM_MC_REF_EFLAGS(pEFlags); \
    14596         IEM_MC_CALL_AIMPL_3(int32_t, rc, pfnU8, pu16AX, u8Value, pEFlags); \
    14597         IEM_MC_IF_LOCAL_IS_Z(rc) { \
    14598             IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    14599         } IEM_MC_ELSE() { \
    14600             IEM_MC_RAISE_DIVIDE_ERROR(); \
    14601         } IEM_MC_ENDIF(); \
     14590        IEM_MC_ARG_EFLAGS(          fEFlagsIn,  2); \
     14591        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pfnU8, pu16AX, u8Value, fEFlagsIn); \
    1460214592        \
     14593        IEM_MC_RAISE_DIVIDE_ERROR_IF_LOCAL_IS_ZERO(fEFlagsRet); \
     14594        IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
     14595        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    1460314596        IEM_MC_END(); \
    1460414597    } (void)0
     
    1461614609                IEM_MC_BEGIN(0, 0); \
    1461714610                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     14611                IEM_MC_ARG(uint16_t,        u16Value,   2); \
     14612                IEM_MC_FETCH_GREG_U16(u16Value, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    1461814613                IEM_MC_ARG(uint16_t *,      pu16AX,     0); \
     14614                IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX); \
    1461914615                IEM_MC_ARG(uint16_t *,      pu16DX,     1); \
    14620                 IEM_MC_ARG(uint16_t,        u16Value,   2); \
    14621                 IEM_MC_ARG(uint32_t *,      pEFlags,    3); \
     14616                IEM_MC_REF_GREG_U16(pu16DX, X86_GREG_xDX); \
     14617                IEM_MC_ARG_EFLAGS(          fEFlagsIn,  3); \
     14618                IEM_MC_CALL_AIMPL_4(uint32_t, fEFlagsRet, pImpl->pfnU16, pu16AX, pu16DX, u16Value, fEFlagsIn); \
    1462214619                \
    14623                 IEM_MC_FETCH_GREG_U16(u16Value, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    14624                 IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX); \
    14625                 IEM_MC_REF_GREG_U16(pu16DX, X86_GREG_xDX); \
    14626                 IEM_MC_REF_EFLAGS(pEFlags); \
    14627                 IEM_MC_CALL_AIMPL_4(int32_t, rc, pImpl->pfnU16, pu16AX, pu16DX, u16Value, pEFlags); \
    14628                 IEM_MC_IF_LOCAL_IS_Z(rc) { \
    14629                     IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    14630                 } IEM_MC_ELSE() { \
    14631                     IEM_MC_RAISE_DIVIDE_ERROR(); \
    14632                 } IEM_MC_ENDIF(); \
    14633                 \
     14620                IEM_MC_RAISE_DIVIDE_ERROR_IF_LOCAL_IS_ZERO(fEFlagsRet); \
     14621                IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
     14622                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    1463414623                IEM_MC_END(); \
    1463514624                break; \
     
    1463814627                IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \
    1463914628                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     14629                IEM_MC_ARG(uint32_t,        u32Value,   2); \
     14630                IEM_MC_FETCH_GREG_U32(u32Value, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    1464014631                IEM_MC_ARG(uint32_t *,      pu32AX,     0); \
     14632                IEM_MC_REF_GREG_U32(pu32AX, X86_GREG_xAX); \
    1464114633                IEM_MC_ARG(uint32_t *,      pu32DX,     1); \
    14642                 IEM_MC_ARG(uint32_t,        u32Value,   2); \
    14643                 IEM_MC_ARG(uint32_t *,      pEFlags,    3); \
     14634                IEM_MC_REF_GREG_U32(pu32DX, X86_GREG_xDX); \
     14635                IEM_MC_ARG_EFLAGS(          fEFlagsIn,  3); \
     14636                IEM_MC_CALL_AIMPL_4(uint32_t, fEFlagsRet, pImpl->pfnU32, pu32AX, pu32DX, u32Value, fEFlagsIn); \
    1464414637                \
    14645                 IEM_MC_FETCH_GREG_U32(u32Value, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    14646                 IEM_MC_REF_GREG_U32(pu32AX, X86_GREG_xAX); \
    14647                 IEM_MC_REF_GREG_U32(pu32DX, X86_GREG_xDX); \
    14648                 IEM_MC_REF_EFLAGS(pEFlags); \
    14649                 IEM_MC_CALL_AIMPL_4(int32_t, rc, pImpl->pfnU32, pu32AX, pu32DX, u32Value, pEFlags); \
    14650                 IEM_MC_IF_LOCAL_IS_Z(rc) { \
    14651                     IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xAX); \
    14652                     IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xDX); \
    14653                     IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    14654                 } IEM_MC_ELSE() { \
    14655                     IEM_MC_RAISE_DIVIDE_ERROR(); \
    14656                 } IEM_MC_ENDIF(); \
    14657                 \
     14638                IEM_MC_RAISE_DIVIDE_ERROR_IF_LOCAL_IS_ZERO(fEFlagsRet); \
     14639                IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
     14640                IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xAX); \
     14641                IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xDX); \
     14642                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    1465814643                IEM_MC_END(); \
    1465914644                break; \
     
    1466214647                IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
    1466314648                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     14649                IEM_MC_ARG(uint64_t,        u64Value,   2); \
     14650                IEM_MC_FETCH_GREG_U64(u64Value, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    1466414651                IEM_MC_ARG(uint64_t *,      pu64AX,     0); \
     14652                IEM_MC_REF_GREG_U64(pu64AX, X86_GREG_xAX); \
    1466514653                IEM_MC_ARG(uint64_t *,      pu64DX,     1); \
    14666                 IEM_MC_ARG(uint64_t,        u64Value,   2); \
    14667                 IEM_MC_ARG(uint32_t *,      pEFlags,    3); \
     14654                IEM_MC_REF_GREG_U64(pu64DX, X86_GREG_xDX); \
     14655                IEM_MC_ARG_EFLAGS(          fEFlagsIn,  3); \
     14656                IEM_MC_CALL_AIMPL_4(uint32_t, fEFlagsRet, pImpl->pfnU64, pu64AX, pu64DX, u64Value, fEFlagsIn); \
    1466814657                \
    14669                 IEM_MC_FETCH_GREG_U64(u64Value, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    14670                 IEM_MC_REF_GREG_U64(pu64AX, X86_GREG_xAX); \
    14671                 IEM_MC_REF_GREG_U64(pu64DX, X86_GREG_xDX); \
    14672                 IEM_MC_REF_EFLAGS(pEFlags); \
    14673                 IEM_MC_CALL_AIMPL_4(int32_t, rc, pImpl->pfnU64, pu64AX, pu64DX, u64Value, pEFlags); \
    14674                 IEM_MC_IF_LOCAL_IS_Z(rc) { \
    14675                     IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    14676                 } IEM_MC_ELSE() { \
    14677                     IEM_MC_RAISE_DIVIDE_ERROR(); \
    14678                 } IEM_MC_ENDIF(); \
    14679                 \
     14658                IEM_MC_RAISE_DIVIDE_ERROR_IF_LOCAL_IS_ZERO(fEFlagsRet); \
     14659                IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
     14660                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    1468014661                IEM_MC_END(); \
    1468114662                break; \
     
    1469114672            case IEMMODE_16BIT: \
    1469214673                IEM_MC_BEGIN(0, 0); \
    14693                 IEM_MC_ARG(uint16_t *,      pu16AX,     0); \
    14694                 IEM_MC_ARG(uint16_t *,      pu16DX,     1); \
    14695                 IEM_MC_ARG(uint16_t,        u16Value,   2); \
    14696                 IEM_MC_ARG(uint32_t *,      pEFlags,    3); \
    1469714674                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    14698                 \
    1469914675                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    1470014676                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     14677                \
     14678                IEM_MC_ARG(uint16_t,        u16Value,   2); \
    1470114679                IEM_MC_FETCH_MEM_U16(u16Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     14680                IEM_MC_ARG(uint16_t *,      pu16AX,     0); \
    1470214681                IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX); \
     14682                IEM_MC_ARG(uint16_t *,      pu16DX,     1); \
    1470314683                IEM_MC_REF_GREG_U16(pu16DX, X86_GREG_xDX); \
    14704                 IEM_MC_REF_EFLAGS(pEFlags); \
    14705                 IEM_MC_CALL_AIMPL_4(int32_t, rc, pImpl->pfnU16, pu16AX, pu16DX, u16Value, pEFlags); \
    14706                 IEM_MC_IF_LOCAL_IS_Z(rc) { \
    14707                     IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    14708                 } IEM_MC_ELSE() { \
    14709                     IEM_MC_RAISE_DIVIDE_ERROR(); \
    14710                 } IEM_MC_ENDIF(); \
     14684                IEM_MC_ARG_EFLAGS(          fEFlagsIn,  3); \
     14685                IEM_MC_CALL_AIMPL_4(uint32_t, fEFlagsRet, pImpl->pfnU16, pu16AX, pu16DX, u16Value, fEFlagsIn); \
    1471114686                \
     14687                IEM_MC_RAISE_DIVIDE_ERROR_IF_LOCAL_IS_ZERO(fEFlagsRet); \
     14688                IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
     14689                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    1471214690                IEM_MC_END(); \
    1471314691                break; \
     
    1471514693            case IEMMODE_32BIT: \
    1471614694                IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \
    14717                 IEM_MC_ARG(uint32_t *,      pu32AX,     0); \
    14718                 IEM_MC_ARG(uint32_t *,      pu32DX,     1); \
    14719                 IEM_MC_ARG(uint32_t,        u32Value,   2); \
    14720                 IEM_MC_ARG(uint32_t *,      pEFlags,    3); \
    1472114695                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    14722                 \
    1472314696                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    1472414697                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     14698                \
     14699                IEM_MC_ARG(uint32_t,        u32Value,   2); \
    1472514700                IEM_MC_FETCH_MEM_U32(u32Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     14701                IEM_MC_ARG(uint32_t *,      pu32AX,     0); \
    1472614702                IEM_MC_REF_GREG_U32(pu32AX, X86_GREG_xAX); \
     14703                IEM_MC_ARG(uint32_t *,      pu32DX,     1); \
    1472714704                IEM_MC_REF_GREG_U32(pu32DX, X86_GREG_xDX); \
    14728                 IEM_MC_REF_EFLAGS(pEFlags); \
    14729                 IEM_MC_CALL_AIMPL_4(int32_t, rc, pImpl->pfnU32, pu32AX, pu32DX, u32Value, pEFlags); \
    14730                 IEM_MC_IF_LOCAL_IS_Z(rc) { \
    14731                     IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xAX); \
    14732                     IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xDX); \
    14733                     IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    14734                 } IEM_MC_ELSE() { \
    14735                     IEM_MC_RAISE_DIVIDE_ERROR(); \
    14736                 } IEM_MC_ENDIF(); \
     14705                IEM_MC_ARG_EFLAGS(          fEFlagsIn,  3); \
     14706                IEM_MC_CALL_AIMPL_4(uint32_t, fEFlagsRet, pImpl->pfnU32, pu32AX, pu32DX, u32Value, fEFlagsIn); \
    1473714707                \
     14708                IEM_MC_RAISE_DIVIDE_ERROR_IF_LOCAL_IS_ZERO(fEFlagsRet); \
     14709                IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xAX); \
     14710                IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xDX); \
     14711                IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
     14712                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    1473814713                IEM_MC_END(); \
    1473914714                break; \
     
    1474114716            case IEMMODE_64BIT: \
    1474214717                IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
    14743                 IEM_MC_ARG(uint64_t *,      pu64AX,     0); \
    14744                 IEM_MC_ARG(uint64_t *,      pu64DX,     1); \
    14745                 IEM_MC_ARG(uint64_t,        u64Value,   2); \
    14746                 IEM_MC_ARG(uint32_t *,      pEFlags,    3); \
    1474714718                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    14748                 \
    1474914719                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    1475014720                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     14721                \
     14722                IEM_MC_ARG(uint64_t,        u64Value,   2); \
    1475114723                IEM_MC_FETCH_MEM_U64(u64Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     14724                IEM_MC_ARG(uint64_t *,      pu64AX,     0); \
    1475214725                IEM_MC_REF_GREG_U64(pu64AX, X86_GREG_xAX); \
     14726                IEM_MC_ARG(uint64_t *,      pu64DX,     1); \
    1475314727                IEM_MC_REF_GREG_U64(pu64DX, X86_GREG_xDX); \
    14754                 IEM_MC_REF_EFLAGS(pEFlags); \
    14755                 IEM_MC_CALL_AIMPL_4(int32_t, rc, pImpl->pfnU64, pu64AX, pu64DX, u64Value, pEFlags); \
    14756                 IEM_MC_IF_LOCAL_IS_Z(rc) { \
    14757                     IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    14758                 } IEM_MC_ELSE() { \
    14759                     IEM_MC_RAISE_DIVIDE_ERROR(); \
    14760                 } IEM_MC_ENDIF(); \
     14728                IEM_MC_ARG_EFLAGS(          fEFlagsIn,  3); \
     14729                IEM_MC_CALL_AIMPL_4(uint32_t, fEFlagsRet, pImpl->pfnU64, pu64AX, pu64DX, u64Value, fEFlagsIn); \
    1476114730                \
     14731                IEM_MC_RAISE_DIVIDE_ERROR_IF_LOCAL_IS_ZERO(fEFlagsRet); \
     14732                IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
     14733                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    1476214734                IEM_MC_END(); \
    1476314735                break; \
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