- Timestamp:
- Oct 20, 2021 12:03:15 PM (3 years ago)
- File:
-
- 1 edited
-
trunk/src/VBox/Devices/Bus/DevPciIch9.cpp (modified) (20 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Bus/DevPciIch9.cpp
r90436 r91888 1115 1115 1116 1116 1117 static int ich9pciR3CommonSaveExec(P DEVPCIBUS pBus, PSSMHANDLE pSSM)1117 static int ich9pciR3CommonSaveExec(PCPDMDEVHLPR3 pHlp, PDEVPCIBUS pBus, PSSMHANDLE pSSM) 1118 1118 { 1119 1119 /* … … 1126 1126 { 1127 1127 /* Device position */ 1128 SSMR3PutU32(pSSM, uDevFn);1128 pHlp->pfnSSMPutU32(pSSM, uDevFn); 1129 1129 1130 1130 /* 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)); 1133 1133 1134 1134 /* Device flags */ 1135 SSMR3PutU32(pSSM, pDev->Int.s.fFlags);1135 pHlp->pfnSSMPutU32(pSSM, pDev->Int.s.fFlags); 1136 1136 1137 1137 /* IRQ pin state */ 1138 SSMR3PutS32(pSSM, pDev->Int.s.uIrqPinState);1138 pHlp->pfnSSMPutS32(pSSM, pDev->Int.s.uIrqPinState); 1139 1139 1140 1140 /* 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); 1143 1143 1144 1144 /* 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); 1147 1147 1148 1148 /* Save MSI-X page state */ 1149 1149 if (pDev->Int.s.u8MsixCapOffset != 0) 1150 1150 { 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); 1153 1153 } 1154 1154 else 1155 SSMR3PutU32(pSSM, 0);1155 pHlp->pfnSSMPutU32(pSSM, 0); 1156 1156 1157 1157 /* Save the type an size of all the regions. */ 1158 1158 for (uint32_t iRegion = 0; iRegion < VBOX_PCI_NUM_REGIONS; iRegion++) 1159 1159 { 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); 1162 1162 } 1163 1163 } 1164 1164 } 1165 return SSMR3PutU32(pSSM, UINT32_MAX); /* terminator */1165 return pHlp->pfnSSMPutU32(pSSM, UINT32_MAX); /* terminator */ 1166 1166 } 1167 1167 1168 1168 static DECLCALLBACK(int) ich9pciR3SaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 1169 1169 { 1170 PDEVPCIROOT pThis = PDMINS_2_DATA(pDevIns, PDEVPCIROOT); 1170 PDEVPCIROOT pThis = PDMINS_2_DATA(pDevIns, PDEVPCIROOT); 1171 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 1171 1172 1172 1173 /* 1173 1174 * Bus state data. 1174 1175 */ 1175 SSMR3PutU32(pSSM, pThis->uConfigReg);1176 pHlp->pfnSSMPutU32(pSSM, pThis->uConfigReg); 1176 1177 1177 1178 /* … … 1179 1180 */ 1180 1181 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); 1186 1187 } 1187 1188 … … 1189 1190 static DECLCALLBACK(int) ich9pcibridgeR3SaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 1190 1191 { 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); 1193 1196 } 1194 1197 … … 1486 1489 * 1487 1490 * @returns VBox status code. 1491 * @param pHlp The device instance helper callback table. 1488 1492 * @param pSSM The Saved state handle. 1489 1493 * @param pPciDev The PCI device in question. … … 1493 1497 * and types, clear if old one. 1494 1498 */ 1495 int devpciR3CommonRestoreRegions(P SSMHANDLE pSSM, PPDMPCIDEV pPciDev, PPCIIOREGION paIoRegions, bool fNewState)1499 int devpciR3CommonRestoreRegions(PCPDMDEVHLPR3 pHlp, PSSMHANDLE pSSM, PPDMPCIDEV pPciDev, PPCIIOREGION paIoRegions, bool fNewState) 1496 1500 { 1497 1501 int rc; … … 1515 1519 pPciDev->Int.s.bPadding0 = 0; 1516 1520 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); 1522 1526 } 1523 1527 pPciDev->Int.s.aIORegions[iRegion].type = paIoRegions[iRegion].type; … … 1533 1537 devpciR3CommonRestoreOldSetRegion, NULL); 1534 1538 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); 1537 1541 } 1538 1542 return VINF_SUCCESS; … … 1552 1556 static int ich9pciR3CommonLoadExec(PPDMDEVINS pDevIns, PDEVPCIBUS pBus, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass) 1553 1557 { 1558 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 1554 1559 uint32_t u32; 1555 1560 int rc; … … 1589 1594 { 1590 1595 /* index / terminator */ 1591 rc = SSMR3GetU32(pSSM, &u32);1596 rc = pHlp->pfnSSMGetU32(pSSM, &u32); 1592 1597 if (RT_FAILURE(rc)) 1593 1598 break; … … 1606 1611 LogRel(("PCI: New device in slot %#x, %s (vendor=%#06x device=%#06x)\n", uDevFn, pDev->pszNameR3, 1607 1612 PDMPciDevGetVendorId(pDev), PDMPciDevGetDeviceId(pDev))); 1608 if ( SSMR3HandleGetAfter(pSSM) != SSMAFTER_DEBUG_IT)1613 if (pHlp->pfnSSMHandleGetAfter(pSSM) != SSMAFTER_DEBUG_IT) 1609 1614 { 1610 1615 /* 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)); 1613 1618 break; 1614 1619 } … … 1635 1640 if (uVersion >= VBOX_ICH9PCI_SAVED_STATE_VERSION_4KB_CFG_SPACE) 1636 1641 { 1637 rc = SSMR3GetU32(pSSM, &cbConfig);1642 rc = pHlp->pfnSSMGetU32(pSSM, &cbConfig); 1638 1643 AssertRCReturn(rc, rc); 1639 1644 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); 1651 1656 AssertRCReturn(rc, rc); 1652 1657 … … 1655 1660 if (uVersion >= VBOX_ICH9PCI_SAVED_STATE_VERSION_4KB_CFG_SPACE) 1656 1661 { 1657 rc = SSMR3GetU32(pSSM, &cbMsixState);1662 rc = pHlp->pfnSSMGetU32(pSSM, &cbMsixState); 1658 1663 AssertRCReturn(rc, rc); 1659 1664 } … … 1662 1667 if ( cbMsixState > (uint32_t)(pDev ? pDev->cbMsixState : _32K + _16K) 1663 1668 || 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); 1669 1674 AssertRCReturn(rc, rc); 1670 1675 } … … 1675 1680 for (uint32_t iRegion = 0; iRegion < VBOX_PCI_NUM_REGIONS; iRegion++) 1676 1681 { 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); 1679 1684 AssertLogRelRCReturn(rc, rc); 1680 1685 } … … 1690 1695 LogRel(("PCI: Device in slot %#x has been removed! vendor=%#06x device=%#06x\n", uDevFn, 1691 1696 PDMPciDevGetVendorId(&u.DevTmp), PDMPciDevGetDeviceId(&u.DevTmp))); 1692 if ( SSMR3HandleGetAfter(pSSM) != SSMAFTER_DEBUG_IT)1697 if (pHlp->pfnSSMHandleGetAfter(pSSM) != SSMAFTER_DEBUG_IT) 1693 1698 { 1694 1699 /* 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)); 1697 1702 break; 1698 1703 } … … 1705 1710 { 1706 1711 /* 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)); 1709 1714 break; 1710 1715 } … … 1736 1741 static DECLCALLBACK(int) ich9pciR3LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass) 1737 1742 { 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; 1742 1748 1743 1749 /* We ignore this version as there's no saved state with it anyway */ … … 1750 1756 * Bus state data. 1751 1757 */ 1752 SSMR3GetU32(pSSM, &pThis->uConfigReg);1758 pHlp->pfnSSMGetU32(pSSM, &pThis->uConfigReg); 1753 1759 1754 1760 /* … … 1756 1762 */ 1757 1763 for (unsigned i = 0; i < RT_ELEMENTS(pThis->auPciApicIrqLevels); i++) 1758 SSMR3GetU32V(pSSM, &pThis->auPciApicIrqLevels[i]);1764 pHlp->pfnSSMGetU32V(pSSM, &pThis->auPciApicIrqLevels[i]); 1759 1765 1760 1766 /* separator */ 1761 rc = SSMR3GetU32(pSSM, &u32);1767 rc = pHlp->pfnSSMGetU32(pSSM, &u32); 1762 1768 if (RT_FAILURE(rc)) 1763 1769 return rc;
Note:
See TracChangeset
for help on using the changeset viewer.

