qom: Implement info qom-tree HMP command
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>
This commit is contained in:
		
							parent
							
								
									c0e6ee9e6f
								
							
						
					
					
						commit
						a01ff75fcd
					
				| @ -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 | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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  = "", | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Andreas Färber
						Andreas Färber