VirtualBox

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


Ignore:
Timestamp:
May 30, 2023 6:09:42 AM (20 months ago)
Author:
vboxsync
Message:

VMM: Take the vTimer expiration into account when halting due to a WFI/WFE instruction so the guest gets woken up if no other event is pending, bugref:10389

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

Legend:

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

    r99999 r100000  
    18961896#else
    18971897        bool fWakeupPending = false;
    1898         //ssertReleaseFailed();
    1899         /** @todo */
     1898
     1899        if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_VTIMER_ACTIVATED))
     1900        {
     1901            VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_VTIMER_ACTIVATED);
     1902
     1903            fWakeupPending = true;
     1904            if (pVM->em.s.fIemExecutesAll)
     1905                rc2 = VINF_EM_RESCHEDULE;
     1906            else
     1907            {
     1908                rc2 = HMR3IsActive(pVCpu)    ? VINF_EM_RESCHEDULE_HM
     1909                    : VM_IS_NEM_ENABLED(pVM) ? VINF_EM_RESCHEDULE
     1910                    :                          VINF_EM_RESCHEDULE_REM;
     1911            }
     1912        }
    19001913#endif
    19011914
  • trunk/src/VBox/VMM/VMMR3/TM.cpp

    r99740 r100000  
    12701270        pVCpu->tm.s.u64TSC         = 0;
    12711271        pVCpu->tm.s.u64TSCLastSeen = 0;
     1272#if defined(VBOX_VMM_TARGET_ARMV8)
     1273        pVCpu->cNsVTimerActivate   = UINT64_MAX;
     1274#endif
    12721275    }
    12731276}
  • trunk/src/VBox/VMM/VMMR3/VMEmt.cpp

    r99576 r100000  
    568568    }
    569569
     570#if defined(VBOX_VMM_TARGET_ARMV8)
     571    uint64_t cNsVTimerActivate = TMCpuGetVTimerActivationNano(pVCpu);
     572    const bool fVTimerActive = cNsVTimerActivate != UINT64_MAX;
     573#endif
     574
    570575    /*
    571576     * Halt loop.
     
    584589        STAM_REL_PROFILE_ADD_PERIOD(&pUVCpu->vm.s.StatHaltTimers, cNsElapsedTimers);
    585590        if (    VM_FF_IS_ANY_SET(pVM, VM_FF_EXTERNAL_HALTED_MASK)
    586             ||  VMCPU_FF_IS_ANY_SET(pVCpu, fMask))
     591            ||  VMCPU_FF_IS_ANY_SET(pVCpu, fMask)
     592#if defined(VBOX_VMM_TARGET_ARMV8)
     593            ||  cNsElapsedTimers >= cNsVTimerActivate
     594#endif           
     595            )
     596        {
     597#if defined(VBOX_VMM_TARGET_ARMV8)
     598            cNsVTimerActivate = 0;
     599#endif
    587600            break;
     601        }
    588602
    589603        /*
     
    595609            ||  VMCPU_FF_IS_ANY_SET(pVCpu, fMask))
    596610            break;
     611
     612#if defined(VBOX_VMM_TARGET_ARMV8)
     613        u64NanoTS = RT_MIN(cNsVTimerActivate, u64NanoTS);
     614#endif
    597615
    598616        /*
     
    656674                &&  Elapsed > 100000 /* 0.1 ms */)
    657675                fBlockOnce = false;
     676
     677#if defined(VBOX_VMM_TARGET_ARMV8)
     678            cNsVTimerActivate -= RT_MIN(cNsVTimerActivate, Elapsed);
     679            /* Did the vTimer expire? */
     680            if (!cNsVTimerActivate)
     681                break;
     682#endif
    658683        }
    659684    }
    660685    //if (fSpinning) RTLogRelPrintf("spun for %RU64 ns %u loops; lag=%RU64 pct=%d\n", RTTimeNanoTS() - u64Now, cLoops, TMVirtualSyncGetLag(pVM), u32CatchUpPct);
    661686
     687#if defined(VBOX_VMM_TARGET_ARMV8)
     688    if (fVTimerActive)
     689    {
     690        if (!cNsVTimerActivate)
     691            VMCPU_FF_SET(pVCpu, VMCPU_FF_VTIMER_ACTIVATED);
     692
     693        TMCpuSetVTimerNextActivation(pVCpu, cNsVTimerActivate);
     694    }
     695#endif
    662696    ASMAtomicUoWriteBool(&pUVCpu->vm.s.fWait, false);
    663697    return rc;
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