On 10/22/25 12:14, Markus Armbruster wrote:
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.

It's been many years, but I think the original idea was that dc->props_ would be replaced with walking QOM properties.

I'm not opposed to the patch, but it would put the plan in the coffin so I thought I'd point that out.

In the meanwhile I queued patch 1, which is an obviously good idea.

Paolo


Signed-off-by: Markus Armbruster <[email protected]>
---
  system/qdev-monitor.c | 7 +++----
  1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c
index 2ac92d0a07..850f0c6606 100644
--- a/system/qdev-monitor.c
+++ b/system/qdev-monitor.c
@@ -745,19 +745,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 : "<null>");
          g_free(value);


Reply via email to