VirtualBox

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


Ignore:
Timestamp:
Apr 22, 2016 11:48:40 PM (9 years ago)
Author:
vboxsync
Message:

IEM: Use IEM_GET_TARGET_CPU(); 486 ignores CR0 bits too.

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

Legend:

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

    r60664 r60666  
    561561    {
    562562        case IEMMODE_16BIT:
    563 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
    564563            AssertCompile(IEMTARGETCPU_8086 <= IEMTARGETCPU_186 && IEMTARGETCPU_V20 <= IEMTARGETCPU_186 && IEMTARGETCPU_286 > IEMTARGETCPU_186);
    565             if (pIemCpu->uTargetCpu <= IEMTARGETCPU_186)
     564            if (IEM_GET_TARGET_CPU(pIemCpu) <= IEMTARGETCPU_186)
    566565                fEfl |= UINT16_C(0xf000);
    567 #endif
    568566            rcStrict = iemMemStackPushU16(pIemCpu, (uint16_t)fEfl);
    569567            break;
     
    677675                fEflNew = u16Value | (fEflOld & UINT32_C(0xffff0000));
    678676
    679 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
    680677                /*
    681678                 * Ancient CPU adjustments:
     
    689686                 *    therefore be used to detect 286 or 386 CPU in real mode.
    690687                 */
    691                 if (   pIemCpu->uTargetCpu == IEMTARGETCPU_286
     688                if (   IEM_GET_TARGET_CPU(pIemCpu) == IEMTARGETCPU_286
    692689                    && !(pCtx->cr0 & X86_CR0_PE) )
    693690                    fEflNew &= ~(X86_EFL_NT | X86_EFL_IOPL);
    694 #endif
    695691                break;
    696692            }
     
    27762772                   | X86_EFL_RF /*| X86_EFL_VM*/ | X86_EFL_AC /*|X86_EFL_VIF*/ /*|X86_EFL_VIP*/
    27772773                   | X86_EFL_ID;
    2778 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
    2779         if (pIemCpu->uTargetCpu <= IEMTARGETCPU_386)
     2774        if (IEM_GET_TARGET_CPU(pIemCpu) <= IEMTARGETCPU_386)
    27802775            uNewFlags &= ~(X86_EFL_AC | X86_EFL_ID | X86_EFL_VIF | X86_EFL_VIP);
    2781 #endif
    27822776        uNewFlags |= Efl.u & (X86_EFL_VM | X86_EFL_VIF | X86_EFL_VIP | X86_EFL_1);
    27832777    }
     
    27952789        /** @todo The intel pseudo code does not indicate what happens to
    27962790         *        reserved flags. We just ignore them. */
    2797 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
    27982791        /* Ancient CPU adjustments: See iemCImpl_popf. */
    2799         if (pIemCpu->uTargetCpu == IEMTARGETCPU_286)
     2792        if (IEM_GET_TARGET_CPU(pIemCpu) == IEMTARGETCPU_286)
    28002793            uNewFlags &= ~(X86_EFL_NT | X86_EFL_IOPL);
    2801 #endif
    28022794    }
    28032795    /** @todo Check how this is supposed to work if sp=0xfffe. */
     
    32633255        else if (pIemCpu->uCpl <= pCtx->eflags.Bits.u2IOPL)
    32643256            fEFlagsMask |= X86_EFL_IF;
    3265 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
    3266         if (pIemCpu->uTargetCpu <= IEMTARGETCPU_386)
     3257        if (IEM_GET_TARGET_CPU(pIemCpu) <= IEMTARGETCPU_386)
    32673258            fEFlagsMask &= ~(X86_EFL_AC | X86_EFL_ID | X86_EFL_VIF | X86_EFL_VIP);
    3268 #endif
    32693259        uint32_t fEFlagsNew = IEMMISC_GET_EFL(pIemCpu, pCtx);
    32703260        fEFlagsNew         &= ~fEFlagsMask;
     
    33393329        else if (pIemCpu->uCpl <= NewEfl.Bits.u2IOPL)
    33403330            fEFlagsMask |= X86_EFL_IF;
    3341 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
    3342         if (pIemCpu->uTargetCpu <= IEMTARGETCPU_386)
     3331        if (IEM_GET_TARGET_CPU(pIemCpu) <= IEMTARGETCPU_386)
    33433332            fEFlagsMask &= ~(X86_EFL_AC | X86_EFL_ID | X86_EFL_VIF | X86_EFL_VIP);
    3344 #endif
    33453333        NewEfl.u           &= ~fEFlagsMask;
    33463334        NewEfl.u           |= fEFlagsMask & uNewFlags;
     
    48084796        case 0:
    48094797            crX = pCtx->cr0;
    4810 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
    4811             if (pIemCpu->uTargetCpu <= IEMTARGETCPU_386)
     4798            if (IEM_GET_TARGET_CPU(pIemCpu) <= IEMTARGETCPU_386)
    48124799                crX |= UINT32_C(0x7fffffe0); /* All reserved CR0 flags are set on a 386, just like MSW on 286. */
    4813 #endif
    48144800            break;
    48154801        case 2: crX = pCtx->cr2; break;
     
    48654851             */
    48664852            uint64_t const uOldCrX = pCtx->cr0;
     4853            uint32_t const fValid  = X86_CR0_PE | X86_CR0_MP | X86_CR0_EM | X86_CR0_TS
     4854                                   | X86_CR0_ET | X86_CR0_NE | X86_CR0_WP | X86_CR0_AM
     4855                                   | X86_CR0_NW | X86_CR0_CD | X86_CR0_PG;
    48674856
    48684857            /* ET is hardcoded on 486 and later. */
    4869 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
    4870             if (pIemCpu->uTargetCpu >= IEMTARGETCPU_486)
    4871 #endif
    4872                 uNewCrX |= X86_CR0_ET; /* hardcoded on 486+ */
    4873 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
    4874             /* The 386 didn't #GP(0) on attempting to set reserved CR0 bits. ET was settable. */
     4858            if (IEM_GET_TARGET_CPU(pIemCpu) > IEMTARGETCPU_486)
     4859                uNewCrX |= X86_CR0_ET;
     4860            /* The 386 and 486 didn't #GP(0) on attempting to set reserved CR0 bits. ET was settable on 386. */
     4861            else if (IEM_GET_TARGET_CPU(pIemCpu) == IEMTARGETCPU_486)
     4862            {
     4863                uNewCrX &= fValid;
     4864                uNewCrX |= X86_CR0_ET;
     4865            }
    48754866            else
    48764867                uNewCrX &= X86_CR0_PE | X86_CR0_MP | X86_CR0_EM | X86_CR0_TS | X86_CR0_PG | X86_CR0_ET;
    4877 #endif
    48784868
    48794869            /* Check for reserved bits. */
    4880             uint32_t const fValid = X86_CR0_PE | X86_CR0_MP | X86_CR0_EM | X86_CR0_TS
    4881                                   | X86_CR0_ET | X86_CR0_NE | X86_CR0_WP | X86_CR0_AM
    4882                                   | X86_CR0_NW | X86_CR0_CD | X86_CR0_PG;
    48834870            if (uNewCrX & ~(uint64_t)fValid)
    48844871            {
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r60664 r60666  
    976976                IEM_MC_LOCAL(uint16_t, u16Tmp);
    977977                IEM_MC_FETCH_CR0_U16(u16Tmp);
    978 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
    979                 if (pIemCpu->uTargetCpu > IEMTARGETCPU_386)
     978                if (IEM_GET_TARGET_CPU(pIemCpu) > IEMTARGETCPU_386)
    980979                { /* likely */ }
    981                 else if (pIemCpu->uTargetCpu >= IEMTARGETCPU_386)
     980                else if (IEM_GET_TARGET_CPU(pIemCpu) >= IEMTARGETCPU_386)
    982981                    IEM_MC_OR_LOCAL_U16(u16Tmp, 0xffe0);
    983982                else
    984983                    IEM_MC_OR_LOCAL_U16(u16Tmp, 0xfff0);
    985 #endif
    986984                IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u16Tmp);
    987985                IEM_MC_ADVANCE_RIP();
     
    10181016        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    10191017        IEM_MC_FETCH_CR0_U16(u16Tmp);
    1020 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
    1021         if (pIemCpu->uTargetCpu > IEMTARGETCPU_386)
     1018        if (IEM_GET_TARGET_CPU(pIemCpu) > IEMTARGETCPU_386)
    10221019        { /* likely */ }
    10231020        else if (pIemCpu->uTargetCpu >= IEMTARGETCPU_386)
     
    10251022        else
    10261023            IEM_MC_OR_LOCAL_U16(u16Tmp, 0xfff0);
    1027 #endif
    10281024        IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Tmp);
    10291025        IEM_MC_ADVANCE_RIP();
     
    80108006{
    80118007    IEMOP_MNEMONIC("push rSP");
    8012 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
    8013     if (pIemCpu->uTargetCpu == IEMTARGETCPU_8086)
     8008    if (IEM_GET_TARGET_CPU(pIemCpu) == IEMTARGETCPU_8086)
    80148009    {
    80158010        IEM_MC_BEGIN(0, 1);
     
    80218016        IEM_MC_END();
    80228017    }
    8023 #endif
    80248018    return FNIEMOP_CALL_1(iemOpCommonPushGReg, X86_GREG_xSP);
    80258019}
     
    1639116385{
    1639216386    IEMOP_HLP_NO_LOCK_PREFIX();
    16393 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC && 0
    16394     if (   pIemCpu->uTargetCpu == IEMTARGETCPU_CURRENT
    16395         && pIemCpu->CTX_SUFF(pCtx)->cs.Sel <= 1000)
    16396     {
    16397         pIemCpu->uTargetCpu = IEMTARGETCPU_286;
    16398         LogAlways(("\niemOp_hlt: Enabled CPU restrictions!\n\n"));
    16399     }
    16400 #endif
    1640116387    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_hlt);
    1640216388}
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