On Sat, 26 Dec 2009 21:19:21 +0000 Nathan Baum <nat...@parenthephobia.org.uk> wrote:
> Places information about a bus and the devices on into a QObject. > > Signed-off-by: Nathan Baum <nat...@parenthephobia.org.uk> > --- > 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, > + 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); > + qdict_put(qdict, name, qstring_from_str(value)); We can't have information to be parsed in QMP, so you probably want to another QDict here. > + } > + 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)); Is this a boolean? If so you should use qbool_from_int(). > + 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; You need QOBJECT() macro here. > +} > + > +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; Here too.