]> git.proxmox.com Git - mirror_qemu.git/commitdiff
qom: Implement info qom-tree HMP command
authorAndreas Färber <afaerber@suse.de>
Wed, 7 May 2014 15:03:18 +0000 (17:03 +0200)
committerAndreas Färber <afaerber@suse.de>
Tue, 17 Mar 2015 13:31:21 +0000 (14:31 +0100)
To complement qdev's bus-oriented info qtree, info qom-tree
prints a hierarchical view of the QOM composition tree.

By default, the machine composition tree is shown. This can be overriden
by supplying a path argument, such as "info qom-tree /".

Tested-by: Alistair Francis <alistair.francis@xilinx.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
hmp-commands.hx
include/monitor/qdev.h
monitor.c
qdev-monitor.c

index d9f6c037dc2eef428da92d9209f8d137c6fd3697..328709dc8d8ac00d341a52dbd88da456805cc6b7 100644 (file)
@@ -1782,6 +1782,8 @@ show balloon information
 show device tree
 @item info qdm
 show qdev device model list
+@item info qom-tree
+show object composition tree
 @item info roms
 show roms
 @item info tpm
index 5eb4a1171e5a503db53ab7422550bdc7366ff638..719075283c7598a3fa24dbdd3d2667bd9eb0b506 100644 (file)
@@ -8,6 +8,7 @@
 
 void hmp_info_qtree(Monitor *mon, const QDict *qdict);
 void hmp_info_qdm(Monitor *mon, const QDict *qdict);
+void hmp_info_qom_tree(Monitor *mon, const QDict *dict);
 int do_device_add(Monitor *mon, const QDict *qdict, QObject **ret_data);
 int qdev_device_help(QemuOpts *opts);
 DeviceState *qdev_device_add(QemuOpts *opts);
index 8b703f97be6a55f2ad20f3e9c7283ecf54e5dc43..42116a942ee7ce39c8f1059e00df35a4ed3397a4 100644 (file)
--- a/monitor.c
+++ b/monitor.c
@@ -2889,6 +2889,13 @@ static mon_cmd_t info_cmds[] = {
         .help       = "show qdev device model list",
         .mhandler.cmd = hmp_info_qdm,
     },
+    {
+        .name       = "qom-tree",
+        .args_type  = "path:s?",
+        .params     = "[path]",
+        .help       = "show QOM composition tree",
+        .mhandler.cmd = hmp_info_qom_tree,
+    },
     {
         .name       = "roms",
         .args_type  = "",
index 5d30ac534c7fa521cf481651c54c73b28ad76bf3..1d87f573e80fdc59b084ce421f33fef895b45ee5 100644 (file)
@@ -678,6 +678,63 @@ void hmp_info_qdm(Monitor *mon, const QDict *qdict)
     qdev_print_devinfos(true);
 }
 
+typedef struct QOMCompositionState {
+    Monitor *mon;
+    int indent;
+} QOMCompositionState;
+
+static void print_qom_composition(Monitor *mon, Object *obj, int indent);
+
+static int print_qom_composition_child(Object *obj, void *opaque)
+{
+    QOMCompositionState *s = opaque;
+
+    print_qom_composition(s->mon, obj, s->indent);
+
+    return 0;
+}
+
+static void print_qom_composition(Monitor *mon, Object *obj, int indent)
+{
+    QOMCompositionState s = {
+        .mon = mon,
+        .indent = indent + 2,
+    };
+    char *name;
+
+    if (obj == object_get_root()) {
+        name = g_strdup("");
+    } else {
+        name = object_get_canonical_path_component(obj);
+    }
+    monitor_printf(mon, "%*s/%s (%s)\n", indent, "", name,
+                   object_get_typename(obj));
+    g_free(name);
+    object_child_foreach(obj, print_qom_composition_child, &s);
+}
+
+void hmp_info_qom_tree(Monitor *mon, const QDict *dict)
+{
+    const char *path = qdict_get_try_str(dict, "path");
+    Object *obj;
+    bool ambiguous = false;
+
+    if (path) {
+        obj = object_resolve_path(path, &ambiguous);
+        if (!obj) {
+            monitor_printf(mon, "Path '%s' could not be resolved.\n", path);
+            return;
+        }
+        if (ambiguous) {
+            monitor_printf(mon, "Warning: Path '%s' is ambiguous.\n", path);
+            return;
+        }
+    } else {
+        obj = qdev_get_machine();
+    }
+    print_qom_composition(mon, obj, 0);
+}
+
 int do_device_add(Monitor *mon, const QDict *qdict, QObject **ret_data)
 {
     Error *local_err = NULL;