From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MMfvI-0001bd-9c for qemu-devel@nongnu.org; Fri, 03 Jul 2009 06:23:16 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MMfvC-0001Vi-AG for qemu-devel@nongnu.org; Fri, 03 Jul 2009 06:23:14 -0400 Received: from [199.232.76.173] (port=51436 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MMfvC-0001VJ-2A for qemu-devel@nongnu.org; Fri, 03 Jul 2009 06:23:10 -0400 Received: from mx2.redhat.com ([66.187.237.31]:57934) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MMfv9-0005yB-LT for qemu-devel@nongnu.org; Fri, 03 Jul 2009 06:23:08 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n63AN6GT002938 for ; Fri, 3 Jul 2009 06:23:06 -0400 From: Gerd Hoffmann Date: Fri, 3 Jul 2009 12:22:49 +0200 Message-Id: <1246616578-6560-5-git-send-email-kraxel@redhat.com> In-Reply-To: <1246616578-6560-1-git-send-email-kraxel@redhat.com> References: <1246616578-6560-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PATCH 04/13] qdev: add generic qdev_device_add() List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Gerd Hoffmann Will be used for -device command line. Signed-off-by: Gerd Hoffmann --- hw/pci.c | 1 + hw/qdev.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ hw/qdev.h | 3 +++ 3 files changed, 55 insertions(+), 0 deletions(-) diff --git a/hw/pci.c b/hw/pci.c index f0cc36c..af72468 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -54,6 +54,7 @@ static struct BusInfo pci_bus_info = { .name = "PCI", .size = sizeof(PCIBus), .print = pcibus_dev_print, + .add = pci_create, .props = (Property[]) { { .name = "devfn", diff --git a/hw/qdev.c b/hw/qdev.c index 2156dc0..6bc2530 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -89,6 +89,57 @@ DeviceState *qdev_create(BusState *bus, const char *name) return dev; } +DeviceState *qdev_device_add(const char *cmdline) +{ + DeviceInfo *info; + DeviceState *qdev; + char driver[32], addr[32] = ""; + char tag[32], value[256]; + const char *params = NULL; + int n = 0; + + if (1 != sscanf(cmdline, "%32[^,],%n", driver, &n)) { + fprintf(stderr, "device parse error: \"%s\"\n", cmdline); + return NULL; + } + if (strcmp(driver, "?") == 0) { + for (info = device_info_list; info != NULL; info = info->next) { + fprintf(stderr, "name \"%s\", bus %s\n", info->name, info->bus_info->name); + } + return NULL; + } + if (n) { + params = cmdline + n; + get_param_value(addr, sizeof(addr), "addr", params); + } + info = qdev_find_info(NULL, driver); + + if (!info->bus_info->add) { + fprintf(stderr, "bus \"%s\" can't add devices.\n", + info->bus_info->name); + return NULL; + } + + qdev = info->bus_info->add(driver, strlen(addr) ? addr : NULL); + + if (params) { + while (params[0]) { + if (2 != sscanf(params, "%31[^=]=%255[^,]%n", tag, value, &n)) + break; + params += n; + if (strcmp(tag, "addr") == 0) + continue; + if (-1 == qdev_prop_parse(qdev, tag, value)) { + fprintf(stderr, "can't set property \"%s\" to \"%s\" for \"%s\"\n", + tag, value, driver); + } + } + } + + qdev_init(qdev); + return qdev; +} + /* Initialize a device. Device properties should be set before calling this function. IRQs and MMIO regions should be connected/mapped after calling this function. */ diff --git a/hw/qdev.h b/hw/qdev.h index 9a3de47..a856576 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -29,11 +29,13 @@ struct DeviceState { }; typedef void (*bus_dev_print)(Monitor *mon, DeviceState *dev, int indent); +typedef DeviceState* (*bus_dev_add)(const char *name, const char *addr); struct BusInfo { const char *name; size_t size; Property *props; bus_dev_print print; + bus_dev_add add; }; struct BusState { @@ -61,6 +63,7 @@ struct PropertyInfo { /*** Board API. This should go away once we have a machine config file. ***/ DeviceState *qdev_create(BusState *bus, const char *name); +DeviceState *qdev_device_add(const char *cmdline); void qdev_init(DeviceState *dev); void qdev_free(DeviceState *dev); -- 1.6.2.5