VirtualBox

Changeset 64456 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Oct 28, 2016 1:03:24 PM (8 years ago)
Author:
vboxsync
Message:

DevPci: Cleaning up ich9pciConfigWriteDev.

Location:
trunk/src/VBox/Devices/Bus
Files:
4 edited

Legend:

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

    r64452 r64456  
    205205
    206206
    207 static DECLCALLBACK(uint32_t) pci_default_read_config(PPDMDEVINS pDevIns, PDMPCIDEV *d, uint32_t address, unsigned len)
    208 {
    209     NOREF(pDevIns);
    210     uint32_t val;
    211     switch(len) {
    212     case 1:
    213         val = d->abConfig[address];
    214         break;
    215     case 2:
    216         val = RT_LE2H_U16(*(uint16_t *)(d->abConfig + address));
    217         break;
    218     default:
    219     case 4:
    220         val = RT_LE2H_U32(*(uint32_t *)(d->abConfig + address));
    221         break;
    222     }
    223     return val;
    224 }
    225 
    226207static DECLCALLBACK(void) pci_default_write_config(PPDMDEVINS pDevIns, PDMPCIDEV *d, uint32_t address, uint32_t val, unsigned len)
    227208{
     
    11051086 *       as a possible file #2 contains external code if there's any left.
    11061087 */
    1107 # define pciR3UnmergedConfigReadDev  pci_default_read_config
    11081088# define pciR3UnmergedConfigWriteDev pci_default_write_config
    11091089# include "DevPciMerge1.cpp.h"
  • trunk/src/VBox/Devices/Bus/DevPciIch9.cpp

    r64454 r64456  
    8181static void ich9pcibridgeReset(PPDMDEVINS pDevIns);
    8282static void ich9pciUpdateMappings(PDMPCIDEV *pDev);
    83 static DECLCALLBACK(uint32_t) ich9pciConfigReadDev(PPDMDEVINS pDevIns, PPDMPCIDEV pPciDev, uint32_t u32Address, unsigned len);
    8483static DECLCALLBACK(void)     ich9pciConfigWriteDev(PPDMDEVINS pDevIns, PPDMPCIDEV pPciDev, uint32_t u32Address, uint32_t val, unsigned len);
    8584DECLINLINE(PPDMPCIDEV) ich9pciFindBridge(PDEVPCIBUS pBus, uint8_t iBus);
     
    684683 *       as a possible file #2 contains external code if there's any left.
    685684 */
    686 # define pciR3UnmergedConfigReadDev  ich9pciConfigReadDev
    687685# define pciR3UnmergedConfigWriteDev ich9pciConfigWriteDev
    688686# include "DevPciMerge1.cpp.h"
     
    18871885 * @callback_method_impl{PFNPCICONFIGREAD, Default config space read callback.}
    18881886 */
    1889 static DECLCALLBACK(uint32_t) ich9pciConfigReadDev(PPDMDEVINS pDevIns, PPDMPCIDEV pPciDev, uint32_t uAddress, unsigned cb)
     1887DECLCALLBACK(uint32_t) devpciR3CommonDefaultConfigRead(PPDMDEVINS pDevIns, PPDMPCIDEV pPciDev, uint32_t uAddress, unsigned cb)
    18901888{
    18911889    NOREF(pDevIns);
     
    19141912        if (   pciDevIsMsiCapable(pPciDev)
    19151913            && uAddress - (uint32_t)pPciDev->Int.s.u8MsiCapOffset < (uint32_t)pPciDev->Int.s.u8MsiCapSize )
    1916             Log2(("ich9pciConfigReadDev: MSI CAP: %#x LB %u -> %#x\n", uAddress - (uint32_t)pPciDev->Int.s.u8MsiCapOffset, cb, uValue));
     1914            Log2(("devpciR3CommonDefaultConfigRead: MSI CAP: %#x LB %u -> %#x\n", uAddress - (uint32_t)pPciDev->Int.s.u8MsiCapOffset, cb, uValue));
    19171915        else if (   pciDevIsMsixCapable(pPciDev)
    19181916                 && uAddress - (uint32_t)pPciDev->Int.s.u8MsixCapOffset < (uint32_t)pPciDev->Int.s.u8MsixCapSize)
    1919             Log2(("ich9pciConfigReadDev: MSI-X CAP: %#x LB %u -> %#x\n", uAddress - (uint32_t)pPciDev->Int.s.u8MsiCapOffset, cb, uValue));
     1917            Log2(("devpciR3CommonDefaultConfigRead: MSI-X CAP: %#x LB %u -> %#x\n", uAddress - (uint32_t)pPciDev->Int.s.u8MsiCapOffset, cb, uValue));
    19201918#endif
    19211919    }
     
    19781976
    19791977/**
    1980  * Configuration space write callback (PCIDEVICEINT::pfnConfigWrite)
    1981  * for connected devices.
     1978 * @callback_method_impl{PFNPCICONFIGWRITE,
     1979 *      Default config space write callback.}
    19821980 *
    19831981 * See paragraph 7.5 of PCI Express specification (p. 349) for
     
    19851983 */
    19861984static DECLCALLBACK(void) ich9pciConfigWriteDev(PPDMDEVINS pDevIns, PPDMPCIDEV pPciDev,
    1987                                                 uint32_t u32Address, uint32_t val, unsigned len)
     1985                                                uint32_t uAddress, uint32_t u32Value, unsigned cb)
    19881986{
    19891987    NOREF(pDevIns);
    1990     Assert(len <= 4);
    1991 
    1992     if ((u32Address + len) > 256 && (u32Address + len) < 4096)
     1988    Assert(cb <= 4);
     1989
     1990    if ((uAddress + cb) > 256 && (uAddress + cb) < 4096)
    19931991    {
    19941992        LogRel(("PCI: %8s/%u: Write to extended register %d fallen back to generic code\n",
    1995                 pPciDev->pszNameR3, pPciDev->Int.s.CTX_SUFF(pDevIns)->iInstance, u32Address));
     1993                pPciDev->pszNameR3, pPciDev->Int.s.CTX_SUFF(pDevIns)->iInstance, uAddress));
    19961994        return;
    19971995    }
    19981996
    1999     AssertMsgReturnVoid(u32Address + len <= 256, ("Write after end of PCI config space\n"));
     1997    AssertMsgReturnVoid(uAddress + cb <= 256, ("Write after end of PCI config space\n"));
    20001998
    20011999    if (   pciDevIsMsiCapable(pPciDev)
    2002         && (u32Address >= pPciDev->Int.s.u8MsiCapOffset)
    2003         && (u32Address < (unsigned)(pPciDev->Int.s.u8MsiCapOffset + pPciDev->Int.s.u8MsiCapSize))
     2000        && (uAddress >= pPciDev->Int.s.u8MsiCapOffset)
     2001        && (uAddress < (unsigned)(pPciDev->Int.s.u8MsiCapOffset + pPciDev->Int.s.u8MsiCapSize))
    20042002       )
    20052003    {
    20062004        MsiPciConfigWrite(pPciDev->Int.s.CTX_SUFF(pBus)->CTX_SUFF(pDevIns),
    20072005                          pPciDev->Int.s.CTX_SUFF(pBus)->CTX_SUFF(pPciHlp),
    2008                           pPciDev, u32Address, val, len);
     2006                          pPciDev, uAddress, u32Value, cb);
    20092007        return;
    20102008    }
    20112009
    20122010    if (   pciDevIsMsixCapable(pPciDev)
    2013         && (u32Address >= pPciDev->Int.s.u8MsixCapOffset)
    2014         && (u32Address < (unsigned)(pPciDev->Int.s.u8MsixCapOffset + pPciDev->Int.s.u8MsixCapSize))
     2011        && (uAddress >= pPciDev->Int.s.u8MsixCapOffset)
     2012        && (uAddress < (unsigned)(pPciDev->Int.s.u8MsixCapOffset + pPciDev->Int.s.u8MsixCapSize))
    20152013       )
    20162014    {
    20172015        MsixPciConfigWrite(pPciDev->Int.s.CTX_SUFF(pBus)->CTX_SUFF(pDevIns),
    20182016                           pPciDev->Int.s.CTX_SUFF(pBus)->CTX_SUFF(pPciHlp),
    2019                            pPciDev, u32Address, val, len);
     2017                           pPciDev, uAddress, u32Value, cb);
    20202018        return;
    20212019    }
    20222020
    2023     uint32_t addr = u32Address;
    20242021    bool     fUpdateMappings = false;
    2025     bool     fP2PBridge = false;
    2026     /*bool     fPassthrough = pciDevIsPassthrough(pPciDev);*/
    2027     uint8_t  u8HeaderType = ich9pciGetByte(pPciDev, VBOX_PCI_HEADER_TYPE);
    2028 
    2029     for (uint32_t i = 0; i < len; i++)
     2022    bool     fP2PBridge      = false;
     2023    uint8_t  bHeaderType     = ich9pciGetByte(pPciDev, VBOX_PCI_HEADER_TYPE);
     2024    while (cb-- > 0)
    20302025    {
    20312026        bool fWritable = false;
    2032         bool fRom = false;
    2033         switch (u8HeaderType)
     2027        switch (bHeaderType)
    20342028        {
    20352029            case 0x00: /* normal device */
    20362030            case 0x80: /* multi-function device */
    2037                 switch (addr)
     2031                switch (uAddress)
    20382032                {
    20392033                    /* Read-only registers  */
    2040                     case VBOX_PCI_VENDOR_ID: case VBOX_PCI_VENDOR_ID+1:
    2041                     case VBOX_PCI_DEVICE_ID: case VBOX_PCI_DEVICE_ID+1:
     2034                    case VBOX_PCI_VENDOR_ID:
     2035                    case VBOX_PCI_VENDOR_ID+1:
     2036                    case VBOX_PCI_DEVICE_ID:
     2037                    case VBOX_PCI_DEVICE_ID+1:
    20422038                    case VBOX_PCI_REVISION_ID:
    20432039                    case VBOX_PCI_CLASS_PROG:
     
    20452041                    case VBOX_PCI_CLASS_BASE:
    20462042                    case VBOX_PCI_HEADER_TYPE:
    2047                     case VBOX_PCI_SUBSYSTEM_VENDOR_ID: case VBOX_PCI_SUBSYSTEM_VENDOR_ID+1:
    2048                     case VBOX_PCI_SUBSYSTEM_ID: case VBOX_PCI_SUBSYSTEM_ID+1:
    2049                     case VBOX_PCI_ROM_ADDRESS: case VBOX_PCI_ROM_ADDRESS+1: case VBOX_PCI_ROM_ADDRESS+2: case VBOX_PCI_ROM_ADDRESS+3:
     2043                    case VBOX_PCI_SUBSYSTEM_VENDOR_ID:
     2044                    case VBOX_PCI_SUBSYSTEM_VENDOR_ID+1:
     2045                    case VBOX_PCI_SUBSYSTEM_ID:
     2046                    case VBOX_PCI_SUBSYSTEM_ID+1:
     2047                    case VBOX_PCI_ROM_ADDRESS:
     2048                    case VBOX_PCI_ROM_ADDRESS+1:
     2049                    case VBOX_PCI_ROM_ADDRESS+2:
     2050                    case VBOX_PCI_ROM_ADDRESS+3:
    20502051                    case VBOX_PCI_CAPABILITY_LIST:
    20512052                    case VBOX_PCI_INTERRUPT_PIN:
     
    20602061            case 0x01: /* PCI-PCI bridge */
    20612062                fP2PBridge = true;
    2062                 switch (addr)
     2063                switch (uAddress)
    20632064                {
    20642065                    /* Read-only registers */
    2065                     case VBOX_PCI_VENDOR_ID: case VBOX_PCI_VENDOR_ID+1:
    2066                     case VBOX_PCI_DEVICE_ID: case VBOX_PCI_DEVICE_ID+1:
     2066                    case VBOX_PCI_VENDOR_ID:
     2067                    case VBOX_PCI_VENDOR_ID+1:
     2068                    case VBOX_PCI_DEVICE_ID:
     2069                    case VBOX_PCI_DEVICE_ID+1:
    20672070                    case VBOX_PCI_REVISION_ID:
    20682071                    case VBOX_PCI_CLASS_PROG:
     
    20702073                    case VBOX_PCI_CLASS_BASE:
    20712074                    case VBOX_PCI_HEADER_TYPE:
    2072                     case VBOX_PCI_ROM_ADDRESS_BR: case VBOX_PCI_ROM_ADDRESS_BR+1: case VBOX_PCI_ROM_ADDRESS_BR+2: case VBOX_PCI_ROM_ADDRESS_BR+3:
     2075                    case VBOX_PCI_ROM_ADDRESS_BR:
     2076                    case VBOX_PCI_ROM_ADDRESS_BR+1:
     2077                    case VBOX_PCI_ROM_ADDRESS_BR+2:
     2078                    case VBOX_PCI_ROM_ADDRESS_BR+3:
    20732079                    case VBOX_PCI_INTERRUPT_PIN:
    20742080                        fWritable = false;
     
    20852091        }
    20862092
    2087         uint8_t u8Val = (uint8_t)val;
    2088         switch (addr)
     2093        bool    fRom = false;
     2094        uint8_t bVal = (uint8_t)u32Value;
     2095        switch (uAddress)
    20892096        {
    20902097            case VBOX_PCI_COMMAND: /* Command register, bits 0-7. */
    20912098                fUpdateMappings = true;
    2092                 goto default_case;
     2099                goto l_default_case;
    20932100            case VBOX_PCI_COMMAND+1: /* Command register, bits 8-15. */
    20942101                /* don't change reserved bits (11-15) */
    2095                 u8Val &= ~UINT32_C(0xf8);
     2102                bVal &= ~UINT32_C(0xf8);
    20962103                fUpdateMappings = true;
    2097                 goto default_case;
     2104                goto l_default_case;
    20982105            case VBOX_PCI_STATUS:  /* Status register, bits 0-7. */
    20992106                /* don't change read-only bits => actually all lower bits are read-only */
    2100                 u8Val &= ~UINT32_C(0xff);
     2107                bVal &= ~UINT32_C(0xff);
    21012108                /* status register, low part: clear bits by writing a '1' to the corresponding bit */
    2102                 pPciDev->abConfig[addr] &= ~u8Val;
     2109                pPciDev->abConfig[uAddress] &= ~bVal;
    21032110                break;
    21042111            case VBOX_PCI_STATUS+1:  /* Status register, bits 8-15. */
    21052112                /* don't change read-only bits */
    2106                 u8Val &= ~UINT32_C(0x06);
     2113                bVal &= ~UINT32_C(0x06);
    21072114                /* status register, high part: clear bits by writing a '1' to the corresponding bit */
    2108                 pPciDev->abConfig[addr] &= ~u8Val;
     2115                pPciDev->abConfig[uAddress] &= ~bVal;
    21092116                break;
    21102117            case VBOX_PCI_ROM_ADDRESS:    case VBOX_PCI_ROM_ADDRESS   +1: case VBOX_PCI_ROM_ADDRESS   +2: case VBOX_PCI_ROM_ADDRESS   +3:
     
    21162123            case VBOX_PCI_BASE_ADDRESS_4: case VBOX_PCI_BASE_ADDRESS_4+1: case VBOX_PCI_BASE_ADDRESS_4+2: case VBOX_PCI_BASE_ADDRESS_4+3:
    21172124            case VBOX_PCI_BASE_ADDRESS_5: case VBOX_PCI_BASE_ADDRESS_5+1: case VBOX_PCI_BASE_ADDRESS_5+2: case VBOX_PCI_BASE_ADDRESS_5+3:
    2118             {
    21192125                /* We check that, as same PCI register numbers as BARs may mean different registers for bridges */
    2120                 if (fP2PBridge)
    2121                     goto default_case;
    2122                 else
     2126                if (!fP2PBridge)
    21232127                {
    2124                     int iRegion = fRom ? VBOX_PCI_ROM_SLOT : (addr - VBOX_PCI_BASE_ADDRESS_0) >> 2;
    2125                     int iOffset = addr & 0x3;
    2126                     ich9pciWriteBarByte(pPciDev, iRegion, iOffset, u8Val);
     2128
     2129                    uint32_t iRegion = fRom ? VBOX_PCI_ROM_SLOT : (uAddress - VBOX_PCI_BASE_ADDRESS_0) >> 2;
     2130                    uint32_t off     = uAddress & 0x3;
     2131                    ich9pciWriteBarByte(pPciDev, iRegion, off, bVal);
    21272132                    fUpdateMappings = true;
     2133                    break;
    21282134                }
     2135                /* fall thru (bridge) */
     2136            default:
     2137            l_default_case:
     2138                if (fWritable)
     2139                    PCIDevSetByte(pPciDev, uAddress, bVal);
    21292140                break;
    2130             }
    2131             default:
    2132             default_case:
    2133                 if (fWritable)
    2134                     PCIDevSetByte(pPciDev, addr, u8Val);
    2135         }
    2136         addr++;
    2137         val >>= 8;
     2141        }
     2142        uAddress++;
     2143        u32Value >>= 8;
    21382144    }
    21392145
  • trunk/src/VBox/Devices/Bus/DevPciInternal.h

    r64452 r64456  
    190190                                                    PFNPCICONFIGREAD pfnRead, PPFNPCICONFIGREAD ppfnReadOld,
    191191                                                    PFNPCICONFIGWRITE pfnWrite, PPFNPCICONFIGWRITE ppfnWriteOld);
     192DECLCALLBACK(uint32_t) devpciR3CommonDefaultConfigRead(PPDMDEVINS pDevIns, PPDMPCIDEV pPciDev, uint32_t uAddress, unsigned cb);
    192193void devpciR3CommonRestoreConfig(PPDMPCIDEV pDev, uint8_t const *pbSrcConfig, bool fIsBridge);
    193194
  • trunk/src/VBox/Devices/Bus/DevPciMerge1.cpp.h

    r64423 r64456  
    224224    AssertCompileMemberOffset(DEVPCIROOT, PciBus, 0);
    225225    return pciR3MergedRegisterDeviceOnBus(pBus, pPciDev, fFlags, uPciDevNo, uPciFunNo, pszName,
    226                                           pciR3UnmergedConfigReadDev, pciR3UnmergedConfigWriteDev);
     226                                          devpciR3CommonDefaultConfigRead, pciR3UnmergedConfigWriteDev);
    227227}
    228228
     
    236236    PDEVPCIBUS pBus = PDMINS_2_DATA(pDevIns, PDEVPCIBUS);
    237237    return pciR3MergedRegisterDeviceOnBus(pBus, pPciDev, fFlags, uPciDevNo, uPciFunNo, pszName,
    238                                           pciR3UnmergedConfigReadDev, pciR3UnmergedConfigWriteDev);
    239 }
    240 
     238                                          devpciR3CommonDefaultConfigRead, pciR3UnmergedConfigWriteDev);
     239}
     240
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