VirtualBox

Changeset 19324 in vbox


Ignore:
Timestamp:
May 4, 2009 12:51:27 PM (16 years ago)
Author:
vboxsync
Message:

fVirtualTicking -> cVirtualTicking. Turn on the virtual timer only from VCPU 0.

Location:
trunk/src/VBox/VMM
Files:
5 edited

Legend:

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

    r19322 r19324  
    36023602         * Start the virtual time.
    36033603         */
    3604         rc = TMVirtualResume(pVM);
    3605         Assert(rc == VINF_SUCCESS);
     3604        if (pVCpu->idCpu == 0)
     3605        {
     3606            rc = TMVirtualResume(pVM);
     3607            Assert(rc == VINF_SUCCESS);
     3608        }
    36063609        rc = TMCpuTickResume(pVCpu);
    36073610        Assert(rc == VINF_SUCCESS);
  • trunk/src/VBox/VMM/TM.cpp

    r19217 r19324  
    997997        Assert(!pVCpu->tm.s.fTSCTicking);
    998998    }
    999     Assert(!pVM->tm.s.fVirtualTicking);
     999    Assert(!pVM->tm.s.cVirtualTicking);
    10001000    Assert(!pVM->tm.s.fVirtualSyncTicking);
    10011001#endif
     
    10481048        Assert(!pVCpu->tm.s.fTSCTicking);
    10491049    }
    1050     Assert(!pVM->tm.s.fVirtualTicking);
     1050    Assert(!pVM->tm.s.cVirtualTicking);
    10511051    Assert(!pVM->tm.s.fVirtualSyncTicking);
    10521052#endif
     
    10641064     * Load the virtual clock.
    10651065     */
    1066     pVM->tm.s.fVirtualTicking = false;
     1066    pVM->tm.s.cVirtualTicking = 0;
    10671067    /* the virtual clock. */
    10681068    uint64_t u64Hz;
     
    16461646    if (RT_UNLIKELY(!pNext))
    16471647    {
    1648         Assert(pVM->tm.s.fVirtualSyncTicking || !pVM->tm.s.fVirtualTicking);
     1648        Assert(pVM->tm.s.fVirtualSyncTicking || !pVM->tm.s.cVirtualTicking);
    16491649        return;
    16501650    }
     
    17821782     */
    17831783    if (    !pVM->tm.s.fVirtualSyncTicking
    1784         &&  pVM->tm.s.fVirtualTicking)
     1784        &&  pVM->tm.s.cVirtualTicking)
    17851785    {
    17861786        STAM_COUNTER_INC(&pVM->tm.s.StatVirtualSyncRunRestart);
     
    21502150                    " Virtual: %18RU64 (%#016RX64) %RU64Hz %s",
    21512151                    u64Virtual, u64Virtual, TMVirtualGetFreq(pVM),
    2152                     pVM->tm.s.fVirtualTicking ? "ticking" : "paused");
     2152                    pVM->tm.s.cVirtualTicking ? "ticking" : "paused");
    21532153    if (pVM->tm.s.fVirtualWarpDrive)
    21542154        pHlp->pfnPrintf(pHlp, " WarpDrive %RU32 %%", pVM->tm.s.u32VirtualWarpDrivePercentage);
  • trunk/src/VBox/VMM/TMInternal.h

    r19032 r19324  
    310310    uint64_t                    cTSCTicksPerSecond;
    311311
    312     /** Virtual time ticking enabled indicator (bool). (TMCLOCK_VIRTUAL) */
    313     bool                        fVirtualTicking;
     312    /** Virtual time ticking enabled indicator (counter for each VCPU). (TMCLOCK_VIRTUAL) */
     313    uint32_t                    cVirtualTicking;
    314314    /** Virtual time is not running at 100%. */
    315315    bool                        fVirtualWarpDrive;
     
    318318    /** Virtual timer synchronous time catch-up active. */
    319319    bool volatile               fVirtualSyncCatchUp;
     320    bool                        afAlignment[5]; /**< alignment padding */
    320321    /** WarpDrive percentage.
    321322     * 100% is normal (fVirtualSyncNormal == true). When other than 100% we apply
  • trunk/src/VBox/VMM/VMMAll/TMAllVirtual.cpp

    r19300 r19324  
    327327{
    328328    uint64_t u64;
    329     if (RT_LIKELY(pVM->tm.s.fVirtualTicking))
     329    if (RT_LIKELY(pVM->tm.s.cVirtualTicking))
    330330    {
    331331        STAM_COUNTER_INC(&pVM->tm.s.StatVirtualGet);
     
    413413         * Query the virtual clock and do the usual expired timer check.
    414414         */
    415         Assert(pVM->tm.s.fVirtualTicking);
     415        Assert(pVM->tm.s.cVirtualTicking);
    416416        u64 = tmVirtualGetRaw(pVM);
    417417        if (    fCheckTimers
     
    517517         */
    518518        if (    fCheckTimers
    519             &&  pVM->tm.s.fVirtualTicking
     519            &&  pVM->tm.s.cVirtualTicking
    520520            &&  !VM_FF_ISSET(pVM, VM_FF_TIMER))
    521521        {
     
    597597VMMDECL(int) TMVirtualResume(PVM pVM)
    598598{
    599     if (!pVM->tm.s.fVirtualTicking)
     599    /** @note this is done only in specific cases (vcpu 0 init, termination, debug, out of memory conditions;
     600     *  there is at least a race for fVirtualSyncTicking.
     601     */
     602    if (ASMAtomicIncU32(&pVM->tm.s.cVirtualTicking) == 1)
    600603    {
    601604        STAM_COUNTER_INC(&pVM->tm.s.StatVirtualResume);
    602         pVM->tm.s.u64VirtualRawPrev = 0;
    603         pVM->tm.s.u64VirtualWarpDriveStart = tmVirtualGetRawNanoTS(pVM);
    604         pVM->tm.s.u64VirtualOffset = pVM->tm.s.u64VirtualWarpDriveStart - pVM->tm.s.u64Virtual;
    605         pVM->tm.s.fVirtualTicking = true;
    606         pVM->tm.s.fVirtualSyncTicking = true;
     605        pVM->tm.s.u64VirtualRawPrev         = 0;
     606        pVM->tm.s.u64VirtualWarpDriveStart  = tmVirtualGetRawNanoTS(pVM);
     607        pVM->tm.s.u64VirtualOffset          = pVM->tm.s.u64VirtualWarpDriveStart - pVM->tm.s.u64Virtual;
     608        pVM->tm.s.fVirtualSyncTicking       = true;
    607609        return VINF_SUCCESS;
    608610    }
    609 
    610     AssertFailed();
    611     return VERR_INTERNAL_ERROR;
     611    AssertReturn(pVM->tm.s.cVirtualTicking < pVM->cCPUs, VERR_INTERNAL_ERROR);
     612    return VINF_SUCCESS;
    612613}
    613614
     
    622623VMMDECL(int) TMVirtualPause(PVM pVM)
    623624{
    624     if (pVM->tm.s.fVirtualTicking)
     625    /** @note this is done only in specific cases (vcpu 0 init, termination, debug, out of memory conditions;
     626     *  there is at least a race for fVirtualSyncTicking.
     627     */
     628    if (ASMAtomicDecU32(&pVM->tm.s.cVirtualTicking) == 0)
    625629    {
    626630        STAM_COUNTER_INC(&pVM->tm.s.StatVirtualPause);
    627         pVM->tm.s.u64Virtual = tmVirtualGetRaw(pVM);
    628         pVM->tm.s.fVirtualSyncTicking = false;
    629         pVM->tm.s.fVirtualTicking = false;
     631        pVM->tm.s.u64Virtual            = tmVirtualGetRaw(pVM);
     632        pVM->tm.s.fVirtualSyncTicking   = false;
    630633        return VINF_SUCCESS;
    631634    }
    632 
    633     AssertFailed();
    634     return VERR_INTERNAL_ERROR;
     635    AssertReturn(pVM->tm.s.cVirtualTicking < pVM->cCPUs, VERR_INTERNAL_ERROR);
     636    return VINF_SUCCESS;
    635637}
    636638
     
    696698     * the warp drive settings.
    697699     */
    698     bool fPaused = pVM->tm.s.fVirtualTicking;
     700    bool fPaused = !!pVM->tm.s.cVirtualTicking;
    699701    if (fPaused)
    700702    {
  • trunk/src/VBox/VMM/testcase/tstVMStructGC.cpp

    r19286 r19324  
    769769    GEN_CHECK_OFF(TMCPU, u64TSC);
    770770    GEN_CHECK_OFF(TM, cTSCTicksPerSecond);
    771     GEN_CHECK_OFF(TM, fVirtualTicking);
     771    GEN_CHECK_OFF(TM, cVirtualTicking);
    772772    GEN_CHECK_OFF(TM, fVirtualWarpDrive);
    773773    GEN_CHECK_OFF(TM, fVirtualSyncTicking);
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