VirtualBox

Changeset 24082 in vbox for trunk/src/VBox/Devices/PC


Ignore:
Timestamp:
Oct 26, 2009 3:06:19 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
53958
Message:

DevAPIC: Save and verify config. Added a couple of review comments.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/DevAPIC.cpp

    r23993 r24082  
    5757#endif
    5858
     59/** The current saved state version.*/
     60#define APIC_SAVED_STATE_VERSION            3
     61/** The saved state version used by VirtualBox v3 and earlier.
     62 * This does not include the config.  */
     63#define APIC_SAVED_STATE_VERSION_VBOX_30    2
     64/** Some ancient version... */
     65#define APIC_SAVED_STATE_VERSION_ANCIENT    1
     66
     67
    5968/** @def APIC_LOCK
    6069 * Acquires the PDM lock. */
     
    97106        uint32_t i;                                       \
    98107        APICState *apic = (dev)->CTX_SUFF(paLapics);      \
    99         for (i = 0; i < dev->cCpus; i++)                  \
     108        for (i = 0; i < (dev)->cCpus; i++)                  \
    100109        {                                                 \
    101110            if (mask & (1 << (apic->id)))                 \
     
    338347    /** Number of CPUs on the system (same as LAPIC count). */
    339348    uint32_t                cCpus;
    340     /** Struct size and statistics alignment padding. */
    341     uint32_t                u32Alignment0;
     349    /** Whether we've got an IO APIC or not. */
     350    bool                    fIoApic;
     351    /** Alignment padding. */
     352    bool                    afPadding[3];
    342353
    343354# ifdef VBOX_WITH_STATISTICS
     
    18641875
    18651876#ifdef VBOX
    1866     if ((version_id < 1) || (version_id > 2))
    1867         return -EINVAL;
    1868 
    18691877     /* XXX: what if the base changes? (registered memory regions) */
    18701878    qemu_get_be32s(f, &s->apicbase);
     
    18721880    switch (version_id)
    18731881    {
    1874         case 1:
     1882        case APIC_SAVED_STATE_VERSION_ANCIENT:
    18751883        {
    18761884            uint8_t val = 0;
     
    18831891            break;
    18841892        }
    1885         case 2:
     1893        case APIC_SAVED_STATE_VERSION:
     1894        case APIC_SAVED_STATE_VERSION_VBOX_30:
    18861895            qemu_get_be32s(f, &s->id);
    18871896            qemu_get_be32s(f, &s->phys_id);
    18881897            qemu_get_be32s(f, &s->arb_id);
    18891898            break;
     1899        default:
     1900            return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
    18901901    }
    18911902    qemu_get_be32s(f, &s->tpr);
     
    24142425{
    24152426    uint32_t        val;
    2416     static const char *dmodes[] = { "Fixed ", "Reserved", "SMI", "Reserved", 
     2427    static const char *dmodes[] = { "Fixed ", "Reserved", "SMI", "Reserved",
    24172428                                    "NMI", "INIT", "Reserved", "ExtINT" };
    24182429
     
    24782489        lapicInfoBasic(dev, lapic, pHlp);
    24792490    }
    2480     else if (!strcmp(pszArgs, "lvt")) 
     2491    else if (!strcmp(pszArgs, "lvt"))
    24812492    {
    24822493        lapicInfoLVT(dev, lapic, pHlp);
    24832494    }
    2484     else if (!strcmp(pszArgs, "timer")) 
     2495    else if (!strcmp(pszArgs, "timer"))
    24852496    {
    24862497        lapicInfoTimer(dev, lapic, pHlp);
     
    24932504
    24942505/**
     2506 * @copydoc FNSSMDEVLIVEEXEC
     2507 */
     2508static DECLCALLBACK(int) apicLiveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass)
     2509{
     2510    APICDeviceInfo *pThis = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
     2511
     2512    SSMR3PutU32( pSSM, pThis->cCpus);
     2513    SSMR3PutBool(pSSM, pThis->fIoApic);
     2514    SSMR3PutU32( pSSM, pThis->enmVersion);
     2515    AssertCompile(PDMAPICVERSION_APIC == 2);
     2516
     2517    return VINF_SSM_DONT_CALL_AGAIN;
     2518}
     2519
     2520/**
    24952521 * @copydoc FNSSMDEVSAVEEXEC
    24962522 */
    2497 static DECLCALLBACK(int) apicSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle)
     2523static DECLCALLBACK(int) apicSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
    24982524{
    24992525    APICDeviceInfo *dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    25002526
     2527    /* config */
     2528    apicLiveExec(pDevIns, pSSM, SSM_PASS_FINAL);
     2529
    25012530    /* save all APICs data, @todo: is it correct? */
    2502     foreach_apic(dev, 0xffffffff, apic_save(pSSMHandle, apic));
     2531    foreach_apic(dev, 0xffffffff, apic_save(pSSM, apic));
    25032532
    25042533    return VINF_SUCCESS;
     
    25082537 * @copydoc FNSSMDEVLOADEXEC
    25092538 */
    2510 static DECLCALLBACK(int) apicLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle, uint32_t uVersion, uint32_t uPass)
    2511 {
    2512     APICDeviceInfo *dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    2513     Assert(uPass == SSM_PASS_FINAL); NOREF(uPass);
     2539static DECLCALLBACK(int) apicLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)
     2540{
     2541    APICDeviceInfo *pThis = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
     2542
     2543    if (    uVersion != APIC_SAVED_STATE_VERSION
     2544        &&  uVersion != APIC_SAVED_STATE_VERSION_VBOX_30
     2545        &&  uVersion != APIC_SAVED_STATE_VERSION_ANCIENT)
     2546        return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
     2547
     2548    /* config */
     2549    if (uVersion > APIC_SAVED_STATE_VERSION_VBOX_30) {
     2550        uint32_t cCpus;
     2551        int rc = SSMR3GetU32(pSSM, &cCpus); AssertRCReturn(rc, rc);
     2552        if (cCpus != pThis->cCpus)
     2553        {
     2554            LogRel(("APIC: Config mismatch - cCpus: saved=%#x config=%#x\n", cCpus, pThis->cCpus));
     2555            return VERR_SSM_LOAD_CONFIG_MISMATCH;
     2556        }
     2557        bool fIoApic;
     2558        rc = SSMR3GetBool(pSSM, &fIoApic); AssertRCReturn(rc, rc);
     2559        if (fIoApic != pThis->fIoApic)
     2560        {
     2561            LogRel(("APIC: Config mismatch - fIoApic: saved=%RTbool config=%RTbool\n", fIoApic, pThis->fIoApic));
     2562            return VERR_SSM_LOAD_CONFIG_MISMATCH;
     2563        }
     2564        uint32_t uApicVersion;
     2565        rc = SSMR3GetU32(pSSM, &uApicVersion); AssertRCReturn(rc, rc);
     2566        if (uApicVersion != (uint32_t)pThis->enmVersion)
     2567        {
     2568            LogRel(("APIC: Config mismatch - uApicVersion: saved=%#x config=%#x\n", uApicVersion, pThis->enmVersion));
     2569            return VERR_SSM_LOAD_CONFIG_MISMATCH;
     2570        }
     2571    }
     2572
     2573    if (uPass != SSM_PASS_FINAL)
     2574        return VINF_SUCCESS;
    25142575
    25152576    /* load all APICs data */ /** @todo: is it correct? */
    2516     foreach_apic(dev, 0xffffffff,
    2517                  if (apic_load(pSSMHandle, apic, uVersion))
    2518                  {
     2577    foreach_apic(pThis, 0xffffffff,
     2578                 if (apic_load(pSSM, apic, uVersion)) {
    25192579                      AssertFailed();
    25202580                      return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
     
    25552615        cpuClearInterrupt(dev, pApic);
    25562616    }
     2617    /** @todo r=bird: Why is this done everytime, while the constructor first
     2618     *        checks the CPUID?  Who is right? */
    25572619    dev->pApicHlpR3->pfnChangeFeature(dev->pDevInsR3, dev->enmVersion);
    25582620
     
    25962658    int             rc;
    25972659    uint32_t        i;
    2598     bool            fIOAPIC;
     2660    bool            fIoApic;
    25992661    bool            fGCEnabled;
    26002662    bool            fR0Enabled;
     
    26172679        return VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES;
    26182680
    2619     rc = CFGMR3QueryBoolDef(pCfgHandle, "IOAPIC", &fIOAPIC, true);
     2681    rc = CFGMR3QueryBoolDef(pCfgHandle, "IOAPIC", &fIoApic, true);
    26202682    if (RT_FAILURE(rc))
    26212683        return PDMDEV_SET_ERROR(pDevIns, rc,
     
    26372699                                N_("Configuration error: Failed to query integer value \"NumCPUs\""));
    26382700
    2639     Log(("APIC: cCpus=%d fR0Enabled=%RTbool fGCEnabled=%RTbool fIOAPIC=%RTbool\n", cCpus, fR0Enabled, fGCEnabled, fIOAPIC));
    2640 
    2641     /* TODO: Current implementation is limited to 32 CPUs due to the use of 32 bits bitmasks. */
     2701    Log(("APIC: cCpus=%d fR0Enabled=%RTbool fGCEnabled=%RTbool fIoApic=%RTbool\n", cCpus, fR0Enabled, fGCEnabled, fIoApic));
     2702
     2703    /** @todo Current implementation is limited to 32 CPUs due to the use of 32
     2704     *        bits bitmasks. */
    26422705    if (cCpus > 32)
    26432706        return PDMDEV_SET_ERROR(pDevIns, rc,
     
    26512714    pThis->pDevInsRC  = PDMDEVINS_2_RCPTR(pDevIns);
    26522715    pThis->cCpus      = cCpus;
     2716    pThis->fIoApic    = fIoApic;
    26532717    /* Use PDMAPICVERSION_X2APIC to activate x2APIC mode */
    26542718    pThis->enmVersion = PDMAPICVERSION_APIC;
     
    27312795     * The the CPUID feature bit.
    27322796     */
     2797    /** @todo r=bird: See remark in the apicReset. */
    27332798    uint32_t u32Eax, u32Ebx, u32Ecx, u32Edx;
    27342799    PDMDevHlpGetCpuId(pDevIns, 0, &u32Eax, &u32Ebx, &u32Ecx, &u32Edx);
    27352800    if (u32Eax >= 1) {
    2736         if (   fIOAPIC                       /* If IOAPIC is enabled, enable Local APIC in any case */
     2801        if (   fIoApic                       /* If IOAPIC is enabled, enable Local APIC in any case */
    27372802            || (   u32Ebx == X86_CPUID_VENDOR_INTEL_EBX
    27382803                && u32Ecx == X86_CPUID_VENDOR_INTEL_ECX
     
    27932858     * Saved state.
    27942859     */
    2795     rc = PDMDevHlpSSMRegister(pDevIns, 2 /* version */, sizeof(*pThis), apicSaveExec, apicLoadExec);
     2860    rc = PDMDevHlpSSMRegister3(pDevIns, APIC_SAVED_STATE_VERSION, sizeof(*pThis),
     2861                               apicLiveExec, apicSaveExec, apicLoadExec);
    27962862    if (RT_FAILURE(rc))
    27972863        return rc;
     
    29833049    for (i = 0; i <= max_redir; ++i)
    29843050    {
    2985         static const char *dmodes[] = { "Fixed ", "LowPri", "SMI   ", "Resrvd", 
     3051        static const char *dmodes[] = { "Fixed ", "LowPri", "SMI   ", "Resrvd",
    29863052                                        "NMI   ", "INIT  ", "Resrvd", "ExtINT" };
    29873053
    2988         pHlp->pfnPrintf(pHlp, "  %02d   %s      %02X     %d    %s   %d   %s  %s     %s   %3d (%016llX)\n", 
    2989                         i, 
     3054        pHlp->pfnPrintf(pHlp, "  %02d   %s      %02X     %d    %s   %d   %s  %s     %s   %3d (%016llX)\n",
     3055                        i,
    29903056                        s->ioredtbl[i] & (1 << 11) ? "log " : "phys",           /* dest mode */
    29913057                        (int)(s->ioredtbl[i] >> 56),                            /* dest addr */
     
    30053071 * @copydoc FNSSMDEVSAVEEXEC
    30063072 */
    3007 static DECLCALLBACK(int) ioapicSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle)
     3073static DECLCALLBACK(int) ioapicSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
    30083074{
    30093075    IOAPICState *s = PDMINS_2_DATA(pDevIns, IOAPICState *);
    3010     ioapic_save(pSSMHandle, s);
     3076    ioapic_save(pSSM, s);
    30113077    return VINF_SUCCESS;
    30123078}
     
    30153081 * @copydoc FNSSMDEVLOADEXEC
    30163082 */
    3017 static DECLCALLBACK(int) ioapicLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle, uint32_t uVersion, uint32_t uPass)
     3083static DECLCALLBACK(int) ioapicLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)
    30183084{
    30193085    IOAPICState *s = PDMINS_2_DATA(pDevIns, IOAPICState *);
    30203086
    3021     if (ioapic_load(pSSMHandle, s, uVersion)) {
     3087    if (ioapic_load(pSSM, s, uVersion)) {
    30223088        AssertFailed();
    30233089        return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
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