Changeset 63685 in vbox
- Timestamp:
- Sep 2, 2016 10:28:52 AM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 110445
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/pdmdev.h
r63682 r63685 569 569 * @remarks Caller enters the PDM critical section. 570 570 */ 571 DECLR3CALLBACKMEMBER(int, pfnIORegionRegisterR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iRegion, uint32_t cbRegion, PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback)); 571 DECLR3CALLBACKMEMBER(int, pfnIORegionRegisterR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iRegion, RTGCPHYS cbRegion, 572 PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback)); 572 573 573 574 /** … … 587 588 * @thread EMT 588 589 */ 589 DECLR3CALLBACKMEMBER(void, pfnSetConfigCallbacksR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, PFNPCICONFIGREAD pfnRead, PPFNPCICONFIGREAD ppfnReadOld, 590 DECLR3CALLBACKMEMBER(void, pfnSetConfigCallbacksR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, 591 PFNPCICONFIGREAD pfnRead, PPFNPCICONFIGREAD ppfnReadOld, 590 592 PFNPCICONFIGWRITE pfnWrite, PPFNPCICONFIGWRITE ppfnWriteOld)); 591 593 … … 624 626 625 627 /** Current PDMPCIBUSREG version number. */ 626 #define PDM_PCIBUSREG_VERSION PDM_VERSION_MAKE(0xfffe, 4, 0)628 #define PDM_PCIBUSREG_VERSION PDM_VERSION_MAKE(0xfffe, 5, 0) 627 629 628 630 /** … … 3074 3076 * is NOT take because that is very likely be a lock order violation. 3075 3077 */ 3076 DECLR3CALLBACKMEMBER(int, pfnPCIIORegionRegister,(PPDMDEVINS pDevIns, int iRegion, uint32_tcbRegion,3078 DECLR3CALLBACKMEMBER(int, pfnPCIIORegionRegister,(PPDMDEVINS pDevIns, int iRegion, RTGCPHYS cbRegion, 3077 3079 PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback)); 3078 3080 … … 4997 4999 * @copydoc PDMDEVHLPR3::pfnPCIIORegionRegister 4998 5000 */ 4999 DECLINLINE(int) PDMDevHlpPCIIORegionRegister(PPDMDEVINS pDevIns, int iRegion, uint32_tcbRegion,5001 DECLINLINE(int) PDMDevHlpPCIIORegionRegister(PPDMDEVINS pDevIns, int iRegion, RTGCPHYS cbRegion, 5000 5002 PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback) 5001 5003 { -
trunk/src/VBox/Devices/Bus/DevPCI.cpp
r63663 r63685 1804 1804 * @interface_method_impl{PDMPCIBUSREG,pfnIORegionRegisterR3} 1805 1805 */ 1806 static DECLCALLBACK(int) pciR3CommonIORegionRegister(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iRegion, uint32_tcbRegion,1806 static DECLCALLBACK(int) pciR3CommonIORegionRegister(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iRegion, RTGCPHYS cbRegion, 1807 1807 PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback) 1808 1808 { … … 1820 1820 ("Invalid iRegion=%d PCI_NUM_REGIONS=%d\n", iRegion, PCI_NUM_REGIONS), 1821 1821 VERR_INVALID_PARAMETER); 1822 int iLastSet = ASMBitLastSetU 32(cbRegion);1822 int iLastSet = ASMBitLastSetU64(cbRegion); 1823 1823 AssertMsgReturn( iLastSet != 0 1824 && RT_BIT_ 32(iLastSet - 1) == cbRegion,1825 ("Invalid cbRegion=% #xiLastSet=%#x (not a power of 2 or 0)\n", cbRegion, iLastSet),1824 && RT_BIT_64(iLastSet - 1) == cbRegion, 1825 ("Invalid cbRegion=%RGp iLastSet=%#x (not a power of 2 or 0)\n", cbRegion, iLastSet), 1826 1826 VERR_INVALID_PARAMETER); 1827 1827 … … 1836 1836 1837 1837 /* Set type in the config space. */ 1838 uint32_t u32Address = 0x10 + iRegion * 4;1839 uint32_t u32Value = (enmType == PCI_ADDRESS_SPACE_MEM_PREFETCH ? (1 << 3) : 0)1840 | (enmType == PCI_ADDRESS_SPACE_IO ? 1 : 0);1841 *(uint32_t *)(pPciDev->config + u32Address) = RT_H2LE_U32(u32Value);1838 AssertCompile(PCI_ADDRESS_SPACE_MEM == 0); 1839 AssertCompile(PCI_ADDRESS_SPACE_IO == 1); 1840 AssertCompile(PCI_ADDRESS_SPACE_MEM_PREFETCH == RT_BIT_32(3)); 1841 PCIDevSetDWord(pPciDev, 0x10 + iRegion * 4, enmType); 1842 1842 1843 1843 return VINF_SUCCESS; -
trunk/src/VBox/Devices/Bus/DevPciIch9.cpp
r63667 r63685 1013 1013 } 1014 1014 1015 static DECLCALLBACK(int) ich9pciIORegionRegister(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iRegion, uint32_t cbRegion, PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback) 1015 static DECLCALLBACK(int) ich9pciIORegionRegister(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iRegion, RTGCPHYS cbRegion, 1016 PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback) 1016 1017 { 1017 1018 NOREF(pDevIns); … … 1031 1032 ("Invalid iRegion=%d PCI_NUM_REGIONS=%d\n", iRegion, PCI_NUM_REGIONS), 1032 1033 VERR_INVALID_PARAMETER); 1033 int iLastSet = ASMBitLastSetU 32(cbRegion);1034 int iLastSet = ASMBitLastSetU64(cbRegion); 1034 1035 AssertMsgReturn( iLastSet != 0 1035 && RT_BIT_ 32(iLastSet - 1) == cbRegion,1036 ("Invalid cbRegion=% #xiLastSet=%#x (not a power of 2 or 0)\n", cbRegion, iLastSet),1036 && RT_BIT_64(iLastSet - 1) == cbRegion, 1037 ("Invalid cbRegion=%RGp iLastSet=%#x (not a power of 2 or 0)\n", cbRegion, iLastSet), 1037 1038 VERR_INVALID_PARAMETER); 1038 1039 1039 Log(("ich9pciIORegionRegister: %s region %d size % dtype %x\n",1040 Log(("ich9pciIORegionRegister: %s region %d size %RGp type %x\n", 1040 1041 pPciDev->name, iRegion, cbRegion, enmType)); 1041 1042 … … 1055 1056 { 1056 1057 /* VBOX_PCI_BASE_ADDRESS_5 and VBOX_PCI_ROM_ADDRESS are excluded. */ 1057 AssertMsgReturn(iRegion < (PCI_NUM_REGIONS-2),1058 AssertMsgReturn(iRegion < PCI_NUM_REGIONS - 2, 1058 1059 ("Region %d cannot be 64-bit\n", iRegion), 1059 1060 VERR_INVALID_PARAMETER); 1060 1061 /* Mark next region as continuation of this one. */ 1061 pPciDev->Int.s.aIORegions[iRegion +1].type = 0xff;1062 pPciDev->Int.s.aIORegions[iRegion + 1].type = 0xff; 1062 1063 } 1063 1064 1064 1065 /* Set type in the PCI config space. */ 1065 uint32_t u32Value = ( (uint32_t)enmType)& (PCI_ADDRESS_SPACE_IO | PCI_ADDRESS_SPACE_BAR64 | PCI_ADDRESS_SPACE_MEM_PREFETCH);1066 uint32_t u32Value = (uint32_t)enmType & (PCI_ADDRESS_SPACE_IO | PCI_ADDRESS_SPACE_BAR64 | PCI_ADDRESS_SPACE_MEM_PREFETCH); 1066 1067 PCIDevSetDWord(pPciDev, ich9pciGetRegionReg(iRegion), u32Value); 1067 1068 -
trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp
r63682 r63685 1247 1247 1248 1248 /** @interface_method_impl{PDMDEVHLPR3,pfnPCIIORegionRegister} */ 1249 static DECLCALLBACK(int) pdmR3DevHlp_PCIIORegionRegister(PPDMDEVINS pDevIns, int iRegion, uint32_t cbRegion, PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback) 1250 { 1251 PDMDEV_ASSERT_DEVINS(pDevIns); 1252 PVM pVM = pDevIns->Internal.s.pVMR3; 1253 VM_ASSERT_EMT(pVM); 1254 LogFlow(("pdmR3DevHlp_PCIIORegionRegister: caller='%s'/%d: iRegion=%d cbRegion=%#x enmType=%d pfnCallback=%p\n", 1249 static DECLCALLBACK(int) pdmR3DevHlp_PCIIORegionRegister(PPDMDEVINS pDevIns, int iRegion, RTGCPHYS cbRegion, 1250 PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback) 1251 { 1252 PDMDEV_ASSERT_DEVINS(pDevIns); 1253 PVM pVM = pDevIns->Internal.s.pVMR3; 1254 VM_ASSERT_EMT(pVM); 1255 LogFlow(("pdmR3DevHlp_PCIIORegionRegister: caller='%s'/%d: iRegion=%d cbRegion=%RGp enmType=%d pfnCallback=%p\n", 1255 1256 pDevIns->pReg->szName, pDevIns->iInstance, iRegion, cbRegion, enmType, pfnCallback)); 1256 1257 … … 1264 1265 return VERR_INVALID_PARAMETER; 1265 1266 } 1267 1266 1268 switch ((int)enmType) 1267 1269 { … … 1270 1272 * Sanity check: don't allow to register more than 32K of the PCI I/O space. 1271 1273 */ 1272 Assert MsgReturn(cbRegion <= _32K,1273 ("caller='%s'/%d: %#x\n", pDevIns->pReg->szName, pDevIns->iInstance, cbRegion),1274 VERR_INVALID_PARAMETER);1274 AssertLogRelMsgReturn(cbRegion <= _32K, 1275 ("caller='%s'/%d: %#x\n", pDevIns->pReg->szName, pDevIns->iInstance, cbRegion), 1276 VERR_INVALID_PARAMETER); 1275 1277 break; 1276 1278 1277 1279 case PCI_ADDRESS_SPACE_MEM: 1278 1280 case PCI_ADDRESS_SPACE_MEM_PREFETCH: 1279 case PCI_ADDRESS_SPACE_MEM | PCI_ADDRESS_SPACE_BAR64:1280 case PCI_ADDRESS_SPACE_MEM_PREFETCH | PCI_ADDRESS_SPACE_BAR64:1281 1281 /* 1282 * Sanity check: don't allow to register more than 512MB of the PCI MMIO space for 1283 * now. If this limit is increased beyond 2GB, adapt the aligned check below as well! 1282 * Sanity check: Don't allow to register more than 2GB of the PCI MMIO space. 1284 1283 */ 1285 Assert MsgReturn(cbRegion <= 512 * _1M,1286 ("caller='%s'/%d: %#x\n", pDevIns->pReg->szName, pDevIns->iInstance, cbRegion),1287 VERR_INVALID_PARAMETER);1284 AssertLogRelMsgReturn(cbRegion <= _2G, 1285 ("caller='%s'/%d: %RGp\n", pDevIns->pReg->szName, pDevIns->iInstance, cbRegion), 1286 VERR_OUT_OF_RANGE); 1288 1287 break; 1288 1289 case PCI_ADDRESS_SPACE_BAR64 | PCI_ADDRESS_SPACE_MEM: 1290 case PCI_ADDRESS_SPACE_BAR64 | PCI_ADDRESS_SPACE_MEM_PREFETCH: 1291 /* 1292 * Sanity check: Don't allow to register more than 64GB of the 64-bit PCI MMIO space. 1293 */ 1294 AssertLogRelMsgReturn(cbRegion <= 64*_1G64, 1295 ("caller='%s'/%d: %RGp\n", pDevIns->pReg->szName, pDevIns->iInstance, cbRegion), 1296 VERR_OUT_OF_RANGE); 1297 break; 1298 1289 1299 default: 1290 1300 AssertMsgFailed(("enmType=%#x is unknown\n", enmType)); … … 1310 1320 * We're currently restricted to page aligned MMIO regions. 1311 1321 */ 1312 if ( 1313 && cbRegion != RT_ALIGN_32(cbRegion, PAGE_SIZE))1314 { 1315 Log(("pdmR3DevHlp_PCIIORegionRegister: caller='%s'/%d: aligning cbRegion % #x -> %#x\n",1316 pDevIns->pReg->szName, pDevIns->iInstance, cbRegion, RT_ALIGN_ 32(cbRegion, PAGE_SIZE)));1317 cbRegion = RT_ALIGN_ 32(cbRegion, PAGE_SIZE);1322 if ( ((enmType & ~(PCI_ADDRESS_SPACE_BAR64 | PCI_ADDRESS_SPACE_MEM_PREFETCH)) == PCI_ADDRESS_SPACE_MEM) 1323 && cbRegion != RT_ALIGN_64(cbRegion, PAGE_SIZE)) 1324 { 1325 Log(("pdmR3DevHlp_PCIIORegionRegister: caller='%s'/%d: aligning cbRegion %RGp -> %RGp\n", 1326 pDevIns->pReg->szName, pDevIns->iInstance, cbRegion, RT_ALIGN_64(cbRegion, PAGE_SIZE))); 1327 cbRegion = RT_ALIGN_64(cbRegion, PAGE_SIZE); 1318 1328 } 1319 1329 … … 1321 1331 * For registering PCI MMIO memory or PCI I/O memory, the size of the region must be a power of 2! 1322 1332 */ 1323 int iLastSet = ASMBitLastSetU 32(cbRegion);1333 int iLastSet = ASMBitLastSetU64(cbRegion); 1324 1334 Assert(iLastSet > 0); 1325 uint 32_t cbRegionAligned = RT_BIT_32(iLastSet - 1);1335 uint64_t cbRegionAligned = RT_BIT_64(iLastSet - 1); 1326 1336 if (cbRegion > cbRegionAligned) 1327 1337 cbRegion = cbRegionAligned * 2; /* round up */ -
trunk/src/VBox/VMM/include/PDMInternal.h
r62478 r63685 718 718 DECLR3CALLBACKMEMBER(int, pfnRegisterMsiR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, PPDMMSIREG pMsiReg)); 719 719 /** @copydoc PDMPCIBUSREG::pfnIORegionRegisterR3 */ 720 DECLR3CALLBACKMEMBER(int, pfnIORegionRegisterR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iRegion, uint32_tcbRegion,720 DECLR3CALLBACKMEMBER(int, pfnIORegionRegisterR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iRegion, RTGCPHYS cbRegion, 721 721 PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback)); 722 722 /** @copydoc PDMPCIBUSREG::pfnSetConfigCallbacksR3 */
Note:
See TracChangeset
for help on using the changeset viewer.