VirtualBox

Changeset 65192 in vbox


Ignore:
Timestamp:
Jan 7, 2017 10:46:49 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
112696
Message:

IEM: PUSHF in V86 mode needs to increment rIP.

File:
1 edited

Legend:

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

    r65180 r65192  
    534534{
    535535    PCPUMCTX pCtx = IEM_GET_CTX(pVCpu);
     536    VBOXSTRICTRC rcStrict;
    536537
    537538    /*
     
    549550        fEfl &= ~X86_EFL_IF;          /* (RF and VM are out of range) */
    550551        fEfl |= (fEfl & X86_EFL_VIF) >> (19 - 9);
    551         return iemMemStackPushU16(pVCpu, (uint16_t)fEfl);
    552     }
    553 
    554     /*
    555      * Ok, clear RF and VM, adjust for ancient CPUs, and push the flags.
    556      */
    557     fEfl &= ~(X86_EFL_RF | X86_EFL_VM);
    558 
    559     VBOXSTRICTRC rcStrict;
    560     switch (enmEffOpSize)
    561     {
    562         case IEMMODE_16BIT:
    563             AssertCompile(IEMTARGETCPU_8086 <= IEMTARGETCPU_186 && IEMTARGETCPU_V20 <= IEMTARGETCPU_186 && IEMTARGETCPU_286 > IEMTARGETCPU_186);
    564             if (IEM_GET_TARGET_CPU(pVCpu) <= IEMTARGETCPU_186)
    565                 fEfl |= UINT16_C(0xf000);
    566             rcStrict = iemMemStackPushU16(pVCpu, (uint16_t)fEfl);
    567             break;
    568         case IEMMODE_32BIT:
    569             rcStrict = iemMemStackPushU32(pVCpu, fEfl);
    570             break;
    571         case IEMMODE_64BIT:
    572             rcStrict = iemMemStackPushU64(pVCpu, fEfl);
    573             break;
    574         IEM_NOT_REACHED_DEFAULT_CASE_RET();
     552        rcStrict = iemMemStackPushU16(pVCpu, (uint16_t)fEfl);
     553    }
     554    else
     555    {
     556
     557        /*
     558         * Ok, clear RF and VM, adjust for ancient CPUs, and push the flags.
     559         */
     560        fEfl &= ~(X86_EFL_RF | X86_EFL_VM);
     561
     562        switch (enmEffOpSize)
     563        {
     564            case IEMMODE_16BIT:
     565                AssertCompile(IEMTARGETCPU_8086 <= IEMTARGETCPU_186 && IEMTARGETCPU_V20 <= IEMTARGETCPU_186 && IEMTARGETCPU_286 > IEMTARGETCPU_186);
     566                if (IEM_GET_TARGET_CPU(pVCpu) <= IEMTARGETCPU_186)
     567                    fEfl |= UINT16_C(0xf000);
     568                rcStrict = iemMemStackPushU16(pVCpu, (uint16_t)fEfl);
     569                break;
     570            case IEMMODE_32BIT:
     571                rcStrict = iemMemStackPushU32(pVCpu, fEfl);
     572                break;
     573            case IEMMODE_64BIT:
     574                rcStrict = iemMemStackPushU64(pVCpu, fEfl);
     575                break;
     576            IEM_NOT_REACHED_DEFAULT_CASE_RET();
     577        }
    575578    }
    576579    if (rcStrict != VINF_SUCCESS)
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette