VirtualBox

Changeset 40017 in vbox for trunk


Ignore:
Timestamp:
Feb 7, 2012 11:50:01 AM (13 years ago)
Author:
vboxsync
Message:

fxsave + fxrstor is underways => laptop.

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

Legend:

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

    r39974 r40017  
    33003300
    33013301
     3302/**
     3303 * Implements 'FXSAVE'.
     3304 *
     3305 * @param   GCPtrEff        The address of the image.
     3306 * @param   enmEffOpSize    The operand size (only REX.W really matters).
     3307 */
     3308IEM_CIMPL_DEF_2(iemCImpl_fxsave, RTGCPTR, GCPtrEff, IEMMODE, enmEffOpSize)
     3309{
     3310    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     3311
     3312    if (pCtx->cr0 & (X86_CR0_TS | X86_CR0_EM))
     3313        return iemRaiseDeviceNotAvailable(pIemCpu);
     3314    if (GCPtrEff & 15) /** @todo \#AC */
     3315        return iemRaiseGeneralProtectionFault0(pIemCpu);
     3316
     3317
     3318    return VERR_IEM_INSTR_NOT_IMPLEMENTED;
     3319}
     3320
     3321
     3322/**
     3323 * Implements 'FXRSTOR'.
     3324 *
     3325 * @param   GCPtrEff        The address of the image.
     3326 * @param   enmEffOpSize    The operand size (only REX.W really matters).
     3327 */
     3328IEM_CIMPL_DEF_2(iemCImpl_fxrstor, RTGCPTR, GCPtrEff, IEMMODE, enmEffOpSize)
     3329{
     3330    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     3331
     3332    if (pCtx->cr0 & (X86_CR0_TS | X86_CR0_EM))
     3333        return iemRaiseDeviceNotAvailable(pIemCpu);
     3334    if (GCPtrEff & 15) /** @todo \#AC */
     3335        return iemRaiseGeneralProtectionFault0(pIemCpu);
     3336
     3337
     3338    return VERR_IEM_INSTR_NOT_IMPLEMENTED;
     3339}
     3340
    33023341/** @} */
    33033342
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r40001 r40017  
    33603360}
    33613361
     3362
    33623363/** Opcode 0x0f 0xae mem/0. */
    3363 FNIEMOP_STUB_1(iemOp_Grp15_fxsave,   uint8_t, bRm);
     3364FNIEMOP_DEF_1(iemOp_Grp15_fxsave,   uint8_t, bRm)
     3365{
     3366    IEMOP_MNEMONIC("fxsave m512");
     3367    IEMOP_HLP_NO_LOCK_PREFIX();
     3368    if (!IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX(X86_CPUID_FEATURE_EDX_FXSR))
     3369        return IEMOP_RAISE_INVALID_LOCK_PREFIX();
     3370
     3371    IEM_MC_BEGIN(2, 1);
     3372    IEM_MC_ARG(RTGCPTR,         GCPtrEff,                                0);
     3373    IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize,/*=*/pIemCpu->enmEffOpSize, 1);
     3374    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm);
     3375    IEM_MC_CALL_CIMPL_2(iemCImpl_fxsave, GCPtrEff, enmEffOpSize);
     3376    IEM_MC_END();
     3377    return VINF_SUCCESS;
     3378}
     3379
    33643380
    33653381/** Opcode 0x0f 0xae mem/1. */
    3366 FNIEMOP_STUB_1(iemOp_Grp15_fxrstor,  uint8_t, bRm);
     3382FNIEMOP_DEF_1(iemOp_Grp15_fxrstor,  uint8_t, bRm)
     3383{
     3384    IEMOP_MNEMONIC("fxrstor m512");
     3385    IEMOP_HLP_NO_LOCK_PREFIX();
     3386    if (!IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX(X86_CPUID_FEATURE_EDX_FXSR))
     3387        return IEMOP_RAISE_INVALID_LOCK_PREFIX();
     3388
     3389    IEM_MC_BEGIN(2, 1);
     3390    IEM_MC_ARG(RTGCPTR,         GCPtrEff,                                0);
     3391    IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize,/*=*/pIemCpu->enmEffOpSize, 1);
     3392    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm);
     3393    IEM_MC_CALL_CIMPL_2(iemCImpl_fxrstor, GCPtrEff, enmEffOpSize);
     3394    IEM_MC_END();
     3395    return VINF_SUCCESS;
     3396}
     3397
    33673398
    33683399/** Opcode 0x0f 0xae mem/2. */
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