aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2022-02-16 12:30:02 +0000
committerMichael Brown <mcb30@ipxe.org>2022-02-16 12:55:28 +0000
commit04288974f6d81019314cbf9cbd72ab1fae95496f (patch)
treee34966223f084e094ebf08f827ce1596d59bfb6e
parent5d22307c4161dde453d50e8dc7bef8b3a2f6c9b3 (diff)
downloadipxe-04288974f6d81019314cbf9cbd72ab1fae95496f.zip
ipxe-04288974f6d81019314cbf9cbd72ab1fae95496f.tar.gz
ipxe-04288974f6d81019314cbf9cbd72ab1fae95496f.tar.bz2
[pci] Ensure that pci_read_config() initialises all fields
As per the general pattern for initialisation functions in iPXE, pci_init() saves code size by assuming that the caller has already zeroed the underlying storage (e.g. as part of zeroing a larger containing structure). There are several places within the code where pci_init() is deliberately used to initialise a transient struct pci_device without zeroing the entire structure, because the calling code knows that only the PCI bus:dev.fn address is required to be initialised (e.g. when reading from PCI configuration space). Ensure that using pci_init() followed by pci_read_config() will fully initialise the struct pci_device even if the caller did not previously zero the underlying storage, since Coverity reports that there are several places in the code that rely upon this. Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/drivers/bus/pci.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/drivers/bus/pci.c b/src/drivers/bus/pci.c
index 1b7350c..5891e42 100644
--- a/src/drivers/bus/pci.c
+++ b/src/drivers/bus/pci.c
@@ -121,6 +121,11 @@ static void pci_read_bases ( struct pci_device *pci ) {
unsigned long bar;
int reg;
+ /* Clear any existing base addresses */
+ pci->ioaddr = 0;
+ pci->membase = 0;
+
+ /* Get first memory and I/O BAR addresses */
for ( reg = PCI_BASE_ADDRESS_0; reg <= PCI_BASE_ADDRESS_5; reg += 4 ) {
bar = pci_bar ( pci, reg );
if ( bar & PCI_BASE_ADDRESS_SPACE_IO ) {