VirtualBox

Changeset 40356 in vbox for trunk/src/VBox/VMM/VMMR3


Ignore:
Timestamp:
Mar 5, 2012 1:51:50 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76643
Message:

MWAIT fixes: Only clear the mwait-active flag when actually resuming code execution. Trigger reschedule in the EMMWAIT_FLAG_BREAKIRQIF0 case when VMR3WaitHalted returns and IRQs are pending.

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

Legend:

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

    r40274 r40356  
    510510
    511511        /* Save mwait state. */
    512         rc = SSMR3PutU32(pSSM, pVCpu->em.s.mwait.fWait);
     512        rc = SSMR3PutU32(pSSM, pVCpu->em.s.MWait.fWait);
    513513        AssertRCReturn(rc, rc);
    514         rc = SSMR3PutGCPtr(pSSM, pVCpu->em.s.mwait.uMWaitEAX);
     514        rc = SSMR3PutGCPtr(pSSM, pVCpu->em.s.MWait.uMWaitRAX);
    515515        AssertRCReturn(rc, rc);
    516         rc = SSMR3PutGCPtr(pSSM, pVCpu->em.s.mwait.uMWaitECX);
     516        rc = SSMR3PutGCPtr(pSSM, pVCpu->em.s.MWait.uMWaitRCX);
    517517        AssertRCReturn(rc, rc);
    518         rc = SSMR3PutGCPtr(pSSM, pVCpu->em.s.mwait.uMonitorEAX);
     518        rc = SSMR3PutGCPtr(pSSM, pVCpu->em.s.MWait.uMonitorRAX);
    519519        AssertRCReturn(rc, rc);
    520         rc = SSMR3PutGCPtr(pSSM, pVCpu->em.s.mwait.uMonitorECX);
     520        rc = SSMR3PutGCPtr(pSSM, pVCpu->em.s.MWait.uMonitorRCX);
    521521        AssertRCReturn(rc, rc);
    522         rc = SSMR3PutGCPtr(pSSM, pVCpu->em.s.mwait.uMonitorEDX);
     522        rc = SSMR3PutGCPtr(pSSM, pVCpu->em.s.MWait.uMonitorRDX);
    523523        AssertRCReturn(rc, rc);
    524524    }
     
    574574        {
    575575            /* Load mwait state. */
    576             rc = SSMR3GetU32(pSSM, &pVCpu->em.s.mwait.fWait);
     576            rc = SSMR3GetU32(pSSM, &pVCpu->em.s.MWait.fWait);
    577577            AssertRCReturn(rc, rc);
    578             rc = SSMR3GetGCPtr(pSSM, &pVCpu->em.s.mwait.uMWaitEAX);
     578            rc = SSMR3GetGCPtr(pSSM, &pVCpu->em.s.MWait.uMWaitRAX);
    579579            AssertRCReturn(rc, rc);
    580             rc = SSMR3GetGCPtr(pSSM, &pVCpu->em.s.mwait.uMWaitECX);
     580            rc = SSMR3GetGCPtr(pSSM, &pVCpu->em.s.MWait.uMWaitRCX);
    581581            AssertRCReturn(rc, rc);
    582             rc = SSMR3GetGCPtr(pSSM, &pVCpu->em.s.mwait.uMonitorEAX);
     582            rc = SSMR3GetGCPtr(pSSM, &pVCpu->em.s.MWait.uMonitorRAX);
    583583            AssertRCReturn(rc, rc);
    584             rc = SSMR3GetGCPtr(pSSM, &pVCpu->em.s.mwait.uMonitorECX);
     584            rc = SSMR3GetGCPtr(pSSM, &pVCpu->em.s.MWait.uMonitorRCX);
    585585            AssertRCReturn(rc, rc);
    586             rc = SSMR3GetGCPtr(pSSM, &pVCpu->em.s.mwait.uMonitorEDX);
     586            rc = SSMR3GetGCPtr(pSSM, &pVCpu->em.s.MWait.uMonitorRDX);
    587587            AssertRCReturn(rc, rc);
    588588        }
     
    18961896             */
    18971897            Log2(("EMR3ExecuteVM: rc=%Rrc\n", rc));
     1898            EMSTATE const enmOldState = pVCpu->em.s.enmState;
    18981899            switch (rc)
    18991900            {
     
    21042105            }
    21052106
     2107            /*
     2108             * Act on state transition.
     2109             */
     2110            EMSTATE const enmNewState = pVCpu->em.s.enmState;
     2111            if (enmOldState != enmNewState)
     2112            {
     2113                /* Clear MWait flags. */
     2114                if (   enmOldState == EMSTATE_HALTED
     2115                    && (pVCpu->em.s.MWait.fWait & EMMWAIT_FLAG_ACTIVE)
     2116                    && (   enmNewState == EMSTATE_RAW
     2117                        || enmNewState == EMSTATE_HWACC
     2118                        || enmNewState == EMSTATE_REM
     2119                        || enmNewState == EMSTATE_DEBUG_GUEST_RAW
     2120                        || enmNewState == EMSTATE_DEBUG_GUEST_HWACC
     2121                        || enmNewState == EMSTATE_DEBUG_GUEST_REM) )
     2122                {
     2123                    LogFlow(("EMR3ExecuteVM: Clearing MWAIT\n"));
     2124                    pVCpu->em.s.MWait.fWait &= ~(EMMWAIT_FLAG_ACTIVE | EMMWAIT_FLAG_BREAKIRQIF0);
     2125                }
     2126            }
     2127
    21062128            STAM_PROFILE_ADV_STOP(&pVCpu->em.s.StatTotal, x); /* (skip this in release) */
    21072129            STAM_PROFILE_ADV_START(&pVCpu->em.s.StatTotal, x);
     
    21592181                {
    21602182                    STAM_REL_PROFILE_START(&pVCpu->em.s.StatHalted, y);
    2161                     if (pVCpu->em.s.mwait.fWait & EMMWAIT_FLAG_ACTIVE)
     2183                    /* MWAIT has a special extension where it's woken up when
     2184                       an interrupt is pending even when IF=0. */
     2185                    if (   (pVCpu->em.s.MWait.fWait & (EMMWAIT_FLAG_ACTIVE | EMMWAIT_FLAG_BREAKIRQIF0))
     2186                        ==                            (EMMWAIT_FLAG_ACTIVE | EMMWAIT_FLAG_BREAKIRQIF0))
    21622187                    {
    2163                         /* mwait has a special extension where it's woken up when an interrupt is pending even when IF=0. */
    2164                         rc = VMR3WaitHalted(pVM, pVCpu, !(pVCpu->em.s.mwait.fWait & EMMWAIT_FLAG_BREAKIRQIF0) && !(CPUMGetGuestEFlags(pVCpu) & X86_EFL_IF));
    2165                         pVCpu->em.s.mwait.fWait &= ~(EMMWAIT_FLAG_ACTIVE | EMMWAIT_FLAG_BREAKIRQIF0);
     2188                        rc = VMR3WaitHalted(pVM, pVCpu, false /*fIgnoreInterrupts*/);
     2189                        if (   rc == VINF_SUCCESS
     2190                            && VMCPU_FF_ISPENDING(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC))
     2191                        {
     2192                            Log(("EMR3ExecuteVM: Triggering reschedule on pending IRQ after MWAIT\n"));
     2193                            rc = VINF_EM_RESCHEDULE;
     2194                        }
    21662195                    }
    21672196                    else
     
    21782207                    TMR3NotifySuspend(pVM, pVCpu);
    21792208                    STAM_REL_PROFILE_ADV_STOP(&pVCpu->em.s.StatTotal, x);
    2180                     Log(("EMR3ExecuteVM: actually returns %Rrc (state %s / %s)\n", rc, emR3GetStateName(pVCpu->em.s.enmState), emR3GetStateName(pVCpu->em.s.enmPrevState)));
     2209                    Log(("EMR3ExecuteVM: actually returns %Rrc (state %s / %s)\n", rc, emR3GetStateName(pVCpu->em.s.enmState), emR3GetStateName(enmOldState)));
    21812210                    return VINF_EM_SUSPEND;
    21822211
     
    22072236                        pVCpu->em.s.enmState = EMSTATE_GURU_MEDITATION;
    22082237                        VMMR3FatalDump(pVM, pVCpu, rc);
    2209                         Log(("EMR3ExecuteVM: actually returns %Rrc (state %s / %s)\n", rc, emR3GetStateName(pVCpu->em.s.enmState), emR3GetStateName(pVCpu->em.s.enmPrevState)));
     2238                        Log(("EMR3ExecuteVM: actually returns %Rrc (state %s / %s)\n", rc, emR3GetStateName(pVCpu->em.s.enmState), emR3GetStateName(enmOldState)));
    22102239                        return rc;
    22112240                    }
     
    22252254                    emR3Debug(pVM, pVCpu, rc);
    22262255                    STAM_REL_PROFILE_ADV_STOP(&pVCpu->em.s.StatTotal, x);
    2227                     Log(("EMR3ExecuteVM: actually returns %Rrc (state %s / %s)\n", rc, emR3GetStateName(pVCpu->em.s.enmState), emR3GetStateName(pVCpu->em.s.enmPrevState)));
     2256                    Log(("EMR3ExecuteVM: actually returns %Rrc (state %s / %s)\n", rc, emR3GetStateName(pVCpu->em.s.enmState), emR3GetStateName(enmOldState)));
    22282257                    return rc;
    22292258                }
     
    22392268                    TMR3NotifySuspend(pVM, pVCpu);
    22402269                    STAM_REL_PROFILE_ADV_STOP(&pVCpu->em.s.StatTotal, x);
    2241                     Log(("EMR3ExecuteVM: actually returns %Rrc (state %s / %s)\n", rc, emR3GetStateName(pVCpu->em.s.enmState), emR3GetStateName(pVCpu->em.s.enmPrevState)));
     2270                    Log(("EMR3ExecuteVM: actually returns %Rrc (state %s / %s)\n", rc, emR3GetStateName(pVCpu->em.s.enmState), emR3GetStateName(enmOldState)));
    22422271                    return VERR_EM_INTERNAL_ERROR;
    22432272            }
  • trunk/src/VBox/VMM/VMMR3/EMRaw.cpp

    r40274 r40356  
    364364    }
    365365
    366 #if 0
    367     /* Try our own instruction emulator before falling back to the recompiler. */
    368     DISCPUSTATE Cpu;
    369     rc = CPUMR3DisasmInstrCPU(pVM, pVCpu, pCtx, pCtx->rip, &Cpu, "GEN EMU");
    370     if (RT_SUCCESS(rc))
    371     {
    372         uint32_t size;
    373 
    374         switch (Cpu.pCurInstr->opcode)
    375         {
    376         /* @todo we can do more now */
    377         case OP_MOV:
    378         case OP_AND:
    379         case OP_OR:
    380         case OP_XOR:
    381         case OP_POP:
    382         case OP_INC:
    383         case OP_DEC:
    384         case OP_XCHG:
    385             STAM_PROFILE_START(&pVCpu->em.s.StatMiscEmu, a);
    386             rc = EMInterpretInstructionCPU(pVM, &Cpu, CPUMCTX2CORE(pCtx), 0, &size);
    387             if (RT_SUCCESS(rc))
    388             {
    389                 pCtx->rip += Cpu.opsize;
    390                 STAM_PROFILE_STOP(&pVCpu->em.s.StatMiscEmu, a);
    391                 return rc;
    392             }
    393             if (rc != VERR_EM_INTERPRETER)
    394                 AssertMsgFailedReturn(("rc=%Rrc\n", rc), rc);
    395             STAM_PROFILE_STOP(&pVCpu->em.s.StatMiscEmu, a);
    396             break;
    397         }
    398     }
    399 #endif /* 0 */
    400366    STAM_PROFILE_START(&pVCpu->em.s.StatREMEmu, a);
    401367    Log(("EMINS: %04x:%RGv RSP=%RGv\n", pCtx->cs, (RTGCPTR)pCtx->rip, (RTGCPTR)pCtx->rsp));
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