From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NVqx1-00064k-By for qemu-devel@nongnu.org; Fri, 15 Jan 2010 13:31:15 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NVqww-0005vd-Fw for qemu-devel@nongnu.org; Fri, 15 Jan 2010 13:31:14 -0500 Received: from [199.232.76.173] (port=39042 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NVqww-0005vR-6B for qemu-devel@nongnu.org; Fri, 15 Jan 2010 13:31:10 -0500 Received: from mx20.gnu.org ([199.232.41.8]:33728) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1NVqwu-0003iB-H8 for qemu-devel@nongnu.org; Fri, 15 Jan 2010 13:31:10 -0500 Received: from mx1.redhat.com ([209.132.183.28]) by mx20.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NVqwj-0002ta-Kb for qemu-devel@nongnu.org; Fri, 15 Jan 2010 13:30:57 -0500 From: Markus Armbruster Subject: Re: [Qemu-devel] [RFC, PATCH 10/11] qdev: Add do_info_qbus and friends. References: <1261861899-1984-1-git-send-email-nathan@parenthephobia.org.uk> <1261861899-1984-11-git-send-email-nathan@parenthephobia.org.uk> Date: Fri, 15 Jan 2010 19:30:46 +0100 In-Reply-To: <1261861899-1984-11-git-send-email-nathan@parenthephobia.org.uk> (Nathan Baum's message of "Sat, 26 Dec 2009 21:11:38 +0000") Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Nathan Baum Cc: qemu-devel@nongnu.org, Gerd Hoffmann Nathan Baum writes: > Places information about a bus and the devices on into a QObject. > > Signed-off-by: Nathan Baum > --- > hw/qdev.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 73 insertions(+), 0 deletions(-) > > diff --git a/hw/qdev.c b/hw/qdev.c > index b6bd4ae..f5d68c6 100644 > --- a/hw/qdev.c > +++ b/hw/qdev.c > @@ -30,6 +30,8 @@ > #include "sysemu.h" > #include "monitor.h" > #include "qerror.h" > +#include "qint.h" > +#include "qbool.h" > > static int qdev_hotplug = 0; > > @@ -654,6 +656,77 @@ void qbus_free(BusState *bus) > } > } > > +static void do_info_qbus(Monitor *mon, BusState *bus, QObject **ret_data); > + > +static void do_info_qdev_props(Monitor *mon, DeviceState *dev, Property *props, const char *prefix, Long line, please break; there's plenty of space left in the next one :) > + QDict *qdict) > +{ > + char name[64]; > + char value[64]; > + > + if (!props) > + return; > + while (props->name) { > + if (props->info->print) { > + props->info->print(dev, props, value, sizeof(value)); > + snprintf(name, sizeof(name), "%s-%s", prefix, props->name); Funny naming convention PREFIX-PROPNAME, because do_info_qdev_props() below puts properties directly in the qdict. Maybe it would be cleaner to have them in their own dictionary "props". However, because there are both device properties and bus properties (really: device properties common to all devices on this bus), their names can clash. Device properties take precedence (see qdev_prop_find()). Hmm, qdev_printf() prints even overridden bus properties, not sure that's appropriate. Gerd? > + qdict_put(qdict, name, qstring_from_str(value)); > + } > + props++; > + } > +} > + > +static void do_info_qdev(Monitor *mon, DeviceState *dev, QObject **ret_data) > +{ > + BusState *child; > + QDict *qdict; > + QList *children; > + > + qdict = qdict_new(); > + qdict_put(qdict, "name", qstring_from_str(dev->info->name)); > + if (dev->id) > + qdict_put(qdict, "id", qstring_from_str(dev->id)); > + qdict_put(qdict, "gpio-in", qint_from_int(dev->num_gpio_in)); > + qdict_put(qdict, "gpio-out", qint_from_int(dev->num_gpio_out)); > + do_info_qdev_props(mon, dev, dev->info->props, "dev", qdict); > + do_info_qdev_props(mon, dev, dev->parent_bus->info->props, "bus", qdict); > + children = qlist_new(); > + QLIST_FOREACH(child, &dev->child_bus, sibling) { > + QObject *data = NULL; > + do_info_qbus(mon, child, &data); > + if (data) > + qlist_append_obj(children, data); > + } > + if (!qlist_empty(children)) > + qdict_put(qdict, "children", children); > + if (dev->parent_bus->info->info_dev) { > + qdict_put_obj(qdict, "info", dev->parent_bus->info->info_dev(mon, dev)); > + } > + *ret_data = (QObject *) qdict; Use QOBJECT(). > +} > + > +static void do_info_qbus(Monitor *mon, BusState *bus, QObject **ret_data) > +{ > + struct DeviceState *dev; > + QDict *qdict; > + QList *children; > + > + qdict = qdict_new(); > + qdict_put(qdict, "bus", qstring_from_str(bus->name)); > + qdict_put(qdict, "type", qstring_from_str(bus->info->name)); > + qdict_put(qdict, "allow_hotplug", qbool_from_int(bus->allow_hotplug)); > + children = qlist_new(); > + qdict_put(qdict, "children", children); > + QLIST_FOREACH(dev, &bus->children, sibling) { > + QObject *data = NULL; > + do_info_qdev(mon, dev, &data); > + if (data) > + qlist_append_obj(children, data); > + } > + > + *ret_data = (QObject *) qdict; Use QOBJECT(). > +} > + > #define qdev_printf(fmt, ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__) > static void qbus_print(Monitor *mon, BusState *bus, int indent);