From: Markus Armbruster Date: Wed, 22 Oct 2025 10:14:19 +0000 (+0200) Subject: qdev: Fix "info qtree" to show links X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d10176ddf77da031e9d03688d5f9de3da7182e62;p=thirdparty%2Fqemu.git qdev: Fix "info qtree" to show links qdev_print_props() retrieves a property's value from its legacy property if it exists. A legacy property is created by qdev_class_add_legacy_property() when the property has a print() method or does not have a get() method. If it has a print() method, the legacy property's value is obtained from the property's print() method. This is used to format PCI addresses nicely, i.e. like 01.3 instead of 11. Else, if doesn't have a get() method, the legacy property is unreadable. "info qtree" silently skips unreadable properties. Link properties don't have a get() method, and are therefore skipped. This is wrong, because the underlying QOM property *is* readable. Change qdev_print_props() to simply use a print() method directly if it exists, else get the value via QOM. "info qtree" now shows links fine. For instance, machine "pc" onboard device "PIIX4_PM" property "bus" is now visible. Signed-off-by: Markus Armbruster Message-ID: <20251022101420.36059-3-armbru@redhat.com> Reviewed-by: Marc-André Lureau --- diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c index 0bf514cb09..be18902bb2 100644 --- a/system/qdev-monitor.c +++ b/system/qdev-monitor.c @@ -762,19 +762,18 @@ static void qdev_print_props(Monitor *mon, DeviceState *dev, DeviceClass *dc, for (int i = 0, n = dc->props_count_; i < n; ++i) { const Property *prop = &dc->props_[i]; char *value; - char *legacy_name = g_strdup_printf("legacy-%s", prop->name); - if (object_property_get_type(OBJECT(dev), legacy_name, NULL)) { - value = object_property_get_str(OBJECT(dev), legacy_name, NULL); + if (prop->info->print) { + value = prop->info->print(OBJECT(dev), prop); } else { value = object_property_print(OBJECT(dev), prop->name, true, NULL); } - g_free(legacy_name); if (!value) { continue; } + qdev_printf("%s = %s\n", prop->name, *value ? value : ""); g_free(value);