VirtualBox

Changeset 65794 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Feb 15, 2017 8:39:16 PM (8 years ago)
Author:
vboxsync
Message:

EM: VMCPU_FF_UNHALT should be cleared together with EMMWAIT_FLAG_ACTIVE when we _really_ leave EMSTATE_HALTED.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/EM.cpp

    r65650 r65794  
    478478VMMR3_INT_DECL(void) EMR3ResetCpu(PVMCPU pVCpu)
    479479{
     480    /* Reset scheduling state. */
    480481    pVCpu->em.s.fForceRAW = false;
     482    VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_UNHALT);
    481483
    482484    /* VMR3ResetFF may return VINF_EM_RESET or VINF_EM_SUSPEND, so transition
     
    13431345         */
    13441346        if (   VM_FF_IS_PENDING(pVM, VM_FF_ALL_REM_MASK)
    1345             || VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_ALL_REM_MASK))
     1347            || VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_ALL_REM_MASK & ~VMCPU_FF_UNHALT))
    13461348            return VINF_SUCCESS;
    13471349    }
     
    18981900        }
    18991901
    1900         /*
    1901          * Forced unhalting of EMT.
    1902          */
    1903         if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_UNHALT))
    1904         {
    1905             VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_UNHALT);
    1906             if (rc == VINF_EM_HALT)
    1907                 rc = VINF_EM_RESCHEDULE;
    1908             else
    1909             {
    1910                 rc2 = VINF_EM_RESCHEDULE;
    1911                 UPDATE_RC();
    1912             }
    1913         }
    1914 
    19151902        /* check that we got them all  */
    1916         Assert(!(VMCPU_FF_NORMAL_PRIORITY_MASK & ~(VMCPU_FF_REQUEST | VMCPU_FF_UNHALT)));
     1903        Assert(!(VMCPU_FF_NORMAL_PRIORITY_MASK & ~VMCPU_FF_REQUEST));
    19171904    }
    19181905
     
    22112198                && rc != VINF_EM_OFF
    22122199                && (   VM_FF_IS_PENDING(pVM, VM_FF_ALL_REM_MASK)
    2213                     || VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_ALL_REM_MASK)))
     2200                    || VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_ALL_REM_MASK & ~VMCPU_FF_UNHALT)))
    22142201            {
    22152202                rc = emR3ForcedActions(pVM, pVCpu, rc);
     
    24862473                VBOXVMM_EM_STATE_CHANGED(pVCpu, enmOldState, enmNewState, rc);
    24872474
    2488                 /* Clear MWait flags. */
     2475                /* Clear MWait flags and the unhalt FF. */
    24892476                if (   enmOldState == EMSTATE_HALTED
    2490                     && (pVCpu->em.s.MWait.fWait & EMMWAIT_FLAG_ACTIVE)
     2477                    && (   (pVCpu->em.s.MWait.fWait & EMMWAIT_FLAG_ACTIVE)
     2478                        || VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_UNHALT))
    24912479                    && (   enmNewState == EMSTATE_RAW
    24922480                        || enmNewState == EMSTATE_HM
     
    24982486                        || enmNewState == EMSTATE_DEBUG_GUEST_REM) )
    24992487                {
    2500                     LogFlow(("EMR3ExecuteVM: Clearing MWAIT\n"));
    2501                     pVCpu->em.s.MWait.fWait &= ~(EMMWAIT_FLAG_ACTIVE | EMMWAIT_FLAG_BREAKIRQIF0);
     2488                    if (pVCpu->em.s.MWait.fWait & EMMWAIT_FLAG_ACTIVE)
     2489                    {
     2490                        LogFlow(("EMR3ExecuteVM: Clearing MWAIT\n"));
     2491                        pVCpu->em.s.MWait.fWait &= ~(EMMWAIT_FLAG_ACTIVE | EMMWAIT_FLAG_BREAKIRQIF0);
     2492                    }
     2493                    if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_UNHALT))
     2494                    {
     2495                        LogFlow(("EMR3ExecuteVM: Clearing UNHALT\n"));
     2496                        VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_UNHALT);
     2497                    }
    25022498                }
    25032499            }
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