From patchwork Tue Dec 8 13:07:29 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [ANNOUNCE,Call-For-Testing] Release 0.12.0-rc1 of QEMU Date: Tue, 08 Dec 2009 03:07:29 -0000 From: Gerd Hoffmann X-Patchwork-Id: 40635 Message-Id: <4B1E4F91.9010206@redhat.com> To: "Daniel P. Berrange" Cc: Anthony Liguori , "qemu-devel@nongnu.org" On 12/08/09 13:52, Gerd Hoffmann wrote: >> The latter. The guest does not see it, but it at least does not abort. >> It is the 'does not abort' behaviour I'm interested in - quite OK with >> this returning an error to the monitor client when acpi is disabled. > > Does the attached patch fix it for you? One more fix for the "hw_error() when slots full" case. cheers, Gerd >From 1c1de5c577a3241df4fb52cfdf15e97af9283caa Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 8 Dec 2009 14:05:11 +0100 Subject: [PATCH] pci: don't hw_error() when no slot is available. Signed-off-by: Gerd Hoffmann --- hw/pci.c | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) diff --git a/hw/pci.c b/hw/pci.c index 4f662b7..404eead 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -580,11 +580,13 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus, if (!bus->devices[devfn]) goto found; } - hw_error("PCI: no devfn available for %s, all in use\n", name); + qemu_error("PCI: no devfn available for %s, all in use\n", name); + return NULL; found: ; } else if (bus->devices[devfn]) { - hw_error("PCI: devfn %d not available for %s, in use by %s\n", devfn, + qemu_error("PCI: devfn %d not available for %s, in use by %s\n", devfn, name, bus->devices[devfn]->name); + return NULL; } pci_dev->bus = bus; pci_dev->devfn = devfn; @@ -625,6 +627,9 @@ PCIDevice *pci_register_device(PCIBus *bus, const char *name, pci_dev = do_pci_register_device(pci_dev, bus, name, devfn, config_read, config_write, PCI_HEADER_TYPE_NORMAL); + if (pci_dev == NULL) { + hw_error("PCI: can't register device\n"); + } return pci_dev; } static target_phys_addr_t pci_to_cpu_addr(target_phys_addr_t addr) @@ -1376,6 +1381,8 @@ 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); + if (pci_dev == NULL) + return -1; rc = info->init(pci_dev); if (rc != 0) return rc;