VirtualBox

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


Ignore:
Timestamp:
Nov 26, 2013 6:09:07 PM (11 years ago)
Author:
vboxsync
Message:

IEM: Fixed several instances of iEffSeg being accessed before the decoding was over, causing iPXE to guru on us. Implemented DAS and DAA to verify the previous fix.

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

Legend:

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

    r49482 r49671  
    51345134 * Implements 'AAD'.
    51355135 *
    5136  * @param   enmEffOpSize    The effective operand size.
     5136 * @param   bImm            The immediate operand.
    51375137 */
    51385138IEM_CIMPL_DEF_1(iemCImpl_aad, uint8_t, bImm)
     
    51705170                              X86_EFL_OF | X86_EFL_AF | X86_EFL_CF);
    51715171
     5172    iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     5173    return VINF_SUCCESS;
     5174}
     5175
     5176
     5177/**
     5178 * Implements 'DAA'.
     5179 */
     5180IEM_CIMPL_DEF_0(iemCImpl_daa)
     5181{
     5182    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     5183
     5184    uint8_t const  al       = pCtx->al;
     5185    bool const     fCarry   = pCtx->eflags.Bits.u1CF;
     5186
     5187    if (   pCtx->eflags.Bits.u1AF
     5188        || (al & 0xf) >= 10)
     5189    {
     5190        pCtx->al = al + 6;
     5191        pCtx->eflags.Bits.u1AF = 1;
     5192    }
     5193    else
     5194        pCtx->eflags.Bits.u1AF = 0;
     5195
     5196    if (al >= 0x9a || fCarry)
     5197    {
     5198        pCtx->al += 0x60;
     5199        pCtx->eflags.Bits.u1CF = 1;
     5200    }
     5201    else
     5202        pCtx->eflags.Bits.u1CF = 0;
     5203
     5204    iemHlpUpdateArithEFlagsU8(pIemCpu, pCtx->al, X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF);
     5205    iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     5206    return VINF_SUCCESS;
     5207}
     5208
     5209
     5210/**
     5211 * Implements 'DAS'.
     5212 */
     5213IEM_CIMPL_DEF_0(iemCImpl_das)
     5214{
     5215    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     5216
     5217    uint8_t const  uInputAL = pCtx->al;
     5218    bool const     fCarry   = pCtx->eflags.Bits.u1CF;
     5219
     5220    if (   pCtx->eflags.Bits.u1AF
     5221        || (uInputAL & 0xf) >= 10)
     5222    {
     5223        pCtx->eflags.Bits.u1AF = 1;
     5224        if (uInputAL < 6)
     5225            pCtx->eflags.Bits.u1CF = 1;
     5226        pCtx->al = uInputAL - 6;
     5227    }
     5228    else
     5229    {
     5230        pCtx->eflags.Bits.u1AF = 0;
     5231        pCtx->eflags.Bits.u1CF = 0;
     5232    }
     5233
     5234    if (uInputAL >= 0x9a || fCarry)
     5235    {
     5236        pCtx->al -= 0x60;
     5237        pCtx->eflags.Bits.u1CF = 1;
     5238    }
     5239
     5240    iemHlpUpdateArithEFlagsU8(pIemCpu, pCtx->al, X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF);
    51725241    iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
    51735242    return VINF_SUCCESS;
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r49482 r49671  
    786786    IEMOP_HLP_64BIT_OP_SIZE();
    787787    IEM_MC_BEGIN(3, 1);
    788     IEM_MC_ARG_CONST(uint8_t,   iEffSeg, /*=*/pIemCpu->iEffSeg,             0);
     788    IEM_MC_ARG(uint8_t,         iEffSeg,                                    0);
    789789    IEM_MC_ARG(RTGCPTR,         GCPtrEffSrc,                                1);
    790790    IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSizeArg,/*=*/pIemCpu->enmEffOpSize, 2);
    791791    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    792792    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     793    IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
    793794    IEM_MC_CALL_CIMPL_3(iemCImpl_sgdt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
    794795    IEM_MC_END();
     
    835836    IEMOP_HLP_64BIT_OP_SIZE();
    836837    IEM_MC_BEGIN(3, 1);
    837     IEM_MC_ARG_CONST(uint8_t,   iEffSeg, /*=*/pIemCpu->iEffSeg,             0);
     838    IEM_MC_ARG(uint8_t,         iEffSeg,                                    0);
    838839    IEM_MC_ARG(RTGCPTR,         GCPtrEffSrc,                                1);
    839840    IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSizeArg,/*=*/pIemCpu->enmEffOpSize, 2);
    840841    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    841842    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     843    IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
    842844    IEM_MC_CALL_CIMPL_3(iemCImpl_sidt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
    843845    IEM_MC_END();
     
    868870{
    869871    IEMOP_MNEMONIC("lgdt");
    870     IEMOP_HLP_NO_LOCK_PREFIX();
    871 
    872872    IEMOP_HLP_64BIT_OP_SIZE();
    873873    IEM_MC_BEGIN(3, 1);
    874     IEM_MC_ARG_CONST(uint8_t,   iEffSeg, /*=*/pIemCpu->iEffSeg,             0);
     874    IEM_MC_ARG(uint8_t,         iEffSeg,                                    0);
    875875    IEM_MC_ARG(RTGCPTR,         GCPtrEffSrc,                                1);
    876876    IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSizeArg,/*=*/pIemCpu->enmEffOpSize, 2);
    877877    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     878    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     879    IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
    878880    IEM_MC_CALL_CIMPL_3(iemCImpl_lgdt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
    879881    IEM_MC_END();
     
    901903FNIEMOP_DEF_1(iemOp_Grp7_lidt, uint8_t, bRm)
    902904{
    903     IEMOP_HLP_NO_LOCK_PREFIX();
    904 
    905905    IEMMODE enmEffOpSize = pIemCpu->enmCpuMode == IEMMODE_64BIT
    906906                         ? IEMMODE_64BIT
    907907                         : pIemCpu->enmEffOpSize;
    908908    IEM_MC_BEGIN(3, 1);
    909     IEM_MC_ARG_CONST(uint8_t,   iEffSeg, /*=*/pIemCpu->iEffSeg,     0);
     909    IEM_MC_ARG(uint8_t,         iEffSeg,                            0);
    910910    IEM_MC_ARG(RTGCPTR,         GCPtrEffSrc,                        1);
    911911    IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSizeArg,/*=*/enmEffOpSize,  2);
    912912    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     913    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     914    IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
    913915    IEM_MC_CALL_CIMPL_3(iemCImpl_lidt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
    914916    IEM_MC_END();
     
    49224924{
    49234925    IEMOP_MNEMONIC("fxsave m512");
    4924     IEMOP_HLP_NO_LOCK_PREFIX();
    49254926    if (!IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX(X86_CPUID_FEATURE_EDX_FXSR))
    49264927        return IEMOP_RAISE_INVALID_OPCODE();
    49274928
    49284929    IEM_MC_BEGIN(3, 1);
    4929     IEM_MC_ARG_CONST(uint8_t,   iEffSeg,/*=*/pIemCpu->iEffSeg,           0);
     4930    IEM_MC_ARG(uint8_t,         iEffSeg,                                 0);
    49304931    IEM_MC_ARG(RTGCPTR,         GCPtrEff,                                1);
    49314932    IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize,/*=*/pIemCpu->enmEffOpSize, 2);
    49324933    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
     4934    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4935    IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
    49334936    IEM_MC_CALL_CIMPL_3(iemCImpl_fxsave, iEffSeg, GCPtrEff, enmEffOpSize);
    49344937    IEM_MC_END();
     
    49414944{
    49424945    IEMOP_MNEMONIC("fxrstor m512");
    4943     IEMOP_HLP_NO_LOCK_PREFIX();
    49444946    if (!IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX(X86_CPUID_FEATURE_EDX_FXSR))
    49454947        return IEMOP_RAISE_INVALID_OPCODE();
    49464948
    49474949    IEM_MC_BEGIN(3, 1);
    4948     IEM_MC_ARG_CONST(uint8_t,   iEffSeg,/*=*/pIemCpu->iEffSeg,           0);
     4950    IEM_MC_ARG(uint8_t,         iEffSeg,                                 0);
    49494951    IEM_MC_ARG(RTGCPTR,         GCPtrEff,                                1);
    49504952    IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize,/*=*/pIemCpu->enmEffOpSize, 2);
    49514953    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
     4954    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4955    IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
    49524956    IEM_MC_CALL_CIMPL_3(iemCImpl_fxrstor, iEffSeg, GCPtrEff, enmEffOpSize);
    49534957    IEM_MC_END();
     
    71887192
    71897193/** Opcode 0x27. */
    7190 FNIEMOP_STUB(iemOp_daa);
     7194FNIEMOP_DEF(iemOp_daa)
     7195{
     7196    IEMOP_MNEMONIC("daa AL");
     7197    IEMOP_HLP_NO_64BIT();
     7198    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     7199    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF);
     7200    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_daa);
     7201}
    71917202
    71927203
     
    72527263
    72537264/** Opcode 0x2f. */
    7254 FNIEMOP_STUB(iemOp_das);
     7265FNIEMOP_DEF(iemOp_das)
     7266{
     7267    IEMOP_MNEMONIC("das AL");
     7268    IEMOP_HLP_NO_64BIT();
     7269    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     7270    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF);
     7271    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_das);
     7272}
    72557273
    72567274
     
    1311013128    IEM_MC_BEGIN(3, 0);
    1311113129    IEM_MC_ARG_CONST(IEMMODE,           enmEffOpSize, /*=*/ pIemCpu->enmEffOpSize,  0);
    13112     IEM_MC_ARG_CONST(uint8_t,           iEffSeg,      /*=*/ pIemCpu->iEffSeg,       1);
     13130    IEM_MC_ARG(uint8_t,                 iEffSeg,                                    1);
    1311313131    IEM_MC_ARG(RTGCPTR,                 GCPtrEffSrc,                                2);
    1311413132    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1311513133    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1311613134    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
     13135    IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
    1311713136    IEM_MC_CALL_CIMPL_3(iemCImpl_fldenv, enmEffOpSize, iEffSeg, GCPtrEffSrc);
    1311813137    IEM_MC_END();
     
    1314413163    IEM_MC_BEGIN(3, 0);
    1314513164    IEM_MC_ARG_CONST(IEMMODE,           enmEffOpSize, /*=*/ pIemCpu->enmEffOpSize,  0);
    13146     IEM_MC_ARG_CONST(uint8_t,           iEffSeg,      /*=*/ pIemCpu->iEffSeg,       1);
     13165    IEM_MC_ARG(uint8_t,                 iEffSeg,                                    1);
    1314713166    IEM_MC_ARG(RTGCPTR,                 GCPtrEffDst,                                2);
    1314813167    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    1314913168    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1315013169    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
     13170    IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
    1315113171    IEM_MC_CALL_CIMPL_3(iemCImpl_fnstenv, enmEffOpSize, iEffSeg, GCPtrEffDst);
    1315213172    IEM_MC_END();
     
    1500615026FNIEMOP_DEF_1(iemOp_frstor,      uint8_t, bRm)
    1500715027{
    15008     IEMOP_MNEMONIC("fxrstor m94/108byte");
     15028    IEMOP_MNEMONIC("frstor m94/108byte");
    1500915029    IEM_MC_BEGIN(3, 0);
    1501015030    IEM_MC_ARG_CONST(IEMMODE,           enmEffOpSize, /*=*/ pIemCpu->enmEffOpSize,  0);
    15011     IEM_MC_ARG_CONST(uint8_t,           iEffSeg,      /*=*/ pIemCpu->iEffSeg,       1);
     15031    IEM_MC_ARG(uint8_t,                 iEffSeg,                                    1);
    1501215032    IEM_MC_ARG(RTGCPTR,                 GCPtrEffSrc,                                2);
    1501315033    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1501415034    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1501515035    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
     15036    IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
    1501615037    IEM_MC_CALL_CIMPL_3(iemCImpl_frstor, enmEffOpSize, iEffSeg, GCPtrEffSrc);
    1501715038    IEM_MC_END();
     
    1502615047    IEM_MC_BEGIN(3, 0);
    1502715048    IEM_MC_ARG_CONST(IEMMODE,           enmEffOpSize, /*=*/ pIemCpu->enmEffOpSize,  0);
    15028     IEM_MC_ARG_CONST(uint8_t,           iEffSeg,      /*=*/ pIemCpu->iEffSeg,       1);
     15049    IEM_MC_ARG(uint8_t,                 iEffSeg,                                    1);
    1502915050    IEM_MC_ARG(RTGCPTR,                 GCPtrEffDst,                                2);
    1503015051    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    1503115052    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1503215053    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
     15054    IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
    1503315055    IEM_MC_CALL_CIMPL_3(iemCImpl_fnsave, enmEffOpSize, iEffSeg, GCPtrEffDst);
    1503415056    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