Message ID | 1261862362-2530-11-git-send-email-nathan@parenthephobia.org.uk |
---|---|
State | New |
Headers | show |
On Sat, 26 Dec 2009 21:19:21 +0000 Nathan Baum <nathan@parenthephobia.org.uk> wrote: > Places information about a bus and the devices on into a QObject. > > Signed-off-by: Nathan Baum <nathan@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.
On Tue, 2009-12-29 at 15:13 -0200, Luiz Capitulino wrote: > > + 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(). It isn't, but they shouldn't be there anyway. I mistook them for IOPS counters without checking, but it actually counts the number of entries in the gpio_in/gpio_out array. They don't appear useful.
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)); + } + 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; +} + +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; +} + #define qdev_printf(fmt, ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__) static void qbus_print(Monitor *mon, BusState *bus, int indent);
Places information about a bus and the devices on into a QObject. Signed-off-by: Nathan Baum <nathan@parenthephobia.org.uk> --- hw/qdev.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 73 insertions(+), 0 deletions(-)