]> git.proxmox.com Git - mirror_qemu.git/commitdiff
PCI: make duplicate devfn allocation fatal
authorBlue Swirl <blauwirbel@gmail.com>
Sun, 15 Nov 2009 14:30:03 +0000 (14:30 +0000)
committerBlue Swirl <blauwirbel@gmail.com>
Sun, 15 Nov 2009 14:30:03 +0000 (14:30 +0000)
Only two callers of pci_create_simple/pci_register_device bothered
to check the return value. Other cases were prone to crashing with
spurious NULL pointer dereferences.

Make QEMU exit with an error message when devfn is attempted to
be duplicated, also applies to case when the bus is full. Remove
checks.

Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
hw/openpic.c
hw/pci.c

index 68af9c1de11c510482114f809d1548a7d9ed96a6..42db59daa76661142b23bd31c1c924f095c20163 100644 (file)
@@ -1202,8 +1202,6 @@ qemu_irq *openpic_init (PCIBus *bus, int *pmem_index, int nb_cpus,
     if (bus) {
         opp = (openpic_t *)pci_register_device(bus, "OpenPIC", sizeof(openpic_t),
                                                -1, NULL, NULL);
-        if (opp == NULL)
-            return NULL;
         pci_conf = opp->pci_dev.config;
         pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_IBM);
         pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_IBM_OPENPIC2);
index 6864339c274849b953b7e8da6f191dbaa069d63d..5b3461cd6697c6f4a0de5169c4681ae6b924a061 100644 (file)
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -499,10 +499,11 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
             if (!bus->devices[devfn])
                 goto found;
         }
-        return NULL;
+        hw_error("PCI: no devfn available for %s, all in use\n", name);
     found: ;
     } else if (bus->devices[devfn]) {
-        return NULL;
+        hw_error("PCI: devfn %d not available for %s, in use by %s\n", devfn,
+                 name, bus->devices[devfn]->name);
     }
     pci_dev->bus = bus;
     pci_dev->devfn = devfn;
@@ -1273,7 +1274,6 @@ static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
     pci_dev = do_pci_register_device(pci_dev, bus, base->name, devfn,
                                      info->config_read, info->config_write,
                                      info->header_type);
-    assert(pci_dev);
     rc = info->init(pci_dev);
     if (rc != 0)
         return rc;