VirtualBox

Changeset 39125 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Oct 27, 2011 10:40:17 AM (13 years ago)
Author:
vboxsync
Message:

IEM: Fixed some details in the AAM, SAHF and LAHF instruction emulation.

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

Legend:

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

    r39078 r39125  
    21652165{
    21662166    return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_MF, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
     2167}
     2168
     2169
     2170/**
     2171 * Macro for calling iemCImplRaiseDivideError().
     2172 *
     2173 * This enables us to add/remove arguments and force different levels of
     2174 * inlining as we wish.
     2175 *
     2176 * @return  Strict VBox status code.
     2177 */
     2178#define IEMOP_RAISE_DIVIDE_ERROR()          IEM_MC_DEFER_TO_CIMPL_0(iemCImplRaiseDivideError)
     2179IEM_CIMPL_DEF_0(iemCImplRaiseDivideError)
     2180{
     2181    NOREF(cbInstr);
     2182    return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_DE, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
    21672183}
    21682184
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r39078 r39125  
    29622962 * Implements 'AAM'.
    29632963 *
    2964  * @param   enmEffOpSize    The effective operand size.
     2964 * @param   bImm            The immediate operand. Cannot be 0.
    29652965 */
    29662966IEM_CIMPL_DEF_1(iemCImpl_aam, uint8_t, bImm)
    29672967{
    29682968    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     2969    Assert(bImm != 0); /* #DE on 0 is handled in the decoder. */
    29692970
    29702971    uint16_t const ax = pCtx->ax;
     
    29792980    return VINF_SUCCESS;
    29802981}
     2982
    29812983
    29822984
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r39078 r39125  
    77997799    else
    78007800    {
    7801         uint16_t offSeg16; IEM_OPCODE_GET_NEXT_U16(&offSeg16);
     7801        uint16_t offSeg16; IEM_OPCODE_GET_NEXT_U16(&offSeg16); /** @todo add GET_NEXT_U16_ZX_U32 to reduce code size. */
    78027802        offSeg = offSeg16;
    78037803    }
     
    78467846    IEMOP_MNEMONIC("sahf");
    78477847    IEMOP_HLP_NO_LOCK_PREFIX();
    7848     IEMOP_HLP_NO_64BIT();
     7848    if (   pIemCpu->enmCpuMode == IEMMODE_64BIT
     7849        && !IEM_IS_AMD_CPUID_FEATURE_PRESENT_ECX(X86_CPUID_AMD_FEATURE_ECX_LAHF_SAHF))
     7850        return IEMOP_RAISE_INVALID_OPCODE();
    78497851    IEM_MC_BEGIN(0, 2);
    78507852    IEM_MC_LOCAL(uint32_t, u32Flags);
     
    78527854    IEM_MC_FETCH_EFLAGS(EFlags);
    78537855    IEM_MC_FETCH_GREG_U8_ZX_U32(u32Flags, X86_GREG_xSP/*=AH*/);
    7854     IEM_MC_AND_LOCAL_U32(u32Flags, UINT32_C(0xd7));
     7856    IEM_MC_AND_LOCAL_U32(u32Flags, X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF);
    78557857    IEM_MC_AND_LOCAL_U32(EFlags, UINT32_C(0xffffff00));
    7856     IEM_MC_OR_LOCAL_U32(u32Flags, UINT32_C(0x00000002));
     7858    IEM_MC_OR_LOCAL_U32(u32Flags, X86_EFL_1);
    78577859    IEM_MC_OR_2LOCS_U32(EFlags, u32Flags);
    78587860    IEM_MC_COMMIT_EFLAGS(EFlags);
     
    78687870    IEMOP_MNEMONIC("lahf");
    78697871    IEMOP_HLP_NO_LOCK_PREFIX();
    7870     IEMOP_HLP_NO_64BIT();
     7872    if (   pIemCpu->enmCpuMode == IEMMODE_64BIT
     7873        && !IEM_IS_AMD_CPUID_FEATURE_PRESENT_ECX(X86_CPUID_AMD_FEATURE_ECX_LAHF_SAHF))
     7874        return IEMOP_RAISE_INVALID_OPCODE();
    78717875    IEM_MC_BEGIN(0, 1);
    78727876    IEM_MC_LOCAL(uint8_t, u8Flags);
     
    98639867    IEMOP_HLP_NO_LOCK_PREFIX();
    98649868    IEMOP_HLP_NO_64BIT();
     9869    if (!bImm)
     9870        return IEMOP_RAISE_DIVIDE_ERROR();
    98659871    return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_aam, bImm);
    98669872}
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