* [PATCH v4 1/9] qom/object.c: improve duplicate class property detection assert()
2026-09-21 11:35 [PATCH v4 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
@ 2026-09-21 11:35 ` Mark Cave-Ayland
2026-09-21 12:14 ` Daniel P. Berrangé
2026-09-21 11:35 ` [PATCH v4 2/9] qom/object.c: introduce object_alias_get_targetp() lookup function Mark Cave-Ayland
` (7 subsequent siblings)
8 siblings, 1 reply; 14+ messages in thread
From: Mark Cave-Ayland @ 2026-09-21 11:35 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, marcandre.lureau,
armbru, qemu-devel
Introduce an intermediary boolean prop_already_exists into object_class_property_add()
so that it is obvious to a developer if they inadvertantly introduce a duplicate
class property:
qemu-system-x86_64: ../qom/object.c:1417: object_class_property_add:
Assertion `!prop_already_exists' failed.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
qom/object.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/qom/object.c b/qom/object.c
index 41b1ec81d4..914d1228ca 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1410,9 +1410,10 @@ object_class_property_add(ObjectClass *klass,
ObjectPropertyRelease *release,
void *opaque)
{
+ bool prop_already_exists = object_class_property_find(klass, name);
ObjectProperty *prop;
- assert(!object_class_property_find(klass, name));
+ assert(!prop_already_exists);
prop = g_malloc0(sizeof(*prop));
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread* Re: [PATCH v4 1/9] qom/object.c: improve duplicate class property detection assert()
2026-09-21 11:35 ` [PATCH v4 1/9] qom/object.c: improve duplicate class property detection assert() Mark Cave-Ayland
@ 2026-09-21 12:14 ` Daniel P. Berrangé
0 siblings, 0 replies; 14+ messages in thread
From: Daniel P. Berrangé @ 2026-09-21 12:14 UTC (permalink / raw)
To: Mark Cave-Ayland
Cc: pbonzini, richard.henderson, mst, mtosatti, marcandre.lureau,
armbru, qemu-devel
On Mon, Sep 21, 2026 at 12:35:07PM +0100, Mark Cave-Ayland wrote:
> Introduce an intermediary boolean prop_already_exists into object_class_property_add()
> so that it is obvious to a developer if they inadvertantly introduce a duplicate
> class property:
>
> qemu-system-x86_64: ../qom/object.c:1417: object_class_property_add:
> Assertion `!prop_already_exists' failed.
>
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> qom/object.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
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] 14+ messages in thread
* [PATCH v4 2/9] qom/object.c: introduce object_alias_get_targetp() lookup function
2026-09-21 11:35 [PATCH v4 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
2026-09-21 11:35 ` [PATCH v4 1/9] qom/object.c: improve duplicate class property detection assert() Mark Cave-Ayland
@ 2026-09-21 11:35 ` Mark Cave-Ayland
2026-09-21 12:17 ` Daniel P. Berrangé
2026-09-21 11:35 ` [PATCH v4 3/9] qom/object.c: introduce object_class_property_add_alias() Mark Cave-Ayland
` (6 subsequent siblings)
8 siblings, 1 reply; 14+ messages in thread
From: Mark Cave-Ayland @ 2026-09-21 11:35 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, marcandre.lureau,
armbru, 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 914d1228ca..eb5f74fc74 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -3056,13 +3056,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);
}
@@ -3070,9 +3077,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);
}
@@ -3080,8 +3088,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] 14+ messages in thread* Re: [PATCH v4 2/9] qom/object.c: introduce object_alias_get_targetp() lookup function
2026-09-21 11:35 ` [PATCH v4 2/9] qom/object.c: introduce object_alias_get_targetp() lookup function Mark Cave-Ayland
@ 2026-09-21 12:17 ` Daniel P. Berrangé
0 siblings, 0 replies; 14+ messages in thread
From: Daniel P. Berrangé @ 2026-09-21 12:17 UTC (permalink / raw)
To: Mark Cave-Ayland
Cc: pbonzini, richard.henderson, mst, mtosatti, marcandre.lureau,
armbru, qemu-devel
On Mon, Sep 21, 2026 at 12:35:08PM +0100, Mark Cave-Ayland wrote:
> 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(-)
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] 14+ messages in thread
* [PATCH v4 3/9] qom/object.c: introduce object_class_property_add_alias()
2026-09-21 11:35 [PATCH v4 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
2026-09-21 11:35 ` [PATCH v4 1/9] qom/object.c: improve duplicate class property detection assert() Mark Cave-Ayland
2026-09-21 11:35 ` [PATCH v4 2/9] qom/object.c: introduce object_alias_get_targetp() lookup function Mark Cave-Ayland
@ 2026-09-21 11:35 ` Mark Cave-Ayland
2026-09-21 12:21 ` Daniel P. Berrangé
2026-09-21 11:35 ` [PATCH v4 4/9] qom/object.c: introduce object_property_set_alias() function Mark Cave-Ayland
` (5 subsequent siblings)
8 siblings, 1 reply; 14+ messages in thread
From: Mark Cave-Ayland @ 2026-09-21 11:35 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, marcandre.lureau,
armbru, 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() function to use the null visitor if the alias target has
not been set, property_set_alias() to return an error, 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 | 25 ++++++++++++
qom/object.c | 97 ++++++++++++++++++++++++++++++++++++++------
2 files changed, 110 insertions(+), 12 deletions(-)
diff --git a/include/qom/object.h b/include/qom/object.h
index 3285218664..73d72619b8 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -2279,6 +2279,11 @@ ObjectProperty *object_class_static_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
@@ -2299,6 +2304,26 @@ ObjectProperty *object_class_static_property_add_uint64_ptr(ObjectClass *klass,
ObjectProperty *object_property_add_alias(Object *obj, const char *name,
Object *target_obj, const char *target_name);
+/**
+ * object_class_property_add_alias:
+ * @klass: the object class to add a property to
+ * @name: the name of the property
+ * @offset: the offset from the object instance where the object alias is
+ * stored
+ * @target_type: QOM type we expect the alias to resolve to
+ * @target_name: the name of the property on the forwarded object
+ *
+ * Add an alias for a property on an object. This function will add a property
+ * of the same type as the forwarded property.
+ *
+ * Returns: The newly added property on success, or %NULL on failure.
+ */
+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 eb5f74fc74..e4e8dc6886 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -35,6 +35,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"
@@ -3052,14 +3053,22 @@ object_class_static_property_add_uint64_ptr(ObjectClass *klass,
}
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,
@@ -3067,10 +3076,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,
@@ -3078,10 +3095,15 @@ 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 {
+ error_setg(errp, "unable to resolve alias property target");
+ }
}
static Object *property_resolve_alias(Object *obj, void *opaque,
@@ -3090,15 +3112,21 @@ 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);
+ }
}
ObjectProperty *
@@ -3123,6 +3151,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,
@@ -3139,6 +3168,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] 14+ messages in thread* Re: [PATCH v4 3/9] qom/object.c: introduce object_class_property_add_alias()
2026-09-21 11:35 ` [PATCH v4 3/9] qom/object.c: introduce object_class_property_add_alias() Mark Cave-Ayland
@ 2026-09-21 12:21 ` Daniel P. Berrangé
0 siblings, 0 replies; 14+ messages in thread
From: Daniel P. Berrangé @ 2026-09-21 12:21 UTC (permalink / raw)
To: Mark Cave-Ayland
Cc: pbonzini, richard.henderson, mst, mtosatti, marcandre.lureau,
armbru, qemu-devel
On Mon, Sep 21, 2026 at 12:35:09PM +0100, Mark Cave-Ayland wrote:
> 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() function to use the null visitor if the alias target has
> not been set, property_set_alias() to return an error, 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 | 25 ++++++++++++
> qom/object.c | 97 ++++++++++++++++++++++++++++++++++++++------
> 2 files changed, 110 insertions(+), 12 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] 14+ messages in thread
* [PATCH v4 4/9] qom/object.c: introduce object_property_set_alias() function
2026-09-21 11:35 [PATCH v4 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
` (2 preceding siblings ...)
2026-09-21 11:35 ` [PATCH v4 3/9] qom/object.c: introduce object_class_property_add_alias() Mark Cave-Ayland
@ 2026-09-21 11:35 ` Mark Cave-Ayland
2026-09-21 12:28 ` Daniel P. Berrangé
2026-09-21 11:35 ` [PATCH v4 5/9] hw/i386/pc.c: convert pcspk-audiodev object prop to a class prop Mark Cave-Ayland
` (4 subsequent siblings)
8 siblings, 1 reply; 14+ messages in thread
From: Mark Cave-Ayland @ 2026-09-21 11:35 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, marcandre.lureau,
armbru, 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.
Update the existing property_release_alias() function to reflect the documented
refcount behaviour.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
include/qom/object.h | 17 +++++++++++++++++
qom/object.c | 41 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 58 insertions(+)
diff --git a/include/qom/object.h b/include/qom/object.h
index 73d72619b8..4c0645817a 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -2324,6 +2324,23 @@ 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.
+ *
+ * This function ensures that @target_obj stays alive as long as @obj exists
+ * by taking a reference if @target_obj is not a child object or an alias on
+ * the same object.
+ */
+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 e4e8dc6886..96498f3d00 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -3126,6 +3126,18 @@ static void property_release_alias(Object *obj, const char *name, void *opaque)
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) {
+ ObjectProperty *target_prop = object_property_find_err(*target_obj,
+ prop->target_name,
+ &error_abort);
+ if (*target_obj != obj &&
+ !object_property_is_child(target_prop)) {
+ object_unref(*target_obj);
+ }
+ }
}
}
@@ -3212,6 +3224,35 @@ 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, *target_prop;
+ 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) {
+ target_prop = object_property_find_err(*target_objp, prop->target_name,
+ &error_abort);
+ if (*target_objp != obj && !object_property_is_child(target_prop)) {
+ object_unref(*target_objp);
+ }
+ }
+ *target_objp = target_obj;
+ if (*target_objp) {
+ target_prop = object_property_find_err(*target_objp, prop->target_name,
+ &error_abort);
+ if (*target_objp != obj && !object_property_is_child(target_prop)) {
+ 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] 14+ messages in thread* Re: [PATCH v4 4/9] qom/object.c: introduce object_property_set_alias() function
2026-09-21 11:35 ` [PATCH v4 4/9] qom/object.c: introduce object_property_set_alias() function Mark Cave-Ayland
@ 2026-09-21 12:28 ` Daniel P. Berrangé
0 siblings, 0 replies; 14+ messages in thread
From: Daniel P. Berrangé @ 2026-09-21 12:28 UTC (permalink / raw)
To: Mark Cave-Ayland
Cc: pbonzini, richard.henderson, mst, mtosatti, marcandre.lureau,
armbru, qemu-devel
On Mon, Sep 21, 2026 at 12:35:10PM +0100, Mark Cave-Ayland wrote:
> 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.
>
> Update the existing property_release_alias() function to reflect the documented
> refcount behaviour.
>
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> include/qom/object.h | 17 +++++++++++++++++
> qom/object.c | 41 +++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 58 insertions(+)
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] 14+ messages in thread
* [PATCH v4 5/9] hw/i386/pc.c: convert pcspk-audiodev object prop to a class prop
2026-09-21 11:35 [PATCH v4 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
` (3 preceding siblings ...)
2026-09-21 11:35 ` [PATCH v4 4/9] qom/object.c: introduce object_property_set_alias() function Mark Cave-Ayland
@ 2026-09-21 11:35 ` Mark Cave-Ayland
2026-09-21 11:35 ` [PATCH v4 6/9] hw/i386/pc.c: convert rtc-time " Mark Cave-Ayland
` (3 subsequent siblings)
8 siblings, 0 replies; 14+ messages in thread
From: Mark Cave-Ayland @ 2026-09-21 11:35 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, marcandre.lureau,
armbru, qemu-devel
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.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 d5dc79df17..2f1603e104 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 9006e7c29e..e2ee1bd88d 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1643,8 +1643,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);
}
@@ -1788,7 +1788,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] 14+ messages in thread* [PATCH v4 6/9] hw/i386/pc.c: convert rtc-time object prop to a class prop
2026-09-21 11:35 [PATCH v4 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
` (4 preceding siblings ...)
2026-09-21 11:35 ` [PATCH v4 5/9] hw/i386/pc.c: convert pcspk-audiodev object prop to a class prop Mark Cave-Ayland
@ 2026-09-21 11:35 ` Mark Cave-Ayland
2026-09-21 11:35 ` [PATCH v4 7/9] hw/i386/pc.c: convert PC_MACHINE_ACPI_DEVICE_PROP from object prop to " Mark Cave-Ayland
` (2 subsequent siblings)
8 siblings, 0 replies; 14+ messages in thread
From: Mark Cave-Ayland @ 2026-09-21 11:35 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, marcandre.lureau,
armbru, qemu-devel
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.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 2f1603e104..cbe88a1788 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 e2ee1bd88d..70677786bf 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1097,8 +1097,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) {
@@ -1792,6 +1791,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] 14+ messages in thread* [PATCH v4 7/9] hw/i386/pc.c: convert PC_MACHINE_ACPI_DEVICE_PROP from object prop to class prop
2026-09-21 11:35 [PATCH v4 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
` (5 preceding siblings ...)
2026-09-21 11:35 ` [PATCH v4 6/9] hw/i386/pc.c: convert rtc-time " Mark Cave-Ayland
@ 2026-09-21 11:35 ` Mark Cave-Ayland
2026-09-21 11:35 ` [PATCH v4 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props Mark Cave-Ayland
2026-09-21 11:35 ` [PATCH v4 9/9] hw/i386/sgx-epc.c: convert SGX_EPC_SIZE_PROP object prop to class prop Mark Cave-Ayland
8 siblings, 0 replies; 14+ messages in thread
From: Mark Cave-Ayland @ 2026-09-21 11:35 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, marcandre.lureau,
armbru, qemu-devel
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.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 70677786bf..37d199f2dc 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1795,6 +1795,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 a929cc4dec..63c4667ea3 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 94cd71124b..c3ce9c5649 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] 14+ messages in thread* [PATCH v4 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props
2026-09-21 11:35 [PATCH v4 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
` (6 preceding siblings ...)
2026-09-21 11:35 ` [PATCH v4 7/9] hw/i386/pc.c: convert PC_MACHINE_ACPI_DEVICE_PROP from object prop to " Mark Cave-Ayland
@ 2026-09-21 11:35 ` Mark Cave-Ayland
2026-09-21 11:35 ` [PATCH v4 9/9] hw/i386/sgx-epc.c: convert SGX_EPC_SIZE_PROP object prop to class prop Mark Cave-Ayland
8 siblings, 0 replies; 14+ messages in thread
From: Mark Cave-Ayland @ 2026-09-21 11:35 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, marcandre.lureau,
armbru, qemu-devel
Now that the pflash0 and pflash1 machine properties are class properties, if
they are unspecified then QOM returns an empty string as opposed to returning
a property not found error.
Before this patch:
$ ./build/qemu-system-x86_64 -M q35 -monitor stdio
QEMU 11.1.50 monitor - type 'help' for more information
(qemu) qom-get /machine pflash0
Error: Property 'pc-q35-11.1-machine.pflash0' not found
After this patch:
$ ./build/qemu-system-x86_64 -M q35 -monitor stdio
QEMU 11.1.50 monitor - type 'help' for more information
(qemu) qom-get /machine pflash0
""
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.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 cbe88a1788..8edec62a1a 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 37d199f2dc..b649f184de 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1800,6 +1800,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] 14+ messages in thread* [PATCH v4 9/9] hw/i386/sgx-epc.c: convert SGX_EPC_SIZE_PROP object prop to class prop
2026-09-21 11:35 [PATCH v4 0/9] hw/i386: convert object props to class props Mark Cave-Ayland
` (7 preceding siblings ...)
2026-09-21 11:35 ` [PATCH v4 8/9] hw/i386/pc_sysfw.c: convert pflash0 and pflash1 object props to class props Mark Cave-Ayland
@ 2026-09-21 11:35 ` Mark Cave-Ayland
8 siblings, 0 replies; 14+ messages in thread
From: Mark Cave-Ayland @ 2026-09-21 11:35 UTC (permalink / raw)
To: pbonzini, richard.henderson, mst, mtosatti, marcandre.lureau,
armbru, qemu-devel
Remove sgx_epc_init() since it is no longer required.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.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] 14+ messages in thread