VirtualBox

Changeset 63685 in vbox


Ignore:
Timestamp:
Sep 2, 2016 10:28:52 AM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
110445
Message:

PDM,DevPci*: Allow larger PCI region sizes.

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/pdmdev.h

    r63682 r63685  
    569569     * @remarks Caller enters the PDM critical section.
    570570     */
    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));
    572573
    573574    /**
     
    587588     * @thread  EMT
    588589     */
    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,
    590592                                                        PFNPCICONFIGWRITE pfnWrite, PPFNPCICONFIGWRITE ppfnWriteOld));
    591593
     
    624626
    625627/** 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)
    627629
    628630/**
     
    30743076     *          is NOT take because that is very likely be a lock order violation.
    30753077     */
    3076     DECLR3CALLBACKMEMBER(int, pfnPCIIORegionRegister,(PPDMDEVINS pDevIns, int iRegion, uint32_t cbRegion,
     3078    DECLR3CALLBACKMEMBER(int, pfnPCIIORegionRegister,(PPDMDEVINS pDevIns, int iRegion, RTGCPHYS cbRegion,
    30773079                                                      PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback));
    30783080
     
    49974999 * @copydoc PDMDEVHLPR3::pfnPCIIORegionRegister
    49985000 */
    4999 DECLINLINE(int) PDMDevHlpPCIIORegionRegister(PPDMDEVINS pDevIns, int iRegion, uint32_t cbRegion,
     5001DECLINLINE(int) PDMDevHlpPCIIORegionRegister(PPDMDEVINS pDevIns, int iRegion, RTGCPHYS cbRegion,
    50005002                                             PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback)
    50015003{
  • trunk/src/VBox/Devices/Bus/DevPCI.cpp

    r63663 r63685  
    18041804 * @interface_method_impl{PDMPCIBUSREG,pfnIORegionRegisterR3}
    18051805 */
    1806 static DECLCALLBACK(int) pciR3CommonIORegionRegister(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iRegion, uint32_t cbRegion,
     1806static DECLCALLBACK(int) pciR3CommonIORegionRegister(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iRegion, RTGCPHYS cbRegion,
    18071807                                                     PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback)
    18081808{
     
    18201820                    ("Invalid iRegion=%d PCI_NUM_REGIONS=%d\n", iRegion, PCI_NUM_REGIONS),
    18211821                    VERR_INVALID_PARAMETER);
    1822     int iLastSet = ASMBitLastSetU32(cbRegion);
     1822    int iLastSet = ASMBitLastSetU64(cbRegion);
    18231823    AssertMsgReturn(    iLastSet != 0
    1824                     &&  RT_BIT_32(iLastSet - 1) == cbRegion,
    1825                     ("Invalid cbRegion=%#x iLastSet=%#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),
    18261826                    VERR_INVALID_PARAMETER);
    18271827
     
    18361836
    18371837    /* 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);
    18421842
    18431843    return VINF_SUCCESS;
  • trunk/src/VBox/Devices/Bus/DevPciIch9.cpp

    r63667 r63685  
    10131013}
    10141014
    1015 static DECLCALLBACK(int) ich9pciIORegionRegister(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iRegion, uint32_t cbRegion, PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback)
     1015static DECLCALLBACK(int) ich9pciIORegionRegister(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iRegion, RTGCPHYS cbRegion,
     1016                                                 PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback)
    10161017{
    10171018    NOREF(pDevIns);
     
    10311032                    ("Invalid iRegion=%d PCI_NUM_REGIONS=%d\n", iRegion, PCI_NUM_REGIONS),
    10321033                    VERR_INVALID_PARAMETER);
    1033     int iLastSet = ASMBitLastSetU32(cbRegion);
     1034    int iLastSet = ASMBitLastSetU64(cbRegion);
    10341035    AssertMsgReturn(    iLastSet != 0
    1035                     &&  RT_BIT_32(iLastSet - 1) == cbRegion,
    1036                     ("Invalid cbRegion=%#x iLastSet=%#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),
    10371038                    VERR_INVALID_PARAMETER);
    10381039
    1039     Log(("ich9pciIORegionRegister: %s region %d size %d type %x\n",
     1040    Log(("ich9pciIORegionRegister: %s region %d size %RGp type %x\n",
    10401041         pPciDev->name, iRegion, cbRegion, enmType));
    10411042
     
    10551056    {
    10561057        /* 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,
    10581059                        ("Region %d cannot be 64-bit\n", iRegion),
    10591060                        VERR_INVALID_PARAMETER);
    10601061        /* 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;
    10621063    }
    10631064
    10641065    /* 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);
    10661067    PCIDevSetDWord(pPciDev, ich9pciGetRegionReg(iRegion), u32Value);
    10671068
  • trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp

    r63682 r63685  
    12471247
    12481248/** @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",
     1249static 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",
    12551256             pDevIns->pReg->szName, pDevIns->iInstance, iRegion, cbRegion, enmType, pfnCallback));
    12561257
     
    12641265        return VERR_INVALID_PARAMETER;
    12651266    }
     1267
    12661268    switch ((int)enmType)
    12671269    {
     
    12701272             * Sanity check: don't allow to register more than 32K of the PCI I/O space.
    12711273             */
    1272             AssertMsgReturn(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);
    12751277            break;
    12761278
    12771279        case PCI_ADDRESS_SPACE_MEM:
    12781280        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:
    12811281            /*
    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.
    12841283             */
    1285             AssertMsgReturn(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);
    12881287            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
    12891299        default:
    12901300            AssertMsgFailed(("enmType=%#x is unknown\n", enmType));
     
    13101320         * We're currently restricted to page aligned MMIO regions.
    13111321         */
    1312         if (    ((enmType & ~(PCI_ADDRESS_SPACE_BAR64 | PCI_ADDRESS_SPACE_MEM_PREFETCH)) == PCI_ADDRESS_SPACE_MEM)
    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);
    13181328        }
    13191329
     
    13211331         * For registering PCI MMIO memory or PCI I/O memory, the size of the region must be a power of 2!
    13221332         */
    1323         int iLastSet = ASMBitLastSetU32(cbRegion);
     1333        int iLastSet = ASMBitLastSetU64(cbRegion);
    13241334        Assert(iLastSet > 0);
    1325         uint32_t cbRegionAligned = RT_BIT_32(iLastSet - 1);
     1335        uint64_t cbRegionAligned = RT_BIT_64(iLastSet - 1);
    13261336        if (cbRegion > cbRegionAligned)
    13271337            cbRegion = cbRegionAligned * 2; /* round up */
  • trunk/src/VBox/VMM/include/PDMInternal.h

    r62478 r63685  
    718718    DECLR3CALLBACKMEMBER(int,       pfnRegisterMsiR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, PPDMMSIREG pMsiReg));
    719719    /** @copydoc PDMPCIBUSREG::pfnIORegionRegisterR3 */
    720     DECLR3CALLBACKMEMBER(int,       pfnIORegionRegisterR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iRegion, uint32_t cbRegion,
     720    DECLR3CALLBACKMEMBER(int,       pfnIORegionRegisterR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iRegion, RTGCPHYS cbRegion,
    721721                                                           PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback));
    722722    /** @copydoc PDMPCIBUSREG::pfnSetConfigCallbacksR3 */
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