Patchwork [10/11] qdev: Add do_info_qbus and friends.

login
register
mail settings
Submitter Nathan Baum
Date Dec. 26, 2009, 9:19 p.m.
Message ID <1261862362-2530-11-git-send-email-nathan@parenthephobia.org.uk>
Download mbox | patch
Permalink /patch/41817/
State New
Headers show

Comments

Nathan Baum - Dec. 26, 2009, 9:19 p.m.
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(-)
Luiz Capitulino - Dec. 29, 2009, 5:13 p.m.
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.
Nathan Baum - Dec. 29, 2009, 7:36 p.m.
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.

Patch

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);