qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 10/11] qdev: Add do_info_qbus and friends.


From: Nathan Baum
Subject: [Qemu-devel] [PATCH 10/11] qdev: Add do_info_qbus and friends.
Date: Sat, 26 Dec 2009 21:19:21 +0000

Places information about a bus and the devices on into a QObject.

Signed-off-by: Nathan Baum <address@hidden>
---
 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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]