VirtualBox

Changeset 60605 in vbox


Ignore:
Timestamp:
Apr 20, 2016 3:56:04 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
106747
Message:

VMM/APIC: Saved-state, work-in-progress.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/APICAll.cpp

    r60601 r60605  
    14811481 * @thread  Any.
    14821482 */
    1483 static void apicHintTimerFreq(PAPICCPU pApicCpu, uint32_t uInitialCount, uint8_t uTimerShift)
     1483void apicHintTimerFreq(PAPICCPU pApicCpu, uint32_t uInitialCount, uint8_t uTimerShift)
    14841484{
    14851485    Assert(pApicCpu);
    1486     Assert(TMTimerIsLockOwner(pApicCpu->CTX_SUFF(pTimer)));
    14871486
    14881487    if (   pApicCpu->uHintedTimerInitialCount != uInitialCount
  • trunk/src/VBox/VMM/VMMR3/APIC.cpp

    r60602 r60605  
    632632
    633633/**
     634 * Worker for loading per-VM APIC data.
     635 *
     636 * @returns VBox status code.
     637 * @param   pVM     The cross context VM structure.
     638 * @param   pSSM    The SSM handle.
     639 */
     640static int apicR3LoadVMData(PVM pVM, PSSMHANDLE pSSM)
     641{
     642    PAPIC pApic = VM_TO_APIC(pVM);
     643
     644    /* Load and verify number of CPUs. */
     645    uint32_t cCpus;
     646    int rc = SSMR3GetU32(pSSM, &cCpus);
     647    AssertRCReturn(rc, rc);
     648    if (cCpus != pVM->cCpus)
     649        return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - cCpus: saved=%u config=%u"), cCpus, pVM->cCpus);
     650
     651    /* Load and verify I/O APIC presence. */
     652    bool fIoApicPresent;
     653    rc = SSMR3GetBool(pSSM, &fIoApicPresent);
     654    AssertRCReturn(rc, rc);
     655    if (fIoApicPresent != pApic->fIoApicPresent)
     656        return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - fIoApicPresent: saved=%RTbool config=%RTbool"),
     657                                fIoApicPresent, pApic->fIoApicPresent);
     658
     659    /* Load and verify configured APIC mode. */
     660    uint32_t uLegacyApicMode;
     661    rc = SSMR3GetU32(pSSM, &uLegacyApicMode);
     662    AssertRCReturn(rc, rc);
     663    APICMODE const enmApicMode = apicR3ConvertFromLegacyApicMode((PDMAPICMODE)uLegacyApicMode);
     664    if (enmApicMode != pApic->enmOriginalMode)
     665        return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - uApicMode: saved=%#x(%#x) config=%#x(%#x)"),
     666                                uLegacyApicMode, enmApicMode, apicR3ConvertToLegacyApicMode(pApic->enmOriginalMode),
     667                                pApic->enmOriginalMode);
     668    return VINF_SUCCESS;
     669}
     670
     671
     672/**
    634673 * @copydoc FNSSMDEVLIVEEXEC
    635674 */
     
    671710        /* Save the APIC page. */
    672711        if (XAPIC_IN_X2APIC_MODE(pVCpu))
    673             SSMR3PutStruct(pSSM, (const void *)pApicCpu->pvApicPageR3, g_aX2ApicPageFields);
     712            SSMR3PutStruct(pSSM, (const void *)pApicCpu->pvApicPageR3, &g_aX2ApicPageFields[0]);
    674713        else
    675             SSMR3PutStruct(pSSM, (const void *)pApicCpu->pvApicPageR3, g_aXApicPageFields);
     714            SSMR3PutStruct(pSSM, (const void *)pApicCpu->pvApicPageR3, &g_aXApicPageFields[0]);
    676715
    677716        /* Save the PIBs: In theory, we could push them to vIRR and avoid saving them here, but
    678717           with posted-interrupts we can't at this point as HM is paralyzed, so just save PIBs always. */
    679         SSMR3PutStruct(pSSM, (const void *)pApicCpu->pvApicPibR3,   g_aApicPibFields);
    680         SSMR3PutStruct(pSSM, (const void *)&pApicCpu->ApicPibLevel, g_aApicPibFields);
     718        SSMR3PutStruct(pSSM, (const void *)pApicCpu->pvApicPibR3,   &g_aApicPibFields[0]);
     719        SSMR3PutStruct(pSSM, (const void *)&pApicCpu->ApicPibLevel, &g_aApicPibFields[0]);
    681720
    682721        /* Save the timer. */
    683722        TMR3TimerSave(pApicCpu->pTimerR3, pSSM);
    684723        SSMR3PutU64(pSSM, pApicCpu->u64TimerInitial);
    685 
    686         /** @todo anything else? */
    687724    }
    688725
     
    703740    /* Weed out invalid versions. */
    704741    if (    uVersion != APIC_SAVED_STATE_VERSION
     742        &&  uVersion != APIC_SAVED_STATE_VERSION_VBOX_50
    705743        &&  uVersion != APIC_SAVED_STATE_VERSION_VBOX_30
    706744        &&  uVersion != APIC_SAVED_STATE_VERSION_ANCIENT)
     
    711749    if (uVersion > APIC_SAVED_STATE_VERSION_VBOX_30)
    712750    {
    713         /* Verify number of CPUs. */
    714         uint32_t cCpus;
    715         int rc = SSMR3GetU32(pSSM, &cCpus);
    716         AssertRCReturn(rc, rc);
    717         if (cCpus != pVM->cCpus)
    718             return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - cCpus: saved=%u config=%u"), cCpus, pVM->cCpus);
    719 
    720         /* Verify I/O APIC presence. */
    721         bool fIoApicPresent;
    722         rc = SSMR3GetBool(pSSM, &fIoApicPresent);
    723         AssertRCReturn(rc, rc);
    724         if (fIoApicPresent != pApic->fIoApicPresent)
    725             return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - fIoApicPresent: saved=%RTbool config=%RTbool"),
    726                                     fIoApicPresent, pApic->fIoApicPresent);
    727 
    728         /* Verify configured APIC mode. */
    729         uint32_t uLegacyApicMode;
    730         rc = SSMR3GetU32(pSSM, &uLegacyApicMode);
    731         AssertRCReturn(rc, rc);
    732         APICMODE const enmApicMode = apicR3ConvertFromLegacyApicMode((PDMAPICMODE)uLegacyApicMode);
    733         if (enmApicMode != pApic->enmOriginalMode)
    734             return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - uApicMode: saved=%#x(%#x) config=%#x(%#x)"),
    735                                     uLegacyApicMode, enmApicMode, apicR3ConvertToLegacyApicMode(pApic->enmOriginalMode),
    736                                     pApic->enmOriginalMode);
     751        int rc2 = apicR3LoadVMData(pVM, pSSM);
     752        AssertRCReturn(rc2, rc2);
     753
     754        if (uVersion == APIC_SAVED_STATE_VERSION)
     755        { /* Load any new additional per-VM data. */ }
     756    }
     757
     758    if (uPass != SSM_PASS_FINAL)
     759        return VINF_SUCCESS;
     760
     761    int rc = VINF_SUCCESS;
     762    for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
     763    {
     764        PVMCPU   pVCpu    = &pVM->aCpus[idCpu];
     765        PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu);
    737766
    738767        if (uVersion == APIC_SAVED_STATE_VERSION)
    739768        {
    740             /** @todo load any new additional per-VM data. */
    741         }
    742     }
    743 
    744     if (uPass != SSM_PASS_FINAL)
    745         return VINF_SUCCESS;
    746 
    747     int rc = VINF_SUCCESS;
    748     for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
    749     {
    750         PVMCPU   pVCpu    = &pVM->aCpus[idCpu];
    751         PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu);
    752 
    753         if (uVersion == APIC_SAVED_STATE_VERSION)
    754         {
    755             /** @todo load new per-VCPU data. */
     769            /* Load the auxiliary data. */
     770            SSMR3GetU64(pSSM, (uint64_t *)&pApicCpu->uApicBaseMsr);
     771            SSMR3GetU32(pSSM, &pApicCpu->uEsrInternal);
     772
     773            /* Load the APIC page. */
     774            if (XAPIC_IN_X2APIC_MODE(pVCpu))
     775                SSMR3GetStruct(pSSM, (void *)pApicCpu->pvApicPageR3, &g_aX2ApicPageFields[0]);
     776            else
     777                SSMR3GetStruct(pSSM, (void *)pApicCpu->pvApicPageR3, &g_aXApicPageFields[0]);
     778
     779            /* Load the PIBs. */
     780            SSMR3GetStruct(pSSM, (void *)pApicCpu->pvApicPibR3,   &g_aApicPibFields[0]);
     781            SSMR3GetStruct(pSSM, (void *)&pApicCpu->ApicPibLevel, &g_aApicPibFields[0]);
     782
     783            /* Load the timer. */
     784            rc = TMR3TimerLoad(pApicCpu->pTimerR3, pSSM);           AssertRCReturn(rc, rc);
     785            rc = SSMR3GetU64(pSSM, &pApicCpu->u64TimerInitial);     AssertRCReturn(rc, rc);
     786            Assert(pApicCpu->uHintedTimerShift == 0);
     787            Assert(pApicCpu->uHintedTimerInitialCount == 0);
     788            if (TMTimerIsActive(pApicCpu->pTimerR3))
     789            {
     790                PCXAPICPAGE    pXApicPage    = VMCPU_TO_CXAPICPAGE(pVCpu);
     791                uint32_t const uInitialCount = pXApicPage->timer_icr.u32InitialCount;
     792                uint8_t const  uTimerShift   = apicGetTimerShift(pXApicPage);
     793                apicHintTimerFreq(pApicCpu, uInitialCount, uTimerShift);
     794            }
    756795        }
    757796        else
  • trunk/src/VBox/VMM/include/APICInternal.h

    r60593 r60605  
    514514     * @{ */
    515515    /** The error status register's internal state. */
    516     uint32_t volatile           uEsrInternal;
     516    uint32_t                    uEsrInternal;
    517517    /** The APIC base MSR.*/
    518518    uint64_t volatile           uApicBaseMsr;
     
    626626const char             *apicGetDestShorthandName(XAPICDESTSHORTHAND enmDestShorthand);
    627627const char             *apicGetTimerModeName(XAPICTIMERMODE enmTimerMode);
     628void                    apicHintTimerFreq(PAPICCPU pApicCpu, uint32_t uInitialCount, uint8_t uTimerShift);
    628629
    629630VMMDECL(uint64_t)       APICGetBaseMsr(PPDMDEVINS pDevIns, PVMCPU pVCpu);
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