From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Mr00X-00040n-VM for qemu-devel@nongnu.org; Thu, 24 Sep 2009 21:54:02 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Mr00T-0003zt-O2 for qemu-devel@nongnu.org; Thu, 24 Sep 2009 21:54:01 -0400 Received: from [199.232.76.173] (port=39176 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Mr00T-0003zo-KH for qemu-devel@nongnu.org; Thu, 24 Sep 2009 21:53:57 -0400 Received: from oxygen.pond.sub.org ([213.239.205.148]:39225) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Mr00S-0000a5-UR for qemu-devel@nongnu.org; Thu, 24 Sep 2009 21:53:57 -0400 Received: from pike.pond.sub.org (pD9E39B51.dip.t-dialin.net [217.227.155.81]) by oxygen.pond.sub.org (Postfix) with ESMTPA id 2B5A7276D21 for ; Fri, 25 Sep 2009 03:53:53 +0200 (CEST) From: Markus Armbruster Date: Fri, 25 Sep 2009 03:53:49 +0200 Message-Id: <1f7e6a1805b4e87537d2626cd338981247fce316.1253843232.git.armbru@redhat.com> In-Reply-To: References: Subject: [Qemu-devel] [PATCH 2/6] Fix pci_add storage not to exit on bad first argument List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Monitor command "pci_add ADDR storage ..." does its work in qemu_pci_hot_add_nic(). It called pci_create(..., ADDR) to create the device. That's wrong, because pci_create() terminates the program when ADDR is invalid. Use pci_get_bus_devfn() and pci_create_noinit() instead. Signed-off-by: Markus Armbruster --- hw/pci-hotplug.c | 12 ++++++++++-- hw/pci.c | 2 +- hw/pci.h | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/hw/pci-hotplug.c b/hw/pci-hotplug.c index f3dc421..d6093ba 100644 --- a/hw/pci-hotplug.c +++ b/hw/pci-hotplug.c @@ -107,6 +107,8 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, DriveInfo *dinfo = NULL; int type = -1; char buf[128]; + PCIBus *bus; + int devfn; if (get_param_value(buf, sizeof(buf), "if", opts)) { if (!strcmp(buf, "scsi")) @@ -134,16 +136,22 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, dinfo = NULL; } + bus = pci_get_bus_devfn(&devfn, devaddr); + if (!bus) { + monitor_printf(mon, "Invalid PCI device address %s\n", devaddr); + return NULL; + } + switch (type) { case IF_SCSI: - dev = pci_create("lsi53c895a", devaddr); + dev = pci_create_noinit(bus, devfn, "lsi53c895a"); break; case IF_VIRTIO: if (!dinfo) { monitor_printf(mon, "virtio requires a backing file/device.\n"); return NULL; } - dev = pci_create("virtio-blk-pci", devaddr); + dev = pci_create_noinit(bus, devfn, "virtio-blk-pci"); qdev_prop_set_drive(&dev->qdev, "drive", dinfo); break; default: diff --git a/hw/pci.c b/hw/pci.c index 64d70ed..5be21d7 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -265,7 +265,7 @@ int pci_read_devaddr(Monitor *mon, const char *addr, int *domp, int *busp, return 0; } -static PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr) +PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr) { int dom, bus; unsigned slot; diff --git a/hw/pci.h b/hw/pci.h index caba5c8..356405e 100644 --- a/hw/pci.h +++ b/hw/pci.h @@ -260,6 +260,7 @@ int pci_bus_num(PCIBus *s); void pci_for_each_device(int bus_num, void (*fn)(PCIDevice *d)); PCIBus *pci_find_bus(int bus_num); PCIDevice *pci_find_device(int bus_num, int slot, int function); +PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr); int pci_read_devaddr(Monitor *mon, const char *addr, int *domp, int *busp, unsigned *slotp); -- 1.6.2.5