VirtualBox

Changeset 64045 in vbox


Ignore:
Timestamp:
Sep 27, 2016 1:35:34 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
110970
Message:

VMM/GIM/HyperV: Don't initialize timers when the feature isn't exposed.

File:
1 edited

Legend:

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

    r63945 r64045  
    481481     * Setup up the per-VCPU synthetic timers.
    482482     */
    483     for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
    484     {
    485         PVMCPU       pVCpu     = &pVM->aCpus[idCpu];
    486         PGIMHVCPU    pHvCpu    = &pVCpu->gim.s.u.HvCpu;
    487 
    488         for (uint8_t idxStimer = 0; idxStimer < RT_ELEMENTS(pHvCpu->aStimers); idxStimer++)
    489         {
    490             PGIMHVSTIMER pHvStimer = &pHvCpu->aStimers[idxStimer];
    491 
    492             /* Associate the synthetic timer with its corresponding VCPU. */
    493             pHvStimer->idCpu     = pVCpu->idCpu;
    494             pHvStimer->idxStimer = idxStimer;
    495 
    496             /* Create the timer and associate the context pointers. */
    497             RTStrPrintf(&pHvStimer->szTimerDesc[0], sizeof(pHvStimer->szTimerDesc), "Hyper-V[%u] Timer%u", pVCpu->idCpu,
    498                         idxStimer);
    499             rc = TMR3TimerCreateInternal(pVM, TMCLOCK_VIRTUAL_SYNC, gimR3HvTimerCallback, pHvStimer /* pvUser */,
    500                                          pHvStimer->szTimerDesc, &pHvStimer->pTimerR3);
    501             AssertLogRelRCReturn(rc, rc);
    502             pHvStimer->pTimerR0 = TMTimerR0Ptr(pHvStimer->pTimerR3);
    503             pHvStimer->pTimerRC = TMTimerRCPtr(pHvStimer->pTimerR3);
     483    if (   (pHv->uBaseFeat & GIM_HV_BASE_FEAT_STIMER_MSRS)
     484        || (pHv->uBaseFeat & GIM_HV_BASE_FEAT_BASIC_SYNIC_MSRS))
     485    {
     486        for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
     487        {
     488            PVMCPU       pVCpu     = &pVM->aCpus[idCpu];
     489            PGIMHVCPU    pHvCpu    = &pVCpu->gim.s.u.HvCpu;
     490
     491            for (uint8_t idxStimer = 0; idxStimer < RT_ELEMENTS(pHvCpu->aStimers); idxStimer++)
     492            {
     493                PGIMHVSTIMER pHvStimer = &pHvCpu->aStimers[idxStimer];
     494
     495                /* Associate the synthetic timer with its corresponding VCPU. */
     496                pHvStimer->idCpu     = pVCpu->idCpu;
     497                pHvStimer->idxStimer = idxStimer;
     498
     499                /* Create the timer and associate the context pointers. */
     500                RTStrPrintf(&pHvStimer->szTimerDesc[0], sizeof(pHvStimer->szTimerDesc), "Hyper-V[%u] Timer%u", pVCpu->idCpu,
     501                            idxStimer);
     502                rc = TMR3TimerCreateInternal(pVM, TMCLOCK_VIRTUAL_SYNC, gimR3HvTimerCallback, pHvStimer /* pvUser */,
     503                                             pHvStimer->szTimerDesc, &pHvStimer->pTimerR3);
     504                AssertLogRelRCReturn(rc, rc);
     505                pHvStimer->pTimerR0 = TMTimerR0Ptr(pHvStimer->pTimerR3);
     506                pHvStimer->pTimerRC = TMTimerRCPtr(pHvStimer->pTimerR3);
     507            }
    504508        }
    505509    }
     
    583587    gimR3HvTermDebugSupport(pVM);
    584588
    585     for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
    586     {
    587         PGIMHVCPU pHvCpu = &pVM->aCpus[idCpu].gim.s.u.HvCpu;
    588         for (uint8_t idxStimer = 0; idxStimer < RT_ELEMENTS(pHvCpu->aStimers); idxStimer++)
    589         {
    590             PGIMHVSTIMER pHvStimer = &pHvCpu->aStimers[idxStimer];
    591             TMR3TimerDestroy(pHvStimer->pTimerR3);
     589    PCGIMHV pHv = &pVM->gim.s.u.Hv;
     590    if (   (pHv->uBaseFeat & GIM_HV_BASE_FEAT_STIMER_MSRS)
     591        || (pHv->uBaseFeat & GIM_HV_BASE_FEAT_BASIC_SYNIC_MSRS))
     592    {
     593        for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
     594        {
     595            PGIMHVCPU pHvCpu = &pVM->aCpus[idCpu].gim.s.u.HvCpu;
     596            for (uint8_t idxStimer = 0; idxStimer < RT_ELEMENTS(pHvCpu->aStimers); idxStimer++)
     597            {
     598                PGIMHVSTIMER pHvStimer = &pHvCpu->aStimers[idxStimer];
     599                TMR3TimerDestroy(pHvStimer->pTimerR3);
     600            }
    592601        }
    593602    }
     
    608617{
    609618    RT_NOREF1(offDelta);
    610     for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
    611     {
    612         PGIMHVCPU pHvCpu = &pVM->aCpus[idCpu].gim.s.u.HvCpu;
    613         for (uint8_t idxStimer = 0; idxStimer < RT_ELEMENTS(pHvCpu->aStimers); idxStimer++)
    614         {
    615             PGIMHVSTIMER pHvStimer = &pHvCpu->aStimers[idxStimer];
    616             pHvStimer->pTimerRC = TMTimerRCPtr(pHvStimer->pTimerR3);
     619
     620    PCGIMHV pHv = &pVM->gim.s.u.Hv;
     621    if (   (pHv->uBaseFeat & GIM_HV_BASE_FEAT_STIMER_MSRS)
     622        || (pHv->uBaseFeat & GIM_HV_BASE_FEAT_BASIC_SYNIC_MSRS))
     623    {
     624        for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
     625        {
     626            PGIMHVCPU pHvCpu = &pVM->aCpus[idCpu].gim.s.u.HvCpu;
     627            for (uint8_t idxStimer = 0; idxStimer < RT_ELEMENTS(pHvCpu->aStimers); idxStimer++)
     628            {
     629                PGIMHVSTIMER pHvStimer = &pHvCpu->aStimers[idxStimer];
     630                pHvStimer->pTimerRC = TMTimerRCPtr(pHvStimer->pTimerR3);
     631            }
    617632        }
    618633    }
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