From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MOtGm-00027i-LH for qemu-devel@nongnu.org; Thu, 09 Jul 2009 09:02:36 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MOtGi-00025u-4z for qemu-devel@nongnu.org; Thu, 09 Jul 2009 09:02:35 -0400 Received: from [199.232.76.173] (port=42381 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MOtGg-00025W-PL for qemu-devel@nongnu.org; Thu, 09 Jul 2009 09:02:30 -0400 Received: from mx2.redhat.com ([66.187.237.31]:54493) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MOtGf-0002Az-DC for qemu-devel@nongnu.org; Thu, 09 Jul 2009 09:02:30 -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 n69D2SBC016205 for ; Thu, 9 Jul 2009 09:02:28 -0400 From: Gerd Hoffmann Date: Thu, 9 Jul 2009 15:02:20 +0200 Message-Id: <1247144544-8885-2-git-send-email-kraxel@redhat.com> In-Reply-To: <1247144544-8885-1-git-send-email-kraxel@redhat.com> References: <1247144544-8885-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PATCH 1/5] qdev/class: core List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Gerd Hoffmann Signed-off-by: Gerd Hoffmann --- hw/qdev.c | 29 ++++++++++++++++++++++++----- hw/qdev.h | 9 +++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/hw/qdev.c b/hw/qdev.c index 009e68d..67cca3b 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -46,7 +46,19 @@ void qdev_register(DeviceInfo *info) device_info_list = info; } -static DeviceInfo *qdev_find_info(BusInfo *bus_info, const char *name) +const char *qdev_class_name(DeviceClass class) +{ + static const char *names[] = { + [ DEV_CLASS_UNSPECIFIED ] = "", + [ DEV_CLASS_NETWORK ] = "network", + [ DEV_CLASS_SOUND ] = "sound", + }; + if (class < ARRAY_SIZE(names)) + return names[class]; + return ""; +} + +DeviceInfo *qdev_find_info(BusInfo *bus_info, const char *name, DeviceClass class) { DeviceInfo *info; @@ -54,6 +66,8 @@ static DeviceInfo *qdev_find_info(BusInfo *bus_info, const char *name) for (info = device_info_list; info != NULL; info = info->next) { if (bus_info && info->bus_info != bus_info) continue; + if (class && info->class != class) + continue; if (strcmp(info->name, name) != 0) continue; return info; @@ -63,6 +77,8 @@ static DeviceInfo *qdev_find_info(BusInfo *bus_info, const char *name) for (info = device_info_list; info != NULL; info = info->next) { if (bus_info && info->bus_info != bus_info) continue; + if (class && info->class != class) + continue; if (!info->alias) continue; if (strcmp(info->alias, name) != 0) @@ -87,7 +103,7 @@ DeviceState *qdev_create(BusState *bus, const char *name) bus = main_system_bus; } - info = qdev_find_info(bus->info, name); + info = qdev_find_info(bus->info, name, 0); if (!info) { hw_error("Unknown device '%s' for bus '%s'\n", name, bus->info->name); } @@ -121,6 +137,8 @@ DeviceState *qdev_device_add(const char *cmdline) fprintf(stderr, ", alias \"%s\"", info->alias); if (info->desc) fprintf(stderr, ", desc \"%s\"", info->desc); + if (info->class) + fprintf(stderr, ", class \"%s\"", qdev_class_name(info->class)); if (info->no_user) fprintf(stderr, ", no-user"); fprintf(stderr, "\n"); @@ -131,7 +149,7 @@ DeviceState *qdev_device_add(const char *cmdline) params = cmdline + n; get_param_value(addr, sizeof(addr), "addr", params); } - info = qdev_find_info(NULL, driver); + info = qdev_find_info(NULL, driver, 0); if (!info) { fprintf(stderr, "Device \"%s\" not found. Try -device '?' for a list.\n", @@ -378,7 +396,8 @@ void do_info_qdrv(Monitor *mon) DeviceInfo *info; for (info = device_info_list; info != NULL; info = info->next) { - monitor_printf(mon, "name \"%s\", bus %s\n", - info->name, info->bus_info->name); + monitor_printf(mon, "name \"%s\", bus %s, class %s\n", + info->name, info->bus_info->name, + qdev_class_name(info->class)); } } diff --git a/hw/qdev.h b/hw/qdev.h index cf6083f..a35b712 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -79,10 +79,17 @@ typedef void (*qdev_initfn)(DeviceState *dev, DeviceInfo *info); typedef void (*SCSIAttachFn)(DeviceState *host, BlockDriverState *bdrv, int unit); +typedef enum DeviceClass { + DEV_CLASS_UNSPECIFIED = 0, + DEV_CLASS_NETWORK, + DEV_CLASS_SOUND, +} DeviceClass; + struct DeviceInfo { const char *name; const char *alias; const char *desc; + DeviceClass class; size_t size; Property *props; int no_user; @@ -94,6 +101,8 @@ struct DeviceInfo { }; void qdev_register(DeviceInfo *info); +const char *qdev_class_name(DeviceClass class); +DeviceInfo *qdev_find_info(BusInfo *bus_info, const char *name, DeviceClass class); /* Register device properties. */ /* GPIO inputs also double as IRQ sinks. */ -- 1.6.2.5