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)); + } + 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); -- 1.6.3.3