* [PATCH 0/9] hw/i386: convert object props to class props
@ 2026-07-03 9:07 Mark Cave-Ayland
2026-07-03 9:07 ` [PATCH 1/9] qom/object.c: introduce object_alias_get_targetp() lookup function Mark Cave-Ayland
` (8 more replies)
0 siblings, 9 replies; 27+ messages in thread
From: Mark Cave-Ayland @ 2026-07-03 9:07 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, berrange, qemu-devel
Since the use of object props is effectively deprecated, here is an attempt
to convert all use of object props in hw/i386 to class props. The eventual
aim is to continue working through the codebase, removing all remaining uses
of object props.
In order to facilitate the conversion of alias properties, this series
introduces a couple of new QOM functions: object_class_property_add_alias()
and object_property_set_alias() to declare the property and to set it within
an instance accordingly. This implementation is hugely inspired by the
existing link class property code: many thanks to Marc-André for doing this
initial work.
The series is lightly tested: it passes "make check", GitLab CI and some
simple local tests. I'm mostly interested for feedback on the conversion
strategy, and to get a feel for the best way to merge this series since once
the basic conversion patterns are in place, the same patterns can be applied
elsewhere and it would be good to minimise the merge window for such changes.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
Mark Cave-Ayland (9):
qom/object.c: introduce object_alias_get_targetp() lookup function
qom/object.c: introduce object_class_property_add_alias()
qom/object.c: introduce object_property_set_alias() function
hw/i386/pc.c: convert pcspk-audiodev object prop to a class prop
hw/rtc/mc146818rtc.c: convert date from object prop to class prop
hw/i386/pc.c: convert rtc-time object prop to a class prop
hw/i386/pc.c: convert PC_MACHINE_ACPI_DEVICE_PROP from object prop to
class prop
hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class
props
hw/i386/sgx-epc.c: convert SGX_EPC_SIZE_PROP object prop to class prop
include/hw/i386/pc.h | 5 ++
include/qom/object.h | 24 ++++++++
hw/i386/pc.c | 29 ++++++++--
hw/i386/pc_piix.c | 5 --
hw/i386/pc_q35.c | 5 --
hw/i386/pc_sysfw.c | 7 +--
hw/i386/sgx-epc.c | 12 ++--
hw/rtc/mc146818rtc.c | 4 +-
qom/object.c | 130 +++++++++++++++++++++++++++++++++++++++----
9 files changed, 181 insertions(+), 40 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 1/9] qom/object.c: introduce object_alias_get_targetp() lookup function
2026-07-03 9:07 [PATCH 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
@ 2026-07-03 9:07 ` Mark Cave-Ayland
2026-07-03 9:07 ` [PATCH 2/9] qom/object.c: introduce object_class_property_add_alias() Mark Cave-Ayland
` (7 subsequent siblings)
8 siblings, 0 replies; 27+ messages in thread
From: Mark Cave-Ayland @ 2026-07-03 9:07 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, berrange, qemu-devel
This will be used later to add support for alias class properties.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
qom/object.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/qom/object.c b/qom/object.c
index f79b2cf361..da4db3e0c7 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -2906,13 +2906,20 @@ typedef struct {
char *target_name;
} AliasProperty;
+static Object **
+object_alias_get_targetp(Object *obj, AliasProperty *lprop)
+{
+ return &lprop->target_obj;
+}
+
static void property_get_alias(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
AliasProperty *prop = opaque;
+ Object **target_obj = object_alias_get_targetp(obj, prop);
Visitor *alias_v = visitor_forward_field(v, prop->target_name, name);
- object_property_get(prop->target_obj, prop->target_name, alias_v, errp);
+ object_property_get(*target_obj, prop->target_name, alias_v, errp);
visit_free(alias_v);
}
@@ -2920,9 +2927,10 @@ static void property_set_alias(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
AliasProperty *prop = opaque;
+ Object **target_obj = object_alias_get_targetp(obj, prop);
Visitor *alias_v = visitor_forward_field(v, prop->target_name, name);
- object_property_set(prop->target_obj, prop->target_name, alias_v, errp);
+ object_property_set(*target_obj, prop->target_name, alias_v, errp);
visit_free(alias_v);
}
@@ -2930,8 +2938,9 @@ static Object *property_resolve_alias(Object *obj, void *opaque,
const char *part)
{
AliasProperty *prop = opaque;
+ Object **target_obj = object_alias_get_targetp(obj, prop);
- return object_resolve_path_component(prop->target_obj, prop->target_name);
+ return object_resolve_path_component(*target_obj, prop->target_name);
}
static void property_release_alias(Object *obj, const char *name, void *opaque)
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 2/9] qom/object.c: introduce object_class_property_add_alias()
2026-07-03 9:07 [PATCH 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
2026-07-03 9:07 ` [PATCH 1/9] qom/object.c: introduce object_alias_get_targetp() lookup function Mark Cave-Ayland
@ 2026-07-03 9:07 ` Mark Cave-Ayland
2026-07-03 9:07 ` [PATCH 3/9] qom/object.c: introduce object_property_set_alias() function Mark Cave-Ayland
` (6 subsequent siblings)
8 siblings, 0 replies; 27+ messages in thread
From: Mark Cave-Ayland @ 2026-07-03 9:07 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, berrange, qemu-devel
This is eventually intended to be a replacement for object_property_add_alias()
which uses an object property instead of a class property.
With the advent of class properties, it is possible that QOM may attempt to
set or retrieve the value of an unset alias property. Update the existing
property_get_alias() and property_set_alias() functions to use the null visitor
if the alias target has not been set, and property_resolve_alias() to return
NULL for the same case.
This ensures that unset class alias properties accessed e.g. via the monitor do
not cause QEMU to crash.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
include/qom/object.h | 11 +++++
qom/object.c | 106 ++++++++++++++++++++++++++++++++++++++-----
2 files changed, 105 insertions(+), 12 deletions(-)
diff --git a/include/qom/object.h b/include/qom/object.h
index 11f55613fc..659b70651a 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -2024,6 +2024,11 @@ ObjectProperty *object_class_property_add_uint64_ptr(ObjectClass *klass,
const uint64_t *v,
ObjectPropertyFlags flags);
+typedef enum {
+ /* private */
+ OBJ_PROP_ALIAS_CLASS = 0x1,
+} ObjectPropertyAliasFlags;
+
/**
* object_property_add_alias:
* @obj: the object to add a property to
@@ -2044,6 +2049,12 @@ ObjectProperty *object_class_property_add_uint64_ptr(ObjectClass *klass,
ObjectProperty *object_property_add_alias(Object *obj, const char *name,
Object *target_obj, const char *target_name);
+ObjectProperty *
+object_class_property_add_alias(ObjectClass *klass, const char *name,
+ ptrdiff_t offset,
+ const char *target_type,
+ const char *target_name);
+
/**
* object_property_add_const_link:
* @obj: the object to add a property to
diff --git a/qom/object.c b/qom/object.c
index da4db3e0c7..a1b0ea19a0 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -34,6 +34,7 @@
#include "qom/qom-qobject.h"
#include "qobject/qbool.h"
#include "qobject/qlist.h"
+#include "qobject/qnull.h"
#include "qobject/qnum.h"
#include "qobject/qstring.h"
#include "qemu/error-report.h"
@@ -2902,14 +2903,22 @@ object_class_property_add_uint64_ptr(ObjectClass *klass, const char *name,
}
typedef struct {
- Object *target_obj;
+ union {
+ Object *target_obj; /* if !OBJ_PROP_ALIAS_CLASS */
+ ptrdiff_t offset; /* if OBJ_PROP_ALIAS_CLASS */
+ };
char *target_name;
+ ObjectPropertyAliasFlags flags;
} AliasProperty;
static Object **
-object_alias_get_targetp(Object *obj, AliasProperty *lprop)
+object_alias_get_targetp(Object *obj, AliasProperty *aprop)
{
- return &lprop->target_obj;
+ if (aprop->flags & OBJ_PROP_ALIAS_CLASS) {
+ return (void *)obj + aprop->offset;
+ } else {
+ return &aprop->target_obj;
+ }
}
static void property_get_alias(Object *obj, Visitor *v, const char *name,
@@ -2917,10 +2926,18 @@ static void property_get_alias(Object *obj, Visitor *v, const char *name,
{
AliasProperty *prop = opaque;
Object **target_obj = object_alias_get_targetp(obj, prop);
- Visitor *alias_v = visitor_forward_field(v, prop->target_name, name);
- object_property_get(*target_obj, prop->target_name, alias_v, errp);
- visit_free(alias_v);
+ if (*target_obj) {
+ Visitor *alias_v = visitor_forward_field(v, prop->target_name, name);
+
+ object_property_get(*target_obj, prop->target_name, alias_v, errp);
+ visit_free(alias_v);
+ } else {
+ QNull *null = NULL;
+
+ visit_type_null(v, NULL, &null, errp);
+ qnull_unref(null);
+ };
}
static void property_set_alias(Object *obj, Visitor *v, const char *name,
@@ -2928,10 +2945,18 @@ static void property_set_alias(Object *obj, Visitor *v, const char *name,
{
AliasProperty *prop = opaque;
Object **target_obj = object_alias_get_targetp(obj, prop);
- Visitor *alias_v = visitor_forward_field(v, prop->target_name, name);
- object_property_set(*target_obj, prop->target_name, alias_v, errp);
- visit_free(alias_v);
+ if (*target_obj) {
+ Visitor *alias_v = visitor_forward_field(v, prop->target_name, name);
+
+ object_property_set(*target_obj, prop->target_name, alias_v, errp);
+ visit_free(alias_v);
+ } else {
+ QNull *null = NULL;
+
+ visit_type_null(v, NULL, &null, errp);
+ qnull_unref(null);
+ }
}
static Object *property_resolve_alias(Object *obj, void *opaque,
@@ -2940,15 +2965,27 @@ static Object *property_resolve_alias(Object *obj, void *opaque,
AliasProperty *prop = opaque;
Object **target_obj = object_alias_get_targetp(obj, prop);
- return object_resolve_path_component(*target_obj, prop->target_name);
+ if (*target_obj) {
+ return object_resolve_path_component(*target_obj, prop->target_name);
+ } else {
+ return NULL;
+ }
}
static void property_release_alias(Object *obj, const char *name, void *opaque)
{
AliasProperty *prop = opaque;
- g_free(prop->target_name);
- g_free(prop);
+ if (!(prop->flags & OBJ_PROP_ALIAS_CLASS)) {
+ g_free(prop->target_name);
+ g_free(prop);
+ } else {
+ Object **target_obj = object_alias_get_targetp(obj, prop);
+
+ if (*target_obj) {
+ object_unref(*target_obj);
+ }
+ }
}
ObjectProperty *
@@ -2973,6 +3010,7 @@ object_property_add_alias(Object *obj, const char *name,
prop = g_malloc(sizeof(*prop));
prop->target_obj = target_obj;
prop->target_name = g_strdup(target_name);
+ prop->flags = 0;
op = object_property_add(obj, name, prop_type,
property_get_alias,
@@ -2989,6 +3027,50 @@ object_property_add_alias(Object *obj, const char *name,
return op;
}
+ObjectProperty *
+object_class_property_add_alias(ObjectClass *klass, const char *name,
+ ptrdiff_t offset,
+ const char *target_type,
+ const char *target_name)
+{
+ AliasProperty *prop;
+ ObjectProperty *op;
+ ObjectProperty *target_prop;
+ ObjectClass *target_class;
+ g_autofree char *prop_type = NULL;
+
+ target_class = object_class_by_name(target_type);
+ assert(target_class);
+ target_prop = object_class_property_find(target_class, target_name);
+ assert(target_prop);
+
+ if (object_property_is_child(target_prop)) {
+ prop_type = g_strdup_printf("link%s",
+ target_prop->type + strlen("child"));
+ } else {
+ prop_type = g_strdup(target_prop->type);
+ }
+
+ prop = g_malloc(sizeof(*prop));
+ prop->offset = offset;
+ prop->target_name = g_strdup(target_name);
+ prop->flags = OBJ_PROP_ALIAS_CLASS;
+
+ op = object_class_property_add(klass, name, prop_type,
+ property_get_alias,
+ property_set_alias,
+ property_release_alias,
+ prop);
+ op->resolve = property_resolve_alias;
+ if (target_prop->defval) {
+ op->defval = qobject_ref(target_prop->defval);
+ }
+
+ object_class_property_set_description(klass, op->name,
+ target_prop->description);
+ return op;
+}
+
void object_property_set_description(Object *obj, const char *name,
const char *description)
{
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 3/9] qom/object.c: introduce object_property_set_alias() function
2026-07-03 9:07 [PATCH 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
2026-07-03 9:07 ` [PATCH 1/9] qom/object.c: introduce object_alias_get_targetp() lookup function Mark Cave-Ayland
2026-07-03 9:07 ` [PATCH 2/9] qom/object.c: introduce object_class_property_add_alias() Mark Cave-Ayland
@ 2026-07-03 9:07 ` Mark Cave-Ayland
2026-07-03 9:07 ` [PATCH 4/9] hw/i386/pc.c: convert pcspk-audiodev object prop to a class prop Mark Cave-Ayland
` (5 subsequent siblings)
8 siblings, 0 replies; 27+ messages in thread
From: Mark Cave-Ayland @ 2026-07-03 9:07 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, berrange, qemu-devel
This will be used to set the class alias property for a specific object. Note
that this function is only required for class properties, and will assert at
runtime if an attempt is made to use it on an object alias property.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
include/qom/object.h | 13 +++++++++++++
qom/object.c | 19 +++++++++++++++++++
2 files changed, 32 insertions(+)
diff --git a/include/qom/object.h b/include/qom/object.h
index 659b70651a..80c400e1b6 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -2055,6 +2055,19 @@ object_class_property_add_alias(ObjectClass *klass, const char *name,
const char *target_type,
const char *target_name);
+/**
+ * object_property_set_alias:
+ * @obj: the object upon which to set the alias property
+ * @name: the name of the alias property
+ * @target_obj: the object to forward property access to
+ *
+ * Set an alias property on an object to point to @target_obj. This is only
+ * required for class properties, and will assert at runtime if used on an
+ * object property.
+ */
+void object_property_set_alias(Object *obj, const char *name,
+ Object *target_obj);
+
/**
* object_property_add_const_link:
* @obj: the object to add a property to
diff --git a/qom/object.c b/qom/object.c
index a1b0ea19a0..7c8849d75a 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -3071,6 +3071,25 @@ object_class_property_add_alias(ObjectClass *klass, const char *name,
return op;
}
+void object_property_set_alias(Object *obj, const char *name,
+ Object *target_obj)
+{
+ AliasProperty *prop;
+ ObjectProperty *op;
+ Object **target_objp;
+
+ op = object_property_find_err(obj, name, &error_abort);
+ prop = op->opaque;
+ assert(prop->flags & OBJ_PROP_ALIAS_CLASS);
+
+ target_objp = object_alias_get_targetp(obj, prop);
+ if (*target_objp) {
+ object_unref(*target_objp);
+ }
+ *target_objp = target_obj;
+ object_ref(*target_objp);
+}
+
void object_property_set_description(Object *obj, const char *name,
const char *description)
{
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 4/9] hw/i386/pc.c: convert pcspk-audiodev object prop to a class prop
2026-07-03 9:07 [PATCH 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
` (2 preceding siblings ...)
2026-07-03 9:07 ` [PATCH 3/9] qom/object.c: introduce object_property_set_alias() function Mark Cave-Ayland
@ 2026-07-03 9:07 ` Mark Cave-Ayland
2026-07-03 9:07 ` [PATCH 5/9] hw/rtc/mc146818rtc.c: convert date from object prop to " Mark Cave-Ayland
` (4 subsequent siblings)
8 siblings, 0 replies; 27+ messages in thread
From: Mark Cave-Ayland @ 2026-07-03 9:07 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, berrange, qemu-devel
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
include/hw/i386/pc.h | 2 ++
hw/i386/pc.c | 9 ++++++---
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index d4b6d3ed57..843a5a9e1f 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -38,6 +38,8 @@ typedef struct PCMachineState {
DeviceState *iommu;
BusState *idebus[MAX_IDE_BUS];
+ Object *alias_pcspk;
+
/* Configuration options: */
uint64_t max_ram_below_4g;
OnOffAuto vmport;
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 73a625327c..b049c9f880 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1605,8 +1605,8 @@ static void pc_machine_initfn(Object *obj)
pc_system_flash_create(pcms);
pcms->pcspk = isa_new(TYPE_PC_SPEAKER);
- object_property_add_alias(OBJECT(pcms), "pcspk-audiodev",
- OBJECT(pcms->pcspk), "audiodev");
+ object_property_set_alias(OBJECT(pcms), "pcspk-audiodev",
+ OBJECT(pcms->pcspk));
if (pcmc->pci_enabled) {
cxl_machine_init(obj, &pcms->cxl_devices_state);
}
@@ -1750,7 +1750,10 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
"Set IGVM configuration");
#endif
-
+ object_class_property_add_alias(oc, "pcspk-audiodev",
+ offsetof(PCMachineState, alias_pcspk),
+ TYPE_PC_SPEAKER,
+ "audiodev");
}
static const TypeInfo pc_machine_info = {
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 5/9] hw/rtc/mc146818rtc.c: convert date from object prop to class prop
2026-07-03 9:07 [PATCH 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
` (3 preceding siblings ...)
2026-07-03 9:07 ` [PATCH 4/9] hw/i386/pc.c: convert pcspk-audiodev object prop to a class prop Mark Cave-Ayland
@ 2026-07-03 9:07 ` Mark Cave-Ayland
2026-07-06 7:15 ` Philippe Mathieu-Daudé
2026-07-03 9:07 ` [PATCH 6/9] hw/i386/pc.c: convert rtc-time object prop to a " Mark Cave-Ayland
` (3 subsequent siblings)
8 siblings, 1 reply; 27+ messages in thread
From: Mark Cave-Ayland @ 2026-07-03 9:07 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, berrange, qemu-devel
This is to allow it to be the target of a class alias property.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
hw/rtc/mc146818rtc.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/hw/rtc/mc146818rtc.c b/hw/rtc/mc146818rtc.c
index bcab018c7c..ba396435d1 100644
--- a/hw/rtc/mc146818rtc.c
+++ b/hw/rtc/mc146818rtc.c
@@ -920,8 +920,6 @@ static void rtc_realizefn(DeviceState *dev, Error **errp)
memory_region_add_subregion(&s->io, 0, &s->coalesced_io);
memory_region_add_coalescing(&s->coalesced_io, 0, 1);
- object_property_add_tm(OBJECT(s), "date", rtc_get_date);
-
qdev_init_gpio_out(dev, &s->irq, 1);
}
@@ -1020,6 +1018,8 @@ static void rtc_class_initfn(ObjectClass *klass, const void *data)
adevc->build_dev_aml = rtc_build_aml;
device_class_set_props(dc, mc146818rtc_properties);
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
+
+ object_class_property_add_tm(klass, "date", rtc_get_date);
}
static const TypeInfo mc146818rtc_info = {
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 6/9] hw/i386/pc.c: convert rtc-time object prop to a class prop
2026-07-03 9:07 [PATCH 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
` (4 preceding siblings ...)
2026-07-03 9:07 ` [PATCH 5/9] hw/rtc/mc146818rtc.c: convert date from object prop to " Mark Cave-Ayland
@ 2026-07-03 9:07 ` Mark Cave-Ayland
2026-07-07 16:58 ` Daniel P. Berrangé
2026-07-03 9:08 ` [PATCH 7/9] hw/i386/pc.c: convert PC_MACHINE_ACPI_DEVICE_PROP from object prop to " Mark Cave-Ayland
` (2 subsequent siblings)
8 siblings, 1 reply; 27+ messages in thread
From: Mark Cave-Ayland @ 2026-07-03 9:07 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, berrange, qemu-devel
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
include/hw/i386/pc.h | 1 +
hw/i386/pc.c | 7 +++++--
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 843a5a9e1f..309de2eda1 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -39,6 +39,7 @@ typedef struct PCMachineState {
BusState *idebus[MAX_IDE_BUS];
Object *alias_pcspk;
+ Object *alias_rtc_time;
/* Configuration options: */
uint64_t max_ram_below_4g;
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index b049c9f880..b3d4a26c94 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1094,8 +1094,7 @@ void pc_basic_device_init(struct PCMachineState *pcms,
qdev_connect_gpio_out(DEVICE(rtc_state), 0, rtc_irq);
}
- object_property_add_alias(OBJECT(pcms), "rtc-time", OBJECT(rtc_state),
- "date");
+ object_property_set_alias(OBJECT(pcms), "rtc-time", OBJECT(rtc_state));
#ifdef CONFIG_XEN_EMU
if (xen_mode == XEN_EMULATE) {
@@ -1754,6 +1753,10 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
offsetof(PCMachineState, alias_pcspk),
TYPE_PC_SPEAKER,
"audiodev");
+ object_class_property_add_alias(oc, "rtc-time",
+ offsetof(PCMachineState, alias_rtc_time),
+ TYPE_MC146818_RTC,
+ "date");
}
static const TypeInfo pc_machine_info = {
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 7/9] hw/i386/pc.c: convert PC_MACHINE_ACPI_DEVICE_PROP from object prop to class prop
2026-07-03 9:07 [PATCH 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
` (5 preceding siblings ...)
2026-07-03 9:07 ` [PATCH 6/9] hw/i386/pc.c: convert rtc-time object prop to a " Mark Cave-Ayland
@ 2026-07-03 9:08 ` Mark Cave-Ayland
2026-07-07 16:48 ` Daniel P. Berrangé
2026-07-03 9:08 ` [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props Mark Cave-Ayland
2026-07-03 9:08 ` [PATCH 9/9] hw/i386/sgx-epc.c: convert SGX_EPC_SIZE_PROP object prop to class prop Mark Cave-Ayland
8 siblings, 1 reply; 27+ messages in thread
From: Mark Cave-Ayland @ 2026-07-03 9:08 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, berrange, qemu-devel
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
hw/i386/pc.c | 5 +++++
hw/i386/pc_piix.c | 5 -----
hw/i386/pc_q35.c | 5 -----
3 files changed, 5 insertions(+), 10 deletions(-)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index b3d4a26c94..13c9c1bfc8 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1757,6 +1757,11 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
offsetof(PCMachineState, alias_rtc_time),
TYPE_MC146818_RTC,
"date");
+ object_class_property_add_link(oc, PC_MACHINE_ACPI_DEVICE_PROP,
+ TYPE_HOTPLUG_HANDLER,
+ offsetof(X86MachineState, acpi_dev),
+ object_property_allow_set_link,
+ OBJ_PROP_LINK_STRONG);
}
static const TypeInfo pc_machine_info = {
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 82457bdb16..98f2c4303f 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -306,11 +306,6 @@ static void pc_init1(MachineState *machine, const char *pci_type)
/* TODO: Populate SPD eeprom data. */
smbus_eeprom_init(pcms->smbus, 8, NULL, 0);
- object_property_add_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
- TYPE_HOTPLUG_HANDLER,
- (Object **)&x86ms->acpi_dev,
- object_property_allow_set_link,
- OBJ_PROP_LINK_STRONG);
object_property_set_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
piix4_pm, &error_abort);
}
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 6c1e4eff5f..d851a98273 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -247,11 +247,6 @@ static void pc_q35_init(MachineState *machine)
x86ms->rtc = ISA_DEVICE(object_resolve_path_component(OBJECT(lpc), "rtc"));
- object_property_add_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
- TYPE_HOTPLUG_HANDLER,
- (Object **)&x86ms->acpi_dev,
- object_property_allow_set_link,
- OBJ_PROP_LINK_STRONG);
object_property_set_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
OBJECT(lpc), &error_abort);
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props
2026-07-03 9:07 [PATCH 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
` (6 preceding siblings ...)
2026-07-03 9:08 ` [PATCH 7/9] hw/i386/pc.c: convert PC_MACHINE_ACPI_DEVICE_PROP from object prop to " Mark Cave-Ayland
@ 2026-07-03 9:08 ` Mark Cave-Ayland
2026-07-07 16:58 ` Daniel P. Berrangé
2026-07-08 10:16 ` Peter Maydell
2026-07-03 9:08 ` [PATCH 9/9] hw/i386/sgx-epc.c: convert SGX_EPC_SIZE_PROP object prop to class prop Mark Cave-Ayland
8 siblings, 2 replies; 27+ messages in thread
From: Mark Cave-Ayland @ 2026-07-03 9:08 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, berrange, qemu-devel
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
include/hw/i386/pc.h | 2 ++
hw/i386/pc.c | 8 ++++++++
hw/i386/pc_sysfw.c | 7 +------
3 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 309de2eda1..16cb0ec01f 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -40,6 +40,8 @@ typedef struct PCMachineState {
Object *alias_pcspk;
Object *alias_rtc_time;
+ Object *alias_pflash0;
+ Object *alias_pflash1;
/* Configuration options: */
uint64_t max_ram_below_4g;
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 13c9c1bfc8..11eef176f4 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1762,6 +1762,14 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
offsetof(X86MachineState, acpi_dev),
object_property_allow_set_link,
OBJ_PROP_LINK_STRONG);
+ object_class_property_add_alias(oc, "pflash0",
+ offsetof(PCMachineState, alias_pflash0),
+ TYPE_PFLASH_CFI01,
+ "drive");
+ object_class_property_add_alias(oc, "pflash1",
+ offsetof(PCMachineState, alias_pflash1),
+ TYPE_PFLASH_CFI01,
+ "drive");
}
static const TypeInfo pc_machine_info = {
diff --git a/hw/i386/pc_sysfw.c b/hw/i386/pc_sysfw.c
index 1a41a5972b..441e777191 100644
--- a/hw/i386/pc_sysfw.c
+++ b/hw/i386/pc_sysfw.c
@@ -85,8 +85,7 @@ static PFlashCFI01 *pc_pflash_create(PCMachineState *pcms,
qdev_prop_set_uint8(dev, "width", 1);
qdev_prop_set_string(dev, "name", name);
object_property_add_child(OBJECT(pcms), name, OBJECT(dev));
- object_property_add_alias(OBJECT(pcms), alias_prop_name,
- OBJECT(dev), "drive");
+ object_property_set_alias(OBJECT(pcms), alias_prop_name, OBJECT(dev));
/*
* The returned reference is tied to the child property and
* will be removed with object_unparent.
@@ -109,16 +108,12 @@ void pc_system_flash_create(PCMachineState *pcms)
void pc_system_flash_cleanup_unused(PCMachineState *pcms)
{
- char *prop_name;
int i;
assert(PC_MACHINE_GET_CLASS(pcms)->pci_enabled);
for (i = 0; i < ARRAY_SIZE(pcms->flash); i++) {
if (!qdev_is_realized(DEVICE(pcms->flash[i]))) {
- prop_name = g_strdup_printf("pflash%d", i);
- object_property_del(OBJECT(pcms), prop_name);
- g_free(prop_name);
object_unparent(OBJECT(pcms->flash[i]));
pcms->flash[i] = NULL;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 9/9] hw/i386/sgx-epc.c: convert SGX_EPC_SIZE_PROP object prop to class prop
2026-07-03 9:07 [PATCH 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
` (7 preceding siblings ...)
2026-07-03 9:08 ` [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props Mark Cave-Ayland
@ 2026-07-03 9:08 ` Mark Cave-Ayland
2026-07-07 16:54 ` Daniel P. Berrangé
8 siblings, 1 reply; 27+ messages in thread
From: Mark Cave-Ayland @ 2026-07-03 9:08 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, berrange, qemu-devel
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
hw/i386/sgx-epc.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/hw/i386/sgx-epc.c b/hw/i386/sgx-epc.c
index d3fe10028c..29cda843c9 100644
--- a/hw/i386/sgx-epc.c
+++ b/hw/i386/sgx-epc.c
@@ -41,12 +41,6 @@ static void sgx_epc_get_size(Object *obj, Visitor *v, const char *name,
visit_type_uint64(v, name, &value, errp);
}
-static void sgx_epc_init(Object *obj)
-{
- object_property_add(obj, SGX_EPC_SIZE_PROP, "uint64", sgx_epc_get_size,
- NULL, NULL, NULL);
-}
-
static void sgx_epc_realize(DeviceState *dev, Error **errp)
{
PCMachineState *pcms = PC_MACHINE(qdev_get_machine());
@@ -164,13 +158,17 @@ static void sgx_epc_class_init(ObjectClass *oc, const void *data)
mdc->get_plugged_size = sgx_epc_md_get_plugged_size;
mdc->get_memory_region = sgx_epc_md_get_memory_region;
mdc->fill_device_info = sgx_epc_md_fill_device_info;
+
+ object_class_property_add(oc, SGX_EPC_SIZE_PROP, "uint64",
+ sgx_epc_get_size,
+ NULL,
+ NULL, NULL);
}
static const TypeInfo sgx_epc_info = {
.name = TYPE_SGX_EPC,
.parent = TYPE_DEVICE,
.instance_size = sizeof(SGXEPCDevice),
- .instance_init = sgx_epc_init,
.class_init = sgx_epc_class_init,
.class_size = sizeof(DeviceClass),
.interfaces = (const InterfaceInfo[]) {
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* Re: [PATCH 5/9] hw/rtc/mc146818rtc.c: convert date from object prop to class prop
2026-07-03 9:07 ` [PATCH 5/9] hw/rtc/mc146818rtc.c: convert date from object prop to " Mark Cave-Ayland
@ 2026-07-06 7:15 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 27+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-07-06 7:15 UTC (permalink / raw)
To: Mark Cave-Ayland, pbonzini, richard.henderson, mst, mtosatti,
berrange, qemu-devel
On 3/7/26 11:07, Mark Cave-Ayland wrote:
> This is to allow it to be the target of a class alias property.
>
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> hw/rtc/mc146818rtc.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 7/9] hw/i386/pc.c: convert PC_MACHINE_ACPI_DEVICE_PROP from object prop to class prop
2026-07-03 9:08 ` [PATCH 7/9] hw/i386/pc.c: convert PC_MACHINE_ACPI_DEVICE_PROP from object prop to " Mark Cave-Ayland
@ 2026-07-07 16:48 ` Daniel P. Berrangé
0 siblings, 0 replies; 27+ messages in thread
From: Daniel P. Berrangé @ 2026-07-07 16:48 UTC (permalink / raw)
To: Mark Cave-Ayland; +Cc: pbonzini, richard.henderson, mst, mtosatti, qemu-devel
On Fri, Jul 03, 2026 at 10:08:00AM +0100, Mark Cave-Ayland wrote:
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> hw/i386/pc.c | 5 +++++
> hw/i386/pc_piix.c | 5 -----
> hw/i386/pc_q35.c | 5 -----
> 3 files changed, 5 insertions(+), 10 deletions(-)
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 9/9] hw/i386/sgx-epc.c: convert SGX_EPC_SIZE_PROP object prop to class prop
2026-07-03 9:08 ` [PATCH 9/9] hw/i386/sgx-epc.c: convert SGX_EPC_SIZE_PROP object prop to class prop Mark Cave-Ayland
@ 2026-07-07 16:54 ` Daniel P. Berrangé
0 siblings, 0 replies; 27+ messages in thread
From: Daniel P. Berrangé @ 2026-07-07 16:54 UTC (permalink / raw)
To: Mark Cave-Ayland; +Cc: pbonzini, richard.henderson, mst, mtosatti, qemu-devel
On Fri, Jul 03, 2026 at 10:08:02AM +0100, Mark Cave-Ayland wrote:
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> hw/i386/sgx-epc.c | 12 +++++-------
> 1 file changed, 5 insertions(+), 7 deletions(-)
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props
2026-07-03 9:08 ` [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props Mark Cave-Ayland
@ 2026-07-07 16:58 ` Daniel P. Berrangé
2026-07-08 9:40 ` Mark Cave-Ayland
2026-07-08 10:16 ` Peter Maydell
1 sibling, 1 reply; 27+ messages in thread
From: Daniel P. Berrangé @ 2026-07-07 16:58 UTC (permalink / raw)
To: Mark Cave-Ayland; +Cc: pbonzini, richard.henderson, mst, mtosatti, qemu-devel
On Fri, Jul 03, 2026 at 10:08:01AM +0100, Mark Cave-Ayland wrote:
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> include/hw/i386/pc.h | 2 ++
> hw/i386/pc.c | 8 ++++++++
> hw/i386/pc_sysfw.c | 7 +------
> 3 files changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> index 309de2eda1..16cb0ec01f 100644
> --- a/include/hw/i386/pc.h
> +++ b/include/hw/i386/pc.h
> @@ -40,6 +40,8 @@ typedef struct PCMachineState {
>
> Object *alias_pcspk;
> Object *alias_rtc_time;
> + Object *alias_pflash0;
> + Object *alias_pflash1;
>
> /* Configuration options: */
> uint64_t max_ram_below_4g;
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index 13c9c1bfc8..11eef176f4 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1762,6 +1762,14 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
> offsetof(X86MachineState, acpi_dev),
> object_property_allow_set_link,
> OBJ_PROP_LINK_STRONG);
> + object_class_property_add_alias(oc, "pflash0",
> + offsetof(PCMachineState, alias_pflash0),
> + TYPE_PFLASH_CFI01,
> + "drive");
> + object_class_property_add_alias(oc, "pflash1",
> + offsetof(PCMachineState, alias_pflash1),
> + TYPE_PFLASH_CFI01,
> + "drive");
> }
>
> static const TypeInfo pc_machine_info = {
> diff --git a/hw/i386/pc_sysfw.c b/hw/i386/pc_sysfw.c
> index 1a41a5972b..441e777191 100644
> --- a/hw/i386/pc_sysfw.c
> +++ b/hw/i386/pc_sysfw.c
> @@ -85,8 +85,7 @@ static PFlashCFI01 *pc_pflash_create(PCMachineState *pcms,
> qdev_prop_set_uint8(dev, "width", 1);
> qdev_prop_set_string(dev, "name", name);
> object_property_add_child(OBJECT(pcms), name, OBJECT(dev));
> - object_property_add_alias(OBJECT(pcms), alias_prop_name,
> - OBJECT(dev), "drive");
> + object_property_set_alias(OBJECT(pcms), alias_prop_name, OBJECT(dev));
> /*
> * The returned reference is tied to the child property and
> * will be removed with object_unparent.
> @@ -109,16 +108,12 @@ void pc_system_flash_create(PCMachineState *pcms)
>
> void pc_system_flash_cleanup_unused(PCMachineState *pcms)
> {
> - char *prop_name;
> int i;
>
> assert(PC_MACHINE_GET_CLASS(pcms)->pci_enabled);
>
> for (i = 0; i < ARRAY_SIZE(pcms->flash); i++) {
> if (!qdev_is_realized(DEVICE(pcms->flash[i]))) {
> - prop_name = g_strdup_printf("pflash%d", i);
> - object_property_del(OBJECT(pcms), prop_name);
> - g_free(prop_name);
> object_unparent(OBJECT(pcms->flash[i]));
> pcms->flash[i] = NULL;
> }
Does this externally change visible behaviour ?
The pc_system_flash_cleanup_unused method is run in the instance
init method, and will purge the 'pflash0' and 'pflash1' properties
if they were never set.
IIUC with the new code pflash0 and pflash1 will always be visible,
but would be unset, as object_property_set_alias would not have
been called.
THe new behaviour is arguably better - IMHO properties should
always be present, and use "unset" as an explicit state.
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 6/9] hw/i386/pc.c: convert rtc-time object prop to a class prop
2026-07-03 9:07 ` [PATCH 6/9] hw/i386/pc.c: convert rtc-time object prop to a " Mark Cave-Ayland
@ 2026-07-07 16:58 ` Daniel P. Berrangé
0 siblings, 0 replies; 27+ messages in thread
From: Daniel P. Berrangé @ 2026-07-07 16:58 UTC (permalink / raw)
To: Mark Cave-Ayland; +Cc: pbonzini, richard.henderson, mst, mtosatti, qemu-devel
On Fri, Jul 03, 2026 at 10:07:59AM +0100, Mark Cave-Ayland wrote:
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> include/hw/i386/pc.h | 1 +
> hw/i386/pc.c | 7 +++++--
> 2 files changed, 6 insertions(+), 2 deletions(-)
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props
2026-07-07 16:58 ` Daniel P. Berrangé
@ 2026-07-08 9:40 ` Mark Cave-Ayland
2026-07-08 9:56 ` Daniel P. Berrangé
0 siblings, 1 reply; 27+ messages in thread
From: Mark Cave-Ayland @ 2026-07-08 9:40 UTC (permalink / raw)
To: Daniel P. Berrangé
Cc: pbonzini, richard.henderson, mst, mtosatti, qemu-devel
On 07/07/2026 17:58, Daniel P. Berrangé wrote:
> On Fri, Jul 03, 2026 at 10:08:01AM +0100, Mark Cave-Ayland wrote:
>> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
>> ---
>> include/hw/i386/pc.h | 2 ++
>> hw/i386/pc.c | 8 ++++++++
>> hw/i386/pc_sysfw.c | 7 +------
>> 3 files changed, 11 insertions(+), 6 deletions(-)
>>
>> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
>> index 309de2eda1..16cb0ec01f 100644
>> --- a/include/hw/i386/pc.h
>> +++ b/include/hw/i386/pc.h
>> @@ -40,6 +40,8 @@ typedef struct PCMachineState {
>>
>> Object *alias_pcspk;
>> Object *alias_rtc_time;
>> + Object *alias_pflash0;
>> + Object *alias_pflash1;
>>
>> /* Configuration options: */
>> uint64_t max_ram_below_4g;
>> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
>> index 13c9c1bfc8..11eef176f4 100644
>> --- a/hw/i386/pc.c
>> +++ b/hw/i386/pc.c
>> @@ -1762,6 +1762,14 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
>> offsetof(X86MachineState, acpi_dev),
>> object_property_allow_set_link,
>> OBJ_PROP_LINK_STRONG);
>> + object_class_property_add_alias(oc, "pflash0",
>> + offsetof(PCMachineState, alias_pflash0),
>> + TYPE_PFLASH_CFI01,
>> + "drive");
>> + object_class_property_add_alias(oc, "pflash1",
>> + offsetof(PCMachineState, alias_pflash1),
>> + TYPE_PFLASH_CFI01,
>> + "drive");
>> }
>>
>> static const TypeInfo pc_machine_info = {
>> diff --git a/hw/i386/pc_sysfw.c b/hw/i386/pc_sysfw.c
>> index 1a41a5972b..441e777191 100644
>> --- a/hw/i386/pc_sysfw.c
>> +++ b/hw/i386/pc_sysfw.c
>> @@ -85,8 +85,7 @@ static PFlashCFI01 *pc_pflash_create(PCMachineState *pcms,
>> qdev_prop_set_uint8(dev, "width", 1);
>> qdev_prop_set_string(dev, "name", name);
>> object_property_add_child(OBJECT(pcms), name, OBJECT(dev));
>> - object_property_add_alias(OBJECT(pcms), alias_prop_name,
>> - OBJECT(dev), "drive");
>> + object_property_set_alias(OBJECT(pcms), alias_prop_name, OBJECT(dev));
>> /*
>> * The returned reference is tied to the child property and
>> * will be removed with object_unparent.
>> @@ -109,16 +108,12 @@ void pc_system_flash_create(PCMachineState *pcms)
>>
>> void pc_system_flash_cleanup_unused(PCMachineState *pcms)
>> {
>> - char *prop_name;
>> int i;
>>
>> assert(PC_MACHINE_GET_CLASS(pcms)->pci_enabled);
>>
>> for (i = 0; i < ARRAY_SIZE(pcms->flash); i++) {
>> if (!qdev_is_realized(DEVICE(pcms->flash[i]))) {
>> - prop_name = g_strdup_printf("pflash%d", i);
>> - object_property_del(OBJECT(pcms), prop_name);
>> - g_free(prop_name);
>> object_unparent(OBJECT(pcms->flash[i]));
>> pcms->flash[i] = NULL;
>> }
>
> Does this externally change visible behaviour ?
>
> The pc_system_flash_cleanup_unused method is run in the instance
> init method, and will purge the 'pflash0' and 'pflash1' properties
> if they were never set.
>
> IIUC with the new code pflash0 and pflash1 will always be visible,
> but would be unset, as object_property_set_alias would not have
> been called.
>
> THe new behaviour is arguably better - IMHO properties should
> always be present, and use "unset" as an explicit state.
Yes, it does change the behaviour to reflect the fact that the pflash0
and pflash1 properties always exist:
Before this series:
$ ./build/qemu-system-x86_64 -M q35 -monitor stdio
QEMU 11.0.50 monitor - type 'help' for more information
(qemu) qom-get /machine pflash0
Error: Property 'pc-q35-11.1-machine.pflash0' not found
After this series:
$ ./build/qemu-system-x86_64 -M q35 -monitor stdio
QEMU 11.0.50 monitor - type 'help' for more information
(qemu) qom-get /machine pflash0
""
ATB,
Mark.
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props
2026-07-08 9:40 ` Mark Cave-Ayland
@ 2026-07-08 9:56 ` Daniel P. Berrangé
0 siblings, 0 replies; 27+ messages in thread
From: Daniel P. Berrangé @ 2026-07-08 9:56 UTC (permalink / raw)
To: Mark Cave-Ayland; +Cc: pbonzini, richard.henderson, mst, mtosatti, qemu-devel
On Wed, Jul 08, 2026 at 10:40:54AM +0100, Mark Cave-Ayland wrote:
> On 07/07/2026 17:58, Daniel P. Berrangé wrote:
>
> > On Fri, Jul 03, 2026 at 10:08:01AM +0100, Mark Cave-Ayland wrote:
> > > Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> > > ---
> > > include/hw/i386/pc.h | 2 ++
> > > hw/i386/pc.c | 8 ++++++++
> > > hw/i386/pc_sysfw.c | 7 +------
> > > 3 files changed, 11 insertions(+), 6 deletions(-)
> > >
> > > diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> > > index 309de2eda1..16cb0ec01f 100644
> > > --- a/include/hw/i386/pc.h
> > > +++ b/include/hw/i386/pc.h
> > > @@ -40,6 +40,8 @@ typedef struct PCMachineState {
> > > Object *alias_pcspk;
> > > Object *alias_rtc_time;
> > > + Object *alias_pflash0;
> > > + Object *alias_pflash1;
> > > /* Configuration options: */
> > > uint64_t max_ram_below_4g;
> > > diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> > > index 13c9c1bfc8..11eef176f4 100644
> > > --- a/hw/i386/pc.c
> > > +++ b/hw/i386/pc.c
> > > @@ -1762,6 +1762,14 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
> > > offsetof(X86MachineState, acpi_dev),
> > > object_property_allow_set_link,
> > > OBJ_PROP_LINK_STRONG);
> > > + object_class_property_add_alias(oc, "pflash0",
> > > + offsetof(PCMachineState, alias_pflash0),
> > > + TYPE_PFLASH_CFI01,
> > > + "drive");
> > > + object_class_property_add_alias(oc, "pflash1",
> > > + offsetof(PCMachineState, alias_pflash1),
> > > + TYPE_PFLASH_CFI01,
> > > + "drive");
> > > }
> > > static const TypeInfo pc_machine_info = {
> > > diff --git a/hw/i386/pc_sysfw.c b/hw/i386/pc_sysfw.c
> > > index 1a41a5972b..441e777191 100644
> > > --- a/hw/i386/pc_sysfw.c
> > > +++ b/hw/i386/pc_sysfw.c
> > > @@ -85,8 +85,7 @@ static PFlashCFI01 *pc_pflash_create(PCMachineState *pcms,
> > > qdev_prop_set_uint8(dev, "width", 1);
> > > qdev_prop_set_string(dev, "name", name);
> > > object_property_add_child(OBJECT(pcms), name, OBJECT(dev));
> > > - object_property_add_alias(OBJECT(pcms), alias_prop_name,
> > > - OBJECT(dev), "drive");
> > > + object_property_set_alias(OBJECT(pcms), alias_prop_name, OBJECT(dev));
> > > /*
> > > * The returned reference is tied to the child property and
> > > * will be removed with object_unparent.
> > > @@ -109,16 +108,12 @@ void pc_system_flash_create(PCMachineState *pcms)
> > > void pc_system_flash_cleanup_unused(PCMachineState *pcms)
> > > {
> > > - char *prop_name;
> > > int i;
> > > assert(PC_MACHINE_GET_CLASS(pcms)->pci_enabled);
> > > for (i = 0; i < ARRAY_SIZE(pcms->flash); i++) {
> > > if (!qdev_is_realized(DEVICE(pcms->flash[i]))) {
> > > - prop_name = g_strdup_printf("pflash%d", i);
> > > - object_property_del(OBJECT(pcms), prop_name);
> > > - g_free(prop_name);
> > > object_unparent(OBJECT(pcms->flash[i]));
> > > pcms->flash[i] = NULL;
> > > }
> >
> > Does this externally change visible behaviour ?
> >
> > The pc_system_flash_cleanup_unused method is run in the instance
> > init method, and will purge the 'pflash0' and 'pflash1' properties
> > if they were never set.
> >
> > IIUC with the new code pflash0 and pflash1 will always be visible,
> > but would be unset, as object_property_set_alias would not have
> > been called.
> >
> > THe new behaviour is arguably better - IMHO properties should
> > always be present, and use "unset" as an explicit state.
>
> Yes, it does change the behaviour to reflect the fact that the pflash0 and
> pflash1 properties always exist:
>
> Before this series:
>
> $ ./build/qemu-system-x86_64 -M q35 -monitor stdio
> QEMU 11.0.50 monitor - type 'help' for more information
> (qemu) qom-get /machine pflash0
> Error: Property 'pc-q35-11.1-machine.pflash0' not found
>
> After this series:
>
> $ ./build/qemu-system-x86_64 -M q35 -monitor stdio
> QEMU 11.0.50 monitor - type 'help' for more information
> (qemu) qom-get /machine pflash0
> ""
As a behaviour change, please call this out in the commit message,
since this is an example situation that needs a subsystem maintainer
review/ack rather than a general review/ack.
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props
2026-07-03 9:08 ` [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props Mark Cave-Ayland
2026-07-07 16:58 ` Daniel P. Berrangé
@ 2026-07-08 10:16 ` Peter Maydell
2026-07-08 10:24 ` Daniel P. Berrangé
2026-07-08 10:28 ` Mark Cave-Ayland
1 sibling, 2 replies; 27+ messages in thread
From: Peter Maydell @ 2026-07-08 10:16 UTC (permalink / raw)
To: Mark Cave-Ayland
Cc: pbonzini, richard.henderson, mst, mtosatti, berrange, qemu-devel
On Fri, 3 Jul 2026 at 10:09, Mark Cave-Ayland
<mark.caveayland@nutanix.com> wrote:
>
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> include/hw/i386/pc.h | 2 ++
> hw/i386/pc.c | 8 ++++++++
> hw/i386/pc_sysfw.c | 7 +------
> 3 files changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> index 309de2eda1..16cb0ec01f 100644
> --- a/include/hw/i386/pc.h
> +++ b/include/hw/i386/pc.h
> @@ -40,6 +40,8 @@ typedef struct PCMachineState {
>
> Object *alias_pcspk;
> Object *alias_rtc_time;
> + Object *alias_pflash0;
> + Object *alias_pflash1;
>
> /* Configuration options: */
> uint64_t max_ram_below_4g;
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index 13c9c1bfc8..11eef176f4 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1762,6 +1762,14 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
> offsetof(X86MachineState, acpi_dev),
> object_property_allow_set_link,
> OBJ_PROP_LINK_STRONG);
> + object_class_property_add_alias(oc, "pflash0",
> + offsetof(PCMachineState, alias_pflash0),
> + TYPE_PFLASH_CFI01,
> + "drive");
> + object_class_property_add_alias(oc, "pflash1",
> + offsetof(PCMachineState, alias_pflash1),
> + TYPE_PFLASH_CFI01,
> + "drive");
Does making these class properties fix
https://gitlab.com/qemu-project/qemu/-/work_items/3254
(which is a report that "qemu-system-x86_64 -machine pc-q35,help"
doesn't list these properties) ?
thanks
-- PMM
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props
2026-07-08 10:16 ` Peter Maydell
@ 2026-07-08 10:24 ` Daniel P. Berrangé
2026-07-08 11:21 ` Markus Armbruster
2026-07-08 10:28 ` Mark Cave-Ayland
1 sibling, 1 reply; 27+ messages in thread
From: Daniel P. Berrangé @ 2026-07-08 10:24 UTC (permalink / raw)
To: Peter Maydell
Cc: Mark Cave-Ayland, pbonzini, richard.henderson, mst, mtosatti,
qemu-devel
On Wed, Jul 08, 2026 at 11:16:30AM +0100, Peter Maydell wrote:
> On Fri, 3 Jul 2026 at 10:09, Mark Cave-Ayland
> <mark.caveayland@nutanix.com> wrote:
> >
> > Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> > ---
> > include/hw/i386/pc.h | 2 ++
> > hw/i386/pc.c | 8 ++++++++
> > hw/i386/pc_sysfw.c | 7 +------
> > 3 files changed, 11 insertions(+), 6 deletions(-)
> >
> > diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> > index 309de2eda1..16cb0ec01f 100644
> > --- a/include/hw/i386/pc.h
> > +++ b/include/hw/i386/pc.h
> > @@ -40,6 +40,8 @@ typedef struct PCMachineState {
> >
> > Object *alias_pcspk;
> > Object *alias_rtc_time;
> > + Object *alias_pflash0;
> > + Object *alias_pflash1;
> >
> > /* Configuration options: */
> > uint64_t max_ram_below_4g;
> > diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> > index 13c9c1bfc8..11eef176f4 100644
> > --- a/hw/i386/pc.c
> > +++ b/hw/i386/pc.c
> > @@ -1762,6 +1762,14 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
> > offsetof(X86MachineState, acpi_dev),
> > object_property_allow_set_link,
> > OBJ_PROP_LINK_STRONG);
> > + object_class_property_add_alias(oc, "pflash0",
> > + offsetof(PCMachineState, alias_pflash0),
> > + TYPE_PFLASH_CFI01,
> > + "drive");
> > + object_class_property_add_alias(oc, "pflash1",
> > + offsetof(PCMachineState, alias_pflash1),
> > + TYPE_PFLASH_CFI01,
> > + "drive");
>
> Does making these class properties fix
> https://gitlab.com/qemu-project/qemu/-/work_items/3254
> (which is a report that "qemu-system-x86_64 -machine pc-q35,help"
> doesn't list these properties) ?
Yes, it ought to, as that CLI logic iterates over class properties.
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props
2026-07-08 10:16 ` Peter Maydell
2026-07-08 10:24 ` Daniel P. Berrangé
@ 2026-07-08 10:28 ` Mark Cave-Ayland
1 sibling, 0 replies; 27+ messages in thread
From: Mark Cave-Ayland @ 2026-07-08 10:28 UTC (permalink / raw)
To: Peter Maydell
Cc: pbonzini, richard.henderson, mst, mtosatti, berrange, qemu-devel
On 08/07/2026 11:16, Peter Maydell wrote:
> On Fri, 3 Jul 2026 at 10:09, Mark Cave-Ayland
> <mark.caveayland@nutanix.com> wrote:
>>
>> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
>> ---
>> include/hw/i386/pc.h | 2 ++
>> hw/i386/pc.c | 8 ++++++++
>> hw/i386/pc_sysfw.c | 7 +------
>> 3 files changed, 11 insertions(+), 6 deletions(-)
>>
>> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
>> index 309de2eda1..16cb0ec01f 100644
>> --- a/include/hw/i386/pc.h
>> +++ b/include/hw/i386/pc.h
>> @@ -40,6 +40,8 @@ typedef struct PCMachineState {
>>
>> Object *alias_pcspk;
>> Object *alias_rtc_time;
>> + Object *alias_pflash0;
>> + Object *alias_pflash1;
>>
>> /* Configuration options: */
>> uint64_t max_ram_below_4g;
>> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
>> index 13c9c1bfc8..11eef176f4 100644
>> --- a/hw/i386/pc.c
>> +++ b/hw/i386/pc.c
>> @@ -1762,6 +1762,14 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
>> offsetof(X86MachineState, acpi_dev),
>> object_property_allow_set_link,
>> OBJ_PROP_LINK_STRONG);
>> + object_class_property_add_alias(oc, "pflash0",
>> + offsetof(PCMachineState, alias_pflash0),
>> + TYPE_PFLASH_CFI01,
>> + "drive");
>> + object_class_property_add_alias(oc, "pflash1",
>> + offsetof(PCMachineState, alias_pflash1),
>> + TYPE_PFLASH_CFI01,
>> + "drive");
>
> Does making these class properties fix
> https://urldefense.proofpoint.com/v2/url?u=https-3A__gitlab.com_qemu-2Dproject_qemu_-2D_work-5Fitems_3254&d=DwIBaQ&c=s883GpUCOChKOHiocYtGcg&r=c23RpsaH4D2MKyD3EPJTDa0BAxz6tV8aUJqVSoytEiY&m=aFRMA31BRpUGFc6oz2sysTVC7X4XLweNq3bWaZ-Qe2X0DjWynbeE9wH6KkOxdVV9&s=cLTzhO_XGkGotBc8X71KHVkE1UNW_8uTVosqAi0gBa8&e=
> (which is a report that "qemu-system-x86_64 -machine pc-q35,help"
> doesn't list these properties) ?
Yes, I can confirm that it does:
Before this series:
$ ./build/qemu-system-x86_64 -M q35,help | grep pflash
$
After this series:
$ ./build/qemu-system-x86_64 -M q35,help | grep pflash
pflash0=<str> - Node name or ID of a block device to use as
a backend
pflash1=<str> - Node name or ID of a block device to use as
a backend
$
ATB,
Mark.
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props
2026-07-08 10:24 ` Daniel P. Berrangé
@ 2026-07-08 11:21 ` Markus Armbruster
2026-07-08 11:28 ` Daniel P. Berrangé
0 siblings, 1 reply; 27+ messages in thread
From: Markus Armbruster @ 2026-07-08 11:21 UTC (permalink / raw)
To: Daniel P. Berrangé
Cc: Peter Maydell, Mark Cave-Ayland, pbonzini, richard.henderson, mst,
mtosatti, qemu-devel
Daniel P. Berrangé <berrange@redhat.com> writes:
> On Wed, Jul 08, 2026 at 11:16:30AM +0100, Peter Maydell wrote:
>> On Fri, 3 Jul 2026 at 10:09, Mark Cave-Ayland
>> <mark.caveayland@nutanix.com> wrote:
>> >
>> > Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
>> > ---
>> > include/hw/i386/pc.h | 2 ++
>> > hw/i386/pc.c | 8 ++++++++
>> > hw/i386/pc_sysfw.c | 7 +------
>> > 3 files changed, 11 insertions(+), 6 deletions(-)
>> >
>> > diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
>> > index 309de2eda1..16cb0ec01f 100644
>> > --- a/include/hw/i386/pc.h
>> > +++ b/include/hw/i386/pc.h
>> > @@ -40,6 +40,8 @@ typedef struct PCMachineState {
>> >
>> > Object *alias_pcspk;
>> > Object *alias_rtc_time;
>> > + Object *alias_pflash0;
>> > + Object *alias_pflash1;
>> >
>> > /* Configuration options: */
>> > uint64_t max_ram_below_4g;
>> > diff --git a/hw/i386/pc.c b/hw/i386/pc.c
>> > index 13c9c1bfc8..11eef176f4 100644
>> > --- a/hw/i386/pc.c
>> > +++ b/hw/i386/pc.c
>> > @@ -1762,6 +1762,14 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
>> > offsetof(X86MachineState, acpi_dev),
>> > object_property_allow_set_link,
>> > OBJ_PROP_LINK_STRONG);
>> > + object_class_property_add_alias(oc, "pflash0",
>> > + offsetof(PCMachineState, alias_pflash0),
>> > + TYPE_PFLASH_CFI01,
>> > + "drive");
>> > + object_class_property_add_alias(oc, "pflash1",
>> > + offsetof(PCMachineState, alias_pflash1),
>> > + TYPE_PFLASH_CFI01,
>> > + "drive");
>>
>> Does making these class properties fix
>> https://gitlab.com/qemu-project/qemu/-/work_items/3254
>> (which is a report that "qemu-system-x86_64 -machine pc-q35,help"
>> doesn't list these properties) ?
Not showing object properties is a bug.
Cannot be fixed for object properties that are created outside the
object's instance_init().
Now, object properties created in instance_init() should almost
certainly be class properties instead. Converting them all fixes the
fixable part of the bug:
> Yes, it ought to, as that CLI logic iterates over class properties.
One property conversion at a time.
There's a quicker fix, though.
-machine TYPE.help uses type_print_class_properties() to show
properties. Here's its loop:
object_class_property_iter_init(&iter, klass);
while ((prop = object_property_iter_next(&iter))) {
if (!prop->set) {
continue;
}
g_ptr_array_add(array,
object_property_help(prop->name, prop->type,
prop->defval, prop->description));
}
-device TYPE,help uses qmp_device_list_properties() to show both.
Here's its loop:
obj = object_new_with_class(klass);
object_property_iter_init(&iter, obj);
while ((prop = object_property_iter_next(&iter))) {
ObjectPropertyInfo *info;
[...]
info = g_new0(ObjectPropertyInfo, 1);
info->name = g_strdup(prop->name);
info->type = g_strdup(prop->type);
info->description = g_strdup(prop->description);
info->default_value = qobject_ref(prop->defval);
QAPI_LIST_PREPEND(prop_list, info);
}
object_unref(obj);
Is there any excuse not to do it this way?
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props
2026-07-08 11:21 ` Markus Armbruster
@ 2026-07-08 11:28 ` Daniel P. Berrangé
2026-07-08 12:50 ` Markus Armbruster
0 siblings, 1 reply; 27+ messages in thread
From: Daniel P. Berrangé @ 2026-07-08 11:28 UTC (permalink / raw)
To: Markus Armbruster
Cc: Peter Maydell, Mark Cave-Ayland, pbonzini, richard.henderson, mst,
mtosatti, qemu-devel
On Wed, Jul 08, 2026 at 01:21:49PM +0200, Markus Armbruster wrote:
> Daniel P. Berrangé <berrange@redhat.com> writes:
>
> > On Wed, Jul 08, 2026 at 11:16:30AM +0100, Peter Maydell wrote:
> >> On Fri, 3 Jul 2026 at 10:09, Mark Cave-Ayland
> >> <mark.caveayland@nutanix.com> wrote:
> >> >
> >> > Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> >> > ---
> >> > include/hw/i386/pc.h | 2 ++
> >> > hw/i386/pc.c | 8 ++++++++
> >> > hw/i386/pc_sysfw.c | 7 +------
> >> > 3 files changed, 11 insertions(+), 6 deletions(-)
> >> >
> >> > diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> >> > index 309de2eda1..16cb0ec01f 100644
> >> > --- a/include/hw/i386/pc.h
> >> > +++ b/include/hw/i386/pc.h
> >> > @@ -40,6 +40,8 @@ typedef struct PCMachineState {
> >> >
> >> > Object *alias_pcspk;
> >> > Object *alias_rtc_time;
> >> > + Object *alias_pflash0;
> >> > + Object *alias_pflash1;
> >> >
> >> > /* Configuration options: */
> >> > uint64_t max_ram_below_4g;
> >> > diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> >> > index 13c9c1bfc8..11eef176f4 100644
> >> > --- a/hw/i386/pc.c
> >> > +++ b/hw/i386/pc.c
> >> > @@ -1762,6 +1762,14 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
> >> > offsetof(X86MachineState, acpi_dev),
> >> > object_property_allow_set_link,
> >> > OBJ_PROP_LINK_STRONG);
> >> > + object_class_property_add_alias(oc, "pflash0",
> >> > + offsetof(PCMachineState, alias_pflash0),
> >> > + TYPE_PFLASH_CFI01,
> >> > + "drive");
> >> > + object_class_property_add_alias(oc, "pflash1",
> >> > + offsetof(PCMachineState, alias_pflash1),
> >> > + TYPE_PFLASH_CFI01,
> >> > + "drive");
> >>
> >> Does making these class properties fix
> >> https://gitlab.com/qemu-project/qemu/-/work_items/3254
> >> (which is a report that "qemu-system-x86_64 -machine pc-q35,help"
> >> doesn't list these properties) ?
>
> Not showing object properties is a bug.
>
> Cannot be fixed for object properties that are created outside the
> object's instance_init().
>
> Now, object properties created in instance_init() should almost
> certainly be class properties instead. Converting them all fixes the
> fixable part of the bug:
>
> > Yes, it ought to, as that CLI logic iterates over class properties.
>
> One property conversion at a time.
>
> There's a quicker fix, though.
>
> -machine TYPE.help uses type_print_class_properties() to show
> properties. Here's its loop:
>
> object_class_property_iter_init(&iter, klass);
> while ((prop = object_property_iter_next(&iter))) {
> if (!prop->set) {
> continue;
> }
>
> g_ptr_array_add(array,
> object_property_help(prop->name, prop->type,
> prop->defval, prop->description));
> }
>
> -device TYPE,help uses qmp_device_list_properties() to show both.
> Here's its loop:
>
> obj = object_new_with_class(klass);
>
> object_property_iter_init(&iter, obj);
> while ((prop = object_property_iter_next(&iter))) {
> ObjectPropertyInfo *info;
>
> [...]
>
> info = g_new0(ObjectPropertyInfo, 1);
> info->name = g_strdup(prop->name);
> info->type = g_strdup(prop->type);
> info->description = g_strdup(prop->description);
> info->default_value = qobject_ref(prop->defval);
>
> QAPI_LIST_PREPEND(prop_list, info);
> }
>
> object_unref(obj);
>
> Is there any excuse not to do it this way?
Something would need to validate that instantiating a machine type
for help usage won't trip over any edge cases. Could be done with
unit tests.
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props
2026-07-08 11:28 ` Daniel P. Berrangé
@ 2026-07-08 12:50 ` Markus Armbruster
2026-07-08 12:53 ` Daniel P. Berrangé
0 siblings, 1 reply; 27+ messages in thread
From: Markus Armbruster @ 2026-07-08 12:50 UTC (permalink / raw)
To: Daniel P. Berrangé
Cc: Peter Maydell, Mark Cave-Ayland, pbonzini, richard.henderson, mst,
mtosatti, qemu-devel
Daniel P. Berrangé <berrange@redhat.com> writes:
> On Wed, Jul 08, 2026 at 01:21:49PM +0200, Markus Armbruster wrote:
>> Daniel P. Berrangé <berrange@redhat.com> writes:
>>
>> > On Wed, Jul 08, 2026 at 11:16:30AM +0100, Peter Maydell wrote:
>> >> On Fri, 3 Jul 2026 at 10:09, Mark Cave-Ayland
>> >> <mark.caveayland@nutanix.com> wrote:
>> >> >
>> >> > Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
>> >> > ---
>> >> > include/hw/i386/pc.h | 2 ++
>> >> > hw/i386/pc.c | 8 ++++++++
>> >> > hw/i386/pc_sysfw.c | 7 +------
>> >> > 3 files changed, 11 insertions(+), 6 deletions(-)
>> >> >
>> >> > diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
>> >> > index 309de2eda1..16cb0ec01f 100644
>> >> > --- a/include/hw/i386/pc.h
>> >> > +++ b/include/hw/i386/pc.h
>> >> > @@ -40,6 +40,8 @@ typedef struct PCMachineState {
>> >> >
>> >> > Object *alias_pcspk;
>> >> > Object *alias_rtc_time;
>> >> > + Object *alias_pflash0;
>> >> > + Object *alias_pflash1;
>> >> >
>> >> > /* Configuration options: */
>> >> > uint64_t max_ram_below_4g;
>> >> > diff --git a/hw/i386/pc.c b/hw/i386/pc.c
>> >> > index 13c9c1bfc8..11eef176f4 100644
>> >> > --- a/hw/i386/pc.c
>> >> > +++ b/hw/i386/pc.c
>> >> > @@ -1762,6 +1762,14 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
>> >> > offsetof(X86MachineState, acpi_dev),
>> >> > object_property_allow_set_link,
>> >> > OBJ_PROP_LINK_STRONG);
>> >> > + object_class_property_add_alias(oc, "pflash0",
>> >> > + offsetof(PCMachineState, alias_pflash0),
>> >> > + TYPE_PFLASH_CFI01,
>> >> > + "drive");
>> >> > + object_class_property_add_alias(oc, "pflash1",
>> >> > + offsetof(PCMachineState, alias_pflash1),
>> >> > + TYPE_PFLASH_CFI01,
>> >> > + "drive");
>> >>
>> >> Does making these class properties fix
>> >> https://gitlab.com/qemu-project/qemu/-/work_items/3254
>> >> (which is a report that "qemu-system-x86_64 -machine pc-q35,help"
>> >> doesn't list these properties) ?
>>
>> Not showing object properties is a bug.
>>
>> Cannot be fixed for object properties that are created outside the
>> object's instance_init().
>>
>> Now, object properties created in instance_init() should almost
>> certainly be class properties instead. Converting them all fixes the
>> fixable part of the bug:
>>
>> > Yes, it ought to, as that CLI logic iterates over class properties.
>>
>> One property conversion at a time.
>>
>> There's a quicker fix, though.
>>
>> -machine TYPE.help uses type_print_class_properties() to show
>> properties. Here's its loop:
>>
>> object_class_property_iter_init(&iter, klass);
>> while ((prop = object_property_iter_next(&iter))) {
>> if (!prop->set) {
>> continue;
>> }
>>
>> g_ptr_array_add(array,
>> object_property_help(prop->name, prop->type,
>> prop->defval, prop->description));
>> }
>>
>> -device TYPE,help uses qmp_device_list_properties() to show both.
>> Here's its loop:
>>
>> obj = object_new_with_class(klass);
>>
>> object_property_iter_init(&iter, obj);
>> while ((prop = object_property_iter_next(&iter))) {
>> ObjectPropertyInfo *info;
>>
>> [...]
>>
>> info = g_new0(ObjectPropertyInfo, 1);
>> info->name = g_strdup(prop->name);
>> info->type = g_strdup(prop->type);
>> info->description = g_strdup(prop->description);
>> info->default_value = qobject_ref(prop->defval);
>>
>> QAPI_LIST_PREPEND(prop_list, info);
>> }
>>
>> object_unref(obj);
>>
>> Is there any excuse not to do it this way?
>
> Something would need to validate that instantiating a machine type
> for help usage won't trip over any edge cases. Could be done with
> unit tests.
tests/qtest/device-introspect-test.c covers this for devices.
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props
2026-07-08 12:50 ` Markus Armbruster
@ 2026-07-08 12:53 ` Daniel P. Berrangé
2026-07-08 12:57 ` Markus Armbruster
0 siblings, 1 reply; 27+ messages in thread
From: Daniel P. Berrangé @ 2026-07-08 12:53 UTC (permalink / raw)
To: Markus Armbruster
Cc: Peter Maydell, Mark Cave-Ayland, pbonzini, richard.henderson, mst,
mtosatti, qemu-devel
On Wed, Jul 08, 2026 at 02:50:54PM +0200, Markus Armbruster wrote:
> Daniel P. Berrangé <berrange@redhat.com> writes:
>
> > On Wed, Jul 08, 2026 at 01:21:49PM +0200, Markus Armbruster wrote:
> >> Daniel P. Berrangé <berrange@redhat.com> writes:
> >>
> >> > On Wed, Jul 08, 2026 at 11:16:30AM +0100, Peter Maydell wrote:
> >> >> On Fri, 3 Jul 2026 at 10:09, Mark Cave-Ayland
> >> >> <mark.caveayland@nutanix.com> wrote:
> >> >> >
> >> >> > Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> >> >> > ---
> >> >> > include/hw/i386/pc.h | 2 ++
> >> >> > hw/i386/pc.c | 8 ++++++++
> >> >> > hw/i386/pc_sysfw.c | 7 +------
> >> >> > 3 files changed, 11 insertions(+), 6 deletions(-)
> >> >> >
> >> >> > diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> >> >> > index 309de2eda1..16cb0ec01f 100644
> >> >> > --- a/include/hw/i386/pc.h
> >> >> > +++ b/include/hw/i386/pc.h
> >> >> > @@ -40,6 +40,8 @@ typedef struct PCMachineState {
> >> >> >
> >> >> > Object *alias_pcspk;
> >> >> > Object *alias_rtc_time;
> >> >> > + Object *alias_pflash0;
> >> >> > + Object *alias_pflash1;
> >> >> >
> >> >> > /* Configuration options: */
> >> >> > uint64_t max_ram_below_4g;
> >> >> > diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> >> >> > index 13c9c1bfc8..11eef176f4 100644
> >> >> > --- a/hw/i386/pc.c
> >> >> > +++ b/hw/i386/pc.c
> >> >> > @@ -1762,6 +1762,14 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
> >> >> > offsetof(X86MachineState, acpi_dev),
> >> >> > object_property_allow_set_link,
> >> >> > OBJ_PROP_LINK_STRONG);
> >> >> > + object_class_property_add_alias(oc, "pflash0",
> >> >> > + offsetof(PCMachineState, alias_pflash0),
> >> >> > + TYPE_PFLASH_CFI01,
> >> >> > + "drive");
> >> >> > + object_class_property_add_alias(oc, "pflash1",
> >> >> > + offsetof(PCMachineState, alias_pflash1),
> >> >> > + TYPE_PFLASH_CFI01,
> >> >> > + "drive");
> >> >>
> >> >> Does making these class properties fix
> >> >> https://gitlab.com/qemu-project/qemu/-/work_items/3254
> >> >> (which is a report that "qemu-system-x86_64 -machine pc-q35,help"
> >> >> doesn't list these properties) ?
> >>
> >> Not showing object properties is a bug.
> >>
> >> Cannot be fixed for object properties that are created outside the
> >> object's instance_init().
> >>
> >> Now, object properties created in instance_init() should almost
> >> certainly be class properties instead. Converting them all fixes the
> >> fixable part of the bug:
> >>
> >> > Yes, it ought to, as that CLI logic iterates over class properties.
> >>
> >> One property conversion at a time.
> >>
> >> There's a quicker fix, though.
> >>
> >> -machine TYPE.help uses type_print_class_properties() to show
> >> properties. Here's its loop:
> >>
> >> object_class_property_iter_init(&iter, klass);
> >> while ((prop = object_property_iter_next(&iter))) {
> >> if (!prop->set) {
> >> continue;
> >> }
> >>
> >> g_ptr_array_add(array,
> >> object_property_help(prop->name, prop->type,
> >> prop->defval, prop->description));
> >> }
> >>
> >> -device TYPE,help uses qmp_device_list_properties() to show both.
> >> Here's its loop:
> >>
> >> obj = object_new_with_class(klass);
> >>
> >> object_property_iter_init(&iter, obj);
> >> while ((prop = object_property_iter_next(&iter))) {
> >> ObjectPropertyInfo *info;
> >>
> >> [...]
> >>
> >> info = g_new0(ObjectPropertyInfo, 1);
> >> info->name = g_strdup(prop->name);
> >> info->type = g_strdup(prop->type);
> >> info->description = g_strdup(prop->description);
> >> info->default_value = qobject_ref(prop->defval);
> >>
> >> QAPI_LIST_PREPEND(prop_list, info);
> >> }
> >>
> >> object_unref(obj);
> >>
> >> Is there any excuse not to do it this way?
> >
> > Something would need to validate that instantiating a machine type
> > for help usage won't trip over any edge cases. Could be done with
> > unit tests.
>
> tests/qtest/device-introspect-test.c covers this for devices.
Ah, good, I was misled by its name into thinking it was only devices,
not machine types too.
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props
2026-07-08 12:53 ` Daniel P. Berrangé
@ 2026-07-08 12:57 ` Markus Armbruster
2026-07-08 13:27 ` Peter Maydell
0 siblings, 1 reply; 27+ messages in thread
From: Markus Armbruster @ 2026-07-08 12:57 UTC (permalink / raw)
To: Daniel P. Berrangé
Cc: Markus Armbruster, Peter Maydell, Mark Cave-Ayland, pbonzini,
richard.henderson, mst, mtosatti, qemu-devel
Daniel P. Berrangé <berrange@redhat.com> writes:
> On Wed, Jul 08, 2026 at 02:50:54PM +0200, Markus Armbruster wrote:
>> Daniel P. Berrangé <berrange@redhat.com> writes:
>>
>> > On Wed, Jul 08, 2026 at 01:21:49PM +0200, Markus Armbruster wrote:
>> >> Daniel P. Berrangé <berrange@redhat.com> writes:
>> >>
>> >> > On Wed, Jul 08, 2026 at 11:16:30AM +0100, Peter Maydell wrote:
>> >> >> On Fri, 3 Jul 2026 at 10:09, Mark Cave-Ayland
>> >> >> <mark.caveayland@nutanix.com> wrote:
>> >> >> >
>> >> >> > Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
>> >> >> > ---
>> >> >> > include/hw/i386/pc.h | 2 ++
>> >> >> > hw/i386/pc.c | 8 ++++++++
>> >> >> > hw/i386/pc_sysfw.c | 7 +------
>> >> >> > 3 files changed, 11 insertions(+), 6 deletions(-)
>> >> >> >
>> >> >> > diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
>> >> >> > index 309de2eda1..16cb0ec01f 100644
>> >> >> > --- a/include/hw/i386/pc.h
>> >> >> > +++ b/include/hw/i386/pc.h
>> >> >> > @@ -40,6 +40,8 @@ typedef struct PCMachineState {
>> >> >> >
>> >> >> > Object *alias_pcspk;
>> >> >> > Object *alias_rtc_time;
>> >> >> > + Object *alias_pflash0;
>> >> >> > + Object *alias_pflash1;
>> >> >> >
>> >> >> > /* Configuration options: */
>> >> >> > uint64_t max_ram_below_4g;
>> >> >> > diff --git a/hw/i386/pc.c b/hw/i386/pc.c
>> >> >> > index 13c9c1bfc8..11eef176f4 100644
>> >> >> > --- a/hw/i386/pc.c
>> >> >> > +++ b/hw/i386/pc.c
>> >> >> > @@ -1762,6 +1762,14 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
>> >> >> > offsetof(X86MachineState, acpi_dev),
>> >> >> > object_property_allow_set_link,
>> >> >> > OBJ_PROP_LINK_STRONG);
>> >> >> > + object_class_property_add_alias(oc, "pflash0",
>> >> >> > + offsetof(PCMachineState, alias_pflash0),
>> >> >> > + TYPE_PFLASH_CFI01,
>> >> >> > + "drive");
>> >> >> > + object_class_property_add_alias(oc, "pflash1",
>> >> >> > + offsetof(PCMachineState, alias_pflash1),
>> >> >> > + TYPE_PFLASH_CFI01,
>> >> >> > + "drive");
>> >> >>
>> >> >> Does making these class properties fix
>> >> >> https://gitlab.com/qemu-project/qemu/-/work_items/3254
>> >> >> (which is a report that "qemu-system-x86_64 -machine pc-q35,help"
>> >> >> doesn't list these properties) ?
>> >>
>> >> Not showing object properties is a bug.
>> >>
>> >> Cannot be fixed for object properties that are created outside the
>> >> object's instance_init().
>> >>
>> >> Now, object properties created in instance_init() should almost
>> >> certainly be class properties instead. Converting them all fixes the
>> >> fixable part of the bug:
>> >>
>> >> > Yes, it ought to, as that CLI logic iterates over class properties.
>> >>
>> >> One property conversion at a time.
>> >>
>> >> There's a quicker fix, though.
>> >>
>> >> -machine TYPE.help uses type_print_class_properties() to show
>> >> properties. Here's its loop:
>> >>
>> >> object_class_property_iter_init(&iter, klass);
>> >> while ((prop = object_property_iter_next(&iter))) {
>> >> if (!prop->set) {
>> >> continue;
>> >> }
>> >>
>> >> g_ptr_array_add(array,
>> >> object_property_help(prop->name, prop->type,
>> >> prop->defval, prop->description));
>> >> }
>> >>
>> >> -device TYPE,help uses qmp_device_list_properties() to show both.
>> >> Here's its loop:
>> >>
>> >> obj = object_new_with_class(klass);
>> >>
>> >> object_property_iter_init(&iter, obj);
>> >> while ((prop = object_property_iter_next(&iter))) {
>> >> ObjectPropertyInfo *info;
>> >>
>> >> [...]
>> >>
>> >> info = g_new0(ObjectPropertyInfo, 1);
>> >> info->name = g_strdup(prop->name);
>> >> info->type = g_strdup(prop->type);
>> >> info->description = g_strdup(prop->description);
>> >> info->default_value = qobject_ref(prop->defval);
>> >>
>> >> QAPI_LIST_PREPEND(prop_list, info);
>> >> }
>> >>
>> >> object_unref(obj);
>> >>
>> >> Is there any excuse not to do it this way?
>> >
>> > Something would need to validate that instantiating a machine type
>> > for help usage won't trip over any edge cases. Could be done with
>> > unit tests.
>>
>> tests/qtest/device-introspect-test.c covers this for devices.
>
> Ah, good, I was misled by its name into thinking it was only devices,
> not machine types too.
Misunderstanding: it does cover it for devices, and only for devices.
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props
2026-07-08 12:57 ` Markus Armbruster
@ 2026-07-08 13:27 ` Peter Maydell
2026-07-10 14:00 ` Markus Armbruster
0 siblings, 1 reply; 27+ messages in thread
From: Peter Maydell @ 2026-07-08 13:27 UTC (permalink / raw)
To: Markus Armbruster
Cc: Daniel P. Berrangé, Mark Cave-Ayland, pbonzini,
richard.henderson, mst, mtosatti, qemu-devel
On Wed, 8 Jul 2026 at 13:57, Markus Armbruster <armbru@redhat.com> wrote:
>
> Daniel P. Berrangé <berrange@redhat.com> writes:
>
> > On Wed, Jul 08, 2026 at 02:50:54PM +0200, Markus Armbruster wrote:
> >> > Something would need to validate that instantiating a machine type
> >> > for help usage won't trip over any edge cases. Could be done with
> >> > unit tests.
> >>
> >> tests/qtest/device-introspect-test.c covers this for devices.
> >
> > Ah, good, I was misled by its name into thinking it was only devices,
> > not machine types too.
>
> Misunderstanding: it does cover it for devices, and only for devices.
Does Marc-André's recent qom-tests test cover the machines? It
does an instantiate/get props/unref cycle for all non-abstract
QOM types, which ought to include the machines.
A while back I had a look at moving Machine to be a subclass
of Device, incidentally -- that would let us have machine
reset not be a weird special case, allow separating machine
init from realize, and make machines be more like SoC objects
(which they resemble a lot in being "creates, configures
and wires up a load of other devices"). I forget where I
got to in that, though.
-- PMM
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props
2026-07-08 13:27 ` Peter Maydell
@ 2026-07-10 14:00 ` Markus Armbruster
0 siblings, 0 replies; 27+ messages in thread
From: Markus Armbruster @ 2026-07-10 14:00 UTC (permalink / raw)
To: Peter Maydell
Cc: Daniel P. Berrangé, Mark Cave-Ayland, pbonzini,
richard.henderson, mst, mtosatti, qemu-devel
Peter Maydell <peter.maydell@linaro.org> writes:
> On Wed, 8 Jul 2026 at 13:57, Markus Armbruster <armbru@redhat.com> wrote:
>>
>> Daniel P. Berrangé <berrange@redhat.com> writes:
>>
>> > On Wed, Jul 08, 2026 at 02:50:54PM +0200, Markus Armbruster wrote:
>> >> > Something would need to validate that instantiating a machine type
>> >> > for help usage won't trip over any edge cases. Could be done with
>> >> > unit tests.
>> >>
>> >> tests/qtest/device-introspect-test.c covers this for devices.
>> >
>> > Ah, good, I was misled by its name into thinking it was only devices,
>> > not machine types too.
>>
>> Misunderstanding: it does cover it for devices, and only for devices.
>
> Does Marc-André's recent qom-tests test cover the machines? It
> does an instantiate/get props/unref cycle for all non-abstract
> QOM types, which ought to include the machines.
I guess you mean commit f741225073 (qtest: add "qom-tests" command,
2026-04-24). Looking at the code... yes, that should cover machines.
> A while back I had a look at moving Machine to be a subclass
> of Device, incidentally -- that would let us have machine
> reset not be a weird special case, allow separating machine
> init from realize, and make machines be more like SoC objects
> (which they resemble a lot in being "creates, configures
> and wires up a load of other devices").
Makes sense to me.
> I forget where I
> got to in that, though.
Been there, done that *sigh*.
^ permalink raw reply [flat|nested] 27+ messages in thread
end of thread, other threads:[~2026-07-10 14:01 UTC | newest]
Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-03 9:07 [PATCH 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
2026-07-03 9:07 ` [PATCH 1/9] qom/object.c: introduce object_alias_get_targetp() lookup function Mark Cave-Ayland
2026-07-03 9:07 ` [PATCH 2/9] qom/object.c: introduce object_class_property_add_alias() Mark Cave-Ayland
2026-07-03 9:07 ` [PATCH 3/9] qom/object.c: introduce object_property_set_alias() function Mark Cave-Ayland
2026-07-03 9:07 ` [PATCH 4/9] hw/i386/pc.c: convert pcspk-audiodev object prop to a class prop Mark Cave-Ayland
2026-07-03 9:07 ` [PATCH 5/9] hw/rtc/mc146818rtc.c: convert date from object prop to " Mark Cave-Ayland
2026-07-06 7:15 ` Philippe Mathieu-Daudé
2026-07-03 9:07 ` [PATCH 6/9] hw/i386/pc.c: convert rtc-time object prop to a " Mark Cave-Ayland
2026-07-07 16:58 ` Daniel P. Berrangé
2026-07-03 9:08 ` [PATCH 7/9] hw/i386/pc.c: convert PC_MACHINE_ACPI_DEVICE_PROP from object prop to " Mark Cave-Ayland
2026-07-07 16:48 ` Daniel P. Berrangé
2026-07-03 9:08 ` [PATCH 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props Mark Cave-Ayland
2026-07-07 16:58 ` Daniel P. Berrangé
2026-07-08 9:40 ` Mark Cave-Ayland
2026-07-08 9:56 ` Daniel P. Berrangé
2026-07-08 10:16 ` Peter Maydell
2026-07-08 10:24 ` Daniel P. Berrangé
2026-07-08 11:21 ` Markus Armbruster
2026-07-08 11:28 ` Daniel P. Berrangé
2026-07-08 12:50 ` Markus Armbruster
2026-07-08 12:53 ` Daniel P. Berrangé
2026-07-08 12:57 ` Markus Armbruster
2026-07-08 13:27 ` Peter Maydell
2026-07-10 14:00 ` Markus Armbruster
2026-07-08 10:28 ` Mark Cave-Ayland
2026-07-03 9:08 ` [PATCH 9/9] hw/i386/sgx-epc.c: convert SGX_EPC_SIZE_PROP object prop to class prop Mark Cave-Ayland
2026-07-07 16:54 ` Daniel P. Berrangé
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.