VirtualBox

Ignore:
Timestamp:
Jan 30, 2014 12:13:45 PM (11 years ago)
Author:
vboxsync
Message:

VMM/HMVMXR0: Fix single-stepping over IRET and POPF in real-on-v86 mode.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r50275 r50284  
    1117311173            {
    1117411174                Log4(("POPF CS:RIP %04x:%#RX64\n", pMixedCtx->cs.Sel, pMixedCtx->rip));
    11175                 uint32_t cbParm = 0;
    11176                 uint32_t uMask  = 0;
    11177                 bool     fAlreadyStepping = RT_BOOL(pMixedCtx->eflags.Bits.u1TF);
     11175                uint32_t cbParm;
     11176                uint32_t uMask;
     11177                bool     fStepping = RT_BOOL(pMixedCtx->eflags.Bits.u1TF);
    1117811178                if (pDis->fPrefix & DISPREFIX_OPSIZE)
    1117911179                {
     
    1121311213                                      | HM_CHANGED_GUEST_RSP
    1121411214                                      | HM_CHANGED_GUEST_RFLAGS);
    11215 
    11216                 /* Only generate a debug execption after POPF if the guest is already stepping over POPF and
    11217                    POPF restores EFLAGS.TF. The CPU looks at the EFLAGS.TF after the instruction is done manipulating it. */
    11218                 if (   fAlreadyStepping
    11219                     && pMixedCtx->eflags.Bits.u1TF)
    11220                 {
     11215                /* Generate a pending-debug exception when stepping over POPF regardless of how POPF modifies EFLAGS.TF. */
     11216                if (fStepping)
    1122111217                    hmR0VmxSetPendingDebugXcpt(pVCpu, pMixedCtx);
    11222                 }
    1122311218
    1122411219                STAM_COUNTER_INC(&pVCpu->hm.s.StatExitPopf);
     
    1122811223            case OP_PUSHF:
    1122911224            {
    11230                 uint32_t cbParm = 0;
    11231                 uint32_t uMask  = 0;
     11225                uint32_t cbParm;
     11226                uint32_t uMask;
    1123211227                if (pDis->fPrefix & DISPREFIX_OPSIZE)
    1123311228                {
     
    1127711272                RTGCPTR  GCPtrStack = 0;
    1127811273                uint32_t uMask      = 0xffff;
     11274                bool     fStepping  = RT_BOOL(pMixedCtx->eflags.Bits.u1TF);
    1127911275                uint16_t aIretFrame[3];
    11280                 bool     fAlreadyStepping = RT_BOOL(pMixedCtx->eflags.Bits.u1TF);
    1128111276                if (pDis->fPrefix & (DISPREFIX_OPSIZE | DISPREFIX_ADDRSIZE))
    1128211277                {
     
    1130511300                                    | HM_CHANGED_GUEST_RSP
    1130611301                                    | HM_CHANGED_GUEST_RFLAGS);
    11307 
    11308                 /* Only generate a debug execption after IRET if the guest is already stepping over IRET and
    11309                    IRET restores EFLAGS.TF. The CPU looks at the EFLAGS.TF after the instruction is done manipulating it. */
    11310                 if (   fAlreadyStepping
    11311                     && pMixedCtx->eflags.Bits.u1TF)
    11312                 {
     11302                /* Generate a pending-debug exception when stepping over IRET regardless of how IRET modifies EFLAGS.TF. */
     11303                if (fStepping)
    1131311304                    hmR0VmxSetPendingDebugXcpt(pVCpu, pMixedCtx);
    11314                 }
    11315 
    1131611305                Log4(("IRET %#RX32 to %04x:%x\n", GCPtrStack, pMixedCtx->cs.Sel, pMixedCtx->ip));
    1131711306                STAM_COUNTER_INC(&pVCpu->hm.s.StatExitIret);
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