VirtualBox

Changeset 91888 in vbox for trunk


Ignore:
Timestamp:
Oct 20, 2021 12:03:15 PM (3 years ago)
Author:
vboxsync
Message:

Devices/Bus/DevPciIch9: Access SSM API only through the device helper callbacks, bugref:10074

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Bus/DevPciIch9.cpp

    r90436 r91888  
    11151115
    11161116
    1117 static int ich9pciR3CommonSaveExec(PDEVPCIBUS pBus, PSSMHANDLE pSSM)
     1117static int ich9pciR3CommonSaveExec(PCPDMDEVHLPR3 pHlp, PDEVPCIBUS pBus, PSSMHANDLE pSSM)
    11181118{
    11191119    /*
     
    11261126        {
    11271127            /* Device position */
    1128             SSMR3PutU32(pSSM, uDevFn);
     1128            pHlp->pfnSSMPutU32(pSSM, uDevFn);
    11291129
    11301130            /* PCI config registers */
    1131             SSMR3PutU32(pSSM, sizeof(pDev->abConfig));
    1132             SSMR3PutMem(pSSM, pDev->abConfig, sizeof(pDev->abConfig));
     1131            pHlp->pfnSSMPutU32(pSSM, sizeof(pDev->abConfig));
     1132            pHlp->pfnSSMPutMem(pSSM, pDev->abConfig, sizeof(pDev->abConfig));
    11331133
    11341134            /* Device flags */
    1135             SSMR3PutU32(pSSM, pDev->Int.s.fFlags);
     1135            pHlp->pfnSSMPutU32(pSSM, pDev->Int.s.fFlags);
    11361136
    11371137            /* IRQ pin state */
    1138             SSMR3PutS32(pSSM, pDev->Int.s.uIrqPinState);
     1138            pHlp->pfnSSMPutS32(pSSM, pDev->Int.s.uIrqPinState);
    11391139
    11401140            /* MSI info */
    1141             SSMR3PutU8(pSSM, pDev->Int.s.u8MsiCapOffset);
    1142             SSMR3PutU8(pSSM, pDev->Int.s.u8MsiCapSize);
     1141            pHlp->pfnSSMPutU8(pSSM, pDev->Int.s.u8MsiCapOffset);
     1142            pHlp->pfnSSMPutU8(pSSM, pDev->Int.s.u8MsiCapSize);
    11431143
    11441144            /* MSI-X info */
    1145             SSMR3PutU8(pSSM, pDev->Int.s.u8MsixCapOffset);
    1146             SSMR3PutU8(pSSM, pDev->Int.s.u8MsixCapSize);
     1145            pHlp->pfnSSMPutU8(pSSM, pDev->Int.s.u8MsixCapOffset);
     1146            pHlp->pfnSSMPutU8(pSSM, pDev->Int.s.u8MsixCapSize);
    11471147
    11481148            /* Save MSI-X page state */
    11491149            if (pDev->Int.s.u8MsixCapOffset != 0)
    11501150            {
    1151                 SSMR3PutU32(pSSM, pDev->Int.s.cbMsixRegion);
    1152                 SSMR3PutMem(pSSM, pDev->abMsixState, pDev->Int.s.cbMsixRegion);
     1151                pHlp->pfnSSMPutU32(pSSM, pDev->Int.s.cbMsixRegion);
     1152                pHlp->pfnSSMPutMem(pSSM, pDev->abMsixState, pDev->Int.s.cbMsixRegion);
    11531153            }
    11541154            else
    1155                 SSMR3PutU32(pSSM, 0);
     1155                pHlp->pfnSSMPutU32(pSSM, 0);
    11561156
    11571157            /* Save the type an size of all the regions. */
    11581158            for (uint32_t iRegion = 0; iRegion < VBOX_PCI_NUM_REGIONS; iRegion++)
    11591159            {
    1160                 SSMR3PutU8(pSSM, pDev->Int.s.aIORegions[iRegion].type);
    1161                 SSMR3PutU64(pSSM, pDev->Int.s.aIORegions[iRegion].size);
     1160                pHlp->pfnSSMPutU8(pSSM, pDev->Int.s.aIORegions[iRegion].type);
     1161                pHlp->pfnSSMPutU64(pSSM, pDev->Int.s.aIORegions[iRegion].size);
    11621162            }
    11631163        }
    11641164    }
    1165     return SSMR3PutU32(pSSM, UINT32_MAX); /* terminator */
     1165    return pHlp->pfnSSMPutU32(pSSM, UINT32_MAX); /* terminator */
    11661166}
    11671167
    11681168static DECLCALLBACK(int) ich9pciR3SaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
    11691169{
    1170     PDEVPCIROOT pThis = PDMINS_2_DATA(pDevIns, PDEVPCIROOT);
     1170    PDEVPCIROOT     pThis = PDMINS_2_DATA(pDevIns, PDEVPCIROOT);
     1171    PCPDMDEVHLPR3   pHlp  = pDevIns->pHlpR3;
    11711172
    11721173    /*
    11731174     * Bus state data.
    11741175     */
    1175     SSMR3PutU32(pSSM, pThis->uConfigReg);
     1176    pHlp->pfnSSMPutU32(pSSM, pThis->uConfigReg);
    11761177
    11771178    /*
     
    11791180     */
    11801181    for (unsigned i = 0; i < RT_ELEMENTS(pThis->auPciApicIrqLevels); i++)
    1181         SSMR3PutU32(pSSM, pThis->auPciApicIrqLevels[i]);
    1182 
    1183     SSMR3PutU32(pSSM, UINT32_MAX);  /* separator */
    1184 
    1185     return ich9pciR3CommonSaveExec(&pThis->PciBus, pSSM);
     1182        pHlp->pfnSSMPutU32(pSSM, pThis->auPciApicIrqLevels[i]);
     1183
     1184    pHlp->pfnSSMPutU32(pSSM, UINT32_MAX);  /* separator */
     1185
     1186    return ich9pciR3CommonSaveExec(pHlp, &pThis->PciBus, pSSM);
    11861187}
    11871188
     
    11891190static DECLCALLBACK(int) ich9pcibridgeR3SaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
    11901191{
    1191     PDEVPCIBUS pThis = PDMINS_2_DATA(pDevIns, PDEVPCIBUS);
    1192     return ich9pciR3CommonSaveExec(pThis, pSSM);
     1192    PDEVPCIBUS      pThis = PDMINS_2_DATA(pDevIns, PDEVPCIBUS);
     1193    PCPDMDEVHLPR3   pHlp  = pDevIns->pHlpR3;
     1194
     1195    return ich9pciR3CommonSaveExec(pHlp, pThis, pSSM);
    11931196}
    11941197
     
    14861489 *
    14871490 * @returns VBox status code.
     1491 * @param   pHlp                The device instance helper callback table.
    14881492 * @param   pSSM                The Saved state handle.
    14891493 * @param   pPciDev             The PCI device in question.
     
    14931497 *                              and types, clear if old one.
    14941498 */
    1495 int devpciR3CommonRestoreRegions(PSSMHANDLE pSSM, PPDMPCIDEV pPciDev, PPCIIOREGION paIoRegions, bool fNewState)
     1499int devpciR3CommonRestoreRegions(PCPDMDEVHLPR3 pHlp, PSSMHANDLE pSSM, PPDMPCIDEV pPciDev, PPCIIOREGION paIoRegions, bool fNewState)
    14961500{
    14971501    int rc;
     
    15151519                    pPciDev->Int.s.bPadding0 = 0;
    15161520                    if (RT_FAILURE(rc))
    1517                         return SSMR3SetLoadError(pSSM, rc, RT_SRC_POS,
    1518                                                  N_("Device %s/%u failed to respond to region #%u size/type changing from %#RGp/%#x to %#RGp/%#x: %Rrc"),
    1519                                                  pPciDev->pszNameR3, pPciDev->Int.s.CTX_SUFF(pDevIns)->iInstance, iRegion,
    1520                                                  pPciDev->Int.s.aIORegions[iRegion].size, pPciDev->Int.s.aIORegions[iRegion].type,
    1521                                                  paIoRegions[iRegion].size, paIoRegions[iRegion].type, rc);
     1521                        return pHlp->pfnSSMSetLoadError(pSSM, rc, RT_SRC_POS,
     1522                                                        N_("Device %s/%u failed to respond to region #%u size/type changing from %#RGp/%#x to %#RGp/%#x: %Rrc"),
     1523                                                        pPciDev->pszNameR3, pPciDev->Int.s.CTX_SUFF(pDevIns)->iInstance, iRegion,
     1524                                                        pPciDev->Int.s.aIORegions[iRegion].size, pPciDev->Int.s.aIORegions[iRegion].type,
     1525                                                        paIoRegions[iRegion].size, paIoRegions[iRegion].type, rc);
    15221526                }
    15231527                pPciDev->Int.s.aIORegions[iRegion].type = paIoRegions[iRegion].type;
     
    15331537                                                devpciR3CommonRestoreOldSetRegion, NULL);
    15341538        if (RT_FAILURE(rc))
    1535             return SSMR3SetLoadError(pSSM, rc, RT_SRC_POS,  N_("Device %s/%u failed to resize its resources: %Rrc"),
    1536                                      pPciDev->pszNameR3, pPciDev->Int.s.CTX_SUFF(pDevIns)->iInstance, rc);
     1539            return pHlp->pfnSSMSetLoadError(pSSM, rc, RT_SRC_POS,  N_("Device %s/%u failed to resize its resources: %Rrc"),
     1540                                            pPciDev->pszNameR3, pPciDev->Int.s.CTX_SUFF(pDevIns)->iInstance, rc);
    15371541    }
    15381542    return VINF_SUCCESS;
     
    15521556static int ich9pciR3CommonLoadExec(PPDMDEVINS pDevIns, PDEVPCIBUS pBus, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)
    15531557{
     1558    PCPDMDEVHLPR3   pHlp = pDevIns->pHlpR3;
    15541559    uint32_t     u32;
    15551560    int          rc;
     
    15891594    {
    15901595        /* index / terminator */
    1591         rc = SSMR3GetU32(pSSM, &u32);
     1596        rc = pHlp->pfnSSMGetU32(pSSM, &u32);
    15921597        if (RT_FAILURE(rc))
    15931598            break;
     
    16061611                LogRel(("PCI: New device in slot %#x, %s (vendor=%#06x device=%#06x)\n", uDevFn, pDev->pszNameR3,
    16071612                        PDMPciDevGetVendorId(pDev), PDMPciDevGetDeviceId(pDev)));
    1608                 if (SSMR3HandleGetAfter(pSSM) != SSMAFTER_DEBUG_IT)
     1613                if (pHlp->pfnSSMHandleGetAfter(pSSM) != SSMAFTER_DEBUG_IT)
    16091614                {
    16101615                    /* safe, only needs to go to the config space array */
    1611                     rc = SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("New device in slot %#x, %s (vendor=%#06x device=%#06x)"),
    1612                                           uDevFn, pDev->pszNameR3, PDMPciDevGetVendorId(pDev), PDMPciDevGetDeviceId(pDev));
     1616                    rc = pHlp->pfnSSMSetCfgError(pSSM, RT_SRC_POS, N_("New device in slot %#x, %s (vendor=%#06x device=%#06x)"),
     1617                                                 uDevFn, pDev->pszNameR3, PDMPciDevGetVendorId(pDev), PDMPciDevGetDeviceId(pDev));
    16131618                    break;
    16141619                }
     
    16351640        if (uVersion >= VBOX_ICH9PCI_SAVED_STATE_VERSION_4KB_CFG_SPACE)
    16361641        {
    1637             rc = SSMR3GetU32(pSSM, &cbConfig);
     1642            rc = pHlp->pfnSSMGetU32(pSSM, &cbConfig);
    16381643            AssertRCReturn(rc, rc);
    16391644            if (cbConfig != 256 && cbConfig != _4K)
    1640                 return SSMR3SetLoadError(pSSM, VERR_SSM_DATA_UNIT_FORMAT_CHANGED, RT_SRC_POS,
    1641                                          "cbConfig=%#RX32, expected 0x100 or 0x1000", cbConfig);
    1642         }
    1643         SSMR3GetMem(pSSM, u.DevTmp.abConfig, cbConfig);
    1644 
    1645         SSMR3GetU32(pSSM, &u.DevTmp.Int.s.fFlags);
    1646         SSMR3GetS32(pSSM, &u.DevTmp.Int.s.uIrqPinState);
    1647         SSMR3GetU8(pSSM, &u.DevTmp.Int.s.u8MsiCapOffset);
    1648         SSMR3GetU8(pSSM, &u.DevTmp.Int.s.u8MsiCapSize);
    1649         SSMR3GetU8(pSSM, &u.DevTmp.Int.s.u8MsixCapOffset);
    1650         rc = SSMR3GetU8(pSSM, &u.DevTmp.Int.s.u8MsixCapSize);
     1645                return pHlp->pfnSSMSetLoadError(pSSM, VERR_SSM_DATA_UNIT_FORMAT_CHANGED, RT_SRC_POS,
     1646                                                "cbConfig=%#RX32, expected 0x100 or 0x1000", cbConfig);
     1647        }
     1648        pHlp->pfnSSMGetMem(pSSM, u.DevTmp.abConfig, cbConfig);
     1649
     1650        pHlp->pfnSSMGetU32(pSSM, &u.DevTmp.Int.s.fFlags);
     1651        pHlp->pfnSSMGetS32(pSSM, &u.DevTmp.Int.s.uIrqPinState);
     1652        pHlp->pfnSSMGetU8(pSSM, &u.DevTmp.Int.s.u8MsiCapOffset);
     1653        pHlp->pfnSSMGetU8(pSSM, &u.DevTmp.Int.s.u8MsiCapSize);
     1654        pHlp->pfnSSMGetU8(pSSM, &u.DevTmp.Int.s.u8MsixCapOffset);
     1655        rc = pHlp->pfnSSMGetU8(pSSM, &u.DevTmp.Int.s.u8MsixCapSize);
    16511656        AssertRCReturn(rc, rc);
    16521657
     
    16551660        if (uVersion >= VBOX_ICH9PCI_SAVED_STATE_VERSION_4KB_CFG_SPACE)
    16561661        {
    1657             rc = SSMR3GetU32(pSSM, &cbMsixState);
     1662            rc = pHlp->pfnSSMGetU32(pSSM, &cbMsixState);
    16581663            AssertRCReturn(rc, rc);
    16591664        }
     
    16621667            if (   cbMsixState > (uint32_t)(pDev ? pDev->cbMsixState : _32K + _16K)
    16631668                || cbMsixState > sizeof(u) - RT_UOFFSETOF(PDMPCIDEV, abMsixState))
    1664                 return SSMR3SetLoadError(pSSM, VERR_SSM_DATA_UNIT_FORMAT_CHANGED, RT_SRC_POS,
    1665                                          "cbMsixState=%#RX32, expected at most RT_MIN(%#x, %#zx)",
    1666                                          cbMsixState, (pDev ? pDev->cbMsixState : _32K + _16K),
    1667                                          sizeof(u) - RT_UOFFSETOF(PDMPCIDEV, abMsixState));
    1668             rc = SSMR3GetMem(pSSM, u.DevTmp.abMsixState, cbMsixState);
     1669                return pHlp->pfnSSMSetLoadError(pSSM, VERR_SSM_DATA_UNIT_FORMAT_CHANGED, RT_SRC_POS,
     1670                                                "cbMsixState=%#RX32, expected at most RT_MIN(%#x, %#zx)",
     1671                                                cbMsixState, (pDev ? pDev->cbMsixState : _32K + _16K),
     1672                                                sizeof(u) - RT_UOFFSETOF(PDMPCIDEV, abMsixState));
     1673            rc = pHlp->pfnSSMGetMem(pSSM, u.DevTmp.abMsixState, cbMsixState);
    16691674            AssertRCReturn(rc, rc);
    16701675        }
     
    16751680            for (uint32_t iRegion = 0; iRegion < VBOX_PCI_NUM_REGIONS; iRegion++)
    16761681            {
    1677                 SSMR3GetU8(pSSM, &u.DevTmp.Int.s.aIORegions[iRegion].type);
    1678                 rc = SSMR3GetU64(pSSM, &u.DevTmp.Int.s.aIORegions[iRegion].size);
     1682                pHlp->pfnSSMGetU8(pSSM, &u.DevTmp.Int.s.aIORegions[iRegion].type);
     1683                rc = pHlp->pfnSSMGetU64(pSSM, &u.DevTmp.Int.s.aIORegions[iRegion].size);
    16791684                AssertLogRelRCReturn(rc, rc);
    16801685            }
     
    16901695            LogRel(("PCI: Device in slot %#x has been removed! vendor=%#06x device=%#06x\n", uDevFn,
    16911696                    PDMPciDevGetVendorId(&u.DevTmp), PDMPciDevGetDeviceId(&u.DevTmp)));
    1692             if (SSMR3HandleGetAfter(pSSM) != SSMAFTER_DEBUG_IT)
     1697            if (pHlp->pfnSSMHandleGetAfter(pSSM) != SSMAFTER_DEBUG_IT)
    16931698            {
    16941699                /* safe, only needs to go to the config space array */
    1695                 rc = SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Device in slot %#x has been removed! vendor=%#06x device=%#06x"),
    1696                                       uDevFn, PDMPciDevGetVendorId(&u.DevTmp), PDMPciDevGetDeviceId(&u.DevTmp));
     1700                rc = pHlp->pfnSSMSetCfgError(pSSM, RT_SRC_POS, N_("Device in slot %#x has been removed! vendor=%#06x device=%#06x"),
     1701                                             uDevFn, PDMPciDevGetVendorId(&u.DevTmp), PDMPciDevGetDeviceId(&u.DevTmp));
    16971702                break;
    16981703            }
     
    17051710        {
    17061711            /* safe, only needs to go to the config space array */
    1707             rc = SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Device in slot %#x (%s) vendor id mismatch! saved=%.4Rhxs current=%.4Rhxs"),
    1708                                   uDevFn, pDev->pszNameR3, PDMPciDevGetVendorId(&u.DevTmp), PDMPciDevGetVendorId(pDev));
     1712            rc = pHlp->pfnSSMSetCfgError(pSSM, RT_SRC_POS, N_("Device in slot %#x (%s) vendor id mismatch! saved=%.4Rhxs current=%.4Rhxs"),
     1713                                         uDevFn, pDev->pszNameR3, PDMPciDevGetVendorId(&u.DevTmp), PDMPciDevGetVendorId(pDev));
    17091714            break;
    17101715        }
     
    17361741static DECLCALLBACK(int) ich9pciR3LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)
    17371742{
    1738     PDEVPCIROOT pThis = PDMINS_2_DATA(pDevIns, PDEVPCIROOT);
    1739     PDEVPCIBUS  pBus  = &pThis->PciBus;
    1740     uint32_t    u32;
    1741     int         rc;
     1743    PDEVPCIROOT     pThis = PDMINS_2_DATA(pDevIns, PDEVPCIROOT);
     1744    PCPDMDEVHLPR3   pHlp  = pDevIns->pHlpR3;
     1745    PDEVPCIBUS      pBus  = &pThis->PciBus;
     1746    uint32_t        u32;
     1747    int             rc;
    17421748
    17431749    /* We ignore this version as there's no saved state with it anyway */
     
    17501756     * Bus state data.
    17511757     */
    1752     SSMR3GetU32(pSSM, &pThis->uConfigReg);
     1758    pHlp->pfnSSMGetU32(pSSM, &pThis->uConfigReg);
    17531759
    17541760    /*
     
    17561762     */
    17571763    for (unsigned i = 0; i < RT_ELEMENTS(pThis->auPciApicIrqLevels); i++)
    1758         SSMR3GetU32V(pSSM, &pThis->auPciApicIrqLevels[i]);
     1764        pHlp->pfnSSMGetU32V(pSSM, &pThis->auPciApicIrqLevels[i]);
    17591765
    17601766    /* separator */
    1761     rc = SSMR3GetU32(pSSM, &u32);
     1767    rc = pHlp->pfnSSMGetU32(pSSM, &u32);
    17621768    if (RT_FAILURE(rc))
    17631769        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