* [PATCH v8 01/56] qapi/schema: Rename .lookup_entity() and tighten return type
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 02/56] qapi: Ease access to introspection names Markus Armbruster
` (54 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
Commit 060b5a9323 (qapi: Dumb down QAPISchema.lookup_entity())
accidentally relaxed QAPISchema.lookup_entity()'s return type to
QAPISchemaEntity. Tighten it back to QAPISchemaDefinition, and rename
the method to .lookup_defn().
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
docs/sphinx/qapidoc.py | 2 +-
scripts/qapi/schema.py | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/docs/sphinx/qapidoc.py b/docs/sphinx/qapidoc.py
index 54a32e45f7..31d09ed634 100644
--- a/docs/sphinx/qapidoc.py
+++ b/docs/sphinx/qapidoc.py
@@ -512,7 +512,7 @@ def transmogrify(self, schema: QAPISchema) -> nodes.Element:
modules.add(module_source)
if doc.symbol:
- ent = schema.lookup_entity(doc.symbol)
+ ent = schema.lookup_defn(doc.symbol)
assert isinstance(ent, QAPISchemaDefinition)
vis.visit_entity(ent)
else:
diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py
index 8d88b40de2..9c9e257a8f 100644
--- a/scripts/qapi/schema.py
+++ b/scripts/qapi/schema.py
@@ -1184,11 +1184,11 @@ def _def_definition(self, defn: QAPISchemaDefinition) -> None:
defn.info, "%s is already defined" % other_defn.describe())
self._entity_dict[defn.name] = defn
- def lookup_entity(self, name: str) -> Optional[QAPISchemaEntity]:
+ def lookup_defn(self, name: str) -> Optional[QAPISchemaDefinition]:
return self._entity_dict.get(name)
def lookup_type(self, name: str) -> Optional[QAPISchemaType]:
- typ = self.lookup_entity(name)
+ typ = self.lookup_defn(name)
if isinstance(typ, QAPISchemaType):
return typ
return None
@@ -1324,7 +1324,7 @@ def _make_implicit_object_type(
return None
# See also QAPISchemaObjectTypeMember.describe()
name = 'q_obj_%s-%s' % (name, role)
- typ = self.lookup_entity(name)
+ typ = self.lookup_defn(name)
if typ:
assert isinstance(typ, QAPISchemaObjectType)
# The implicit object type has multiple users. This can
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 02/56] qapi: Ease access to introspection names
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 01/56] qapi/schema: Rename .lookup_entity() and tighten return type Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 03/56] qapi/introspect: Simplify masked name comment emission slighly Markus Armbruster
` (53 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
query-qmp-schema masks type names, because they are not part of the
external interface. Marc-André Lureau would like to also use them
with qom-list & friends. Trouble is the masked names are buried deep
in QAPISchemaGenIntrospectVisitor. Lift them into schema.py: new
QAPISchemaDefinition method introspection_name() returns a
definition's name for use in introspection.
This changes the masked names, which is fine.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
docs/devel/qapi-code-gen.rst | 24 ++++++++++----------
scripts/qapi/introspect.py | 23 ++++---------------
scripts/qapi/schema.py | 43 ++++++++++++++++++++++++++++++++++++
3 files changed, 59 insertions(+), 31 deletions(-)
diff --git a/docs/devel/qapi-code-gen.rst b/docs/devel/qapi-code-gen.rst
index b1cc5b5f0d..9bd5a3af28 100644
--- a/docs/devel/qapi-code-gen.rst
+++ b/docs/devel/qapi-code-gen.rst
@@ -2012,33 +2012,33 @@ Example::
const QLitObject example_qmp_schema_qlit = QLIT_QLIST(((QLitObject[]) {
QLIT_QDICT(((QLitDictEntry[]) {
- { "arg-type", QLIT_QSTR("0"), },
+ { "arg-type", QLIT_QSTR("34"), },
{ "meta-type", QLIT_QSTR("command"), },
{ "name", QLIT_QSTR("my-command"), },
- { "ret-type", QLIT_QSTR("1"), },
+ { "ret-type", QLIT_QSTR("32"), },
{}
})),
QLIT_QDICT(((QLitDictEntry[]) {
- { "arg-type", QLIT_QSTR("2"), },
+ { "arg-type", QLIT_QSTR("30"), },
{ "meta-type", QLIT_QSTR("event"), },
{ "name", QLIT_QSTR("MY_EVENT"), },
{}
})),
- /* "0" = q_obj_my-command-arg */
+ /* "34" = q_obj_my-command-arg */
QLIT_QDICT(((QLitDictEntry[]) {
{ "members", QLIT_QLIST(((QLitObject[]) {
QLIT_QDICT(((QLitDictEntry[]) {
{ "name", QLIT_QSTR("arg1"), },
- { "type", QLIT_QSTR("[1]"), },
+ { "type", QLIT_QSTR("[32]"), },
{}
})),
{}
})), },
{ "meta-type", QLIT_QSTR("object"), },
- { "name", QLIT_QSTR("0"), },
+ { "name", QLIT_QSTR("34"), },
{}
})),
- /* "1" = UserDefOne */
+ /* "32" = UserDefOne */
QLIT_QDICT(((QLitDictEntry[]) {
{ "members", QLIT_QLIST(((QLitObject[]) {
QLIT_QDICT(((QLitDictEntry[]) {
@@ -2061,22 +2061,22 @@ Example::
{}
})), },
{ "meta-type", QLIT_QSTR("object"), },
- { "name", QLIT_QSTR("1"), },
+ { "name", QLIT_QSTR("32"), },
{}
})),
- /* "2" = q_empty */
+ /* "30" = q_empty */
QLIT_QDICT(((QLitDictEntry[]) {
{ "members", QLIT_QLIST(((QLitObject[]) {
{}
})), },
{ "meta-type", QLIT_QSTR("object"), },
- { "name", QLIT_QSTR("2"), },
+ { "name", QLIT_QSTR("30"), },
{}
})),
QLIT_QDICT(((QLitDictEntry[]) {
- { "element-type", QLIT_QSTR("1"), },
+ { "element-type", QLIT_QSTR("32"), },
{ "meta-type", QLIT_QSTR("array"), },
- { "name", QLIT_QSTR("[1]"), },
+ { "name", QLIT_QSTR("[32]"), },
{}
})),
QLIT_QDICT(((QLitDictEntry[]) {
diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py
index 7e28de2279..644461560c 100644
--- a/scripts/qapi/introspect.py
+++ b/scripts/qapi/introspect.py
@@ -30,7 +30,6 @@
QAPISchemaAlternatives,
QAPISchemaArrayType,
QAPISchemaBranches,
- QAPISchemaBuiltinType,
QAPISchemaEntity,
QAPISchemaEnumMember,
QAPISchemaFeature,
@@ -177,7 +176,6 @@ def __init__(self, prefix: str, unmask: bool):
self._schema: Optional[QAPISchema] = None
self._trees: List[Annotated[SchemaInfo]] = []
self._used_types: List[QAPISchemaType] = []
- self._name_map: Dict[str, str] = {}
self._genc.add(mcgen('''
#include "qemu/osdep.h"
#include "%(prefix)sqapi-introspect.h"
@@ -208,18 +206,14 @@ def visit_end(self) -> None:
self._schema = None
self._trees = []
self._used_types = []
- self._name_map = {}
def visit_needed(self, entity: QAPISchemaEntity) -> bool:
# Ignore types on first pass; visit_end() will pick up used types
return not isinstance(entity, QAPISchemaType)
def _name(self, name: str) -> str:
- if self._unmask:
- return name
- if name not in self._name_map:
- self._name_map[name] = '%d' % len(self._name_map)
- return self._name_map[name]
+ assert self._schema
+ return self._schema.definition_introspection_name(name, self._unmask)
def _use_type(self, typ: QAPISchemaType) -> str:
assert self._schema is not None
@@ -237,13 +231,6 @@ def _use_type(self, typ: QAPISchemaType) -> str:
# Add type to work queue if new
if typ not in self._used_types:
self._used_types.append(typ)
- # Clients should examine commands and events, not types. Hide
- # type names as integers to reduce the temptation. Also, it
- # saves a few characters on the wire.
- if isinstance(typ, QAPISchemaBuiltinType):
- return typ.name
- if isinstance(typ, QAPISchemaArrayType):
- return '[' + self._use_type(typ.element_type) + ']'
return self._name(typ.name)
@staticmethod
@@ -271,8 +258,7 @@ def _gen_tree(self, name: str, mtype: str, obj: Dict[str, object],
# Output a comment to make it easy to map masked names
# back to the source when reading the generated output.
comment = f'"{self._name(name)}" = {name}'
- name = self._name(name)
- obj['name'] = name
+ obj['name'] = self._name(name)
obj['meta-type'] = mtype
if features:
obj['features'] = self._gen_features(features)
@@ -327,8 +313,7 @@ def visit_array_type(self, name: str, info: Optional[QAPISourceInfo],
ifcond: QAPISchemaIfCond,
element_type: QAPISchemaType) -> None:
element = self._use_type(element_type)
- self._gen_tree('[' + element + ']', 'array', {'element-type': element},
- ifcond)
+ self._gen_tree(name, 'array', {'element-type': element}, ifcond)
def visit_object_type_flat(self, name: str, info: Optional[QAPISourceInfo],
ifcond: QAPISchemaIfCond,
diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py
index 9c9e257a8f..11f3accec8 100644
--- a/scripts/qapi/schema.py
+++ b/scripts/qapi/schema.py
@@ -136,6 +136,13 @@ def __repr__(self) -> str:
def c_name(self) -> str:
return c_name(self.name)
+ def set_ordinal(self, ordinal: int) -> None:
+ pass
+
+ # pylint: disable=unused-argument
+ def introspection_name(self, unmask: bool) -> str:
+ return self.name
+
def check(self, schema: QAPISchema) -> None:
assert not self._checked
super().check(schema)
@@ -323,6 +330,17 @@ def visit(self, visitor: QAPISchemaVisitor) -> None:
class QAPISchemaType(QAPISchemaDefinition, ABC):
+ def __init__(
+ self,
+ name: str,
+ info: Optional[QAPISourceInfo],
+ doc: Optional[QAPIDoc],
+ ifcond: Optional[QAPISchemaIfCond] = None,
+ features: Optional[List[QAPISchemaFeature]] = None,
+ ):
+ super().__init__(name, info, doc, ifcond, features)
+ self._masked_name: Optional[str] = None
+
# Return the C type for common use.
# For the types we commonly box, this is a pointer type.
@abstractmethod
@@ -363,6 +381,17 @@ def need_has_if_optional(self) -> bool:
# Except for arrays; see QAPISchemaArrayType.need_has_if_optional().
return not self.c_type().endswith(POINTER_SUFFIX)
+ def set_ordinal(self, ordinal: int) -> None:
+ assert not self._masked_name
+ self._masked_name = str(ordinal)
+
+ def introspection_name(self, unmask: bool) -> str:
+ # Type names are not part of the external interface. Hide
+ # them in introspection. Also saves a few characters on the
+ # wire.
+ assert self._masked_name
+ return self.name if unmask else self._masked_name
+
def check(self, schema: QAPISchema) -> None:
super().check(schema)
for feat in self.features:
@@ -402,6 +431,11 @@ def json_type(self) -> str:
def doc_type(self) -> str:
return self.json_type()
+ def introspection_name(self, unmask: bool):
+ if self.json_type() == 'int':
+ return 'int'
+ return self.name
+
def visit(self, visitor: QAPISchemaVisitor) -> None:
super().visit(visitor)
visitor.visit_builtin_type(self.name, self.info, self.json_type())
@@ -503,6 +537,9 @@ def doc_type(self) -> Optional[str]:
return None
return 'array of ' + elt_doc_type
+ def introspection_name(self, unmask: bool):
+ return '[' + self.element_type.introspection_name(unmask) + ']'
+
def visit(self, visitor: QAPISchemaVisitor) -> None:
super().visit(visitor)
visitor.visit_array_type(self.name, self.info, self.ifcond,
@@ -1182,6 +1219,7 @@ def _def_definition(self, defn: QAPISchemaDefinition) -> None:
"'%s' is already defined\n%s" % (defn.name, where))
raise QAPISemError(
defn.info, "%s is already defined" % other_defn.describe())
+ defn.set_ordinal(len(self._entity_dict))
self._entity_dict[defn.name] = defn
def lookup_defn(self, name: str) -> Optional[QAPISchemaDefinition]:
@@ -1208,6 +1246,11 @@ def resolve_type(
info, "%s uses unknown type '%s'" % (what, name))
return typ
+ def definition_introspection_name(self, name: str, unmask: bool) -> str:
+ defn = self.lookup_defn(name)
+ assert defn
+ return defn.introspection_name(unmask)
+
def _module_name(self, fname: str) -> str:
if QAPISchemaModule.is_system_module(fname):
return fname
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 03/56] qapi/introspect: Simplify masked name comment emission slighly
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 01/56] qapi/schema: Rename .lookup_entity() and tighten return type Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 02/56] qapi: Ease access to introspection names Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 04/56] qapi/introspect: Don't elide types Markus Armbruster
` (52 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
Instead of emitting the comment for certain meta-types, simply emit it
when introspection name and name differ.
This additionally emits it for arrays, which is fine.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
docs/devel/qapi-code-gen.rst | 1 +
scripts/qapi/introspect.py | 12 ++++++------
2 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/docs/devel/qapi-code-gen.rst b/docs/devel/qapi-code-gen.rst
index 9bd5a3af28..1e89cbbcd7 100644
--- a/docs/devel/qapi-code-gen.rst
+++ b/docs/devel/qapi-code-gen.rst
@@ -2073,6 +2073,7 @@ Example::
{ "name", QLIT_QSTR("30"), },
{}
})),
+ /* "[32]" = UserDefOneList */
QLIT_QDICT(((QLitDictEntry[]) {
{ "element-type", QLIT_QSTR("32"), },
{ "meta-type", QLIT_QSTR("array"), },
diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py
index 644461560c..49d1ed2897 100644
--- a/scripts/qapi/introspect.py
+++ b/scripts/qapi/introspect.py
@@ -253,12 +253,12 @@ def _gen_tree(self, name: str, mtype: str, obj: Dict[str, object],
Will be omitted from the output if empty.
"""
comment: Optional[str] = None
- if mtype not in ('command', 'event', 'builtin', 'array'):
- if not self._unmask:
- # Output a comment to make it easy to map masked names
- # back to the source when reading the generated output.
- comment = f'"{self._name(name)}" = {name}'
- obj['name'] = self._name(name)
+ introspection_name = self._name(name)
+ if introspection_name != name:
+ # Output a comment to make it easy to map masked names
+ # back to the source when reading the generated output.
+ comment = f'"{introspection_name}" = {name}'
+ obj['name'] = introspection_name
obj['meta-type'] = mtype
if features:
obj['features'] = self._gen_features(features)
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 04/56] qapi/introspect: Don't elide types
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (2 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 03/56] qapi/introspect: Simplify masked name comment emission slighly Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 05/56] qapi: QAPISchemaVisitor.visit_needed() is now unused, drop Markus Armbruster
` (51 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
query-qmp-schema elides types not reachable from commands and events.
It currently emits 1251 out of 1385 definitions, and elides 134 types.
Whether that's worthwhile is debatable.
Marc-André Lureau would like to make QOM introspection (qom-list &
friends) refer to QAPI types. We additionally need types reachable
from QOM properties.
Unfortunately, the QAPI generator knows nothing about QOM properties.
We could manually mark the QAPI types to elide, or the QAPI types not
to elide even though they are not reachable from commands and events.
Feels very much not worthwhile to me.
We could conservatively approximate "reachable from QOM properties" by
"available for use with QOM properties". These are the built-in and
user-defined types, and their arrays. With that, we'd elide just 38
out of 1385 definitions. Too few to be worthwhile.
Simply emit everything.
Output of query-qmp-schema grows from 247KiB to 274KiB for me.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
docs/devel/qapi-code-gen.rst | 67 ++++++++++++++----------------------
scripts/qapi/introspect.py | 31 +++--------------
2 files changed, 30 insertions(+), 68 deletions(-)
diff --git a/docs/devel/qapi-code-gen.rst b/docs/devel/qapi-code-gen.rst
index 1e89cbbcd7..3c21dda91b 100644
--- a/docs/devel/qapi-code-gen.rst
+++ b/docs/devel/qapi-code-gen.rst
@@ -1250,8 +1250,6 @@ JSON array of strings.
To examine a type, start with a command or event using it, then follow
references by name.
-QAPI schema definitions not reachable that way are omitted.
-
The SchemaInfo for a command has meta-type "command", and variant
members "arg-type", "ret-type" and "allow-oob". On the wire, the
"arguments" member of a client's "execute" command must conform to the
@@ -2012,32 +2010,19 @@ Example::
const QLitObject example_qmp_schema_qlit = QLIT_QLIST(((QLitObject[]) {
QLIT_QDICT(((QLitDictEntry[]) {
- { "arg-type", QLIT_QSTR("34"), },
- { "meta-type", QLIT_QSTR("command"), },
- { "name", QLIT_QSTR("my-command"), },
- { "ret-type", QLIT_QSTR("32"), },
+ { "json-type", QLIT_QSTR("string"), },
+ { "meta-type", QLIT_QSTR("builtin"), },
+ { "name", QLIT_QSTR("str"), },
{}
})),
+ /* "[str]" = strList */
QLIT_QDICT(((QLitDictEntry[]) {
- { "arg-type", QLIT_QSTR("30"), },
- { "meta-type", QLIT_QSTR("event"), },
- { "name", QLIT_QSTR("MY_EVENT"), },
- {}
- })),
- /* "34" = q_obj_my-command-arg */
- QLIT_QDICT(((QLitDictEntry[]) {
- { "members", QLIT_QLIST(((QLitObject[]) {
- QLIT_QDICT(((QLitDictEntry[]) {
- { "name", QLIT_QSTR("arg1"), },
- { "type", QLIT_QSTR("[32]"), },
- {}
- })),
- {}
- })), },
- { "meta-type", QLIT_QSTR("object"), },
- { "name", QLIT_QSTR("34"), },
+ { "element-type", QLIT_QSTR("str"), },
+ { "meta-type", QLIT_QSTR("array"), },
+ { "name", QLIT_QSTR("[str]"), },
{}
})),
+ [Remainder of built-in types omitted...]
/* "32" = UserDefOne */
QLIT_QDICT(((QLitDictEntry[]) {
{ "members", QLIT_QLIST(((QLitObject[]) {
@@ -2064,15 +2049,6 @@ Example::
{ "name", QLIT_QSTR("32"), },
{}
})),
- /* "30" = q_empty */
- QLIT_QDICT(((QLitDictEntry[]) {
- { "members", QLIT_QLIST(((QLitObject[]) {
- {}
- })), },
- { "meta-type", QLIT_QSTR("object"), },
- { "name", QLIT_QSTR("30"), },
- {}
- })),
/* "[32]" = UserDefOneList */
QLIT_QDICT(((QLitDictEntry[]) {
{ "element-type", QLIT_QSTR("32"), },
@@ -2080,22 +2056,31 @@ Example::
{ "name", QLIT_QSTR("[32]"), },
{}
})),
+ /* "34" = q_obj_my-command-arg */
QLIT_QDICT(((QLitDictEntry[]) {
- { "json-type", QLIT_QSTR("int"), },
- { "meta-type", QLIT_QSTR("builtin"), },
- { "name", QLIT_QSTR("int"), },
+ { "members", QLIT_QLIST(((QLitObject[]) {
+ QLIT_QDICT(((QLitDictEntry[]) {
+ { "name", QLIT_QSTR("arg1"), },
+ { "type", QLIT_QSTR("[32]"), },
+ {}
+ })),
+ {}
+ })), },
+ { "meta-type", QLIT_QSTR("object"), },
+ { "name", QLIT_QSTR("34"), },
{}
})),
QLIT_QDICT(((QLitDictEntry[]) {
- { "json-type", QLIT_QSTR("string"), },
- { "meta-type", QLIT_QSTR("builtin"), },
- { "name", QLIT_QSTR("str"), },
+ { "arg-type", QLIT_QSTR("34"), },
+ { "meta-type", QLIT_QSTR("command"), },
+ { "name", QLIT_QSTR("my-command"), },
+ { "ret-type", QLIT_QSTR("32"), },
{}
})),
QLIT_QDICT(((QLitDictEntry[]) {
- { "json-type", QLIT_QSTR("boolean"), },
- { "meta-type", QLIT_QSTR("builtin"), },
- { "name", QLIT_QSTR("bool"), },
+ { "arg-type", QLIT_QSTR("30"), },
+ { "meta-type", QLIT_QSTR("event"), },
+ { "name", QLIT_QSTR("MY_EVENT"), },
{}
})),
{}
diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py
index 49d1ed2897..15302ecf15 100644
--- a/scripts/qapi/introspect.py
+++ b/scripts/qapi/introspect.py
@@ -28,9 +28,7 @@
from .schema import (
QAPISchema,
QAPISchemaAlternatives,
- QAPISchemaArrayType,
QAPISchemaBranches,
- QAPISchemaEntity,
QAPISchemaEnumMember,
QAPISchemaFeature,
QAPISchemaIfCond,
@@ -175,7 +173,6 @@ def __init__(self, prefix: str, unmask: bool):
self._unmask = unmask
self._schema: Optional[QAPISchema] = None
self._trees: List[Annotated[SchemaInfo]] = []
- self._used_types: List[QAPISchemaType] = []
self._genc.add(mcgen('''
#include "qemu/osdep.h"
#include "%(prefix)sqapi-introspect.h"
@@ -187,10 +184,6 @@ def visit_begin(self, schema: QAPISchema) -> None:
self._schema = schema
def visit_end(self) -> None:
- # visit the types that are actually used
- for typ in self._used_types:
- typ.visit(self)
- # generate C
name = c_name(self._prefix, protect=False) + 'qmp_schema_qlit'
self._genh.add(mcgen('''
#include "qobject/qlit.h"
@@ -205,32 +198,12 @@ def visit_end(self) -> None:
c_string=_tree_to_qlit(self._trees)))
self._schema = None
self._trees = []
- self._used_types = []
-
- def visit_needed(self, entity: QAPISchemaEntity) -> bool:
- # Ignore types on first pass; visit_end() will pick up used types
- return not isinstance(entity, QAPISchemaType)
def _name(self, name: str) -> str:
assert self._schema
return self._schema.definition_introspection_name(name, self._unmask)
def _use_type(self, typ: QAPISchemaType) -> str:
- assert self._schema is not None
-
- # Map the various integer types to plain int
- if typ.json_type() == 'int':
- type_int = self._schema.lookup_type('int')
- assert type_int
- typ = type_int
- elif (isinstance(typ, QAPISchemaArrayType) and
- typ.element_type.json_type() == 'int'):
- type_intlist = self._schema.lookup_type('intList')
- assert type_intlist
- typ = type_intlist
- # Add type to work queue if new
- if typ not in self._used_types:
- self._used_types.append(typ)
return self._name(typ.name)
@staticmethod
@@ -295,6 +268,8 @@ def _gen_variant(self, variant: QAPISchemaVariant
def visit_builtin_type(self, name: str, info: Optional[QAPISourceInfo],
json_type: str) -> None:
+ if json_type == 'int' and name != 'int':
+ return
self._gen_tree(name, 'builtin', {'json-type': json_type})
def visit_enum_type(self, name: str, info: Optional[QAPISourceInfo],
@@ -312,6 +287,8 @@ def visit_enum_type(self, name: str, info: Optional[QAPISourceInfo],
def visit_array_type(self, name: str, info: Optional[QAPISourceInfo],
ifcond: QAPISchemaIfCond,
element_type: QAPISchemaType) -> None:
+ if element_type.json_type() == 'int' and name != 'intList':
+ return
element = self._use_type(element_type)
self._gen_tree(name, 'array', {'element-type': element}, ifcond)
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 05/56] qapi: QAPISchemaVisitor.visit_needed() is now unused, drop
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (3 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 04/56] qapi/introspect: Don't elide types Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 06/56] qapi/introspect: Tweak integer type masking Markus Armbruster
` (50 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
scripts/qapi/schema.py | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py
index 11f3accec8..9e2152fa41 100644
--- a/scripts/qapi/schema.py
+++ b/scripts/qapi/schema.py
@@ -179,11 +179,6 @@ def visit_end(self) -> None:
def visit_module(self, name: str) -> None:
pass
- def visit_needed(self, entity: QAPISchemaEntity) -> bool:
- # pylint: disable=unused-argument
- # Default to visiting everything
- return True
-
def visit_include(self, name: str, info: Optional[QAPISourceInfo]) -> None:
pass
@@ -315,8 +310,7 @@ def add_entity(self, ent: QAPISchemaEntity) -> None:
def visit(self, visitor: QAPISchemaVisitor) -> None:
visitor.visit_module(self.name)
for entity in self._entity_list:
- if visitor.visit_needed(entity):
- entity.visit(visitor)
+ entity.visit(visitor)
class QAPISchemaInclude(QAPISchemaEntity):
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 06/56] qapi/introspect: Tweak integer type masking
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (4 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 05/56] qapi: QAPISchemaVisitor.visit_needed() is now unused, drop Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 07/56] qapi: add QAPITypeInfo struct definition Markus Armbruster
` (49 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
Since introspection maps all integer types to 'int', we need to skip
all but one of them. Instead of filtering by hardcoded name, filter
out duplicates.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
scripts/qapi/introspect.py | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py
index 15302ecf15..dc6f70a6fe 100644
--- a/scripts/qapi/introspect.py
+++ b/scripts/qapi/introspect.py
@@ -172,7 +172,7 @@ def __init__(self, prefix: str, unmask: bool):
' * QAPI/QMP schema introspection', __doc__)
self._unmask = unmask
self._schema: Optional[QAPISchema] = None
- self._trees: List[Annotated[SchemaInfo]] = []
+ self._trees: Dict[str, Annotated[SchemaInfo]] = {}
self._genc.add(mcgen('''
#include "qemu/osdep.h"
#include "%(prefix)sqapi-introspect.h"
@@ -191,13 +191,14 @@ def visit_end(self) -> None:
extern const QLitObject %(c_name)s;
''',
c_name=c_name(name)))
+ trees = list(self._trees.values())
self._genc.add(mcgen('''
const QLitObject %(c_name)s = %(c_string)s;
''',
c_name=c_name(name),
- c_string=_tree_to_qlit(self._trees)))
+ c_string=_tree_to_qlit(trees)))
self._schema = None
- self._trees = []
+ self._trees = {}
def _name(self, name: str) -> str:
assert self._schema
@@ -235,7 +236,12 @@ def _gen_tree(self, name: str, mtype: str, obj: Dict[str, object],
obj['meta-type'] = mtype
if features:
obj['features'] = self._gen_features(features)
- self._trees.append(Annotated(obj, ifcond, comment))
+ if introspection_name in self._trees:
+ # Duplicates are possible because
+ # QAPISchemaBuiltinType.introspection_name() returns 'int'
+ # for all integer types. Ignore them.
+ return
+ self._trees[introspection_name] = Annotated(obj, ifcond, comment)
def _gen_enum_member(self, member: QAPISchemaEnumMember
) -> Annotated[SchemaInfoEnumMember]:
@@ -268,8 +274,6 @@ def _gen_variant(self, variant: QAPISchemaVariant
def visit_builtin_type(self, name: str, info: Optional[QAPISourceInfo],
json_type: str) -> None:
- if json_type == 'int' and name != 'int':
- return
self._gen_tree(name, 'builtin', {'json-type': json_type})
def visit_enum_type(self, name: str, info: Optional[QAPISourceInfo],
@@ -287,8 +291,6 @@ def visit_enum_type(self, name: str, info: Optional[QAPISourceInfo],
def visit_array_type(self, name: str, info: Optional[QAPISourceInfo],
ifcond: QAPISchemaIfCond,
element_type: QAPISchemaType) -> None:
- if element_type.json_type() == 'int' and name != 'intList':
- return
element = self._use_type(element_type)
self._gen_tree(name, 'array', {'element-type': element}, ifcond)
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 07/56] qapi: add QAPITypeInfo struct definition
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (5 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 06/56] qapi/introspect: Tweak integer type masking Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 08/56] qapi/gen: fix _module_basename for multi-dash 'what' parameters Markus Armbruster
` (48 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Introduce a minimal struct that pairs a QAPI type's internal name with
its "masked" introspection name. Generated constants of this type will
let QOM property registration carry a reliable reference to the QAPI
schema and possibly other associated data.
The fields are populated in following commits.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
include/qapi/qapi-type-info.h | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
create mode 100644 include/qapi/qapi-type-info.h
diff --git a/include/qapi/qapi-type-info.h b/include/qapi/qapi-type-info.h
new file mode 100644
index 0000000000..a14ba56016
--- /dev/null
+++ b/include/qapi/qapi-type-info.h
@@ -0,0 +1,25 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef QAPI_TYPE_INFO_H
+#define QAPI_TYPE_INFO_H
+
+#include "qapi/util.h"
+
+/**
+ * QAPITypeInfo - QAPI type metadata
+ *
+ * @name: QAPI type name (e.g. "str", "OnOffAuto", "int32List").
+ * QOM uses this as the property type string.
+ * @masked_name: Name of the type in the output of query-qmp-schema,
+ * assigned by scripts/qapi code generator (e.g. "368").
+ * @lookup: QEnumLookup for this type, or NULL for non-enum types.
+ */
+typedef struct QAPITypeInfo {
+ const char *name;
+ const char *masked_name;
+ const QEnumLookup *lookup;
+} QAPITypeInfo;
+
+#endif /* QAPI_TYPE_INFO_H */
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 08/56] qapi/gen: fix _module_basename for multi-dash 'what' parameters
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (6 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 07/56] qapi: add QAPITypeInfo struct definition Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 09/56] qapi: add type-infos generator Markus Armbruster
` (47 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
The re.sub() call replaces every hyphen in 'what' with the system module
infix. This produces broken filenames for multi-hyphen names (e.g.
'qapi-type-infos' becomes 'qapi-builtin-type-builtin-infos').
Add count=1 so only the first hyphen is replaced.
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
scripts/qapi/gen.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/qapi/gen.py b/scripts/qapi/gen.py
index 0c9b8db3b0..690187d428 100644
--- a/scripts/qapi/gen.py
+++ b/scripts/qapi/gen.py
@@ -300,7 +300,7 @@ def _module_basename(self, what: str, name: str) -> str:
ret += '-' + os.path.splitext(basename)[0]
else:
assert QAPISchemaModule.is_system_module(name)
- ret += re.sub(r'-', '-' + name[2:] + '-', what)
+ ret += re.sub(r'-', '-' + name[2:] + '-', what, count=1)
return ret
def _module_filename(self, what: str, name: str) -> str:
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 09/56] qapi: add type-infos generator
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (7 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 08/56] qapi/gen: fix _module_basename for multi-dash 'what' parameters Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 10/56] qom: add qapi_type field to ObjectProperty Markus Armbruster
` (46 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
New QAPISchemaGenTypeInfoVisitor produces per-module
qapi-type-infos-*.h/c files. Each file declares QAPITypeInfo constants
pairing the QAPI type name with its masked introspection name.
We want per-module .h for less recompiling when we touch QAPI types.
Unfortunately, the per-module .c usually all change then, because the
masked names all change.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
docs/devel/qapi-code-gen.rst | 87 ++++++++++++++++++++
meson.build | 1 +
qapi/meson.build | 4 +
qga/meson.build | 2 +
scripts/qapi/backend.py | 2 +
scripts/qapi/type_infos.py | 149 ++++++++++++++++++++++++++++++++++
tests/include/meson.build | 2 +
tests/meson.build | 6 ++
tests/qapi-schema/meson.build | 1 +
9 files changed, 254 insertions(+)
create mode 100644 scripts/qapi/type_infos.py
diff --git a/docs/devel/qapi-code-gen.rst b/docs/devel/qapi-code-gen.rst
index 3c21dda91b..fc3a1dd6d8 100644
--- a/docs/devel/qapi-code-gen.rst
+++ b/docs/devel/qapi-code-gen.rst
@@ -1250,6 +1250,9 @@ JSON array of strings.
To examine a type, start with a command or event using it, then follow
references by name.
+.. TODO document QOM introspection (qom-list, qom-list-properties,
+ qom-get) and how it relates to QAPI type information.
+
The SchemaInfo for a command has meta-type "command", and variant
members "arg-type", "ret-type" and "allow-oob". On the wire, the
"arguments" member of a client's "execute" command must conform to the
@@ -2087,3 +2090,87 @@ Example::
}));
[Uninteresting stuff omitted...]
+
+
+Code generated for type information
+-----------------------------------
+
+Type information is generated for user-defined types and their array
+types. With option --builtins, it is also generated for the built-in
+types.
+
+The following files are created:
+
+ ``$(prefix)qapi-type-infos.c``
+ A ``QAPITypeInfo`` instance for each type listed above, providing
+ a mapping between the QAPI type name and the masked name used by
+ introspection, along with optional enum lookup table and array
+ type pointers.
+
+ ``$(prefix)qapi-type-infos.h``
+ Declarations for the above type info instances
+
+Each ``QAPITypeInfo`` struct has the following fields:
+
+``name``
+ The QAPI type name (e.g. ``"UserDefOne"``).
+
+``masked_name``
+ The masked name used in ``query-qmp-schema`` output.
+
+``lookup``
+ For enum types, a pointer to the corresponding ``QEnumLookup``
+ table. ``NULL`` for non-enum types.
+
+These type info instances are used by QOM property registration
+functions (``object_property_add()``,
+``object_class_property_add_enum()``, etc.) to associate each property
+with its QAPI type. The ``qom-list`` and ``device-list-properties``
+QMP commands then expose the ``qapi-type`` field, giving management
+tools a formal type reference they can look up in the introspection
+schema.
+
+Example::
+
+ $ cat qapi-generated/example-qapi-type-infos.h
+ [Uninteresting stuff omitted...]
+
+ #ifndef EXAMPLE_QAPI_TYPE_INFOS_H
+ #define EXAMPLE_QAPI_TYPE_INFOS_H
+
+ #include "qapi/qapi-builtin-type-infos.h"
+
+ extern const QAPITypeInfo UserDefOne_type_info;
+
+ extern const QAPITypeInfo UserDefOneList_type_info;
+
+ #endif /* EXAMPLE_QAPI_TYPE_INFOS_H */
+ $ cat qapi-generated/example-qapi-type-infos.c
+ [Uninteresting stuff omitted...]
+
+ const QAPITypeInfo UserDefOne_type_info = {
+ .name = "UserDefOne",
+ .masked_name = "32",
+ };
+
+ const QAPITypeInfo UserDefOneList_type_info = {
+ .name = "UserDefOneList",
+ .masked_name = "[32]",
+ };
+
+ [Uninteresting stuff omitted...]
+
+For a modular QAPI schema (see section `Include directives`_), code for
+each sub-module SUBDIR/SUBMODULE.json is actually generated into ::
+
+ SUBDIR/$(prefix)qapi-type-infos-SUBMODULE.h
+ SUBDIR/$(prefix)qapi-type-infos-SUBMODULE.c
+
+If qapi-gen.py is run with option --builtins, additional files are
+created:
+
+ ``qapi-builtin-type-infos.h``
+ Type info instances for built-in types
+
+ ``qapi-builtin-type-infos.c``
+ Definitions for the above type info instances
diff --git a/meson.build b/meson.build
index 7ec3fb9023..2af6f2af01 100644
--- a/meson.build
+++ b/meson.build
@@ -3522,6 +3522,7 @@ qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
meson.current_source_dir() / 'scripts/qapi/parser.py',
meson.current_source_dir() / 'scripts/qapi/schema.py',
meson.current_source_dir() / 'scripts/qapi/source.py',
+ meson.current_source_dir() / 'scripts/qapi/type_infos.py',
meson.current_source_dir() / 'scripts/qapi/types.py',
meson.current_source_dir() / 'scripts/qapi/visit.py',
meson.current_source_dir() / 'scripts/qapi-gen.py'
diff --git a/qapi/meson.build b/qapi/meson.build
index a46269b5a0..7477953492 100644
--- a/qapi/meson.build
+++ b/qapi/meson.build
@@ -79,6 +79,7 @@ endif
qapi_nonmodule_outputs = [
'qapi-introspect.c', 'qapi-introspect.h',
+ 'qapi-type-infos.c', 'qapi-type-infos.h',
'qapi-types.c', 'qapi-types.h',
'qapi-visit.h', 'qapi-visit.c',
'qapi-commands.h', 'qapi-commands.c',
@@ -88,6 +89,7 @@ qapi_nonmodule_outputs = [
]
qapi_outputs = qapi_nonmodule_outputs + [
+ 'qapi-builtin-type-infos.c', 'qapi-builtin-type-infos.h',
'qapi-builtin-types.c', 'qapi-builtin-visit.c',
'qapi-builtin-types.h', 'qapi-builtin-visit.h',
]
@@ -96,6 +98,8 @@ qapi_inputs = []
foreach module : qapi_all_modules
qapi_inputs += [ files(module + '.json') ]
qapi_module_outputs = [
+ 'qapi-type-infos-@0@.c'.format(module),
+ 'qapi-type-infos-@0@.h'.format(module),
'qapi-types-@0@.c'.format(module),
'qapi-types-@0@.h'.format(module),
'qapi-visit-@0@.c'.format(module),
diff --git a/qga/meson.build b/qga/meson.build
index a046ebe305..5cc43b87df 100644
--- a/qga/meson.build
+++ b/qga/meson.build
@@ -39,6 +39,8 @@ qga_qapi_outputs = [
'qga-qapi-init-commands.h',
'qga-qapi-introspect.c',
'qga-qapi-introspect.h',
+ 'qga-qapi-type-infos.c',
+ 'qga-qapi-type-infos.h',
'qga-qapi-types.c',
'qga-qapi-types.h',
'qga-qapi-visit.c',
diff --git a/scripts/qapi/backend.py b/scripts/qapi/backend.py
index 49ae6ecdd3..508ab21735 100644
--- a/scripts/qapi/backend.py
+++ b/scripts/qapi/backend.py
@@ -8,6 +8,7 @@
from .features import gen_features
from .introspect import gen_introspect
from .schema import QAPISchema
+from .type_infos import gen_type_infos
from .types import gen_types
from .visit import gen_visit
@@ -63,3 +64,4 @@ def generate(self,
gen_commands(schema, output_dir, prefix, gen_tracing)
gen_events(schema, output_dir, prefix)
gen_introspect(schema, output_dir, prefix, unmask)
+ gen_type_infos(schema, output_dir, prefix, builtins, unmask)
diff --git a/scripts/qapi/type_infos.py b/scripts/qapi/type_infos.py
new file mode 100644
index 0000000000..d9ed16d185
--- /dev/null
+++ b/scripts/qapi/type_infos.py
@@ -0,0 +1,149 @@
+"""
+QAPI type info generator
+
+SPDX-License-Identifier: GPL-2.0-or-later
+"""
+
+from typing import List, Optional
+
+from .common import c_name, mcgen
+from .gen import QAPISchemaModularCVisitor, ifcontext
+from .schema import (
+ QAPISchema,
+ QAPISchemaAlternatives,
+ QAPISchemaBranches,
+ QAPISchemaEnumMember,
+ QAPISchemaFeature,
+ QAPISchemaIfCond,
+ QAPISchemaObjectType,
+ QAPISchemaObjectTypeMember,
+ QAPISchemaType,
+)
+from .source import QAPISourceInfo
+
+
+class QAPISchemaGenTypeInfoVisitor(QAPISchemaModularCVisitor):
+
+ def __init__(self, prefix: str, unmask: bool):
+ super().__init__(
+ prefix, 'qapi-type-infos',
+ ' * Schema-defined QAPI type info',
+ ' * Built-in QAPI type info', __doc__)
+ self._unmask = unmask
+ self._schema: Optional[QAPISchema] = None
+
+ def visit_begin(self, schema: QAPISchema) -> None:
+ super().visit_begin(schema)
+ self._schema = schema
+
+ def _begin_builtin_module(self) -> None:
+ self._genc.preamble_add(mcgen('''
+#include "qemu/osdep.h"
+#include "qapi/qapi-builtin-types.h"
+#include "qapi/qapi-builtin-type-infos.h"
+'''))
+ self._genh.preamble_add(mcgen('''
+#include "qapi/qapi-type-info.h"
+'''))
+
+ def _begin_user_module(self, name: str) -> None:
+ type_infos = self._module_basename('qapi-type-infos', name)
+ types = self._module_basename('qapi-types', name)
+ self._genc.preamble_add(mcgen('''
+#include "qemu/osdep.h"
+#include "%(types)s.h"
+#include "%(type_infos)s.h"
+''',
+ types=types,
+ type_infos=type_infos))
+ self._genh.preamble_add(mcgen('''
+#include "qapi/qapi-builtin-type-infos.h"
+'''))
+
+ def _masked_name(self, name: str) -> str:
+ assert self._schema is not None
+ return self._schema.definition_introspection_name(name, self._unmask)
+
+ def _gen_type_info(self, name: str,
+ ifcond: Optional[QAPISchemaIfCond] = None,
+ with_lookup: bool = False) -> None:
+ cname = c_name(name, protect=False)
+ with ifcontext(ifcond or QAPISchemaIfCond(),
+ self._genh, self._genc):
+ self._genh.add(mcgen('''
+
+extern const QAPITypeInfo %(cname)s_type_info;
+''',
+ cname=cname))
+ self._genc.add(mcgen('''
+
+const QAPITypeInfo %(cname)s_type_info = {
+ .name = "%(name)s",
+ .masked_name = "%(masked_name)s",
+''',
+ cname=cname, name=name,
+ masked_name=self._masked_name(name)))
+ if with_lookup:
+ self._genc.add(mcgen('''
+ .lookup = &%(cname)s_lookup,
+''',
+ cname=cname))
+ self._genc.add(mcgen('''
+};
+'''))
+
+ def visit_builtin_type(self,
+ name: str,
+ info: Optional[QAPISourceInfo],
+ json_type: str) -> None:
+ self._gen_type_info(name)
+
+ def visit_enum_type(self,
+ name: str,
+ info: Optional[QAPISourceInfo],
+ ifcond: QAPISchemaIfCond,
+ features: List[QAPISchemaFeature],
+ members: List[QAPISchemaEnumMember],
+ prefix: Optional[str]) -> None:
+ self._gen_type_info(name, ifcond,
+ with_lookup=True)
+
+ def visit_array_type(self,
+ name: str,
+ info: Optional[QAPISourceInfo],
+ ifcond: QAPISchemaIfCond,
+ element_type: QAPISchemaType) -> None:
+ self._gen_type_info(name, ifcond)
+
+ def visit_object_type(self,
+ name: str,
+ info: Optional[QAPISourceInfo],
+ ifcond: QAPISchemaIfCond,
+ features: List[QAPISchemaFeature],
+ base: Optional[QAPISchemaObjectType],
+ members: List[QAPISchemaObjectTypeMember],
+ branches: Optional[QAPISchemaBranches]) -> None:
+ assert self._schema is not None
+ typ = self._schema.lookup_type(name)
+ assert typ
+ if typ.is_implicit():
+ return
+ self._gen_type_info(name, ifcond)
+
+ def visit_alternate_type(self,
+ name: str,
+ info: Optional[QAPISourceInfo],
+ ifcond: QAPISchemaIfCond,
+ features: List[QAPISchemaFeature],
+ alternatives: QAPISchemaAlternatives) -> None:
+ self._gen_type_info(name, ifcond)
+
+
+def gen_type_infos(schema: QAPISchema,
+ output_dir: str,
+ prefix: str,
+ opt_builtins: bool,
+ opt_unmask: bool) -> None:
+ vis = QAPISchemaGenTypeInfoVisitor(prefix, opt_unmask)
+ schema.visit(vis)
+ vis.write(output_dir, opt_builtins)
diff --git a/tests/include/meson.build b/tests/include/meson.build
index 8e8d1ec4e6..026480d968 100644
--- a/tests/include/meson.build
+++ b/tests/include/meson.build
@@ -4,6 +4,8 @@ test_qapi_outputs_extra = [
'test-qapi-commands-sub-module.h',
'test-qapi-events-sub-module.c',
'test-qapi-events-sub-module.h',
+ 'test-qapi-type-infos-sub-module.c',
+ 'test-qapi-type-infos-sub-module.h',
'test-qapi-types-sub-module.c',
'test-qapi-types-sub-module.h',
'test-qapi-visit-sub-module.c',
diff --git a/tests/meson.build b/tests/meson.build
index 5877d2f60b..6769a1e781 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -2,6 +2,8 @@ subdir('bench')
subdir('qemu-iotests')
test_qapi_outputs = [
+ 'qapi-builtin-type-infos.c',
+ 'qapi-builtin-type-infos.h',
'qapi-builtin-types.c',
'qapi-builtin-types.h',
'qapi-builtin-visit.c',
@@ -22,6 +24,10 @@ test_qapi_outputs = [
'test-qapi-init-commands.h',
'test-qapi-introspect.c',
'test-qapi-introspect.h',
+ 'test-qapi-type-infos-sub-sub-module.c',
+ 'test-qapi-type-infos-sub-sub-module.h',
+ 'test-qapi-type-infos.c',
+ 'test-qapi-type-infos.h',
'test-qapi-types-sub-sub-module.c',
'test-qapi-types-sub-sub-module.h',
'test-qapi-types.c',
diff --git a/tests/qapi-schema/meson.build b/tests/qapi-schema/meson.build
index debff633ac..392b59d8dc 100644
--- a/tests/qapi-schema/meson.build
+++ b/tests/qapi-schema/meson.build
@@ -231,6 +231,7 @@ custom_target('QAPI doc',
'doc-good-qapi-events.c', 'doc-good-qapi-events.h',
'doc-good-qapi-init-commands.c', 'doc-good-qapi-init-commands.h',
'doc-good-qapi-introspect.c', 'doc-good-qapi-introspect.h',
+ 'doc-good-qapi-type-infos.c', 'doc-good-qapi-type-infos.h',
'doc-good-qapi-types.c', 'doc-good-qapi-types.h',
'doc-good-qapi-visit.c', 'doc-good-qapi-visit.h' ],
input: files('doc-good.json'),
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 10/56] qom: add qapi_type field to ObjectProperty
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (8 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 09/56] qapi: add type-infos generator Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 11/56] qapi/qom: add qapi-type to qom-list, qom-list-properties, qom-list-get Markus Armbruster
` (45 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Add a const pointer to QAPITypeInfo in ObjectProperty. NULL for now,
but future patches will add means to make it non-null. The
QAPITypeInfo will then be used by QOM introspection to tie the
property to a QAPI type.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
include/qom/object.h | 2 ++
qom/object.c | 1 +
2 files changed, 3 insertions(+)
diff --git a/include/qom/object.h b/include/qom/object.h
index 90c1a34e49..e9b380462d 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -15,6 +15,7 @@
#define QEMU_OBJECT_H
#include "qapi/qapi-builtin-types.h"
+#include "qapi/qapi-type-info.h"
#include "qemu/module.h"
struct TypeImpl;
@@ -91,6 +92,7 @@ struct ObjectProperty
char *name;
char *type;
char *description;
+ const QAPITypeInfo *qapi_type;
ObjectPropertyAccessor *get;
ObjectPropertyAccessor *set;
ObjectPropertyResolve *resolve;
diff --git a/qom/object.c b/qom/object.c
index 96498f3d00..c34b47312f 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -3171,6 +3171,7 @@ object_property_add_alias(Object *obj, const char *name,
property_release_alias,
prop);
op->resolve = property_resolve_alias;
+ op->qapi_type = target_prop->qapi_type;
if (target_prop->defval) {
op->defval = qobject_ref(target_prop->defval);
}
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 11/56] qapi/qom: add qapi-type to qom-list, qom-list-properties, qom-list-get
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (9 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 10/56] qom: add qapi_type field to ObjectProperty Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 12/56] qom/qmp: populate qapi-type in QMP handlers Markus Armbruster
` (44 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
QOM introspection is flawed: the type information is just a
string (ObjectPropertyInfo and ObjectPropertyValue field 'type').
Management applications need to know these strings. Their
documentation is of little help.
QAPI introspection is more powerful, and management applications
already know how to use it. Let's put it to use for QOM introspection.
Add an optional 'qapi-type' field to ObjectPropertyInfo and
ObjectPropertyValue. When present, it contains the masked type name that
can be looked up in query-qmp-schema output. Absent for properties
without a QAPI type association. Always absent for now, populated
in the following changes.
This cannot fully replace 'type', yet: it doesn't cover child and link
properties. Mark 'unstable' for now.
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
qapi/qom.json | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/qapi/qom.json b/qapi/qom.json
index 4810d53e58..df523c08c7 100644
--- a/qapi/qom.json
+++ b/qapi/qom.json
@@ -35,15 +35,24 @@
# qdev device type name. Link properties form the device model
# graph.
#
+# @qapi-type: the name of the property's type as it appears in the
+# output of ``query-qmp-schema``. Absent if the type does not
+# occur there. (since 11.2)
+#
# @description: if specified, the description of the property.
#
# @default-value: the default value, if any (since 5.0)
#
+# Features:
+#
+# @unstable: Member @qapi-type is experimental.
+#
# Since: 1.2
##
{ 'struct': 'ObjectPropertyInfo',
'data': { 'name': 'str',
'type': 'str',
+ '*qapi-type': { 'type': 'str', 'features': [ 'unstable' ] },
'*description': 'str',
'*default-value': 'any' } }
@@ -55,14 +64,23 @@
# @type: the type of the property, as described in
# `ObjectPropertyInfo`.
#
+# @qapi-type: the name of the property's type as it appears in the
+# output of ``query-qmp-schema``. Absent if the type does not
+# occur there. (since 11.2)
+#
# @value: the value of the property. Absent when the property cannot
# be read.
#
+# Features:
+#
+# @unstable: Member @qapi-type is experimental.
+#
# Since: 10.1
##
{ 'struct': 'ObjectPropertyValue',
'data': { 'name': 'str',
'type': 'str',
+ '*qapi-type': { 'type': 'str', 'features': [ 'unstable' ] },
'*value': 'any' } }
##
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 12/56] qom/qmp: populate qapi-type in QMP handlers
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (10 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 11/56] qapi/qom: add qapi-type to qom-list, qom-list-properties, qom-list-get Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 13/56] qom/qmp: populate description & default-value in qom_property_info() Markus Armbruster
` (43 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Wire up the new qapi-type field in all four QMP handlers that return
ObjectPropertyInfo or ObjectPropertyValue: qom-list, qom-list-get,
device-list-properties, and qom-list-properties.
When an ObjectProperty has a qapi_type set, the masked QAPI type name
is copied into the response, allowing clients to cross-reference with
query-qmp-schema.
No property has it yet, the following changes will populate it.
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
qom/qom-qmp-cmds.c | 34 +++++++++++++++++++++-------------
1 file changed, 21 insertions(+), 13 deletions(-)
diff --git a/qom/qom-qmp-cmds.c b/qom/qom-qmp-cmds.c
index f17389c730..47bf3bf293 100644
--- a/qom/qom-qmp-cmds.c
+++ b/qom/qom-qmp-cmds.c
@@ -25,9 +25,23 @@
#include "qapi/qobject-input-visitor.h"
#include "qapi/qobject-output-visitor.h"
#include "qemu/cutils.h"
+#include "qapi/qapi-type-info.h"
#include "qom/object_interfaces.h"
#include "qom/qom-qobject.h"
+static ObjectPropertyInfo *qom_property_info(ObjectProperty *prop)
+{
+ ObjectPropertyInfo *info = g_new0(ObjectPropertyInfo, 1);
+
+ info->name = g_strdup(prop->name);
+ info->type = g_strdup(prop->type);
+ if (prop->qapi_type) {
+ assert(prop->qapi_type->masked_name);
+ info->qapi_type = g_strdup(prop->qapi_type->masked_name);
+ }
+ return info;
+}
+
static Object *qom_resolve_path(const char *path, Error **errp)
{
bool ambiguous = false;
@@ -58,12 +72,7 @@ ObjectPropertyInfoList *qmp_qom_list(const char *path, Error **errp)
object_property_iter_init(&iter, obj);
while ((prop = object_property_iter_next(&iter))) {
- ObjectPropertyInfo *value = g_new0(ObjectPropertyInfo, 1);
-
- QAPI_LIST_PREPEND(props, value);
-
- value->name = g_strdup(prop->name);
- value->type = g_strdup(prop->type);
+ QAPI_LIST_PREPEND(props, qom_property_info(prop));
}
return props;
@@ -78,6 +87,10 @@ static void qom_list_add_property_value(Object *obj, ObjectProperty *prop,
item->name = g_strdup(prop->name);
item->type = g_strdup(prop->type);
+ if (prop->qapi_type) {
+ assert(prop->qapi_type->masked_name);
+ item->qapi_type = g_strdup(prop->qapi_type->masked_name);
+ }
item->value = object_property_get_qobject(obj, prop->name, NULL);
}
@@ -241,9 +254,7 @@ ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
continue;
}
- info = g_new0(ObjectPropertyInfo, 1);
- info->name = g_strdup(prop->name);
- info->type = g_strdup(prop->type);
+ info = qom_property_info(prop);
info->description = g_strdup(prop->description);
info->default_value = qobject_ref(prop->defval);
@@ -284,11 +295,8 @@ ObjectPropertyInfoList *qmp_qom_list_properties(const char *typename,
object_property_iter_init(&iter, obj);
}
while ((prop = object_property_iter_next(&iter))) {
- ObjectPropertyInfo *info;
+ ObjectPropertyInfo *info = qom_property_info(prop);
- info = g_malloc0(sizeof(*info));
- 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);
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 13/56] qom/qmp: populate description & default-value in qom_property_info()
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (11 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 12/56] qom/qmp: populate qapi-type in QMP handlers Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 14/56] qom: New object_property_add() etc. parameter @qapi_type Markus Armbruster
` (42 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Move description and default_value population from the individual QMP
handlers into qom_property_info(), so all callers get them.
This also adds description and default-value to qom-list responses,
which previously only returned name and type. The handler doesn't care.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
qom/qom-qmp-cmds.c | 17 ++++-------------
1 file changed, 4 insertions(+), 13 deletions(-)
diff --git a/qom/qom-qmp-cmds.c b/qom/qom-qmp-cmds.c
index 47bf3bf293..84a2959051 100644
--- a/qom/qom-qmp-cmds.c
+++ b/qom/qom-qmp-cmds.c
@@ -35,6 +35,8 @@ static ObjectPropertyInfo *qom_property_info(ObjectProperty *prop)
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);
if (prop->qapi_type) {
assert(prop->qapi_type->masked_name);
info->qapi_type = g_strdup(prop->qapi_type->masked_name);
@@ -243,8 +245,6 @@ ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
object_property_iter_init(&iter, obj);
while ((prop = object_property_iter_next(&iter))) {
- ObjectPropertyInfo *info;
-
/* Skip Object and DeviceState properties */
if (strcmp(prop->name, "type") == 0 ||
strcmp(prop->name, "realized") == 0 ||
@@ -254,11 +254,7 @@ ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
continue;
}
- info = qom_property_info(prop);
- info->description = g_strdup(prop->description);
- info->default_value = qobject_ref(prop->defval);
-
- QAPI_LIST_PREPEND(prop_list, info);
+ QAPI_LIST_PREPEND(prop_list, qom_property_info(prop));
}
object_unref(obj);
@@ -295,12 +291,7 @@ ObjectPropertyInfoList *qmp_qom_list_properties(const char *typename,
object_property_iter_init(&iter, obj);
}
while ((prop = object_property_iter_next(&iter))) {
- ObjectPropertyInfo *info = qom_property_info(prop);
-
- info->description = g_strdup(prop->description);
- info->default_value = qobject_ref(prop->defval);
-
- QAPI_LIST_PREPEND(prop_list, info);
+ QAPI_LIST_PREPEND(prop_list, qom_property_info(prop));
}
object_unref(obj);
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 14/56] qom: New object_property_add() etc. parameter @qapi_type
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (12 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 13/56] qom/qmp: populate description & default-value in qom_property_info() Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-02 5:33 ` marcandre.lureau
2026-11-01 20:16 ` [PATCH v8 15/56] qom/object: Move enum property code so it is together Markus Armbruster
` (41 subsequent siblings)
55 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
This permits setting ObjectProperty's optional @qapi_type. For now,
all callers pass null. Callers updated with this Coccinelle script:
@@
identifier fun = {
object_property_try_add, object_property_add, object_class_property_add
};
expression obj, name, type;
@@
- fun(obj, name, type,
+ fun(obj, name, type, NULL,
...)
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
include/qom/object.h | 5 +++
accel/hvf/hvf-all.c | 6 +--
accel/kvm/kvm-all.c | 19 +++++----
accel/nitro/nitro-accel.c | 2 +-
accel/tcg/tcg-all.c | 6 +--
accel/whpx/whpx-common.c | 12 +++---
authz/list.c | 2 +-
backends/cryptodev.c | 6 +--
backends/hostmem-file.c | 21 +++++-----
backends/hostmem-memfd.c | 4 +-
backends/hostmem.c | 24 +++++------
block/throttle-groups.c | 7 +---
chardev/char-socket.c | 2 +-
crypto/secret_keyring.c | 2 +-
event-loop-base.c | 6 +--
hw/acpi/ich9.c | 2 +-
hw/acpi/pci.c | 8 ++--
hw/arm/virt.c | 10 ++---
hw/core/clock.c | 2 +-
hw/core/machine.c | 29 +++++++------
hw/core/qdev-properties.c | 5 +--
hw/cpu/core.c | 6 ++-
hw/cxl/cxl-host.c | 4 +-
hw/gpio/aspeed_gpio.c | 6 +--
hw/gpio/aspeed_sgpio.c | 2 +-
hw/gpio/pca9552.c | 4 +-
hw/gpio/pca9554.c | 3 +-
hw/gpio/stm32l4x5_gpio.c | 4 +-
hw/hexagon/hexagon_dsp.c | 2 +-
hw/i386/microvm.c | 6 +--
hw/i386/pc.c | 27 ++++++------
hw/i386/sgx-epc.c | 2 +-
hw/i386/x86.c | 23 ++++++-----
hw/ide/ide-dev.c | 2 +-
hw/intc/apic_common.c | 2 +-
hw/loongarch/virt.c | 18 ++++----
hw/mem/nvdimm.c | 5 ++-
hw/mem/pc-dimm.c | 3 +-
hw/misc/aspeed_lpc.c | 36 ++++++++++------
hw/misc/aspeed_sdmc.c | 2 +-
hw/misc/npcm7xx_mft.c | 2 +-
hw/net/ne2000-isa.c | 2 +-
hw/nvme/ctrl.c | 2 +-
hw/pci-bridge/pci_expander_bridge.c | 2 +-
hw/pci-host/i440fx.c | 4 ++
hw/pci-host/pnv_phb3.c | 4 +-
hw/pci-host/pnv_phb4.c | 4 +-
hw/pci-host/q35.c | 8 ++--
hw/ppc/spapr_caps.c | 2 +-
hw/ppc/spapr_drc.c | 4 +-
hw/remote/vfio-user-obj.c | 2 +-
hw/riscv/microchip_pfsoc.c | 1 +
hw/riscv/virt.c | 4 +-
hw/s390x/s390-virtio-ccw.c | 4 +-
hw/s390x/sclpcpi.c | 6 ++-
hw/s390x/virtio-ccw-mem.c | 2 +-
hw/sensor/adc128d818.c | 8 ++--
hw/sensor/adm1266.c | 2 +-
hw/sensor/adm1272.c | 8 ++--
hw/sensor/emc141x.c | 8 ++--
hw/sensor/isl_pmbus_vr.c | 18 ++++----
hw/sensor/lsm303dlhc_mag.c | 24 +++++------
hw/sensor/max34451.c | 4 +-
hw/sensor/tmp105.c | 2 +-
hw/sensor/tmp421.c | 8 ++--
hw/usb/dev-storage-classic.c | 2 +-
hw/vfio-user/pci.c | 2 +-
hw/virtio/virtio-balloon.c | 4 +-
hw/virtio/virtio-mem-pci.c | 2 +-
hw/virtio/virtio-mem.c | 7 ++--
hw/xen/xen-pvh-common.c | 8 ++--
iothread.c | 8 ++--
net/colo-compare.c | 6 +--
net/dump.c | 3 +-
net/filter-buffer.c | 2 +-
qom/object.c | 64 ++++++++++++++++-------------
system/bootdevice.c | 2 +-
system/memory.c | 4 +-
target/arm/cpu64.c | 10 ++---
target/arm/kvm.c | 2 +-
target/arm/tcg/cpu64.c | 4 +-
target/i386/cpu.c | 20 +++++----
target/i386/kvm/kvm.c | 8 ++--
target/i386/kvm/tdx.c | 2 +-
target/i386/sev.c | 8 ++--
target/i386/whpx/whpx-all.c | 18 ++++----
target/ppc/compat.c | 2 +-
target/riscv/cpu.c | 12 +++---
target/riscv/kvm/kvm-cpu.c | 6 +--
target/riscv/tcg/tcg-cpu.c | 6 +--
target/s390x/cpu-system.c | 1 +
target/s390x/cpu_models.c | 5 ++-
tests/unit/test-qdev-global-props.c | 6 ++-
ui/console.c | 2 +-
util/thread-context.c | 6 +--
95 files changed, 377 insertions(+), 327 deletions(-)
diff --git a/include/qom/object.h b/include/qom/object.h
index e9b380462d..84b273e535 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1163,6 +1163,7 @@ void object_unref(void *obj);
* defined. Sub namespaces are constructed by using a prefix and then
* to angle brackets. For instance, the type 'virtio-net-pci' in the
* 'link' namespace would be 'link<virtio-net-pci>'.
+ * @qapi_type: QAPI type info descriptor
* @get: The getter to be called to read a property. If this is NULL, then
* the property cannot be read.
* @set: the setter to be called to write a property. If this is NULL,
@@ -1188,6 +1189,7 @@ void object_unref(void *obj);
*/
ObjectProperty *object_property_try_add(Object *obj, const char *name,
const char *type,
+ QAPITypeInfo *qapi_type,
ObjectPropertyAccessor *get,
ObjectPropertyAccessor *set,
ObjectPropertyRelease *release,
@@ -1203,6 +1205,7 @@ ObjectProperty *object_property_try_add(Object *obj, const char *name,
* defined. Sub namespaces are constructed by using a prefix and then
* to angle brackets. For instance, the type 'virtio-net-pci' in the
* 'link' namespace would be 'link<virtio-net-pci>'.
+ * @qapi_type: QAPI type info descriptor
* @get: The getter to be called to read a property. If this is NULL, then
* the property cannot be read.
* @set: the setter to be called to write a property. If this is NULL,
@@ -1220,6 +1223,7 @@ ObjectProperty *object_property_try_add(Object *obj, const char *name,
*/
ObjectProperty *object_property_add(Object *obj, const char *name,
const char *type,
+ const QAPITypeInfo *qapi_type,
ObjectPropertyAccessor *get,
ObjectPropertyAccessor *set,
ObjectPropertyRelease *release,
@@ -1237,6 +1241,7 @@ void object_property_del(Object *obj, const char *name);
ObjectProperty *object_class_property_add(ObjectClass *klass, const char *name,
const char *type,
+ const QAPITypeInfo *qapi_type,
ObjectPropertyAccessor *get,
ObjectPropertyAccessor *set,
ObjectPropertyRelease *release,
diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c
index 8bd9154a50..213ee15b4a 100644
--- a/accel/hvf/hvf-all.c
+++ b/accel/hvf/hvf-all.c
@@ -277,9 +277,9 @@ static void hvf_accel_class_init(ObjectClass *oc, const void *data)
ac->allowed = &hvf_allowed;
hvf_kernel_irqchip_override = false;
hvf_kernel_irqchip = false;
- object_class_property_add(oc, "kernel-irqchip", "on|off|split",
- NULL, hvf_set_kernel_irqchip,
- NULL, NULL);
+ object_class_property_add(oc, "kernel-irqchip", "on|off|split", NULL,
+ NULL, hvf_set_kernel_irqchip,
+ NULL, NULL);
object_class_property_set_description(oc, "kernel-irqchip",
"Configure HVF irqchip");
}
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index db8fba53f3..9cc1e4b0a9 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -4303,21 +4303,22 @@ static void kvm_accel_class_init(ObjectClass *oc, const void *data)
ac->has_memory = kvm_accel_has_memory;
ac->allowed = &kvm_allowed;
- object_class_property_add(oc, "kernel-irqchip", "on|off|split",
- NULL, kvm_set_kernel_irqchip,
- NULL, NULL);
+ object_class_property_add(oc, "kernel-irqchip", "on|off|split", NULL,
+ NULL, kvm_set_kernel_irqchip,
+ NULL, NULL);
object_class_property_set_description(oc, "kernel-irqchip",
"Configure KVM in-kernel irqchip");
- object_class_property_add(oc, "kvm-shadow-mem", "int",
- kvm_get_kvm_shadow_mem, kvm_set_kvm_shadow_mem,
- NULL, NULL);
+ object_class_property_add(oc, "kvm-shadow-mem", "int", NULL,
+ kvm_get_kvm_shadow_mem, kvm_set_kvm_shadow_mem,
+ NULL, NULL);
object_class_property_set_description(oc, "kvm-shadow-mem",
"KVM shadow MMU size");
- object_class_property_add(oc, "dirty-ring-size", "uint32",
- kvm_get_dirty_ring_size, kvm_set_dirty_ring_size,
- NULL, NULL);
+ object_class_property_add(oc, "dirty-ring-size", "uint32", NULL,
+ kvm_get_dirty_ring_size,
+ kvm_set_dirty_ring_size,
+ NULL, NULL);
object_class_property_set_description(oc, "dirty-ring-size",
"Size of KVM dirty page ring buffer (default: 0, i.e. use bitmap)");
diff --git a/accel/nitro/nitro-accel.c b/accel/nitro/nitro-accel.c
index a1e97a9162..597027438c 100644
--- a/accel/nitro/nitro-accel.c
+++ b/accel/nitro/nitro-accel.c
@@ -238,7 +238,7 @@ static void nitro_accel_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, "debug-mode",
"Start enclave in debug mode (enables console output)");
- object_class_property_add(oc, "enclave-cid", "uint64",
+ object_class_property_add(oc, "enclave-cid", "uint64", NULL,
nitro_get_enclave_cid,
nitro_set_enclave_cid,
NULL, NULL);
diff --git a/accel/tcg/tcg-all.c b/accel/tcg/tcg-all.c
index 767e880555..ed314e01cb 100644
--- a/accel/tcg/tcg-all.c
+++ b/accel/tcg/tcg-all.c
@@ -270,9 +270,9 @@ static void tcg_accel_class_init(ObjectClass *oc, const void *data)
tcg_get_thread,
tcg_set_thread);
- object_class_property_add(oc, "tb-size", "uint32",
- tcg_get_tb_size, tcg_set_tb_size,
- NULL, NULL);
+ object_class_property_add(oc, "tb-size", "uint32", NULL,
+ tcg_get_tb_size, tcg_set_tb_size,
+ NULL, NULL);
object_class_property_set_description(oc, "tb-size",
"TCG translation block cache size");
diff --git a/accel/whpx/whpx-common.c b/accel/whpx/whpx-common.c
index 247e12db81..f82e607745 100644
--- a/accel/whpx/whpx-common.c
+++ b/accel/whpx/whpx-common.c
@@ -528,14 +528,14 @@ static void whpx_accel_class_init(ObjectClass *oc, const void *data)
ac->pre_resume_vm = whpx_pre_resume_vm;
ac->allowed = &whpx_allowed;
- object_class_property_add(oc, "kernel-irqchip", "on|off|split",
- NULL, whpx_set_kernel_irqchip,
- NULL, NULL);
+ object_class_property_add(oc, "kernel-irqchip", "on|off|split", NULL,
+ NULL, whpx_set_kernel_irqchip,
+ NULL, NULL);
object_class_property_set_description(oc, "kernel-irqchip",
"Configure WHPX in-kernel irqchip");
- object_class_property_add(oc, "hyperv", "OnOffAuto",
- NULL, whpx_set_hyperv,
- NULL, NULL);
+ object_class_property_add(oc, "hyperv", "OnOffAuto", NULL,
+ NULL, whpx_set_hyperv,
+ NULL, NULL);
object_class_property_set_description(oc, "hyperv",
"Configure Hyper-V enlightenments");
diff --git a/authz/list.c b/authz/list.c
index 17aa0efd80..72aedc6ac4 100644
--- a/authz/list.c
+++ b/authz/list.c
@@ -126,7 +126,7 @@ qauthz_list_class_init(ObjectClass *oc, const void *data)
qauthz_list_prop_get_policy,
qauthz_list_prop_set_policy);
- object_class_property_add(oc, "rules", "QAuthZListRule",
+ object_class_property_add(oc, "rules", "QAuthZListRule", NULL,
qauthz_list_prop_get_rules,
qauthz_list_prop_set_rules,
NULL, NULL);
diff --git a/backends/cryptodev.c b/backends/cryptodev.c
index e8f2b18f20..cc323014cc 100644
--- a/backends/cryptodev.c
+++ b/backends/cryptodev.c
@@ -622,15 +622,15 @@ cryptodev_backend_class_init(ObjectClass *oc, const void *data)
ucc->prepare_delete = cryptodev_backend_prepare_delete;
QTAILQ_INIT(&crypto_clients);
- object_class_property_add(oc, "queues", "uint32",
+ object_class_property_add(oc, "queues", "uint32", NULL,
cryptodev_backend_get_queues,
cryptodev_backend_set_queues,
NULL, NULL);
- object_class_property_add(oc, "throttle-bps", "uint64",
+ object_class_property_add(oc, "throttle-bps", "uint64", NULL,
cryptodev_backend_get_bps,
cryptodev_backend_set_bps,
NULL, NULL);
- object_class_property_add(oc, "throttle-ops", "uint64",
+ object_class_property_add(oc, "throttle-ops", "uint64", NULL,
cryptodev_backend_get_ops,
cryptodev_backend_set_ops,
NULL, NULL);
diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
index 7efecf71f5..aec38bac2f 100644
--- a/backends/hostmem-file.c
+++ b/backends/hostmem-file.c
@@ -281,14 +281,14 @@ file_backend_class_init(ObjectClass *oc, const void *data)
file_memory_backend_get_discard_data, file_memory_backend_set_discard_data);
object_class_property_add_str(oc, "mem-path",
get_mem_path, set_mem_path);
- object_class_property_add(oc, "align", "uint64",
- file_memory_backend_get_align,
- file_memory_backend_set_align,
- NULL, NULL);
- object_class_property_add(oc, "offset", "int",
- file_memory_backend_get_offset,
- file_memory_backend_set_offset,
- NULL, NULL);
+ object_class_property_add(oc, "align", "uint64", NULL,
+ file_memory_backend_get_align,
+ file_memory_backend_set_align,
+ NULL, NULL);
+ object_class_property_add(oc, "offset", "int", NULL,
+ file_memory_backend_get_offset,
+ file_memory_backend_set_offset,
+ NULL, NULL);
object_class_property_set_description(oc, "offset",
"Offset into the target file (ex: 1G)");
#ifdef CONFIG_LIBPMEM
@@ -298,8 +298,9 @@ file_backend_class_init(ObjectClass *oc, const void *data)
object_class_property_add_bool(oc, "readonly",
file_memory_backend_get_readonly,
file_memory_backend_set_readonly);
- object_class_property_add(oc, "rom", "OnOffAuto",
- file_memory_backend_get_rom, file_memory_backend_set_rom, NULL, NULL);
+ object_class_property_add(oc, "rom", "OnOffAuto", NULL,
+ file_memory_backend_get_rom,
+ file_memory_backend_set_rom, NULL, NULL);
object_class_property_set_description(oc, "rom",
"Whether to create Read Only Memory (ROM)");
}
diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c
index 666593ff6c..15dc8814ba 100644
--- a/backends/hostmem-memfd.c
+++ b/backends/hostmem-memfd.c
@@ -195,7 +195,7 @@ memfd_backend_class_init(ObjectClass *oc, const void *data)
memfd_backend_set_hugetlb);
object_class_property_set_description(oc, "hugetlb",
"Use huge pages");
- object_class_property_add(oc, "hugetlbsize", "uint64",
+ object_class_property_add(oc, "hugetlbsize", "uint64", NULL,
memfd_backend_get_hugetlbsize,
memfd_backend_set_hugetlbsize,
NULL, NULL);
@@ -203,7 +203,7 @@ memfd_backend_class_init(ObjectClass *oc, const void *data)
"Huge pages size (ex: 2M, 1G)");
}
- object_class_property_add(oc, "guest-memfd", "OnOffAuto",
+ object_class_property_add(oc, "guest-memfd", "OnOffAuto", NULL,
memfd_backend_get_guest_memfd,
memfd_backend_set_guest_memfd, NULL, NULL);
object_class_property_set_description(oc, "guest-memfd",
diff --git a/backends/hostmem.c b/backends/hostmem.c
index 8782c8b1ea..299a3b90fe 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -528,10 +528,10 @@ host_memory_backend_class_init(ObjectClass *oc, const void *data)
host_memory_backend_set_prealloc);
object_class_property_set_description(oc, "prealloc",
"Preallocate memory");
- object_class_property_add(oc, "prealloc-threads", "int",
- host_memory_backend_get_prealloc_threads,
- host_memory_backend_set_prealloc_threads,
- NULL, NULL);
+ object_class_property_add(oc, "prealloc-threads", "int", NULL,
+ host_memory_backend_get_prealloc_threads,
+ host_memory_backend_set_prealloc_threads,
+ NULL, NULL);
object_class_property_set_description(oc, "prealloc-threads",
"Number of CPU threads to use for prealloc");
object_class_property_add_link(oc, "prealloc-context",
@@ -539,16 +539,16 @@ host_memory_backend_class_init(ObjectClass *oc, const void *data)
object_property_allow_set_link, OBJ_PROP_LINK_STRONG);
object_class_property_set_description(oc, "prealloc-context",
"Context to use for creating CPU threads for preallocation");
- object_class_property_add(oc, "size", "size",
- host_memory_backend_get_size,
- host_memory_backend_set_size,
- NULL, NULL);
+ object_class_property_add(oc, "size", "size", NULL,
+ host_memory_backend_get_size,
+ host_memory_backend_set_size,
+ NULL, NULL);
object_class_property_set_description(oc, "size",
"Size of the memory region (ex: 500M)");
- object_class_property_add(oc, "host-nodes", "[uint16]",
- host_memory_backend_get_host_nodes,
- host_memory_backend_set_host_nodes,
- NULL, NULL);
+ object_class_property_add(oc, "host-nodes", "[uint16]", NULL,
+ host_memory_backend_get_host_nodes,
+ host_memory_backend_set_host_nodes,
+ NULL, NULL);
object_class_property_set_description(oc, "host-nodes",
"Binds memory to the list of NUMA host nodes");
object_class_property_add_enum(oc, "policy", "HostMemPolicy",
diff --git a/block/throttle-groups.c b/block/throttle-groups.c
index 37814b84fe..cfe2ea67e3 100644
--- a/block/throttle-groups.c
+++ b/block/throttle-groups.c
@@ -984,17 +984,14 @@ static void throttle_group_obj_class_init(ObjectClass *klass,
/* individual properties */
for (i = 0; i < sizeof(properties) / sizeof(ThrottleParamInfo); i++) {
- object_class_property_add(klass,
- properties[i].name,
- "int64",
+ object_class_property_add(klass, properties[i].name, "int64", NULL,
throttle_group_get,
throttle_group_set,
NULL, &properties[i]);
}
/* ThrottleLimits */
- object_class_property_add(klass,
- "limits", "ThrottleLimits",
+ object_class_property_add(klass, "limits", "ThrottleLimits", NULL,
throttle_group_get_limits,
throttle_group_set_limits,
NULL, NULL);
diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index 81bac42a15..6ce9c2a50b 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -1568,7 +1568,7 @@ static void char_socket_class_init(ObjectClass *oc, const void *data)
cc->chr_listener_cleanup = tcp_chr_listener_cleanup;
cc->chr_get_filename = tcp_chr_get_filename;
- object_class_property_add(oc, "addr", "SocketAddress",
+ object_class_property_add(oc, "addr", "SocketAddress", NULL,
char_socket_get_addr, NULL,
NULL, NULL);
diff --git a/crypto/secret_keyring.c b/crypto/secret_keyring.c
index 3b332276ef..e9cb222bf8 100644
--- a/crypto/secret_keyring.c
+++ b/crypto/secret_keyring.c
@@ -107,7 +107,7 @@ qcrypto_secret_keyring_class_init(ObjectClass *oc, const void *data)
QCryptoSecretCommonClass *sic = QCRYPTO_SECRET_COMMON_CLASS(oc);
sic->load_data = qcrypto_secret_keyring_load_data;
- object_class_property_add(oc, "serial", "int32_t",
+ object_class_property_add(oc, "serial", "int32_t", NULL,
qcrypto_secret_prop_get_key,
qcrypto_secret_prop_set_key,
NULL, NULL);
diff --git a/event-loop-base.c b/event-loop-base.c
index 23f554d92c..42bf09d58b 100644
--- a/event-loop-base.c
+++ b/event-loop-base.c
@@ -104,15 +104,15 @@ static void event_loop_base_class_init(ObjectClass *klass,
ucc->complete = event_loop_base_complete;
ucc->prepare_delete = event_loop_base_prepare_delete;
- object_class_property_add(klass, "aio-max-batch", "int64",
+ object_class_property_add(klass, "aio-max-batch", "int64", NULL,
event_loop_base_get_param,
event_loop_base_set_param,
NULL, &aio_max_batch_info);
- object_class_property_add(klass, "thread-pool-min", "int64",
+ object_class_property_add(klass, "thread-pool-min", "int64", NULL,
event_loop_base_get_param,
event_loop_base_set_param,
NULL, &thread_pool_min_info);
- object_class_property_add(klass, "thread-pool-max", "int64",
+ object_class_property_add(klass, "thread-pool-max", "int64", NULL,
event_loop_base_get_param,
event_loop_base_set_param,
NULL, &thread_pool_max_info);
diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c
index 6d421b990c..f3e248c8da 100644
--- a/hw/acpi/ich9.c
+++ b/hw/acpi/ich9.c
@@ -379,7 +379,7 @@ void ich9_pm_add_class_properties(ObjectClass *oc, ptrdiff_t pm_offset)
PM_REG_FIELD(acpi_pci_hotplug.root),
object_property_allow_set_link,
OBJ_PROP_LINK_STRONG);
- object_class_property_add(oc, ACPI_PM_PROP_GPE0_BLK, "uint32",
+ object_class_property_add(oc, ACPI_PM_PROP_GPE0_BLK, "uint32", NULL,
ich9_pm_get_gpe0_blk,
NULL, NULL, NULL);
object_class_property_add_uint8_ptr(oc, ACPI_PM_PROP_S3_DISABLED,
diff --git a/hw/acpi/pci.c b/hw/acpi/pci.c
index c82924be86..abd1071f49 100644
--- a/hw/acpi/pci.c
+++ b/hw/acpi/pci.c
@@ -139,8 +139,8 @@ static void acpi_generic_initiator_class_init(ObjectClass *oc, const void *data)
acpi_generic_initiator_set_pci_device);
object_class_property_set_description(oc, "pci-dev",
"PCI device to associate with the node");
- object_class_property_add(oc, "node", "uint32", NULL,
- acpi_generic_initiator_set_node, NULL, NULL);
+ object_class_property_add(oc, "node", "uint32", NULL, NULL,
+ acpi_generic_initiator_set_node, NULL, NULL);
object_class_property_set_description(oc, "node",
"NUMA node associated with the PCI device");
}
@@ -253,8 +253,8 @@ static void acpi_generic_port_class_init(ObjectClass *oc, const void *data)
acpi_generic_port_set_pci_bus);
object_class_property_set_description(oc, "pci-bus",
"PCI Bus of the host bridge associated with this GP affinity structure");
- object_class_property_add(oc, "node", "uint32", NULL,
- acpi_generic_port_set_node, NULL, NULL);
+ object_class_property_add(oc, "node", "uint32", NULL, NULL,
+ acpi_generic_port_set_node, NULL, NULL);
object_class_property_set_description(oc, "node",
"The NUMA node like ID to index HMAT/SLIT NUMA properties involving GP");
}
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 3ab3ad8c3b..dad3f8c39b 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -4206,9 +4206,9 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
mc->default_ram_id = "mach-virt.ram";
mc->default_nic = "virtio-net-pci";
- object_class_property_add(oc, "acpi", "OnOffAuto",
- virt_get_acpi, virt_set_acpi,
- NULL, NULL);
+ object_class_property_add(oc, "acpi", "OnOffAuto", NULL,
+ virt_get_acpi, virt_set_acpi,
+ NULL, NULL);
object_class_property_set_description(oc, "acpi",
"Enable ACPI");
object_class_property_add_bool(oc, "secure", virt_get_secure,
@@ -4259,7 +4259,7 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
"Set on/off to enable/disable high "
"memory region for PCI MMIO");
- object_class_property_add(oc, "highmem-mmio-size", "size",
+ object_class_property_add(oc, "highmem-mmio-size", "size", NULL,
virt_get_highmem_mmio_size,
virt_set_highmem_mmio_size,
NULL, NULL);
@@ -4267,7 +4267,7 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
"Set the high memory region size "
"for PCI MMIO");
- object_class_property_add(oc, "virtio-mmio-transports", "uint8",
+ object_class_property_add(oc, "virtio-mmio-transports", "uint8", NULL,
virt_get_virtio_transports,
virt_set_virtio_transports,
NULL, NULL);
diff --git a/hw/core/clock.c b/hw/core/clock.c
index 3fc98a0c65..d46c888f5c 100644
--- a/hw/core/clock.c
+++ b/hw/core/clock.c
@@ -185,7 +185,7 @@ static void clock_initfn(Object *obj)
QLIST_INIT(&clk->children);
if (qtest_enabled()) {
- object_property_add(obj, "qtest-clock-period", "uint64",
+ object_property_add(obj, "qtest-clock-period", "uint64", NULL,
clock_period_prop_get, NULL, NULL, NULL);
}
}
diff --git a/hw/core/machine.c b/hw/core/machine.c
index d9ac4b419a..50422750be 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -1118,26 +1118,29 @@ static void machine_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, "dumpdtb",
"Dump current dtb to a file and quit");
- object_class_property_add(oc, "boot", "BootConfiguration",
- machine_get_boot, machine_set_boot,
- NULL, NULL);
+ object_class_property_add(oc, "boot", "BootConfiguration", NULL,
+ machine_get_boot, machine_set_boot,
+ NULL, NULL);
object_class_property_set_description(oc, "boot",
"Boot configuration");
- object_class_property_add(oc, "smp", "SMPConfiguration",
- machine_get_smp, machine_set_smp,
- NULL, NULL);
+ object_class_property_add(oc, "smp", "SMPConfiguration", NULL,
+ machine_get_smp, machine_set_smp,
+ NULL, NULL);
object_class_property_set_description(oc, "smp",
"CPU topology");
object_class_property_add(oc, "smp-cache", "SmpCachePropertiesWrapper",
- machine_get_smp_cache, machine_set_smp_cache, NULL, NULL);
+ NULL,
+ machine_get_smp_cache, machine_set_smp_cache,
+ NULL, NULL);
object_class_property_set_description(oc, "smp-cache",
"Cache properties list for SMP machine");
- object_class_property_add(oc, "phandle-start", "int",
- machine_get_phandle_start, machine_set_phandle_start,
- NULL, NULL);
+ object_class_property_add(oc, "phandle-start", "int", NULL,
+ machine_get_phandle_start,
+ machine_set_phandle_start,
+ NULL, NULL);
object_class_property_set_description(oc, "phandle-start",
"The first phandle ID we may generate dynamically");
@@ -1212,9 +1215,9 @@ static void machine_class_init(ObjectClass *oc, const void *data)
"Set RAM backend"
"Valid value is ID of hostmem based backend");
- object_class_property_add(oc, "memory", "MemorySizeConfiguration",
- machine_get_mem, machine_set_mem,
- NULL, NULL);
+ object_class_property_add(oc, "memory", "MemorySizeConfiguration", NULL,
+ machine_get_mem, machine_set_mem,
+ NULL, NULL);
object_class_property_set_description(oc, "memory",
"Memory size configuration");
}
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 34d7b26a73..61dca80c95 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -1150,7 +1150,7 @@ void qdev_property_add_static(DeviceState *dev, const Property *prop)
assert(!prop->info->create);
- op = object_property_add(obj, prop->name, prop->info->type,
+ op = object_property_add(obj, prop->name, prop->info->type, NULL,
field_prop_getter(prop->info),
field_prop_setter(prop->info),
prop->info->release,
@@ -1176,8 +1176,7 @@ static void qdev_class_add_property(DeviceClass *klass, const char *name,
if (prop->info->create) {
op = prop->info->create(oc, name, prop);
} else {
- op = object_class_property_add(oc,
- name, prop->info->type,
+ op = object_class_property_add(oc, name, prop->info->type, NULL,
field_prop_getter(prop->info),
field_prop_setter(prop->info),
prop->info->release,
diff --git a/hw/cpu/core.c b/hw/cpu/core.c
index 26e488f3d8..f430befad8 100644
--- a/hw/cpu/core.c
+++ b/hw/cpu/core.c
@@ -82,9 +82,11 @@ static void cpu_core_class_init(ObjectClass *oc, const void *data)
DeviceClass *dc = DEVICE_CLASS(oc);
set_bit(DEVICE_CATEGORY_CPU, dc->categories);
- object_class_property_add(oc, "core-id", "int", core_prop_get_core_id,
+ object_class_property_add(oc, "core-id", "int", NULL,
+ core_prop_get_core_id,
core_prop_set_core_id, NULL, NULL);
- object_class_property_add(oc, "nr-threads", "int", core_prop_get_nr_threads,
+ object_class_property_add(oc, "nr-threads", "int", NULL,
+ core_prop_get_nr_threads,
core_prop_set_nr_threads, NULL, NULL);
}
diff --git a/hw/cxl/cxl-host.c b/hw/cxl/cxl-host.c
index e279ce5fe3..2ddff574d1 100644
--- a/hw/cxl/cxl-host.c
+++ b/hw/cxl/cxl-host.c
@@ -610,13 +610,13 @@ static void machine_set_cfmw(Object *obj, Visitor *v, const char *name,
void cxl_machine_init(Object *obj, CXLState *state)
{
- object_property_add(obj, "cxl", "bool", machine_get_cxl,
+ object_property_add(obj, "cxl", "bool", NULL, machine_get_cxl,
machine_set_cxl, NULL, state);
object_property_set_description(obj, "cxl",
"Set on/off to enable/disable "
"CXL instantiation");
- object_property_add(obj, "cxl-fmw", "CXLFixedMemoryWindow",
+ object_property_add(obj, "cxl-fmw", "CXLFixedMemoryWindow", NULL,
machine_get_cfmw, machine_set_cfmw,
NULL, state);
object_property_set_description(obj, "cxl-fmw",
diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
index 1cf6f5df55..4463cf7c9f 100644
--- a/hw/gpio/aspeed_gpio.c
+++ b/hw/gpio/aspeed_gpio.c
@@ -1481,7 +1481,7 @@ static void aspeed_gpio_init(Object *obj)
int pin_idx = j % GPIOS_PER_GROUP;
const char *group = &props->group_label[group_idx][0];
char *name = g_strdup_printf("gpio%s%d", group, pin_idx);
- object_property_add(obj, name, "bool", aspeed_gpio_get_pin,
+ object_property_add(obj, name, "bool", NULL, aspeed_gpio_get_pin,
aspeed_gpio_set_pin, NULL, NULL);
g_free(name);
}
@@ -1489,8 +1489,8 @@ static void aspeed_gpio_init(Object *obj)
for (int i = 0; i < agc->nr_gpio_sets; i++) {
g_autofree char *name = g_strdup_printf("gpio-set[%d]", i);
- object_property_add(obj, name, "uint32", aspeed_gpio_get_set,
- aspeed_gpio_set_set, NULL, NULL);
+ object_property_add(obj, name, "uint32", NULL, aspeed_gpio_get_set,
+ aspeed_gpio_set_set, NULL, NULL);
}
}
diff --git a/hw/gpio/aspeed_sgpio.c b/hw/gpio/aspeed_sgpio.c
index 7d2f736995..aeaef4f102 100644
--- a/hw/gpio/aspeed_sgpio.c
+++ b/hw/gpio/aspeed_sgpio.c
@@ -300,7 +300,7 @@ static void aspeed_sgpio_init(Object *obj)
{
for (int i = 0; i < ASPEED_SGPIO_MAX_PIN_PAIR * 2; i++) {
g_autofree char *name = g_strdup_printf("sgpio%03d", i);
- object_property_add(obj, name, "bool", aspeed_sgpio_get_pin,
+ object_property_add(obj, name, "bool", NULL, aspeed_sgpio_get_pin,
aspeed_sgpio_set_pin, NULL, NULL);
}
}
diff --git a/hw/gpio/pca9552.c b/hw/gpio/pca9552.c
index 719149b717..7e5fda4980 100644
--- a/hw/gpio/pca9552.c
+++ b/hw/gpio/pca9552.c
@@ -567,12 +567,12 @@ static void pca955x_initfn(Object *obj)
if (k->has_led_support) {
/* LED variant: expose the LED selector state as led%d. */
name = g_strdup_printf("led%d", ix);
- object_property_add(obj, name, "bool",
+ object_property_add(obj, name, "bool", NULL,
pca955x_get_led, pca955x_set_led, NULL, NULL);
} else {
/* GPIO variant: expose the pin logic level as pin%d. */
name = g_strdup_printf("pin%d", ix);
- object_property_add(obj, name, "str",
+ object_property_add(obj, name, "str", NULL,
pca955x_get_pin, pca955x_set_pin, NULL, NULL);
}
g_free(name);
diff --git a/hw/gpio/pca9554.c b/hw/gpio/pca9554.c
index 904698cdce..0dd063f93a 100644
--- a/hw/gpio/pca9554.c
+++ b/hw/gpio/pca9554.c
@@ -280,7 +280,8 @@ static void pca9554_initfn(Object *obj)
char *name;
name = g_strdup_printf("pin%d", pin);
- object_property_add(obj, name, "str", pca9554_get_pin, pca9554_set_pin,
+ object_property_add(obj, name, "str", NULL, pca9554_get_pin,
+ pca9554_set_pin,
NULL, NULL);
g_free(name);
}
diff --git a/hw/gpio/stm32l4x5_gpio.c b/hw/gpio/stm32l4x5_gpio.c
index 92fa397fba..a31999323a 100644
--- a/hw/gpio/stm32l4x5_gpio.c
+++ b/hw/gpio/stm32l4x5_gpio.c
@@ -409,10 +409,10 @@ static void stm32l4x5_gpio_init(Object *obj)
s->clk = qdev_init_clock_in(DEVICE(s), "clk", NULL, s, 0);
- object_property_add(obj, "disconnected-pins", "uint16",
+ object_property_add(obj, "disconnected-pins", "uint16", NULL,
disconnected_pins_get, disconnected_pins_set,
NULL, &s->disconnected_pins);
- object_property_add(obj, "clock-freq-hz", "uint32",
+ object_property_add(obj, "clock-freq-hz", "uint32", NULL,
clock_freq_get, NULL, NULL, NULL);
}
diff --git a/hw/hexagon/hexagon_dsp.c b/hw/hexagon/hexagon_dsp.c
index 05b95f39aa..abccf10c00 100644
--- a/hw/hexagon/hexagon_dsp.c
+++ b/hw/hexagon/hexagon_dsp.c
@@ -153,7 +153,7 @@ static void hexagon_sim_set_subsystem_base(Object *obj, Visitor *v,
static void add_dsp_properties(ObjectClass *oc)
{
- object_class_property_add(oc, "subsystem-base", "uint32",
+ object_class_property_add(oc, "subsystem-base", "uint32", NULL,
hexagon_sim_get_subsystem_base,
hexagon_sim_set_subsystem_base, NULL, NULL);
object_class_property_set_description(oc, "subsystem-base",
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index a49de33749..c679b3b177 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -673,21 +673,21 @@ static void microvm_class_init(ObjectClass *oc, const void *data)
hc->unplug_request = microvm_device_unplug_request_cb;
hc->unplug = microvm_device_unplug_cb;
- object_class_property_add(oc, MICROVM_MACHINE_RTC, "OnOffAuto",
+ object_class_property_add(oc, MICROVM_MACHINE_RTC, "OnOffAuto", NULL,
microvm_machine_get_rtc,
microvm_machine_set_rtc,
NULL, NULL);
object_class_property_set_description(oc, MICROVM_MACHINE_RTC,
"Enable MC146818 RTC");
- object_class_property_add(oc, MICROVM_MACHINE_PCIE, "OnOffAuto",
+ object_class_property_add(oc, MICROVM_MACHINE_PCIE, "OnOffAuto", NULL,
microvm_machine_get_pcie,
microvm_machine_set_pcie,
NULL, NULL);
object_class_property_set_description(oc, MICROVM_MACHINE_PCIE,
"Enable PCIe");
- object_class_property_add(oc, MICROVM_MACHINE_IOAPIC2, "OnOffAuto",
+ object_class_property_add(oc, MICROVM_MACHINE_IOAPIC2, "OnOffAuto", NULL,
microvm_machine_get_ioapic2,
microvm_machine_set_ioapic2,
NULL, NULL);
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index dbfd55de30..1fce96f5ec 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1722,15 +1722,16 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
mc->default_ram_id = "pc.ram";
pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_AUTO;
- object_class_property_add(oc, PC_MACHINE_MAX_RAM_BELOW_4G, "size",
- pc_machine_get_max_ram_below_4g, pc_machine_set_max_ram_below_4g,
- NULL, NULL);
+ object_class_property_add(oc, PC_MACHINE_MAX_RAM_BELOW_4G, "size", NULL,
+ pc_machine_get_max_ram_below_4g,
+ pc_machine_set_max_ram_below_4g,
+ NULL, NULL);
object_class_property_set_description(oc, PC_MACHINE_MAX_RAM_BELOW_4G,
"Maximum ram below the 4G boundary (32bit boundary)");
- object_class_property_add(oc, PC_MACHINE_VMPORT, "OnOffAuto",
- pc_machine_get_vmport, pc_machine_set_vmport,
- NULL, NULL);
+ object_class_property_add(oc, PC_MACHINE_VMPORT, "OnOffAuto", NULL,
+ pc_machine_get_vmport, pc_machine_set_vmport,
+ NULL, NULL);
object_class_property_set_description(oc, PC_MACHINE_VMPORT,
"Enable vmport (pc & q35)");
@@ -1758,15 +1759,17 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
pc_machine_get_default_bus_bypass_iommu,
pc_machine_set_default_bus_bypass_iommu);
- object_class_property_add(oc, PC_MACHINE_MAX_FW_SIZE, "size",
- pc_machine_get_max_fw_size, pc_machine_set_max_fw_size,
- NULL, NULL);
+ object_class_property_add(oc, PC_MACHINE_MAX_FW_SIZE, "size", NULL,
+ pc_machine_get_max_fw_size,
+ pc_machine_set_max_fw_size,
+ NULL, NULL);
object_class_property_set_description(oc, PC_MACHINE_MAX_FW_SIZE,
"Maximum combined firmware size");
- object_class_property_add(oc, PC_MACHINE_SMBIOS_EP, "str",
- pc_machine_get_smbios_ep, pc_machine_set_smbios_ep,
- NULL, NULL);
+ object_class_property_add(oc, PC_MACHINE_SMBIOS_EP, "str", NULL,
+ pc_machine_get_smbios_ep,
+ pc_machine_set_smbios_ep,
+ NULL, NULL);
object_class_property_set_description(oc, PC_MACHINE_SMBIOS_EP,
"SMBIOS Entry Point type [32, 64]");
diff --git a/hw/i386/sgx-epc.c b/hw/i386/sgx-epc.c
index 29cda843c9..a1b55c2ec3 100644
--- a/hw/i386/sgx-epc.c
+++ b/hw/i386/sgx-epc.c
@@ -159,7 +159,7 @@ static void sgx_epc_class_init(ObjectClass *oc, const void *data)
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",
+ object_class_property_add(oc, SGX_EPC_SIZE_PROP, "uint64", NULL,
sgx_epc_get_size,
NULL,
NULL, NULL);
diff --git a/hw/i386/x86.c b/hw/i386/x86.c
index f8ba3244e2..1b7740a97e 100644
--- a/hw/i386/x86.c
+++ b/hw/i386/x86.c
@@ -391,26 +391,26 @@ static void x86_machine_class_init(ObjectClass *oc, const void *data)
mc->kvm_type = x86_kvm_type;
nc->raise_nmi = x86_nmi;
- object_class_property_add(oc, X86_MACHINE_SMM, "OnOffAuto",
- x86_machine_get_smm, x86_machine_set_smm,
- NULL, NULL);
+ object_class_property_add(oc, X86_MACHINE_SMM, "OnOffAuto", NULL,
+ x86_machine_get_smm, x86_machine_set_smm,
+ NULL, NULL);
object_class_property_set_description(oc, X86_MACHINE_SMM,
"Enable SMM");
- object_class_property_add(oc, X86_MACHINE_ACPI, "OnOffAuto",
- x86_machine_get_acpi, x86_machine_set_acpi,
- NULL, NULL);
+ object_class_property_add(oc, X86_MACHINE_ACPI, "OnOffAuto", NULL,
+ x86_machine_get_acpi, x86_machine_set_acpi,
+ NULL, NULL);
object_class_property_set_description(oc, X86_MACHINE_ACPI,
"Enable ACPI");
- object_class_property_add(oc, X86_MACHINE_PIT, "OnOffAuto",
+ object_class_property_add(oc, X86_MACHINE_PIT, "OnOffAuto", NULL,
x86_machine_get_pit,
x86_machine_set_pit,
NULL, NULL);
object_class_property_set_description(oc, X86_MACHINE_PIT,
"Enable i8254 PIT");
- object_class_property_add(oc, X86_MACHINE_PIC, "OnOffAuto",
+ object_class_property_add(oc, X86_MACHINE_PIC, "OnOffAuto", NULL,
x86_machine_get_pic,
x86_machine_set_pic,
NULL, NULL);
@@ -435,14 +435,15 @@ static void x86_machine_class_init(ObjectClass *oc, const void *data)
"The string may be up to 8 bytes in size");
object_class_property_add(oc, X86_MACHINE_BUS_LOCK_RATELIMIT, "uint64_t",
+ NULL,
x86_machine_get_bus_lock_ratelimit,
x86_machine_set_bus_lock_ratelimit, NULL, NULL);
object_class_property_set_description(oc, X86_MACHINE_BUS_LOCK_RATELIMIT,
"Set the ratelimit for the bus locks acquired in VMs");
- object_class_property_add(oc, "sgx-epc", "SgxEPC",
- machine_get_sgx_epc, machine_set_sgx_epc,
- NULL, NULL);
+ object_class_property_add(oc, "sgx-epc", "SgxEPC", NULL,
+ machine_get_sgx_epc, machine_set_sgx_epc,
+ NULL, NULL);
object_class_property_set_description(oc, "sgx-epc",
"SGX EPC device");
}
diff --git a/hw/ide/ide-dev.c b/hw/ide/ide-dev.c
index 5d478588c6..7bb06088a5 100644
--- a/hw/ide/ide-dev.c
+++ b/hw/ide/ide-dev.c
@@ -174,7 +174,7 @@ out:
static void ide_dev_instance_init(Object *obj)
{
- object_property_add(obj, "bootindex", "int32",
+ object_property_add(obj, "bootindex", "int32", NULL,
ide_dev_get_bootindex,
ide_dev_set_bootindex, NULL, NULL);
object_property_set_int(obj, "bootindex", -1, NULL);
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
index 0f0f37d457..ee5f6cb4c3 100644
--- a/hw/intc/apic_common.c
+++ b/hw/intc/apic_common.c
@@ -442,7 +442,7 @@ static void apic_common_initfn(Object *obj)
APICCommonState *s = APIC_COMMON(obj);
s->id = s->initial_apic_id = -1;
- object_property_add(obj, "id", "uint32",
+ object_property_add(obj, "id", "uint32", NULL,
apic_common_get_id,
apic_common_set_id, NULL, NULL);
}
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 9c5371af9d..8ad327b8dd 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -1483,18 +1483,18 @@ static void virt_class_init(ObjectClass *oc, const void *data)
hc->unplug_request = virt_device_unplug_request;
hc->unplug = virt_device_unplug;
- object_class_property_add(oc, "acpi", "OnOffAuto",
- virt_get_acpi, virt_set_acpi,
- NULL, NULL);
+ object_class_property_add(oc, "acpi", "OnOffAuto", NULL,
+ virt_get_acpi, virt_set_acpi,
+ NULL, NULL);
object_class_property_set_description(oc, "acpi",
"Enable ACPI");
- object_class_property_add(oc, "v-eiointc", "OnOffAuto",
- virt_get_veiointc, virt_set_veiointc,
- NULL, NULL);
+ object_class_property_add(oc, "v-eiointc", "OnOffAuto", NULL,
+ virt_get_veiointc, virt_set_veiointc,
+ NULL, NULL);
object_class_property_set_description(oc, "v-eiointc",
"Enable Virt Extend I/O Interrupt Controller.");
- object_class_property_add(oc, "dmsi", "OnOffAuto",
- virt_get_dmsi, virt_set_dmsi, NULL, NULL);
+ object_class_property_add(oc, "dmsi", "OnOffAuto", NULL,
+ virt_get_dmsi, virt_set_dmsi, NULL, NULL);
object_class_property_set_description(oc, "dmsi",
"Enable direct Message-interrupts Controller.");
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
@@ -1525,7 +1525,7 @@ static void virt_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, "highmem-mmio",
"Set on/off to enable/disable high "
"memory region for PCI MMIO");
- object_class_property_add(oc, "highmem-mmio-size", "size",
+ object_class_property_add(oc, "highmem-mmio-size", "size", NULL,
virt_get_highmem_mmio_size,
virt_set_highmem_mmio_size,
NULL, NULL);
diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
index cf8a4d8c5f..8d6e8d0bd9 100644
--- a/hw/mem/nvdimm.c
+++ b/hw/mem/nvdimm.c
@@ -99,11 +99,12 @@ static void nvdimm_set_uuid(Object *obj, Visitor *v, const char *name,
static void nvdimm_init(Object *obj)
{
- object_property_add(obj, NVDIMM_LABEL_SIZE_PROP, "size",
+ object_property_add(obj, NVDIMM_LABEL_SIZE_PROP, "size", NULL,
nvdimm_get_label_size, nvdimm_set_label_size, NULL,
NULL);
- object_property_add(obj, NVDIMM_UUID_PROP, "QemuUUID", nvdimm_get_uuid,
+ object_property_add(obj, NVDIMM_UUID_PROP, "QemuUUID", NULL,
+ nvdimm_get_uuid,
nvdimm_set_uuid, NULL, NULL);
}
diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
index 68862926ee..7250146c10 100644
--- a/hw/mem/pc-dimm.c
+++ b/hw/mem/pc-dimm.c
@@ -176,7 +176,8 @@ static void pc_dimm_get_size(Object *obj, Visitor *v, const char *name,
static void pc_dimm_init(Object *obj)
{
- object_property_add(obj, PC_DIMM_SIZE_PROP, "uint64", pc_dimm_get_size,
+ object_property_add(obj, PC_DIMM_SIZE_PROP, "uint64", NULL,
+ pc_dimm_get_size,
NULL, NULL, NULL);
}
diff --git a/hw/misc/aspeed_lpc.c b/hw/misc/aspeed_lpc.c
index 7f7e4f1a09..a73df07332 100644
--- a/hw/misc/aspeed_lpc.c
+++ b/hw/misc/aspeed_lpc.c
@@ -417,29 +417,41 @@ static void aspeed_lpc_realize(DeviceState *dev, Error **errp)
static void aspeed_lpc_init(Object *obj)
{
- object_property_add(obj, "idr1", "uint32", aspeed_kcs_get_register_property,
+ object_property_add(obj, "idr1", "uint32", NULL,
+ aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "odr1", "uint32", aspeed_kcs_get_register_property,
+ object_property_add(obj, "odr1", "uint32", NULL,
+ aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "str1", "uint32", aspeed_kcs_get_register_property,
+ object_property_add(obj, "str1", "uint32", NULL,
+ aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "idr2", "uint32", aspeed_kcs_get_register_property,
+ object_property_add(obj, "idr2", "uint32", NULL,
+ aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "odr2", "uint32", aspeed_kcs_get_register_property,
+ object_property_add(obj, "odr2", "uint32", NULL,
+ aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "str2", "uint32", aspeed_kcs_get_register_property,
+ object_property_add(obj, "str2", "uint32", NULL,
+ aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "idr3", "uint32", aspeed_kcs_get_register_property,
+ object_property_add(obj, "idr3", "uint32", NULL,
+ aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "odr3", "uint32", aspeed_kcs_get_register_property,
+ object_property_add(obj, "odr3", "uint32", NULL,
+ aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "str3", "uint32", aspeed_kcs_get_register_property,
+ object_property_add(obj, "str3", "uint32", NULL,
+ aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "idr4", "uint32", aspeed_kcs_get_register_property,
+ object_property_add(obj, "idr4", "uint32", NULL,
+ aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "odr4", "uint32", aspeed_kcs_get_register_property,
+ object_property_add(obj, "odr4", "uint32", NULL,
+ aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "str4", "uint32", aspeed_kcs_get_register_property,
+ object_property_add(obj, "str4", "uint32", NULL,
+ aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
}
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
index f8fbaebee6..427816b838 100644
--- a/hw/misc/aspeed_sdmc.c
+++ b/hw/misc/aspeed_sdmc.c
@@ -259,7 +259,7 @@ static void aspeed_sdmc_set_ram_size(Object *obj, Visitor *v, const char *name,
static void aspeed_sdmc_initfn(Object *obj)
{
- object_property_add(obj, "ram-size", "int",
+ object_property_add(obj, "ram-size", "int", NULL,
aspeed_sdmc_get_ram_size, aspeed_sdmc_set_ram_size,
NULL, NULL);
}
diff --git a/hw/misc/npcm7xx_mft.c b/hw/misc/npcm7xx_mft.c
index 742166c4e8..3ce92fad3a 100644
--- a/hw/misc/npcm7xx_mft.c
+++ b/hw/misc/npcm7xx_mft.c
@@ -491,7 +491,7 @@ static void npcm7xx_mft_init(Object *obj)
s->clock_2 = qdev_init_clock_out(dev, "clock2");
for (int i = 0; i < NPCM7XX_PWM_PER_MODULE; ++i) {
- object_property_add(obj, "max_rpm[*]", "uint32",
+ object_property_add(obj, "max_rpm[*]", "uint32", NULL,
npcm7xx_mft_get_max_rpm,
npcm7xx_mft_set_max_rpm,
NULL, &s->max_rpm[i]);
diff --git a/hw/net/ne2000-isa.c b/hw/net/ne2000-isa.c
index 673c785abc..02300eaaa6 100644
--- a/hw/net/ne2000-isa.c
+++ b/hw/net/ne2000-isa.c
@@ -131,7 +131,7 @@ out:
static void isa_ne2000_instance_init(Object *obj)
{
- object_property_add(obj, "bootindex", "int32",
+ object_property_add(obj, "bootindex", "int32", NULL,
isa_ne2000_get_bootindex,
isa_ne2000_set_bootindex, NULL, NULL);
object_property_set_int(obj, "bootindex", -1, NULL);
diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c
index 578421c217..405010af4b 100644
--- a/hw/nvme/ctrl.c
+++ b/hw/nvme/ctrl.c
@@ -10612,7 +10612,7 @@ static void nvme_instance_init(Object *obj)
"bootindex", "/namespace@1,0",
DEVICE(obj));
- object_property_add(obj, "smart_critical_warning", "uint8",
+ object_property_add(obj, "smart_critical_warning", "uint8", NULL,
nvme_get_smart_warning,
nvme_set_smart_warning, NULL, NULL);
}
diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c
index 40ffbc4e08..1b22f5e383 100644
--- a/hw/pci-bridge/pci_expander_bridge.c
+++ b/hw/pci-bridge/pci_expander_bridge.c
@@ -103,7 +103,7 @@ static void pxb_bus_class_init(ObjectClass *class, const void *data)
pbc->bus_num = pxb_bus_num;
pbc->numa_node = pxb_bus_numa_node;
- object_class_property_add(class, "acpi_uid", "uint32",
+ object_class_property_add(class, "acpi_uid", "uint32", NULL,
prop_pxb_uid_get, NULL, NULL, NULL);
object_class_property_set_description(class, "acpi_uid",
"ACPI Unique ID used to distinguish this PCI Host Bridge / ACPI00016");
diff --git a/hw/pci-host/i440fx.c b/hw/pci-host/i440fx.c
index c1982f7962..bf4b6c4253 100644
--- a/hw/pci-host/i440fx.c
+++ b/hw/pci-host/i440fx.c
@@ -388,18 +388,22 @@ static void i440fx_pcihost_class_init(ObjectClass *klass, const void *data)
dc->user_creatable = false;
object_class_property_add(klass, PCI_HOST_PROP_PCI_HOLE_START, "uint32",
+ NULL,
i440fx_pcihost_get_pci_hole_start,
NULL, NULL, NULL);
object_class_property_add(klass, PCI_HOST_PROP_PCI_HOLE_END, "uint32",
+ NULL,
i440fx_pcihost_get_pci_hole_end,
NULL, NULL, NULL);
object_class_property_add(klass, PCI_HOST_PROP_PCI_HOLE64_START, "uint64",
+ NULL,
i440fx_pcihost_get_pci_hole64_start,
NULL, NULL, NULL);
object_class_property_add(klass, PCI_HOST_PROP_PCI_HOLE64_END, "uint64",
+ NULL,
i440fx_pcihost_get_pci_hole64_end,
NULL, NULL, NULL);
}
diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c
index db061c134e..c45401d9dd 100644
--- a/hw/pci-host/pnv_phb3.c
+++ b/hw/pci-host/pnv_phb3.c
@@ -1164,12 +1164,12 @@ static void pnv_phb3_root_bus_class_init(ObjectClass *klass, const void *data)
{
BusClass *k = BUS_CLASS(klass);
- object_class_property_add(klass, "phb-id", "uint32",
+ object_class_property_add(klass, "phb-id", "uint32", NULL,
pnv_phb3_root_bus_get_prop,
pnv_phb3_root_bus_set_prop,
NULL, NULL);
- object_class_property_add(klass, "chip-id", "uint32",
+ object_class_property_add(klass, "chip-id", "uint32", NULL,
pnv_phb3_root_bus_get_prop,
pnv_phb3_root_bus_set_prop,
NULL, NULL);
diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c
index ac09a0b034..6a5d1bb227 100644
--- a/hw/pci-host/pnv_phb4.c
+++ b/hw/pci-host/pnv_phb4.c
@@ -1775,12 +1775,12 @@ static void pnv_phb4_root_bus_class_init(ObjectClass *klass, const void *data)
{
BusClass *k = BUS_CLASS(klass);
- object_class_property_add(klass, "phb-id", "uint32",
+ object_class_property_add(klass, "phb-id", "uint32", NULL,
pnv_phb4_root_bus_get_prop,
pnv_phb4_root_bus_set_prop,
NULL, NULL);
- object_class_property_add(klass, "chip-id", "uint32",
+ object_class_property_add(klass, "chip-id", "uint32", NULL,
pnv_phb4_root_bus_get_prop,
pnv_phb4_root_bus_set_prop,
NULL, NULL);
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index f4556ad03a..027ae02066 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -226,19 +226,19 @@ static void q35_host_initfn(Object *obj)
qdev_prop_set_uint64(DEVICE(s), PCI_HOST_PROP_PCI_HOLE64_SIZE,
Q35_PCI_HOST_HOLE64_SIZE_DEFAULT);
- object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_START, "uint32",
+ object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_START, "uint32", NULL,
q35_host_get_pci_hole_start,
NULL, NULL, NULL);
- object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_END, "uint32",
+ object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_END, "uint32", NULL,
q35_host_get_pci_hole_end,
NULL, NULL, NULL);
- object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_START, "uint64",
+ object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_START, "uint64", NULL,
q35_host_get_pci_hole64_start,
NULL, NULL, NULL);
- object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_END, "uint64",
+ object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_END, "uint64", NULL,
q35_host_get_pci_hole64_end,
NULL, NULL, NULL);
diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
index 0d659e9b02..b8c48bca8a 100644
--- a/hw/ppc/spapr_caps.c
+++ b/hw/ppc/spapr_caps.c
@@ -1069,7 +1069,7 @@ void spapr_caps_add_properties(SpaprMachineClass *smc)
g_autofree char *name = g_strdup_printf("cap-%s", cap->name);
g_autofree char *desc = g_strdup(cap->description);
- object_class_property_add(klass, name, cap->type,
+ object_class_property_add(klass, name, cap->type, NULL,
cap->get, cap->set,
NULL, cap);
diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
index 5c2150b71c..a33f0949d1 100644
--- a/hw/ppc/spapr_drc.c
+++ b/hw/ppc/spapr_drc.c
@@ -584,9 +584,9 @@ static void spapr_dr_connector_instance_init(Object *obj)
SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
object_property_add_uint32_ptr(obj, "id", &drc->id, OBJ_PROP_FLAG_READ);
- object_property_add(obj, "index", "uint32", prop_get_index,
+ object_property_add(obj, "index", "uint32", NULL, prop_get_index,
NULL, NULL, NULL);
- object_property_add(obj, "fdt", "struct", prop_get_fdt,
+ object_property_add(obj, "fdt", "struct", NULL, prop_get_fdt,
NULL, NULL, NULL);
drc->state = drck->empty_state;
}
diff --git a/hw/remote/vfio-user-obj.c b/hw/remote/vfio-user-obj.c
index a0498d218f..c4b3cb0b7b 100644
--- a/hw/remote/vfio-user-obj.c
+++ b/hw/remote/vfio-user-obj.c
@@ -931,7 +931,7 @@ static void vfu_object_class_init(ObjectClass *klass, const void *data)
k->nr_devs = 0;
- object_class_property_add(klass, "socket", "SocketAddress", NULL,
+ object_class_property_add(klass, "socket", "SocketAddress", NULL, NULL,
vfu_object_set_socket, NULL, NULL);
object_class_property_set_description(klass, "socket",
"SocketAddress "
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
index edd29626fa..04c48a4eda 100644
--- a/hw/riscv/microchip_pfsoc.c
+++ b/hw/riscv/microchip_pfsoc.c
@@ -744,6 +744,7 @@ static void microchip_icicle_kit_machine_class_init(ObjectClass *oc,
mc->default_ram_size = 1537 * MiB;
object_class_property_add(oc, "clint-timebase-frequency", "uint32_t",
+ NULL,
microchip_icicle_kit_get_clint_timebase_freq,
microchip_icicle_kit_set_clint_timebase_freq,
NULL, NULL);
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index de1c92463a..65f4c67bff 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -1184,13 +1184,13 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, "aia-guests", str);
}
- object_class_property_add(oc, "acpi", "OnOffAuto",
+ object_class_property_add(oc, "acpi", "OnOffAuto", NULL,
virt_get_acpi, virt_set_acpi,
NULL, NULL);
object_class_property_set_description(oc, "acpi",
"Enable ACPI");
- object_class_property_add(oc, "iommu-sys", "OnOffAuto",
+ object_class_property_add(oc, "iommu-sys", "OnOffAuto", NULL,
virt_get_iommu_sys, virt_set_iommu_sys,
NULL, NULL);
object_class_property_set_description(oc, "iommu-sys",
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index fda5ecc9ad..7d4392d73f 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -908,7 +908,7 @@ static void ccw_machine_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, "dea-key-wrap",
"enable/disable DEA key wrapping using the CPACF wrapping key");
- object_class_property_add(oc, "loadparm", "loadparm",
+ object_class_property_add(oc, "loadparm", "loadparm", NULL,
machine_get_loadparm, machine_set_loadparm,
NULL, NULL);
object_class_property_set_description(oc, "loadparm",
@@ -916,7 +916,7 @@ static void ccw_machine_class_init(ObjectClass *oc, const void *data)
" to upper case) to pass to machine loader, boot manager,"
" and guest kernel");
- object_class_property_add(oc, "boot-certs", "BootCertificatesList",
+ object_class_property_add(oc, "boot-certs", "BootCertificatesList", NULL,
machine_get_boot_certs, machine_set_boot_certs, NULL, NULL);
object_class_property_set_description(oc, "boot-certs",
"provide paths to a directory and/or a certificate file for secure boot");
diff --git a/hw/s390x/sclpcpi.c b/hw/s390x/sclpcpi.c
index ec4bdf2350..90cb36aad6 100644
--- a/hw/s390x/sclpcpi.c
+++ b/hw/s390x/sclpcpi.c
@@ -195,12 +195,14 @@ static void cpi_class_init(ObjectClass *klass, const void *data)
"name of the cluster which the VM belongs to, if any"
" e.g. \"PLEX \"");
- object_class_property_add(klass, "system_level", "uint64", get_system_level,
+ object_class_property_add(klass, "system_level", "uint64", NULL,
+ get_system_level,
NULL, NULL, NULL);
object_class_property_set_description(klass, "system_level",
"distribution and kernel version in Linux e.g. 74872343805430528");
- object_class_property_add(klass, "timestamp", "uint64", get_timestamp,
+ object_class_property_add(klass, "timestamp", "uint64", NULL,
+ get_timestamp,
NULL, NULL, NULL);
object_class_property_set_description(klass, "timestamp",
"latest update of CPI data in nanoseconds since the UNIX EPOCH");
diff --git a/hw/s390x/virtio-ccw-mem.c b/hw/s390x/virtio-ccw-mem.c
index dea30aacfb..1dc19ca914 100644
--- a/hw/s390x/virtio-ccw-mem.c
+++ b/hw/s390x/virtio-ccw-mem.c
@@ -205,7 +205,7 @@ static void virtio_ccw_mem_instance_init(Object *obj)
OBJECT(&dev->vdev), VIRTIO_MEM_BLOCK_SIZE_PROP);
object_property_add_alias(obj, VIRTIO_MEM_SIZE_PROP, OBJECT(&dev->vdev),
VIRTIO_MEM_SIZE_PROP);
- object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size",
+ object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size", NULL,
virtio_ccw_mem_get_requested_size,
virtio_ccw_mem_set_requested_size, NULL, NULL);
}
diff --git a/hw/sensor/adc128d818.c b/hw/sensor/adc128d818.c
index c65508cba1..14d79d3958 100644
--- a/hw/sensor/adc128d818.c
+++ b/hw/sensor/adc128d818.c
@@ -642,14 +642,16 @@ static void adc128d818_initfn(Object *obj)
for (unsigned ch = 0u; ch < ADC128D818_NUM_CHANNELS; ch++) {
char *name = g_strdup_printf("ain%u", ch);
- object_property_add(obj, name, "int", adc128d818_get_ain,
+ object_property_add(obj, name, "int", NULL, adc128d818_get_ain,
adc128d818_set_ain, NULL, NULL);
g_free(name);
}
- object_property_add(obj, "temperature", "int", adc128d818_get_temperature,
+ object_property_add(obj, "temperature", "int", NULL,
+ adc128d818_get_temperature,
adc128d818_set_temperature, NULL, NULL);
- object_property_add(obj, "ext-vref-mv", "int", adc128d818_get_ext_vref,
+ object_property_add(obj, "ext-vref-mv", "int", NULL,
+ adc128d818_get_ext_vref,
adc128d818_set_ext_vref, NULL, NULL);
}
diff --git a/hw/sensor/adm1266.c b/hw/sensor/adm1266.c
index 37d1cffd57..7927845e32 100644
--- a/hw/sensor/adm1266.c
+++ b/hw/sensor/adm1266.c
@@ -217,7 +217,7 @@ static void adm1266_init(Object *obj)
for (int i = 0; i < ADM1266_NUM_PAGES; i++) {
pmbus_page_config(pmdev, i, flags);
- object_property_add(obj, "vout[*]", "uint16",
+ object_property_add(obj, "vout[*]", "uint16", NULL,
adm1266_get,
adm1266_set, NULL, &pmdev->pages[i].read_vout);
}
diff --git a/hw/sensor/adm1272.c b/hw/sensor/adm1272.c
index 0aa2a86556..6a7ff02617 100644
--- a/hw/sensor/adm1272.c
+++ b/hw/sensor/adm1272.c
@@ -493,19 +493,19 @@ static void adm1272_init(Object *obj)
pmbus_page_config(pmdev, 0, flags);
- object_property_add(obj, "vin", "uint16",
+ object_property_add(obj, "vin", "uint16", NULL,
adm1272_get,
adm1272_set, NULL, &pmdev->pages[0].read_vin);
- object_property_add(obj, "vout", "uint16",
+ object_property_add(obj, "vout", "uint16", NULL,
adm1272_get,
adm1272_set, NULL, &pmdev->pages[0].read_vout);
- object_property_add(obj, "iout", "uint16",
+ object_property_add(obj, "iout", "uint16", NULL,
adm1272_get,
adm1272_set, NULL, &pmdev->pages[0].read_iout);
- object_property_add(obj, "pin", "uint16",
+ object_property_add(obj, "pin", "uint16", NULL,
adm1272_get,
adm1272_set, NULL, &pmdev->pages[0].read_pin);
diff --git a/hw/sensor/emc141x.c b/hw/sensor/emc141x.c
index a51fc44395..128d721b7b 100644
--- a/hw/sensor/emc141x.c
+++ b/hw/sensor/emc141x.c
@@ -251,16 +251,16 @@ static void emc141x_reset(DeviceState *dev)
static void emc141x_initfn(Object *obj)
{
- object_property_add(obj, "temperature0", "int",
+ object_property_add(obj, "temperature0", "int", NULL,
emc141x_get_temperature,
emc141x_set_temperature, NULL, NULL);
- object_property_add(obj, "temperature1", "int",
+ object_property_add(obj, "temperature1", "int", NULL,
emc141x_get_temperature,
emc141x_set_temperature, NULL, NULL);
- object_property_add(obj, "temperature2", "int",
+ object_property_add(obj, "temperature2", "int", NULL,
emc141x_get_temperature,
emc141x_set_temperature, NULL, NULL);
- object_property_add(obj, "temperature3", "int",
+ object_property_add(obj, "temperature3", "int", NULL,
emc141x_get_temperature,
emc141x_set_temperature, NULL, NULL);
}
diff --git a/hw/sensor/isl_pmbus_vr.c b/hw/sensor/isl_pmbus_vr.c
index 0fad04def7..1af0f2af35 100644
--- a/hw/sensor/isl_pmbus_vr.c
+++ b/hw/sensor/isl_pmbus_vr.c
@@ -136,63 +136,63 @@ static void isl_pmbus_vr_add_props(Object *obj, uint64_t *flags, uint8_t pages)
PMBusDevice *pmdev = PMBUS_DEVICE(obj);
for (int i = 0; i < pages; i++) {
if (flags[i] & PB_HAS_VIN) {
- object_property_add(obj, "vin[*]", "uint16",
+ object_property_add(obj, "vin[*]", "uint16", NULL,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_vin);
}
if (flags[i] & PB_HAS_VOUT) {
- object_property_add(obj, "vout[*]", "uint16",
+ object_property_add(obj, "vout[*]", "uint16", NULL,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_vout);
}
if (flags[i] & PB_HAS_IIN) {
- object_property_add(obj, "iin[*]", "uint16",
+ object_property_add(obj, "iin[*]", "uint16", NULL,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_iin);
}
if (flags[i] & PB_HAS_IOUT) {
- object_property_add(obj, "iout[*]", "uint16",
+ object_property_add(obj, "iout[*]", "uint16", NULL,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_iout);
}
if (flags[i] & PB_HAS_PIN) {
- object_property_add(obj, "pin[*]", "uint16",
+ object_property_add(obj, "pin[*]", "uint16", NULL,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_pin);
}
if (flags[i] & PB_HAS_POUT) {
- object_property_add(obj, "pout[*]", "uint16",
+ object_property_add(obj, "pout[*]", "uint16", NULL,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_pout);
}
if (flags[i] & PB_HAS_TEMPERATURE) {
- object_property_add(obj, "temp1[*]", "uint16",
+ object_property_add(obj, "temp1[*]", "uint16", NULL,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_temperature_1);
}
if (flags[i] & PB_HAS_TEMP2) {
- object_property_add(obj, "temp2[*]", "uint16",
+ object_property_add(obj, "temp2[*]", "uint16", NULL,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_temperature_2);
}
if (flags[i] & PB_HAS_TEMP3) {
- object_property_add(obj, "temp3[*]", "uint16",
+ object_property_add(obj, "temp3[*]", "uint16", NULL,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_temperature_3);
diff --git a/hw/sensor/lsm303dlhc_mag.c b/hw/sensor/lsm303dlhc_mag.c
index cd5773ae64..f362686b69 100644
--- a/hw/sensor/lsm303dlhc_mag.c
+++ b/hw/sensor/lsm303dlhc_mag.c
@@ -509,21 +509,21 @@ static void lsm303dlhc_mag_reset(DeviceState *dev)
*/
static void lsm303dlhc_mag_initfn(Object *obj)
{
- object_property_add(obj, "mag-x", "int",
- lsm303dlhc_mag_get_x,
- lsm303dlhc_mag_set_x, NULL, NULL);
+ object_property_add(obj, "mag-x", "int", NULL,
+ lsm303dlhc_mag_get_x,
+ lsm303dlhc_mag_set_x, NULL, NULL);
- object_property_add(obj, "mag-y", "int",
- lsm303dlhc_mag_get_y,
- lsm303dlhc_mag_set_y, NULL, NULL);
+ object_property_add(obj, "mag-y", "int", NULL,
+ lsm303dlhc_mag_get_y,
+ lsm303dlhc_mag_set_y, NULL, NULL);
- object_property_add(obj, "mag-z", "int",
- lsm303dlhc_mag_get_z,
- lsm303dlhc_mag_set_z, NULL, NULL);
+ object_property_add(obj, "mag-z", "int", NULL,
+ lsm303dlhc_mag_get_z,
+ lsm303dlhc_mag_set_z, NULL, NULL);
- object_property_add(obj, "temperature", "int",
- lsm303dlhc_mag_get_temperature,
- lsm303dlhc_mag_set_temperature, NULL, NULL);
+ object_property_add(obj, "temperature", "int", NULL,
+ lsm303dlhc_mag_get_temperature,
+ lsm303dlhc_mag_set_temperature, NULL, NULL);
}
/*
diff --git a/hw/sensor/max34451.c b/hw/sensor/max34451.c
index 4d64434f3a..6c2f7311ff 100644
--- a/hw/sensor/max34451.c
+++ b/hw/sensor/max34451.c
@@ -727,7 +727,7 @@ static void max34451_init(Object *obj)
/* get and set the voltage in millivolts, max is 32767 mV */
for (int i = 0; i < MAX34451_NUM_PWR_DEVICES; i++) {
- object_property_add(obj, "vout[*]", "uint16",
+ object_property_add(obj, "vout[*]", "uint16", NULL,
max34451_get,
max34451_set, NULL, &pmdev->pages[i].read_vout);
}
@@ -737,7 +737,7 @@ static void max34451_init(Object *obj)
* centidegrees Celsius i.e.: 2500 -> 25.00 C, max is 327.67 C
*/
for (int i = 0; i < MAX34451_NUM_TEMP_DEVICES; i++) {
- object_property_add(obj, "temperature[*]", "uint16",
+ object_property_add(obj, "temperature[*]", "uint16", NULL,
max34451_get,
max34451_set,
NULL,
diff --git a/hw/sensor/tmp105.c b/hw/sensor/tmp105.c
index ece0650d70..98f45a49b7 100644
--- a/hw/sensor/tmp105.c
+++ b/hw/sensor/tmp105.c
@@ -408,7 +408,7 @@ static void tmp105_realize(DeviceState *dev, Error **errp)
static void tmp105_initfn(Object *obj)
{
- object_property_add(obj, "temperature", "int",
+ object_property_add(obj, "temperature", "int", NULL,
tmp105_get_temperature,
tmp105_set_temperature, NULL, NULL);
object_property_set_description(obj, "temperature",
diff --git a/hw/sensor/tmp421.c b/hw/sensor/tmp421.c
index 127edd0ba5..8e6823dfcc 100644
--- a/hw/sensor/tmp421.c
+++ b/hw/sensor/tmp421.c
@@ -350,16 +350,16 @@ static void tmp421_class_init(ObjectClass *klass, const void *data)
dc->vmsd = &vmstate_tmp421;
sc->dev = (DeviceInfo *) data;
- object_class_property_add(klass, "temperature0", "int",
+ object_class_property_add(klass, "temperature0", "int", NULL,
tmp421_get_temperature,
tmp421_set_temperature, NULL, NULL);
- object_class_property_add(klass, "temperature1", "int",
+ object_class_property_add(klass, "temperature1", "int", NULL,
tmp421_get_temperature,
tmp421_set_temperature, NULL, NULL);
- object_class_property_add(klass, "temperature2", "int",
+ object_class_property_add(klass, "temperature2", "int", NULL,
tmp421_get_temperature,
tmp421_set_temperature, NULL, NULL);
- object_class_property_add(klass, "temperature3", "int",
+ object_class_property_add(klass, "temperature3", "int", NULL,
tmp421_get_temperature,
tmp421_set_temperature, NULL, NULL);
}
diff --git a/hw/usb/dev-storage-classic.c b/hw/usb/dev-storage-classic.c
index 977151c4a0..dfd568da5e 100644
--- a/hw/usb/dev-storage-classic.c
+++ b/hw/usb/dev-storage-classic.c
@@ -122,7 +122,7 @@ out:
static void usb_msd_instance_init(Object *obj)
{
- object_property_add(obj, "bootindex", "int32",
+ object_property_add(obj, "bootindex", "int32", NULL,
usb_msd_get_bootindex,
usb_msd_set_bootindex, NULL, NULL);
object_property_set_int(obj, "bootindex", -1, NULL);
diff --git a/hw/vfio-user/pci.c b/hw/vfio-user/pci.c
index 983e1d4ad4..4c76a3fe5d 100644
--- a/hw/vfio-user/pci.c
+++ b/hw/vfio-user/pci.c
@@ -471,7 +471,7 @@ static void vfio_user_pci_class_init(ObjectClass *klass, const void *data)
device_class_set_legacy_reset(dc, vfio_user_pci_reset);
device_class_set_props(dc, vfio_user_pci_properties);
- object_class_property_add(klass, "socket", "SocketAddress", NULL,
+ object_class_property_add(klass, "socket", "SocketAddress", NULL, NULL,
vfio_user_pci_set_socket, NULL, NULL);
object_class_property_set_description(klass, "socket",
"SocketAddress (UNIX sockets only)");
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
index 07d519cf6d..995b1a41ef 100644
--- a/hw/virtio/virtio-balloon.c
+++ b/hw/virtio/virtio-balloon.c
@@ -1036,10 +1036,10 @@ static void virtio_balloon_instance_init(Object *obj)
s->free_page_hint_cmd_id = VIRTIO_BALLOON_FREE_PAGE_HINT_CMD_ID_MIN;
s->free_page_hint_notify.notify = virtio_balloon_free_page_hint_notify;
- object_property_add(obj, "guest-stats", "guest statistics",
+ object_property_add(obj, "guest-stats", "guest statistics", NULL,
balloon_stats_get_all, NULL, NULL, NULL);
- object_property_add(obj, "guest-stats-polling-interval", "int",
+ object_property_add(obj, "guest-stats-polling-interval", "int", NULL,
balloon_stats_get_poll_interval,
balloon_stats_set_poll_interval,
NULL, NULL);
diff --git a/hw/virtio/virtio-mem-pci.c b/hw/virtio/virtio-mem-pci.c
index f592eb1a78..6349337bf4 100644
--- a/hw/virtio/virtio-mem-pci.c
+++ b/hw/virtio/virtio-mem-pci.c
@@ -211,7 +211,7 @@ static void virtio_mem_pci_instance_init(Object *obj)
OBJECT(&dev->vdev), VIRTIO_MEM_BLOCK_SIZE_PROP);
object_property_add_alias(obj, VIRTIO_MEM_SIZE_PROP, OBJECT(&dev->vdev),
VIRTIO_MEM_SIZE_PROP);
- object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size",
+ object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size", NULL,
virtio_mem_pci_get_requested_size,
virtio_mem_pci_set_requested_size, NULL, NULL);
}
diff --git a/hw/virtio/virtio-mem.c b/hw/virtio/virtio-mem.c
index 7130ed852d..fcfd9fa18a 100644
--- a/hw/virtio/virtio-mem.c
+++ b/hw/virtio/virtio-mem.c
@@ -1533,12 +1533,13 @@ static void virtio_mem_instance_init(Object *obj)
notifier_list_init(&vmem->size_change_notifiers);
- object_property_add(obj, VIRTIO_MEM_SIZE_PROP, "size", virtio_mem_get_size,
+ object_property_add(obj, VIRTIO_MEM_SIZE_PROP, "size", NULL,
+ virtio_mem_get_size,
NULL, NULL, NULL);
- object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size",
+ object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size", NULL,
virtio_mem_get_requested_size,
virtio_mem_set_requested_size, NULL, NULL);
- object_property_add(obj, VIRTIO_MEM_BLOCK_SIZE_PROP, "size",
+ object_property_add(obj, VIRTIO_MEM_BLOCK_SIZE_PROP, "size", NULL,
virtio_mem_get_block_size, virtio_mem_set_block_size,
NULL, NULL);
}
diff --git a/hw/xen/xen-pvh-common.c b/hw/xen/xen-pvh-common.c
index cca37202ff..ddeabe30f2 100644
--- a/hw/xen/xen-pvh-common.c
+++ b/hw/xen/xen-pvh-common.c
@@ -413,7 +413,7 @@ void xen_pvh_class_setup_common_props(XenPVHMachineClass *xpc)
#define OC_MEMMAP_PROP_BASE(c, prop_name, name) \
do { \
- object_class_property_add(c, prop_name "-base", "uint64_t", \
+ object_class_property_add(c, prop_name "-base", "uint64_t", NULL, \
xen_pvh_get_ ## name ## _base, \
xen_pvh_set_ ## name ## _base, NULL, NULL); \
object_class_property_set_description(oc, prop_name "-base", \
@@ -422,7 +422,7 @@ do { \
#define OC_MEMMAP_PROP_SIZE(c, prop_name, name) \
do { \
- object_class_property_add(c, prop_name "-size", "uint64_t", \
+ object_class_property_add(c, prop_name "-size", "uint64_t", NULL, \
xen_pvh_get_ ## name ## _size, \
xen_pvh_set_ ## name ## _size, NULL, NULL); \
object_class_property_set_description(oc, prop_name "-size", \
@@ -458,7 +458,7 @@ do { \
OC_MEMMAP_PROP(oc, "pci-mmio", pci_mmio);
OC_MEMMAP_PROP(oc, "pci-mmio-high", pci_mmio_high);
- object_class_property_add(oc, "pci-intx-irq-base", "uint32_t",
+ object_class_property_add(oc, "pci-intx-irq-base", "uint32_t", NULL,
xen_pvh_get_pci_intx_irq_base,
xen_pvh_set_pci_intx_irq_base,
NULL, NULL);
@@ -468,7 +468,7 @@ do { \
#ifdef CONFIG_TPM
if (xpc->has_tpm) {
- object_class_property_add(oc, "tpm-base-addr", "uint64_t",
+ object_class_property_add(oc, "tpm-base-addr", "uint64_t", NULL,
xen_pvh_get_tpm_base,
xen_pvh_set_tpm_base,
NULL, NULL);
diff --git a/iothread.c b/iothread.c
index 76eea6df38..7084d336a4 100644
--- a/iothread.c
+++ b/iothread.c
@@ -315,19 +315,19 @@ static void iothread_class_init(ObjectClass *klass, const void *class_data)
bc->init = iothread_init;
bc->update_params = iothread_set_aio_context_params;
- object_class_property_add(klass, "poll-max-ns", "int64",
+ object_class_property_add(klass, "poll-max-ns", "int64", NULL,
iothread_get_poll_param,
iothread_set_poll_param,
NULL, &poll_max_ns_info);
- object_class_property_add(klass, "poll-grow", "int64",
+ object_class_property_add(klass, "poll-grow", "int64", NULL,
iothread_get_poll_param,
iothread_set_poll_param,
NULL, &poll_grow_info);
- object_class_property_add(klass, "poll-shrink", "int64",
+ object_class_property_add(klass, "poll-shrink", "int64", NULL,
iothread_get_poll_param,
iothread_set_poll_param,
NULL, &poll_shrink_info);
- object_class_property_add(klass, "poll-weight", "int64",
+ object_class_property_add(klass, "poll-weight", "int64", NULL,
iothread_get_poll_param,
iothread_set_poll_param,
NULL, &poll_weight_info);
diff --git a/net/colo-compare.c b/net/colo-compare.c
index 5986fb1e88..7d4a2db522 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -1373,15 +1373,15 @@ static void colo_compare_init(Object *obj)
object_property_add_str(obj, "notify_dev",
compare_get_notify_dev, compare_set_notify_dev);
- object_property_add(obj, "compare_timeout", "uint64",
+ object_property_add(obj, "compare_timeout", "uint64", NULL,
compare_get_timeout,
compare_set_timeout, NULL, NULL);
- object_property_add(obj, "expired_scan_cycle", "uint32",
+ object_property_add(obj, "expired_scan_cycle", "uint32", NULL,
compare_get_expired_scan_cycle,
compare_set_expired_scan_cycle, NULL, NULL);
- object_property_add(obj, "max_queue_size", "uint32",
+ object_property_add(obj, "max_queue_size", "uint32", NULL,
get_max_queue_size,
set_max_queue_size, NULL, NULL);
diff --git a/net/dump.c b/net/dump.c
index 0c39f09892..558115b9c9 100644
--- a/net/dump.c
+++ b/net/dump.c
@@ -238,7 +238,8 @@ static void filter_dump_class_init(ObjectClass *oc, const void *data)
{
NetFilterClass *nfc = NETFILTER_CLASS(oc);
- object_class_property_add(oc, "maxlen", "uint32", filter_dump_get_maxlen,
+ object_class_property_add(oc, "maxlen", "uint32", NULL,
+ filter_dump_get_maxlen,
filter_dump_set_maxlen, NULL, NULL);
object_class_property_add_str(oc, "file", file_dump_get_filename,
file_dump_set_filename);
diff --git a/net/filter-buffer.c b/net/filter-buffer.c
index 427da24097..f56b2cfaf0 100644
--- a/net/filter-buffer.c
+++ b/net/filter-buffer.c
@@ -182,7 +182,7 @@ static void filter_buffer_class_init(ObjectClass *oc, const void *data)
{
NetFilterClass *nfc = NETFILTER_CLASS(oc);
- object_class_property_add(oc, "interval", "uint32",
+ object_class_property_add(oc, "interval", "uint32", NULL,
filter_buffer_get_interval,
filter_buffer_set_interval, NULL, NULL);
diff --git a/qom/object.c b/qom/object.c
index c34b47312f..0fbd4a7edf 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1340,6 +1340,7 @@ void object_unref(void *objptr)
ObjectProperty *
object_property_try_add(Object *obj, const char *name, const char *type,
+ QAPITypeInfo *qapi_type,
ObjectPropertyAccessor *get,
ObjectPropertyAccessor *set,
ObjectPropertyRelease *release,
@@ -1357,8 +1358,8 @@ object_property_try_add(Object *obj, const char *name, const char *type,
for (i = 0; i < INT16_MAX; ++i) {
char *full_name = g_strdup_printf("%s[%d]", name_no_array, i);
- ret = object_property_try_add(obj, full_name, type, get, set,
- release, opaque, NULL);
+ ret = object_property_try_add(obj, full_name, type, NULL,
+ get, set, release, opaque, NULL);
g_free(full_name);
if (ret) {
break;
@@ -1379,6 +1380,7 @@ object_property_try_add(Object *obj, const char *name, const char *type,
prop->name = g_strdup(name);
prop->type = g_strdup(type);
+ prop->qapi_type = qapi_type;
prop->get = get;
prop->set = set;
@@ -1393,12 +1395,13 @@ object_property_try_add(Object *obj, const char *name, const char *type,
ObjectProperty *
object_property_add(Object *obj, const char *name, const char *type,
+ const QAPITypeInfo *qapi_type,
ObjectPropertyAccessor *get,
ObjectPropertyAccessor *set,
ObjectPropertyRelease *release,
void *opaque)
{
- return object_property_try_add(obj, name, type, get, set, release,
+ return object_property_try_add(obj, name, type, NULL, get, set, release,
opaque, &error_abort);
}
@@ -1406,6 +1409,7 @@ ObjectProperty *
object_class_property_add(ObjectClass *klass,
const char *name,
const char *type,
+ const QAPITypeInfo *qapi_type,
ObjectPropertyAccessor *get,
ObjectPropertyAccessor *set,
ObjectPropertyRelease *release,
@@ -1420,6 +1424,7 @@ object_class_property_add(ObjectClass *klass,
prop->name = g_strdup(name);
prop->type = g_strdup(type);
+ prop->qapi_type = qapi_type;
prop->get = get;
prop->set = set;
@@ -1947,7 +1952,8 @@ object_property_try_add_child(Object *obj, const char *name,
type = g_strdup_printf("child<%s>", object_get_typename(child));
- op = object_property_try_add(obj, name, type, object_get_child_property,
+ op = object_property_try_add(obj, name, type, NULL,
+ object_get_child_property,
NULL, object_finalize_child_property,
child, errp);
if (!op) {
@@ -2141,7 +2147,7 @@ object_add_link_prop(Object *obj, const char *name,
full_type = g_strdup_printf("link<%s>", type);
- op = object_property_add(obj, name, full_type,
+ op = object_property_add(obj, name, full_type, NULL,
object_get_link_property,
check ? object_set_link_property : NULL,
object_release_link_property,
@@ -2178,7 +2184,7 @@ object_class_property_add_link(ObjectClass *oc,
full_type = g_strdup_printf("link<%s>", type);
- op = object_class_property_add(oc, name, full_type,
+ op = object_class_property_add(oc, name, full_type, NULL,
object_get_link_property,
check ? object_set_link_property : NULL,
object_release_link_property,
@@ -2438,7 +2444,7 @@ object_property_add_str(Object *obj, const char *name,
prop->get = get;
prop->set = set;
- return object_property_add(obj, name, "string",
+ return object_property_add(obj, name, "string", NULL,
get ? property_get_str : NULL,
set ? property_set_str : NULL,
property_release_data,
@@ -2456,7 +2462,7 @@ object_class_property_add_str(ObjectClass *klass, const char *name,
prop->get = get;
prop->set = set;
- return object_class_property_add(klass, name, "string",
+ return object_class_property_add(klass, name, "string", NULL,
get ? property_get_str : NULL,
set ? property_set_str : NULL,
NULL,
@@ -2508,7 +2514,7 @@ object_property_add_bool(Object *obj, const char *name,
prop->get = get;
prop->set = set;
- return object_property_add(obj, name, "bool",
+ return object_property_add(obj, name, "bool", NULL,
get ? property_get_bool : NULL,
set ? property_set_bool : NULL,
property_release_data,
@@ -2525,7 +2531,7 @@ object_class_property_add_bool(ObjectClass *klass, const char *name,
prop->get = get;
prop->set = set;
- return object_class_property_add(klass, name, "bool",
+ return object_class_property_add(klass, name, "bool", NULL,
get ? property_get_bool : NULL,
set ? property_set_bool : NULL,
NULL,
@@ -2573,7 +2579,7 @@ object_property_add_enum(Object *obj, const char *name,
prop->get = get;
prop->set = set;
- return object_property_add(obj, name, typename,
+ return object_property_add(obj, name, typename, NULL,
get ? property_get_enum : NULL,
set ? property_set_enum : NULL,
property_release_data,
@@ -2593,7 +2599,7 @@ object_class_property_add_enum(ObjectClass *klass, const char *name,
prop->get = get;
prop->set = set;
- return object_class_property_add(klass, name, typename,
+ return object_class_property_add(klass, name, typename, NULL,
get ? property_get_enum : NULL,
set ? property_set_enum : NULL,
NULL,
@@ -2651,7 +2657,7 @@ object_property_add_tm(Object *obj, const char *name,
prop->get = get;
- return object_property_add(obj, name, "struct tm",
+ return object_property_add(obj, name, "struct tm", NULL,
get ? property_get_tm : NULL, NULL,
property_release_data,
prop);
@@ -2665,7 +2671,7 @@ object_class_property_add_tm(ObjectClass *klass, const char *name,
prop->get = get;
- return object_class_property_add(klass, name, "struct tm",
+ return object_class_property_add(klass, name, "struct tm", NULL,
get ? property_get_tm : NULL,
NULL, NULL, prop);
}
@@ -2804,7 +2810,7 @@ object_class_property_add_bool_ptr(ObjectClass *klass, const char *name,
setter = property_class_set_bool_ptr;
}
- return object_class_property_add(klass, name, "bool",
+ return object_class_property_add(klass, name, "bool", NULL,
getter, setter, NULL, (void *)offset);
}
@@ -2824,7 +2830,7 @@ object_property_add_uint8_ptr(Object *obj, const char *name,
setter = property_set_uint8_ptr;
}
- return object_property_add(obj, name, "uint8",
+ return object_property_add(obj, name, "uint8", NULL,
getter, setter, NULL, (void *)v);
}
@@ -2844,7 +2850,7 @@ object_class_property_add_uint8_ptr(ObjectClass *klass, const char *name,
setter = property_class_set_uint8_ptr;
}
- return object_class_property_add(klass, name, "uint8",
+ return object_class_property_add(klass, name, "uint8", NULL,
getter, setter, NULL, (void *)offset);
}
@@ -2865,7 +2871,7 @@ object_class_static_property_add_uint8_ptr(ObjectClass *klass,
setter = property_set_uint8_ptr;
}
- return object_class_property_add(klass, name, "uint8",
+ return object_class_property_add(klass, name, "uint8", NULL,
getter, setter, NULL, (void *)v);
}
@@ -2885,7 +2891,7 @@ object_property_add_uint16_ptr(Object *obj, const char *name,
setter = property_set_uint16_ptr;
}
- return object_property_add(obj, name, "uint16",
+ return object_property_add(obj, name, "uint16", NULL,
getter, setter, NULL, (void *)v);
}
@@ -2905,7 +2911,7 @@ object_class_property_add_uint16_ptr(ObjectClass *klass, const char *name,
setter = property_class_set_uint16_ptr;
}
- return object_class_property_add(klass, name, "uint16",
+ return object_class_property_add(klass, name, "uint16", NULL,
getter, setter, NULL, (void *)offset);
}
@@ -2926,7 +2932,7 @@ object_class_static_property_add_uint16_ptr(ObjectClass *klass,
setter = property_set_uint16_ptr;
}
- return object_class_property_add(klass, name, "uint16",
+ return object_class_property_add(klass, name, "uint16", NULL,
getter, setter, NULL, (void *)v);
}
@@ -2946,7 +2952,7 @@ object_property_add_uint32_ptr(Object *obj, const char *name,
setter = property_set_uint32_ptr;
}
- return object_property_add(obj, name, "uint32",
+ return object_property_add(obj, name, "uint32", NULL,
getter, setter, NULL, (void *)v);
}
@@ -2966,7 +2972,7 @@ object_class_property_add_uint32_ptr(ObjectClass *klass, const char *name,
setter = property_class_set_uint32_ptr;
}
- return object_class_property_add(klass, name, "uint32",
+ return object_class_property_add(klass, name, "uint32", NULL,
getter, setter, NULL, (void *)offset);
}
@@ -2987,7 +2993,7 @@ object_class_static_property_add_uint32_ptr(ObjectClass *klass,
setter = property_set_uint32_ptr;
}
- return object_class_property_add(klass, name, "uint32",
+ return object_class_property_add(klass, name, "uint32", NULL,
getter, setter, NULL, (void *)v);
}
@@ -3007,7 +3013,7 @@ object_property_add_uint64_ptr(Object *obj, const char *name,
setter = property_set_uint64_ptr;
}
- return object_property_add(obj, name, "uint64",
+ return object_property_add(obj, name, "uint64", NULL,
getter, setter, NULL, (void *)v);
}
@@ -3027,7 +3033,7 @@ object_class_property_add_uint64_ptr(ObjectClass *klass, const char *name,
setter = property_class_set_uint64_ptr;
}
- return object_class_property_add(klass, name, "uint64",
+ return object_class_property_add(klass, name, "uint64", NULL,
getter, setter, NULL, (void *)offset);
}
@@ -3048,7 +3054,7 @@ object_class_static_property_add_uint64_ptr(ObjectClass *klass,
setter = property_set_uint64_ptr;
}
- return object_class_property_add(klass, name, "uint64",
+ return object_class_property_add(klass, name, "uint64", NULL,
getter, setter, NULL, (void *)v);
}
@@ -3165,7 +3171,7 @@ object_property_add_alias(Object *obj, const char *name,
prop->target_name = g_strdup(target_name);
prop->flags = 0;
- op = object_property_add(obj, name, prop_type,
+ op = object_property_add(obj, name, prop_type, NULL,
property_get_alias,
property_set_alias,
property_release_alias,
@@ -3210,7 +3216,7 @@ object_class_property_add_alias(ObjectClass *klass, const char *name,
prop->target_name = g_strdup(target_name);
prop->flags = OBJ_PROP_ALIAS_CLASS;
- op = object_class_property_add(klass, name, prop_type,
+ op = object_class_property_add(klass, name, prop_type, NULL,
property_get_alias,
property_set_alias,
property_release_alias,
diff --git a/system/bootdevice.c b/system/bootdevice.c
index 9538b08983..4fc6b4c8ed 100644
--- a/system/bootdevice.c
+++ b/system/bootdevice.c
@@ -336,7 +336,7 @@ void device_add_bootindex_property(Object *obj, int32_t *bootindex,
prop->suffix = suffix;
prop->dev = dev;
- object_property_add(obj, name, "int32",
+ object_property_add(obj, name, "int32", NULL,
device_get_bootindex,
device_set_bootindex,
property_release_bootindex,
diff --git a/system/memory.c b/system/memory.c
index f1910af8a0..ac296cb0d8 100644
--- a/system/memory.c
+++ b/system/memory.c
@@ -1293,11 +1293,11 @@ static void memory_region_initfn(Object *obj)
object_property_add_uint64_ptr(OBJECT(mr), "addr",
&mr->addr, OBJ_PROP_FLAG_READ);
- object_property_add(OBJECT(mr), "priority", "int32",
+ object_property_add(OBJECT(mr), "priority", "int32", NULL,
memory_region_get_priority,
NULL, /* memory_region_set_priority */
NULL, NULL);
- object_property_add(OBJECT(mr), "size", "uint64",
+ object_property_add(OBJECT(mr), "size", "uint64", NULL,
memory_region_get_size,
NULL, /* memory_region_set_size, */
NULL, NULL);
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
index dcd0d698b3..9c869b4488 100644
--- a/target/arm/cpu64.c
+++ b/target/arm/cpu64.c
@@ -328,7 +328,7 @@ static void prop_bool_set_false(Object *obj, Visitor *v, const char *name,
static void prop_add_stub_bool(Object *obj, const char *name)
{
- object_property_add(obj, name, "bool", prop_bool_get_false,
+ object_property_add(obj, name, "bool", NULL, prop_bool_get_false,
prop_bool_set_false, NULL, NULL);
}
@@ -518,13 +518,13 @@ void aarch64_add_sve_properties(Object *obj)
for (vq = 1; vq <= ARM_MAX_VQ; ++vq) {
char name[8];
snprintf(name, sizeof(name), "sve%d", vq * 128);
- object_property_add(obj, name, "bool", cpu_arm_get_vq,
+ object_property_add(obj, name, "bool", NULL, cpu_arm_get_vq,
cpu_arm_set_vq, NULL, &cpu->sve_vq);
}
#ifdef CONFIG_USER_ONLY
/* Mirror linux /proc/sys/abi/sve_default_vector_length. */
- object_property_add(obj, "sve-default-vector-length", "int32",
+ object_property_add(obj, "sve-default-vector-length", "int32", NULL,
cpu_arm_get_default_vec_len,
cpu_arm_set_default_vec_len, NULL,
&cpu->sve_default_vq);
@@ -543,13 +543,13 @@ void aarch64_add_sme_properties(Object *obj)
for (vq = 1; vq <= ARM_MAX_VQ; vq <<= 1) {
char name[8];
snprintf(name, sizeof(name), "sme%d", vq * 128);
- object_property_add(obj, name, "bool", cpu_arm_get_vq,
+ object_property_add(obj, name, "bool", NULL, cpu_arm_get_vq,
cpu_arm_set_vq, NULL, &cpu->sme_vq);
}
#ifdef CONFIG_USER_ONLY
/* Mirror linux /proc/sys/abi/sme_default_vector_length. */
- object_property_add(obj, "sme-default-vector-length", "int32",
+ object_property_add(obj, "sme-default-vector-length", "int32", NULL,
cpu_arm_get_default_vec_len,
cpu_arm_set_default_vec_len, NULL,
&cpu->sme_default_vq);
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index de09d63d2e..8a698a9d20 100644
--- a/target/arm/kvm.c
+++ b/target/arm/kvm.c
@@ -1820,7 +1820,7 @@ static void kvm_arch_set_eager_split_size(Object *obj, Visitor *v,
void kvm_arch_accel_class_init(ObjectClass *oc)
{
- object_class_property_add(oc, "eager-split-size", "size",
+ object_class_property_add(oc, "eager-split-size", "size", NULL,
kvm_arch_get_eager_split_size,
kvm_arch_set_eager_split_size, NULL, NULL);
diff --git a/target/arm/tcg/cpu64.c b/target/arm/tcg/cpu64.c
index c92e331e73..79df821da8 100644
--- a/target/arm/tcg/cpu64.c
+++ b/target/arm/tcg/cpu64.c
@@ -1392,7 +1392,7 @@ void aarch64_max_v8_tcg_initfn(Object *obj)
/* v8.2: FEAT_SVE */
cpu->sve_vq.supported = MAKE_64BIT_MASK(0, ARM_MAX_VQ);
aarch64_add_sve_properties(OBJECT(cpu));
- object_property_add(OBJECT(cpu), "sve-max-vq", "uint32",
+ object_property_add(OBJECT(cpu), "sve-max-vq", "uint32", NULL,
cpu_max_get_sve_max_vq, cpu_max_set_sve_max_vq,
NULL, NULL);
@@ -1529,7 +1529,7 @@ void aarch64_max_v9_tcg_initfn(Object *obj)
object_property_add_bool(obj, "x-rme", cpu_arm_get_rme, cpu_arm_set_rme);
/* v9.4: FEAT_RME_GPC2 */
- object_property_add(obj, "x-l0gptsz", "uint32", cpu_max_get_l0gptsz,
+ object_property_add(obj, "x-l0gptsz", "uint32", NULL, cpu_max_get_l0gptsz,
cpu_max_set_l0gptsz, NULL, NULL);
}
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index e65eca0459..4514de46ff 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -10484,7 +10484,7 @@ static void x86_cpu_register_bit_prop(X86CPUClass *xcc,
fp = g_new0(BitProperty, 1);
fp->w = w;
fp->mask = mask;
- object_class_property_add(oc, prop_name, "bool",
+ object_class_property_add(oc, prop_name, "bool", NULL,
x86_cpu_get_bit_prop,
x86_cpu_set_bit_prop,
NULL, fp);
@@ -10569,10 +10569,11 @@ static void x86_cpu_initfn(Object *obj)
x86_cpu_init_default_topo(cpu);
- object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo",
+ object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo", NULL,
x86_cpu_get_feature_words,
NULL, NULL, (void *)env->features);
object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo",
+ NULL,
x86_cpu_get_feature_words,
NULL, NULL, (void *)cpu->filtered_features);
@@ -11005,13 +11006,13 @@ static void x86_cpu_common_class_init(ObjectClass *oc, const void *data)
dc->user_creatable = true;
- object_class_property_add(oc, "family", "uint64",
+ object_class_property_add(oc, "family", "uint64", NULL,
x86_cpuid_version_get_family,
x86_cpuid_version_set_family, NULL, NULL);
- object_class_property_add(oc, "model", "uint64",
+ object_class_property_add(oc, "model", "uint64", NULL,
x86_cpuid_version_get_model,
x86_cpuid_version_set_model, NULL, NULL);
- object_class_property_add(oc, "stepping", "uint64",
+ object_class_property_add(oc, "stepping", "uint64", NULL,
x86_cpuid_version_get_stepping,
x86_cpuid_version_set_stepping, NULL, NULL);
object_class_property_add_str(oc, "vendor",
@@ -11020,7 +11021,7 @@ static void x86_cpu_common_class_init(ObjectClass *oc, const void *data)
object_class_property_add_str(oc, "model-id",
x86_cpuid_get_model_id,
x86_cpuid_set_model_id);
- object_class_property_add(oc, "tsc-frequency", "int",
+ object_class_property_add(oc, "tsc-frequency", "int", NULL,
x86_cpuid_get_tsc_freq,
x86_cpuid_set_tsc_freq, NULL, NULL);
/*
@@ -11029,17 +11030,18 @@ static void x86_cpu_common_class_init(ObjectClass *oc, const void *data)
* QMP command: they list the features that would have prevented the
* CPU from running if the "enforce" flag was set.
*/
- object_class_property_add(oc, "unavailable-features", "strList",
+ object_class_property_add(oc, "unavailable-features", "strList", NULL,
x86_cpu_get_unavailable_features,
NULL, NULL, NULL);
- object_class_property_add(oc, "avx10-version", "uint8",
+ object_class_property_add(oc, "avx10-version", "uint8", NULL,
x86_cpuid_get_avx10_version,
x86_cpuid_set_avx10_version,
NULL, NULL);
#if !defined(CONFIG_USER_ONLY)
- object_class_property_add(oc, "crash-information", "GuestPanicInformation",
+ object_class_property_add(oc, "crash-information",
+ "GuestPanicInformation", NULL,
x86_cpu_get_crash_info_qom, NULL, NULL, NULL);
#endif
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index da922f72d7..32175604e6 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -7096,7 +7096,7 @@ void kvm_arch_accel_class_init(ObjectClass *oc)
object_class_property_set_description(oc, "notify-vmexit",
"Enable notify VM exit");
- object_class_property_add(oc, "notify-window", "uint32",
+ object_class_property_add(oc, "notify-window", "uint32", NULL,
kvm_arch_get_notify_window,
kvm_arch_set_notify_window,
NULL, NULL);
@@ -7104,7 +7104,7 @@ void kvm_arch_accel_class_init(ObjectClass *oc)
"Clock cycles without an event window "
"after which a notification VM exit occurs");
- object_class_property_add(oc, "xen-version", "uint32",
+ object_class_property_add(oc, "xen-version", "uint32", NULL,
kvm_arch_get_xen_version,
kvm_arch_set_xen_version,
NULL, NULL);
@@ -7113,14 +7113,14 @@ void kvm_arch_accel_class_init(ObjectClass *oc)
"(in XENVER_version form "
"e.g. 0x4000a for 4.10)");
- object_class_property_add(oc, "xen-gnttab-max-frames", "uint16",
+ object_class_property_add(oc, "xen-gnttab-max-frames", "uint16", NULL,
kvm_arch_get_xen_gnttab_max_frames,
kvm_arch_set_xen_gnttab_max_frames,
NULL, NULL);
object_class_property_set_description(oc, "xen-gnttab-max-frames",
"Maximum number of grant table frames");
- object_class_property_add(oc, "xen-evtchn-max-pirq", "uint16",
+ object_class_property_add(oc, "xen-evtchn-max-pirq", "uint16", NULL,
kvm_arch_get_xen_evtchn_max_pirq,
kvm_arch_set_xen_evtchn_max_pirq,
NULL, NULL);
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
index 8294dbde3a..f6707abd34 100644
--- a/target/i386/kvm/tdx.c
+++ b/target/i386/kvm/tdx.c
@@ -1586,7 +1586,7 @@ static void tdx_guest_init(Object *obj)
tdx_guest_get_mrownerconfig,
tdx_guest_set_mrownerconfig);
- object_property_add(obj, "quote-generation-socket", "SocketAddress",
+ object_property_add(obj, "quote-generation-socket", "SocketAddress", NULL,
tdx_guest_get_qgs,
tdx_guest_set_qgs,
NULL, NULL);
diff --git a/target/i386/sev.c b/target/i386/sev.c
index 11072b00dc..74a7b719b5 100644
--- a/target/i386/sev.c
+++ b/target/i386/sev.c
@@ -3024,7 +3024,7 @@ sev_guest_class_init(ObjectClass *oc, const void *data)
sev_guest_set_session_file);
object_class_property_set_description(oc, "session-file",
"guest owners session parameters (encoded with base64)");
- object_class_property_add(oc, "legacy-vm-type", "OnOffAuto",
+ object_class_property_add(oc, "legacy-vm-type", "OnOffAuto", NULL,
sev_guest_get_legacy_vm_type,
sev_guest_set_legacy_vm_type, NULL, NULL);
object_class_property_set_description(oc, "legacy-vm-type",
@@ -3056,7 +3056,7 @@ sev_guest_instance_init(Object *obj)
sev_guest->policy = DEFAULT_GUEST_POLICY;
object_property_add_uint32_ptr(obj, "handle", &sev_guest->handle,
OBJ_PROP_FLAG_READWRITE);
- object_property_add(obj, "policy", "uint32", sev_guest_get_policy,
+ object_property_add(obj, "policy", "uint32", NULL, sev_guest_get_policy,
sev_guest_set_policy, NULL, NULL);
object_apply_compat_props(obj);
@@ -3334,7 +3334,7 @@ sev_snp_guest_class_init(ObjectClass *oc, const void *data)
x86_klass->adjust_cpuid_features = sev_snp_adjust_cpuid_features;
x86_klass->kvm_type = sev_snp_kvm_type;
- object_class_property_add(oc, "policy", "uint64",
+ object_class_property_add(oc, "policy", "uint64", NULL,
sev_snp_guest_get_policy,
sev_snp_guest_set_policy, NULL, NULL);
object_class_property_add_str(oc, "guest-visible-workarounds",
@@ -3358,7 +3358,7 @@ sev_snp_guest_class_init(ObjectClass *oc, const void *data)
object_class_property_add_bool(oc, "secure-tsc",
sev_snp_guest_get_secure_tsc,
sev_snp_guest_set_secure_tsc);
- object_class_property_add(oc, "tsc-frequency", "uint32",
+ object_class_property_add(oc, "tsc-frequency", "uint32", NULL,
sev_snp_guest_get_tsc_frequency,
sev_snp_guest_set_tsc_frequency, NULL, NULL);
}
diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c
index 113f79afb9..778da68bf4 100644
--- a/target/i386/whpx/whpx-all.c
+++ b/target/i386/whpx/whpx-all.c
@@ -3010,19 +3010,19 @@ static void whpx_set_ssd(Object *obj, Visitor *v,
void whpx_arch_accel_class_init(ObjectClass *oc)
{
- object_class_property_add(oc, "ignore-unknown-msr", "OnOffAuto",
- NULL, whpx_set_unknown_msr,
- NULL, NULL);
+ object_class_property_add(oc, "ignore-unknown-msr", "OnOffAuto", NULL,
+ NULL, whpx_set_unknown_msr,
+ NULL, NULL);
object_class_property_set_description(oc, "ignore-unknown-msr",
"Configure unknown MSR behavior");
- object_class_property_add(oc, "intercept-msr-gp", "OnOffAuto",
- NULL, whpx_set_intercept_msr_gp,
- NULL, NULL);
+ object_class_property_add(oc, "intercept-msr-gp", "OnOffAuto", NULL,
+ NULL, whpx_set_intercept_msr_gp,
+ NULL, NULL);
object_class_property_set_description(oc, "intercept-msr-gp",
"Intercept #GP to log erroring MSR accesses.");
- object_class_property_add(oc, "ssd", "OnOffAuto",
- NULL, whpx_set_ssd,
- NULL, NULL);
+ object_class_property_add(oc, "ssd", "OnOffAuto", NULL,
+ NULL, whpx_set_ssd,
+ NULL, NULL);
object_class_property_set_description(oc, "ssd",
"Separate security domain");
}
diff --git a/target/ppc/compat.c b/target/ppc/compat.c
index 55de3bd5d5..78f4b23122 100644
--- a/target/ppc/compat.c
+++ b/target/ppc/compat.c
@@ -335,7 +335,7 @@ void ppc_compat_add_property(Object *obj, const char *name,
gchar *names, *desc;
int i;
- object_property_add(obj, name, "string",
+ object_property_add(obj, name, "string", NULL,
ppc_compat_prop_get, ppc_compat_prop_set, NULL,
compat_pvr);
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 5a0529fbda..85b674217e 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1412,20 +1412,20 @@ void riscv_add_satp_mode_properties(Object *obj)
{
RISCVCPU *cpu = RISCV_CPU(obj);
- object_property_add(obj, "svbare", "bool", cpu_riscv_get_satp,
+ object_property_add(obj, "svbare", "bool", NULL, cpu_riscv_get_satp,
cpu_riscv_set_satp, NULL, &cpu->satp_modes);
if (cpu->env.misa_mxl == MXL_RV32) {
- object_property_add(obj, "sv32", "bool", cpu_riscv_get_satp,
+ object_property_add(obj, "sv32", "bool", NULL, cpu_riscv_get_satp,
cpu_riscv_set_satp, NULL, &cpu->satp_modes);
} else {
- object_property_add(obj, "sv39", "bool", cpu_riscv_get_satp,
+ object_property_add(obj, "sv39", "bool", NULL, cpu_riscv_get_satp,
cpu_riscv_set_satp, NULL, &cpu->satp_modes);
- object_property_add(obj, "sv48", "bool", cpu_riscv_get_satp,
+ object_property_add(obj, "sv48", "bool", NULL, cpu_riscv_get_satp,
cpu_riscv_set_satp, NULL, &cpu->satp_modes);
- object_property_add(obj, "sv57", "bool", cpu_riscv_get_satp,
+ object_property_add(obj, "sv57", "bool", NULL, cpu_riscv_get_satp,
cpu_riscv_set_satp, NULL, &cpu->satp_modes);
- object_property_add(obj, "sv64", "bool", cpu_riscv_get_satp,
+ object_property_add(obj, "sv64", "bool", NULL, cpu_riscv_get_satp,
cpu_riscv_set_satp, NULL, &cpu->satp_modes);
}
}
diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
index 5a82a63b82..9bccd59809 100644
--- a/target/riscv/kvm/kvm-cpu.c
+++ b/target/riscv/kvm/kvm-cpu.c
@@ -541,7 +541,7 @@ static void riscv_cpu_add_kvm_unavail_prop(Object *obj, const char *prop_name)
* unknown to KVM and error out if the user attempts
* to enable any of them.
*/
- object_property_add(obj, prop_name, "bool",
+ object_property_add(obj, prop_name, "bool", NULL,
cpu_get_cfg_unavailable,
cpu_set_cfg_unavailable,
NULL, (void *)prop_name);
@@ -561,7 +561,7 @@ static void kvm_riscv_add_cpu_user_properties(Object *cpu_obj)
misa_cfg->name = riscv_get_misa_ext_name(bit);
misa_cfg->description = riscv_get_misa_ext_description(bit);
- object_property_add(cpu_obj, misa_cfg->name, "bool",
+ object_property_add(cpu_obj, misa_cfg->name, "bool", NULL,
kvm_cpu_get_misa_ext_cfg,
kvm_cpu_set_misa_ext_cfg,
NULL, misa_cfg);
@@ -577,7 +577,7 @@ static void kvm_riscv_add_cpu_user_properties(Object *cpu_obj)
for (i = 0; i < ARRAY_SIZE(kvm_multi_ext_cfgs); i++) {
KVMCPUConfig *multi_cfg = &kvm_multi_ext_cfgs[i];
- object_property_add(cpu_obj, multi_cfg->name, "bool",
+ object_property_add(cpu_obj, multi_cfg->name, "bool", NULL,
kvm_cpu_get_multi_ext_cfg,
kvm_cpu_set_multi_ext_cfg,
NULL, multi_cfg);
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index 2a7796c382..df73f45829 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -1478,7 +1478,7 @@ static void riscv_cpu_add_misa_properties(Object *cpu_obj)
continue;
}
- object_property_add(cpu_obj, name, "bool",
+ object_property_add(cpu_obj, name, "bool", NULL,
cpu_get_misa_ext_cfg,
cpu_set_misa_ext_cfg,
NULL, (void *)misa_cfg);
@@ -1532,7 +1532,7 @@ static void riscv_cpu_add_profiles(Object *cpu_obj)
for (int i = 0; riscv_profiles[i] != NULL; i++) {
RISCVCPUProfile *profile = riscv_profiles[i];
- object_property_add(cpu_obj, profile->name, "bool",
+ object_property_add(cpu_obj, profile->name, "bool", NULL,
cpu_get_profile, cpu_set_profile,
NULL, (void *)profile);
@@ -1608,7 +1608,7 @@ static void riscv_cpu_add_user_properties(Object *obj)
for (edata = isa_edata_arr; edata && edata->name; edata++) {
if (edata->prop_name) {
- object_property_add(obj, edata->prop_name, "bool",
+ object_property_add(obj, edata->prop_name, "bool", NULL,
cpu_get_multi_ext_cfg,
cpu_set_multi_ext_cfg,
NULL, (void *)&edata->ext_enable_offset);
diff --git a/target/s390x/cpu-system.c b/target/s390x/cpu-system.c
index 715ff3ca94..de2f1422e3 100644
--- a/target/s390x/cpu-system.c
+++ b/target/s390x/cpu-system.c
@@ -138,6 +138,7 @@ void s390_cpu_system_init(Object *obj)
cs->start_powered_off = true;
object_property_add(obj, "crash-information", "GuestPanicInformation",
+ NULL,
s390_cpu_get_crash_info_qom, NULL, NULL, NULL);
cpu->env.tod_timer =
timer_new_ns(QEMU_CLOCK_VIRTUAL, s390x_tod_timer, cpu);
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index c30ea2df17..0718df791f 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -792,13 +792,14 @@ void s390_cpu_model_class_register_props(ObjectClass *oc)
for (feat = 0; feat < S390_FEAT_MAX; feat++) {
const S390FeatDef *def = s390_feat_def(feat);
- object_class_property_add(oc, def->name, "bool", get_feature,
+ object_class_property_add(oc, def->name, "bool", NULL, get_feature,
set_feature, NULL, (void *) feat);
object_class_property_set_description(oc, def->name, def->desc);
}
for (group = 0; group < S390_FEAT_GROUP_MAX; group++) {
const S390FeatGroupDef *def = s390_feat_group_def(group);
- object_class_property_add(oc, def->name, "bool", get_feature_group,
+ object_class_property_add(oc, def->name, "bool", NULL,
+ get_feature_group,
set_feature_group, NULL, (void *) group);
object_class_property_set_description(oc, def->name, def->desc);
}
diff --git a/tests/unit/test-qdev-global-props.c b/tests/unit/test-qdev-global-props.c
index 8ea362cbb9..35fb5eca6f 100644
--- a/tests/unit/test-qdev-global-props.c
+++ b/tests/unit/test-qdev-global-props.c
@@ -171,9 +171,11 @@ static void prop2_accessor(Object *obj, Visitor *v, const char *name,
static void dynamic_instance_init(Object *obj)
{
- object_property_add(obj, "prop1", "uint32", prop1_accessor, prop1_accessor,
+ object_property_add(obj, "prop1", "uint32", NULL, prop1_accessor,
+ prop1_accessor,
NULL, NULL);
- object_property_add(obj, "prop2", "uint32", prop2_accessor, prop2_accessor,
+ object_property_add(obj, "prop2", "uint32", NULL, prop2_accessor,
+ prop2_accessor,
NULL, NULL);
}
diff --git a/ui/console.c b/ui/console.c
index b735717200..732b4afee0 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -535,7 +535,7 @@ qemu_graphic_console_class_init(ObjectClass *oc, const void *data)
offsetof(QemuGraphicConsole, device),
object_property_allow_set_link,
OBJ_PROP_LINK_STRONG);
- object_class_property_add(oc, "head", "uint32",
+ object_class_property_add(oc, "head", "uint32", NULL,
qemu_graphic_console_prop_get_head,
NULL, NULL, NULL);
diff --git a/util/thread-context.c b/util/thread-context.c
index 88d8f0a55a..4fe7a6c8f4 100644
--- a/util/thread-context.c
+++ b/util/thread-context.c
@@ -278,13 +278,13 @@ static void thread_context_class_init(ObjectClass *oc, const void *data)
UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);
ucc->complete = thread_context_instance_complete;
- object_class_property_add(oc, "thread-id", "uint64",
+ object_class_property_add(oc, "thread-id", "uint64", NULL,
thread_context_get_thread_id, NULL, NULL,
NULL);
- object_class_property_add(oc, "cpu-affinity", "[uint16]",
+ object_class_property_add(oc, "cpu-affinity", "[uint16]", NULL,
thread_context_get_cpu_affinity,
thread_context_set_cpu_affinity, NULL, NULL);
- object_class_property_add(oc, "node-affinity", "[uint16]", NULL,
+ object_class_property_add(oc, "node-affinity", "[uint16]", NULL, NULL,
thread_context_set_node_affinity, NULL, NULL);
}
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* Re: [PATCH v8 14/56] qom: New object_property_add() etc. parameter @qapi_type
2026-11-01 20:16 ` [PATCH v8 14/56] qom: New object_property_add() etc. parameter @qapi_type Markus Armbruster
@ 2026-11-02 5:33 ` marcandre.lureau
2026-11-02 7:33 ` Markus Armbruster
0 siblings, 1 reply; 66+ messages in thread
From: marcandre.lureau @ 2026-11-02 5:33 UTC (permalink / raw)
To: Markus Armbruster; +Cc: qemu-devel, marcandre.lureau, pbonzini, berrange
> This permits setting ObjectProperty's optional @qapi_type. For now,
> all callers pass null. Callers updated with this Coccinelle script:
>
> @@
> identifier fun = {
> object_property_try_add, object_property_add, object_class_property_add
> };
> expression obj, name, type;
> @@
> - fun(obj, name, type,
> + fun(obj, name, type, NULL,
> ...)
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> Message-ID: <20261101201717.3911097-15-armbru@redhat.com>
> ---
> include/qom/object.h | 5 +++
> accel/hvf/hvf-all.c | 6 +--
> accel/kvm/kvm-all.c | 19 +++++----
> accel/nitro/nitro-accel.c | 2 +-
> accel/tcg/tcg-all.c | 6 +--
> accel/whpx/whpx-common.c | 12 +++---
> authz/list.c | 2 +-
> backends/cryptodev.c | 6 +--
> backends/hostmem-file.c | 21 +++++-----
> backends/hostmem-memfd.c | 4 +-
> backends/hostmem.c | 24 +++++------
> block/throttle-groups.c | 7 +---
> chardev/char-socket.c | 2 +-
> crypto/secret_keyring.c | 2 +-
> event-loop-base.c | 6 +--
> hw/acpi/ich9.c | 2 +-
> hw/acpi/pci.c | 8 ++--
> hw/arm/virt.c | 10 ++---
> hw/core/clock.c | 2 +-
> hw/core/machine.c | 29 +++++++------
> hw/core/qdev-properties.c | 5 +--
> hw/cpu/core.c | 6 ++-
> hw/cxl/cxl-host.c | 4 +-
> hw/gpio/aspeed_gpio.c | 6 +--
> hw/gpio/aspeed_sgpio.c | 2 +-
> hw/gpio/pca9552.c | 4 +-
> hw/gpio/pca9554.c | 3 +-
> hw/gpio/stm32l4x5_gpio.c | 4 +-
> hw/hexagon/hexagon_dsp.c | 2 +-
> hw/i386/microvm.c | 6 +--
> hw/i386/pc.c | 27 ++++++------
> hw/i386/sgx-epc.c | 2 +-
> hw/i386/x86.c | 23 ++++++-----
> hw/ide/ide-dev.c | 2 +-
> hw/intc/apic_common.c | 2 +-
> hw/loongarch/virt.c | 18 ++++----
> hw/mem/nvdimm.c | 5 ++-
> hw/mem/pc-dimm.c | 3 +-
> hw/misc/aspeed_lpc.c | 36 ++++++++++------
> hw/misc/aspeed_sdmc.c | 2 +-
> hw/misc/npcm7xx_mft.c | 2 +-
> hw/net/ne2000-isa.c | 2 +-
> hw/nvme/ctrl.c | 2 +-
> hw/pci-bridge/pci_expander_bridge.c | 2 +-
> hw/pci-host/i440fx.c | 4 ++
> hw/pci-host/pnv_phb3.c | 4 +-
> hw/pci-host/pnv_phb4.c | 4 +-
> hw/pci-host/q35.c | 8 ++--
> hw/ppc/spapr_caps.c | 2 +-
> hw/ppc/spapr_drc.c | 4 +-
> hw/remote/vfio-user-obj.c | 2 +-
> hw/riscv/microchip_pfsoc.c | 1 +
> hw/riscv/virt.c | 4 +-
> hw/s390x/s390-virtio-ccw.c | 4 +-
> hw/s390x/sclpcpi.c | 6 ++-
> hw/s390x/virtio-ccw-mem.c | 2 +-
> hw/sensor/adc128d818.c | 8 ++--
> hw/sensor/adm1266.c | 2 +-
> hw/sensor/adm1272.c | 8 ++--
> hw/sensor/emc141x.c | 8 ++--
> hw/sensor/isl_pmbus_vr.c | 18 ++++----
> hw/sensor/lsm303dlhc_mag.c | 24 +++++------
> hw/sensor/max34451.c | 4 +-
> hw/sensor/tmp105.c | 2 +-
> hw/sensor/tmp421.c | 8 ++--
> hw/usb/dev-storage-classic.c | 2 +-
> hw/vfio-user/pci.c | 2 +-
> hw/virtio/virtio-balloon.c | 4 +-
> hw/virtio/virtio-mem-pci.c | 2 +-
> hw/virtio/virtio-mem.c | 7 ++--
> hw/xen/xen-pvh-common.c | 8 ++--
> iothread.c | 8 ++--
> net/colo-compare.c | 6 +--
> net/dump.c | 3 +-
> net/filter-buffer.c | 2 +-
> qom/object.c | 64 ++++++++++++++++-------------
> system/bootdevice.c | 2 +-
> system/memory.c | 4 +-
> target/arm/cpu64.c | 10 ++---
> target/arm/kvm.c | 2 +-
> target/arm/tcg/cpu64.c | 4 +-
> target/i386/cpu.c | 20 +++++----
> target/i386/kvm/kvm.c | 8 ++--
> target/i386/kvm/tdx.c | 2 +-
> target/i386/sev.c | 8 ++--
> target/i386/whpx/whpx-all.c | 18 ++++----
> target/ppc/compat.c | 2 +-
> target/riscv/cpu.c | 12 +++---
> target/riscv/kvm/kvm-cpu.c | 6 +--
> target/riscv/tcg/tcg-cpu.c | 6 +--
> target/s390x/cpu-system.c | 1 +
> target/s390x/cpu_models.c | 5 ++-
> tests/unit/test-qdev-global-props.c | 6 ++-
> ui/console.c | 2 +-
> util/thread-context.c | 6 +--
> 95 files changed, 377 insertions(+), 327 deletions(-)
>
> diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c
> index 8bd9154a50b6..213ee15b4aa6 100644
> --- a/accel/hvf/hvf-all.c
> +++ b/accel/hvf/hvf-all.c
> @@ -277,9 +277,9 @@ static void hvf_accel_class_init(ObjectClass *oc, const void *data)
> ac->allowed = &hvf_allowed;
> hvf_kernel_irqchip_override = false;
> hvf_kernel_irqchip = false;
> - object_class_property_add(oc, "kernel-irqchip", "on|off|split",
> - NULL, hvf_set_kernel_irqchip,
> - NULL, NULL);
> + object_class_property_add(oc, "kernel-irqchip", "on|off|split", NULL,
> + NULL, hvf_set_kernel_irqchip,
> + NULL, NULL);
> object_class_property_set_description(oc, "kernel-irqchip",
> "Configure HVF irqchip");
> }
> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
> index db8fba53f339..9cc1e4b0a977 100644
> --- a/accel/kvm/kvm-all.c
> +++ b/accel/kvm/kvm-all.c
> @@ -4303,21 +4303,22 @@ static void kvm_accel_class_init(ObjectClass *oc, const void *data)
> ac->has_memory = kvm_accel_has_memory;
> ac->allowed = &kvm_allowed;
>
> - object_class_property_add(oc, "kernel-irqchip", "on|off|split",
> - NULL, kvm_set_kernel_irqchip,
> - NULL, NULL);
> + object_class_property_add(oc, "kernel-irqchip", "on|off|split", NULL,
> + NULL, kvm_set_kernel_irqchip,
> + NULL, NULL);
> object_class_property_set_description(oc, "kernel-irqchip",
> "Configure KVM in-kernel irqchip");
>
> - object_class_property_add(oc, "kvm-shadow-mem", "int",
> - kvm_get_kvm_shadow_mem, kvm_set_kvm_shadow_mem,
> - NULL, NULL);
> + object_class_property_add(oc, "kvm-shadow-mem", "int", NULL,
> + kvm_get_kvm_shadow_mem, kvm_set_kvm_shadow_mem,
> + NULL, NULL);
> object_class_property_set_description(oc, "kvm-shadow-mem",
> "KVM shadow MMU size");
>
> - object_class_property_add(oc, "dirty-ring-size", "uint32",
> - kvm_get_dirty_ring_size, kvm_set_dirty_ring_size,
> - NULL, NULL);
> + object_class_property_add(oc, "dirty-ring-size", "uint32", NULL,
> + kvm_get_dirty_ring_size,
> + kvm_set_dirty_ring_size,
> + NULL, NULL);
> object_class_property_set_description(oc, "dirty-ring-size",
> "Size of KVM dirty page ring buffer (default: 0, i.e. use bitmap)");
>
> diff --git a/accel/nitro/nitro-accel.c b/accel/nitro/nitro-accel.c
> index a1e97a9162e9..597027438c63 100644
> --- a/accel/nitro/nitro-accel.c
> +++ b/accel/nitro/nitro-accel.c
> @@ -238,7 +238,7 @@ static void nitro_accel_class_init(ObjectClass *oc, const void *data)
> object_class_property_set_description(oc, "debug-mode",
> "Start enclave in debug mode (enables console output)");
>
> - object_class_property_add(oc, "enclave-cid", "uint64",
> + object_class_property_add(oc, "enclave-cid", "uint64", NULL,
> nitro_get_enclave_cid,
> nitro_set_enclave_cid,
> NULL, NULL);
> diff --git a/accel/tcg/tcg-all.c b/accel/tcg/tcg-all.c
> index 767e8805552f..ed314e01cbf3 100644
> --- a/accel/tcg/tcg-all.c
> +++ b/accel/tcg/tcg-all.c
> @@ -270,9 +270,9 @@ static void tcg_accel_class_init(ObjectClass *oc, const void *data)
> tcg_get_thread,
> tcg_set_thread);
>
> - object_class_property_add(oc, "tb-size", "uint32",
> - tcg_get_tb_size, tcg_set_tb_size,
> - NULL, NULL);
> + object_class_property_add(oc, "tb-size", "uint32", NULL,
> + tcg_get_tb_size, tcg_set_tb_size,
> + NULL, NULL);
> object_class_property_set_description(oc, "tb-size",
> "TCG translation block cache size");
>
> diff --git a/accel/whpx/whpx-common.c b/accel/whpx/whpx-common.c
> index 247e12db8128..f82e60774580 100644
> --- a/accel/whpx/whpx-common.c
> +++ b/accel/whpx/whpx-common.c
> @@ -528,14 +528,14 @@ static void whpx_accel_class_init(ObjectClass *oc, const void *data)
> ac->pre_resume_vm = whpx_pre_resume_vm;
> ac->allowed = &whpx_allowed;
>
> - object_class_property_add(oc, "kernel-irqchip", "on|off|split",
> - NULL, whpx_set_kernel_irqchip,
> - NULL, NULL);
> + object_class_property_add(oc, "kernel-irqchip", "on|off|split", NULL,
> + NULL, whpx_set_kernel_irqchip,
> + NULL, NULL);
> object_class_property_set_description(oc, "kernel-irqchip",
> "Configure WHPX in-kernel irqchip");
> - object_class_property_add(oc, "hyperv", "OnOffAuto",
> - NULL, whpx_set_hyperv,
> - NULL, NULL);
> + object_class_property_add(oc, "hyperv", "OnOffAuto", NULL,
> + NULL, whpx_set_hyperv,
> + NULL, NULL);
> object_class_property_set_description(oc, "hyperv",
> "Configure Hyper-V enlightenments");
>
> diff --git a/authz/list.c b/authz/list.c
> index 17aa0efd80e8..72aedc6ac407 100644
> --- a/authz/list.c
> +++ b/authz/list.c
> @@ -126,7 +126,7 @@ qauthz_list_class_init(ObjectClass *oc, const void *data)
> qauthz_list_prop_get_policy,
> qauthz_list_prop_set_policy);
>
> - object_class_property_add(oc, "rules", "QAuthZListRule",
> + object_class_property_add(oc, "rules", "QAuthZListRule", NULL,
> qauthz_list_prop_get_rules,
> qauthz_list_prop_set_rules,
> NULL, NULL);
> diff --git a/backends/cryptodev.c b/backends/cryptodev.c
> index e8f2b18f2017..cc323014cc80 100644
> --- a/backends/cryptodev.c
> +++ b/backends/cryptodev.c
> @@ -622,15 +622,15 @@ cryptodev_backend_class_init(ObjectClass *oc, const void *data)
> ucc->prepare_delete = cryptodev_backend_prepare_delete;
>
> QTAILQ_INIT(&crypto_clients);
> - object_class_property_add(oc, "queues", "uint32",
> + object_class_property_add(oc, "queues", "uint32", NULL,
> cryptodev_backend_get_queues,
> cryptodev_backend_set_queues,
> NULL, NULL);
> - object_class_property_add(oc, "throttle-bps", "uint64",
> + object_class_property_add(oc, "throttle-bps", "uint64", NULL,
> cryptodev_backend_get_bps,
> cryptodev_backend_set_bps,
> NULL, NULL);
> - object_class_property_add(oc, "throttle-ops", "uint64",
> + object_class_property_add(oc, "throttle-ops", "uint64", NULL,
> cryptodev_backend_get_ops,
> cryptodev_backend_set_ops,
> NULL, NULL);
> diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
> index 7efecf71f565..aec38bac2f9e 100644
> --- a/backends/hostmem-file.c
> +++ b/backends/hostmem-file.c
> @@ -281,14 +281,14 @@ file_backend_class_init(ObjectClass *oc, const void *data)
> file_memory_backend_get_discard_data, file_memory_backend_set_discard_data);
> object_class_property_add_str(oc, "mem-path",
> get_mem_path, set_mem_path);
> - object_class_property_add(oc, "align", "uint64",
> - file_memory_backend_get_align,
> - file_memory_backend_set_align,
> - NULL, NULL);
> - object_class_property_add(oc, "offset", "int",
> - file_memory_backend_get_offset,
> - file_memory_backend_set_offset,
> - NULL, NULL);
> + object_class_property_add(oc, "align", "uint64", NULL,
> + file_memory_backend_get_align,
> + file_memory_backend_set_align,
> + NULL, NULL);
> + object_class_property_add(oc, "offset", "int", NULL,
> + file_memory_backend_get_offset,
> + file_memory_backend_set_offset,
> + NULL, NULL);
> object_class_property_set_description(oc, "offset",
> "Offset into the target file (ex: 1G)");
> #ifdef CONFIG_LIBPMEM
> @@ -298,8 +298,9 @@ file_backend_class_init(ObjectClass *oc, const void *data)
> object_class_property_add_bool(oc, "readonly",
> file_memory_backend_get_readonly,
> file_memory_backend_set_readonly);
> - object_class_property_add(oc, "rom", "OnOffAuto",
> - file_memory_backend_get_rom, file_memory_backend_set_rom, NULL, NULL);
> + object_class_property_add(oc, "rom", "OnOffAuto", NULL,
> + file_memory_backend_get_rom,
> + file_memory_backend_set_rom, NULL, NULL);
> object_class_property_set_description(oc, "rom",
> "Whether to create Read Only Memory (ROM)");
> }
> diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c
> index 666593ff6c0b..15dc8814ba11 100644
> --- a/backends/hostmem-memfd.c
> +++ b/backends/hostmem-memfd.c
> @@ -195,7 +195,7 @@ memfd_backend_class_init(ObjectClass *oc, const void *data)
> memfd_backend_set_hugetlb);
> object_class_property_set_description(oc, "hugetlb",
> "Use huge pages");
> - object_class_property_add(oc, "hugetlbsize", "uint64",
> + object_class_property_add(oc, "hugetlbsize", "uint64", NULL,
> memfd_backend_get_hugetlbsize,
> memfd_backend_set_hugetlbsize,
> NULL, NULL);
> @@ -203,7 +203,7 @@ memfd_backend_class_init(ObjectClass *oc, const void *data)
> "Huge pages size (ex: 2M, 1G)");
> }
>
> - object_class_property_add(oc, "guest-memfd", "OnOffAuto",
> + object_class_property_add(oc, "guest-memfd", "OnOffAuto", NULL,
> memfd_backend_get_guest_memfd,
> memfd_backend_set_guest_memfd, NULL, NULL);
> object_class_property_set_description(oc, "guest-memfd",
> diff --git a/backends/hostmem.c b/backends/hostmem.c
> index 8782c8b1ea98..299a3b90fe58 100644
> --- a/backends/hostmem.c
> +++ b/backends/hostmem.c
> @@ -528,10 +528,10 @@ host_memory_backend_class_init(ObjectClass *oc, const void *data)
> host_memory_backend_set_prealloc);
> object_class_property_set_description(oc, "prealloc",
> "Preallocate memory");
> - object_class_property_add(oc, "prealloc-threads", "int",
> - host_memory_backend_get_prealloc_threads,
> - host_memory_backend_set_prealloc_threads,
> - NULL, NULL);
> + object_class_property_add(oc, "prealloc-threads", "int", NULL,
> + host_memory_backend_get_prealloc_threads,
> + host_memory_backend_set_prealloc_threads,
> + NULL, NULL);
> object_class_property_set_description(oc, "prealloc-threads",
> "Number of CPU threads to use for prealloc");
> object_class_property_add_link(oc, "prealloc-context",
> @@ -539,16 +539,16 @@ host_memory_backend_class_init(ObjectClass *oc, const void *data)
> object_property_allow_set_link, OBJ_PROP_LINK_STRONG);
> object_class_property_set_description(oc, "prealloc-context",
> "Context to use for creating CPU threads for preallocation");
> - object_class_property_add(oc, "size", "size",
> - host_memory_backend_get_size,
> - host_memory_backend_set_size,
> - NULL, NULL);
> + object_class_property_add(oc, "size", "size", NULL,
> + host_memory_backend_get_size,
> + host_memory_backend_set_size,
> + NULL, NULL);
> object_class_property_set_description(oc, "size",
> "Size of the memory region (ex: 500M)");
> - object_class_property_add(oc, "host-nodes", "[uint16]",
> - host_memory_backend_get_host_nodes,
> - host_memory_backend_set_host_nodes,
> - NULL, NULL);
> + object_class_property_add(oc, "host-nodes", "[uint16]", NULL,
> + host_memory_backend_get_host_nodes,
> + host_memory_backend_set_host_nodes,
> + NULL, NULL);
> object_class_property_set_description(oc, "host-nodes",
> "Binds memory to the list of NUMA host nodes");
> object_class_property_add_enum(oc, "policy", "HostMemPolicy",
> diff --git a/block/throttle-groups.c b/block/throttle-groups.c
> index 37814b84fe09..cfe2ea67e3dc 100644
> --- a/block/throttle-groups.c
> +++ b/block/throttle-groups.c
> @@ -984,17 +984,14 @@ static void throttle_group_obj_class_init(ObjectClass *klass,
>
> /* individual properties */
> for (i = 0; i < sizeof(properties) / sizeof(ThrottleParamInfo); i++) {
> - object_class_property_add(klass,
> - properties[i].name,
> - "int64",
> + object_class_property_add(klass, properties[i].name, "int64", NULL,
> throttle_group_get,
> throttle_group_set,
> NULL, &properties[i]);
> }
>
> /* ThrottleLimits */
> - object_class_property_add(klass,
> - "limits", "ThrottleLimits",
> + object_class_property_add(klass, "limits", "ThrottleLimits", NULL,
> throttle_group_get_limits,
> throttle_group_set_limits,
> NULL, NULL);
> diff --git a/chardev/char-socket.c b/chardev/char-socket.c
> index 81bac42a1587..6ce9c2a50bc3 100644
> --- a/chardev/char-socket.c
> +++ b/chardev/char-socket.c
> @@ -1568,7 +1568,7 @@ static void char_socket_class_init(ObjectClass *oc, const void *data)
> cc->chr_listener_cleanup = tcp_chr_listener_cleanup;
> cc->chr_get_filename = tcp_chr_get_filename;
>
> - object_class_property_add(oc, "addr", "SocketAddress",
> + object_class_property_add(oc, "addr", "SocketAddress", NULL,
> char_socket_get_addr, NULL,
> NULL, NULL);
>
> diff --git a/crypto/secret_keyring.c b/crypto/secret_keyring.c
> index 3b332276ef5b..e9cb222bf8fb 100644
> --- a/crypto/secret_keyring.c
> +++ b/crypto/secret_keyring.c
> @@ -107,7 +107,7 @@ qcrypto_secret_keyring_class_init(ObjectClass *oc, const void *data)
> QCryptoSecretCommonClass *sic = QCRYPTO_SECRET_COMMON_CLASS(oc);
> sic->load_data = qcrypto_secret_keyring_load_data;
>
> - object_class_property_add(oc, "serial", "int32_t",
> + object_class_property_add(oc, "serial", "int32_t", NULL,
> qcrypto_secret_prop_get_key,
> qcrypto_secret_prop_set_key,
> NULL, NULL);
> diff --git a/event-loop-base.c b/event-loop-base.c
> index 23f554d92ce8..42bf09d58b28 100644
> --- a/event-loop-base.c
> +++ b/event-loop-base.c
> @@ -104,15 +104,15 @@ static void event_loop_base_class_init(ObjectClass *klass,
> ucc->complete = event_loop_base_complete;
> ucc->prepare_delete = event_loop_base_prepare_delete;
>
> - object_class_property_add(klass, "aio-max-batch", "int64",
> + object_class_property_add(klass, "aio-max-batch", "int64", NULL,
> event_loop_base_get_param,
> event_loop_base_set_param,
> NULL, &aio_max_batch_info);
> - object_class_property_add(klass, "thread-pool-min", "int64",
> + object_class_property_add(klass, "thread-pool-min", "int64", NULL,
> event_loop_base_get_param,
> event_loop_base_set_param,
> NULL, &thread_pool_min_info);
> - object_class_property_add(klass, "thread-pool-max", "int64",
> + object_class_property_add(klass, "thread-pool-max", "int64", NULL,
> event_loop_base_get_param,
> event_loop_base_set_param,
> NULL, &thread_pool_max_info);
> diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c
> index 6d421b990cef..f3e248c8daca 100644
> --- a/hw/acpi/ich9.c
> +++ b/hw/acpi/ich9.c
> @@ -379,7 +379,7 @@ void ich9_pm_add_class_properties(ObjectClass *oc, ptrdiff_t pm_offset)
> PM_REG_FIELD(acpi_pci_hotplug.root),
> object_property_allow_set_link,
> OBJ_PROP_LINK_STRONG);
> - object_class_property_add(oc, ACPI_PM_PROP_GPE0_BLK, "uint32",
> + object_class_property_add(oc, ACPI_PM_PROP_GPE0_BLK, "uint32", NULL,
> ich9_pm_get_gpe0_blk,
> NULL, NULL, NULL);
> object_class_property_add_uint8_ptr(oc, ACPI_PM_PROP_S3_DISABLED,
> diff --git a/hw/acpi/pci.c b/hw/acpi/pci.c
> index c82924be8620..abd1071f497e 100644
> --- a/hw/acpi/pci.c
> +++ b/hw/acpi/pci.c
> @@ -139,8 +139,8 @@ static void acpi_generic_initiator_class_init(ObjectClass *oc, const void *data)
> acpi_generic_initiator_set_pci_device);
> object_class_property_set_description(oc, "pci-dev",
> "PCI device to associate with the node");
> - object_class_property_add(oc, "node", "uint32", NULL,
> - acpi_generic_initiator_set_node, NULL, NULL);
> + object_class_property_add(oc, "node", "uint32", NULL, NULL,
> + acpi_generic_initiator_set_node, NULL, NULL);
> object_class_property_set_description(oc, "node",
> "NUMA node associated with the PCI device");
> }
> @@ -253,8 +253,8 @@ static void acpi_generic_port_class_init(ObjectClass *oc, const void *data)
> acpi_generic_port_set_pci_bus);
> object_class_property_set_description(oc, "pci-bus",
> "PCI Bus of the host bridge associated with this GP affinity structure");
> - object_class_property_add(oc, "node", "uint32", NULL,
> - acpi_generic_port_set_node, NULL, NULL);
> + object_class_property_add(oc, "node", "uint32", NULL, NULL,
> + acpi_generic_port_set_node, NULL, NULL);
> object_class_property_set_description(oc, "node",
> "The NUMA node like ID to index HMAT/SLIT NUMA properties involving GP");
> }
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index 0d56197dacee..4dc2ec1830f5 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -4207,9 +4207,9 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
> mc->default_ram_id = "mach-virt.ram";
> mc->default_nic = "virtio-net-pci";
>
> - object_class_property_add(oc, "acpi", "OnOffAuto",
> - virt_get_acpi, virt_set_acpi,
> - NULL, NULL);
> + object_class_property_add(oc, "acpi", "OnOffAuto", NULL,
> + virt_get_acpi, virt_set_acpi,
> + NULL, NULL);
> object_class_property_set_description(oc, "acpi",
> "Enable ACPI");
> object_class_property_add_bool(oc, "secure", virt_get_secure,
> @@ -4260,7 +4260,7 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
> "Set on/off to enable/disable high "
> "memory region for PCI MMIO");
>
> - object_class_property_add(oc, "highmem-mmio-size", "size",
> + object_class_property_add(oc, "highmem-mmio-size", "size", NULL,
> virt_get_highmem_mmio_size,
> virt_set_highmem_mmio_size,
> NULL, NULL);
> @@ -4268,7 +4268,7 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
> "Set the high memory region size "
> "for PCI MMIO");
>
> - object_class_property_add(oc, "virtio-mmio-transports", "uint8",
> + object_class_property_add(oc, "virtio-mmio-transports", "uint8", NULL,
> virt_get_virtio_transports,
> virt_set_virtio_transports,
> NULL, NULL);
> diff --git a/hw/core/clock.c b/hw/core/clock.c
> index 3fc98a0c65d5..d46c888f5c0c 100644
> --- a/hw/core/clock.c
> +++ b/hw/core/clock.c
> @@ -185,7 +185,7 @@ static void clock_initfn(Object *obj)
> QLIST_INIT(&clk->children);
>
> if (qtest_enabled()) {
> - object_property_add(obj, "qtest-clock-period", "uint64",
> + object_property_add(obj, "qtest-clock-period", "uint64", NULL,
> clock_period_prop_get, NULL, NULL, NULL);
> }
> }
> diff --git a/hw/core/machine.c b/hw/core/machine.c
> index d9ac4b419a36..50422750beed 100644
> --- a/hw/core/machine.c
> +++ b/hw/core/machine.c
> @@ -1118,26 +1118,29 @@ static void machine_class_init(ObjectClass *oc, const void *data)
> object_class_property_set_description(oc, "dumpdtb",
> "Dump current dtb to a file and quit");
>
> - object_class_property_add(oc, "boot", "BootConfiguration",
> - machine_get_boot, machine_set_boot,
> - NULL, NULL);
> + object_class_property_add(oc, "boot", "BootConfiguration", NULL,
> + machine_get_boot, machine_set_boot,
> + NULL, NULL);
> object_class_property_set_description(oc, "boot",
> "Boot configuration");
>
> - object_class_property_add(oc, "smp", "SMPConfiguration",
> - machine_get_smp, machine_set_smp,
> - NULL, NULL);
> + object_class_property_add(oc, "smp", "SMPConfiguration", NULL,
> + machine_get_smp, machine_set_smp,
> + NULL, NULL);
> object_class_property_set_description(oc, "smp",
> "CPU topology");
>
> object_class_property_add(oc, "smp-cache", "SmpCachePropertiesWrapper",
> - machine_get_smp_cache, machine_set_smp_cache, NULL, NULL);
> + NULL,
> + machine_get_smp_cache, machine_set_smp_cache,
> + NULL, NULL);
> object_class_property_set_description(oc, "smp-cache",
> "Cache properties list for SMP machine");
>
> - object_class_property_add(oc, "phandle-start", "int",
> - machine_get_phandle_start, machine_set_phandle_start,
> - NULL, NULL);
> + object_class_property_add(oc, "phandle-start", "int", NULL,
> + machine_get_phandle_start,
> + machine_set_phandle_start,
> + NULL, NULL);
> object_class_property_set_description(oc, "phandle-start",
> "The first phandle ID we may generate dynamically");
>
> @@ -1212,9 +1215,9 @@ static void machine_class_init(ObjectClass *oc, const void *data)
> "Set RAM backend"
> "Valid value is ID of hostmem based backend");
>
> - object_class_property_add(oc, "memory", "MemorySizeConfiguration",
> - machine_get_mem, machine_set_mem,
> - NULL, NULL);
> + object_class_property_add(oc, "memory", "MemorySizeConfiguration", NULL,
> + machine_get_mem, machine_set_mem,
> + NULL, NULL);
> object_class_property_set_description(oc, "memory",
> "Memory size configuration");
> }
> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
> index 34d7b26a7303..61dca80c95eb 100644
> --- a/hw/core/qdev-properties.c
> +++ b/hw/core/qdev-properties.c
> @@ -1150,7 +1150,7 @@ void qdev_property_add_static(DeviceState *dev, const Property *prop)
>
> assert(!prop->info->create);
>
> - op = object_property_add(obj, prop->name, prop->info->type,
> + op = object_property_add(obj, prop->name, prop->info->type, NULL,
> field_prop_getter(prop->info),
> field_prop_setter(prop->info),
> prop->info->release,
> @@ -1176,8 +1176,7 @@ static void qdev_class_add_property(DeviceClass *klass, const char *name,
> if (prop->info->create) {
> op = prop->info->create(oc, name, prop);
> } else {
> - op = object_class_property_add(oc,
> - name, prop->info->type,
> + op = object_class_property_add(oc, name, prop->info->type, NULL,
> field_prop_getter(prop->info),
> field_prop_setter(prop->info),
> prop->info->release,
> diff --git a/hw/cpu/core.c b/hw/cpu/core.c
> index 26e488f3d8e3..f430befad870 100644
> --- a/hw/cpu/core.c
> +++ b/hw/cpu/core.c
> @@ -82,9 +82,11 @@ static void cpu_core_class_init(ObjectClass *oc, const void *data)
> DeviceClass *dc = DEVICE_CLASS(oc);
>
> set_bit(DEVICE_CATEGORY_CPU, dc->categories);
> - object_class_property_add(oc, "core-id", "int", core_prop_get_core_id,
> + object_class_property_add(oc, "core-id", "int", NULL,
> + core_prop_get_core_id,
> core_prop_set_core_id, NULL, NULL);
> - object_class_property_add(oc, "nr-threads", "int", core_prop_get_nr_threads,
> + object_class_property_add(oc, "nr-threads", "int", NULL,
> + core_prop_get_nr_threads,
> core_prop_set_nr_threads, NULL, NULL);
> }
>
> diff --git a/hw/cxl/cxl-host.c b/hw/cxl/cxl-host.c
> index e279ce5fe3ae..2ddff574d1aa 100644
> --- a/hw/cxl/cxl-host.c
> +++ b/hw/cxl/cxl-host.c
> @@ -610,13 +610,13 @@ static void machine_set_cfmw(Object *obj, Visitor *v, const char *name,
>
> void cxl_machine_init(Object *obj, CXLState *state)
> {
> - object_property_add(obj, "cxl", "bool", machine_get_cxl,
> + object_property_add(obj, "cxl", "bool", NULL, machine_get_cxl,
> machine_set_cxl, NULL, state);
> object_property_set_description(obj, "cxl",
> "Set on/off to enable/disable "
> "CXL instantiation");
>
> - object_property_add(obj, "cxl-fmw", "CXLFixedMemoryWindow",
> + object_property_add(obj, "cxl-fmw", "CXLFixedMemoryWindow", NULL,
> machine_get_cfmw, machine_set_cfmw,
> NULL, state);
> object_property_set_description(obj, "cxl-fmw",
> diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
> index 1cf6f5df5505..4463cf7c9ff9 100644
> --- a/hw/gpio/aspeed_gpio.c
> +++ b/hw/gpio/aspeed_gpio.c
> @@ -1481,7 +1481,7 @@ static void aspeed_gpio_init(Object *obj)
> int pin_idx = j % GPIOS_PER_GROUP;
> const char *group = &props->group_label[group_idx][0];
> char *name = g_strdup_printf("gpio%s%d", group, pin_idx);
> - object_property_add(obj, name, "bool", aspeed_gpio_get_pin,
> + object_property_add(obj, name, "bool", NULL, aspeed_gpio_get_pin,
> aspeed_gpio_set_pin, NULL, NULL);
> g_free(name);
> }
> @@ -1489,8 +1489,8 @@ static void aspeed_gpio_init(Object *obj)
>
> for (int i = 0; i < agc->nr_gpio_sets; i++) {
> g_autofree char *name = g_strdup_printf("gpio-set[%d]", i);
> - object_property_add(obj, name, "uint32", aspeed_gpio_get_set,
> - aspeed_gpio_set_set, NULL, NULL);
> + object_property_add(obj, name, "uint32", NULL, aspeed_gpio_get_set,
> + aspeed_gpio_set_set, NULL, NULL);
> }
> }
>
> diff --git a/hw/gpio/aspeed_sgpio.c b/hw/gpio/aspeed_sgpio.c
> index 7d2f73699520..aeaef4f102fb 100644
> --- a/hw/gpio/aspeed_sgpio.c
> +++ b/hw/gpio/aspeed_sgpio.c
> @@ -300,7 +300,7 @@ static void aspeed_sgpio_init(Object *obj)
> {
> for (int i = 0; i < ASPEED_SGPIO_MAX_PIN_PAIR * 2; i++) {
> g_autofree char *name = g_strdup_printf("sgpio%03d", i);
> - object_property_add(obj, name, "bool", aspeed_sgpio_get_pin,
> + object_property_add(obj, name, "bool", NULL, aspeed_sgpio_get_pin,
> aspeed_sgpio_set_pin, NULL, NULL);
> }
> }
> diff --git a/hw/gpio/pca9552.c b/hw/gpio/pca9552.c
> index 719149b7174b..7e5fda4980ea 100644
> --- a/hw/gpio/pca9552.c
> +++ b/hw/gpio/pca9552.c
> @@ -567,12 +567,12 @@ static void pca955x_initfn(Object *obj)
> if (k->has_led_support) {
> /* LED variant: expose the LED selector state as led%d. */
> name = g_strdup_printf("led%d", ix);
> - object_property_add(obj, name, "bool",
> + object_property_add(obj, name, "bool", NULL,
> pca955x_get_led, pca955x_set_led, NULL, NULL);
> } else {
> /* GPIO variant: expose the pin logic level as pin%d. */
> name = g_strdup_printf("pin%d", ix);
> - object_property_add(obj, name, "str",
> + object_property_add(obj, name, "str", NULL,
> pca955x_get_pin, pca955x_set_pin, NULL, NULL);
> }
> g_free(name);
> diff --git a/hw/gpio/pca9554.c b/hw/gpio/pca9554.c
> index 904698cdce85..0dd063f93a67 100644
> --- a/hw/gpio/pca9554.c
> +++ b/hw/gpio/pca9554.c
> @@ -280,7 +280,8 @@ static void pca9554_initfn(Object *obj)
> char *name;
>
> name = g_strdup_printf("pin%d", pin);
> - object_property_add(obj, name, "str", pca9554_get_pin, pca9554_set_pin,
> + object_property_add(obj, name, "str", NULL, pca9554_get_pin,
> + pca9554_set_pin,
> NULL, NULL);
> g_free(name);
> }
> diff --git a/hw/gpio/stm32l4x5_gpio.c b/hw/gpio/stm32l4x5_gpio.c
> index 92fa397fbafe..a31999323ab9 100644
> --- a/hw/gpio/stm32l4x5_gpio.c
> +++ b/hw/gpio/stm32l4x5_gpio.c
> @@ -409,10 +409,10 @@ static void stm32l4x5_gpio_init(Object *obj)
>
> s->clk = qdev_init_clock_in(DEVICE(s), "clk", NULL, s, 0);
>
> - object_property_add(obj, "disconnected-pins", "uint16",
> + object_property_add(obj, "disconnected-pins", "uint16", NULL,
> disconnected_pins_get, disconnected_pins_set,
> NULL, &s->disconnected_pins);
> - object_property_add(obj, "clock-freq-hz", "uint32",
> + object_property_add(obj, "clock-freq-hz", "uint32", NULL,
> clock_freq_get, NULL, NULL, NULL);
> }
>
> diff --git a/hw/hexagon/hexagon_dsp.c b/hw/hexagon/hexagon_dsp.c
> index 05b95f39aa26..abccf10c005a 100644
> --- a/hw/hexagon/hexagon_dsp.c
> +++ b/hw/hexagon/hexagon_dsp.c
> @@ -153,7 +153,7 @@ static void hexagon_sim_set_subsystem_base(Object *obj, Visitor *v,
>
> static void add_dsp_properties(ObjectClass *oc)
> {
> - object_class_property_add(oc, "subsystem-base", "uint32",
> + object_class_property_add(oc, "subsystem-base", "uint32", NULL,
> hexagon_sim_get_subsystem_base,
> hexagon_sim_set_subsystem_base, NULL, NULL);
> object_class_property_set_description(oc, "subsystem-base",
> diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
> index a49de3374979..c679b3b17713 100644
> --- a/hw/i386/microvm.c
> +++ b/hw/i386/microvm.c
> @@ -673,21 +673,21 @@ static void microvm_class_init(ObjectClass *oc, const void *data)
> hc->unplug_request = microvm_device_unplug_request_cb;
> hc->unplug = microvm_device_unplug_cb;
>
> - object_class_property_add(oc, MICROVM_MACHINE_RTC, "OnOffAuto",
> + object_class_property_add(oc, MICROVM_MACHINE_RTC, "OnOffAuto", NULL,
> microvm_machine_get_rtc,
> microvm_machine_set_rtc,
> NULL, NULL);
> object_class_property_set_description(oc, MICROVM_MACHINE_RTC,
> "Enable MC146818 RTC");
>
> - object_class_property_add(oc, MICROVM_MACHINE_PCIE, "OnOffAuto",
> + object_class_property_add(oc, MICROVM_MACHINE_PCIE, "OnOffAuto", NULL,
> microvm_machine_get_pcie,
> microvm_machine_set_pcie,
> NULL, NULL);
> object_class_property_set_description(oc, MICROVM_MACHINE_PCIE,
> "Enable PCIe");
>
> - object_class_property_add(oc, MICROVM_MACHINE_IOAPIC2, "OnOffAuto",
> + object_class_property_add(oc, MICROVM_MACHINE_IOAPIC2, "OnOffAuto", NULL,
> microvm_machine_get_ioapic2,
> microvm_machine_set_ioapic2,
> NULL, NULL);
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index dbfd55de3017..1fce96f5ec36 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1722,15 +1722,16 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
> mc->default_ram_id = "pc.ram";
> pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_AUTO;
>
> - object_class_property_add(oc, PC_MACHINE_MAX_RAM_BELOW_4G, "size",
> - pc_machine_get_max_ram_below_4g, pc_machine_set_max_ram_below_4g,
> - NULL, NULL);
> + object_class_property_add(oc, PC_MACHINE_MAX_RAM_BELOW_4G, "size", NULL,
> + pc_machine_get_max_ram_below_4g,
> + pc_machine_set_max_ram_below_4g,
> + NULL, NULL);
> object_class_property_set_description(oc, PC_MACHINE_MAX_RAM_BELOW_4G,
> "Maximum ram below the 4G boundary (32bit boundary)");
>
> - object_class_property_add(oc, PC_MACHINE_VMPORT, "OnOffAuto",
> - pc_machine_get_vmport, pc_machine_set_vmport,
> - NULL, NULL);
> + object_class_property_add(oc, PC_MACHINE_VMPORT, "OnOffAuto", NULL,
> + pc_machine_get_vmport, pc_machine_set_vmport,
> + NULL, NULL);
> object_class_property_set_description(oc, PC_MACHINE_VMPORT,
> "Enable vmport (pc & q35)");
>
> @@ -1758,15 +1759,17 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
> pc_machine_get_default_bus_bypass_iommu,
> pc_machine_set_default_bus_bypass_iommu);
>
> - object_class_property_add(oc, PC_MACHINE_MAX_FW_SIZE, "size",
> - pc_machine_get_max_fw_size, pc_machine_set_max_fw_size,
> - NULL, NULL);
> + object_class_property_add(oc, PC_MACHINE_MAX_FW_SIZE, "size", NULL,
> + pc_machine_get_max_fw_size,
> + pc_machine_set_max_fw_size,
> + NULL, NULL);
> object_class_property_set_description(oc, PC_MACHINE_MAX_FW_SIZE,
> "Maximum combined firmware size");
>
> - object_class_property_add(oc, PC_MACHINE_SMBIOS_EP, "str",
> - pc_machine_get_smbios_ep, pc_machine_set_smbios_ep,
> - NULL, NULL);
> + object_class_property_add(oc, PC_MACHINE_SMBIOS_EP, "str", NULL,
> + pc_machine_get_smbios_ep,
> + pc_machine_set_smbios_ep,
> + NULL, NULL);
> object_class_property_set_description(oc, PC_MACHINE_SMBIOS_EP,
> "SMBIOS Entry Point type [32, 64]");
>
> diff --git a/hw/i386/sgx-epc.c b/hw/i386/sgx-epc.c
> index 29cda843c942..a1b55c2ec36f 100644
> --- a/hw/i386/sgx-epc.c
> +++ b/hw/i386/sgx-epc.c
> @@ -159,7 +159,7 @@ static void sgx_epc_class_init(ObjectClass *oc, const void *data)
> 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",
> + object_class_property_add(oc, SGX_EPC_SIZE_PROP, "uint64", NULL,
> sgx_epc_get_size,
> NULL,
> NULL, NULL);
> diff --git a/hw/i386/x86.c b/hw/i386/x86.c
> index f8ba3244e221..1b7740a97eb6 100644
> --- a/hw/i386/x86.c
> +++ b/hw/i386/x86.c
> @@ -391,26 +391,26 @@ static void x86_machine_class_init(ObjectClass *oc, const void *data)
> mc->kvm_type = x86_kvm_type;
> nc->raise_nmi = x86_nmi;
>
> - object_class_property_add(oc, X86_MACHINE_SMM, "OnOffAuto",
> - x86_machine_get_smm, x86_machine_set_smm,
> - NULL, NULL);
> + object_class_property_add(oc, X86_MACHINE_SMM, "OnOffAuto", NULL,
> + x86_machine_get_smm, x86_machine_set_smm,
> + NULL, NULL);
> object_class_property_set_description(oc, X86_MACHINE_SMM,
> "Enable SMM");
>
> - object_class_property_add(oc, X86_MACHINE_ACPI, "OnOffAuto",
> - x86_machine_get_acpi, x86_machine_set_acpi,
> - NULL, NULL);
> + object_class_property_add(oc, X86_MACHINE_ACPI, "OnOffAuto", NULL,
> + x86_machine_get_acpi, x86_machine_set_acpi,
> + NULL, NULL);
> object_class_property_set_description(oc, X86_MACHINE_ACPI,
> "Enable ACPI");
>
> - object_class_property_add(oc, X86_MACHINE_PIT, "OnOffAuto",
> + object_class_property_add(oc, X86_MACHINE_PIT, "OnOffAuto", NULL,
> x86_machine_get_pit,
> x86_machine_set_pit,
> NULL, NULL);
> object_class_property_set_description(oc, X86_MACHINE_PIT,
> "Enable i8254 PIT");
>
> - object_class_property_add(oc, X86_MACHINE_PIC, "OnOffAuto",
> + object_class_property_add(oc, X86_MACHINE_PIC, "OnOffAuto", NULL,
> x86_machine_get_pic,
> x86_machine_set_pic,
> NULL, NULL);
> @@ -435,14 +435,15 @@ static void x86_machine_class_init(ObjectClass *oc, const void *data)
> "The string may be up to 8 bytes in size");
>
> object_class_property_add(oc, X86_MACHINE_BUS_LOCK_RATELIMIT, "uint64_t",
> + NULL,
> x86_machine_get_bus_lock_ratelimit,
> x86_machine_set_bus_lock_ratelimit, NULL, NULL);
> object_class_property_set_description(oc, X86_MACHINE_BUS_LOCK_RATELIMIT,
> "Set the ratelimit for the bus locks acquired in VMs");
>
> - object_class_property_add(oc, "sgx-epc", "SgxEPC",
> - machine_get_sgx_epc, machine_set_sgx_epc,
> - NULL, NULL);
> + object_class_property_add(oc, "sgx-epc", "SgxEPC", NULL,
> + machine_get_sgx_epc, machine_set_sgx_epc,
> + NULL, NULL);
> object_class_property_set_description(oc, "sgx-epc",
> "SGX EPC device");
> }
> diff --git a/hw/ide/ide-dev.c b/hw/ide/ide-dev.c
> index 5d478588c614..7bb06088a5f3 100644
> --- a/hw/ide/ide-dev.c
> +++ b/hw/ide/ide-dev.c
> @@ -174,7 +174,7 @@ out:
>
> static void ide_dev_instance_init(Object *obj)
> {
> - object_property_add(obj, "bootindex", "int32",
> + object_property_add(obj, "bootindex", "int32", NULL,
> ide_dev_get_bootindex,
> ide_dev_set_bootindex, NULL, NULL);
> object_property_set_int(obj, "bootindex", -1, NULL);
> diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
> index 0f0f37d45734..ee5f6cb4c33e 100644
> --- a/hw/intc/apic_common.c
> +++ b/hw/intc/apic_common.c
> @@ -442,7 +442,7 @@ static void apic_common_initfn(Object *obj)
> APICCommonState *s = APIC_COMMON(obj);
>
> s->id = s->initial_apic_id = -1;
> - object_property_add(obj, "id", "uint32",
> + object_property_add(obj, "id", "uint32", NULL,
> apic_common_get_id,
> apic_common_set_id, NULL, NULL);
> }
> diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
> index 9c5371af9dee..8ad327b8ddb0 100644
> --- a/hw/loongarch/virt.c
> +++ b/hw/loongarch/virt.c
> @@ -1483,18 +1483,18 @@ static void virt_class_init(ObjectClass *oc, const void *data)
> hc->unplug_request = virt_device_unplug_request;
> hc->unplug = virt_device_unplug;
>
> - object_class_property_add(oc, "acpi", "OnOffAuto",
> - virt_get_acpi, virt_set_acpi,
> - NULL, NULL);
> + object_class_property_add(oc, "acpi", "OnOffAuto", NULL,
> + virt_get_acpi, virt_set_acpi,
> + NULL, NULL);
> object_class_property_set_description(oc, "acpi",
> "Enable ACPI");
> - object_class_property_add(oc, "v-eiointc", "OnOffAuto",
> - virt_get_veiointc, virt_set_veiointc,
> - NULL, NULL);
> + object_class_property_add(oc, "v-eiointc", "OnOffAuto", NULL,
> + virt_get_veiointc, virt_set_veiointc,
> + NULL, NULL);
> object_class_property_set_description(oc, "v-eiointc",
> "Enable Virt Extend I/O Interrupt Controller.");
> - object_class_property_add(oc, "dmsi", "OnOffAuto",
> - virt_get_dmsi, virt_set_dmsi, NULL, NULL);
> + object_class_property_add(oc, "dmsi", "OnOffAuto", NULL,
> + virt_get_dmsi, virt_set_dmsi, NULL, NULL);
> object_class_property_set_description(oc, "dmsi",
> "Enable direct Message-interrupts Controller.");
> machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
> @@ -1525,7 +1525,7 @@ static void virt_class_init(ObjectClass *oc, const void *data)
> object_class_property_set_description(oc, "highmem-mmio",
> "Set on/off to enable/disable high "
> "memory region for PCI MMIO");
> - object_class_property_add(oc, "highmem-mmio-size", "size",
> + object_class_property_add(oc, "highmem-mmio-size", "size", NULL,
> virt_get_highmem_mmio_size,
> virt_set_highmem_mmio_size,
> NULL, NULL);
> diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
> index cf8a4d8c5f2a..8d6e8d0bd93c 100644
> --- a/hw/mem/nvdimm.c
> +++ b/hw/mem/nvdimm.c
> @@ -99,11 +99,12 @@ static void nvdimm_set_uuid(Object *obj, Visitor *v, const char *name,
>
> static void nvdimm_init(Object *obj)
> {
> - object_property_add(obj, NVDIMM_LABEL_SIZE_PROP, "size",
> + object_property_add(obj, NVDIMM_LABEL_SIZE_PROP, "size", NULL,
> nvdimm_get_label_size, nvdimm_set_label_size, NULL,
> NULL);
>
> - object_property_add(obj, NVDIMM_UUID_PROP, "QemuUUID", nvdimm_get_uuid,
> + object_property_add(obj, NVDIMM_UUID_PROP, "QemuUUID", NULL,
> + nvdimm_get_uuid,
> nvdimm_set_uuid, NULL, NULL);
> }
>
> diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
> index 68862926ee2d..7250146c10d8 100644
> --- a/hw/mem/pc-dimm.c
> +++ b/hw/mem/pc-dimm.c
> @@ -176,7 +176,8 @@ static void pc_dimm_get_size(Object *obj, Visitor *v, const char *name,
>
> static void pc_dimm_init(Object *obj)
> {
> - object_property_add(obj, PC_DIMM_SIZE_PROP, "uint64", pc_dimm_get_size,
> + object_property_add(obj, PC_DIMM_SIZE_PROP, "uint64", NULL,
> + pc_dimm_get_size,
> NULL, NULL, NULL);
> }
>
> diff --git a/hw/misc/aspeed_lpc.c b/hw/misc/aspeed_lpc.c
> index 7f7e4f1a0985..a73df0733217 100644
> --- a/hw/misc/aspeed_lpc.c
> +++ b/hw/misc/aspeed_lpc.c
> @@ -417,29 +417,41 @@ static void aspeed_lpc_realize(DeviceState *dev, Error **errp)
>
> static void aspeed_lpc_init(Object *obj)
> {
> - object_property_add(obj, "idr1", "uint32", aspeed_kcs_get_register_property,
> + object_property_add(obj, "idr1", "uint32", NULL,
> + aspeed_kcs_get_register_property,
> aspeed_kcs_set_register_property, NULL, NULL);
> - object_property_add(obj, "odr1", "uint32", aspeed_kcs_get_register_property,
> + object_property_add(obj, "odr1", "uint32", NULL,
> + aspeed_kcs_get_register_property,
> aspeed_kcs_set_register_property, NULL, NULL);
> - object_property_add(obj, "str1", "uint32", aspeed_kcs_get_register_property,
> + object_property_add(obj, "str1", "uint32", NULL,
> + aspeed_kcs_get_register_property,
> aspeed_kcs_set_register_property, NULL, NULL);
> - object_property_add(obj, "idr2", "uint32", aspeed_kcs_get_register_property,
> + object_property_add(obj, "idr2", "uint32", NULL,
> + aspeed_kcs_get_register_property,
> aspeed_kcs_set_register_property, NULL, NULL);
> - object_property_add(obj, "odr2", "uint32", aspeed_kcs_get_register_property,
> + object_property_add(obj, "odr2", "uint32", NULL,
> + aspeed_kcs_get_register_property,
> aspeed_kcs_set_register_property, NULL, NULL);
> - object_property_add(obj, "str2", "uint32", aspeed_kcs_get_register_property,
> + object_property_add(obj, "str2", "uint32", NULL,
> + aspeed_kcs_get_register_property,
> aspeed_kcs_set_register_property, NULL, NULL);
> - object_property_add(obj, "idr3", "uint32", aspeed_kcs_get_register_property,
> + object_property_add(obj, "idr3", "uint32", NULL,
> + aspeed_kcs_get_register_property,
> aspeed_kcs_set_register_property, NULL, NULL);
> - object_property_add(obj, "odr3", "uint32", aspeed_kcs_get_register_property,
> + object_property_add(obj, "odr3", "uint32", NULL,
> + aspeed_kcs_get_register_property,
> aspeed_kcs_set_register_property, NULL, NULL);
> - object_property_add(obj, "str3", "uint32", aspeed_kcs_get_register_property,
> + object_property_add(obj, "str3", "uint32", NULL,
> + aspeed_kcs_get_register_property,
> aspeed_kcs_set_register_property, NULL, NULL);
> - object_property_add(obj, "idr4", "uint32", aspeed_kcs_get_register_property,
> + object_property_add(obj, "idr4", "uint32", NULL,
> + aspeed_kcs_get_register_property,
> aspeed_kcs_set_register_property, NULL, NULL);
> - object_property_add(obj, "odr4", "uint32", aspeed_kcs_get_register_property,
> + object_property_add(obj, "odr4", "uint32", NULL,
> + aspeed_kcs_get_register_property,
> aspeed_kcs_set_register_property, NULL, NULL);
> - object_property_add(obj, "str4", "uint32", aspeed_kcs_get_register_property,
> + object_property_add(obj, "str4", "uint32", NULL,
> + aspeed_kcs_get_register_property,
> aspeed_kcs_set_register_property, NULL, NULL);
> }
>
> diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
> index f8fbaebee6ab..427816b83899 100644
> --- a/hw/misc/aspeed_sdmc.c
> +++ b/hw/misc/aspeed_sdmc.c
> @@ -259,7 +259,7 @@ static void aspeed_sdmc_set_ram_size(Object *obj, Visitor *v, const char *name,
>
> static void aspeed_sdmc_initfn(Object *obj)
> {
> - object_property_add(obj, "ram-size", "int",
> + object_property_add(obj, "ram-size", "int", NULL,
> aspeed_sdmc_get_ram_size, aspeed_sdmc_set_ram_size,
> NULL, NULL);
> }
> diff --git a/hw/misc/npcm7xx_mft.c b/hw/misc/npcm7xx_mft.c
> index 742166c4e828..3ce92fad3afc 100644
> --- a/hw/misc/npcm7xx_mft.c
> +++ b/hw/misc/npcm7xx_mft.c
> @@ -491,7 +491,7 @@ static void npcm7xx_mft_init(Object *obj)
> s->clock_2 = qdev_init_clock_out(dev, "clock2");
>
> for (int i = 0; i < NPCM7XX_PWM_PER_MODULE; ++i) {
> - object_property_add(obj, "max_rpm[*]", "uint32",
> + object_property_add(obj, "max_rpm[*]", "uint32", NULL,
> npcm7xx_mft_get_max_rpm,
> npcm7xx_mft_set_max_rpm,
> NULL, &s->max_rpm[i]);
> diff --git a/hw/net/ne2000-isa.c b/hw/net/ne2000-isa.c
> index 673c785abc94..02300eaaa6fd 100644
> --- a/hw/net/ne2000-isa.c
> +++ b/hw/net/ne2000-isa.c
> @@ -131,7 +131,7 @@ out:
>
> static void isa_ne2000_instance_init(Object *obj)
> {
> - object_property_add(obj, "bootindex", "int32",
> + object_property_add(obj, "bootindex", "int32", NULL,
> isa_ne2000_get_bootindex,
> isa_ne2000_set_bootindex, NULL, NULL);
> object_property_set_int(obj, "bootindex", -1, NULL);
> diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c
> index 578421c21761..405010af4bf1 100644
> --- a/hw/nvme/ctrl.c
> +++ b/hw/nvme/ctrl.c
> @@ -10612,7 +10612,7 @@ static void nvme_instance_init(Object *obj)
> "bootindex", "/namespace@1,0",
> DEVICE(obj));
>
> - object_property_add(obj, "smart_critical_warning", "uint8",
> + object_property_add(obj, "smart_critical_warning", "uint8", NULL,
> nvme_get_smart_warning,
> nvme_set_smart_warning, NULL, NULL);
> }
> diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c
> index 40ffbc4e0821..1b22f5e383e1 100644
> --- a/hw/pci-bridge/pci_expander_bridge.c
> +++ b/hw/pci-bridge/pci_expander_bridge.c
> @@ -103,7 +103,7 @@ static void pxb_bus_class_init(ObjectClass *class, const void *data)
> pbc->bus_num = pxb_bus_num;
> pbc->numa_node = pxb_bus_numa_node;
>
> - object_class_property_add(class, "acpi_uid", "uint32",
> + object_class_property_add(class, "acpi_uid", "uint32", NULL,
> prop_pxb_uid_get, NULL, NULL, NULL);
> object_class_property_set_description(class, "acpi_uid",
> "ACPI Unique ID used to distinguish this PCI Host Bridge / ACPI00016");
> diff --git a/hw/pci-host/i440fx.c b/hw/pci-host/i440fx.c
> index c1982f7962a6..bf4b6c425345 100644
> --- a/hw/pci-host/i440fx.c
> +++ b/hw/pci-host/i440fx.c
> @@ -388,18 +388,22 @@ static void i440fx_pcihost_class_init(ObjectClass *klass, const void *data)
> dc->user_creatable = false;
>
> object_class_property_add(klass, PCI_HOST_PROP_PCI_HOLE_START, "uint32",
> + NULL,
> i440fx_pcihost_get_pci_hole_start,
> NULL, NULL, NULL);
>
> object_class_property_add(klass, PCI_HOST_PROP_PCI_HOLE_END, "uint32",
> + NULL,
> i440fx_pcihost_get_pci_hole_end,
> NULL, NULL, NULL);
>
> object_class_property_add(klass, PCI_HOST_PROP_PCI_HOLE64_START, "uint64",
> + NULL,
> i440fx_pcihost_get_pci_hole64_start,
> NULL, NULL, NULL);
>
> object_class_property_add(klass, PCI_HOST_PROP_PCI_HOLE64_END, "uint64",
> + NULL,
> i440fx_pcihost_get_pci_hole64_end,
> NULL, NULL, NULL);
> }
> diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c
> index db061c134e95..c45401d9dd96 100644
> --- a/hw/pci-host/pnv_phb3.c
> +++ b/hw/pci-host/pnv_phb3.c
> @@ -1164,12 +1164,12 @@ static void pnv_phb3_root_bus_class_init(ObjectClass *klass, const void *data)
> {
> BusClass *k = BUS_CLASS(klass);
>
> - object_class_property_add(klass, "phb-id", "uint32",
> + object_class_property_add(klass, "phb-id", "uint32", NULL,
> pnv_phb3_root_bus_get_prop,
> pnv_phb3_root_bus_set_prop,
> NULL, NULL);
>
> - object_class_property_add(klass, "chip-id", "uint32",
> + object_class_property_add(klass, "chip-id", "uint32", NULL,
> pnv_phb3_root_bus_get_prop,
> pnv_phb3_root_bus_set_prop,
> NULL, NULL);
> diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c
> index 9acaf4c0c2f5..6727cbc3813a 100644
> --- a/hw/pci-host/pnv_phb4.c
> +++ b/hw/pci-host/pnv_phb4.c
> @@ -1761,12 +1761,12 @@ static void pnv_phb4_root_bus_class_init(ObjectClass *klass, const void *data)
> {
> BusClass *k = BUS_CLASS(klass);
>
> - object_class_property_add(klass, "phb-id", "uint32",
> + object_class_property_add(klass, "phb-id", "uint32", NULL,
> pnv_phb4_root_bus_get_prop,
> pnv_phb4_root_bus_set_prop,
> NULL, NULL);
>
> - object_class_property_add(klass, "chip-id", "uint32",
> + object_class_property_add(klass, "chip-id", "uint32", NULL,
> pnv_phb4_root_bus_get_prop,
> pnv_phb4_root_bus_set_prop,
> NULL, NULL);
> diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
> index f4556ad03a04..027ae02066de 100644
> --- a/hw/pci-host/q35.c
> +++ b/hw/pci-host/q35.c
> @@ -226,19 +226,19 @@ static void q35_host_initfn(Object *obj)
> qdev_prop_set_uint64(DEVICE(s), PCI_HOST_PROP_PCI_HOLE64_SIZE,
> Q35_PCI_HOST_HOLE64_SIZE_DEFAULT);
>
> - object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_START, "uint32",
> + object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_START, "uint32", NULL,
> q35_host_get_pci_hole_start,
> NULL, NULL, NULL);
>
> - object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_END, "uint32",
> + object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_END, "uint32", NULL,
> q35_host_get_pci_hole_end,
> NULL, NULL, NULL);
>
> - object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_START, "uint64",
> + object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_START, "uint64", NULL,
> q35_host_get_pci_hole64_start,
> NULL, NULL, NULL);
>
> - object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_END, "uint64",
> + object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_END, "uint64", NULL,
> q35_host_get_pci_hole64_end,
> NULL, NULL, NULL);
>
> diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
> index 0d659e9b0251..b8c48bca8a15 100644
> --- a/hw/ppc/spapr_caps.c
> +++ b/hw/ppc/spapr_caps.c
> @@ -1069,7 +1069,7 @@ void spapr_caps_add_properties(SpaprMachineClass *smc)
> g_autofree char *name = g_strdup_printf("cap-%s", cap->name);
> g_autofree char *desc = g_strdup(cap->description);
>
> - object_class_property_add(klass, name, cap->type,
> + object_class_property_add(klass, name, cap->type, NULL,
> cap->get, cap->set,
> NULL, cap);
>
> diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
> index 5c2150b71c86..a33f0949d1e3 100644
> --- a/hw/ppc/spapr_drc.c
> +++ b/hw/ppc/spapr_drc.c
> @@ -584,9 +584,9 @@ static void spapr_dr_connector_instance_init(Object *obj)
> SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
>
> object_property_add_uint32_ptr(obj, "id", &drc->id, OBJ_PROP_FLAG_READ);
> - object_property_add(obj, "index", "uint32", prop_get_index,
> + object_property_add(obj, "index", "uint32", NULL, prop_get_index,
> NULL, NULL, NULL);
> - object_property_add(obj, "fdt", "struct", prop_get_fdt,
> + object_property_add(obj, "fdt", "struct", NULL, prop_get_fdt,
> NULL, NULL, NULL);
> drc->state = drck->empty_state;
> }
> diff --git a/hw/remote/vfio-user-obj.c b/hw/remote/vfio-user-obj.c
> index a0498d218faf..c4b3cb0b7b87 100644
> --- a/hw/remote/vfio-user-obj.c
> +++ b/hw/remote/vfio-user-obj.c
> @@ -931,7 +931,7 @@ static void vfu_object_class_init(ObjectClass *klass, const void *data)
>
> k->nr_devs = 0;
>
> - object_class_property_add(klass, "socket", "SocketAddress", NULL,
> + object_class_property_add(klass, "socket", "SocketAddress", NULL, NULL,
> vfu_object_set_socket, NULL, NULL);
> object_class_property_set_description(klass, "socket",
> "SocketAddress "
> diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
> index edd29626fa07..04c48a4eda93 100644
> --- a/hw/riscv/microchip_pfsoc.c
> +++ b/hw/riscv/microchip_pfsoc.c
> @@ -744,6 +744,7 @@ static void microchip_icicle_kit_machine_class_init(ObjectClass *oc,
> mc->default_ram_size = 1537 * MiB;
>
> object_class_property_add(oc, "clint-timebase-frequency", "uint32_t",
> + NULL,
> microchip_icicle_kit_get_clint_timebase_freq,
> microchip_icicle_kit_set_clint_timebase_freq,
> NULL, NULL);
> diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
> index de1c92463ad4..65f4c67bff97 100644
> --- a/hw/riscv/virt.c
> +++ b/hw/riscv/virt.c
> @@ -1184,13 +1184,13 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
> object_class_property_set_description(oc, "aia-guests", str);
> }
>
> - object_class_property_add(oc, "acpi", "OnOffAuto",
> + object_class_property_add(oc, "acpi", "OnOffAuto", NULL,
> virt_get_acpi, virt_set_acpi,
> NULL, NULL);
> object_class_property_set_description(oc, "acpi",
> "Enable ACPI");
>
> - object_class_property_add(oc, "iommu-sys", "OnOffAuto",
> + object_class_property_add(oc, "iommu-sys", "OnOffAuto", NULL,
> virt_get_iommu_sys, virt_set_iommu_sys,
> NULL, NULL);
> object_class_property_set_description(oc, "iommu-sys",
> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
> index fda5ecc9ad3c..7d4392d73fa2 100644
> --- a/hw/s390x/s390-virtio-ccw.c
> +++ b/hw/s390x/s390-virtio-ccw.c
> @@ -908,7 +908,7 @@ static void ccw_machine_class_init(ObjectClass *oc, const void *data)
> object_class_property_set_description(oc, "dea-key-wrap",
> "enable/disable DEA key wrapping using the CPACF wrapping key");
>
> - object_class_property_add(oc, "loadparm", "loadparm",
> + object_class_property_add(oc, "loadparm", "loadparm", NULL,
> machine_get_loadparm, machine_set_loadparm,
> NULL, NULL);
> object_class_property_set_description(oc, "loadparm",
> @@ -916,7 +916,7 @@ static void ccw_machine_class_init(ObjectClass *oc, const void *data)
> " to upper case) to pass to machine loader, boot manager,"
> " and guest kernel");
>
> - object_class_property_add(oc, "boot-certs", "BootCertificatesList",
> + object_class_property_add(oc, "boot-certs", "BootCertificatesList", NULL,
> machine_get_boot_certs, machine_set_boot_certs, NULL, NULL);
> object_class_property_set_description(oc, "boot-certs",
> "provide paths to a directory and/or a certificate file for secure boot");
> diff --git a/hw/s390x/sclpcpi.c b/hw/s390x/sclpcpi.c
> index ec4bdf23509b..90cb36aad6f2 100644
> --- a/hw/s390x/sclpcpi.c
> +++ b/hw/s390x/sclpcpi.c
> @@ -195,12 +195,14 @@ static void cpi_class_init(ObjectClass *klass, const void *data)
> "name of the cluster which the VM belongs to, if any"
> " e.g. \"PLEX \"");
>
> - object_class_property_add(klass, "system_level", "uint64", get_system_level,
> + object_class_property_add(klass, "system_level", "uint64", NULL,
> + get_system_level,
> NULL, NULL, NULL);
> object_class_property_set_description(klass, "system_level",
> "distribution and kernel version in Linux e.g. 74872343805430528");
>
> - object_class_property_add(klass, "timestamp", "uint64", get_timestamp,
> + object_class_property_add(klass, "timestamp", "uint64", NULL,
> + get_timestamp,
> NULL, NULL, NULL);
> object_class_property_set_description(klass, "timestamp",
> "latest update of CPI data in nanoseconds since the UNIX EPOCH");
> diff --git a/hw/s390x/virtio-ccw-mem.c b/hw/s390x/virtio-ccw-mem.c
> index dea30aacfb32..1dc19ca9146e 100644
> --- a/hw/s390x/virtio-ccw-mem.c
> +++ b/hw/s390x/virtio-ccw-mem.c
> @@ -205,7 +205,7 @@ static void virtio_ccw_mem_instance_init(Object *obj)
> OBJECT(&dev->vdev), VIRTIO_MEM_BLOCK_SIZE_PROP);
> object_property_add_alias(obj, VIRTIO_MEM_SIZE_PROP, OBJECT(&dev->vdev),
> VIRTIO_MEM_SIZE_PROP);
> - object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size",
> + object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size", NULL,
> virtio_ccw_mem_get_requested_size,
> virtio_ccw_mem_set_requested_size, NULL, NULL);
> }
> diff --git a/hw/sensor/adc128d818.c b/hw/sensor/adc128d818.c
> index c65508cba144..14d79d395834 100644
> --- a/hw/sensor/adc128d818.c
> +++ b/hw/sensor/adc128d818.c
> @@ -642,14 +642,16 @@ static void adc128d818_initfn(Object *obj)
> for (unsigned ch = 0u; ch < ADC128D818_NUM_CHANNELS; ch++) {
> char *name = g_strdup_printf("ain%u", ch);
>
> - object_property_add(obj, name, "int", adc128d818_get_ain,
> + object_property_add(obj, name, "int", NULL, adc128d818_get_ain,
> adc128d818_set_ain, NULL, NULL);
> g_free(name);
> }
>
> - object_property_add(obj, "temperature", "int", adc128d818_get_temperature,
> + object_property_add(obj, "temperature", "int", NULL,
> + adc128d818_get_temperature,
> adc128d818_set_temperature, NULL, NULL);
> - object_property_add(obj, "ext-vref-mv", "int", adc128d818_get_ext_vref,
> + object_property_add(obj, "ext-vref-mv", "int", NULL,
> + adc128d818_get_ext_vref,
> adc128d818_set_ext_vref, NULL, NULL);
> }
>
> diff --git a/hw/sensor/adm1266.c b/hw/sensor/adm1266.c
> index 37d1cffd57a9..7927845e328c 100644
> --- a/hw/sensor/adm1266.c
> +++ b/hw/sensor/adm1266.c
> @@ -217,7 +217,7 @@ static void adm1266_init(Object *obj)
> for (int i = 0; i < ADM1266_NUM_PAGES; i++) {
> pmbus_page_config(pmdev, i, flags);
>
> - object_property_add(obj, "vout[*]", "uint16",
> + object_property_add(obj, "vout[*]", "uint16", NULL,
> adm1266_get,
> adm1266_set, NULL, &pmdev->pages[i].read_vout);
> }
> diff --git a/hw/sensor/adm1272.c b/hw/sensor/adm1272.c
> index 0aa2a8655683..6a7ff02617fc 100644
> --- a/hw/sensor/adm1272.c
> +++ b/hw/sensor/adm1272.c
> @@ -493,19 +493,19 @@ static void adm1272_init(Object *obj)
>
> pmbus_page_config(pmdev, 0, flags);
>
> - object_property_add(obj, "vin", "uint16",
> + object_property_add(obj, "vin", "uint16", NULL,
> adm1272_get,
> adm1272_set, NULL, &pmdev->pages[0].read_vin);
>
> - object_property_add(obj, "vout", "uint16",
> + object_property_add(obj, "vout", "uint16", NULL,
> adm1272_get,
> adm1272_set, NULL, &pmdev->pages[0].read_vout);
>
> - object_property_add(obj, "iout", "uint16",
> + object_property_add(obj, "iout", "uint16", NULL,
> adm1272_get,
> adm1272_set, NULL, &pmdev->pages[0].read_iout);
>
> - object_property_add(obj, "pin", "uint16",
> + object_property_add(obj, "pin", "uint16", NULL,
> adm1272_get,
> adm1272_set, NULL, &pmdev->pages[0].read_pin);
>
> diff --git a/hw/sensor/emc141x.c b/hw/sensor/emc141x.c
> index a51fc44395ab..128d721b7bef 100644
> --- a/hw/sensor/emc141x.c
> +++ b/hw/sensor/emc141x.c
> @@ -251,16 +251,16 @@ static void emc141x_reset(DeviceState *dev)
>
> static void emc141x_initfn(Object *obj)
> {
> - object_property_add(obj, "temperature0", "int",
> + object_property_add(obj, "temperature0", "int", NULL,
> emc141x_get_temperature,
> emc141x_set_temperature, NULL, NULL);
> - object_property_add(obj, "temperature1", "int",
> + object_property_add(obj, "temperature1", "int", NULL,
> emc141x_get_temperature,
> emc141x_set_temperature, NULL, NULL);
> - object_property_add(obj, "temperature2", "int",
> + object_property_add(obj, "temperature2", "int", NULL,
> emc141x_get_temperature,
> emc141x_set_temperature, NULL, NULL);
> - object_property_add(obj, "temperature3", "int",
> + object_property_add(obj, "temperature3", "int", NULL,
> emc141x_get_temperature,
> emc141x_set_temperature, NULL, NULL);
> }
> diff --git a/hw/sensor/isl_pmbus_vr.c b/hw/sensor/isl_pmbus_vr.c
> index 0fad04def773..1af0f2af35a1 100644
> --- a/hw/sensor/isl_pmbus_vr.c
> +++ b/hw/sensor/isl_pmbus_vr.c
> @@ -136,63 +136,63 @@ static void isl_pmbus_vr_add_props(Object *obj, uint64_t *flags, uint8_t pages)
> PMBusDevice *pmdev = PMBUS_DEVICE(obj);
> for (int i = 0; i < pages; i++) {
> if (flags[i] & PB_HAS_VIN) {
> - object_property_add(obj, "vin[*]", "uint16",
> + object_property_add(obj, "vin[*]", "uint16", NULL,
> isl_pmbus_vr_get,
> isl_pmbus_vr_set,
> NULL, &pmdev->pages[i].read_vin);
> }
>
> if (flags[i] & PB_HAS_VOUT) {
> - object_property_add(obj, "vout[*]", "uint16",
> + object_property_add(obj, "vout[*]", "uint16", NULL,
> isl_pmbus_vr_get,
> isl_pmbus_vr_set,
> NULL, &pmdev->pages[i].read_vout);
> }
>
> if (flags[i] & PB_HAS_IIN) {
> - object_property_add(obj, "iin[*]", "uint16",
> + object_property_add(obj, "iin[*]", "uint16", NULL,
> isl_pmbus_vr_get,
> isl_pmbus_vr_set,
> NULL, &pmdev->pages[i].read_iin);
> }
>
> if (flags[i] & PB_HAS_IOUT) {
> - object_property_add(obj, "iout[*]", "uint16",
> + object_property_add(obj, "iout[*]", "uint16", NULL,
> isl_pmbus_vr_get,
> isl_pmbus_vr_set,
> NULL, &pmdev->pages[i].read_iout);
> }
>
> if (flags[i] & PB_HAS_PIN) {
> - object_property_add(obj, "pin[*]", "uint16",
> + object_property_add(obj, "pin[*]", "uint16", NULL,
> isl_pmbus_vr_get,
> isl_pmbus_vr_set,
> NULL, &pmdev->pages[i].read_pin);
> }
>
> if (flags[i] & PB_HAS_POUT) {
> - object_property_add(obj, "pout[*]", "uint16",
> + object_property_add(obj, "pout[*]", "uint16", NULL,
> isl_pmbus_vr_get,
> isl_pmbus_vr_set,
> NULL, &pmdev->pages[i].read_pout);
> }
>
> if (flags[i] & PB_HAS_TEMPERATURE) {
> - object_property_add(obj, "temp1[*]", "uint16",
> + object_property_add(obj, "temp1[*]", "uint16", NULL,
> isl_pmbus_vr_get,
> isl_pmbus_vr_set,
> NULL, &pmdev->pages[i].read_temperature_1);
> }
>
> if (flags[i] & PB_HAS_TEMP2) {
> - object_property_add(obj, "temp2[*]", "uint16",
> + object_property_add(obj, "temp2[*]", "uint16", NULL,
> isl_pmbus_vr_get,
> isl_pmbus_vr_set,
> NULL, &pmdev->pages[i].read_temperature_2);
> }
>
> if (flags[i] & PB_HAS_TEMP3) {
> - object_property_add(obj, "temp3[*]", "uint16",
> + object_property_add(obj, "temp3[*]", "uint16", NULL,
> isl_pmbus_vr_get,
> isl_pmbus_vr_set,
> NULL, &pmdev->pages[i].read_temperature_3);
> diff --git a/hw/sensor/lsm303dlhc_mag.c b/hw/sensor/lsm303dlhc_mag.c
> index cd5773ae64e8..f362686b69a5 100644
> --- a/hw/sensor/lsm303dlhc_mag.c
> +++ b/hw/sensor/lsm303dlhc_mag.c
> @@ -509,21 +509,21 @@ static void lsm303dlhc_mag_reset(DeviceState *dev)
> */
> static void lsm303dlhc_mag_initfn(Object *obj)
> {
> - object_property_add(obj, "mag-x", "int",
> - lsm303dlhc_mag_get_x,
> - lsm303dlhc_mag_set_x, NULL, NULL);
> + object_property_add(obj, "mag-x", "int", NULL,
> + lsm303dlhc_mag_get_x,
> + lsm303dlhc_mag_set_x, NULL, NULL);
>
> - object_property_add(obj, "mag-y", "int",
> - lsm303dlhc_mag_get_y,
> - lsm303dlhc_mag_set_y, NULL, NULL);
> + object_property_add(obj, "mag-y", "int", NULL,
> + lsm303dlhc_mag_get_y,
> + lsm303dlhc_mag_set_y, NULL, NULL);
>
> - object_property_add(obj, "mag-z", "int",
> - lsm303dlhc_mag_get_z,
> - lsm303dlhc_mag_set_z, NULL, NULL);
> + object_property_add(obj, "mag-z", "int", NULL,
> + lsm303dlhc_mag_get_z,
> + lsm303dlhc_mag_set_z, NULL, NULL);
>
> - object_property_add(obj, "temperature", "int",
> - lsm303dlhc_mag_get_temperature,
> - lsm303dlhc_mag_set_temperature, NULL, NULL);
> + object_property_add(obj, "temperature", "int", NULL,
> + lsm303dlhc_mag_get_temperature,
> + lsm303dlhc_mag_set_temperature, NULL, NULL);
> }
>
> /*
> diff --git a/hw/sensor/max34451.c b/hw/sensor/max34451.c
> index 4d64434f3af4..6c2f7311ff77 100644
> --- a/hw/sensor/max34451.c
> +++ b/hw/sensor/max34451.c
> @@ -727,7 +727,7 @@ static void max34451_init(Object *obj)
>
> /* get and set the voltage in millivolts, max is 32767 mV */
> for (int i = 0; i < MAX34451_NUM_PWR_DEVICES; i++) {
> - object_property_add(obj, "vout[*]", "uint16",
> + object_property_add(obj, "vout[*]", "uint16", NULL,
> max34451_get,
> max34451_set, NULL, &pmdev->pages[i].read_vout);
> }
> @@ -737,7 +737,7 @@ static void max34451_init(Object *obj)
> * centidegrees Celsius i.e.: 2500 -> 25.00 C, max is 327.67 C
> */
> for (int i = 0; i < MAX34451_NUM_TEMP_DEVICES; i++) {
> - object_property_add(obj, "temperature[*]", "uint16",
> + object_property_add(obj, "temperature[*]", "uint16", NULL,
> max34451_get,
> max34451_set,
> NULL,
> diff --git a/hw/sensor/tmp105.c b/hw/sensor/tmp105.c
> index ece0650d703f..98f45a49b7c8 100644
> --- a/hw/sensor/tmp105.c
> +++ b/hw/sensor/tmp105.c
> @@ -408,7 +408,7 @@ static void tmp105_realize(DeviceState *dev, Error **errp)
>
> static void tmp105_initfn(Object *obj)
> {
> - object_property_add(obj, "temperature", "int",
> + object_property_add(obj, "temperature", "int", NULL,
> tmp105_get_temperature,
> tmp105_set_temperature, NULL, NULL);
> object_property_set_description(obj, "temperature",
> diff --git a/hw/sensor/tmp421.c b/hw/sensor/tmp421.c
> index 127edd0ba568..8e6823dfccc9 100644
> --- a/hw/sensor/tmp421.c
> +++ b/hw/sensor/tmp421.c
> @@ -350,16 +350,16 @@ static void tmp421_class_init(ObjectClass *klass, const void *data)
> dc->vmsd = &vmstate_tmp421;
> sc->dev = (DeviceInfo *) data;
>
> - object_class_property_add(klass, "temperature0", "int",
> + object_class_property_add(klass, "temperature0", "int", NULL,
> tmp421_get_temperature,
> tmp421_set_temperature, NULL, NULL);
> - object_class_property_add(klass, "temperature1", "int",
> + object_class_property_add(klass, "temperature1", "int", NULL,
> tmp421_get_temperature,
> tmp421_set_temperature, NULL, NULL);
> - object_class_property_add(klass, "temperature2", "int",
> + object_class_property_add(klass, "temperature2", "int", NULL,
> tmp421_get_temperature,
> tmp421_set_temperature, NULL, NULL);
> - object_class_property_add(klass, "temperature3", "int",
> + object_class_property_add(klass, "temperature3", "int", NULL,
> tmp421_get_temperature,
> tmp421_set_temperature, NULL, NULL);
> }
> diff --git a/hw/usb/dev-storage-classic.c b/hw/usb/dev-storage-classic.c
> index 977151c4a087..dfd568da5edc 100644
> --- a/hw/usb/dev-storage-classic.c
> +++ b/hw/usb/dev-storage-classic.c
> @@ -122,7 +122,7 @@ out:
>
> static void usb_msd_instance_init(Object *obj)
> {
> - object_property_add(obj, "bootindex", "int32",
> + object_property_add(obj, "bootindex", "int32", NULL,
> usb_msd_get_bootindex,
> usb_msd_set_bootindex, NULL, NULL);
> object_property_set_int(obj, "bootindex", -1, NULL);
> diff --git a/hw/vfio-user/pci.c b/hw/vfio-user/pci.c
> index 983e1d4ad470..4c76a3fe5d83 100644
> --- a/hw/vfio-user/pci.c
> +++ b/hw/vfio-user/pci.c
> @@ -471,7 +471,7 @@ static void vfio_user_pci_class_init(ObjectClass *klass, const void *data)
> device_class_set_legacy_reset(dc, vfio_user_pci_reset);
> device_class_set_props(dc, vfio_user_pci_properties);
>
> - object_class_property_add(klass, "socket", "SocketAddress", NULL,
> + object_class_property_add(klass, "socket", "SocketAddress", NULL, NULL,
> vfio_user_pci_set_socket, NULL, NULL);
> object_class_property_set_description(klass, "socket",
> "SocketAddress (UNIX sockets only)");
> diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
> index 07d519cf6d77..995b1a41efde 100644
> --- a/hw/virtio/virtio-balloon.c
> +++ b/hw/virtio/virtio-balloon.c
> @@ -1036,10 +1036,10 @@ static void virtio_balloon_instance_init(Object *obj)
> s->free_page_hint_cmd_id = VIRTIO_BALLOON_FREE_PAGE_HINT_CMD_ID_MIN;
> s->free_page_hint_notify.notify = virtio_balloon_free_page_hint_notify;
>
> - object_property_add(obj, "guest-stats", "guest statistics",
> + object_property_add(obj, "guest-stats", "guest statistics", NULL,
> balloon_stats_get_all, NULL, NULL, NULL);
>
> - object_property_add(obj, "guest-stats-polling-interval", "int",
> + object_property_add(obj, "guest-stats-polling-interval", "int", NULL,
> balloon_stats_get_poll_interval,
> balloon_stats_set_poll_interval,
> NULL, NULL);
> diff --git a/hw/virtio/virtio-mem-pci.c b/hw/virtio/virtio-mem-pci.c
> index f592eb1a7849..6349337bf42f 100644
> --- a/hw/virtio/virtio-mem-pci.c
> +++ b/hw/virtio/virtio-mem-pci.c
> @@ -211,7 +211,7 @@ static void virtio_mem_pci_instance_init(Object *obj)
> OBJECT(&dev->vdev), VIRTIO_MEM_BLOCK_SIZE_PROP);
> object_property_add_alias(obj, VIRTIO_MEM_SIZE_PROP, OBJECT(&dev->vdev),
> VIRTIO_MEM_SIZE_PROP);
> - object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size",
> + object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size", NULL,
> virtio_mem_pci_get_requested_size,
> virtio_mem_pci_set_requested_size, NULL, NULL);
> }
> diff --git a/hw/virtio/virtio-mem.c b/hw/virtio/virtio-mem.c
> index 7130ed852d9c..fcfd9fa18ab9 100644
> --- a/hw/virtio/virtio-mem.c
> +++ b/hw/virtio/virtio-mem.c
> @@ -1533,12 +1533,13 @@ static void virtio_mem_instance_init(Object *obj)
>
> notifier_list_init(&vmem->size_change_notifiers);
>
> - object_property_add(obj, VIRTIO_MEM_SIZE_PROP, "size", virtio_mem_get_size,
> + object_property_add(obj, VIRTIO_MEM_SIZE_PROP, "size", NULL,
> + virtio_mem_get_size,
> NULL, NULL, NULL);
> - object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size",
> + object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size", NULL,
> virtio_mem_get_requested_size,
> virtio_mem_set_requested_size, NULL, NULL);
> - object_property_add(obj, VIRTIO_MEM_BLOCK_SIZE_PROP, "size",
> + object_property_add(obj, VIRTIO_MEM_BLOCK_SIZE_PROP, "size", NULL,
> virtio_mem_get_block_size, virtio_mem_set_block_size,
> NULL, NULL);
> }
> diff --git a/hw/xen/xen-pvh-common.c b/hw/xen/xen-pvh-common.c
> index cca37202ffb2..ddeabe30f26d 100644
> --- a/hw/xen/xen-pvh-common.c
> +++ b/hw/xen/xen-pvh-common.c
> @@ -413,7 +413,7 @@ void xen_pvh_class_setup_common_props(XenPVHMachineClass *xpc)
>
> #define OC_MEMMAP_PROP_BASE(c, prop_name, name) \
> do { \
> - object_class_property_add(c, prop_name "-base", "uint64_t", \
> + object_class_property_add(c, prop_name "-base", "uint64_t", NULL, \
> xen_pvh_get_ ## name ## _base, \
> xen_pvh_set_ ## name ## _base, NULL, NULL); \
> object_class_property_set_description(oc, prop_name "-base", \
> @@ -422,7 +422,7 @@ do { \
>
> #define OC_MEMMAP_PROP_SIZE(c, prop_name, name) \
> do { \
> - object_class_property_add(c, prop_name "-size", "uint64_t", \
> + object_class_property_add(c, prop_name "-size", "uint64_t", NULL, \
> xen_pvh_get_ ## name ## _size, \
> xen_pvh_set_ ## name ## _size, NULL, NULL); \
> object_class_property_set_description(oc, prop_name "-size", \
> @@ -458,7 +458,7 @@ do { \
> OC_MEMMAP_PROP(oc, "pci-mmio", pci_mmio);
> OC_MEMMAP_PROP(oc, "pci-mmio-high", pci_mmio_high);
>
> - object_class_property_add(oc, "pci-intx-irq-base", "uint32_t",
> + object_class_property_add(oc, "pci-intx-irq-base", "uint32_t", NULL,
> xen_pvh_get_pci_intx_irq_base,
> xen_pvh_set_pci_intx_irq_base,
> NULL, NULL);
> @@ -468,7 +468,7 @@ do { \
>
> #ifdef CONFIG_TPM
> if (xpc->has_tpm) {
> - object_class_property_add(oc, "tpm-base-addr", "uint64_t",
> + object_class_property_add(oc, "tpm-base-addr", "uint64_t", NULL,
> xen_pvh_get_tpm_base,
> xen_pvh_set_tpm_base,
> NULL, NULL);
> diff --git a/include/qom/object.h b/include/qom/object.h
> index e9b380462ded..84b273e53545 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -1163,6 +1163,7 @@ void object_unref(void *obj);
> * defined. Sub namespaces are constructed by using a prefix and then
> * to angle brackets. For instance, the type 'virtio-net-pci' in the
> * 'link' namespace would be 'link<virtio-net-pci>'.
> + * @qapi_type: QAPI type info descriptor
> * @get: The getter to be called to read a property. If this is NULL, then
> * the property cannot be read.
> * @set: the setter to be called to write a property. If this is NULL,
> @@ -1188,6 +1189,7 @@ void object_unref(void *obj);
> */
> ObjectProperty *object_property_try_add(Object *obj, const char *name,
> const char *type,
> + QAPITypeInfo *qapi_type,
should be const QAPITypeInfo *
> ObjectPropertyAccessor *get,
> ObjectPropertyAccessor *set,
> ObjectPropertyRelease *release,
> @@ -1203,6 +1205,7 @@ ObjectProperty *object_property_try_add(Object *obj, const char *name,
> * defined. Sub namespaces are constructed by using a prefix and then
> * to angle brackets. For instance, the type 'virtio-net-pci' in the
> * 'link' namespace would be 'link<virtio-net-pci>'.
> + * @qapi_type: QAPI type info descriptor
> * @get: The getter to be called to read a property. If this is NULL, then
> * the property cannot be read.
> * @set: the setter to be called to write a property. If this is NULL,
> @@ -1220,6 +1223,7 @@ ObjectProperty *object_property_try_add(Object *obj, const char *name,
> */
> ObjectProperty *object_property_add(Object *obj, const char *name,
> const char *type,
> + const QAPITypeInfo *qapi_type,
> ObjectPropertyAccessor *get,
> ObjectPropertyAccessor *set,
> ObjectPropertyRelease *release,
> @@ -1237,6 +1241,7 @@ void object_property_del(Object *obj, const char *name);
>
> ObjectProperty *object_class_property_add(ObjectClass *klass, const char *name,
> const char *type,
> + const QAPITypeInfo *qapi_type,
> ObjectPropertyAccessor *get,
> ObjectPropertyAccessor *set,
> ObjectPropertyRelease *release,
> diff --git a/iothread.c b/iothread.c
> index 76eea6df3861..7084d336a400 100644
> --- a/iothread.c
> +++ b/iothread.c
> @@ -315,19 +315,19 @@ static void iothread_class_init(ObjectClass *klass, const void *class_data)
> bc->init = iothread_init;
> bc->update_params = iothread_set_aio_context_params;
>
> - object_class_property_add(klass, "poll-max-ns", "int64",
> + object_class_property_add(klass, "poll-max-ns", "int64", NULL,
> iothread_get_poll_param,
> iothread_set_poll_param,
> NULL, &poll_max_ns_info);
> - object_class_property_add(klass, "poll-grow", "int64",
> + object_class_property_add(klass, "poll-grow", "int64", NULL,
> iothread_get_poll_param,
> iothread_set_poll_param,
> NULL, &poll_grow_info);
> - object_class_property_add(klass, "poll-shrink", "int64",
> + object_class_property_add(klass, "poll-shrink", "int64", NULL,
> iothread_get_poll_param,
> iothread_set_poll_param,
> NULL, &poll_shrink_info);
> - object_class_property_add(klass, "poll-weight", "int64",
> + object_class_property_add(klass, "poll-weight", "int64", NULL,
> iothread_get_poll_param,
> iothread_set_poll_param,
> NULL, &poll_weight_info);
> diff --git a/net/colo-compare.c b/net/colo-compare.c
> index 5986fb1e8800..7d4a2db522ad 100644
> --- a/net/colo-compare.c
> +++ b/net/colo-compare.c
> @@ -1373,15 +1373,15 @@ static void colo_compare_init(Object *obj)
> object_property_add_str(obj, "notify_dev",
> compare_get_notify_dev, compare_set_notify_dev);
>
> - object_property_add(obj, "compare_timeout", "uint64",
> + object_property_add(obj, "compare_timeout", "uint64", NULL,
> compare_get_timeout,
> compare_set_timeout, NULL, NULL);
>
> - object_property_add(obj, "expired_scan_cycle", "uint32",
> + object_property_add(obj, "expired_scan_cycle", "uint32", NULL,
> compare_get_expired_scan_cycle,
> compare_set_expired_scan_cycle, NULL, NULL);
>
> - object_property_add(obj, "max_queue_size", "uint32",
> + object_property_add(obj, "max_queue_size", "uint32", NULL,
> get_max_queue_size,
> set_max_queue_size, NULL, NULL);
>
> diff --git a/net/dump.c b/net/dump.c
> index 0c39f09892c2..558115b9c9e3 100644
> --- a/net/dump.c
> +++ b/net/dump.c
> @@ -238,7 +238,8 @@ static void filter_dump_class_init(ObjectClass *oc, const void *data)
> {
> NetFilterClass *nfc = NETFILTER_CLASS(oc);
>
> - object_class_property_add(oc, "maxlen", "uint32", filter_dump_get_maxlen,
> + object_class_property_add(oc, "maxlen", "uint32", NULL,
> + filter_dump_get_maxlen,
> filter_dump_set_maxlen, NULL, NULL);
> object_class_property_add_str(oc, "file", file_dump_get_filename,
> file_dump_set_filename);
> diff --git a/net/filter-buffer.c b/net/filter-buffer.c
> index 427da24097f2..f56b2cfaf0b1 100644
> --- a/net/filter-buffer.c
> +++ b/net/filter-buffer.c
> @@ -182,7 +182,7 @@ static void filter_buffer_class_init(ObjectClass *oc, const void *data)
> {
> NetFilterClass *nfc = NETFILTER_CLASS(oc);
>
> - object_class_property_add(oc, "interval", "uint32",
> + object_class_property_add(oc, "interval", "uint32", NULL,
> filter_buffer_get_interval,
> filter_buffer_set_interval, NULL, NULL);
>
> diff --git a/qom/object.c b/qom/object.c
> index c34b47312f29..0fbd4a7edfbe 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -1340,6 +1340,7 @@ void object_unref(void *objptr)
>
> ObjectProperty *
> object_property_try_add(Object *obj, const char *name, const char *type,
> + QAPITypeInfo *qapi_type,
> ObjectPropertyAccessor *get,
> ObjectPropertyAccessor *set,
> ObjectPropertyRelease *release,
> @@ -1357,8 +1358,8 @@ object_property_try_add(Object *obj, const char *name, const char *type,
> for (i = 0; i < INT16_MAX; ++i) {
> char *full_name = g_strdup_printf("%s[%d]", name_no_array, i);
>
> - ret = object_property_try_add(obj, full_name, type, get, set,
> - release, opaque, NULL);
> + ret = object_property_try_add(obj, full_name, type, NULL,
Propagate @qapi_type to the generated name[i] properties.
> + get, set, release, opaque, NULL);
> g_free(full_name);
> if (ret) {
> break;
> @@ -1379,6 +1380,7 @@ object_property_try_add(Object *obj, const char *name, const char *type,
>
> prop->name = g_strdup(name);
> prop->type = g_strdup(type);
> + prop->qapi_type = qapi_type;
>
> prop->get = get;
> prop->set = set;
> @@ -1393,12 +1395,13 @@ object_property_try_add(Object *obj, const char *name, const char *type,
>
> ObjectProperty *
> object_property_add(Object *obj, const char *name, const char *type,
> + const QAPITypeInfo *qapi_type,
> ObjectPropertyAccessor *get,
> ObjectPropertyAccessor *set,
> ObjectPropertyRelease *release,
> void *opaque)
> {
> - return object_property_try_add(obj, name, type, get, set, release,
> + return object_property_try_add(obj, name, type, NULL, get, set, release,
This should pass @qapi_type also
--
Marc-André Lureau <marcandre.lureau@redhat.com>
^ permalink raw reply [flat|nested] 66+ messages in thread* Re: [PATCH v8 14/56] qom: New object_property_add() etc. parameter @qapi_type
2026-11-02 5:33 ` marcandre.lureau
@ 2026-11-02 7:33 ` Markus Armbruster
2026-11-02 8:38 ` Markus Armbruster
0 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2026-11-02 7:33 UTC (permalink / raw)
To: marcandre.lureau; +Cc: Markus Armbruster, qemu-devel, pbonzini, berrange
marcandre.lureau@redhat.com writes:
>> This permits setting ObjectProperty's optional @qapi_type. For now,
>> all callers pass null. Callers updated with this Coccinelle script:
>>
>> @@
>> identifier fun = {
>> object_property_try_add, object_property_add, object_class_property_add
>> };
>> expression obj, name, type;
>> @@
>> - fun(obj, name, type,
>> + fun(obj, name, type, NULL,
>> ...)
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> Message-ID: <20261101201717.3911097-15-armbru@redhat.com>
[...]
>> diff --git a/include/qom/object.h b/include/qom/object.h
>> index e9b380462ded..84b273e53545 100644
>> --- a/include/qom/object.h
>> +++ b/include/qom/object.h
>> @@ -1163,6 +1163,7 @@ void object_unref(void *obj);
>> * defined. Sub namespaces are constructed by using a prefix and then
>> * to angle brackets. For instance, the type 'virtio-net-pci' in the
>> * 'link' namespace would be 'link<virtio-net-pci>'.
>> + * @qapi_type: QAPI type info descriptor
>> * @get: The getter to be called to read a property. If this is NULL, then
>> * the property cannot be read.
>> * @set: the setter to be called to write a property. If this is NULL,
>> @@ -1188,6 +1189,7 @@ void object_unref(void *obj);
>> */
>> ObjectProperty *object_property_try_add(Object *obj, const char *name,
>> const char *type,
>> + QAPITypeInfo *qapi_type,
>
> should be const QAPITypeInfo *
Yes. Not caught by the compiler, because there are just three calls,
and I messed up the two of them that should pass something, as you noted
below. Not caught by my testing probably because pretty much nothing
uses them.
>> ObjectPropertyAccessor *get,
>> ObjectPropertyAccessor *set,
>> ObjectPropertyRelease *release,
>> @@ -1203,6 +1205,7 @@ ObjectProperty *object_property_try_add(Object *obj, const char *name,
>> * defined. Sub namespaces are constructed by using a prefix and then
>> * to angle brackets. For instance, the type 'virtio-net-pci' in the
>> * 'link' namespace would be 'link<virtio-net-pci>'.
>> + * @qapi_type: QAPI type info descriptor
>> * @get: The getter to be called to read a property. If this is NULL, then
>> * the property cannot be read.
>> * @set: the setter to be called to write a property. If this is NULL,
>> @@ -1220,6 +1223,7 @@ ObjectProperty *object_property_try_add(Object *obj, const char *name,
>> */
>> ObjectProperty *object_property_add(Object *obj, const char *name,
>> const char *type,
>> + const QAPITypeInfo *qapi_type,
>> ObjectPropertyAccessor *get,
>> ObjectPropertyAccessor *set,
>> ObjectPropertyRelease *release,
>> @@ -1237,6 +1241,7 @@ void object_property_del(Object *obj, const char *name);
>>
>> ObjectProperty *object_class_property_add(ObjectClass *klass, const char *name,
>> const char *type,
>> + const QAPITypeInfo *qapi_type,
>> ObjectPropertyAccessor *get,
>> ObjectPropertyAccessor *set,
>> ObjectPropertyRelease *release,
>> diff --git a/iothread.c b/iothread.c
>> index 76eea6df3861..7084d336a400 100644
>> --- a/iothread.c
>> +++ b/iothread.c
>> @@ -315,19 +315,19 @@ static void iothread_class_init(ObjectClass *klass, const void *class_data)
>> bc->init = iothread_init;
>> bc->update_params = iothread_set_aio_context_params;
>>
>> - object_class_property_add(klass, "poll-max-ns", "int64",
>> + object_class_property_add(klass, "poll-max-ns", "int64", NULL,
>> iothread_get_poll_param,
>> iothread_set_poll_param,
>> NULL, &poll_max_ns_info);
>> - object_class_property_add(klass, "poll-grow", "int64",
>> + object_class_property_add(klass, "poll-grow", "int64", NULL,
>> iothread_get_poll_param,
>> iothread_set_poll_param,
>> NULL, &poll_grow_info);
>> - object_class_property_add(klass, "poll-shrink", "int64",
>> + object_class_property_add(klass, "poll-shrink", "int64", NULL,
>> iothread_get_poll_param,
>> iothread_set_poll_param,
>> NULL, &poll_shrink_info);
>> - object_class_property_add(klass, "poll-weight", "int64",
>> + object_class_property_add(klass, "poll-weight", "int64", NULL,
>> iothread_get_poll_param,
>> iothread_set_poll_param,
>> NULL, &poll_weight_info);
>> diff --git a/net/colo-compare.c b/net/colo-compare.c
>> index 5986fb1e8800..7d4a2db522ad 100644
>> --- a/net/colo-compare.c
>> +++ b/net/colo-compare.c
>> @@ -1373,15 +1373,15 @@ static void colo_compare_init(Object *obj)
>> object_property_add_str(obj, "notify_dev",
>> compare_get_notify_dev, compare_set_notify_dev);
>>
>> - object_property_add(obj, "compare_timeout", "uint64",
>> + object_property_add(obj, "compare_timeout", "uint64", NULL,
>> compare_get_timeout,
>> compare_set_timeout, NULL, NULL);
>>
>> - object_property_add(obj, "expired_scan_cycle", "uint32",
>> + object_property_add(obj, "expired_scan_cycle", "uint32", NULL,
>> compare_get_expired_scan_cycle,
>> compare_set_expired_scan_cycle, NULL, NULL);
>>
>> - object_property_add(obj, "max_queue_size", "uint32",
>> + object_property_add(obj, "max_queue_size", "uint32", NULL,
>> get_max_queue_size,
>> set_max_queue_size, NULL, NULL);
>>
>> diff --git a/net/dump.c b/net/dump.c
>> index 0c39f09892c2..558115b9c9e3 100644
>> --- a/net/dump.c
>> +++ b/net/dump.c
>> @@ -238,7 +238,8 @@ static void filter_dump_class_init(ObjectClass *oc, const void *data)
>> {
>> NetFilterClass *nfc = NETFILTER_CLASS(oc);
>>
>> - object_class_property_add(oc, "maxlen", "uint32", filter_dump_get_maxlen,
>> + object_class_property_add(oc, "maxlen", "uint32", NULL,
>> + filter_dump_get_maxlen,
>> filter_dump_set_maxlen, NULL, NULL);
>> object_class_property_add_str(oc, "file", file_dump_get_filename,
>> file_dump_set_filename);
>> diff --git a/net/filter-buffer.c b/net/filter-buffer.c
>> index 427da24097f2..f56b2cfaf0b1 100644
>> --- a/net/filter-buffer.c
>> +++ b/net/filter-buffer.c
>> @@ -182,7 +182,7 @@ static void filter_buffer_class_init(ObjectClass *oc, const void *data)
>> {
>> NetFilterClass *nfc = NETFILTER_CLASS(oc);
>>
>> - object_class_property_add(oc, "interval", "uint32",
>> + object_class_property_add(oc, "interval", "uint32", NULL,
>> filter_buffer_get_interval,
>> filter_buffer_set_interval, NULL, NULL);
>>
>> diff --git a/qom/object.c b/qom/object.c
>> index c34b47312f29..0fbd4a7edfbe 100644
>> --- a/qom/object.c
>> +++ b/qom/object.c
>> @@ -1340,6 +1340,7 @@ void object_unref(void *objptr)
>>
>> ObjectProperty *
>> object_property_try_add(Object *obj, const char *name, const char *type,
>> + QAPITypeInfo *qapi_type,
>> ObjectPropertyAccessor *get,
>> ObjectPropertyAccessor *set,
>> ObjectPropertyRelease *release,
>> @@ -1357,8 +1358,8 @@ object_property_try_add(Object *obj, const char *name, const char *type,
>> for (i = 0; i < INT16_MAX; ++i) {
>> char *full_name = g_strdup_printf("%s[%d]", name_no_array, i);
>>
>> - ret = object_property_try_add(obj, full_name, type, get, set,
>> - release, opaque, NULL);
>> + ret = object_property_try_add(obj, full_name, type, NULL,
>
> Propagate @qapi_type to the generated name[i] properties.
Yes, this is #1, and ...
>> + get, set, release, opaque, NULL);
>> g_free(full_name);
>> if (ret) {
>> break;
>> @@ -1379,6 +1380,7 @@ object_property_try_add(Object *obj, const char *name, const char *type,
>>
>> prop->name = g_strdup(name);
>> prop->type = g_strdup(type);
>> + prop->qapi_type = qapi_type;
>>
>> prop->get = get;
>> prop->set = set;
>> @@ -1393,12 +1395,13 @@ object_property_try_add(Object *obj, const char *name, const char *type,
>>
>> ObjectProperty *
>> object_property_add(Object *obj, const char *name, const char *type,
>> + const QAPITypeInfo *qapi_type,
>> ObjectPropertyAccessor *get,
>> ObjectPropertyAccessor *set,
>> ObjectPropertyRelease *release,
>> void *opaque)
>> {
>> - return object_property_try_add(obj, name, type, get, set, release,
>> + return object_property_try_add(obj, name, type, NULL, get, set, release,
>
> This should pass @qapi_type also
... this is #2.
Thanks!
^ permalink raw reply [flat|nested] 66+ messages in thread* Re: [PATCH v8 14/56] qom: New object_property_add() etc. parameter @qapi_type
2026-11-02 7:33 ` Markus Armbruster
@ 2026-11-02 8:38 ` Markus Armbruster
2026-11-02 8:49 ` Marc-André Lureau
0 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2026-11-02 8:38 UTC (permalink / raw)
To: marcandre.lureau; +Cc: qemu-devel, pbonzini, berrange
Marc-André, may I have your R-by with the appended fixup?
diff --git a/include/qom/object.h b/include/qom/object.h
index 9338f0b986..70d8ea3e29 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1189,7 +1189,7 @@ void object_unref(void *obj);
*/
ObjectProperty *object_property_try_add(Object *obj, const char *name,
const char *type,
- QAPITypeInfo *qapi_type,
+ const QAPITypeInfo *qapi_type,
ObjectPropertyAccessor *get,
ObjectPropertyAccessor *set,
ObjectPropertyRelease *release,
diff --git a/qom/object.c b/qom/object.c
index f244bff6ae..cd0590c3fd 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1340,7 +1340,7 @@ void object_unref(void *objptr)
ObjectProperty *
object_property_try_add(Object *obj, const char *name, const char *type,
- QAPITypeInfo *qapi_type,
+ const QAPITypeInfo *qapi_type,
ObjectPropertyAccessor *get,
ObjectPropertyAccessor *set,
ObjectPropertyRelease *release,
@@ -1358,7 +1358,7 @@ object_property_try_add(Object *obj, const char *name, const char *type,
for (i = 0; i < INT16_MAX; ++i) {
char *full_name = g_strdup_printf("%s[%d]", name_no_array, i);
- ret = object_property_try_add(obj, full_name, type, NULL,
+ ret = object_property_try_add(obj, full_name, type, qapi_type,
get, set, release, opaque, NULL);
g_free(full_name);
if (ret) {
@@ -1401,8 +1401,8 @@ object_property_add(Object *obj, const char *name, const char *type,
ObjectPropertyRelease *release,
void *opaque)
{
- return object_property_try_add(obj, name, type, NULL, get, set, release,
- opaque, &error_abort);
+ return object_property_try_add(obj, name, type, qapi_type,
+ get, set, release, opaque, &error_abort);
}
ObjectProperty *
^ permalink raw reply related [flat|nested] 66+ messages in thread* Re: [PATCH v8 14/56] qom: New object_property_add() etc. parameter @qapi_type
2026-11-02 8:38 ` Markus Armbruster
@ 2026-11-02 8:49 ` Marc-André Lureau
0 siblings, 0 replies; 66+ messages in thread
From: Marc-André Lureau @ 2026-11-02 8:49 UTC (permalink / raw)
To: Markus Armbruster; +Cc: qemu-devel, pbonzini, berrange
On Mon, Nov 2, 2026 at 12:40 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> Marc-André, may I have your R-by with the appended fixup?
>
> diff --git a/include/qom/object.h b/include/qom/object.h
> index 9338f0b986..70d8ea3e29 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -1189,7 +1189,7 @@ void object_unref(void *obj);
> */
> ObjectProperty *object_property_try_add(Object *obj, const char *name,
> const char *type,
> - QAPITypeInfo *qapi_type,
> + const QAPITypeInfo *qapi_type,
> ObjectPropertyAccessor *get,
> ObjectPropertyAccessor *set,
> ObjectPropertyRelease *release,
> diff --git a/qom/object.c b/qom/object.c
> index f244bff6ae..cd0590c3fd 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -1340,7 +1340,7 @@ void object_unref(void *objptr)
>
> ObjectProperty *
> object_property_try_add(Object *obj, const char *name, const char *type,
> - QAPITypeInfo *qapi_type,
> + const QAPITypeInfo *qapi_type,
> ObjectPropertyAccessor *get,
> ObjectPropertyAccessor *set,
> ObjectPropertyRelease *release,
> @@ -1358,7 +1358,7 @@ object_property_try_add(Object *obj, const char *name, const char *type,
> for (i = 0; i < INT16_MAX; ++i) {
> char *full_name = g_strdup_printf("%s[%d]", name_no_array, i);
>
> - ret = object_property_try_add(obj, full_name, type, NULL,
> + ret = object_property_try_add(obj, full_name, type, qapi_type,
> get, set, release, opaque, NULL);
> g_free(full_name);
> if (ret) {
> @@ -1401,8 +1401,8 @@ object_property_add(Object *obj, const char *name, const char *type,
> ObjectPropertyRelease *release,
> void *opaque)
> {
> - return object_property_try_add(obj, name, type, NULL, get, set, release,
> - opaque, &error_abort);
> + return object_property_try_add(obj, name, type, qapi_type,
> + get, set, release, opaque, &error_abort);
> }
>
> ObjectProperty *
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
^ permalink raw reply [flat|nested] 66+ messages in thread
* [PATCH v8 15/56] qom/object: Move enum property code so it is together
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (13 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 14/56] qom: New object_property_add() etc. parameter @qapi_type Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-02 5:33 ` marcandre.lureau
2026-11-01 20:16 ` [PATCH v8 16/56] qom: New object_property_add_enum() etc. parameter @qapi_type Markus Armbruster
` (40 subsequent siblings)
55 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
qom/object.c | 76 ++++++++++++++++++++++++++--------------------------
1 file changed, 38 insertions(+), 38 deletions(-)
diff --git a/qom/object.c b/qom/object.c
index 0fbd4a7edf..9a0966c911 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1770,44 +1770,6 @@ uint64_t object_property_get_uint(Object *obj, const char *name,
return retval;
}
-typedef struct EnumProperty {
- const QEnumLookup *lookup;
- int (*get)(Object *, Error **);
- void (*set)(Object *, int, Error **);
-} EnumProperty;
-
-int object_property_get_enum(Object *obj, const char *name,
- const char *typename, Error **errp)
-{
- char *str;
- int ret;
- ObjectProperty *prop = object_property_find_err(obj, name, errp);
- EnumProperty *enumprop;
-
- if (prop == NULL) {
- return -1;
- }
-
- if (!g_str_equal(prop->type, typename)) {
- error_setg(errp, "Property %s on %s is not '%s' enum type",
- name, object_class_get_name(
- object_get_class(obj)), typename);
- return -1;
- }
-
- enumprop = prop->opaque;
-
- str = object_property_get_str(obj, name, errp);
- if (!str) {
- return -1;
- }
-
- ret = qapi_enum_parse(enumprop->lookup, str, -1, errp);
- g_free(str);
-
- return ret;
-}
-
bool object_property_parse(Object *obj, const char *name,
const char *string, Error **errp)
{
@@ -2538,6 +2500,12 @@ object_class_property_add_bool(ObjectClass *klass, const char *name,
prop);
}
+typedef struct EnumProperty {
+ const QEnumLookup *lookup;
+ int (*get)(Object *, Error **);
+ void (*set)(Object *, int, Error **);
+} EnumProperty;
+
static void property_get_enum(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
@@ -2606,6 +2574,38 @@ object_class_property_add_enum(ObjectClass *klass, const char *name,
prop);
}
+int object_property_get_enum(Object *obj, const char *name,
+ const char *typename, Error **errp)
+{
+ char *str;
+ int ret;
+ ObjectProperty *prop = object_property_find_err(obj, name, errp);
+ EnumProperty *enumprop;
+
+ if (prop == NULL) {
+ return -1;
+ }
+
+ if (!g_str_equal(prop->type, typename)) {
+ error_setg(errp, "Property %s on %s is not '%s' enum type",
+ name, object_class_get_name(
+ object_get_class(obj)), typename);
+ return -1;
+ }
+
+ enumprop = prop->opaque;
+
+ str = object_property_get_str(obj, name, errp);
+ if (!str) {
+ return -1;
+ }
+
+ ret = qapi_enum_parse(enumprop->lookup, str, -1, errp);
+ g_free(str);
+
+ return ret;
+}
+
typedef struct TMProperty {
void (*get)(Object *, struct tm *, Error **);
} TMProperty;
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 16/56] qom: New object_property_add_enum() etc. parameter @qapi_type
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (14 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 15/56] qom/object: Move enum property code so it is together Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-02 5:33 ` marcandre.lureau
2026-11-01 20:16 ` [PATCH v8 17/56] tests: update check-qom-proplist for QAPI-aware property registration Markus Armbruster
` (39 subsequent siblings)
55 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
Callers may either pass a non-null @lookup, or a non-null @qapi_type.
For now, all pass a non-null @lookup and a null @qapi_type. Callers
updated with this Coccinelle script:
@@
identifier fun = {
object_property_add_enum, object_class_property_add_enum
};
expression obj, name, type;
@@
- fun(obj, name, type,
+ fun(obj, name, type, NULL,
...)
Future patches will eliminate non-null @lookup and drop the parameter.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
include/chardev/char.h | 2 +-
include/qom/object.h | 4 ++++
authz/list.c | 3 +--
backends/hostmem.c | 8 ++++----
crypto/secret_common.c | 3 +--
crypto/tlscreds.c | 4 ++--
hw/i386/pc_piix.c | 3 ++-
hw/microblaze/petalogix_s3adsp1800_mmu.c | 1 +
monitor/qmp.c | 2 +-
net/filter.c | 2 +-
qom/object.c | 15 +++++++++++----
target/i386/kvm/kvm.c | 3 ++-
tests/unit/check-qom-proplist.c | 3 +--
ui/dbus.c | 4 ++--
ui/input-linux.c | 2 +-
15 files changed, 35 insertions(+), 24 deletions(-)
diff --git a/include/chardev/char.h b/include/chardev/char.h
index 2616c19cc0..5283cc0d5d 100644
--- a/include/chardev/char.h
+++ b/include/chardev/char.h
@@ -356,7 +356,7 @@ static inline void chardev_vc_add_encoding_prop(ObjectClass *oc,
int (*get)(Object *, Error **),
void (*set)(Object *, int, Error **))
{
- object_class_property_add_enum(oc, "encoding", "ChardevVCEncoding",
+ object_class_property_add_enum(oc, "encoding", "ChardevVCEncoding", NULL,
&ChardevVCEncoding_lookup, get, set);
}
diff --git a/include/qom/object.h b/include/qom/object.h
index 84b273e535..e9a67017fa 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1987,6 +1987,7 @@ ObjectProperty *object_class_property_add_bool(ObjectClass *klass,
* @obj: the object to add a property to
* @name: the name of the property
* @typename: the name of the enum data type
+ * @qapi_type: QAPI type info descriptor
* @lookup: enum value namelookup table
* @get: the getter or %NULL if the property is write-only.
* @set: the setter or %NULL if the property is read-only
@@ -1998,6 +1999,7 @@ ObjectProperty *object_class_property_add_bool(ObjectClass *klass,
*/
ObjectProperty *object_property_add_enum(Object *obj, const char *name,
const char *typename,
+ const QAPITypeInfo *qapi_type,
const QEnumLookup *lookup,
int (*get)(Object *, Error **),
void (*set)(Object *, int, Error **));
@@ -2007,6 +2009,7 @@ ObjectProperty *object_property_add_enum(Object *obj, const char *name,
* @klass: the object class to add a property to
* @name: the name of the property
* @typename: the name of the enum data type
+ * @qapi_type: QAPI type info descriptor
* @lookup: enum value namelookup table
* @get: the getter or %NULL if the property is write-only.
* @set: the setter or %NULL if the property is read-only
@@ -2019,6 +2022,7 @@ ObjectProperty *object_property_add_enum(Object *obj, const char *name,
ObjectProperty *object_class_property_add_enum(ObjectClass *klass,
const char *name,
const char *typename,
+ const QAPITypeInfo *qapi_type,
const QEnumLookup *lookup,
int (*get)(Object *, Error **),
void (*set)(Object *, int, Error **));
diff --git a/authz/list.c b/authz/list.c
index 72aedc6ac4..40fbccd87e 100644
--- a/authz/list.c
+++ b/authz/list.c
@@ -120,8 +120,7 @@ qauthz_list_class_init(ObjectClass *oc, const void *data)
{
QAuthZClass *authz = QAUTHZ_CLASS(oc);
- object_class_property_add_enum(oc, "policy",
- "QAuthZListPolicy",
+ object_class_property_add_enum(oc, "policy", "QAuthZListPolicy", NULL,
&QAuthZListPolicy_lookup,
qauthz_list_prop_get_policy,
qauthz_list_prop_set_policy);
diff --git a/backends/hostmem.c b/backends/hostmem.c
index 299a3b90fe..c5882f0b16 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -551,10 +551,10 @@ host_memory_backend_class_init(ObjectClass *oc, const void *data)
NULL, NULL);
object_class_property_set_description(oc, "host-nodes",
"Binds memory to the list of NUMA host nodes");
- object_class_property_add_enum(oc, "policy", "HostMemPolicy",
- &HostMemPolicy_lookup,
- host_memory_backend_get_policy,
- host_memory_backend_set_policy);
+ object_class_property_add_enum(oc, "policy", "HostMemPolicy", NULL,
+ &HostMemPolicy_lookup,
+ host_memory_backend_get_policy,
+ host_memory_backend_set_policy);
object_class_property_set_description(oc, "policy",
"Set the NUMA policy");
object_class_property_add_bool(oc, "share",
diff --git a/crypto/secret_common.c b/crypto/secret_common.c
index a5ecb876ae..16df64b336 100644
--- a/crypto/secret_common.c
+++ b/crypto/secret_common.c
@@ -269,8 +269,7 @@ qcrypto_secret_class_init(ObjectClass *oc, const void *data)
ucc->complete = qcrypto_secret_complete;
- object_class_property_add_enum(oc, "format",
- "QCryptoSecretFormat",
+ object_class_property_add_enum(oc, "format", "QCryptoSecretFormat", NULL,
&QCryptoSecretFormat_lookup,
qcrypto_secret_prop_get_format,
qcrypto_secret_prop_set_format);
diff --git a/crypto/tlscreds.c b/crypto/tlscreds.c
index fb09e295a6..db74d302cc 100644
--- a/crypto/tlscreds.c
+++ b/crypto/tlscreds.c
@@ -221,8 +221,8 @@ qcrypto_tls_creds_class_init(ObjectClass *oc, const void *data)
object_class_property_add_str(oc, "dir",
qcrypto_tls_creds_prop_get_dir,
qcrypto_tls_creds_prop_set_dir);
- object_class_property_add_enum(oc, "endpoint",
- "QCryptoTLSCredsEndpoint",
+ object_class_property_add_enum(oc, "endpoint", "QCryptoTLSCredsEndpoint",
+ NULL,
&QCryptoTLSCredsEndpoint_lookup,
qcrypto_tls_creds_prop_get_endpoint,
qcrypto_tls_creds_prop_set_endpoint);
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 63c4667ea3..ae07e6c56c 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -413,7 +413,8 @@ static void pc_i440fx_machine_options(MachineClass *m)
machine_class_allow_dynamic_sysbus_dev(m, TYPE_VMBUS_BRIDGE);
machine_class_allow_dynamic_sysbus_dev(m, TYPE_UEFI_VARS_X64);
- object_class_property_add_enum(oc, "x-south-bridge", "PCSouthBridgeOption",
+ object_class_property_add_enum(oc, "x-south-bridge",
+ "PCSouthBridgeOption", NULL,
&PCSouthBridgeOption_lookup,
pc_get_south_bridge,
pc_set_south_bridge);
diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c b/hw/microblaze/petalogix_s3adsp1800_mmu.c
index c5f6431900..8cf7cda7d9 100644
--- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
+++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
@@ -175,6 +175,7 @@ static void petalogix_s3adsp1800_machine_class_init(ObjectClass *oc,
mc->is_default = true;
prop = object_class_property_add_enum(oc, "endianness", "EndianMode",
+ NULL,
&EndianMode_lookup,
machine_get_endianness,
machine_set_endianness);
diff --git a/monitor/qmp.c b/monitor/qmp.c
index eb44012643..8d7e49d1ce 100644
--- a/monitor/qmp.c
+++ b/monitor/qmp.c
@@ -134,7 +134,7 @@ static void monitor_qmp_class_init(ObjectClass *cls, const void *data)
monitor_qmp_get_pretty,
monitor_qmp_set_pretty);
object_class_property_add_enum(cls, "close-action",
- "MonitorQMPCloseAction",
+ "MonitorQMPCloseAction", NULL,
&MonitorQMPCloseAction_lookup,
monitor_qmp_get_close_action,
monitor_qmp_set_close_action);
diff --git a/net/filter.c b/net/filter.c
index 389f3b0bfe..5311622aca 100644
--- a/net/filter.c
+++ b/net/filter.c
@@ -342,7 +342,7 @@ static void netfilter_class_init(ObjectClass *oc, const void *data)
object_class_property_add_str(oc, "netdev",
netfilter_get_netdev_id, netfilter_set_netdev_id);
- object_class_property_add_enum(oc, "queue", "NetFilterDirection",
+ object_class_property_add_enum(oc, "queue", "NetFilterDirection", NULL,
&NetFilterDirection_lookup,
netfilter_get_direction, netfilter_set_direction);
object_class_property_add_str(oc, "status",
diff --git a/qom/object.c b/qom/object.c
index 9a0966c911..0ef0d4d42c 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -2501,6 +2501,7 @@ object_class_property_add_bool(ObjectClass *klass, const char *name,
}
typedef struct EnumProperty {
+ const QAPITypeInfo *qapi_type; /* non-null for QAPI enums */
const QEnumLookup *lookup;
int (*get)(Object *, Error **);
void (*set)(Object *, int, Error **);
@@ -2537,17 +2538,20 @@ static void property_set_enum(Object *obj, Visitor *v, const char *name,
ObjectProperty *
object_property_add_enum(Object *obj, const char *name,
const char *typename,
+ const QAPITypeInfo *qapi_type,
const QEnumLookup *lookup,
int (*get)(Object *, Error **),
void (*set)(Object *, int, Error **))
{
EnumProperty *prop = g_malloc(sizeof(*prop));
- prop->lookup = lookup;
+ assert(!qapi_type != !lookup);
+ prop->qapi_type = qapi_type;
+ prop->lookup = lookup ?: qapi_type->lookup;
prop->get = get;
prop->set = set;
- return object_property_add(obj, name, typename, NULL,
+ return object_property_add(obj, name, typename, qapi_type,
get ? property_get_enum : NULL,
set ? property_set_enum : NULL,
property_release_data,
@@ -2557,17 +2561,20 @@ object_property_add_enum(Object *obj, const char *name,
ObjectProperty *
object_class_property_add_enum(ObjectClass *klass, const char *name,
const char *typename,
+ const QAPITypeInfo *qapi_type,
const QEnumLookup *lookup,
int (*get)(Object *, Error **),
void (*set)(Object *, int, Error **))
{
EnumProperty *prop = g_malloc(sizeof(*prop));
- prop->lookup = lookup;
+ assert(!qapi_type != !lookup);
+ prop->qapi_type = qapi_type;
+ prop->lookup = lookup ?: qapi_type->lookup;
prop->get = get;
prop->set = set;
- return object_class_property_add(klass, name, typename, NULL,
+ return object_class_property_add(klass, name, typename, qapi_type,
get ? property_get_enum : NULL,
set ? property_set_enum : NULL,
NULL,
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index 32175604e6..abd9aa6241 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -7090,6 +7090,7 @@ static void kvm_arch_set_honor_guest_pat(Object *obj, int value, Error **errp)
void kvm_arch_accel_class_init(ObjectClass *oc)
{
object_class_property_add_enum(oc, "notify-vmexit", "NotifyVMexitOption",
+ NULL,
&NotifyVmexitOption_lookup,
kvm_arch_get_notify_vmexit,
kvm_arch_set_notify_vmexit);
@@ -7127,7 +7128,7 @@ void kvm_arch_accel_class_init(ObjectClass *oc)
object_class_property_set_description(oc, "xen-evtchn-max-pirq",
"Maximum number of Xen PIRQs");
- object_class_property_add_enum(oc, "honor-guest-pat", "OnOffAuto",
+ object_class_property_add_enum(oc, "honor-guest-pat", "OnOffAuto", NULL,
&OnOffAuto_lookup,
kvm_arch_get_honor_guest_pat,
kvm_arch_set_honor_guest_pat);
diff --git a/tests/unit/check-qom-proplist.c b/tests/unit/check-qom-proplist.c
index 89de92b7d9..804d066f28 100644
--- a/tests/unit/check-qom-proplist.c
+++ b/tests/unit/check-qom-proplist.c
@@ -140,8 +140,7 @@ static void dummy_class_init(ObjectClass *cls, const void *data)
object_class_property_add_str(cls, "sv",
dummy_get_sv,
dummy_set_sv);
- object_class_property_add_enum(cls, "av",
- "DummyAnimal",
+ object_class_property_add_enum(cls, "av", "DummyAnimal", NULL,
&dummy_animal_map,
dummy_get_av,
dummy_set_av);
diff --git a/ui/dbus.c b/ui/dbus.c
index 7be0f8e261..966c2c8b4e 100644
--- a/ui/dbus.c
+++ b/ui/dbus.c
@@ -508,8 +508,8 @@ dbus_display_class_init(ObjectClass *oc, const void *data)
object_class_property_add_bool(oc, "p2p", get_dbus_p2p, set_dbus_p2p);
object_class_property_add_str(oc, "addr", get_dbus_addr, set_dbus_addr);
object_class_property_add_str(oc, "audiodev", get_audiodev, set_audiodev);
- object_class_property_add_enum(oc, "gl-mode",
- "DisplayGLMode", &DisplayGLMode_lookup,
+ object_class_property_add_enum(oc, "gl-mode", "DisplayGLMode", NULL,
+ &DisplayGLMode_lookup,
get_gl_mode, set_gl_mode);
}
diff --git a/ui/input-linux.c b/ui/input-linux.c
index f4eee1ffd7..ea4d76e75d 100644
--- a/ui/input-linux.c
+++ b/ui/input-linux.c
@@ -506,7 +506,7 @@ static void input_linux_class_init(ObjectClass *oc, const void *data)
object_class_property_add_bool(oc, "repeat",
input_linux_get_repeat,
input_linux_set_repeat);
- object_class_property_add_enum(oc, "grab-toggle", "GrabToggleKeys",
+ object_class_property_add_enum(oc, "grab-toggle", "GrabToggleKeys", NULL,
&GrabToggleKeys_lookup,
input_linux_get_grab_toggle,
input_linux_set_grab_toggle);
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* Re: [PATCH v8 16/56] qom: New object_property_add_enum() etc. parameter @qapi_type
2026-11-01 20:16 ` [PATCH v8 16/56] qom: New object_property_add_enum() etc. parameter @qapi_type Markus Armbruster
@ 2026-11-02 5:33 ` marcandre.lureau
0 siblings, 0 replies; 66+ messages in thread
From: marcandre.lureau @ 2026-11-02 5:33 UTC (permalink / raw)
To: Markus Armbruster; +Cc: qemu-devel, marcandre.lureau, pbonzini, berrange
On Sun, 01 Nov 2026 21:16:37 +0100, Markus Armbruster <armbru@redhat.com> wrote:
> Callers may either pass a non-null @lookup, or a non-null @qapi_type.
> For now, all pass a non-null @lookup and a null @qapi_type. Callers
> updated with this Coccinelle script:
>
> @@
> identifier fun = {
> object_property_add_enum, object_class_property_add_enum
> };
> expression obj, name, type;
> @@
> - fun(obj, name, type,
> + fun(obj, name, type, NULL,
> ...)
>
> [...]
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
--
Marc-André Lureau <marcandre.lureau@redhat.com>
^ permalink raw reply [flat|nested] 66+ messages in thread
* [PATCH v8 17/56] tests: update check-qom-proplist for QAPI-aware property registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (15 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 16/56] qom: New object_property_add_enum() etc. parameter @qapi_type Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 18/56] qom: convert QAPI enum properties to QAPI-aware registration Markus Armbruster
` (38 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Migrate the dummy object's string and enum properties from the legacy
object_class_property_add_str/enum() helpers to the new QAPI-aware
object_class_property_add_qapi/qapi_enum() registration.
Add test cases verifying that the qapi_type metadata is correctly
populated on properties registered through the new API, and that it
remains NULL for properties using the old-style registration.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
tests/unit/check-qom-proplist.c | 87 ++++++++++++++++++++++++++++-----
1 file changed, 74 insertions(+), 13 deletions(-)
diff --git a/tests/unit/check-qom-proplist.c b/tests/unit/check-qom-proplist.c
index 804d066f28..246935d714 100644
--- a/tests/unit/check-qom-proplist.c
+++ b/tests/unit/check-qom-proplist.c
@@ -108,22 +108,21 @@ static int dummy_get_av(Object *obj,
}
-static void dummy_set_sv(Object *obj,
- const char *value,
- Error **errp)
+static void dummy_set_sv(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
{
DummyObject *dobj = DUMMY_OBJECT(obj);
- g_free(dobj->sv);
- dobj->sv = g_strdup(value);
+ g_clear_pointer(&dobj->sv, g_free);
+ visit_type_str(v, name, &dobj->sv, errp);
}
-static char *dummy_get_sv(Object *obj,
- Error **errp)
+static void dummy_get_sv(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
{
DummyObject *dobj = DUMMY_OBJECT(obj);
- return g_strdup(dobj->sv);
+ visit_type_str(v, name, &dobj->sv, errp);
}
@@ -135,13 +134,25 @@ static void dummy_init(Object *obj)
}
+static const QAPITypeInfo dummy_animal_qapi_type_info = {
+ .name = "DummyAnimal",
+ .masked_name = "DummyAnimalSchema",
+ .lookup = &dummy_animal_map,
+};
+
+static const QAPITypeInfo dummy_str_qapi_type_info = {
+ .name = "str",
+ .masked_name = "StrSchema",
+};
+
static void dummy_class_init(ObjectClass *cls, const void *data)
{
- object_class_property_add_str(cls, "sv",
- dummy_get_sv,
- dummy_set_sv);
- object_class_property_add_enum(cls, "av", "DummyAnimal", NULL,
- &dummy_animal_map,
+ object_class_property_add(cls, "sv", "str",
+ &dummy_str_qapi_type_info,
+ dummy_get_sv, dummy_set_sv,
+ NULL, NULL);
+ object_class_property_add_enum(cls, "av", "DummyAnimal",
+ &dummy_animal_qapi_type_info, NULL,
dummy_get_av,
dummy_set_av);
}
@@ -702,6 +713,54 @@ static void test_qom_partial_path(void)
object_unparent(cont1);
}
+static void test_dummy_qapi_enum(void)
+{
+ ObjectProperty *prop;
+ Object *parent = object_get_objects_root();
+ DummyObject *dobj = DUMMY_OBJECT(
+ object_new_with_props(TYPE_DUMMY,
+ parent,
+ "dummy0",
+ &error_abort,
+ "av", "platypus",
+ NULL));
+
+ g_assert(dobj->av == DUMMY_PLATYPUS);
+
+ prop = object_property_find(OBJECT(dobj), "av");
+ g_assert(prop);
+ g_assert(prop->qapi_type == &dummy_animal_qapi_type_info);
+ g_assert_cmpstr(prop->qapi_type->name, ==, "DummyAnimal");
+ g_assert_cmpstr(prop->qapi_type->masked_name, ==, "DummyAnimalSchema");
+ g_assert(prop->qapi_type->lookup == &dummy_animal_map);
+
+ object_unparent(OBJECT(dobj));
+}
+
+static void test_dummy_qapi_prop(void)
+{
+ ObjectProperty *prop;
+ Object *parent = object_get_objects_root();
+ DummyObject *dobj = DUMMY_OBJECT(
+ object_new_with_props(TYPE_DUMMY,
+ parent,
+ "dummy0",
+ &error_abort,
+ "sv", "hello",
+ NULL));
+
+ g_assert_cmpstr(dobj->sv, ==, "hello");
+
+ prop = object_property_find(OBJECT(dobj), "sv");
+ g_assert(prop);
+ g_assert(prop->qapi_type == &dummy_str_qapi_type_info);
+ g_assert_cmpstr(prop->qapi_type->name, ==, "str");
+ g_assert_cmpstr(prop->qapi_type->masked_name, ==, "StrSchema");
+ g_assert(prop->qapi_type->lookup == NULL);
+
+ object_unparent(OBJECT(dobj));
+}
+
int main(int argc, char **argv)
{
g_test_init(&argc, &argv, NULL);
@@ -726,6 +785,8 @@ int main(int argc, char **argv)
g_test_add_func("/qom/proplist/iterator", test_dummy_iterator);
g_test_add_func("/qom/proplist/class_iterator", test_dummy_class_iterator);
g_test_add_func("/qom/proplist/delchild", test_dummy_delchild);
+ g_test_add_func("/qom/proplist/qapi_enum", test_dummy_qapi_enum);
+ g_test_add_func("/qom/proplist/qapi_prop", test_dummy_qapi_prop);
g_test_add_func("/qom/resolve/partial", test_qom_partial_path);
return g_test_run();
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 18/56] qom: convert QAPI enum properties to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (16 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 17/56] tests: update check-qom-proplist for QAPI-aware property registration Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 19/56] qom: convert struct " Markus Armbruster
` (37 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Convert all callers of object_class_property_add_enum() but one to
pass QAPITypeInfo instead of QEnumLookup.
This enables QMP QOM introspection to report accurate QAPI type names
for enum properties in member @qapi-type.
Leave pc_i440fx_machine_options() for later, because enum
PCSouthBridgeOption is a handmade QAPI-like enum instead of a real
one.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
include/chardev/char.h | 6 ++++--
authz/list.c | 6 ++++--
backends/hostmem.c | 5 +++--
crypto/secret_common.c | 5 +++--
crypto/tlscreds.c | 4 ++--
hw/microblaze/petalogix_s3adsp1800_mmu.c | 4 ++--
monitor/qmp.c | 5 +++--
net/filter.c | 5 +++--
target/i386/kvm/kvm.c | 9 +++++----
ui/console-vc.c | 1 +
ui/dbus.c | 6 ++++--
ui/input-linux.c | 5 +++--
12 files changed, 37 insertions(+), 24 deletions(-)
diff --git a/include/chardev/char.h b/include/chardev/char.h
index 5283cc0d5d..61e6957118 100644
--- a/include/chardev/char.h
+++ b/include/chardev/char.h
@@ -1,6 +1,7 @@
#ifndef QEMU_CHAR_H
#define QEMU_CHAR_H
+#include "qapi/qapi-type-infos-char.h"
#include "qapi/qapi-types-char.h"
#include "qemu/bitmap.h"
#include "qemu/thread.h"
@@ -356,8 +357,9 @@ static inline void chardev_vc_add_encoding_prop(ObjectClass *oc,
int (*get)(Object *, Error **),
void (*set)(Object *, int, Error **))
{
- object_class_property_add_enum(oc, "encoding", "ChardevVCEncoding", NULL,
- &ChardevVCEncoding_lookup, get, set);
+ object_class_property_add_enum(oc, "encoding", "ChardevVCEncoding",
+ &ChardevVCEncoding_type_info, NULL,
+ get, set);
}
#endif
diff --git a/authz/list.c b/authz/list.c
index 40fbccd87e..767e91b3aa 100644
--- a/authz/list.c
+++ b/authz/list.c
@@ -22,6 +22,7 @@
#include "authz/list.h"
#include "trace.h"
#include "qom/object_interfaces.h"
+#include "qapi/qapi-type-infos-authz.h"
#include "qapi/qapi-visit-authz.h"
#include "qemu/module.h"
@@ -120,8 +121,9 @@ qauthz_list_class_init(ObjectClass *oc, const void *data)
{
QAuthZClass *authz = QAUTHZ_CLASS(oc);
- object_class_property_add_enum(oc, "policy", "QAuthZListPolicy", NULL,
- &QAuthZListPolicy_lookup,
+ object_class_property_add_enum(oc, "policy", "QAuthZListPolicy",
+ &QAuthZListPolicy_type_info,
+ NULL,
qauthz_list_prop_get_policy,
qauthz_list_prop_set_policy);
diff --git a/backends/hostmem.c b/backends/hostmem.c
index c5882f0b16..b43d6ca956 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -16,6 +16,7 @@
#include "hw/core/boards.h"
#include "qapi/error.h"
#include "qapi/qapi-builtin-visit.h"
+#include "qapi/qapi-type-infos-common.h"
#include "qapi/visitor.h"
#include "qemu/config-file.h"
#include "qom/compat-properties.h"
@@ -551,8 +552,8 @@ host_memory_backend_class_init(ObjectClass *oc, const void *data)
NULL, NULL);
object_class_property_set_description(oc, "host-nodes",
"Binds memory to the list of NUMA host nodes");
- object_class_property_add_enum(oc, "policy", "HostMemPolicy", NULL,
- &HostMemPolicy_lookup,
+ object_class_property_add_enum(oc, "policy", "HostMemPolicy",
+ &HostMemPolicy_type_info, NULL,
host_memory_backend_get_policy,
host_memory_backend_set_policy);
object_class_property_set_description(oc, "policy",
diff --git a/crypto/secret_common.c b/crypto/secret_common.c
index 16df64b336..8e05f1365e 100644
--- a/crypto/secret_common.c
+++ b/crypto/secret_common.c
@@ -22,6 +22,7 @@
#include "crypto/secret_common.h"
#include "crypto/cipher.h"
#include "qapi/error.h"
+#include "qapi/qapi-type-infos-crypto.h"
#include "qom/object_interfaces.h"
#include "qemu/base64.h"
#include "qemu/module.h"
@@ -269,8 +270,8 @@ qcrypto_secret_class_init(ObjectClass *oc, const void *data)
ucc->complete = qcrypto_secret_complete;
- object_class_property_add_enum(oc, "format", "QCryptoSecretFormat", NULL,
- &QCryptoSecretFormat_lookup,
+ object_class_property_add_enum(oc, "format", "QCryptoSecretFormat",
+ &QCryptoSecretFormat_type_info, NULL,
qcrypto_secret_prop_get_format,
qcrypto_secret_prop_set_format);
object_class_property_add_str(oc, "keyid",
diff --git a/crypto/tlscreds.c b/crypto/tlscreds.c
index db74d302cc..021e4bf111 100644
--- a/crypto/tlscreds.c
+++ b/crypto/tlscreds.c
@@ -20,6 +20,7 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
+#include "qapi/qapi-type-infos-crypto.h"
#include "qapi-types-crypto.h"
#include "qemu/module.h"
#include "qemu/error-report.h"
@@ -222,8 +223,7 @@ qcrypto_tls_creds_class_init(ObjectClass *oc, const void *data)
qcrypto_tls_creds_prop_get_dir,
qcrypto_tls_creds_prop_set_dir);
object_class_property_add_enum(oc, "endpoint", "QCryptoTLSCredsEndpoint",
- NULL,
- &QCryptoTLSCredsEndpoint_lookup,
+ &QCryptoTLSCredsEndpoint_type_info, NULL,
qcrypto_tls_creds_prop_get_endpoint,
qcrypto_tls_creds_prop_set_endpoint);
object_class_property_add_str(oc, "priority",
diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c b/hw/microblaze/petalogix_s3adsp1800_mmu.c
index 8cf7cda7d9..b52f12924d 100644
--- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
+++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
@@ -27,6 +27,7 @@
#include "qemu/target-info.h"
#include "qemu/units.h"
#include "qapi/error.h"
+#include "qapi/qapi-type-infos-common.h"
#include "target/microblaze/cpu.h"
#include "hw/core/sysbus.h"
#include "net/net.h"
@@ -175,8 +176,7 @@ static void petalogix_s3adsp1800_machine_class_init(ObjectClass *oc,
mc->is_default = true;
prop = object_class_property_add_enum(oc, "endianness", "EndianMode",
- NULL,
- &EndianMode_lookup,
+ &EndianMode_type_info, NULL,
machine_get_endianness,
machine_set_endianness);
object_property_set_default_str(prop, target_big_endian() ? "big"
diff --git a/monitor/qmp.c b/monitor/qmp.c
index 8d7e49d1ce..c6341f1a20 100644
--- a/monitor/qmp.c
+++ b/monitor/qmp.c
@@ -30,6 +30,7 @@
#include "qapi/error.h"
#include "qapi/qapi-commands-control.h"
#include "qapi/qapi-commands-char.h"
+#include "qapi/qapi-type-infos-qom.h"
#include "qobject/qdict.h"
#include "qobject/qjson.h"
#include "qobject/qlist.h"
@@ -134,8 +135,8 @@ static void monitor_qmp_class_init(ObjectClass *cls, const void *data)
monitor_qmp_get_pretty,
monitor_qmp_set_pretty);
object_class_property_add_enum(cls, "close-action",
- "MonitorQMPCloseAction", NULL,
- &MonitorQMPCloseAction_lookup,
+ "MonitorQMPCloseAction",
+ &MonitorQMPCloseAction_type_info, NULL,
monitor_qmp_get_close_action,
monitor_qmp_set_close_action);
diff --git a/net/filter.c b/net/filter.c
index 5311622aca..9013d872ea 100644
--- a/net/filter.c
+++ b/net/filter.c
@@ -8,6 +8,7 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
+#include "qapi/qapi-type-infos-common.h"
#include "qapi/qmp/qerror.h"
#include "qemu/error-report.h"
@@ -342,8 +343,8 @@ static void netfilter_class_init(ObjectClass *oc, const void *data)
object_class_property_add_str(oc, "netdev",
netfilter_get_netdev_id, netfilter_set_netdev_id);
- object_class_property_add_enum(oc, "queue", "NetFilterDirection", NULL,
- &NetFilterDirection_lookup,
+ object_class_property_add_enum(oc, "queue", "NetFilterDirection",
+ &NetFilterDirection_type_info, NULL,
netfilter_get_direction, netfilter_set_direction);
object_class_property_add_str(oc, "status",
netfilter_get_status, netfilter_set_status);
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index abd9aa6241..0f71e75b60 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -14,6 +14,8 @@
#include "qemu/osdep.h"
#include "qapi/qapi-events-run-state.h"
+#include "qapi/qapi-type-infos-common.h"
+#include "qapi/qapi-type-infos-run-state.h"
#include "qapi/error.h"
#include "qapi/visitor.h"
#include <math.h>
@@ -7090,8 +7092,7 @@ static void kvm_arch_set_honor_guest_pat(Object *obj, int value, Error **errp)
void kvm_arch_accel_class_init(ObjectClass *oc)
{
object_class_property_add_enum(oc, "notify-vmexit", "NotifyVMexitOption",
- NULL,
- &NotifyVmexitOption_lookup,
+ &NotifyVmexitOption_type_info, NULL,
kvm_arch_get_notify_vmexit,
kvm_arch_set_notify_vmexit);
object_class_property_set_description(oc, "notify-vmexit",
@@ -7128,8 +7129,8 @@ void kvm_arch_accel_class_init(ObjectClass *oc)
object_class_property_set_description(oc, "xen-evtchn-max-pirq",
"Maximum number of Xen PIRQs");
- object_class_property_add_enum(oc, "honor-guest-pat", "OnOffAuto", NULL,
- &OnOffAuto_lookup,
+ object_class_property_add_enum(oc, "honor-guest-pat", "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
kvm_arch_get_honor_guest_pat,
kvm_arch_set_honor_guest_pat);
object_class_property_set_description(oc, "honor-guest-pat",
diff --git a/ui/console-vc.c b/ui/console-vc.c
index 99cc8f09c8..ac8c6bf101 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -6,6 +6,7 @@
#include "chardev/char.h"
#include "qapi/error.h"
+#include "qapi/qapi-type-infos-char.h"
#include "qemu/option.h"
#include "qemu/queue.h"
#include "qom/compat-properties.h"
diff --git a/ui/dbus.c b/ui/dbus.c
index 966c2c8b4e..9c21204771 100644
--- a/ui/dbus.c
+++ b/ui/dbus.c
@@ -38,6 +38,8 @@
#include "qemu/audio.h"
#include "audio/audio_int.h" /* FIXME: use QOM dynamic cast instead of drv->name */
#include "qapi/error.h"
+#include "qapi/qapi-type-infos-char.h"
+#include "qapi/qapi-type-infos-ui.h"
#include "trace.h"
#include "dbus.h"
@@ -508,8 +510,8 @@ dbus_display_class_init(ObjectClass *oc, const void *data)
object_class_property_add_bool(oc, "p2p", get_dbus_p2p, set_dbus_p2p);
object_class_property_add_str(oc, "addr", get_dbus_addr, set_dbus_addr);
object_class_property_add_str(oc, "audiodev", get_audiodev, set_audiodev);
- object_class_property_add_enum(oc, "gl-mode", "DisplayGLMode", NULL,
- &DisplayGLMode_lookup,
+ object_class_property_add_enum(oc, "gl-mode", "DisplayGLMode",
+ &DisplayGLMode_type_info, NULL,
get_gl_mode, set_gl_mode);
}
diff --git a/ui/input-linux.c b/ui/input-linux.c
index ea4d76e75d..127be74450 100644
--- a/ui/input-linux.c
+++ b/ui/input-linux.c
@@ -6,6 +6,7 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
+#include "qapi/qapi-type-infos-common.h"
#include "qemu/config-file.h"
#include "qemu/main-loop.h"
#include "qemu/module.h"
@@ -506,8 +507,8 @@ static void input_linux_class_init(ObjectClass *oc, const void *data)
object_class_property_add_bool(oc, "repeat",
input_linux_get_repeat,
input_linux_set_repeat);
- object_class_property_add_enum(oc, "grab-toggle", "GrabToggleKeys", NULL,
- &GrabToggleKeys_lookup,
+ object_class_property_add_enum(oc, "grab-toggle", "GrabToggleKeys",
+ &GrabToggleKeys_type_info, NULL,
input_linux_get_grab_toggle,
input_linux_set_grab_toggle);
}
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 19/56] qom: convert struct properties to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (17 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 18/56] qom: convert QAPI enum properties to QAPI-aware registration Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 20/56] x86: convert OnOffAuto " Markus Armbruster
` (36 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Convert all callers of object_property_add() and
object_class_property_add() that register struct-typed properties with
QAPI visitor-based getters/setters to pass QAPITypeInfo.
This enables QMP QOM introspection to report accurate QAPI type
information for struct properties in member @qapi-type. Existing
getters/setters are preserved unchanged.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
authz/list.c | 3 ++-
block/throttle-groups.c | 4 +++-
chardev/char-socket.c | 4 +++-
hw/core/machine.c | 12 ++++++++----
hw/cxl/cxl-host.c | 4 +++-
hw/remote/vfio-user-obj.c | 6 ++++--
hw/vfio-user/pci.c | 4 +++-
target/i386/cpu.c | 10 +++++++---
target/i386/kvm/tdx.c | 10 ++++++----
target/s390x/cpu-system.c | 3 ++-
10 files changed, 41 insertions(+), 19 deletions(-)
diff --git a/authz/list.c b/authz/list.c
index 767e91b3aa..75155cf077 100644
--- a/authz/list.c
+++ b/authz/list.c
@@ -127,7 +127,8 @@ qauthz_list_class_init(ObjectClass *oc, const void *data)
qauthz_list_prop_get_policy,
qauthz_list_prop_set_policy);
- object_class_property_add(oc, "rules", "QAuthZListRule", NULL,
+ object_class_property_add(oc, "rules", "QAuthZListRule",
+ &QAuthZListRuleList_type_info,
qauthz_list_prop_get_rules,
qauthz_list_prop_set_rules,
NULL, NULL);
diff --git a/block/throttle-groups.c b/block/throttle-groups.c
index cfe2ea67e3..5d6b089092 100644
--- a/block/throttle-groups.c
+++ b/block/throttle-groups.c
@@ -31,6 +31,7 @@
#include "qemu/thread.h"
#include "system/qtest.h"
#include "qapi/error.h"
+#include "qapi/qapi-type-infos-block-core.h"
#include "qapi/qapi-visit-block-core.h"
#include "qom/object.h"
#include "qom/object_interfaces.h"
@@ -991,7 +992,8 @@ static void throttle_group_obj_class_init(ObjectClass *klass,
}
/* ThrottleLimits */
- object_class_property_add(klass, "limits", "ThrottleLimits", NULL,
+ object_class_property_add(klass, "limits", "ThrottleLimits",
+ &ThrottleLimits_type_info,
throttle_group_get_limits,
throttle_group_set_limits,
NULL, NULL);
diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index 6ce9c2a50b..d62a057e8c 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -31,6 +31,7 @@
#include "qemu/option.h"
#include "qapi/error.h"
#include "qapi/clone-visitor.h"
+#include "qapi/qapi-type-infos-sockets.h"
#include "qapi/qapi-visit-sockets.h"
#include "qemu/yank.h"
#include "trace.h"
@@ -1568,7 +1569,8 @@ static void char_socket_class_init(ObjectClass *oc, const void *data)
cc->chr_listener_cleanup = tcp_chr_listener_cleanup;
cc->chr_get_filename = tcp_chr_get_filename;
- object_class_property_add(oc, "addr", "SocketAddress", NULL,
+ object_class_property_add(oc, "addr", "SocketAddress",
+ &SocketAddress_type_info,
char_socket_get_addr, NULL,
NULL, NULL);
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 50422750be..bc03a62883 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -18,6 +18,7 @@
#include "hw/core/loader.h"
#include "qemu/error-report.h"
#include "qapi/error.h"
+#include "qapi/qapi-type-infos-machine.h"
#include "qapi/qapi-visit-machine.h"
#include "qapi/qapi-commands-machine.h"
#include "qemu/madvise.h"
@@ -1118,20 +1119,22 @@ static void machine_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, "dumpdtb",
"Dump current dtb to a file and quit");
- object_class_property_add(oc, "boot", "BootConfiguration", NULL,
+ object_class_property_add(oc, "boot", "BootConfiguration",
+ &BootConfiguration_type_info,
machine_get_boot, machine_set_boot,
NULL, NULL);
object_class_property_set_description(oc, "boot",
"Boot configuration");
- object_class_property_add(oc, "smp", "SMPConfiguration", NULL,
+ object_class_property_add(oc, "smp", "SMPConfiguration",
+ &SMPConfiguration_type_info,
machine_get_smp, machine_set_smp,
NULL, NULL);
object_class_property_set_description(oc, "smp",
"CPU topology");
object_class_property_add(oc, "smp-cache", "SmpCachePropertiesWrapper",
- NULL,
+ &SmpCachePropertiesWrapper_type_info,
machine_get_smp_cache, machine_set_smp_cache,
NULL, NULL);
object_class_property_set_description(oc, "smp-cache",
@@ -1215,7 +1218,8 @@ static void machine_class_init(ObjectClass *oc, const void *data)
"Set RAM backend"
"Valid value is ID of hostmem based backend");
- object_class_property_add(oc, "memory", "MemorySizeConfiguration", NULL,
+ object_class_property_add(oc, "memory", "MemorySizeConfiguration",
+ &MemorySizeConfiguration_type_info,
machine_get_mem, machine_set_mem,
NULL, NULL);
object_class_property_set_description(oc, "memory",
diff --git a/hw/cxl/cxl-host.c b/hw/cxl/cxl-host.c
index 2ddff574d1..ef7f766847 100644
--- a/hw/cxl/cxl-host.c
+++ b/hw/cxl/cxl-host.c
@@ -13,6 +13,7 @@
#include "system/qtest.h"
#include "hw/core/boards.h"
+#include "qapi/qapi-type-infos-machine.h"
#include "qapi/qapi-visit-machine.h"
#include "hw/cxl/cxl.h"
#include "hw/cxl/cxl_host.h"
@@ -616,7 +617,8 @@ void cxl_machine_init(Object *obj, CXLState *state)
"Set on/off to enable/disable "
"CXL instantiation");
- object_property_add(obj, "cxl-fmw", "CXLFixedMemoryWindow", NULL,
+ object_property_add(obj, "cxl-fmw", "CXLFixedMemoryWindow",
+ &CXLFixedMemoryWindowOptionsList_type_info,
machine_get_cfmw, machine_set_cfmw,
NULL, state);
object_property_set_description(obj, "cxl-fmw",
diff --git a/hw/remote/vfio-user-obj.c b/hw/remote/vfio-user-obj.c
index c4b3cb0b7b..205582a91f 100644
--- a/hw/remote/vfio-user-obj.c
+++ b/hw/remote/vfio-user-obj.c
@@ -47,6 +47,7 @@
#include "hw/core/boards.h"
#include "hw/remote/machine.h"
#include "qapi/error.h"
+#include "qapi/qapi-type-infos-sockets.h"
#include "qapi/qapi-visit-sockets.h"
#include "qapi/qapi-events-misc.h"
#include "qemu/notify.h"
@@ -931,8 +932,9 @@ static void vfu_object_class_init(ObjectClass *klass, const void *data)
k->nr_devs = 0;
- object_class_property_add(klass, "socket", "SocketAddress", NULL, NULL,
- vfu_object_set_socket, NULL, NULL);
+ object_class_property_add(klass, "socket", "SocketAddress",
+ &SocketAddress_type_info,
+ NULL, vfu_object_set_socket, NULL, NULL);
object_class_property_set_description(klass, "socket",
"SocketAddress "
"(ex: type=unix,path=/tmp/sock). "
diff --git a/hw/vfio-user/pci.c b/hw/vfio-user/pci.c
index 4c76a3fe5d..c749ff149f 100644
--- a/hw/vfio-user/pci.c
+++ b/hw/vfio-user/pci.c
@@ -8,6 +8,7 @@
#include "qemu/osdep.h"
#include <sys/ioctl.h>
+#include "qapi/qapi-type-infos-sockets.h"
#include "qapi-visit-sockets.h"
#include "qemu/error-report.h"
@@ -471,7 +472,8 @@ static void vfio_user_pci_class_init(ObjectClass *klass, const void *data)
device_class_set_legacy_reset(dc, vfio_user_pci_reset);
device_class_set_props(dc, vfio_user_pci_properties);
- object_class_property_add(klass, "socket", "SocketAddress", NULL, NULL,
+ object_class_property_add(klass, "socket", "SocketAddress",
+ &SocketAddress_type_info, NULL,
vfio_user_pci_set_socket, NULL, NULL);
object_class_property_set_description(klass, "socket",
"SocketAddress (UNIX sockets only)");
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 4514de46ff..6a05a7144a 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -35,6 +35,8 @@
#include "sev.h"
#include "qapi/error.h"
#include "qemu/error-report.h"
+#include "qapi/qapi-type-infos-machine.h"
+#include "qapi/qapi-type-infos-run-state.h"
#include "qapi/qapi-visit-machine.h"
#include "standard-headers/asm-x86/kvm_para.h"
#include "hw/core/qdev-properties.h"
@@ -10569,11 +10571,12 @@ static void x86_cpu_initfn(Object *obj)
x86_cpu_init_default_topo(cpu);
- object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo", NULL,
+ object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo",
+ &X86CPUFeatureWordInfoList_type_info,
x86_cpu_get_feature_words,
NULL, NULL, (void *)env->features);
object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo",
- NULL,
+ &X86CPUFeatureWordInfo_type_info,
x86_cpu_get_feature_words,
NULL, NULL, (void *)cpu->filtered_features);
@@ -11041,7 +11044,8 @@ static void x86_cpu_common_class_init(ObjectClass *oc, const void *data)
#if !defined(CONFIG_USER_ONLY)
object_class_property_add(oc, "crash-information",
- "GuestPanicInformation", NULL,
+ "GuestPanicInformation",
+ &GuestPanicInformation_type_info,
x86_cpu_get_crash_info_qom, NULL, NULL, NULL);
#endif
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
index f6707abd34..52bb2ec6ce 100644
--- a/target/i386/kvm/tdx.c
+++ b/target/i386/kvm/tdx.c
@@ -14,6 +14,7 @@
#include "qemu/base64.h"
#include "qemu/mmap-alloc.h"
#include "qapi/error.h"
+#include "qapi/qapi-type-infos-sockets.h"
#include "qapi/qapi-visit-sockets.h"
#include "qom/object_interfaces.h"
#include "crypto/hash.h"
@@ -1586,10 +1587,11 @@ static void tdx_guest_init(Object *obj)
tdx_guest_get_mrownerconfig,
tdx_guest_set_mrownerconfig);
- object_property_add(obj, "quote-generation-socket", "SocketAddress", NULL,
- tdx_guest_get_qgs,
- tdx_guest_set_qgs,
- NULL, NULL);
+ object_property_add(obj, "quote-generation-socket", "SocketAddress",
+ &SocketAddress_type_info,
+ tdx_guest_get_qgs,
+ tdx_guest_set_qgs,
+ NULL, NULL);
tdx->event_notify_vector = -1;
tdx->event_notify_apicid = -1;
diff --git a/target/s390x/cpu-system.c b/target/s390x/cpu-system.c
index de2f1422e3..5b5406b947 100644
--- a/target/s390x/cpu-system.c
+++ b/target/s390x/cpu-system.c
@@ -30,6 +30,7 @@
#include "system/reset.h"
#include "qemu/timer.h"
#include "trace.h"
+#include "qapi/qapi-type-infos-run-state.h"
#include "qapi/qapi-visit-run-state.h"
#include "system/hw_accel.h"
@@ -138,7 +139,7 @@ void s390_cpu_system_init(Object *obj)
cs->start_powered_off = true;
object_property_add(obj, "crash-information", "GuestPanicInformation",
- NULL,
+ &GuestPanicInformation_type_info,
s390_cpu_get_crash_info_qom, NULL, NULL, NULL);
cpu->env.tod_timer =
timer_new_ns(QEMU_CLOCK_VIRTUAL, s390x_tod_timer, cpu);
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 20/56] x86: convert OnOffAuto properties to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (18 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 19/56] qom: convert struct " Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 21/56] microvm: " Markus Armbruster
` (35 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Convert the smm, acpi, pit, and pic OnOffAuto properties from manual
visitor-based callbacks to object_class_property_add_enum().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/i386/x86.c | 84 ++++++++++++++++++++-------------------------------
1 file changed, 33 insertions(+), 51 deletions(-)
diff --git a/hw/i386/x86.c b/hw/i386/x86.c
index 1b7740a97e..3416df13ab 100644
--- a/hw/i386/x86.c
+++ b/hw/i386/x86.c
@@ -24,7 +24,7 @@
#include "qemu/error-report.h"
#include "qemu/units.h"
#include "qapi/error.h"
-#include "qapi/qapi-visit-common.h"
+#include "qapi/qapi-type-infos-common.h"
#include "qapi/qapi-visit-machine.h"
#include "qapi/visitor.h"
#include "system/qtest.h"
@@ -188,21 +188,16 @@ bool x86_machine_is_smm_enabled(const X86MachineState *x86ms)
return false;
}
-static void x86_machine_get_smm(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static int x86_machine_get_smm(Object *obj, Error **errp)
{
X86MachineState *x86ms = X86_MACHINE(obj);
- OnOffAuto smm = x86ms->smm;
-
- visit_type_OnOffAuto(v, name, &smm, errp);
+ return x86ms->smm;
}
-static void x86_machine_set_smm(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static void x86_machine_set_smm(Object *obj, int value, Error **errp)
{
X86MachineState *x86ms = X86_MACHINE(obj);
-
- visit_type_OnOffAuto(v, name, &x86ms->smm, errp);
+ x86ms->smm = value;
}
bool x86_machine_is_acpi_enabled(const X86MachineState *x86ms)
@@ -213,55 +208,40 @@ bool x86_machine_is_acpi_enabled(const X86MachineState *x86ms)
return true;
}
-static void x86_machine_get_acpi(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static int x86_machine_get_acpi(Object *obj, Error **errp)
{
X86MachineState *x86ms = X86_MACHINE(obj);
- OnOffAuto acpi = x86ms->acpi;
-
- visit_type_OnOffAuto(v, name, &acpi, errp);
+ return x86ms->acpi;
}
-static void x86_machine_set_acpi(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static void x86_machine_set_acpi(Object *obj, int value, Error **errp)
{
X86MachineState *x86ms = X86_MACHINE(obj);
-
- visit_type_OnOffAuto(v, name, &x86ms->acpi, errp);
+ x86ms->acpi = value;
}
-static void x86_machine_get_pit(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static int x86_machine_get_pit(Object *obj, Error **errp)
{
X86MachineState *x86ms = X86_MACHINE(obj);
- OnOffAuto pit = x86ms->pit;
-
- visit_type_OnOffAuto(v, name, &pit, errp);
+ return x86ms->pit;
}
-static void x86_machine_set_pit(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static void x86_machine_set_pit(Object *obj, int value, Error **errp)
{
X86MachineState *x86ms = X86_MACHINE(obj);
-
- visit_type_OnOffAuto(v, name, &x86ms->pit, errp);
+ x86ms->pit = value;
}
-static void x86_machine_get_pic(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static int x86_machine_get_pic(Object *obj, Error **errp)
{
X86MachineState *x86ms = X86_MACHINE(obj);
- OnOffAuto pic = x86ms->pic;
-
- visit_type_OnOffAuto(v, name, &pic, errp);
+ return x86ms->pic;
}
-static void x86_machine_set_pic(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static void x86_machine_set_pic(Object *obj, int value, Error **errp)
{
X86MachineState *x86ms = X86_MACHINE(obj);
-
- visit_type_OnOffAuto(v, name, &x86ms->pic, errp);
+ x86ms->pic = value;
}
static char *x86_machine_get_oem_id(Object *obj, Error **errp)
@@ -391,29 +371,31 @@ static void x86_machine_class_init(ObjectClass *oc, const void *data)
mc->kvm_type = x86_kvm_type;
nc->raise_nmi = x86_nmi;
- object_class_property_add(oc, X86_MACHINE_SMM, "OnOffAuto", NULL,
- x86_machine_get_smm, x86_machine_set_smm,
- NULL, NULL);
+ object_class_property_add_enum(oc, X86_MACHINE_SMM, "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ x86_machine_get_smm,
+ x86_machine_set_smm);
object_class_property_set_description(oc, X86_MACHINE_SMM,
"Enable SMM");
- object_class_property_add(oc, X86_MACHINE_ACPI, "OnOffAuto", NULL,
- x86_machine_get_acpi, x86_machine_set_acpi,
- NULL, NULL);
+ object_class_property_add_enum(oc, X86_MACHINE_ACPI, "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ x86_machine_get_acpi,
+ x86_machine_set_acpi);
object_class_property_set_description(oc, X86_MACHINE_ACPI,
"Enable ACPI");
- object_class_property_add(oc, X86_MACHINE_PIT, "OnOffAuto", NULL,
- x86_machine_get_pit,
- x86_machine_set_pit,
- NULL, NULL);
+ object_class_property_add_enum(oc, X86_MACHINE_PIT, "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ x86_machine_get_pit,
+ x86_machine_set_pit);
object_class_property_set_description(oc, X86_MACHINE_PIT,
"Enable i8254 PIT");
- object_class_property_add(oc, X86_MACHINE_PIC, "OnOffAuto", NULL,
- x86_machine_get_pic,
- x86_machine_set_pic,
- NULL, NULL);
+ object_class_property_add_enum(oc, X86_MACHINE_PIC, "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ x86_machine_get_pic,
+ x86_machine_set_pic);
object_class_property_set_description(oc, X86_MACHINE_PIC,
"Enable i8259 PIC");
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 21/56] microvm: convert OnOffAuto properties to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (19 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 20/56] x86: convert OnOffAuto " Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 22/56] pc: convert OnOffAuto vmport property " Markus Armbruster
` (34 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Convert the rtc, pcie, and ioapic2 OnOffAuto properties from manual
visitor-based callbacks to object_class_property_add_enum().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/i386/microvm.c | 68 +++++++++++++++++++----------------------------
1 file changed, 28 insertions(+), 40 deletions(-)
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index c679b3b177..7f010cb2f2 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -21,7 +21,7 @@
#include "qemu/units.h"
#include "qapi/error.h"
#include "qapi/visitor.h"
-#include "qapi/qapi-visit-common.h"
+#include "qapi/qapi-type-infos-common.h"
#include "system/system.h"
#include "system/cpus.h"
#include "system/numa.h"
@@ -519,55 +519,40 @@ static void microvm_machine_reset(MachineState *machine, ResetType type)
}
}
-static void microvm_machine_get_rtc(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static int microvm_machine_get_rtc(Object *obj, Error **errp)
{
MicrovmMachineState *mms = MICROVM_MACHINE(obj);
- OnOffAuto rtc = mms->rtc;
-
- visit_type_OnOffAuto(v, name, &rtc, errp);
+ return mms->rtc;
}
-static void microvm_machine_set_rtc(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static void microvm_machine_set_rtc(Object *obj, int value, Error **errp)
{
MicrovmMachineState *mms = MICROVM_MACHINE(obj);
-
- visit_type_OnOffAuto(v, name, &mms->rtc, errp);
+ mms->rtc = value;
}
-static void microvm_machine_get_pcie(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static int microvm_machine_get_pcie(Object *obj, Error **errp)
{
MicrovmMachineState *mms = MICROVM_MACHINE(obj);
- OnOffAuto pcie = mms->pcie;
-
- visit_type_OnOffAuto(v, name, &pcie, errp);
+ return mms->pcie;
}
-static void microvm_machine_set_pcie(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static void microvm_machine_set_pcie(Object *obj, int value, Error **errp)
{
MicrovmMachineState *mms = MICROVM_MACHINE(obj);
-
- visit_type_OnOffAuto(v, name, &mms->pcie, errp);
+ mms->pcie = value;
}
-static void microvm_machine_get_ioapic2(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static int microvm_machine_get_ioapic2(Object *obj, Error **errp)
{
MicrovmMachineState *mms = MICROVM_MACHINE(obj);
- OnOffAuto ioapic2 = mms->ioapic2;
-
- visit_type_OnOffAuto(v, name, &ioapic2, errp);
+ return mms->ioapic2;
}
-static void microvm_machine_set_ioapic2(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static void microvm_machine_set_ioapic2(Object *obj, int value, Error **errp)
{
MicrovmMachineState *mms = MICROVM_MACHINE(obj);
-
- visit_type_OnOffAuto(v, name, &mms->ioapic2, errp);
+ mms->ioapic2 = value;
}
static bool microvm_machine_get_isa_serial(Object *obj, Error **errp)
@@ -673,24 +658,27 @@ static void microvm_class_init(ObjectClass *oc, const void *data)
hc->unplug_request = microvm_device_unplug_request_cb;
hc->unplug = microvm_device_unplug_cb;
- object_class_property_add(oc, MICROVM_MACHINE_RTC, "OnOffAuto", NULL,
- microvm_machine_get_rtc,
- microvm_machine_set_rtc,
- NULL, NULL);
+ object_class_property_add_enum(oc, MICROVM_MACHINE_RTC,
+ "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ microvm_machine_get_rtc,
+ microvm_machine_set_rtc);
object_class_property_set_description(oc, MICROVM_MACHINE_RTC,
"Enable MC146818 RTC");
- object_class_property_add(oc, MICROVM_MACHINE_PCIE, "OnOffAuto", NULL,
- microvm_machine_get_pcie,
- microvm_machine_set_pcie,
- NULL, NULL);
+ object_class_property_add_enum(oc, MICROVM_MACHINE_PCIE,
+ "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ microvm_machine_get_pcie,
+ microvm_machine_set_pcie);
object_class_property_set_description(oc, MICROVM_MACHINE_PCIE,
"Enable PCIe");
- object_class_property_add(oc, MICROVM_MACHINE_IOAPIC2, "OnOffAuto", NULL,
- microvm_machine_get_ioapic2,
- microvm_machine_set_ioapic2,
- NULL, NULL);
+ object_class_property_add_enum(oc, MICROVM_MACHINE_IOAPIC2,
+ "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ microvm_machine_get_ioapic2,
+ microvm_machine_set_ioapic2);
object_class_property_set_description(oc, MICROVM_MACHINE_IOAPIC2,
"Enable second IO-APIC");
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 22/56] pc: convert OnOffAuto vmport property to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (20 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 21/56] microvm: " Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 23/56] arm/virt: convert OnOffAuto acpi " Markus Armbruster
` (33 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Convert the vmport OnOffAuto property from manual visitor-based
callbacks to object_class_property_add_enum().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/i386/pc.c | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 1fce96f5ec..649ae27156 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -46,6 +46,7 @@
#include "kvm/kvm_i386.h"
#include "kvm/tdx.h"
#include "hw/xen/xen.h"
+#include "qapi/qapi-type-infos-common.h"
#include "qobject/qlist.h"
#include "qemu/error-report.h"
#include "hw/acpi/acpi.h"
@@ -1417,21 +1418,16 @@ static const HotplugHandler *pc_get_hotplug_handler(MachineState *machine,
return NULL;
}
-static void pc_machine_get_vmport(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static int pc_machine_get_vmport(Object *obj, Error **errp)
{
PCMachineState *pcms = PC_MACHINE(obj);
- OnOffAuto vmport = pcms->vmport;
-
- visit_type_OnOffAuto(v, name, &vmport, errp);
+ return pcms->vmport;
}
-static void pc_machine_set_vmport(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static void pc_machine_set_vmport(Object *obj, int value, Error **errp)
{
PCMachineState *pcms = PC_MACHINE(obj);
-
- visit_type_OnOffAuto(v, name, &pcms->vmport, errp);
+ pcms->vmport = value;
}
static bool pc_machine_get_fd_bootchk(Object *obj, Error **errp)
@@ -1729,9 +1725,11 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, PC_MACHINE_MAX_RAM_BELOW_4G,
"Maximum ram below the 4G boundary (32bit boundary)");
- object_class_property_add(oc, PC_MACHINE_VMPORT, "OnOffAuto", NULL,
- pc_machine_get_vmport, pc_machine_set_vmport,
- NULL, NULL);
+ object_class_property_add_enum(oc, PC_MACHINE_VMPORT,
+ "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ pc_machine_get_vmport,
+ pc_machine_set_vmport);
object_class_property_set_description(oc, PC_MACHINE_VMPORT,
"Enable vmport (pc & q35)");
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 23/56] arm/virt: convert OnOffAuto acpi property to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (21 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 22/56] pc: convert OnOffAuto vmport property " Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 24/56] riscv/virt: convert OnOffAuto properties " Markus Armbruster
` (32 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Convert the acpi OnOffAuto property from manual visitor-based
callbacks to object_class_property_add_enum().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/arm/virt.c | 21 ++++++++-------------
1 file changed, 8 insertions(+), 13 deletions(-)
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index dad3f8c39b..e39d77eba6 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -72,7 +72,7 @@
#include "whpx_arm.h"
#include "hw/firmware/smbios.h"
#include "qapi/visitor.h"
-#include "qapi/qapi-visit-common.h"
+#include "qapi/qapi-type-infos-common.h"
#include "qobject/qlist.h"
#include "standard-headers/linux/input.h"
#include "hw/arm/smmuv3.h"
@@ -3564,21 +3564,16 @@ bool virt_is_acpi_enabled(const VirtMachineState *vms)
return true;
}
-static void virt_get_acpi(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static int virt_get_acpi(Object *obj, Error **errp)
{
VirtMachineState *vms = VIRT_MACHINE(obj);
- OnOffAuto acpi = vms->acpi;
-
- visit_type_OnOffAuto(v, name, &acpi, errp);
+ return vms->acpi;
}
-static void virt_set_acpi(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static void virt_set_acpi(Object *obj, int value, Error **errp)
{
VirtMachineState *vms = VIRT_MACHINE(obj);
-
- visit_type_OnOffAuto(v, name, &vms->acpi, errp);
+ vms->acpi = value;
}
static bool virt_get_ras(Object *obj, Error **errp)
@@ -4206,9 +4201,9 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
mc->default_ram_id = "mach-virt.ram";
mc->default_nic = "virtio-net-pci";
- object_class_property_add(oc, "acpi", "OnOffAuto", NULL,
- virt_get_acpi, virt_set_acpi,
- NULL, NULL);
+ object_class_property_add_enum(oc, "acpi", "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ virt_get_acpi, virt_set_acpi);
object_class_property_set_description(oc, "acpi",
"Enable ACPI");
object_class_property_add_bool(oc, "secure", virt_get_secure,
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 24/56] riscv/virt: convert OnOffAuto properties to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (22 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 23/56] arm/virt: convert OnOffAuto acpi " Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 25/56] loongarch/virt: " Markus Armbruster
` (31 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange, Alistair Francis
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Convert the acpi and iommu-sys OnOffAuto properties from manual
visitor-based callbacks to object_class_property_add_enum().
Acked-by: Alistair Francis <alistair.francis@wdc.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/riscv/virt.c | 40 +++++++++++++++-------------------------
1 file changed, 15 insertions(+), 25 deletions(-)
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index 65f4c67bff..31fecdc964 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -58,7 +58,7 @@
#include "hw/pci-host/gpex.h"
#include "hw/display/ramfb.h"
#include "hw/acpi/aml-build.h"
-#include "qapi/qapi-visit-common.h"
+#include "qapi/qapi-type-infos-common.h"
#include "hw/virtio/virtio-iommu.h"
#include "hw/uefi/var-service-api.h"
@@ -1055,38 +1055,28 @@ bool virt_is_iommu_sys_enabled(RISCVVirtState *s)
return s->iommu_sys == ON_OFF_AUTO_ON;
}
-static void virt_get_iommu_sys(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static int virt_get_iommu_sys(Object *obj, Error **errp)
{
RISCVVirtState *s = RISCV_VIRT_MACHINE(obj);
- OnOffAuto iommu_sys = s->iommu_sys;
-
- visit_type_OnOffAuto(v, name, &iommu_sys, errp);
+ return s->iommu_sys;
}
-static void virt_set_iommu_sys(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static void virt_set_iommu_sys(Object *obj, int value, Error **errp)
{
RISCVVirtState *s = RISCV_VIRT_MACHINE(obj);
-
- visit_type_OnOffAuto(v, name, &s->iommu_sys, errp);
+ s->iommu_sys = value;
}
-static void virt_get_acpi(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static int virt_get_acpi(Object *obj, Error **errp)
{
RISCVVirtState *s = RISCV_VIRT_MACHINE(obj);
- OnOffAuto acpi = s->acpi;
-
- visit_type_OnOffAuto(v, name, &acpi, errp);
+ return s->acpi;
}
-static void virt_set_acpi(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static void virt_set_acpi(Object *obj, int value, Error **errp)
{
RISCVVirtState *s = RISCV_VIRT_MACHINE(obj);
-
- visit_type_OnOffAuto(v, name, &s->acpi, errp);
+ s->acpi = value;
}
static const HotplugHandler *
@@ -1184,15 +1174,15 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, "aia-guests", str);
}
- object_class_property_add(oc, "acpi", "OnOffAuto", NULL,
- virt_get_acpi, virt_set_acpi,
- NULL, NULL);
+ object_class_property_add_enum(oc, "acpi", "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ virt_get_acpi, virt_set_acpi);
object_class_property_set_description(oc, "acpi",
"Enable ACPI");
- object_class_property_add(oc, "iommu-sys", "OnOffAuto", NULL,
- virt_get_iommu_sys, virt_set_iommu_sys,
- NULL, NULL);
+ object_class_property_add_enum(oc, "iommu-sys", "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ virt_get_iommu_sys, virt_set_iommu_sys);
object_class_property_set_description(oc, "iommu-sys",
"Enable IOMMU platform device");
}
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 25/56] loongarch/virt: convert OnOffAuto properties to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (23 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 24/56] riscv/virt: convert OnOffAuto properties " Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 26/56] hostmem: convert OnOffAuto rom property " Markus Armbruster
` (30 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange, Bibo Mao
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Convert the acpi, v-eiointc, and dmsi OnOffAuto properties from
manual visitor-based callbacks to object_class_property_add_enum().
Reviewed-by: Bibo Mao <maobibo@loongson.cn>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/loongarch/virt.c | 65 ++++++++++++++++++---------------------------
1 file changed, 26 insertions(+), 39 deletions(-)
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 8ad327b8dd..1e1271ce87 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -36,7 +36,8 @@
#include "target/loongarch/cpu.h"
#include "target/loongarch/cpu-mmu.h"
#include "hw/firmware/smbios.h"
-#include "qapi/qapi-visit-common.h"
+#include "qapi/qapi-type-infos-common.h"
+#include "qapi/visitor.h"
#include "hw/acpi/generic_event_device.h"
#include "hw/mem/nvdimm.h"
#include "hw/core/platform-bus.h"
@@ -51,26 +52,21 @@
#include "qemu/log.h"
#include "kvm/kvm_loongarch.h"
-static void virt_get_dmsi(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static int virt_get_dmsi(Object *obj, Error **errp)
{
LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(obj);
- OnOffAuto dmsi = lvms->dmsi;
-
- visit_type_OnOffAuto(v, name, &dmsi, errp);
-
+ return lvms->dmsi;
}
-static void virt_set_dmsi(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+
+static void virt_set_dmsi(Object *obj, int value, Error **errp)
{
LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(obj);
+ lvms->dmsi = value;
- visit_type_OnOffAuto(v, name, &lvms->dmsi, errp);
-
- if (lvms->dmsi == ON_OFF_AUTO_OFF) {
+ if (value == ON_OFF_AUTO_OFF) {
lvms->misc_feature &= ~BIT(IOCSRF_DMSI);
lvms->misc_status &= ~BIT_ULL(IOCSRM_DMSI_EN);
- } else if (lvms->dmsi == ON_OFF_AUTO_ON) {
+ } else if (value == ON_OFF_AUTO_ON) {
lvms->misc_feature = BIT(IOCSRF_DMSI);
}
}
@@ -78,21 +74,16 @@ static void virt_set_dmsi(Object *obj, Visitor *v, const char *name,
#define DEFAULT_HIGH_PCIE_MMIO_SIZE_GB 64
#define DEFAULT_HIGH_PCIE_MMIO_SIZE (DEFAULT_HIGH_PCIE_MMIO_SIZE_GB * GiB)
-static void virt_get_veiointc(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static int virt_get_veiointc(Object *obj, Error **errp)
{
LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(obj);
- OnOffAuto veiointc = lvms->veiointc;
-
- visit_type_OnOffAuto(v, name, &veiointc, errp);
+ return lvms->veiointc;
}
-static void virt_set_veiointc(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static void virt_set_veiointc(Object *obj, int value, Error **errp)
{
LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(obj);
-
- visit_type_OnOffAuto(v, name, &lvms->veiointc, errp);
+ lvms->veiointc = value;
}
static bool virt_get_highmem_mmio(Object *obj, Error **errp)
@@ -1025,21 +1016,16 @@ static void virt_init(MachineState *machine)
loongarch_load_kernel(machine, &lvms->bootinfo, phys_addr_mask);
}
-static void virt_get_acpi(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static int virt_get_acpi(Object *obj, Error **errp)
{
LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(obj);
- OnOffAuto acpi = lvms->acpi;
-
- visit_type_OnOffAuto(v, name, &acpi, errp);
+ return lvms->acpi;
}
-static void virt_set_acpi(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
+static void virt_set_acpi(Object *obj, int value, Error **errp)
{
LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(obj);
-
- visit_type_OnOffAuto(v, name, &lvms->acpi, errp);
+ lvms->acpi = value;
}
static char *virt_get_oem_id(Object *obj, Error **errp)
@@ -1483,18 +1469,19 @@ static void virt_class_init(ObjectClass *oc, const void *data)
hc->unplug_request = virt_device_unplug_request;
hc->unplug = virt_device_unplug;
- object_class_property_add(oc, "acpi", "OnOffAuto", NULL,
- virt_get_acpi, virt_set_acpi,
- NULL, NULL);
+ object_class_property_add_enum(oc, "acpi", "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ virt_get_acpi, virt_set_acpi);
object_class_property_set_description(oc, "acpi",
"Enable ACPI");
- object_class_property_add(oc, "v-eiointc", "OnOffAuto", NULL,
- virt_get_veiointc, virt_set_veiointc,
- NULL, NULL);
+ object_class_property_add_enum(oc, "v-eiointc", "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ virt_get_veiointc, virt_set_veiointc);
object_class_property_set_description(oc, "v-eiointc",
"Enable Virt Extend I/O Interrupt Controller.");
- object_class_property_add(oc, "dmsi", "OnOffAuto", NULL,
- virt_get_dmsi, virt_set_dmsi, NULL, NULL);
+ object_class_property_add_enum(oc, "dmsi", "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ virt_get_dmsi, virt_set_dmsi);
object_class_property_set_description(oc, "dmsi",
"Enable direct Message-interrupts Controller.");
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 26/56] hostmem: convert OnOffAuto rom property to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (24 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 25/56] loongarch/virt: " Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 27/56] sev: convert OnOffAuto legacy-vm-type " Markus Armbruster
` (29 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Convert the hostmem-file's rom property and hostmem-memfd's
guest-memfd property from manual visitor-based callbacks to
object_class_property_add_enum().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
backends/hostmem-file.c | 25 ++++++++++---------------
backends/hostmem-memfd.c | 23 ++++++++++-------------
2 files changed, 20 insertions(+), 28 deletions(-)
diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
index aec38bac2f..15b5fee246 100644
--- a/backends/hostmem-file.c
+++ b/backends/hostmem-file.c
@@ -19,7 +19,7 @@
#include "qom/object_interfaces.h"
#include "qom/object.h"
#include "qapi/visitor.h"
-#include "qapi/qapi-visit-common.h"
+#include "qapi/qapi-type-infos-common.h"
OBJECT_DECLARE_SIMPLE_TYPE(HostMemoryBackendFile, MEMORY_BACKEND_FILE)
@@ -230,30 +230,24 @@ static void file_memory_backend_set_readonly(Object *obj, bool value,
fb->readonly = value;
}
-static void file_memory_backend_get_rom(Object *obj, Visitor *v,
- const char *name, void *opaque,
- Error **errp)
+static int file_memory_backend_get_rom(Object *obj, Error **errp)
{
HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(obj);
- OnOffAuto rom = fb->rom;
-
- visit_type_OnOffAuto(v, name, &rom, errp);
+ return fb->rom;
}
-static void file_memory_backend_set_rom(Object *obj, Visitor *v,
- const char *name, void *opaque,
- Error **errp)
+static void file_memory_backend_set_rom(Object *obj, int value, Error **errp)
{
HostMemoryBackend *backend = MEMORY_BACKEND(obj);
HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(obj);
if (host_memory_backend_mr_inited(backend)) {
- error_setg(errp, "cannot change property '%s' of %s.", name,
+ error_setg(errp, "cannot change property 'rom' of %s.",
object_get_typename(obj));
return;
}
- visit_type_OnOffAuto(v, name, &fb->rom, errp);
+ fb->rom = value;
}
static void file_backend_unparent(Object *obj)
@@ -298,9 +292,10 @@ file_backend_class_init(ObjectClass *oc, const void *data)
object_class_property_add_bool(oc, "readonly",
file_memory_backend_get_readonly,
file_memory_backend_set_readonly);
- object_class_property_add(oc, "rom", "OnOffAuto", NULL,
- file_memory_backend_get_rom,
- file_memory_backend_set_rom, NULL, NULL);
+ object_class_property_add_enum(oc, "rom", "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ file_memory_backend_get_rom,
+ file_memory_backend_set_rom);
object_class_property_set_description(oc, "rom",
"Whether to create Read Only Memory (ROM)");
}
diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c
index 15dc8814ba..4e1b23a1d6 100644
--- a/backends/hostmem-memfd.c
+++ b/backends/hostmem-memfd.c
@@ -20,7 +20,7 @@
#include "migration/cpr.h"
#include "system/kvm.h"
#include <linux/kvm.h>
-#include "qapi/qapi-visit-common.h"
+#include "qapi/qapi-type-infos-common.h"
OBJECT_DECLARE_SIMPLE_TYPE(HostMemoryBackendMemfd, MEMORY_BACKEND_MEMFD)
@@ -95,24 +95,20 @@ have_fd:
backend->size, ram_flags, fd, 0, errp);
}
-static void
-memfd_backend_get_guest_memfd(Object *o, Visitor *v,
- const char *value, void *opaque,
- Error **errp)
+static int
+memfd_backend_get_guest_memfd(Object *o, Error **errp)
{
HostMemoryBackendMemfd *m = MEMORY_BACKEND_MEMFD(o);
- visit_type_OnOffAuto(v, value, &m->guest_memfd, errp);
+ return m->guest_memfd;
}
static void
-memfd_backend_set_guest_memfd(Object *o, Visitor *v,
- const char *value, void *opaque,
- Error **errp)
+memfd_backend_set_guest_memfd(Object *o, int value, Error **errp)
{
HostMemoryBackendMemfd *m = MEMORY_BACKEND_MEMFD(o);
- visit_type_OnOffAuto(v, value, &m->guest_memfd, errp);
+ m->guest_memfd = value;
}
static bool
@@ -203,9 +199,10 @@ memfd_backend_class_init(ObjectClass *oc, const void *data)
"Huge pages size (ex: 2M, 1G)");
}
- object_class_property_add(oc, "guest-memfd", "OnOffAuto", NULL,
- memfd_backend_get_guest_memfd,
- memfd_backend_set_guest_memfd, NULL, NULL);
+ object_class_property_add_enum(oc, "guest-memfd", "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ memfd_backend_get_guest_memfd,
+ memfd_backend_set_guest_memfd);
object_class_property_set_description(oc, "guest-memfd",
"Use guest memfd");
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 27/56] sev: convert OnOffAuto legacy-vm-type property to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (25 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 26/56] hostmem: convert OnOffAuto rom property " Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 28/56] whpx: convert OnOffAuto hyperv " Markus Armbruster
` (28 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Convert the legacy-vm-type OnOffAuto property from manual
visitor-based callbacks to object_class_property_add_enum().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
target/i386/sev.c | 23 +++++++++--------------
1 file changed, 9 insertions(+), 14 deletions(-)
diff --git a/target/i386/sev.c b/target/i386/sev.c
index 74a7b719b5..d19f98e1c7 100644
--- a/target/i386/sev.c
+++ b/target/i386/sev.c
@@ -20,6 +20,7 @@
#include <sys/ioctl.h>
#include "qapi/error.h"
+#include "qapi/qapi-type-infos-common.h"
#include "qom/object_interfaces.h"
#include "qemu/base64.h"
#include "qemu/module.h"
@@ -2982,23 +2983,16 @@ sev_guest_set_session_file(Object *obj, const char *value, Error **errp)
SEV_GUEST(obj)->session_file = g_strdup(value);
}
-static void sev_guest_get_legacy_vm_type(Object *obj, Visitor *v,
- const char *name, void *opaque,
- Error **errp)
+static int sev_guest_get_legacy_vm_type(Object *obj, Error **errp)
{
SevGuestState *sev_guest = SEV_GUEST(obj);
- OnOffAuto legacy_vm_type = sev_guest->legacy_vm_type;
-
- visit_type_OnOffAuto(v, name, &legacy_vm_type, errp);
+ return sev_guest->legacy_vm_type;
}
-static void sev_guest_set_legacy_vm_type(Object *obj, Visitor *v,
- const char *name, void *opaque,
- Error **errp)
+static void sev_guest_set_legacy_vm_type(Object *obj, int value, Error **errp)
{
SevGuestState *sev_guest = SEV_GUEST(obj);
-
- visit_type_OnOffAuto(v, name, &sev_guest->legacy_vm_type, errp);
+ sev_guest->legacy_vm_type = value;
}
static void
@@ -3024,9 +3018,10 @@ sev_guest_class_init(ObjectClass *oc, const void *data)
sev_guest_set_session_file);
object_class_property_set_description(oc, "session-file",
"guest owners session parameters (encoded with base64)");
- object_class_property_add(oc, "legacy-vm-type", "OnOffAuto", NULL,
- sev_guest_get_legacy_vm_type,
- sev_guest_set_legacy_vm_type, NULL, NULL);
+ object_class_property_add_enum(oc, "legacy-vm-type", "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ sev_guest_get_legacy_vm_type,
+ sev_guest_set_legacy_vm_type);
object_class_property_set_description(oc, "legacy-vm-type",
"use legacy VM type to maintain measurement compatibility with older QEMU or kernel versions.");
}
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 28/56] whpx: convert OnOffAuto hyperv property to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (26 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 27/56] sev: convert OnOffAuto legacy-vm-type " Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 29/56] whpx: convert OnOffAuto arch properties " Markus Armbruster
` (27 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Convert the hyperv OnOffAuto property from manual visitor-based
callbacks to object_class_property_add_enum().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
accel/whpx/whpx-common.c | 24 +++++++-----------------
1 file changed, 7 insertions(+), 17 deletions(-)
diff --git a/accel/whpx/whpx-common.c b/accel/whpx/whpx-common.c
index f82e607745..3447c52fb1 100644
--- a/accel/whpx/whpx-common.c
+++ b/accel/whpx/whpx-common.c
@@ -22,6 +22,7 @@
#include "qemu/error-report.h"
#include "qapi/error.h"
#include "qapi/qapi-types-common.h"
+#include "qapi/qapi-type-infos-common.h"
#include "qapi/qapi-visit-common.h"
#include "migration/blocker.h"
#include "accel/accel-cpu-target.h"
@@ -470,18 +471,11 @@ static void whpx_set_kernel_irqchip(Object *obj, Visitor *v,
}
}
-static void whpx_set_hyperv(Object *obj, Visitor *v,
- const char *name, void *opaque,
- Error **errp)
+static void whpx_set_hyperv(Object *obj, int value, Error **errp)
{
struct whpx_state *whpx = &whpx_global;
- OnOffAuto mode;
- if (!visit_type_OnOffAuto(v, name, &mode, errp)) {
- return;
- }
-
- switch (mode) {
+ switch (value) {
case ON_OFF_AUTO_ON:
whpx->hyperv_enlightenments_allowed = true;
whpx->hyperv_enlightenments_required = true;
@@ -497,11 +491,7 @@ static void whpx_set_hyperv(Object *obj, Visitor *v,
whpx->hyperv_enlightenments_required = false;
break;
default:
- /*
- * The value was checked in visit_type_OnOffAuto() above. If
- * we get here, then something is wrong in QEMU.
- */
- abort();
+ g_assert_not_reached();
}
}
@@ -533,9 +523,9 @@ static void whpx_accel_class_init(ObjectClass *oc, const void *data)
NULL, NULL);
object_class_property_set_description(oc, "kernel-irqchip",
"Configure WHPX in-kernel irqchip");
- object_class_property_add(oc, "hyperv", "OnOffAuto", NULL,
- NULL, whpx_set_hyperv,
- NULL, NULL);
+ object_class_property_add_enum(oc, "hyperv", "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ NULL, whpx_set_hyperv);
object_class_property_set_description(oc, "hyperv",
"Configure Hyper-V enlightenments");
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 29/56] whpx: convert OnOffAuto arch properties to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (27 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 28/56] whpx: convert OnOffAuto hyperv " Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 30/56] accel/kvm: convert OnOffSplit property " Markus Armbruster
` (26 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Convert the ignore-unknown-msr, intercept-msr-gp, and ssd OnOffAuto
properties from manual visitor-based callbacks to
object_class_property_add_enum().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
target/i386/whpx/whpx-all.c | 84 ++++++++++---------------------------
1 file changed, 23 insertions(+), 61 deletions(-)
diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c
index 778da68bf4..c459138c7e 100644
--- a/target/i386/whpx/whpx-all.c
+++ b/target/i386/whpx/whpx-all.c
@@ -30,7 +30,7 @@
#include "qemu/error-report.h"
#include "qapi/error.h"
#include "qapi/qapi-types-common.h"
-#include "qapi/qapi-visit-common.h"
+#include "qapi/qapi-type-infos-common.h"
#include "migration/blocker.h"
#include "host-cpu.h"
#include "accel/accel-cpu-target.h"
@@ -1875,6 +1875,7 @@ void whpx_apply_breakpoints(
}
}
+
void whpx_arch_destroy_vcpu(CPUState *cpu)
{
X86CPU *x86cpu = X86_CPU(cpu);
@@ -1955,7 +1956,7 @@ static int whpx_handle_hyperv_guestidle(CPUState *cpu)
return whpx_handle_halt(cpu);
}
-static void whpx_vcpu_kick_out_of_hlt(CPUState *cpu)
+static void whpx_vcpu_kick_out_of_hlt(CPUState *cpu)
{
WHV_REGISTER_VALUE reg;
whpx_get_reg(cpu, WHvRegisterInternalActivityState, ®);
@@ -2059,7 +2060,7 @@ static void whpx_vcpu_pre_run(CPUState *cpu)
.Vector = irq,
};
reg_count += 1;
- /*
+ /*
* When the Hyper-V APIC is enabled, to get out of HLT we
* either have to request an interrupt or manually get it away
* from HLT.
@@ -2359,7 +2360,7 @@ int whpx_vcpu_run(CPUState *cpu)
WHV_REGISTER_VALUE reg_values[3] = {0};
WHV_REGISTER_NAME reg_names[3];
UINT32 reg_count;
- bool is_known_msr = 0;
+ bool is_known_msr = 0;
bool raises_gpf = false;
uint64_t val;
@@ -2911,118 +2912,79 @@ void whpx_cpu_instance_init(CPUState *cs)
* Partition support
*/
-static void whpx_set_unknown_msr(Object *obj, Visitor *v,
- const char *name, void *opaque,
- Error **errp)
+static void whpx_set_unknown_msr(Object *obj, int value, Error **errp)
{
struct whpx_state *whpx = &whpx_global;
- OnOffAuto mode;
- if (!visit_type_OnOffAuto(v, name, &mode, errp)) {
- return;
- }
-
- switch (mode) {
+ switch (value) {
case ON_OFF_AUTO_ON:
whpx->ignore_unknown_msr = true;
break;
-
case ON_OFF_AUTO_OFF:
whpx->ignore_unknown_msr = false;
break;
-
case ON_OFF_AUTO_AUTO:
whpx->ignore_unknown_msr = true;
break;
default:
- /*
- * The value was checked in visit_type_OnOffAuto() above. If
- * we get here, then something is wrong in QEMU.
- */
- abort();
+ g_assert_not_reached();
}
}
-static void whpx_set_intercept_msr_gp(Object *obj, Visitor *v,
- const char *name, void *opaque,
- Error **errp)
+static void whpx_set_intercept_msr_gp(Object *obj, int value, Error **errp)
{
struct whpx_state *whpx = &whpx_global;
- OnOffAuto mode;
- if (!visit_type_OnOffAuto(v, name, &mode, errp)) {
- return;
- }
-
- switch (mode) {
+ switch (value) {
case ON_OFF_AUTO_ON:
whpx->intercept_msr_gp = true;
break;
-
case ON_OFF_AUTO_OFF:
whpx->intercept_msr_gp = false;
break;
-
case ON_OFF_AUTO_AUTO:
whpx->intercept_msr_gp = false;
break;
default:
- /*
- * The value was checked in visit_type_OnOffAuto() above. If
- * we get here, then something is wrong in QEMU.
- */
- abort();
+ g_assert_not_reached();
}
}
-static void whpx_set_ssd(Object *obj, Visitor *v,
- const char *name, void *opaque,
- Error **errp)
+static void whpx_set_ssd(Object *obj, int value, Error **errp)
{
struct whpx_state *whpx = &whpx_global;
- OnOffAuto mode;
- if (!visit_type_OnOffAuto(v, name, &mode, errp)) {
- return;
- }
-
- switch (mode) {
+ switch (value) {
case ON_OFF_AUTO_ON:
whpx->separate_security_domain = true;
break;
-
case ON_OFF_AUTO_OFF:
whpx->separate_security_domain = false;
break;
-
case ON_OFF_AUTO_AUTO:
whpx->separate_security_domain = true;
break;
default:
- /*
- * The value was checked in visit_type_OnOffAuto() above. If
- * we get here, then something is wrong in QEMU.
- */
- abort();
+ g_assert_not_reached();
}
}
void whpx_arch_accel_class_init(ObjectClass *oc)
{
- object_class_property_add(oc, "ignore-unknown-msr", "OnOffAuto", NULL,
- NULL, whpx_set_unknown_msr,
- NULL, NULL);
+ object_class_property_add_enum(oc, "ignore-unknown-msr", "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ NULL, whpx_set_unknown_msr);
object_class_property_set_description(oc, "ignore-unknown-msr",
"Configure unknown MSR behavior");
- object_class_property_add(oc, "intercept-msr-gp", "OnOffAuto", NULL,
- NULL, whpx_set_intercept_msr_gp,
- NULL, NULL);
+ object_class_property_add_enum(oc, "intercept-msr-gp", "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ NULL, whpx_set_intercept_msr_gp);
object_class_property_set_description(oc, "intercept-msr-gp",
"Intercept #GP to log erroring MSR accesses.");
- object_class_property_add(oc, "ssd", "OnOffAuto", NULL,
- NULL, whpx_set_ssd,
- NULL, NULL);
+ object_class_property_add_enum(oc, "ssd", "OnOffAuto",
+ &OnOffAuto_type_info, NULL,
+ NULL, whpx_set_ssd);
object_class_property_set_description(oc, "ssd",
"Separate security domain");
}
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 30/56] accel/kvm: convert OnOffSplit property to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (28 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 29/56] whpx: convert OnOffAuto arch properties " Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 31/56] whpx: " Markus Armbruster
` (25 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Convert the OnOffSplit property from manual visitor-based
callbacks to object_class_property_add_enum().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
accel/kvm/kvm-all.c | 21 +++++++--------------
1 file changed, 7 insertions(+), 14 deletions(-)
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index 9cc1e4b0a9..fe11cd92b4 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -46,6 +46,7 @@
#include "qapi/visitor.h"
#include "qapi/qapi-types-common.h"
#include "qapi/qapi-visit-common.h"
+#include "qapi/qapi-type-infos-common.h"
#include "system/reset.h"
#include "qemu/guest-random.h"
#include "system/hw_accel.h"
@@ -4151,22 +4152,17 @@ static void kvm_set_kvm_shadow_mem(Object *obj, Visitor *v,
s->kvm_shadow_mem = value;
}
-static void kvm_set_kernel_irqchip(Object *obj, Visitor *v,
- const char *name, void *opaque,
+static void kvm_set_kernel_irqchip(Object *obj, int value,
Error **errp)
{
KVMState *s = KVM_STATE(obj);
- OnOffSplit mode;
if (s->fd != -1) {
error_setg(errp, "Cannot set properties after the accelerator has been initialized");
return;
}
- if (!visit_type_OnOffSplit(v, name, &mode, errp)) {
- return;
- }
- switch (mode) {
+ switch (value) {
case ON_OFF_SPLIT_ON:
s->kernel_irqchip_allowed = true;
s->kernel_irqchip_required = true;
@@ -4183,10 +4179,7 @@ static void kvm_set_kernel_irqchip(Object *obj, Visitor *v,
s->kernel_irqchip_split = ON_OFF_AUTO_ON;
break;
default:
- /* The value was checked in visit_type_OnOffSplit() above. If
- * we get here, then something is wrong in QEMU.
- */
- abort();
+ g_assert_not_reached();
}
}
@@ -4303,9 +4296,9 @@ static void kvm_accel_class_init(ObjectClass *oc, const void *data)
ac->has_memory = kvm_accel_has_memory;
ac->allowed = &kvm_allowed;
- object_class_property_add(oc, "kernel-irqchip", "on|off|split", NULL,
- NULL, kvm_set_kernel_irqchip,
- NULL, NULL);
+ object_class_property_add_enum(oc, "kernel-irqchip", "on|off|split",
+ &OnOffSplit_type_info, NULL,
+ NULL, kvm_set_kernel_irqchip);
object_class_property_set_description(oc, "kernel-irqchip",
"Configure KVM in-kernel irqchip");
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 31/56] whpx: convert OnOffSplit property to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (29 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 30/56] accel/kvm: convert OnOffSplit property " Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 32/56] ppc/spapr-caps: convert to QAPI-aware property registration Markus Armbruster
` (24 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Convert the OnOffSplit property from manual visitor-based
callbacks to object_class_property_add_enum().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
accel/whpx/whpx-common.c | 24 +++++++-----------------
1 file changed, 7 insertions(+), 17 deletions(-)
diff --git a/accel/whpx/whpx-common.c b/accel/whpx/whpx-common.c
index 3447c52fb1..068258bf6c 100644
--- a/accel/whpx/whpx-common.c
+++ b/accel/whpx/whpx-common.c
@@ -434,18 +434,12 @@ error:
return false;
}
-static void whpx_set_kernel_irqchip(Object *obj, Visitor *v,
- const char *name, void *opaque,
- Error **errp)
+static void whpx_set_kernel_irqchip(Object *obj, int value,
+ Error **errp)
{
struct whpx_state *whpx = &whpx_global;
- OnOffSplit mode;
- if (!visit_type_OnOffSplit(v, name, &mode, errp)) {
- return;
- }
-
- switch (mode) {
+ switch (value) {
case ON_OFF_SPLIT_ON:
whpx->kernel_irqchip_allowed = true;
whpx->kernel_irqchip_required = true;
@@ -463,11 +457,7 @@ static void whpx_set_kernel_irqchip(Object *obj, Visitor *v,
break;
default:
- /*
- * The value was checked in visit_type_OnOffSplit() above. If
- * we get here, then something is wrong in QEMU.
- */
- abort();
+ g_assert_not_reached();
}
}
@@ -518,9 +508,9 @@ static void whpx_accel_class_init(ObjectClass *oc, const void *data)
ac->pre_resume_vm = whpx_pre_resume_vm;
ac->allowed = &whpx_allowed;
- object_class_property_add(oc, "kernel-irqchip", "on|off|split", NULL,
- NULL, whpx_set_kernel_irqchip,
- NULL, NULL);
+ object_class_property_add_enum(oc, "kernel-irqchip", "on|off|split",
+ &OnOffSplit_type_info, NULL,
+ NULL, whpx_set_kernel_irqchip);
object_class_property_set_description(oc, "kernel-irqchip",
"Configure WHPX in-kernel irqchip");
object_class_property_add_enum(oc, "hyperv", "OnOffAuto",
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 32/56] ppc/spapr-caps: convert to QAPI-aware property registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (30 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 31/56] whpx: " Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 33/56] net/colo-compare: fix compare_timeout setter visitor type Markus Armbruster
` (23 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange, Amit Machhiwal
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Add QAPITypeInfo to SpaprCapabilityInfo, and make
spapr_caps_add_properties() pass it to object_class_property_add().
Reviewed-by: Amit Machhiwal <amachhiw@linux.ibm.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/ppc/spapr_caps.c | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
index b8c48bca8a..79b1cc2e1d 100644
--- a/hw/ppc/spapr_caps.c
+++ b/hw/ppc/spapr_caps.c
@@ -24,6 +24,7 @@
#include "qemu/osdep.h"
#include "qemu/error-report.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/error.h"
#include "qapi/visitor.h"
#include "system/hw_accel.h"
@@ -60,6 +61,7 @@ typedef struct SpaprCapabilityInfo {
ObjectPropertyAccessor *get;
ObjectPropertyAccessor *set;
const char *type;
+ const QAPITypeInfo *qapi_type;
/* Possible values if this is a custom string type */
SpaprCapPossible *possible;
/* Make sure the virtual hardware can support this capability */
@@ -726,6 +728,7 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
.get = spapr_cap_get_bool,
.set = spapr_cap_set_bool,
.type = "bool",
+ .qapi_type = &bool_type_info,
.apply = cap_htm_apply,
},
[SPAPR_CAP_VSX] = {
@@ -735,6 +738,7 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
.get = spapr_cap_get_bool,
.set = spapr_cap_set_bool,
.type = "bool",
+ .qapi_type = &bool_type_info,
.apply = cap_vsx_apply,
},
[SPAPR_CAP_DFP] = {
@@ -744,6 +748,7 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
.get = spapr_cap_get_bool,
.set = spapr_cap_set_bool,
.type = "bool",
+ .qapi_type = &bool_type_info,
.apply = cap_dfp_apply,
},
[SPAPR_CAP_CFPC] = {
@@ -753,6 +758,7 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
.get = spapr_cap_get_string,
.set = spapr_cap_set_string,
.type = "string",
+ .qapi_type = &str_type_info,
.possible = &cap_cfpc_possible,
.apply = cap_safe_cache_apply,
},
@@ -763,6 +769,7 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
.get = spapr_cap_get_string,
.set = spapr_cap_set_string,
.type = "string",
+ .qapi_type = &str_type_info,
.possible = &cap_sbbc_possible,
.apply = cap_safe_bounds_check_apply,
},
@@ -775,6 +782,7 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
.get = spapr_cap_get_string,
.set = spapr_cap_set_string,
.type = "string",
+ .qapi_type = &str_type_info,
.possible = &cap_ibs_possible,
.apply = cap_safe_indirect_branch_apply,
},
@@ -785,6 +793,7 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
.get = spapr_cap_get_pagesize,
.set = spapr_cap_set_pagesize,
.type = "int",
+ .qapi_type = &size_type_info,
.apply = cap_hpt_maxpagesize_apply,
.cpu_apply = cap_hpt_maxpagesize_cpu_apply,
},
@@ -795,6 +804,7 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
.get = spapr_cap_get_bool,
.set = spapr_cap_set_bool,
.type = "bool",
+ .qapi_type = &bool_type_info,
.apply = cap_nested_kvm_hv_apply,
},
[SPAPR_CAP_NESTED_PAPR] = {
@@ -804,6 +814,7 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
.get = spapr_cap_get_bool,
.set = spapr_cap_set_bool,
.type = "bool",
+ .qapi_type = &bool_type_info,
.apply = cap_nested_papr_apply,
},
[SPAPR_CAP_LARGE_DECREMENTER] = {
@@ -813,6 +824,7 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
.get = spapr_cap_get_bool,
.set = spapr_cap_set_bool,
.type = "bool",
+ .qapi_type = &bool_type_info,
.apply = cap_large_decr_apply,
.cpu_apply = cap_large_decr_cpu_apply,
},
@@ -823,6 +835,7 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
.get = spapr_cap_get_bool,
.set = spapr_cap_set_bool,
.type = "bool",
+ .qapi_type = &bool_type_info,
.apply = cap_ccf_assist_apply,
},
[SPAPR_CAP_FWNMI] = {
@@ -832,6 +845,7 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
.get = spapr_cap_get_bool,
.set = spapr_cap_set_bool,
.type = "bool",
+ .qapi_type = &bool_type_info,
.apply = cap_fwnmi_apply,
},
[SPAPR_CAP_RPT_INVALIDATE] = {
@@ -841,6 +855,7 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
.get = spapr_cap_get_bool,
.set = spapr_cap_set_bool,
.type = "bool",
+ .qapi_type = &bool_type_info,
.apply = cap_rpt_invalidate_apply,
},
[SPAPR_CAP_AIL_MODE_3] = {
@@ -850,6 +865,7 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
.get = spapr_cap_get_bool,
.set = spapr_cap_set_bool,
.type = "bool",
+ .qapi_type = &bool_type_info,
.apply = cap_ail_mode_3_apply,
},
[SPAPR_CAP_DAWR1] = {
@@ -859,6 +875,7 @@ SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
.get = spapr_cap_get_bool,
.set = spapr_cap_set_bool,
.type = "bool",
+ .qapi_type = &bool_type_info,
.apply = cap_dawr1_apply,
},
};
@@ -1069,7 +1086,7 @@ void spapr_caps_add_properties(SpaprMachineClass *smc)
g_autofree char *name = g_strdup_printf("cap-%s", cap->name);
g_autofree char *desc = g_strdup(cap->description);
- object_class_property_add(klass, name, cap->type, NULL,
+ object_class_property_add(klass, name, cap->type, cap->qapi_type,
cap->get, cap->set,
NULL, cap);
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 33/56] net/colo-compare: fix compare_timeout setter visitor type
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (31 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 32/56] ppc/spapr-caps: convert to QAPI-aware property registration Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 34/56] net/colo-compare: fix max_queue_size " Markus Armbruster
` (22 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
The setter was using visit_type_uint32, truncating the value, while the
getter and typename use uint64. Use visit_type_uint64 consistently.
Fixes: 0c4266ef2690 ("net/colo-compare.c: Fix compare_timeout format issue")
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
net/colo-compare.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/net/colo-compare.c b/net/colo-compare.c
index 7d4a2db522..a9c6cca5e1 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -1075,9 +1075,9 @@ static void compare_set_timeout(Object *obj, Visitor *v,
Error **errp)
{
CompareState *s = COLO_COMPARE(obj);
- uint32_t value;
+ uint64_t value;
- if (!visit_type_uint32(v, name, &value, errp)) {
+ if (!visit_type_uint64(v, name, &value, errp)) {
return;
}
if (!value) {
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 34/56] net/colo-compare: fix max_queue_size setter visitor type
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (32 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 33/56] net/colo-compare: fix compare_timeout setter visitor type Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 35/56] hw/misc/xlnx-versal-trng: add missing getter for fips-fault-events Markus Armbruster
` (21 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
The setter was using visit_type_uint64, accepting values wider than
the uint32_t field. Use visit_type_uint32 to match the getter, field,
and typename.
Fixes: 0c4266ef2690 ("net/colo-compare.c: Fix compare_timeout format issue")
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
net/colo-compare.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/net/colo-compare.c b/net/colo-compare.c
index a9c6cca5e1..6bc43e0696 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -1129,9 +1129,9 @@ static void set_max_queue_size(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
{
- uint64_t value;
+ uint32_t value;
- if (!visit_type_uint64(v, name, &value, errp)) {
+ if (!visit_type_uint32(v, name, &value, errp)) {
return;
}
if (!value) {
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 35/56] hw/misc/xlnx-versal-trng: add missing getter for fips-fault-events
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (33 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 34/56] net/colo-compare: fix max_queue_size " Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 36/56] qom: convert scalar properties to QAPI-aware registration Markus Armbruster
` (20 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/misc/xlnx-versal-trng.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/hw/misc/xlnx-versal-trng.c b/hw/misc/xlnx-versal-trng.c
index aa1d65de7b..0584ee089e 100644
--- a/hw/misc/xlnx-versal-trng.c
+++ b/hw/misc/xlnx-versal-trng.c
@@ -650,10 +650,22 @@ static void trng_prop_fault_event_set(Object *obj, Visitor *v,
trng_fault_event_set(XLNX_VERSAL_TRNG(obj), *events);
}
+static void trng_prop_fault_event_get(Object *obj, Visitor *v,
+ const char *name,
+ void *opaque,
+ Error **errp)
+{
+ const Property *prop = opaque;
+ uint32_t *events = object_field_prop_ptr(obj, prop);
+
+ visit_type_uint32(v, name, events, errp);
+}
+
static const PropertyInfo trng_prop_fault_events = {
.type = "uint32",
.description = "Set to trigger TRNG fault events",
.set = trng_prop_fault_event_set,
+ .get = trng_prop_fault_event_get,
.realized_set_allowed = true,
};
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 36/56] qom: convert scalar properties to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (34 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 35/56] hw/misc/xlnx-versal-trng: add missing getter for fips-fault-events Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 37/56] i386/cpu: convert strList property " Markus Armbruster
` (19 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange, Amit Machhiwal
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Pass appropriate QAPITypeInfo to object_class_property_add() and
object_property_add().
Reviewed-by: Amit Machhiwal <amachhiw@linux.ibm.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
accel/kvm/kvm-all.c | 9 ++++----
accel/nitro/nitro-accel.c | 4 +++-
accel/tcg/tcg-all.c | 3 ++-
backends/cryptodev.c | 7 +++---
backends/hostmem-file.c | 4 ++--
backends/hostmem-memfd.c | 4 +++-
backends/hostmem.c | 7 +++---
block/throttle-groups.c | 4 +++-
crypto/secret_keyring.c | 9 ++++----
event-loop-base.c | 10 +++++---
hw/acpi/ich9.c | 4 +++-
hw/acpi/pci.c | 5 ++--
hw/arm/virt.c | 18 ++++++++-------
hw/core/clock.c | 4 +++-
hw/core/machine.c | 2 +-
hw/cpu/core.c | 5 ++--
hw/cxl/cxl-host.c | 2 +-
hw/gpio/aspeed_gpio.c | 7 ++++--
hw/gpio/aspeed_sgpio.c | 4 +++-
hw/gpio/stm32l4x5_gpio.c | 5 ++--
hw/hexagon/hexagon_dsp.c | 4 +++-
hw/i386/pc.c | 9 +++++---
hw/i386/sgx-epc.c | 4 +++-
hw/i386/x86.c | 6 ++---
hw/ide/ide-dev.c | 3 ++-
hw/intc/apic_common.c | 3 ++-
hw/loongarch/virt.c | 8 +++----
hw/mem/nvdimm.c | 3 ++-
hw/mem/pc-dimm.c | 3 ++-
hw/misc/aspeed_lpc.c | 25 ++++++++++----------
hw/misc/aspeed_sdmc.c | 3 ++-
hw/misc/npcm7xx_mft.c | 3 ++-
hw/net/ne2000-isa.c | 3 ++-
hw/nvme/ctrl.c | 4 +++-
hw/pci-bridge/pci_expander_bridge.c | 3 ++-
hw/pci-host/i440fx.c | 9 ++++----
hw/pci-host/pnv_phb3.c | 5 ++--
hw/pci-host/pnv_phb4.c | 5 ++--
hw/pci-host/q35.c | 13 +++++++----
hw/ppc/spapr_drc.c | 5 ++--
hw/remote/vfio-user-obj.c | 4 ++--
hw/riscv/microchip_pfsoc.c | 3 ++-
hw/s390x/sclpcpi.c | 6 +++--
hw/s390x/virtio-ccw-mem.c | 4 +++-
hw/sensor/adc128d818.c | 8 ++++---
hw/sensor/adm1266.c | 3 ++-
hw/sensor/adm1272.c | 9 ++++----
hw/sensor/emc141x.c | 9 ++++----
hw/sensor/isl_pmbus_vr.c | 19 +++++++--------
hw/sensor/lsm303dlhc_mag.c | 9 ++++----
hw/sensor/max34451.c | 5 ++--
hw/sensor/tmp105.c | 3 ++-
hw/sensor/tmp421.c | 9 ++++----
hw/usb/dev-storage-classic.c | 3 ++-
hw/virtio/virtio-balloon.c | 4 +++-
hw/virtio/virtio-mem-pci.c | 4 +++-
hw/virtio/virtio-mem.c | 10 +++++---
hw/xen/xen-pvh-common.c | 13 +++++++----
iothread.c | 9 ++++----
net/colo-compare.c | 7 +++---
net/dump.c | 3 ++-
net/filter-buffer.c | 3 ++-
qom/object.c | 36 ++++++++++++++---------------
system/bootdevice.c | 3 ++-
system/memory.c | 5 ++--
target/arm/cpu64.c | 16 +++++++++----
target/arm/kvm.c | 3 ++-
target/arm/tcg/cpu64.c | 6 +++--
target/i386/cpu.c | 13 ++++++-----
target/i386/kvm/kvm.c | 10 ++++----
target/i386/sev.c | 7 +++---
target/ppc/compat.c | 3 ++-
target/riscv/cpu.c | 19 ++++++++++-----
target/riscv/kvm/kvm-cpu.c | 7 +++---
target/riscv/tcg/tcg-cpu.c | 7 +++---
target/s390x/cpu_models.c | 6 +++--
tests/unit/test-qdev-global-props.c | 9 ++++----
ui/console.c | 3 ++-
util/thread-context.c | 10 +++++---
79 files changed, 335 insertions(+), 213 deletions(-)
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index fe11cd92b4..dcb1db139d 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -24,6 +24,7 @@
#include "qemu/config-file.h"
#include "qemu/error-report.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "hw/pci/msi.h"
#include "hw/pci/msix.h"
#include "hw/s390x/adapter.h"
@@ -4302,15 +4303,15 @@ static void kvm_accel_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, "kernel-irqchip",
"Configure KVM in-kernel irqchip");
- object_class_property_add(oc, "kvm-shadow-mem", "int", NULL,
+ object_class_property_add(oc, "kvm-shadow-mem", "int", &int_type_info,
kvm_get_kvm_shadow_mem, kvm_set_kvm_shadow_mem,
NULL, NULL);
object_class_property_set_description(oc, "kvm-shadow-mem",
"KVM shadow MMU size");
- object_class_property_add(oc, "dirty-ring-size", "uint32", NULL,
- kvm_get_dirty_ring_size,
- kvm_set_dirty_ring_size,
+ object_class_property_add(oc, "dirty-ring-size", "uint32",
+ &uint32_type_info,
+ kvm_get_dirty_ring_size, kvm_set_dirty_ring_size,
NULL, NULL);
object_class_property_set_description(oc, "dirty-ring-size",
"Size of KVM dirty page ring buffer (default: 0, i.e. use bitmap)");
diff --git a/accel/nitro/nitro-accel.c b/accel/nitro/nitro-accel.c
index 597027438c..9c07483be3 100644
--- a/accel/nitro/nitro-accel.c
+++ b/accel/nitro/nitro-accel.c
@@ -29,6 +29,7 @@
#include "qemu/osdep.h"
#include "qemu/error-report.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qemu/module.h"
#include "qemu/rcu.h"
@@ -238,7 +239,8 @@ static void nitro_accel_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, "debug-mode",
"Start enclave in debug mode (enables console output)");
- object_class_property_add(oc, "enclave-cid", "uint64", NULL,
+ object_class_property_add(oc, "enclave-cid", "uint64",
+ &uint64_type_info,
nitro_get_enclave_cid,
nitro_set_enclave_cid,
NULL, NULL);
diff --git a/accel/tcg/tcg-all.c b/accel/tcg/tcg-all.c
index ed314e01cb..bbc733a707 100644
--- a/accel/tcg/tcg-all.c
+++ b/accel/tcg/tcg-all.c
@@ -29,6 +29,7 @@
#include "exec/icount.h"
#include "tcg/startup.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qemu/error-report.h"
#include "qemu/accel.h"
#include "qemu/atomic.h"
@@ -270,7 +271,7 @@ static void tcg_accel_class_init(ObjectClass *oc, const void *data)
tcg_get_thread,
tcg_set_thread);
- object_class_property_add(oc, "tb-size", "uint32", NULL,
+ object_class_property_add(oc, "tb-size", "uint32", &uint32_type_info,
tcg_get_tb_size, tcg_set_tb_size,
NULL, NULL);
object_class_property_set_description(oc, "tb-size",
diff --git a/backends/cryptodev.c b/backends/cryptodev.c
index cc323014cc..46059faa26 100644
--- a/backends/cryptodev.c
+++ b/backends/cryptodev.c
@@ -25,6 +25,7 @@
#include "system/cryptodev.h"
#include "system/stats.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/qapi-commands-cryptodev.h"
#include "qapi/qapi-types-stats.h"
#include "qapi/visitor.h"
@@ -622,15 +623,15 @@ cryptodev_backend_class_init(ObjectClass *oc, const void *data)
ucc->prepare_delete = cryptodev_backend_prepare_delete;
QTAILQ_INIT(&crypto_clients);
- object_class_property_add(oc, "queues", "uint32", NULL,
+ object_class_property_add(oc, "queues", "uint32", &uint32_type_info,
cryptodev_backend_get_queues,
cryptodev_backend_set_queues,
NULL, NULL);
- object_class_property_add(oc, "throttle-bps", "uint64", NULL,
+ object_class_property_add(oc, "throttle-bps", "uint64", &uint64_type_info,
cryptodev_backend_get_bps,
cryptodev_backend_set_bps,
NULL, NULL);
- object_class_property_add(oc, "throttle-ops", "uint64", NULL,
+ object_class_property_add(oc, "throttle-ops", "uint64", &uint64_type_info,
cryptodev_backend_get_ops,
cryptodev_backend_set_ops,
NULL, NULL);
diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
index 15b5fee246..2f65ca3678 100644
--- a/backends/hostmem-file.c
+++ b/backends/hostmem-file.c
@@ -275,11 +275,11 @@ file_backend_class_init(ObjectClass *oc, const void *data)
file_memory_backend_get_discard_data, file_memory_backend_set_discard_data);
object_class_property_add_str(oc, "mem-path",
get_mem_path, set_mem_path);
- object_class_property_add(oc, "align", "uint64", NULL,
+ object_class_property_add(oc, "align", "uint64", &uint64_type_info,
file_memory_backend_get_align,
file_memory_backend_set_align,
NULL, NULL);
- object_class_property_add(oc, "offset", "int", NULL,
+ object_class_property_add(oc, "offset", "int", &int_type_info,
file_memory_backend_get_offset,
file_memory_backend_set_offset,
NULL, NULL);
diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c
index 4e1b23a1d6..19a9a5b409 100644
--- a/backends/hostmem-memfd.c
+++ b/backends/hostmem-memfd.c
@@ -16,6 +16,7 @@
#include "qemu/memfd.h"
#include "qemu/module.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qom/object.h"
#include "migration/cpr.h"
#include "system/kvm.h"
@@ -191,7 +192,8 @@ memfd_backend_class_init(ObjectClass *oc, const void *data)
memfd_backend_set_hugetlb);
object_class_property_set_description(oc, "hugetlb",
"Use huge pages");
- object_class_property_add(oc, "hugetlbsize", "uint64", NULL,
+ object_class_property_add(oc, "hugetlbsize", "uint64",
+ &uint64_type_info,
memfd_backend_get_hugetlbsize,
memfd_backend_set_hugetlbsize,
NULL, NULL);
diff --git a/backends/hostmem.c b/backends/hostmem.c
index b43d6ca956..0f39f4d1b7 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -529,7 +529,7 @@ host_memory_backend_class_init(ObjectClass *oc, const void *data)
host_memory_backend_set_prealloc);
object_class_property_set_description(oc, "prealloc",
"Preallocate memory");
- object_class_property_add(oc, "prealloc-threads", "int", NULL,
+ object_class_property_add(oc, "prealloc-threads", "int", &int_type_info,
host_memory_backend_get_prealloc_threads,
host_memory_backend_set_prealloc_threads,
NULL, NULL);
@@ -540,13 +540,14 @@ host_memory_backend_class_init(ObjectClass *oc, const void *data)
object_property_allow_set_link, OBJ_PROP_LINK_STRONG);
object_class_property_set_description(oc, "prealloc-context",
"Context to use for creating CPU threads for preallocation");
- object_class_property_add(oc, "size", "size", NULL,
+ object_class_property_add(oc, "size", "size", &size_type_info,
host_memory_backend_get_size,
host_memory_backend_set_size,
NULL, NULL);
object_class_property_set_description(oc, "size",
"Size of the memory region (ex: 500M)");
- object_class_property_add(oc, "host-nodes", "[uint16]", NULL,
+ object_class_property_add(oc, "host-nodes", "[uint16]",
+ &uint16List_type_info,
host_memory_backend_get_host_nodes,
host_memory_backend_set_host_nodes,
NULL, NULL);
diff --git a/block/throttle-groups.c b/block/throttle-groups.c
index 5d6b089092..40a49e6233 100644
--- a/block/throttle-groups.c
+++ b/block/throttle-groups.c
@@ -31,6 +31,7 @@
#include "qemu/thread.h"
#include "system/qtest.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/qapi-type-infos-block-core.h"
#include "qapi/qapi-visit-block-core.h"
#include "qom/object.h"
@@ -985,7 +986,8 @@ static void throttle_group_obj_class_init(ObjectClass *klass,
/* individual properties */
for (i = 0; i < sizeof(properties) / sizeof(ThrottleParamInfo); i++) {
- object_class_property_add(klass, properties[i].name, "int64", NULL,
+ object_class_property_add(klass, properties[i].name, "int64",
+ &int64_type_info,
throttle_group_get,
throttle_group_set,
NULL, &properties[i]);
diff --git a/crypto/secret_keyring.c b/crypto/secret_keyring.c
index e9cb222bf8..aa9c45f141 100644
--- a/crypto/secret_keyring.c
+++ b/crypto/secret_keyring.c
@@ -21,6 +21,7 @@
#include "qemu/osdep.h"
#include <asm/unistd.h>
#include <linux/keyctl.h>
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/error.h"
#include "qom/object_interfaces.h"
#include "trace.h"
@@ -107,10 +108,10 @@ qcrypto_secret_keyring_class_init(ObjectClass *oc, const void *data)
QCryptoSecretCommonClass *sic = QCRYPTO_SECRET_COMMON_CLASS(oc);
sic->load_data = qcrypto_secret_keyring_load_data;
- object_class_property_add(oc, "serial", "int32_t", NULL,
- qcrypto_secret_prop_get_key,
- qcrypto_secret_prop_set_key,
- NULL, NULL);
+ object_class_property_add(oc, "serial", "int32_t", &int32_type_info,
+ qcrypto_secret_prop_get_key,
+ qcrypto_secret_prop_set_key,
+ NULL, NULL);
}
diff --git a/event-loop-base.c b/event-loop-base.c
index 42bf09d58b..e4a57c6190 100644
--- a/event-loop-base.c
+++ b/event-loop-base.c
@@ -14,6 +14,7 @@
#include "qemu/osdep.h"
#include "qom/object_interfaces.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "block/thread-pool.h"
#include "system/event-loop-base.h"
@@ -104,15 +105,18 @@ static void event_loop_base_class_init(ObjectClass *klass,
ucc->complete = event_loop_base_complete;
ucc->prepare_delete = event_loop_base_prepare_delete;
- object_class_property_add(klass, "aio-max-batch", "int64", NULL,
+ object_class_property_add(klass, "aio-max-batch", "int64",
+ &int64_type_info,
event_loop_base_get_param,
event_loop_base_set_param,
NULL, &aio_max_batch_info);
- object_class_property_add(klass, "thread-pool-min", "int64", NULL,
+ object_class_property_add(klass, "thread-pool-min", "int64",
+ &int64_type_info,
event_loop_base_get_param,
event_loop_base_set_param,
NULL, &thread_pool_min_info);
- object_class_property_add(klass, "thread-pool-max", "int64", NULL,
+ object_class_property_add(klass, "thread-pool-max", "int64",
+ &int64_type_info,
event_loop_base_get_param,
event_loop_base_set_param,
NULL, &thread_pool_max_info);
diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c
index f3e248c8da..91a22a8e94 100644
--- a/hw/acpi/ich9.c
+++ b/hw/acpi/ich9.c
@@ -26,6 +26,7 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "hw/pci/pci.h"
#include "migration/vmstate.h"
@@ -379,7 +380,8 @@ void ich9_pm_add_class_properties(ObjectClass *oc, ptrdiff_t pm_offset)
PM_REG_FIELD(acpi_pci_hotplug.root),
object_property_allow_set_link,
OBJ_PROP_LINK_STRONG);
- object_class_property_add(oc, ACPI_PM_PROP_GPE0_BLK, "uint32", NULL,
+ object_class_property_add(oc, ACPI_PM_PROP_GPE0_BLK, "uint32",
+ &uint32_type_info,
ich9_pm_get_gpe0_blk,
NULL, NULL, NULL);
object_class_property_add_uint8_ptr(oc, ACPI_PM_PROP_S3_DISABLED,
diff --git a/hw/acpi/pci.c b/hw/acpi/pci.c
index abd1071f49..d393638d2e 100644
--- a/hw/acpi/pci.c
+++ b/hw/acpi/pci.c
@@ -27,6 +27,7 @@
#include "qemu/error-report.h"
#include "qom/object_interfaces.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "hw/core/boards.h"
#include "hw/acpi/aml-build.h"
#include "hw/acpi/pci.h"
@@ -139,7 +140,7 @@ static void acpi_generic_initiator_class_init(ObjectClass *oc, const void *data)
acpi_generic_initiator_set_pci_device);
object_class_property_set_description(oc, "pci-dev",
"PCI device to associate with the node");
- object_class_property_add(oc, "node", "uint32", NULL, NULL,
+ object_class_property_add(oc, "node", "uint32", &uint32_type_info, NULL,
acpi_generic_initiator_set_node, NULL, NULL);
object_class_property_set_description(oc, "node",
"NUMA node associated with the PCI device");
@@ -253,7 +254,7 @@ static void acpi_generic_port_class_init(ObjectClass *oc, const void *data)
acpi_generic_port_set_pci_bus);
object_class_property_set_description(oc, "pci-bus",
"PCI Bus of the host bridge associated with this GP affinity structure");
- object_class_property_add(oc, "node", "uint32", NULL, NULL,
+ object_class_property_add(oc, "node", "uint32", &uint32_type_info, NULL,
acpi_generic_port_set_node, NULL, NULL);
object_class_property_set_description(oc, "node",
"The NUMA node like ID to index HMAT/SLIT NUMA properties involving GP");
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index e39d77eba6..2f03679afd 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -4254,18 +4254,20 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
"Set on/off to enable/disable high "
"memory region for PCI MMIO");
- object_class_property_add(oc, "highmem-mmio-size", "size", NULL,
- virt_get_highmem_mmio_size,
- virt_set_highmem_mmio_size,
- NULL, NULL);
+ object_class_property_add(oc, "highmem-mmio-size", "size",
+ &size_type_info,
+ virt_get_highmem_mmio_size,
+ virt_set_highmem_mmio_size,
+ NULL, NULL);
object_class_property_set_description(oc, "highmem-mmio-size",
"Set the high memory region size "
"for PCI MMIO");
- object_class_property_add(oc, "virtio-mmio-transports", "uint8", NULL,
- virt_get_virtio_transports,
- virt_set_virtio_transports,
- NULL, NULL);
+ object_class_property_add(oc, "virtio-mmio-transports", "uint8",
+ &uint8_type_info,
+ virt_get_virtio_transports,
+ virt_set_virtio_transports,
+ NULL, NULL);
object_class_property_set_description(oc, "virtio-mmio-transports",
"Set the number of virtio-mmio transports to instantiate");
diff --git a/hw/core/clock.c b/hw/core/clock.c
index d46c888f5c..f927354923 100644
--- a/hw/core/clock.c
+++ b/hw/core/clock.c
@@ -13,6 +13,7 @@
#include "qemu/osdep.h"
#include "qemu/cutils.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "system/qtest.h"
#include "hw/core/clock.h"
@@ -185,7 +186,8 @@ static void clock_initfn(Object *obj)
QLIST_INIT(&clk->children);
if (qtest_enabled()) {
- object_property_add(obj, "qtest-clock-period", "uint64", NULL,
+ object_property_add(obj, "qtest-clock-period", "uint64",
+ &uint64_type_info,
clock_period_prop_get, NULL, NULL, NULL);
}
}
diff --git a/hw/core/machine.c b/hw/core/machine.c
index bc03a62883..0574e4326f 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -1140,7 +1140,7 @@ static void machine_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, "smp-cache",
"Cache properties list for SMP machine");
- object_class_property_add(oc, "phandle-start", "int", NULL,
+ object_class_property_add(oc, "phandle-start", "int", &int_type_info,
machine_get_phandle_start,
machine_set_phandle_start,
NULL, NULL);
diff --git a/hw/cpu/core.c b/hw/cpu/core.c
index f430befad8..5fae05ae37 100644
--- a/hw/cpu/core.c
+++ b/hw/cpu/core.c
@@ -12,6 +12,7 @@
#include "hw/core/boards.h"
#include "hw/cpu/core.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
static void core_prop_get_core_id(Object *obj, Visitor *v, const char *name,
@@ -82,10 +83,10 @@ static void cpu_core_class_init(ObjectClass *oc, const void *data)
DeviceClass *dc = DEVICE_CLASS(oc);
set_bit(DEVICE_CATEGORY_CPU, dc->categories);
- object_class_property_add(oc, "core-id", "int", NULL,
+ object_class_property_add(oc, "core-id", "int", &int_type_info,
core_prop_get_core_id,
core_prop_set_core_id, NULL, NULL);
- object_class_property_add(oc, "nr-threads", "int", NULL,
+ object_class_property_add(oc, "nr-threads", "int", &int_type_info,
core_prop_get_nr_threads,
core_prop_set_nr_threads, NULL, NULL);
}
diff --git a/hw/cxl/cxl-host.c b/hw/cxl/cxl-host.c
index ef7f766847..3bafda0904 100644
--- a/hw/cxl/cxl-host.c
+++ b/hw/cxl/cxl-host.c
@@ -611,7 +611,7 @@ static void machine_set_cfmw(Object *obj, Visitor *v, const char *name,
void cxl_machine_init(Object *obj, CXLState *state)
{
- object_property_add(obj, "cxl", "bool", NULL, machine_get_cxl,
+ object_property_add(obj, "cxl", "bool", &bool_type_info, machine_get_cxl,
machine_set_cxl, NULL, state);
object_property_set_description(obj, "cxl",
"Set on/off to enable/disable "
diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
index 4463cf7c9f..f95fe0d82a 100644
--- a/hw/gpio/aspeed_gpio.c
+++ b/hw/gpio/aspeed_gpio.c
@@ -12,6 +12,7 @@
#include "hw/gpio/aspeed_gpio.h"
#include "hw/misc/aspeed_scu.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "hw/core/irq.h"
#include "migration/vmstate.h"
@@ -1481,7 +1482,8 @@ static void aspeed_gpio_init(Object *obj)
int pin_idx = j % GPIOS_PER_GROUP;
const char *group = &props->group_label[group_idx][0];
char *name = g_strdup_printf("gpio%s%d", group, pin_idx);
- object_property_add(obj, name, "bool", NULL, aspeed_gpio_get_pin,
+ object_property_add(obj, name, "bool", &bool_type_info,
+ aspeed_gpio_get_pin,
aspeed_gpio_set_pin, NULL, NULL);
g_free(name);
}
@@ -1489,7 +1491,8 @@ static void aspeed_gpio_init(Object *obj)
for (int i = 0; i < agc->nr_gpio_sets; i++) {
g_autofree char *name = g_strdup_printf("gpio-set[%d]", i);
- object_property_add(obj, name, "uint32", NULL, aspeed_gpio_get_set,
+ object_property_add(obj, name, "uint32", &uint32_type_info,
+ aspeed_gpio_get_set,
aspeed_gpio_set_set, NULL, NULL);
}
}
diff --git a/hw/gpio/aspeed_sgpio.c b/hw/gpio/aspeed_sgpio.c
index aeaef4f102..6263d126ee 100644
--- a/hw/gpio/aspeed_sgpio.c
+++ b/hw/gpio/aspeed_sgpio.c
@@ -11,6 +11,7 @@
#include "qemu/log.h"
#include "qemu/error-report.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "hw/core/irq.h"
#include "hw/core/qdev-properties.h"
@@ -300,7 +301,8 @@ static void aspeed_sgpio_init(Object *obj)
{
for (int i = 0; i < ASPEED_SGPIO_MAX_PIN_PAIR * 2; i++) {
g_autofree char *name = g_strdup_printf("sgpio%03d", i);
- object_property_add(obj, name, "bool", NULL, aspeed_sgpio_get_pin,
+ object_property_add(obj, name, "bool", &bool_type_info,
+ aspeed_sgpio_get_pin,
aspeed_sgpio_set_pin, NULL, NULL);
}
}
diff --git a/hw/gpio/stm32l4x5_gpio.c b/hw/gpio/stm32l4x5_gpio.c
index a31999323a..e3e5bc46e7 100644
--- a/hw/gpio/stm32l4x5_gpio.c
+++ b/hw/gpio/stm32l4x5_gpio.c
@@ -25,6 +25,7 @@
#include "hw/core/qdev-properties.h"
#include "qapi/visitor.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "migration/vmstate.h"
#include "trace.h"
@@ -409,10 +410,10 @@ static void stm32l4x5_gpio_init(Object *obj)
s->clk = qdev_init_clock_in(DEVICE(s), "clk", NULL, s, 0);
- object_property_add(obj, "disconnected-pins", "uint16", NULL,
+ object_property_add(obj, "disconnected-pins", "uint16", &uint16_type_info,
disconnected_pins_get, disconnected_pins_set,
NULL, &s->disconnected_pins);
- object_property_add(obj, "clock-freq-hz", "uint32", NULL,
+ object_property_add(obj, "clock-freq-hz", "uint32", &uint32_type_info,
clock_freq_get, NULL, NULL, NULL);
}
diff --git a/hw/hexagon/hexagon_dsp.c b/hw/hexagon/hexagon_dsp.c
index abccf10c00..eddf69545e 100644
--- a/hw/hexagon/hexagon_dsp.c
+++ b/hw/hexagon/hexagon_dsp.c
@@ -17,6 +17,7 @@
#include "hw/hexagon/hex-subsys.h"
#include "hw/core/loader.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qemu/error-report.h"
#include "qemu/log.h"
@@ -153,7 +154,8 @@ static void hexagon_sim_set_subsystem_base(Object *obj, Visitor *v,
static void add_dsp_properties(ObjectClass *oc)
{
- object_class_property_add(oc, "subsystem-base", "uint32", NULL,
+ object_class_property_add(oc, "subsystem-base", "uint32",
+ &uint32_type_info,
hexagon_sim_get_subsystem_base,
hexagon_sim_set_subsystem_base, NULL, NULL);
object_class_property_set_description(oc, "subsystem-base",
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 649ae27156..80940e81e5 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1718,7 +1718,8 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
mc->default_ram_id = "pc.ram";
pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_AUTO;
- object_class_property_add(oc, PC_MACHINE_MAX_RAM_BELOW_4G, "size", NULL,
+ object_class_property_add(oc, PC_MACHINE_MAX_RAM_BELOW_4G, "size",
+ &size_type_info,
pc_machine_get_max_ram_below_4g,
pc_machine_set_max_ram_below_4g,
NULL, NULL);
@@ -1757,14 +1758,16 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
pc_machine_get_default_bus_bypass_iommu,
pc_machine_set_default_bus_bypass_iommu);
- object_class_property_add(oc, PC_MACHINE_MAX_FW_SIZE, "size", NULL,
+ object_class_property_add(oc, PC_MACHINE_MAX_FW_SIZE, "size",
+ &size_type_info,
pc_machine_get_max_fw_size,
pc_machine_set_max_fw_size,
NULL, NULL);
object_class_property_set_description(oc, PC_MACHINE_MAX_FW_SIZE,
"Maximum combined firmware size");
- object_class_property_add(oc, PC_MACHINE_SMBIOS_EP, "str", NULL,
+ object_class_property_add(oc, PC_MACHINE_SMBIOS_EP, "str",
+ &str_type_info,
pc_machine_get_smbios_ep,
pc_machine_set_smbios_ep,
NULL, NULL);
diff --git a/hw/i386/sgx-epc.c b/hw/i386/sgx-epc.c
index a1b55c2ec3..e5fc90db9e 100644
--- a/hw/i386/sgx-epc.c
+++ b/hw/i386/sgx-epc.c
@@ -15,6 +15,7 @@
#include "hw/mem/memory-device.h"
#include "hw/core/qdev-properties.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "target/i386/cpu.h"
#include "system/address-spaces.h"
@@ -159,7 +160,8 @@ static void sgx_epc_class_init(ObjectClass *oc, const void *data)
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", NULL,
+ object_class_property_add(oc, SGX_EPC_SIZE_PROP, "uint64",
+ &uint64_type_info,
sgx_epc_get_size,
NULL,
NULL, NULL);
diff --git a/hw/i386/x86.c b/hw/i386/x86.c
index 3416df13ab..b490c4e715 100644
--- a/hw/i386/x86.c
+++ b/hw/i386/x86.c
@@ -417,9 +417,9 @@ static void x86_machine_class_init(ObjectClass *oc, const void *data)
"The string may be up to 8 bytes in size");
object_class_property_add(oc, X86_MACHINE_BUS_LOCK_RATELIMIT, "uint64_t",
- NULL,
- x86_machine_get_bus_lock_ratelimit,
- x86_machine_set_bus_lock_ratelimit, NULL, NULL);
+ &uint64_type_info,
+ x86_machine_get_bus_lock_ratelimit,
+ x86_machine_set_bus_lock_ratelimit, NULL, NULL);
object_class_property_set_description(oc, X86_MACHINE_BUS_LOCK_RATELIMIT,
"Set the ratelimit for the bus locks acquired in VMs");
diff --git a/hw/ide/ide-dev.c b/hw/ide/ide-dev.c
index 7bb06088a5..94b9147892 100644
--- a/hw/ide/ide-dev.c
+++ b/hw/ide/ide-dev.c
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/qapi-types-block.h"
#include "qemu/error-report.h"
#include "qemu/module.h"
@@ -174,7 +175,7 @@ out:
static void ide_dev_instance_init(Object *obj)
{
- object_property_add(obj, "bootindex", "int32", NULL,
+ object_property_add(obj, "bootindex", "int32", &int32_type_info,
ide_dev_get_bootindex,
ide_dev_set_bootindex, NULL, NULL);
object_property_set_int(obj, "bootindex", -1, NULL);
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
index ee5f6cb4c3..eab75dd169 100644
--- a/hw/intc/apic_common.c
+++ b/hw/intc/apic_common.c
@@ -22,6 +22,7 @@
#include "qemu/error-report.h"
#include "qemu/module.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "hw/i386/apic.h"
#include "hw/i386/apic_internal.h"
@@ -442,7 +443,7 @@ static void apic_common_initfn(Object *obj)
APICCommonState *s = APIC_COMMON(obj);
s->id = s->initial_apic_id = -1;
- object_property_add(obj, "id", "uint32", NULL,
+ object_property_add(obj, "id", "uint32", &uint32_type_info,
apic_common_get_id,
apic_common_set_id, NULL, NULL);
}
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 1e1271ce87..1eae2bffe6 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -1512,10 +1512,10 @@ static void virt_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, "highmem-mmio",
"Set on/off to enable/disable high "
"memory region for PCI MMIO");
- object_class_property_add(oc, "highmem-mmio-size", "size", NULL,
- virt_get_highmem_mmio_size,
- virt_set_highmem_mmio_size,
- NULL, NULL);
+ object_class_property_add(oc, "highmem-mmio-size", "size", &size_type_info,
+ virt_get_highmem_mmio_size,
+ virt_set_highmem_mmio_size,
+ NULL, NULL);
object_class_property_set_description(oc, "highmem-mmio-size",
"Set the high memory region size "
"for PCI MMIO");
diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
index 8d6e8d0bd9..04e8361348 100644
--- a/hw/mem/nvdimm.c
+++ b/hw/mem/nvdimm.c
@@ -26,6 +26,7 @@
#include "qemu/module.h"
#include "qemu/pmem.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "hw/mem/nvdimm.h"
#include "hw/core/qdev-properties.h"
@@ -99,7 +100,7 @@ static void nvdimm_set_uuid(Object *obj, Visitor *v, const char *name,
static void nvdimm_init(Object *obj)
{
- object_property_add(obj, NVDIMM_LABEL_SIZE_PROP, "size", NULL,
+ object_property_add(obj, NVDIMM_LABEL_SIZE_PROP, "size", &size_type_info,
nvdimm_get_label_size, nvdimm_set_label_size, NULL,
NULL);
diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
index 7250146c10..e9b872450a 100644
--- a/hw/mem/pc-dimm.c
+++ b/hw/mem/pc-dimm.c
@@ -26,6 +26,7 @@
#include "hw/mem/nvdimm.h"
#include "hw/mem/memory-device.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qemu/module.h"
#include "system/hostmem.h"
@@ -176,7 +177,7 @@ static void pc_dimm_get_size(Object *obj, Visitor *v, const char *name,
static void pc_dimm_init(Object *obj)
{
- object_property_add(obj, PC_DIMM_SIZE_PROP, "uint64", NULL,
+ object_property_add(obj, PC_DIMM_SIZE_PROP, "uint64", &uint64_type_info,
pc_dimm_get_size,
NULL, NULL, NULL);
}
diff --git a/hw/misc/aspeed_lpc.c b/hw/misc/aspeed_lpc.c
index a73df07332..ef320875cc 100644
--- a/hw/misc/aspeed_lpc.c
+++ b/hw/misc/aspeed_lpc.c
@@ -12,6 +12,7 @@
#include "qemu/error-report.h"
#include "hw/misc/aspeed_lpc.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "hw/core/irq.h"
#include "hw/core/qdev-properties.h"
@@ -417,40 +418,40 @@ static void aspeed_lpc_realize(DeviceState *dev, Error **errp)
static void aspeed_lpc_init(Object *obj)
{
- object_property_add(obj, "idr1", "uint32", NULL,
+ object_property_add(obj, "idr1", "uint32", &uint32_type_info,
aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "odr1", "uint32", NULL,
+ object_property_add(obj, "odr1", "uint32", &uint32_type_info,
aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "str1", "uint32", NULL,
+ object_property_add(obj, "str1", "uint32", &uint32_type_info,
aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "idr2", "uint32", NULL,
+ object_property_add(obj, "idr2", "uint32", &uint32_type_info,
aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "odr2", "uint32", NULL,
+ object_property_add(obj, "odr2", "uint32", &uint32_type_info,
aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "str2", "uint32", NULL,
+ object_property_add(obj, "str2", "uint32", &uint32_type_info,
aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "idr3", "uint32", NULL,
+ object_property_add(obj, "idr3", "uint32", &uint32_type_info,
aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "odr3", "uint32", NULL,
+ object_property_add(obj, "odr3", "uint32", &uint32_type_info,
aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "str3", "uint32", NULL,
+ object_property_add(obj, "str3", "uint32", &uint32_type_info,
aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "idr4", "uint32", NULL,
+ object_property_add(obj, "idr4", "uint32", &uint32_type_info,
aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "odr4", "uint32", NULL,
+ object_property_add(obj, "odr4", "uint32", &uint32_type_info,
aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
- object_property_add(obj, "str4", "uint32", NULL,
+ object_property_add(obj, "str4", "uint32", &uint32_type_info,
aspeed_kcs_get_register_property,
aspeed_kcs_set_register_property, NULL, NULL);
}
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
index 427816b838..412aa17d2e 100644
--- a/hw/misc/aspeed_sdmc.c
+++ b/hw/misc/aspeed_sdmc.c
@@ -15,6 +15,7 @@
#include "hw/core/qdev-properties.h"
#include "migration/vmstate.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "trace.h"
#include "qemu/units.h"
#include "qemu/cutils.h"
@@ -259,7 +260,7 @@ static void aspeed_sdmc_set_ram_size(Object *obj, Visitor *v, const char *name,
static void aspeed_sdmc_initfn(Object *obj)
{
- object_property_add(obj, "ram-size", "int", NULL,
+ object_property_add(obj, "ram-size", "int", &int_type_info,
aspeed_sdmc_get_ram_size, aspeed_sdmc_set_ram_size,
NULL, NULL);
}
diff --git a/hw/misc/npcm7xx_mft.c b/hw/misc/npcm7xx_mft.c
index 3ce92fad3a..a9e827e937 100644
--- a/hw/misc/npcm7xx_mft.c
+++ b/hw/misc/npcm7xx_mft.c
@@ -23,6 +23,7 @@
#include "hw/core/registerfields.h"
#include "migration/vmstate.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qemu/bitops.h"
#include "qemu/error-report.h"
@@ -491,7 +492,7 @@ static void npcm7xx_mft_init(Object *obj)
s->clock_2 = qdev_init_clock_out(dev, "clock2");
for (int i = 0; i < NPCM7XX_PWM_PER_MODULE; ++i) {
- object_property_add(obj, "max_rpm[*]", "uint32", NULL,
+ object_property_add(obj, "max_rpm[*]", "uint32", &uint32_type_info,
npcm7xx_mft_get_max_rpm,
npcm7xx_mft_set_max_rpm,
NULL, &s->max_rpm[i]);
diff --git a/hw/net/ne2000-isa.c b/hw/net/ne2000-isa.c
index 02300eaaa6..ed2c9e356c 100644
--- a/hw/net/ne2000-isa.c
+++ b/hw/net/ne2000-isa.c
@@ -29,6 +29,7 @@
#include "ne2000.h"
#include "system/system.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qemu/module.h"
#include "qom/object.h"
@@ -131,7 +132,7 @@ out:
static void isa_ne2000_instance_init(Object *obj)
{
- object_property_add(obj, "bootindex", "int32", NULL,
+ object_property_add(obj, "bootindex", "int32", &int32_type_info,
isa_ne2000_get_bootindex,
isa_ne2000_set_bootindex, NULL, NULL);
object_property_set_int(obj, "bootindex", -1, NULL);
diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c
index 405010af4b..10e5d976a8 100644
--- a/hw/nvme/ctrl.c
+++ b/hw/nvme/ctrl.c
@@ -203,6 +203,7 @@
#include "qemu/units.h"
#include "qemu/range.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "system/system.h"
#include "system/block-backend.h"
@@ -10612,7 +10613,8 @@ static void nvme_instance_init(Object *obj)
"bootindex", "/namespace@1,0",
DEVICE(obj));
- object_property_add(obj, "smart_critical_warning", "uint8", NULL,
+ object_property_add(obj, "smart_critical_warning", "uint8",
+ &uint8_type_info,
nvme_get_smart_warning,
nvme_set_smart_warning, NULL, NULL);
}
diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c
index 1b22f5e383..88b2e2971e 100644
--- a/hw/pci-bridge/pci_expander_bridge.c
+++ b/hw/pci-bridge/pci_expander_bridge.c
@@ -12,6 +12,7 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "hw/pci/pci.h"
#include "hw/pci/pci_bus.h"
#include "hw/pci/pci_host.h"
@@ -103,7 +104,7 @@ static void pxb_bus_class_init(ObjectClass *class, const void *data)
pbc->bus_num = pxb_bus_num;
pbc->numa_node = pxb_bus_numa_node;
- object_class_property_add(class, "acpi_uid", "uint32", NULL,
+ object_class_property_add(class, "acpi_uid", "uint32", &uint32_type_info,
prop_pxb_uid_get, NULL, NULL, NULL);
object_class_property_set_description(class, "acpi_uid",
"ACPI Unique ID used to distinguish this PCI Host Bridge / ACPI00016");
diff --git a/hw/pci-host/i440fx.c b/hw/pci-host/i440fx.c
index bf4b6c4253..0951378836 100644
--- a/hw/pci-host/i440fx.c
+++ b/hw/pci-host/i440fx.c
@@ -32,6 +32,7 @@
#include "hw/core/qdev-properties.h"
#include "hw/core/sysbus.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "migration/vmstate.h"
#include "qapi/visitor.h"
#include "qemu/error-report.h"
@@ -388,22 +389,22 @@ static void i440fx_pcihost_class_init(ObjectClass *klass, const void *data)
dc->user_creatable = false;
object_class_property_add(klass, PCI_HOST_PROP_PCI_HOLE_START, "uint32",
- NULL,
+ &uint32_type_info,
i440fx_pcihost_get_pci_hole_start,
NULL, NULL, NULL);
object_class_property_add(klass, PCI_HOST_PROP_PCI_HOLE_END, "uint32",
- NULL,
+ &uint32_type_info,
i440fx_pcihost_get_pci_hole_end,
NULL, NULL, NULL);
object_class_property_add(klass, PCI_HOST_PROP_PCI_HOLE64_START, "uint64",
- NULL,
+ &uint64_type_info,
i440fx_pcihost_get_pci_hole64_start,
NULL, NULL, NULL);
object_class_property_add(klass, PCI_HOST_PROP_PCI_HOLE64_END, "uint64",
- NULL,
+ &uint64_type_info,
i440fx_pcihost_get_pci_hole64_end,
NULL, NULL, NULL);
}
diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c
index c45401d9dd..b159f93944 100644
--- a/hw/pci-host/pnv_phb3.c
+++ b/hw/pci-host/pnv_phb3.c
@@ -11,6 +11,7 @@
#include "qemu/bswap.h"
#include "qapi/visitor.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "hw/pci-host/pnv_phb3_regs.h"
#include "hw/pci-host/pnv_phb.h"
#include "hw/pci-host/pnv_phb3.h"
@@ -1164,12 +1165,12 @@ static void pnv_phb3_root_bus_class_init(ObjectClass *klass, const void *data)
{
BusClass *k = BUS_CLASS(klass);
- object_class_property_add(klass, "phb-id", "uint32", NULL,
+ object_class_property_add(klass, "phb-id", "uint32", &uint32_type_info,
pnv_phb3_root_bus_get_prop,
pnv_phb3_root_bus_set_prop,
NULL, NULL);
- object_class_property_add(klass, "chip-id", "uint32", NULL,
+ object_class_property_add(klass, "chip-id", "uint32", &uint32_type_info,
pnv_phb3_root_bus_get_prop,
pnv_phb3_root_bus_set_prop,
NULL, NULL);
diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c
index 6a5d1bb227..a5e1ee2844 100644
--- a/hw/pci-host/pnv_phb4.c
+++ b/hw/pci-host/pnv_phb4.c
@@ -11,6 +11,7 @@
#include "qemu/bswap.h"
#include "qapi/visitor.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "target/ppc/cpu.h"
#include "hw/pci-host/pnv_phb4_regs.h"
#include "hw/pci-host/pnv_phb4.h"
@@ -1775,12 +1776,12 @@ static void pnv_phb4_root_bus_class_init(ObjectClass *klass, const void *data)
{
BusClass *k = BUS_CLASS(klass);
- object_class_property_add(klass, "phb-id", "uint32", NULL,
+ object_class_property_add(klass, "phb-id", "uint32", &uint32_type_info,
pnv_phb4_root_bus_get_prop,
pnv_phb4_root_bus_set_prop,
NULL, NULL);
- object_class_property_add(klass, "chip-id", "uint32", NULL,
+ object_class_property_add(klass, "chip-id", "uint32", &uint32_type_info,
pnv_phb4_root_bus_get_prop,
pnv_phb4_root_bus_set_prop,
NULL, NULL);
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index 027ae02066..d53441561f 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -35,6 +35,7 @@
#include "hw/core/qdev-properties.h"
#include "migration/vmstate.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qemu/module.h"
@@ -226,19 +227,23 @@ static void q35_host_initfn(Object *obj)
qdev_prop_set_uint64(DEVICE(s), PCI_HOST_PROP_PCI_HOLE64_SIZE,
Q35_PCI_HOST_HOLE64_SIZE_DEFAULT);
- object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_START, "uint32", NULL,
+ object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_START, "uint32",
+ &uint32_type_info,
q35_host_get_pci_hole_start,
NULL, NULL, NULL);
- object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_END, "uint32", NULL,
+ object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_END, "uint32",
+ &uint32_type_info,
q35_host_get_pci_hole_end,
NULL, NULL, NULL);
- object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_START, "uint64", NULL,
+ object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_START, "uint64",
+ &uint64_type_info,
q35_host_get_pci_hole64_start,
NULL, NULL, NULL);
- object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_END, "uint64", NULL,
+ object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_END, "uint64",
+ &uint64_type_info,
q35_host_get_pci_hole64_end,
NULL, NULL, NULL);
diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
index a33f0949d1..4054215592 100644
--- a/hw/ppc/spapr_drc.c
+++ b/hw/ppc/spapr_drc.c
@@ -12,6 +12,7 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qobject/qnull.h"
#include "qemu/cutils.h"
#include "hw/ppc/spapr_drc.h"
@@ -584,8 +585,8 @@ static void spapr_dr_connector_instance_init(Object *obj)
SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
object_property_add_uint32_ptr(obj, "id", &drc->id, OBJ_PROP_FLAG_READ);
- object_property_add(obj, "index", "uint32", NULL, prop_get_index,
- NULL, NULL, NULL);
+ object_property_add(obj, "index", "uint32", &uint32_type_info,
+ prop_get_index, NULL, NULL, NULL);
object_property_add(obj, "fdt", "struct", NULL, prop_get_fdt,
NULL, NULL, NULL);
drc->state = drck->empty_state;
diff --git a/hw/remote/vfio-user-obj.c b/hw/remote/vfio-user-obj.c
index 205582a91f..eae8a799f1 100644
--- a/hw/remote/vfio-user-obj.c
+++ b/hw/remote/vfio-user-obj.c
@@ -933,8 +933,8 @@ static void vfu_object_class_init(ObjectClass *klass, const void *data)
k->nr_devs = 0;
object_class_property_add(klass, "socket", "SocketAddress",
- &SocketAddress_type_info,
- NULL, vfu_object_set_socket, NULL, NULL);
+ &SocketAddress_type_info, NULL,
+ vfu_object_set_socket, NULL, NULL);
object_class_property_set_description(klass, "socket",
"SocketAddress "
"(ex: type=unix,path=/tmp/sock). "
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
index 04c48a4eda..27c7c42231 100644
--- a/hw/riscv/microchip_pfsoc.c
+++ b/hw/riscv/microchip_pfsoc.c
@@ -39,6 +39,7 @@
#include "qemu/units.h"
#include "qemu/cutils.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "hw/core/boards.h"
#include "hw/core/loader.h"
@@ -744,7 +745,7 @@ static void microchip_icicle_kit_machine_class_init(ObjectClass *oc,
mc->default_ram_size = 1537 * MiB;
object_class_property_add(oc, "clint-timebase-frequency", "uint32_t",
- NULL,
+ &uint32_type_info,
microchip_icicle_kit_get_clint_timebase_freq,
microchip_icicle_kit_set_clint_timebase_freq,
NULL, NULL);
diff --git a/hw/s390x/sclpcpi.c b/hw/s390x/sclpcpi.c
index 90cb36aad6..7de38f81e7 100644
--- a/hw/s390x/sclpcpi.c
+++ b/hw/s390x/sclpcpi.c
@@ -53,6 +53,7 @@
#include "qemu/timer.h"
#include "hw/s390x/event-facility.h"
#include "hw/s390x/ebcdic.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/qapi-visit-machine.h"
#include "qapi/qapi-events-machine-s390x.h"
#include "migration/vmstate.h"
@@ -195,13 +196,14 @@ static void cpi_class_init(ObjectClass *klass, const void *data)
"name of the cluster which the VM belongs to, if any"
" e.g. \"PLEX \"");
- object_class_property_add(klass, "system_level", "uint64", NULL,
+ object_class_property_add(klass, "system_level", "uint64",
+ &uint64_type_info,
get_system_level,
NULL, NULL, NULL);
object_class_property_set_description(klass, "system_level",
"distribution and kernel version in Linux e.g. 74872343805430528");
- object_class_property_add(klass, "timestamp", "uint64", NULL,
+ object_class_property_add(klass, "timestamp", "uint64", &uint64_type_info,
get_timestamp,
NULL, NULL, NULL);
object_class_property_set_description(klass, "timestamp",
diff --git a/hw/s390x/virtio-ccw-mem.c b/hw/s390x/virtio-ccw-mem.c
index 1dc19ca914..c9d09237c2 100644
--- a/hw/s390x/virtio-ccw-mem.c
+++ b/hw/s390x/virtio-ccw-mem.c
@@ -13,6 +13,7 @@
#include "qemu/osdep.h"
#include "hw/core/qdev-properties.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qemu/module.h"
#include "virtio-ccw-mem.h"
#include "hw/mem/memory-device.h"
@@ -205,7 +206,8 @@ static void virtio_ccw_mem_instance_init(Object *obj)
OBJECT(&dev->vdev), VIRTIO_MEM_BLOCK_SIZE_PROP);
object_property_add_alias(obj, VIRTIO_MEM_SIZE_PROP, OBJECT(&dev->vdev),
VIRTIO_MEM_SIZE_PROP);
- object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size", NULL,
+ object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size",
+ &size_type_info,
virtio_ccw_mem_get_requested_size,
virtio_ccw_mem_set_requested_size, NULL, NULL);
}
diff --git a/hw/sensor/adc128d818.c b/hw/sensor/adc128d818.c
index 14d79d3958..4ac7a4393d 100644
--- a/hw/sensor/adc128d818.c
+++ b/hw/sensor/adc128d818.c
@@ -8,6 +8,7 @@
#include "qemu/osdep.h"
#include "qemu/log.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/error.h"
#include "qapi/visitor.h"
#include "qom/object.h"
@@ -642,15 +643,16 @@ static void adc128d818_initfn(Object *obj)
for (unsigned ch = 0u; ch < ADC128D818_NUM_CHANNELS; ch++) {
char *name = g_strdup_printf("ain%u", ch);
- object_property_add(obj, name, "int", NULL, adc128d818_get_ain,
+ object_property_add(obj, name, "int", &int_type_info,
+ adc128d818_get_ain,
adc128d818_set_ain, NULL, NULL);
g_free(name);
}
- object_property_add(obj, "temperature", "int", NULL,
+ object_property_add(obj, "temperature", "int", &int_type_info,
adc128d818_get_temperature,
adc128d818_set_temperature, NULL, NULL);
- object_property_add(obj, "ext-vref-mv", "int", NULL,
+ object_property_add(obj, "ext-vref-mv", "int", &int_type_info,
adc128d818_get_ext_vref,
adc128d818_set_ext_vref, NULL, NULL);
}
diff --git a/hw/sensor/adm1266.c b/hw/sensor/adm1266.c
index 7927845e32..c880fca225 100644
--- a/hw/sensor/adm1266.c
+++ b/hw/sensor/adm1266.c
@@ -14,6 +14,7 @@
#include "hw/core/irq.h"
#include "migration/vmstate.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qemu/log.h"
#include "qemu/module.h"
@@ -217,7 +218,7 @@ static void adm1266_init(Object *obj)
for (int i = 0; i < ADM1266_NUM_PAGES; i++) {
pmbus_page_config(pmdev, i, flags);
- object_property_add(obj, "vout[*]", "uint16", NULL,
+ object_property_add(obj, "vout[*]", "uint16", &uint16_type_info,
adm1266_get,
adm1266_set, NULL, &pmdev->pages[i].read_vout);
}
diff --git a/hw/sensor/adm1272.c b/hw/sensor/adm1272.c
index 6a7ff02617..ca66039c20 100644
--- a/hw/sensor/adm1272.c
+++ b/hw/sensor/adm1272.c
@@ -12,6 +12,7 @@
#include "hw/core/irq.h"
#include "migration/vmstate.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qemu/log.h"
#include "qemu/module.h"
@@ -493,19 +494,19 @@ static void adm1272_init(Object *obj)
pmbus_page_config(pmdev, 0, flags);
- object_property_add(obj, "vin", "uint16", NULL,
+ object_property_add(obj, "vin", "uint16", &uint16_type_info,
adm1272_get,
adm1272_set, NULL, &pmdev->pages[0].read_vin);
- object_property_add(obj, "vout", "uint16", NULL,
+ object_property_add(obj, "vout", "uint16", &uint16_type_info,
adm1272_get,
adm1272_set, NULL, &pmdev->pages[0].read_vout);
- object_property_add(obj, "iout", "uint16", NULL,
+ object_property_add(obj, "iout", "uint16", &uint16_type_info,
adm1272_get,
adm1272_set, NULL, &pmdev->pages[0].read_iout);
- object_property_add(obj, "pin", "uint16", NULL,
+ object_property_add(obj, "pin", "uint16", &uint16_type_info,
adm1272_get,
adm1272_set, NULL, &pmdev->pages[0].read_pin);
diff --git a/hw/sensor/emc141x.c b/hw/sensor/emc141x.c
index 128d721b7b..f53ee9f654 100644
--- a/hw/sensor/emc141x.c
+++ b/hw/sensor/emc141x.c
@@ -22,6 +22,7 @@
#include "hw/i2c/i2c.h"
#include "migration/vmstate.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qemu/module.h"
#include "qom/object.h"
@@ -251,16 +252,16 @@ static void emc141x_reset(DeviceState *dev)
static void emc141x_initfn(Object *obj)
{
- object_property_add(obj, "temperature0", "int", NULL,
+ object_property_add(obj, "temperature0", "int", &int_type_info,
emc141x_get_temperature,
emc141x_set_temperature, NULL, NULL);
- object_property_add(obj, "temperature1", "int", NULL,
+ object_property_add(obj, "temperature1", "int", &int_type_info,
emc141x_get_temperature,
emc141x_set_temperature, NULL, NULL);
- object_property_add(obj, "temperature2", "int", NULL,
+ object_property_add(obj, "temperature2", "int", &int_type_info,
emc141x_get_temperature,
emc141x_set_temperature, NULL, NULL);
- object_property_add(obj, "temperature3", "int", NULL,
+ object_property_add(obj, "temperature3", "int", &int_type_info,
emc141x_get_temperature,
emc141x_set_temperature, NULL, NULL);
}
diff --git a/hw/sensor/isl_pmbus_vr.c b/hw/sensor/isl_pmbus_vr.c
index 1af0f2af35..dbff398d57 100644
--- a/hw/sensor/isl_pmbus_vr.c
+++ b/hw/sensor/isl_pmbus_vr.c
@@ -9,6 +9,7 @@
#include "qemu/osdep.h"
#include "hw/sensor/isl_pmbus_vr.h"
#include "hw/core/qdev-properties.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qemu/log.h"
#include "qemu/module.h"
@@ -136,63 +137,63 @@ static void isl_pmbus_vr_add_props(Object *obj, uint64_t *flags, uint8_t pages)
PMBusDevice *pmdev = PMBUS_DEVICE(obj);
for (int i = 0; i < pages; i++) {
if (flags[i] & PB_HAS_VIN) {
- object_property_add(obj, "vin[*]", "uint16", NULL,
+ object_property_add(obj, "vin[*]", "uint16", &uint16_type_info,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_vin);
}
if (flags[i] & PB_HAS_VOUT) {
- object_property_add(obj, "vout[*]", "uint16", NULL,
+ object_property_add(obj, "vout[*]", "uint16", &uint16_type_info,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_vout);
}
if (flags[i] & PB_HAS_IIN) {
- object_property_add(obj, "iin[*]", "uint16", NULL,
+ object_property_add(obj, "iin[*]", "uint16", &uint16_type_info,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_iin);
}
if (flags[i] & PB_HAS_IOUT) {
- object_property_add(obj, "iout[*]", "uint16", NULL,
+ object_property_add(obj, "iout[*]", "uint16", &uint16_type_info,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_iout);
}
if (flags[i] & PB_HAS_PIN) {
- object_property_add(obj, "pin[*]", "uint16", NULL,
+ object_property_add(obj, "pin[*]", "uint16", &uint16_type_info,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_pin);
}
if (flags[i] & PB_HAS_POUT) {
- object_property_add(obj, "pout[*]", "uint16", NULL,
+ object_property_add(obj, "pout[*]", "uint16", &uint16_type_info,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_pout);
}
if (flags[i] & PB_HAS_TEMPERATURE) {
- object_property_add(obj, "temp1[*]", "uint16", NULL,
+ object_property_add(obj, "temp1[*]", "uint16", &uint16_type_info,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_temperature_1);
}
if (flags[i] & PB_HAS_TEMP2) {
- object_property_add(obj, "temp2[*]", "uint16", NULL,
+ object_property_add(obj, "temp2[*]", "uint16", &uint16_type_info,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_temperature_2);
}
if (flags[i] & PB_HAS_TEMP3) {
- object_property_add(obj, "temp3[*]", "uint16", NULL,
+ object_property_add(obj, "temp3[*]", "uint16", &uint16_type_info,
isl_pmbus_vr_get,
isl_pmbus_vr_set,
NULL, &pmdev->pages[i].read_temperature_3);
diff --git a/hw/sensor/lsm303dlhc_mag.c b/hw/sensor/lsm303dlhc_mag.c
index f362686b69..1045473595 100644
--- a/hw/sensor/lsm303dlhc_mag.c
+++ b/hw/sensor/lsm303dlhc_mag.c
@@ -25,6 +25,7 @@
#include "hw/i2c/i2c.h"
#include "migration/vmstate.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qemu/module.h"
#include "qemu/log.h"
@@ -509,19 +510,19 @@ static void lsm303dlhc_mag_reset(DeviceState *dev)
*/
static void lsm303dlhc_mag_initfn(Object *obj)
{
- object_property_add(obj, "mag-x", "int", NULL,
+ object_property_add(obj, "mag-x", "int", &int_type_info,
lsm303dlhc_mag_get_x,
lsm303dlhc_mag_set_x, NULL, NULL);
- object_property_add(obj, "mag-y", "int", NULL,
+ object_property_add(obj, "mag-y", "int", &int_type_info,
lsm303dlhc_mag_get_y,
lsm303dlhc_mag_set_y, NULL, NULL);
- object_property_add(obj, "mag-z", "int", NULL,
+ object_property_add(obj, "mag-z", "int", &int_type_info,
lsm303dlhc_mag_get_z,
lsm303dlhc_mag_set_z, NULL, NULL);
- object_property_add(obj, "temperature", "int", NULL,
+ object_property_add(obj, "temperature", "int", &int_type_info,
lsm303dlhc_mag_get_temperature,
lsm303dlhc_mag_set_temperature, NULL, NULL);
}
diff --git a/hw/sensor/max34451.c b/hw/sensor/max34451.c
index 6c2f7311ff..9e3ebf72be 100644
--- a/hw/sensor/max34451.c
+++ b/hw/sensor/max34451.c
@@ -11,6 +11,7 @@
#include "hw/core/irq.h"
#include "migration/vmstate.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qemu/log.h"
#include "qemu/module.h"
@@ -727,7 +728,7 @@ static void max34451_init(Object *obj)
/* get and set the voltage in millivolts, max is 32767 mV */
for (int i = 0; i < MAX34451_NUM_PWR_DEVICES; i++) {
- object_property_add(obj, "vout[*]", "uint16", NULL,
+ object_property_add(obj, "vout[*]", "uint16", &uint16_type_info,
max34451_get,
max34451_set, NULL, &pmdev->pages[i].read_vout);
}
@@ -737,7 +738,7 @@ static void max34451_init(Object *obj)
* centidegrees Celsius i.e.: 2500 -> 25.00 C, max is 327.67 C
*/
for (int i = 0; i < MAX34451_NUM_TEMP_DEVICES; i++) {
- object_property_add(obj, "temperature[*]", "uint16", NULL,
+ object_property_add(obj, "temperature[*]", "uint16", &uint16_type_info,
max34451_get,
max34451_set,
NULL,
diff --git a/hw/sensor/tmp105.c b/hw/sensor/tmp105.c
index 98f45a49b7..ec39c31d90 100644
--- a/hw/sensor/tmp105.c
+++ b/hw/sensor/tmp105.c
@@ -28,6 +28,7 @@
#include "qemu/osdep.h"
#include "qemu/module.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qom/object.h"
#include "hw/sensor/tmp105.h"
@@ -408,7 +409,7 @@ static void tmp105_realize(DeviceState *dev, Error **errp)
static void tmp105_initfn(Object *obj)
{
- object_property_add(obj, "temperature", "int", NULL,
+ object_property_add(obj, "temperature", "int", &int_type_info,
tmp105_get_temperature,
tmp105_set_temperature, NULL, NULL);
object_property_set_description(obj, "temperature",
diff --git a/hw/sensor/tmp421.c b/hw/sensor/tmp421.c
index 8e6823dfcc..0e4d0d0ec2 100644
--- a/hw/sensor/tmp421.c
+++ b/hw/sensor/tmp421.c
@@ -28,6 +28,7 @@
#include "hw/i2c/i2c.h"
#include "migration/vmstate.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qemu/module.h"
#include "qom/object.h"
@@ -350,16 +351,16 @@ static void tmp421_class_init(ObjectClass *klass, const void *data)
dc->vmsd = &vmstate_tmp421;
sc->dev = (DeviceInfo *) data;
- object_class_property_add(klass, "temperature0", "int", NULL,
+ object_class_property_add(klass, "temperature0", "int", &int_type_info,
tmp421_get_temperature,
tmp421_set_temperature, NULL, NULL);
- object_class_property_add(klass, "temperature1", "int", NULL,
+ object_class_property_add(klass, "temperature1", "int", &int_type_info,
tmp421_get_temperature,
tmp421_set_temperature, NULL, NULL);
- object_class_property_add(klass, "temperature2", "int", NULL,
+ object_class_property_add(klass, "temperature2", "int", &int_type_info,
tmp421_get_temperature,
tmp421_set_temperature, NULL, NULL);
- object_class_property_add(klass, "temperature3", "int", NULL,
+ object_class_property_add(klass, "temperature3", "int", &int_type_info,
tmp421_get_temperature,
tmp421_set_temperature, NULL, NULL);
}
diff --git a/hw/usb/dev-storage-classic.c b/hw/usb/dev-storage-classic.c
index dfd568da5e..353f81dcc0 100644
--- a/hw/usb/dev-storage-classic.c
+++ b/hw/usb/dev-storage-classic.c
@@ -9,6 +9,7 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "hw/usb/usb.h"
#include "hw/usb/desc.h"
@@ -122,7 +123,7 @@ out:
static void usb_msd_instance_init(Object *obj)
{
- object_property_add(obj, "bootindex", "int32", NULL,
+ object_property_add(obj, "bootindex", "int32", &int32_type_info,
usb_msd_get_bootindex,
usb_msd_set_bootindex, NULL, NULL);
object_property_set_int(obj, "bootindex", -1, NULL);
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
index 995b1a41ef..366f88e048 100644
--- a/hw/virtio/virtio-balloon.c
+++ b/hw/virtio/virtio-balloon.c
@@ -27,6 +27,7 @@
#include "hw/virtio/virtio-balloon.h"
#include "system/address-spaces.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/qapi-events-machine.h"
#include "qapi/visitor.h"
#include "trace.h"
@@ -1039,7 +1040,8 @@ static void virtio_balloon_instance_init(Object *obj)
object_property_add(obj, "guest-stats", "guest statistics", NULL,
balloon_stats_get_all, NULL, NULL, NULL);
- object_property_add(obj, "guest-stats-polling-interval", "int", NULL,
+ object_property_add(obj, "guest-stats-polling-interval", "int",
+ &int_type_info,
balloon_stats_get_poll_interval,
balloon_stats_set_poll_interval,
NULL, NULL);
diff --git a/hw/virtio/virtio-mem-pci.c b/hw/virtio/virtio-mem-pci.c
index 6349337bf4..3044a807c1 100644
--- a/hw/virtio/virtio-mem-pci.c
+++ b/hw/virtio/virtio-mem-pci.c
@@ -14,6 +14,7 @@
#include "virtio-mem-pci.h"
#include "hw/mem/memory-device.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/qapi-events-machine.h"
#include "qapi/qapi-events-misc.h"
@@ -211,7 +212,8 @@ static void virtio_mem_pci_instance_init(Object *obj)
OBJECT(&dev->vdev), VIRTIO_MEM_BLOCK_SIZE_PROP);
object_property_add_alias(obj, VIRTIO_MEM_SIZE_PROP, OBJECT(&dev->vdev),
VIRTIO_MEM_SIZE_PROP);
- object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size", NULL,
+ object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size",
+ &size_type_info,
virtio_mem_pci_get_requested_size,
virtio_mem_pci_set_requested_size, NULL, NULL);
}
diff --git a/hw/virtio/virtio-mem.c b/hw/virtio/virtio-mem.c
index fcfd9fa18a..cbcfdf9f13 100644
--- a/hw/virtio/virtio-mem.c
+++ b/hw/virtio/virtio-mem.c
@@ -26,6 +26,7 @@
#include "hw/virtio/virtio-bus.h"
#include "hw/virtio/virtio-mem.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "migration/misc.h"
#include "hw/core/boards.h"
@@ -1533,13 +1534,16 @@ static void virtio_mem_instance_init(Object *obj)
notifier_list_init(&vmem->size_change_notifiers);
- object_property_add(obj, VIRTIO_MEM_SIZE_PROP, "size", NULL,
+ object_property_add(obj, VIRTIO_MEM_SIZE_PROP, "size",
+ &size_type_info,
virtio_mem_get_size,
NULL, NULL, NULL);
- object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size", NULL,
+ object_property_add(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, "size",
+ &size_type_info,
virtio_mem_get_requested_size,
virtio_mem_set_requested_size, NULL, NULL);
- object_property_add(obj, VIRTIO_MEM_BLOCK_SIZE_PROP, "size", NULL,
+ object_property_add(obj, VIRTIO_MEM_BLOCK_SIZE_PROP, "size",
+ &size_type_info,
virtio_mem_get_block_size, virtio_mem_set_block_size,
NULL, NULL);
}
diff --git a/hw/xen/xen-pvh-common.c b/hw/xen/xen-pvh-common.c
index ddeabe30f2..ca3326156f 100644
--- a/hw/xen/xen-pvh-common.c
+++ b/hw/xen/xen-pvh-common.c
@@ -9,6 +9,7 @@
#include "qemu/osdep.h"
#include "qemu/error-report.h"
#include "qemu/units.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "hw/core/boards.h"
#include "hw/core/irq.h"
@@ -413,7 +414,8 @@ void xen_pvh_class_setup_common_props(XenPVHMachineClass *xpc)
#define OC_MEMMAP_PROP_BASE(c, prop_name, name) \
do { \
- object_class_property_add(c, prop_name "-base", "uint64_t", NULL, \
+ object_class_property_add(c, prop_name "-base", "uint64_t", \
+ &uint64_type_info, \
xen_pvh_get_ ## name ## _base, \
xen_pvh_set_ ## name ## _base, NULL, NULL); \
object_class_property_set_description(oc, prop_name "-base", \
@@ -422,7 +424,8 @@ do { \
#define OC_MEMMAP_PROP_SIZE(c, prop_name, name) \
do { \
- object_class_property_add(c, prop_name "-size", "uint64_t", NULL, \
+ object_class_property_add(c, prop_name "-size", "uint64_t", \
+ &uint64_type_info, \
xen_pvh_get_ ## name ## _size, \
xen_pvh_set_ ## name ## _size, NULL, NULL); \
object_class_property_set_description(oc, prop_name "-size", \
@@ -458,7 +461,8 @@ do { \
OC_MEMMAP_PROP(oc, "pci-mmio", pci_mmio);
OC_MEMMAP_PROP(oc, "pci-mmio-high", pci_mmio_high);
- object_class_property_add(oc, "pci-intx-irq-base", "uint32_t", NULL,
+ object_class_property_add(oc, "pci-intx-irq-base", "uint32_t",
+ &uint32_type_info,
xen_pvh_get_pci_intx_irq_base,
xen_pvh_set_pci_intx_irq_base,
NULL, NULL);
@@ -468,7 +472,8 @@ do { \
#ifdef CONFIG_TPM
if (xpc->has_tpm) {
- object_class_property_add(oc, "tpm-base-addr", "uint64_t", NULL,
+ object_class_property_add(oc, "tpm-base-addr", "uint64_t",
+ &uint64_type_info,
xen_pvh_get_tpm_base,
xen_pvh_set_tpm_base,
NULL, NULL);
diff --git a/iothread.c b/iothread.c
index 7084d336a4..3a1601e28b 100644
--- a/iothread.c
+++ b/iothread.c
@@ -20,6 +20,7 @@
#include "system/event-loop-base.h"
#include "system/iothread.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/qapi-commands-misc.h"
#include "qemu/error-report.h"
#include "qemu/rcu.h"
@@ -315,19 +316,19 @@ static void iothread_class_init(ObjectClass *klass, const void *class_data)
bc->init = iothread_init;
bc->update_params = iothread_set_aio_context_params;
- object_class_property_add(klass, "poll-max-ns", "int64", NULL,
+ object_class_property_add(klass, "poll-max-ns", "int64", &int64_type_info,
iothread_get_poll_param,
iothread_set_poll_param,
NULL, &poll_max_ns_info);
- object_class_property_add(klass, "poll-grow", "int64", NULL,
+ object_class_property_add(klass, "poll-grow", "int64", &int64_type_info,
iothread_get_poll_param,
iothread_set_poll_param,
NULL, &poll_grow_info);
- object_class_property_add(klass, "poll-shrink", "int64", NULL,
+ object_class_property_add(klass, "poll-shrink", "int64", &int64_type_info,
iothread_get_poll_param,
iothread_set_poll_param,
NULL, &poll_shrink_info);
- object_class_property_add(klass, "poll-weight", "int64", NULL,
+ object_class_property_add(klass, "poll-weight", "int64", &int64_type_info,
iothread_get_poll_param,
iothread_set_poll_param,
NULL, &poll_weight_info);
diff --git a/net/colo-compare.c b/net/colo-compare.c
index 6bc43e0696..9b04b28484 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -16,6 +16,7 @@
#include "qemu/error-report.h"
#include "trace.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "net/net.h"
#include "net/eth.h"
#include "qom/object_interfaces.h"
@@ -1373,15 +1374,15 @@ static void colo_compare_init(Object *obj)
object_property_add_str(obj, "notify_dev",
compare_get_notify_dev, compare_set_notify_dev);
- object_property_add(obj, "compare_timeout", "uint64", NULL,
+ object_property_add(obj, "compare_timeout", "uint64", &uint64_type_info,
compare_get_timeout,
compare_set_timeout, NULL, NULL);
- object_property_add(obj, "expired_scan_cycle", "uint32", NULL,
+ object_property_add(obj, "expired_scan_cycle", "uint32", &uint32_type_info,
compare_get_expired_scan_cycle,
compare_set_expired_scan_cycle, NULL, NULL);
- object_property_add(obj, "max_queue_size", "uint32", NULL,
+ object_property_add(obj, "max_queue_size", "uint32", &uint32_type_info,
get_max_queue_size,
set_max_queue_size, NULL, NULL);
diff --git a/net/dump.c b/net/dump.c
index 558115b9c9..da366f48da 100644
--- a/net/dump.c
+++ b/net/dump.c
@@ -25,6 +25,7 @@
#include "qemu/osdep.h"
#include "clients.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qemu/error-report.h"
#include "qemu/iov.h"
#include "qemu/module.h"
@@ -238,7 +239,7 @@ static void filter_dump_class_init(ObjectClass *oc, const void *data)
{
NetFilterClass *nfc = NETFILTER_CLASS(oc);
- object_class_property_add(oc, "maxlen", "uint32", NULL,
+ object_class_property_add(oc, "maxlen", "uint32", &uint32_type_info,
filter_dump_get_maxlen,
filter_dump_set_maxlen, NULL, NULL);
object_class_property_add_str(oc, "file", file_dump_get_filename,
diff --git a/net/filter-buffer.c b/net/filter-buffer.c
index f56b2cfaf0..82a64a4680 100644
--- a/net/filter-buffer.c
+++ b/net/filter-buffer.c
@@ -10,6 +10,7 @@
#include "net/filter.h"
#include "net/queue.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qemu/timer.h"
#include "qemu/iov.h"
#include "qapi/qapi-builtin-visit.h"
@@ -182,7 +183,7 @@ static void filter_buffer_class_init(ObjectClass *oc, const void *data)
{
NetFilterClass *nfc = NETFILTER_CLASS(oc);
- object_class_property_add(oc, "interval", "uint32", NULL,
+ object_class_property_add(oc, "interval", "uint32", &uint32_type_info,
filter_buffer_get_interval,
filter_buffer_set_interval, NULL, NULL);
diff --git a/qom/object.c b/qom/object.c
index 0ef0d4d42c..39d26a17c6 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -22,10 +22,10 @@
#include "qapi/string-output-visitor.h"
#include "qapi/qobject-input-visitor.h"
#include "qapi/forward-visitor.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/qapi-builtin-visit.h"
#include "qapi/compat-policy.h"
#include "qobject/qdict.h"
-#include "qobject/qjson.h"
#include "qemu/id.h"
#include "qapi/qmp/qerror.h"
#include "trace.h"
@@ -2406,7 +2406,7 @@ object_property_add_str(Object *obj, const char *name,
prop->get = get;
prop->set = set;
- return object_property_add(obj, name, "string", NULL,
+ return object_property_add(obj, name, "string", &str_type_info,
get ? property_get_str : NULL,
set ? property_set_str : NULL,
property_release_data,
@@ -2424,7 +2424,7 @@ object_class_property_add_str(ObjectClass *klass, const char *name,
prop->get = get;
prop->set = set;
- return object_class_property_add(klass, name, "string", NULL,
+ return object_class_property_add(klass, name, "string", &str_type_info,
get ? property_get_str : NULL,
set ? property_set_str : NULL,
NULL,
@@ -2476,7 +2476,7 @@ object_property_add_bool(Object *obj, const char *name,
prop->get = get;
prop->set = set;
- return object_property_add(obj, name, "bool", NULL,
+ return object_property_add(obj, name, "bool", &bool_type_info,
get ? property_get_bool : NULL,
set ? property_set_bool : NULL,
property_release_data,
@@ -2493,7 +2493,7 @@ object_class_property_add_bool(ObjectClass *klass, const char *name,
prop->get = get;
prop->set = set;
- return object_class_property_add(klass, name, "bool", NULL,
+ return object_class_property_add(klass, name, "bool", &bool_type_info,
get ? property_get_bool : NULL,
set ? property_set_bool : NULL,
NULL,
@@ -2817,7 +2817,7 @@ object_class_property_add_bool_ptr(ObjectClass *klass, const char *name,
setter = property_class_set_bool_ptr;
}
- return object_class_property_add(klass, name, "bool", NULL,
+ return object_class_property_add(klass, name, "bool", &bool_type_info,
getter, setter, NULL, (void *)offset);
}
@@ -2837,7 +2837,7 @@ object_property_add_uint8_ptr(Object *obj, const char *name,
setter = property_set_uint8_ptr;
}
- return object_property_add(obj, name, "uint8", NULL,
+ return object_property_add(obj, name, "uint8", &uint8_type_info,
getter, setter, NULL, (void *)v);
}
@@ -2857,7 +2857,7 @@ object_class_property_add_uint8_ptr(ObjectClass *klass, const char *name,
setter = property_class_set_uint8_ptr;
}
- return object_class_property_add(klass, name, "uint8", NULL,
+ return object_class_property_add(klass, name, "uint8", &uint8_type_info,
getter, setter, NULL, (void *)offset);
}
@@ -2878,7 +2878,7 @@ object_class_static_property_add_uint8_ptr(ObjectClass *klass,
setter = property_set_uint8_ptr;
}
- return object_class_property_add(klass, name, "uint8", NULL,
+ return object_class_property_add(klass, name, "uint8", &uint8_type_info,
getter, setter, NULL, (void *)v);
}
@@ -2898,7 +2898,7 @@ object_property_add_uint16_ptr(Object *obj, const char *name,
setter = property_set_uint16_ptr;
}
- return object_property_add(obj, name, "uint16", NULL,
+ return object_property_add(obj, name, "uint16", &uint16_type_info,
getter, setter, NULL, (void *)v);
}
@@ -2918,7 +2918,7 @@ object_class_property_add_uint16_ptr(ObjectClass *klass, const char *name,
setter = property_class_set_uint16_ptr;
}
- return object_class_property_add(klass, name, "uint16", NULL,
+ return object_class_property_add(klass, name, "uint16", &uint16_type_info,
getter, setter, NULL, (void *)offset);
}
@@ -2939,7 +2939,7 @@ object_class_static_property_add_uint16_ptr(ObjectClass *klass,
setter = property_set_uint16_ptr;
}
- return object_class_property_add(klass, name, "uint16", NULL,
+ return object_class_property_add(klass, name, "uint16", &uint16_type_info,
getter, setter, NULL, (void *)v);
}
@@ -2959,7 +2959,7 @@ object_property_add_uint32_ptr(Object *obj, const char *name,
setter = property_set_uint32_ptr;
}
- return object_property_add(obj, name, "uint32", NULL,
+ return object_property_add(obj, name, "uint32", &uint32_type_info,
getter, setter, NULL, (void *)v);
}
@@ -2979,7 +2979,7 @@ object_class_property_add_uint32_ptr(ObjectClass *klass, const char *name,
setter = property_class_set_uint32_ptr;
}
- return object_class_property_add(klass, name, "uint32", NULL,
+ return object_class_property_add(klass, name, "uint32", &uint32_type_info,
getter, setter, NULL, (void *)offset);
}
@@ -3000,7 +3000,7 @@ object_class_static_property_add_uint32_ptr(ObjectClass *klass,
setter = property_set_uint32_ptr;
}
- return object_class_property_add(klass, name, "uint32", NULL,
+ return object_class_property_add(klass, name, "uint32", &uint32_type_info,
getter, setter, NULL, (void *)v);
}
@@ -3020,7 +3020,7 @@ object_property_add_uint64_ptr(Object *obj, const char *name,
setter = property_set_uint64_ptr;
}
- return object_property_add(obj, name, "uint64", NULL,
+ return object_property_add(obj, name, "uint64", &uint64_type_info,
getter, setter, NULL, (void *)v);
}
@@ -3040,7 +3040,7 @@ object_class_property_add_uint64_ptr(ObjectClass *klass, const char *name,
setter = property_class_set_uint64_ptr;
}
- return object_class_property_add(klass, name, "uint64", NULL,
+ return object_class_property_add(klass, name, "uint64", &uint64_type_info,
getter, setter, NULL, (void *)offset);
}
@@ -3061,7 +3061,7 @@ object_class_static_property_add_uint64_ptr(ObjectClass *klass,
setter = property_set_uint64_ptr;
}
- return object_class_property_add(klass, name, "uint64", NULL,
+ return object_class_property_add(klass, name, "uint64", &uint64_type_info,
getter, setter, NULL, (void *)v);
}
diff --git a/system/bootdevice.c b/system/bootdevice.c
index 4fc6b4c8ed..36eb582dee 100644
--- a/system/bootdevice.c
+++ b/system/bootdevice.c
@@ -24,6 +24,7 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "system/system.h"
#include "qapi/visitor.h"
#include "qemu/error-report.h"
@@ -336,7 +337,7 @@ void device_add_bootindex_property(Object *obj, int32_t *bootindex,
prop->suffix = suffix;
prop->dev = dev;
- object_property_add(obj, name, "int32", NULL,
+ object_property_add(obj, name, "int32", &int32_type_info,
device_get_bootindex,
device_set_bootindex,
property_release_bootindex,
diff --git a/system/memory.c b/system/memory.c
index ac296cb0d8..56c5dd6c8a 100644
--- a/system/memory.c
+++ b/system/memory.c
@@ -16,6 +16,7 @@
#include "qemu/osdep.h"
#include "qemu/log.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "system/memory.h"
#include "qapi/visitor.h"
#include "qemu/bitops.h"
@@ -1293,11 +1294,11 @@ static void memory_region_initfn(Object *obj)
object_property_add_uint64_ptr(OBJECT(mr), "addr",
&mr->addr, OBJ_PROP_FLAG_READ);
- object_property_add(OBJECT(mr), "priority", "int32", NULL,
+ object_property_add(OBJECT(mr), "priority", "int32", &int32_type_info,
memory_region_get_priority,
NULL, /* memory_region_set_priority */
NULL, NULL);
- object_property_add(OBJECT(mr), "size", "uint64", NULL,
+ object_property_add(OBJECT(mr), "size", "uint64", &uint64_type_info,
memory_region_get_size,
NULL, /* memory_region_set_size, */
NULL, NULL);
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
index 9c869b4488..2a0f61e42d 100644
--- a/target/arm/cpu64.c
+++ b/target/arm/cpu64.c
@@ -20,6 +20,7 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "cpu.h"
#include "cpregs.h"
#include "qemu/module.h"
@@ -328,7 +329,8 @@ static void prop_bool_set_false(Object *obj, Visitor *v, const char *name,
static void prop_add_stub_bool(Object *obj, const char *name)
{
- object_property_add(obj, name, "bool", NULL, prop_bool_get_false,
+ object_property_add(obj, name, "bool", &bool_type_info,
+ prop_bool_get_false,
prop_bool_set_false, NULL, NULL);
}
@@ -518,13 +520,15 @@ void aarch64_add_sve_properties(Object *obj)
for (vq = 1; vq <= ARM_MAX_VQ; ++vq) {
char name[8];
snprintf(name, sizeof(name), "sve%d", vq * 128);
- object_property_add(obj, name, "bool", NULL, cpu_arm_get_vq,
+ object_property_add(obj, name, "bool", &bool_type_info,
+ cpu_arm_get_vq,
cpu_arm_set_vq, NULL, &cpu->sve_vq);
}
#ifdef CONFIG_USER_ONLY
/* Mirror linux /proc/sys/abi/sve_default_vector_length. */
- object_property_add(obj, "sve-default-vector-length", "int32", NULL,
+ object_property_add(obj, "sve-default-vector-length", "int32",
+ &int32_type_info,
cpu_arm_get_default_vec_len,
cpu_arm_set_default_vec_len, NULL,
&cpu->sve_default_vq);
@@ -543,13 +547,15 @@ void aarch64_add_sme_properties(Object *obj)
for (vq = 1; vq <= ARM_MAX_VQ; vq <<= 1) {
char name[8];
snprintf(name, sizeof(name), "sme%d", vq * 128);
- object_property_add(obj, name, "bool", NULL, cpu_arm_get_vq,
+ object_property_add(obj, name, "bool", &bool_type_info,
+ cpu_arm_get_vq,
cpu_arm_set_vq, NULL, &cpu->sme_vq);
}
#ifdef CONFIG_USER_ONLY
/* Mirror linux /proc/sys/abi/sme_default_vector_length. */
- object_property_add(obj, "sme-default-vector-length", "int32", NULL,
+ object_property_add(obj, "sme-default-vector-length", "int32",
+ &int32_type_info,
cpu_arm_get_default_vec_len,
cpu_arm_set_default_vec_len, NULL,
&cpu->sme_default_vq);
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index 8a698a9d20..5c78a64b47 100644
--- a/target/arm/kvm.c
+++ b/target/arm/kvm.c
@@ -20,6 +20,7 @@
#include "qemu/main-loop.h"
#include "qom/object.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "system/system.h"
#include "system/runstate.h"
#include "system/ramblock.h"
@@ -1820,7 +1821,7 @@ static void kvm_arch_set_eager_split_size(Object *obj, Visitor *v,
void kvm_arch_accel_class_init(ObjectClass *oc)
{
- object_class_property_add(oc, "eager-split-size", "size", NULL,
+ object_class_property_add(oc, "eager-split-size", "size", &size_type_info,
kvm_arch_get_eager_split_size,
kvm_arch_set_eager_split_size, NULL, NULL);
diff --git a/target/arm/tcg/cpu64.c b/target/arm/tcg/cpu64.c
index 79df821da8..026d074868 100644
--- a/target/arm/tcg/cpu64.c
+++ b/target/arm/tcg/cpu64.c
@@ -20,6 +20,7 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "cpu.h"
#include "qemu/module.h"
#include "qapi/visitor.h"
@@ -1392,7 +1393,7 @@ void aarch64_max_v8_tcg_initfn(Object *obj)
/* v8.2: FEAT_SVE */
cpu->sve_vq.supported = MAKE_64BIT_MASK(0, ARM_MAX_VQ);
aarch64_add_sve_properties(OBJECT(cpu));
- object_property_add(OBJECT(cpu), "sve-max-vq", "uint32", NULL,
+ object_property_add(OBJECT(cpu), "sve-max-vq", "uint32", &uint32_type_info,
cpu_max_get_sve_max_vq, cpu_max_set_sve_max_vq,
NULL, NULL);
@@ -1529,7 +1530,8 @@ void aarch64_max_v9_tcg_initfn(Object *obj)
object_property_add_bool(obj, "x-rme", cpu_arm_get_rme, cpu_arm_set_rme);
/* v9.4: FEAT_RME_GPC2 */
- object_property_add(obj, "x-l0gptsz", "uint32", NULL, cpu_max_get_l0gptsz,
+ object_property_add(obj, "x-l0gptsz", "uint32", &uint32_type_info,
+ cpu_max_get_l0gptsz,
cpu_max_set_l0gptsz, NULL, NULL);
}
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 6a05a7144a..9ee96cbe39 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -10486,7 +10486,7 @@ static void x86_cpu_register_bit_prop(X86CPUClass *xcc,
fp = g_new0(BitProperty, 1);
fp->w = w;
fp->mask = mask;
- object_class_property_add(oc, prop_name, "bool", NULL,
+ object_class_property_add(oc, prop_name, "bool", &bool_type_info,
x86_cpu_get_bit_prop,
x86_cpu_set_bit_prop,
NULL, fp);
@@ -11009,13 +11009,13 @@ static void x86_cpu_common_class_init(ObjectClass *oc, const void *data)
dc->user_creatable = true;
- object_class_property_add(oc, "family", "uint64", NULL,
+ object_class_property_add(oc, "family", "uint64", &uint64_type_info,
x86_cpuid_version_get_family,
x86_cpuid_version_set_family, NULL, NULL);
- object_class_property_add(oc, "model", "uint64", NULL,
+ object_class_property_add(oc, "model", "uint64", &uint64_type_info,
x86_cpuid_version_get_model,
x86_cpuid_version_set_model, NULL, NULL);
- object_class_property_add(oc, "stepping", "uint64", NULL,
+ object_class_property_add(oc, "stepping", "uint64", &uint64_type_info,
x86_cpuid_version_get_stepping,
x86_cpuid_version_set_stepping, NULL, NULL);
object_class_property_add_str(oc, "vendor",
@@ -11024,7 +11024,7 @@ static void x86_cpu_common_class_init(ObjectClass *oc, const void *data)
object_class_property_add_str(oc, "model-id",
x86_cpuid_get_model_id,
x86_cpuid_set_model_id);
- object_class_property_add(oc, "tsc-frequency", "int", NULL,
+ object_class_property_add(oc, "tsc-frequency", "int", &int_type_info,
x86_cpuid_get_tsc_freq,
x86_cpuid_set_tsc_freq, NULL, NULL);
/*
@@ -11037,7 +11037,8 @@ static void x86_cpu_common_class_init(ObjectClass *oc, const void *data)
x86_cpu_get_unavailable_features,
NULL, NULL, NULL);
- object_class_property_add(oc, "avx10-version", "uint8", NULL,
+ object_class_property_add(oc, "avx10-version", "uint8",
+ &uint8_type_info,
x86_cpuid_get_avx10_version,
x86_cpuid_set_avx10_version,
NULL, NULL);
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index 0f71e75b60..e003e47c5b 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -7098,7 +7098,7 @@ void kvm_arch_accel_class_init(ObjectClass *oc)
object_class_property_set_description(oc, "notify-vmexit",
"Enable notify VM exit");
- object_class_property_add(oc, "notify-window", "uint32", NULL,
+ object_class_property_add(oc, "notify-window", "uint32", &uint32_type_info,
kvm_arch_get_notify_window,
kvm_arch_set_notify_window,
NULL, NULL);
@@ -7106,7 +7106,7 @@ void kvm_arch_accel_class_init(ObjectClass *oc)
"Clock cycles without an event window "
"after which a notification VM exit occurs");
- object_class_property_add(oc, "xen-version", "uint32", NULL,
+ object_class_property_add(oc, "xen-version", "uint32", &uint32_type_info,
kvm_arch_get_xen_version,
kvm_arch_set_xen_version,
NULL, NULL);
@@ -7115,14 +7115,16 @@ void kvm_arch_accel_class_init(ObjectClass *oc)
"(in XENVER_version form "
"e.g. 0x4000a for 4.10)");
- object_class_property_add(oc, "xen-gnttab-max-frames", "uint16", NULL,
+ object_class_property_add(oc, "xen-gnttab-max-frames", "uint16",
+ &uint16_type_info,
kvm_arch_get_xen_gnttab_max_frames,
kvm_arch_set_xen_gnttab_max_frames,
NULL, NULL);
object_class_property_set_description(oc, "xen-gnttab-max-frames",
"Maximum number of grant table frames");
- object_class_property_add(oc, "xen-evtchn-max-pirq", "uint16", NULL,
+ object_class_property_add(oc, "xen-evtchn-max-pirq", "uint16",
+ &uint16_type_info,
kvm_arch_get_xen_evtchn_max_pirq,
kvm_arch_set_xen_evtchn_max_pirq,
NULL, NULL);
diff --git a/target/i386/sev.c b/target/i386/sev.c
index d19f98e1c7..c1c12d1125 100644
--- a/target/i386/sev.c
+++ b/target/i386/sev.c
@@ -3051,7 +3051,8 @@ sev_guest_instance_init(Object *obj)
sev_guest->policy = DEFAULT_GUEST_POLICY;
object_property_add_uint32_ptr(obj, "handle", &sev_guest->handle,
OBJ_PROP_FLAG_READWRITE);
- object_property_add(obj, "policy", "uint32", NULL, sev_guest_get_policy,
+ object_property_add(obj, "policy", "uint32", &uint32_type_info,
+ sev_guest_get_policy,
sev_guest_set_policy, NULL, NULL);
object_apply_compat_props(obj);
@@ -3329,7 +3330,7 @@ sev_snp_guest_class_init(ObjectClass *oc, const void *data)
x86_klass->adjust_cpuid_features = sev_snp_adjust_cpuid_features;
x86_klass->kvm_type = sev_snp_kvm_type;
- object_class_property_add(oc, "policy", "uint64", NULL,
+ object_class_property_add(oc, "policy", "uint64", &uint64_type_info,
sev_snp_guest_get_policy,
sev_snp_guest_set_policy, NULL, NULL);
object_class_property_add_str(oc, "guest-visible-workarounds",
@@ -3353,7 +3354,7 @@ sev_snp_guest_class_init(ObjectClass *oc, const void *data)
object_class_property_add_bool(oc, "secure-tsc",
sev_snp_guest_get_secure_tsc,
sev_snp_guest_set_secure_tsc);
- object_class_property_add(oc, "tsc-frequency", "uint32", NULL,
+ object_class_property_add(oc, "tsc-frequency", "uint32", &uint64_type_info,
sev_snp_guest_get_tsc_frequency,
sev_snp_guest_set_tsc_frequency, NULL, NULL);
}
diff --git a/target/ppc/compat.c b/target/ppc/compat.c
index 78f4b23122..8740c8727b 100644
--- a/target/ppc/compat.c
+++ b/target/ppc/compat.c
@@ -23,6 +23,7 @@
#include "kvm_ppc.h"
#include "system/cpus.h"
#include "qemu/error-report.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/error.h"
#include "qapi/visitor.h"
#include "cpu-models.h"
@@ -335,7 +336,7 @@ void ppc_compat_add_property(Object *obj, const char *name,
gchar *names, *desc;
int i;
- object_property_add(obj, name, "string", NULL,
+ object_property_add(obj, name, "string", &str_type_info,
ppc_compat_prop_get, ppc_compat_prop_set, NULL,
compat_pvr);
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 85b674217e..adb53aad96 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -29,6 +29,7 @@
#include "target/riscv/tcg/csr.h"
#include "internals.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qemu/error-report.h"
#include "qemu/timer.h"
@@ -1412,20 +1413,26 @@ void riscv_add_satp_mode_properties(Object *obj)
{
RISCVCPU *cpu = RISCV_CPU(obj);
- object_property_add(obj, "svbare", "bool", NULL, cpu_riscv_get_satp,
+ object_property_add(obj, "svbare", "bool", &bool_type_info,
+ cpu_riscv_get_satp,
cpu_riscv_set_satp, NULL, &cpu->satp_modes);
if (cpu->env.misa_mxl == MXL_RV32) {
- object_property_add(obj, "sv32", "bool", NULL, cpu_riscv_get_satp,
+ object_property_add(obj, "sv32", "bool", &bool_type_info,
+ cpu_riscv_get_satp,
cpu_riscv_set_satp, NULL, &cpu->satp_modes);
} else {
- object_property_add(obj, "sv39", "bool", NULL, cpu_riscv_get_satp,
+ object_property_add(obj, "sv39", "bool", &bool_type_info,
+ cpu_riscv_get_satp,
cpu_riscv_set_satp, NULL, &cpu->satp_modes);
- object_property_add(obj, "sv48", "bool", NULL, cpu_riscv_get_satp,
+ object_property_add(obj, "sv48", "bool", &bool_type_info,
+ cpu_riscv_get_satp,
cpu_riscv_set_satp, NULL, &cpu->satp_modes);
- object_property_add(obj, "sv57", "bool", NULL, cpu_riscv_get_satp,
+ object_property_add(obj, "sv57", "bool", &bool_type_info,
+ cpu_riscv_get_satp,
cpu_riscv_set_satp, NULL, &cpu->satp_modes);
- object_property_add(obj, "sv64", "bool", NULL, cpu_riscv_get_satp,
+ object_property_add(obj, "sv64", "bool", &bool_type_info,
+ cpu_riscv_get_satp,
cpu_riscv_set_satp, NULL, &cpu->satp_modes);
}
}
diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
index 9bccd59809..21b675c74c 100644
--- a/target/riscv/kvm/kvm-cpu.c
+++ b/target/riscv/kvm/kvm-cpu.c
@@ -24,6 +24,7 @@
#include "qemu/timer.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qemu/error-report.h"
#include "qemu/main-loop.h"
#include "qemu/target-info.h"
@@ -541,7 +542,7 @@ static void riscv_cpu_add_kvm_unavail_prop(Object *obj, const char *prop_name)
* unknown to KVM and error out if the user attempts
* to enable any of them.
*/
- object_property_add(obj, prop_name, "bool", NULL,
+ object_property_add(obj, prop_name, "bool", &bool_type_info,
cpu_get_cfg_unavailable,
cpu_set_cfg_unavailable,
NULL, (void *)prop_name);
@@ -561,7 +562,7 @@ static void kvm_riscv_add_cpu_user_properties(Object *cpu_obj)
misa_cfg->name = riscv_get_misa_ext_name(bit);
misa_cfg->description = riscv_get_misa_ext_description(bit);
- object_property_add(cpu_obj, misa_cfg->name, "bool", NULL,
+ object_property_add(cpu_obj, misa_cfg->name, "bool", &bool_type_info,
kvm_cpu_get_misa_ext_cfg,
kvm_cpu_set_misa_ext_cfg,
NULL, misa_cfg);
@@ -577,7 +578,7 @@ static void kvm_riscv_add_cpu_user_properties(Object *cpu_obj)
for (i = 0; i < ARRAY_SIZE(kvm_multi_ext_cfgs); i++) {
KVMCPUConfig *multi_cfg = &kvm_multi_ext_cfgs[i];
- object_property_add(cpu_obj, multi_cfg->name, "bool", NULL,
+ object_property_add(cpu_obj, multi_cfg->name, "bool", &bool_type_info,
kvm_cpu_get_multi_ext_cfg,
kvm_cpu_set_multi_ext_cfg,
NULL, multi_cfg);
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index df73f45829..5834ec1524 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -26,6 +26,7 @@
#include "pmu.h"
#include "time_helper.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qemu/accel.h"
#include "qemu/error-report.h"
@@ -1478,7 +1479,7 @@ static void riscv_cpu_add_misa_properties(Object *cpu_obj)
continue;
}
- object_property_add(cpu_obj, name, "bool", NULL,
+ object_property_add(cpu_obj, name, "bool", &bool_type_info,
cpu_get_misa_ext_cfg,
cpu_set_misa_ext_cfg,
NULL, (void *)misa_cfg);
@@ -1532,7 +1533,7 @@ static void riscv_cpu_add_profiles(Object *cpu_obj)
for (int i = 0; riscv_profiles[i] != NULL; i++) {
RISCVCPUProfile *profile = riscv_profiles[i];
- object_property_add(cpu_obj, profile->name, "bool", NULL,
+ object_property_add(cpu_obj, profile->name, "bool", &bool_type_info,
cpu_get_profile, cpu_set_profile,
NULL, (void *)profile);
@@ -1608,7 +1609,7 @@ static void riscv_cpu_add_user_properties(Object *obj)
for (edata = isa_edata_arr; edata && edata->name; edata++) {
if (edata->prop_name) {
- object_property_add(obj, edata->prop_name, "bool", NULL,
+ object_property_add(obj, edata->prop_name, "bool", &bool_type_info,
cpu_get_multi_ext_cfg,
cpu_set_multi_ext_cfg,
NULL, (void *)&edata->ext_enable_offset);
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index 0718df791f..abbfa96646 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -17,6 +17,7 @@
#include "system/kvm.h"
#include "system/tcg.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qemu/error-report.h"
#include "qapi/visitor.h"
#include "qemu/module.h"
@@ -792,13 +793,14 @@ void s390_cpu_model_class_register_props(ObjectClass *oc)
for (feat = 0; feat < S390_FEAT_MAX; feat++) {
const S390FeatDef *def = s390_feat_def(feat);
- object_class_property_add(oc, def->name, "bool", NULL, get_feature,
+ object_class_property_add(oc, def->name, "bool", &bool_type_info,
+ get_feature,
set_feature, NULL, (void *) feat);
object_class_property_set_description(oc, def->name, def->desc);
}
for (group = 0; group < S390_FEAT_GROUP_MAX; group++) {
const S390FeatGroupDef *def = s390_feat_group_def(group);
- object_class_property_add(oc, def->name, "bool", NULL,
+ object_class_property_add(oc, def->name, "bool", &bool_type_info,
get_feature_group,
set_feature_group, NULL, (void *) group);
object_class_property_set_description(oc, def->name, def->desc);
diff --git a/tests/unit/test-qdev-global-props.c b/tests/unit/test-qdev-global-props.c
index 35fb5eca6f..e32c0eee55 100644
--- a/tests/unit/test-qdev-global-props.c
+++ b/tests/unit/test-qdev-global-props.c
@@ -27,6 +27,7 @@
#include "hw/core/qdev-properties.h"
#include "qom/object.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
@@ -171,11 +172,11 @@ static void prop2_accessor(Object *obj, Visitor *v, const char *name,
static void dynamic_instance_init(Object *obj)
{
- object_property_add(obj, "prop1", "uint32", NULL, prop1_accessor,
- prop1_accessor,
+ object_property_add(obj, "prop1", "uint32", &uint32_type_info,
+ prop1_accessor, prop1_accessor,
NULL, NULL);
- object_property_add(obj, "prop2", "uint32", NULL, prop2_accessor,
- prop2_accessor,
+ object_property_add(obj, "prop2", "uint32", &uint32_type_info,
+ prop2_accessor, prop2_accessor,
NULL, NULL);
}
diff --git a/ui/console.c b/ui/console.c
index 732b4afee0..c995abc5d1 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -28,6 +28,7 @@
#include "ui/vgafont.h"
#include "hw/core/qdev.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/qapi-commands-ui.h"
#include "qapi/visitor.h"
#include "qemu/coroutine.h"
@@ -535,7 +536,7 @@ qemu_graphic_console_class_init(ObjectClass *oc, const void *data)
offsetof(QemuGraphicConsole, device),
object_property_allow_set_link,
OBJ_PROP_LINK_STRONG);
- object_class_property_add(oc, "head", "uint32", NULL,
+ object_class_property_add(oc, "head", "uint32", &uint32_type_info,
qemu_graphic_console_prop_get_head,
NULL, NULL, NULL);
diff --git a/util/thread-context.c b/util/thread-context.c
index 4fe7a6c8f4..d653178048 100644
--- a/util/thread-context.c
+++ b/util/thread-context.c
@@ -13,6 +13,7 @@
#include "qemu/osdep.h"
#include "qemu/thread-context.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/qapi-builtin-visit.h"
#include "qapi/visitor.h"
#include "qemu/config-file.h"
@@ -278,13 +279,16 @@ static void thread_context_class_init(ObjectClass *oc, const void *data)
UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);
ucc->complete = thread_context_instance_complete;
- object_class_property_add(oc, "thread-id", "uint64", NULL,
+ object_class_property_add(oc, "thread-id", "uint64",
+ &uint64_type_info,
thread_context_get_thread_id, NULL, NULL,
NULL);
- object_class_property_add(oc, "cpu-affinity", "[uint16]", NULL,
+ object_class_property_add(oc, "cpu-affinity", "[uint16]",
+ &uint16List_type_info,
thread_context_get_cpu_affinity,
thread_context_set_cpu_affinity, NULL, NULL);
- object_class_property_add(oc, "node-affinity", "[uint16]", NULL, NULL,
+ object_class_property_add(oc, "node-affinity", "[uint16]",
+ &uint16List_type_info, NULL,
thread_context_set_node_affinity, NULL, NULL);
}
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 37/56] i386/cpu: convert strList property to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (35 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 36/56] qom: convert scalar properties to QAPI-aware registration Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:16 ` [PATCH v8 38/56] accel/hvf: convert OnOffSplit " Markus Armbruster
` (18 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Pass appropriate QAPITypeInfo to object_class_property_add().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
target/i386/cpu.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 9ee96cbe39..eab0d5a4d4 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -11033,7 +11033,8 @@ static void x86_cpu_common_class_init(ObjectClass *oc, const void *data)
* QMP command: they list the features that would have prevented the
* CPU from running if the "enforce" flag was set.
*/
- object_class_property_add(oc, "unavailable-features", "strList", NULL,
+ object_class_property_add(oc, "unavailable-features", "strList",
+ &strList_type_info,
x86_cpu_get_unavailable_features,
NULL, NULL, NULL);
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 38/56] accel/hvf: convert OnOffSplit property to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (36 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 37/56] i386/cpu: convert strList property " Markus Armbruster
@ 2026-11-01 20:16 ` Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 39/56] i386/x86: convert SgxEPCList " Markus Armbruster
` (17 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:16 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Convert the OnOffSplit property from manual visitor-based
callbacks to object_class_property_add_enum().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
accel/hvf/hvf-all.c | 24 ++++++++----------------
1 file changed, 8 insertions(+), 16 deletions(-)
diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c
index 213ee15b4a..938379b9f2 100644
--- a/accel/hvf/hvf-all.c
+++ b/accel/hvf/hvf-all.c
@@ -11,6 +11,7 @@
#include "qemu/osdep.h"
#include "qemu/error-report.h"
#include "qapi/error.h"
+#include "qapi/qapi-type-infos-common.h"
#include "qapi/qapi-visit-common.h"
#include "accel/accel-ops.h"
#include "exec/cpu-common.h"
@@ -230,18 +231,12 @@ static int hvf_accel_init(AccelState *as, MachineState *ms)
return hvf_arch_init();
}
-static void hvf_set_kernel_irqchip(Object *obj, Visitor *v,
- const char *name, void *opaque,
+static void hvf_set_kernel_irqchip(Object *obj, int value,
Error **errp)
{
- OnOffSplit mode;
-
hvf_kernel_irqchip_override = true;
- if (!visit_type_OnOffSplit(v, name, &mode, errp)) {
- return;
- }
- switch (mode) {
+ switch (value) {
case ON_OFF_SPLIT_ON:
#ifdef HOST_X86_64
/* macOS 12 onwards exposes an HVF virtual APIC. */
@@ -261,11 +256,7 @@ static void hvf_set_kernel_irqchip(Object *obj, Visitor *v,
break;
default:
- /*
- * The value was checked in visit_type_OnOffSplit() above. If
- * we get here, then something is wrong in QEMU.
- */
- abort();
+ g_assert_not_reached();
}
}
@@ -277,9 +268,10 @@ static void hvf_accel_class_init(ObjectClass *oc, const void *data)
ac->allowed = &hvf_allowed;
hvf_kernel_irqchip_override = false;
hvf_kernel_irqchip = false;
- object_class_property_add(oc, "kernel-irqchip", "on|off|split", NULL,
- NULL, hvf_set_kernel_irqchip,
- NULL, NULL);
+
+ object_class_property_add_enum(oc, "kernel-irqchip", "on|off|split",
+ &OnOffSplit_type_info, NULL,
+ NULL, hvf_set_kernel_irqchip);
object_class_property_set_description(oc, "kernel-irqchip",
"Configure HVF irqchip");
}
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 39/56] i386/x86: convert SgxEPCList property to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (37 preceding siblings ...)
2026-11-01 20:16 ` [PATCH v8 38/56] accel/hvf: convert OnOffSplit " Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 40/56] virtio-balloon: convert guest-stats property to QAPI type Markus Armbruster
` (16 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Pass appropriate QAPITypeInfo to object_class_property_add().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/i386/x86.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hw/i386/x86.c b/hw/i386/x86.c
index b490c4e715..4e5a7cf270 100644
--- a/hw/i386/x86.c
+++ b/hw/i386/x86.c
@@ -25,6 +25,7 @@
#include "qemu/units.h"
#include "qapi/error.h"
#include "qapi/qapi-type-infos-common.h"
+#include "qapi/qapi-type-infos-machine.h"
#include "qapi/qapi-visit-machine.h"
#include "qapi/visitor.h"
#include "system/qtest.h"
@@ -423,7 +424,7 @@ static void x86_machine_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, X86_MACHINE_BUS_LOCK_RATELIMIT,
"Set the ratelimit for the bus locks acquired in VMs");
- object_class_property_add(oc, "sgx-epc", "SgxEPC", NULL,
+ object_class_property_add(oc, "sgx-epc", "SgxEPC", &SgxEPCList_type_info,
machine_get_sgx_epc, machine_set_sgx_epc,
NULL, NULL);
object_class_property_set_description(oc, "sgx-epc",
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 40/56] virtio-balloon: convert guest-stats property to QAPI type
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (38 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 39/56] i386/x86: convert SgxEPCList " Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 41/56] qom: replace object_property_add_tm with StructTm " Markus Armbruster
` (15 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Define VirtioBalloonStats and VirtioBalloonGuestStats QAPI struct types
in the schema, replacing the hand-rolled visitor in balloon_stats_get_all()
with a generated visit_type_VirtioBalloonGuestStats() call.
The wire format is preserved: the JSON output from qom-get is identical
to the previous hand-rolled visitor output.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
docs/interop/virtio-balloon-stats.rst | 22 +------
qapi/machine.json | 88 +++++++++++++++++++++++++++
hw/virtio/virtio-balloon.c | 85 +++++++++-----------------
3 files changed, 119 insertions(+), 76 deletions(-)
diff --git a/docs/interop/virtio-balloon-stats.rst b/docs/interop/virtio-balloon-stats.rst
index b9a6a6edb2..88d3271bbb 100644
--- a/docs/interop/virtio-balloon-stats.rst
+++ b/docs/interop/virtio-balloon-stats.rst
@@ -22,27 +22,7 @@ polling the guest's balloon driver for new stats in the specified time
interval.
To retrieve those stats, clients have to query the guest-stats property,
-which will return a dictionary containing:
-
- * A key named 'stats', containing all available stats. If the guest
- doesn't support a particular stat, or if it couldn't be retrieved,
- its value will be -1. Currently, the following stats are supported:
-
- - stat-swap-in
- - stat-swap-out
- - stat-major-faults
- - stat-minor-faults
- - stat-free-memory
- - stat-total-memory
- - stat-available-memory
- - stat-disk-caches
- - stat-htlb-pgalloc
- - stat-htlb-pgfail
-
- * A key named last-update, which contains the last stats update
- timestamp in seconds. Since this timestamp is generated by the host,
- a buggy guest can't influence its value. The value is 0 if the guest
- has not updated the stats (yet).
+which will return a VirtioBalloonGuestStats (see QAPI documentation).
It's also important to note the following:
diff --git a/qapi/machine.json b/qapi/machine.json
index 9b145c635b..80348b5350 100644
--- a/qapi/machine.json
+++ b/qapi/machine.json
@@ -1126,6 +1126,94 @@
##
{ 'struct': 'BalloonInfo', 'data': {'actual': 'int' } }
+##
+# @VirtioBalloonStats:
+# VirtIO balloon device guest memory statistics.
+#
+# If the guest doesn't support a particular stat, or if it couldn't be
+# retrieved, its value will be -1.
+#
+# @stat-swap-in: The amount of memory that has been swapped in (in
+# bytes).
+#
+# @stat-swap-out: The amount of memory that has been swapped out to
+# disk (in bytes).
+#
+# @stat-major-faults: The number of major page faults that have
+# occurred.
+#
+# @stat-minor-faults: The number of minor page faults that have
+# occurred.
+#
+# @stat-free-memory: The amount of memory not being used for any
+# purpose (in bytes).
+#
+# @stat-total-memory: The total amount of memory available (in bytes).
+#
+# @stat-available-memory: An estimate of how much memory is available
+# (in bytes) for starting new applications, without pushing the
+# system to swap.
+#
+# @stat-disk-caches: The amount of memory, in bytes, that can be
+# quickly reclaimed without additional I/O. Typically these pages
+# are used for caching files from disk.
+#
+# @stat-htlb-pgalloc: The number of successful hugetlb page
+# allocations
+#
+# @stat-htlb-pgfail: The number of failed hugetlb page allocations
+#
+# @stat-oom-kills: The number of OOM killer invocations
+#
+# @stat-alloc-stalls: The number of memory allocation stalls
+#
+# @stat-async-scans: The number of memory scanned asynchronously
+#
+# @stat-direct-scans: The number of memory scanned directly
+#
+# @stat-async-reclaims: The number of memory reclaimed asynchronously
+#
+# @stat-direct-reclaims: The number of memory reclaimed directly
+#
+# Since: 11.2
+##
+{ 'struct': 'VirtioBalloonStats',
+ 'data': {
+ 'stat-swap-in': 'uint64',
+ 'stat-swap-out': 'uint64',
+ 'stat-major-faults': 'uint64',
+ 'stat-minor-faults': 'uint64',
+ 'stat-free-memory': 'uint64',
+ 'stat-total-memory': 'uint64',
+ 'stat-available-memory': 'uint64',
+ 'stat-disk-caches': 'uint64',
+ 'stat-htlb-pgalloc': 'uint64',
+ 'stat-htlb-pgfail': 'uint64',
+ 'stat-oom-kills': 'uint64',
+ 'stat-alloc-stalls': 'uint64',
+ 'stat-async-scans': 'uint64',
+ 'stat-direct-scans': 'uint64',
+ 'stat-async-reclaims': 'uint64',
+ 'stat-direct-reclaims': 'uint64' } }
+
+##
+# @VirtioBalloonGuestStats:
+# Guest statistics from the VirtIO balloon device.
+#
+# @last-update: Timestamp in seconds of the last stats update from the
+# guest. Since this timestamp is generated by the host, a buggy
+# guest can't influence its value. The value is 0 if the guest
+# has not updated the stats, yet.
+#
+# @stats: balloon memory statistics
+#
+# Since: 11.2
+##
+{ 'struct': 'VirtioBalloonGuestStats',
+ 'data': {
+ 'last-update': 'int',
+ 'stats': 'VirtioBalloonStats' } }
+
##
# @query-balloon:
# Return information about the balloon device.
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
index 366f88e048..547173e035 100644
--- a/hw/virtio/virtio-balloon.c
+++ b/hw/virtio/virtio-balloon.c
@@ -29,6 +29,8 @@
#include "qapi/error.h"
#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/qapi-events-machine.h"
+#include "qapi/qapi-type-infos-machine.h"
+#include "qapi/qapi-visit-machine.h"
#include "qapi/visitor.h"
#include "trace.h"
#include "qemu/error-report.h"
@@ -170,34 +172,6 @@ static void balloon_deflate_page(VirtIOBalloon *balloon,
}
}
-/*
- * All stats upto VIRTIO_BALLOON_S_NR /must/ have a
- * non-NULL name declared here, since these are used
- * as keys for populating the QDict with stats
- */
-static const char *balloon_stat_names[] = {
- [VIRTIO_BALLOON_S_SWAP_IN] = "stat-swap-in",
- [VIRTIO_BALLOON_S_SWAP_OUT] = "stat-swap-out",
- [VIRTIO_BALLOON_S_MAJFLT] = "stat-major-faults",
- [VIRTIO_BALLOON_S_MINFLT] = "stat-minor-faults",
- [VIRTIO_BALLOON_S_MEMFREE] = "stat-free-memory",
-
- [VIRTIO_BALLOON_S_MEMTOT] = "stat-total-memory",
- [VIRTIO_BALLOON_S_AVAIL] = "stat-available-memory",
- [VIRTIO_BALLOON_S_CACHES] = "stat-disk-caches",
- [VIRTIO_BALLOON_S_HTLB_PGALLOC] = "stat-htlb-pgalloc",
- [VIRTIO_BALLOON_S_HTLB_PGFAIL] = "stat-htlb-pgfail",
-
- [VIRTIO_BALLOON_S_OOM_KILL] = "stat-oom-kills",
- [VIRTIO_BALLOON_S_ALLOC_STALL] = "stat-alloc-stalls",
- [VIRTIO_BALLOON_S_ASYNC_SCAN] = "stat-async-scans",
- [VIRTIO_BALLOON_S_DIRECT_SCAN] = "stat-direct-scans",
- [VIRTIO_BALLOON_S_ASYNC_RECLAIM] = "stat-async-reclaims",
-
- [VIRTIO_BALLOON_S_DIRECT_RECLAIM] = "stat-direct-reclaims",
-};
-G_STATIC_ASSERT(G_N_ELEMENTS(balloon_stat_names) == VIRTIO_BALLOON_S_NR);
-
/*
* reset_stats - Mark all items in the stats array as unset
*
@@ -258,33 +232,33 @@ static void balloon_stats_get_all(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
VirtIOBalloon *s = VIRTIO_BALLOON(obj);
- bool ok = false;
- int i;
+ VirtioBalloonStats stats = {
+ .stat_swap_in = s->stats[VIRTIO_BALLOON_S_SWAP_IN],
+ .stat_swap_out = s->stats[VIRTIO_BALLOON_S_SWAP_OUT],
+ .stat_major_faults = s->stats[VIRTIO_BALLOON_S_MAJFLT],
+ .stat_minor_faults = s->stats[VIRTIO_BALLOON_S_MINFLT],
+ .stat_free_memory = s->stats[VIRTIO_BALLOON_S_MEMFREE],
+ .stat_total_memory = s->stats[VIRTIO_BALLOON_S_MEMTOT],
+ .stat_available_memory = s->stats[VIRTIO_BALLOON_S_AVAIL],
+ .stat_disk_caches = s->stats[VIRTIO_BALLOON_S_CACHES],
+ .stat_htlb_pgalloc = s->stats[VIRTIO_BALLOON_S_HTLB_PGALLOC],
+ .stat_htlb_pgfail = s->stats[VIRTIO_BALLOON_S_HTLB_PGFAIL],
+ .stat_oom_kills = s->stats[VIRTIO_BALLOON_S_OOM_KILL],
+ .stat_alloc_stalls = s->stats[VIRTIO_BALLOON_S_ALLOC_STALL],
+ .stat_async_scans = s->stats[VIRTIO_BALLOON_S_ASYNC_SCAN],
+ .stat_direct_scans = s->stats[VIRTIO_BALLOON_S_DIRECT_SCAN],
+ .stat_async_reclaims = s->stats[VIRTIO_BALLOON_S_ASYNC_RECLAIM],
+ .stat_direct_reclaims = s->stats[VIRTIO_BALLOON_S_DIRECT_RECLAIM],
+ };
+ /* Update VirtioBalloonStats QAPI type when new stats are added */
+ G_STATIC_ASSERT(VIRTIO_BALLOON_S_NR == 16);
+ VirtioBalloonGuestStats guest_stats = {
+ .last_update = s->stats_last_update,
+ .stats = &stats,
+ };
+ VirtioBalloonGuestStats *argp = &guest_stats;
- if (!visit_start_struct(v, name, NULL, 0, errp)) {
- return;
- }
- if (!visit_type_int(v, "last-update", &s->stats_last_update, errp)) {
- goto out_end;
- }
-
- if (!visit_start_struct(v, "stats", NULL, 0, errp)) {
- goto out_end;
- }
- for (i = 0; i < VIRTIO_BALLOON_S_NR; i++) {
- if (!visit_type_uint64(v, balloon_stat_names[i], &s->stats[i], errp)) {
- goto out_nested;
- }
- }
- ok = visit_check_struct(v, errp);
-out_nested:
- visit_end_struct(v, NULL);
-
- if (ok) {
- visit_check_struct(v, errp);
- }
-out_end:
- visit_end_struct(v, NULL);
+ visit_type_VirtioBalloonGuestStats(v, name, &argp, errp);
}
static void balloon_stats_get_poll_interval(Object *obj, Visitor *v,
@@ -1037,7 +1011,8 @@ static void virtio_balloon_instance_init(Object *obj)
s->free_page_hint_cmd_id = VIRTIO_BALLOON_FREE_PAGE_HINT_CMD_ID_MIN;
s->free_page_hint_notify.notify = virtio_balloon_free_page_hint_notify;
- object_property_add(obj, "guest-stats", "guest statistics", NULL,
+ object_property_add(obj, "guest-stats", "guest statistics",
+ &VirtioBalloonGuestStats_type_info,
balloon_stats_get_all, NULL, NULL, NULL);
object_property_add(obj, "guest-stats-polling-interval", "int",
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 41/56] qom: replace object_property_add_tm with StructTm QAPI type
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (39 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 40/56] virtio-balloon: convert guest-stats property to QAPI type Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 42/56] hw/nvdimm: convert UUID property to QAPI-aware registration Markus Armbruster
` (14 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange, Amit Machhiwal
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Define a StructTm QAPI struct in common.json matching the existing
"struct tm" property wire format (tm_year, tm_mon, tm_mday, tm_hour,
tm_min, tm_sec as int32).
Convert the two callers (mc146818rtc and spapr_rtc) to pass its
QAPITypeInfo to object_class_property_add() / object_property_add(),
and use a standard ObjectPropertyAccessor that populates a StructTm
and calls the generated visitor.
Remove object_property_add_tm(), object_class_property_add_tm(),
the TMProperty type, and the property_get_tm() helper from
qom/object.c, along with their declarations in object.h.
Reviewed-by: Amit Machhiwal <amachhiw@linux.ibm.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
qapi/common.json | 27 +++++++++++++++++
qapi/pragma.json | 1 +
include/qom/object.h | 29 ------------------
hw/ppc/spapr_rtc.c | 25 ++++++++++++++--
hw/rtc/mc146818rtc.c | 23 +++++++++++++--
qom/object.c | 70 --------------------------------------------
6 files changed, 70 insertions(+), 105 deletions(-)
diff --git a/qapi/common.json b/qapi/common.json
index 1352e664b2..68b649ecf2 100644
--- a/qapi/common.json
+++ b/qapi/common.json
@@ -218,3 +218,30 @@
##
{ 'enum': 'EndianMode',
'data': [ 'unspecified', 'little', 'big' ] }
+
+##
+# @StructTm:
+# Broken-down time. Field semantics match C ``struct tm``.
+#
+# @tm_year: years since 1900
+#
+# @tm_mon: months since January (0-11)
+#
+# @tm_mday: day of the month (1-31)
+#
+# @tm_hour: hours since midnight (0-23)
+#
+# @tm_min: minutes after the hour (0-59)
+#
+# @tm_sec: seconds after the minute (0-59, 60-61 for leap seconds)
+#
+# Since: 11.2
+##
+{ 'struct': 'StructTm',
+ 'data': {
+ 'tm_year': 'int32',
+ 'tm_mon': 'int32',
+ 'tm_mday': 'int32',
+ 'tm_hour': 'int32',
+ 'tm_min': 'int32',
+ 'tm_sec': 'int32' } }
diff --git a/qapi/pragma.json b/qapi/pragma.json
index 342cedc42e..9be2819a46 100644
--- a/qapi/pragma.json
+++ b/qapi/pragma.json
@@ -109,6 +109,7 @@
'QKeyCode', # send-key, input-sent-event
'QapiErrorClass', # QMP error replies
'SshHostKeyCheckMode', # blockdev-add, -blockdev
+ 'StructTm', # qom-get of RTC date property
'SysEmuTarget', # query-cpu-fast, query-target
'UuidInfo', # query-uuid
'VncClientInfo', # query-vnc, query-vnc-servers, ...
diff --git a/include/qom/object.h b/include/qom/object.h
index e9a67017fa..d1699964fa 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -2027,35 +2027,6 @@ ObjectProperty *object_class_property_add_enum(ObjectClass *klass,
int (*get)(Object *, Error **),
void (*set)(Object *, int, Error **));
-/**
- * object_property_add_tm:
- * @obj: the object to add a property to
- * @name: the name of the property
- * @get: the getter or NULL if the property is write-only.
- *
- * Add a read-only struct tm valued property using a getter function.
- * This function will add a property of type 'struct tm'.
- *
- * Returns: The newly added property on success, or %NULL on failure.
- */
-ObjectProperty *object_property_add_tm(Object *obj, const char *name,
- void (*get)(Object *, struct tm *, Error **));
-
-/**
- * object_class_property_add_tm:
- * @klass: the object class to add a property to
- * @name: the name of the property
- * @get: the getter or NULL if the property is write-only.
- *
- * Add a read-only struct tm valued property using a getter function.
- * This function will add a property of type 'struct tm'.
- *
- * Returns: The newly added property on success, or %NULL on failure.
- */
-ObjectProperty *object_class_property_add_tm(ObjectClass *klass,
- const char *name,
- void (*get)(Object *, struct tm *, Error **));
-
typedef enum {
/* Automatically add a getter to the property */
OBJ_PROP_FLAG_READ = 1 << 0,
diff --git a/hw/ppc/spapr_rtc.c b/hw/ppc/spapr_rtc.c
index 1f7d2d8f89..10d4cddb42 100644
--- a/hw/ppc/spapr_rtc.c
+++ b/hw/ppc/spapr_rtc.c
@@ -33,6 +33,9 @@
#include "migration/vmstate.h"
#include "qapi/error.h"
#include "qapi/qapi-events-misc.h"
+#include "qapi/qapi-type-infos-common.h"
+#include "qapi/qapi-visit-common.h"
+#include "qapi/visitor.h"
#include "qemu/cutils.h"
#include "qemu/module.h"
@@ -131,9 +134,23 @@ static void rtas_set_time_of_day(PowerPCCPU *cpu, SpaprMachineState *spapr,
rtas_st(rets, 0, RTAS_OUT_SUCCESS);
}
-static void spapr_rtc_qom_date(Object *obj, struct tm *current_tm, Error **errp)
+static void spapr_rtc_qom_date(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
{
- spapr_rtc_read(SPAPR_RTC(obj), current_tm, NULL);
+ struct tm value;
+ StructTm tm, *tmp = &tm;
+
+ spapr_rtc_read(SPAPR_RTC(obj), &value, NULL);
+
+ tm = (StructTm) {
+ .tm_year = value.tm_year,
+ .tm_mon = value.tm_mon,
+ .tm_mday = value.tm_mday,
+ .tm_hour = value.tm_hour,
+ .tm_min = value.tm_min,
+ .tm_sec = value.tm_sec,
+ };
+ visit_type_StructTm(v, name, &tmp, errp);
}
static void spapr_rtc_realize(DeviceState *dev, Error **errp)
@@ -150,7 +167,9 @@ static void spapr_rtc_realize(DeviceState *dev, Error **errp)
rtc_ns = qemu_clock_get_ns(rtc_clock);
rtc->ns_offset = host_s * NANOSECONDS_PER_SECOND - rtc_ns;
- object_property_add_tm(OBJECT(rtc), "date", spapr_rtc_qom_date);
+ object_property_add(OBJECT(rtc), "date", "struct tm",
+ &StructTm_type_info,
+ spapr_rtc_qom_date, NULL, NULL, NULL);
}
static const VMStateDescription vmstate_spapr_rtc = {
diff --git a/hw/rtc/mc146818rtc.c b/hw/rtc/mc146818rtc.c
index ba396435d1..835684abce 100644
--- a/hw/rtc/mc146818rtc.c
+++ b/hw/rtc/mc146818rtc.c
@@ -42,6 +42,8 @@
#include "migration/vmstate.h"
#include "qapi/error.h"
#include "qapi/qapi-events-misc.h"
+#include "qapi/qapi-type-infos-common.h"
+#include "qapi/qapi-visit-common.h"
#include "qapi/visitor.h"
#include "trace.h"
@@ -854,12 +856,25 @@ static const MemoryRegionOps cmos_ops = {
.endianness = DEVICE_LITTLE_ENDIAN,
};
-static void rtc_get_date(Object *obj, struct tm *current_tm, Error **errp)
+static void rtc_get_date(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
{
MC146818RtcState *s = MC146818_RTC(obj);
+ struct tm value;
+ StructTm tm, *tmp = &tm;
rtc_update_time(s);
- rtc_get_time(s, current_tm);
+ rtc_get_time(s, &value);
+
+ tm = (StructTm) {
+ .tm_year = value.tm_year,
+ .tm_mon = value.tm_mon,
+ .tm_mday = value.tm_mday,
+ .tm_hour = value.tm_hour,
+ .tm_min = value.tm_min,
+ .tm_sec = value.tm_sec,
+ };
+ visit_type_StructTm(v, name, &tmp, errp);
}
static void rtc_realizefn(DeviceState *dev, Error **errp)
@@ -1019,7 +1034,9 @@ static void rtc_class_initfn(ObjectClass *klass, const void *data)
device_class_set_props(dc, mc146818rtc_properties);
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
- object_class_property_add_tm(klass, "date", rtc_get_date);
+ object_class_property_add(klass, "date", "struct tm",
+ &StructTm_type_info,
+ rtc_get_date, NULL, NULL, NULL);
}
static const TypeInfo mc146818rtc_info = {
diff --git a/qom/object.c b/qom/object.c
index 39d26a17c6..637459c2b1 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -2613,76 +2613,6 @@ int object_property_get_enum(Object *obj, const char *name,
return ret;
}
-typedef struct TMProperty {
- void (*get)(Object *, struct tm *, Error **);
-} TMProperty;
-
-static void property_get_tm(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
-{
- TMProperty *prop = opaque;
- Error *err = NULL;
- struct tm value;
-
- prop->get(obj, &value, &err);
- if (err) {
- error_propagate(errp, err);
- return;
- }
-
- if (!visit_start_struct(v, name, NULL, 0, errp)) {
- return;
- }
- if (!visit_type_int32(v, "tm_year", &value.tm_year, errp)) {
- goto out_end;
- }
- if (!visit_type_int32(v, "tm_mon", &value.tm_mon, errp)) {
- goto out_end;
- }
- if (!visit_type_int32(v, "tm_mday", &value.tm_mday, errp)) {
- goto out_end;
- }
- if (!visit_type_int32(v, "tm_hour", &value.tm_hour, errp)) {
- goto out_end;
- }
- if (!visit_type_int32(v, "tm_min", &value.tm_min, errp)) {
- goto out_end;
- }
- if (!visit_type_int32(v, "tm_sec", &value.tm_sec, errp)) {
- goto out_end;
- }
- visit_check_struct(v, errp);
-out_end:
- visit_end_struct(v, NULL);
-}
-
-ObjectProperty *
-object_property_add_tm(Object *obj, const char *name,
- void (*get)(Object *, struct tm *, Error **))
-{
- TMProperty *prop = g_malloc0(sizeof(*prop));
-
- prop->get = get;
-
- return object_property_add(obj, name, "struct tm", NULL,
- get ? property_get_tm : NULL, NULL,
- property_release_data,
- prop);
-}
-
-ObjectProperty *
-object_class_property_add_tm(ObjectClass *klass, const char *name,
- void (*get)(Object *, struct tm *, Error **))
-{
- TMProperty *prop = g_malloc0(sizeof(*prop));
-
- prop->get = get;
-
- return object_class_property_add(klass, name, "struct tm", NULL,
- get ? property_get_tm : NULL,
- NULL, NULL, prop);
-}
-
static char *object_get_type(Object *obj, Error **errp)
{
return g_strdup(object_get_typename(obj));
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 42/56] hw/nvdimm: convert UUID property to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (40 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 41/56] qom: replace object_property_add_tm with StructTm " Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 43/56] hw/s390-virtio-ccw: convert loadparm " Markus Armbruster
` (13 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Pass appropriate QAPITypeInfo to object_property_add().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/mem/nvdimm.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
index 04e8361348..08086997d7 100644
--- a/hw/mem/nvdimm.c
+++ b/hw/mem/nvdimm.c
@@ -104,7 +104,7 @@ static void nvdimm_init(Object *obj)
nvdimm_get_label_size, nvdimm_set_label_size, NULL,
NULL);
- object_property_add(obj, NVDIMM_UUID_PROP, "QemuUUID", NULL,
+ object_property_add(obj, NVDIMM_UUID_PROP, "QemuUUID", &str_type_info,
nvdimm_get_uuid,
nvdimm_set_uuid, NULL, NULL);
}
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 43/56] hw/s390-virtio-ccw: convert loadparm property to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (41 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 42/56] hw/nvdimm: convert UUID property to QAPI-aware registration Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 44/56] hw/ppc/spapr_drc: convert fdt " Markus Armbruster
` (12 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Pass appropriate QAPITypeInfo to object_class_property_add().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/s390x/s390-virtio-ccw.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 7d4392d73f..393e4d261d 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -43,6 +43,7 @@
#include "system/hostmem.h"
#include "target/s390x/kvm/pv.h"
#include "migration/blocker.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qapi/qapi-visit-machine-s390x.h"
#include "hw/s390x/cpu-topology.h"
@@ -908,7 +909,7 @@ static void ccw_machine_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, "dea-key-wrap",
"enable/disable DEA key wrapping using the CPACF wrapping key");
- object_class_property_add(oc, "loadparm", "loadparm", NULL,
+ object_class_property_add(oc, "loadparm", "loadparm", &str_type_info,
machine_get_loadparm, machine_set_loadparm,
NULL, NULL);
object_class_property_set_description(oc, "loadparm",
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 44/56] hw/ppc/spapr_drc: convert fdt property to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (42 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 43/56] hw/s390-virtio-ccw: convert loadparm " Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 45/56] hw/s390x: convert BootCertificatesList " Markus Armbruster
` (11 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange, Amit Machhiwal
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Use object_property_add_qapi() with any_type_info for the "fdt"
property, since the FDT structure is dynamically shaped at runtime and
cannot be represented as a static QAPI type.
Reviewed-by: Amit Machhiwal <amachhiw@linux.ibm.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/ppc/spapr_drc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
index 4054215592..7663f232e0 100644
--- a/hw/ppc/spapr_drc.c
+++ b/hw/ppc/spapr_drc.c
@@ -587,7 +587,7 @@ static void spapr_dr_connector_instance_init(Object *obj)
object_property_add_uint32_ptr(obj, "id", &drc->id, OBJ_PROP_FLAG_READ);
object_property_add(obj, "index", "uint32", &uint32_type_info,
prop_get_index, NULL, NULL, NULL);
- object_property_add(obj, "fdt", "struct", NULL, prop_get_fdt,
+ object_property_add(obj, "fdt", "struct", &any_type_info, prop_get_fdt,
NULL, NULL, NULL);
drc->state = drck->empty_state;
}
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 45/56] hw/s390x: convert BootCertificatesList to QAPI-aware registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (43 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 44/56] hw/ppc/spapr_drc: convert fdt " Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 46/56] qdev: add qapi_type field to PropertyInfo with fallback registration Markus Armbruster
` (10 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Pass appropriate QAPITypeInfo to object_class_property_add().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/s390x/s390-virtio-ccw.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 393e4d261d..3b197e7dc6 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -44,6 +44,7 @@
#include "target/s390x/kvm/pv.h"
#include "migration/blocker.h"
#include "qapi/qapi-builtin-type-infos.h"
+#include "qapi/qapi-type-infos-machine-s390x.h"
#include "qapi/visitor.h"
#include "qapi/qapi-visit-machine-s390x.h"
#include "hw/s390x/cpu-topology.h"
@@ -917,7 +918,8 @@ static void ccw_machine_class_init(ObjectClass *oc, const void *data)
" to upper case) to pass to machine loader, boot manager,"
" and guest kernel");
- object_class_property_add(oc, "boot-certs", "BootCertificatesList", NULL,
+ object_class_property_add(oc, "boot-certs", "BootCertificatesList",
+ &BootCertificatesList_type_info,
machine_get_boot_certs, machine_set_boot_certs, NULL, NULL);
object_class_property_set_description(oc, "boot-certs",
"provide paths to a directory and/or a certificate file for secure boot");
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 46/56] qdev: add qapi_type field to PropertyInfo with fallback registration
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (44 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 45/56] hw/s390x: convert BootCertificatesList " Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 47/56] qdev: convert core PropertyInfo definitions to use qapi_type Markus Armbruster
` (9 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Add a qapi_type field to PropertyInfo to prepare for the transition
from string-based type metadata to QAPI type-info.
Update qdev_property_add_static() and qdev_class_add_property() to
pass qapi_type instead of NULL to object_property_add() and
object_class_property_add().
Update the shared enum accessor functions to prefer .qapi_type->lookup
over .enum_table via a new qdev_propinfo_enum_lookup() helper.
No PropertyInfo definitions are changed, all .qapi_type fields default
to NULL, so this patch is no-op for now.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
include/hw/core/qdev-properties.h | 1 +
hw/core/qdev-properties.c | 26 +++++++++++++++++++-------
2 files changed, 20 insertions(+), 7 deletions(-)
diff --git a/include/hw/core/qdev-properties.h b/include/hw/core/qdev-properties.h
index eba5436e53..1ea2ba66bb 100644
--- a/include/hw/core/qdev-properties.h
+++ b/include/hw/core/qdev-properties.h
@@ -34,6 +34,7 @@ struct PropertyInfo {
const char *type;
const char *description;
const QEnumLookup *enum_table;
+ const QAPITypeInfo *qapi_type;
bool realized_set_allowed; /* allow setting property on realized device */
char *(*print)(Object *obj, const Property *prop);
void (*set_default_value)(ObjectProperty *op, const Property *prop);
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 61dca80c95..71580c04e4 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -99,13 +99,22 @@ static ObjectPropertyAccessor *field_prop_setter(const PropertyInfo *info)
return info->set ? field_prop_set : NULL;
}
+static const QEnumLookup *qdev_propinfo_enum_lookup(const PropertyInfo *info)
+{
+ if (info->qapi_type) {
+ assert(info->qapi_type->lookup);
+ return info->qapi_type->lookup;
+ }
+ return info->enum_table;
+}
+
void qdev_propinfo_get_enum(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
const Property *prop = opaque;
int *ptr = object_field_prop_ptr(obj, prop);
- visit_type_enum(v, name, ptr, prop->info->enum_table, errp);
+ visit_type_enum(v, name, ptr, qdev_propinfo_enum_lookup(prop->info), errp);
}
void qdev_propinfo_set_enum(Object *obj, Visitor *v, const char *name,
@@ -114,14 +123,15 @@ void qdev_propinfo_set_enum(Object *obj, Visitor *v, const char *name,
const Property *prop = opaque;
int *ptr = object_field_prop_ptr(obj, prop);
- visit_type_enum(v, name, ptr, prop->info->enum_table, errp);
+ visit_type_enum(v, name, ptr, qdev_propinfo_enum_lookup(prop->info), errp);
}
void qdev_propinfo_set_default_value_enum(ObjectProperty *op,
const Property *prop)
{
object_property_set_default_str(op,
- qapi_enum_lookup(prop->info->enum_table, prop->defval.i));
+ qapi_enum_lookup(qdev_propinfo_enum_lookup(prop->info),
+ prop->defval.i));
}
/* Bit */
@@ -941,8 +951,8 @@ void qdev_prop_set_enum(DeviceState *dev, const char *name, int value)
prop = qdev_prop_find(dev, name);
object_property_set_str(OBJECT(dev), name,
- qapi_enum_lookup(prop->info->enum_table, value),
- &error_abort);
+ qapi_enum_lookup(qdev_propinfo_enum_lookup(prop->info), value),
+ &error_abort);
}
void qdev_prop_set_array(DeviceState *dev, const char *name, QList *values)
@@ -1150,7 +1160,8 @@ void qdev_property_add_static(DeviceState *dev, const Property *prop)
assert(!prop->info->create);
- op = object_property_add(obj, prop->name, prop->info->type, NULL,
+ op = object_property_add(obj, prop->name, prop->info->type,
+ prop->info->qapi_type,
field_prop_getter(prop->info),
field_prop_setter(prop->info),
prop->info->release,
@@ -1176,7 +1187,8 @@ static void qdev_class_add_property(DeviceClass *klass, const char *name,
if (prop->info->create) {
op = prop->info->create(oc, name, prop);
} else {
- op = object_class_property_add(oc, name, prop->info->type, NULL,
+ op = object_class_property_add(oc, name, prop->info->type,
+ prop->info->qapi_type,
field_prop_getter(prop->info),
field_prop_setter(prop->info),
prop->info->release,
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 47/56] qdev: convert core PropertyInfo definitions to use qapi_type
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (45 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 46/56] qdev: add qapi_type field to PropertyInfo with fallback registration Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 48/56] qdev: convert system " Markus Armbruster
` (8 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Add a .qapi_type pointer on all core PropertyInfo definitions in
qdev-properties.c. Remove .enum_table from enum definitions, since the
lookup is now accessed through .qapi_type->lookup via the
qdev_propinfo_enum_lookup() fallback helper.
It's strange to use type &size_type_info for both u32 (prop_size32)
and u64 (prop_size).
Link property are actually strings. The "full type name" is set when
the property is added, as "link<TYPE>".
Array properties are left for later.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/core/qdev-properties.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 71580c04e4..f891fc78ae 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -12,6 +12,8 @@
#include "qdev-prop-internal.h"
#include "qom/compat-properties.h"
#include "qom/qom-qobject.h"
+#include "qapi/qapi-builtin-type-infos.h"
+#include "qapi/qapi-type-infos-common.h"
void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
Error **errp)
@@ -182,6 +184,7 @@ static void set_default_value_bool(ObjectProperty *op, const Property *prop)
const PropertyInfo qdev_prop_bit = {
.type = "bool",
+ .qapi_type = &bool_type_info,
.description = "on/off",
.get = prop_get_bit,
.set = prop_set_bit,
@@ -232,6 +235,7 @@ static void prop_set_bit64(Object *obj, Visitor *v, const char *name,
const PropertyInfo qdev_prop_bit64 = {
.type = "bool",
+ .qapi_type = &bool_type_info,
.description = "on/off",
.get = prop_get_bit64,
.set = prop_set_bit64,
@@ -294,8 +298,8 @@ static void prop_set_on_off_auto_bit64(Object *obj, Visitor *v,
const PropertyInfo qdev_prop_on_off_auto_bit64 = {
.type = "OnOffAuto",
+ .qapi_type = &OnOffAuto_type_info,
.description = "on/off/auto",
- .enum_table = &OnOffAuto_lookup,
.get = prop_get_on_off_auto_bit64,
.set = prop_set_on_off_auto_bit64,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -323,6 +327,7 @@ static void set_bool(Object *obj, Visitor *v, const char *name, void *opaque,
const PropertyInfo qdev_prop_bool = {
.type = "bool",
+ .qapi_type = &bool_type_info,
.description = "on/off",
.get = get_bool,
.set = set_bool,
@@ -363,6 +368,7 @@ void qdev_propinfo_set_default_value_uint(ObjectProperty *op,
const PropertyInfo qdev_prop_uint8 = {
.type = "uint8",
+ .qapi_type = &uint8_type_info,
.get = get_uint8,
.set = set_uint8,
.set_default_value = qdev_propinfo_set_default_value_uint,
@@ -390,6 +396,7 @@ static void set_uint16(Object *obj, Visitor *v, const char *name,
const PropertyInfo qdev_prop_uint16 = {
.type = "uint16",
+ .qapi_type = &uint16_type_info,
.get = get_uint16,
.set = set_uint16,
.set_default_value = qdev_propinfo_set_default_value_uint,
@@ -435,6 +442,7 @@ static void set_int32(Object *obj, Visitor *v, const char *name, void *opaque,
const PropertyInfo qdev_prop_uint32 = {
.type = "uint32",
+ .qapi_type = &uint32_type_info,
.get = get_uint32,
.set = set_uint32,
.set_default_value = qdev_propinfo_set_default_value_uint,
@@ -442,6 +450,7 @@ const PropertyInfo qdev_prop_uint32 = {
const PropertyInfo qdev_prop_int32 = {
.type = "int32",
+ .qapi_type = &int32_type_info,
.get = qdev_propinfo_get_int32,
.set = set_int32,
.set_default_value = qdev_propinfo_set_default_value_int,
@@ -487,6 +496,7 @@ static void set_int64(Object *obj, Visitor *v, const char *name,
const PropertyInfo qdev_prop_uint64 = {
.type = "uint64",
+ .qapi_type = &uint64_type_info,
.get = get_uint64,
.set = set_uint64,
.set_default_value = qdev_propinfo_set_default_value_uint,
@@ -494,6 +504,7 @@ const PropertyInfo qdev_prop_uint64 = {
const PropertyInfo qdev_prop_int64 = {
.type = "int64",
+ .qapi_type = &int64_type_info,
.get = get_int64,
.set = set_int64,
.set_default_value = qdev_propinfo_set_default_value_int,
@@ -516,6 +527,7 @@ static void set_uint64_checkmask(Object *obj, Visitor *v, const char *name,
const PropertyInfo qdev_prop_uint64_checkmask = {
.type = "uint64",
+ .qapi_type = &uint64_type_info,
.get = get_uint64,
.set = set_uint64_checkmask,
};
@@ -552,6 +564,11 @@ static void set_usize(Object *obj, Visitor *v, const char *name, void *opaque,
const PropertyInfo qdev_prop_usize = {
.type = "usize",
+#if HOST_LONG_BITS == 32
+ .qapi_type = &uint32_type_info,
+#else
+ .qapi_type = &uint64_type_info,
+#endif
.get = get_usize,
.set = set_usize,
.set_default_value = qdev_propinfo_set_default_value_uint,
@@ -596,6 +613,7 @@ static void set_string(Object *obj, Visitor *v, const char *name,
const PropertyInfo qdev_prop_string = {
.type = "str",
+ .qapi_type = &str_type_info,
.release = release_string,
.get = get_string,
.set = set_string,
@@ -605,8 +623,8 @@ const PropertyInfo qdev_prop_string = {
const PropertyInfo qdev_prop_on_off_auto = {
.type = "OnOffAuto",
+ .qapi_type = &OnOffAuto_type_info,
.description = "on/off/auto",
- .enum_table = &OnOffAuto_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -648,6 +666,7 @@ static void set_size32(Object *obj, Visitor *v, const char *name, void *opaque,
const PropertyInfo qdev_prop_size32 = {
.type = "size",
+ .qapi_type = &size_type_info,
.get = qdev_propinfo_get_size32,
.set = set_size32,
.set_default_value = qdev_propinfo_set_default_value_uint,
@@ -1061,6 +1080,7 @@ static void set_size(Object *obj, Visitor *v, const char *name, void *opaque,
const PropertyInfo qdev_prop_size = {
.type = "size",
+ .qapi_type = &size_type_info,
.get = get_size,
.set = set_size,
.set_default_value = qdev_propinfo_set_default_value_uint,
@@ -1143,6 +1163,7 @@ static void set_link(Object *obj, Visitor *v, const char *name, void *opaque,
const PropertyInfo qdev_prop_link = {
.type = "link",
+ .qapi_type = &str_type_info,
.create = create_link_property,
/*
* Since we have a create method, the get and set are used
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 48/56] qdev: convert system PropertyInfo definitions to use qapi_type
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (46 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 47/56] qdev: convert core PropertyInfo definitions to use qapi_type Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-02 9:49 ` [PATCH v8 48.5/56] hw/ufs: Convert PropertyInfo to QAPITypeInfo Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 49/56] hw: convert device-local PropertyInfo definitions to use qapi_type Markus Armbruster
` (7 subsequent siblings)
55 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Add a .qapi_type pointer on all PropertyInfo definitions in
qdev-properties-system.c. Remove .enum_table from enum definitions,
since the lookup is now accessed through .qapi_type->lookup via the
qdev_propinfo_enum_lookup() fallback helper.
Update file-private enum accessor functions to use .qapi_type->lookup
instead of .enum_table.
Note, this should be a faithful conversion, but it would be worth to
consider better types than just "str" for references (block node names,
chardev/netdev IDs, MAC addrs, etc)
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/core/qdev-prop-internal.h | 2 +
hw/core/qdev-properties-system.c | 71 +++++++++++++++++++++-----------
hw/core/qdev-properties.c | 2 +-
3 files changed, 51 insertions(+), 24 deletions(-)
diff --git a/hw/core/qdev-prop-internal.h b/hw/core/qdev-prop-internal.h
index d7b77844fe..c190b7b88c 100644
--- a/hw/core/qdev-prop-internal.h
+++ b/hw/core/qdev-prop-internal.h
@@ -8,6 +8,8 @@
#ifndef HW_CORE_QDEV_PROP_INTERNAL_H
#define HW_CORE_QDEV_PROP_INTERNAL_H
+const QEnumLookup *qdev_propinfo_enum_lookup(const PropertyInfo *info);
+
void qdev_propinfo_get_enum(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp);
void qdev_propinfo_set_enum(Object *obj, Visitor *v, const char *name,
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index 5bfdfe1ab9..8924f84806 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -27,6 +27,7 @@
#include "qemu/uuid.h"
#include "qemu/error-report.h"
#include "qdev-prop-internal.h"
+#include "qapi/qapi-type-infos.h"
#include "qemu/audio.h"
#include "chardev/char-fe.h"
@@ -239,6 +240,7 @@ static void release_drive(Object *obj, const char *name, void *opaque)
const PropertyInfo qdev_prop_drive = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "Node name or ID of a block device to use as a backend",
.realized_set_allowed = true,
.get = get_drive,
@@ -248,6 +250,7 @@ const PropertyInfo qdev_prop_drive = {
const PropertyInfo qdev_prop_drive_iothread = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "Node name or ID of a block device to use as a backend",
.realized_set_allowed = true,
.get = get_drive,
@@ -316,6 +319,7 @@ static void release_chr(Object *obj, const char *name, void *opaque)
const PropertyInfo qdev_prop_chr = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "ID of a chardev to use as a backend",
.get = get_chr,
.set = set_chr,
@@ -390,6 +394,7 @@ inval:
const PropertyInfo qdev_prop_macaddr = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "Ethernet 6-byte MAC Address, example: 52:54:00:12:34:56",
.get = get_mac,
.set = set_mac,
@@ -478,6 +483,7 @@ out:
const PropertyInfo qdev_prop_netdev = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "ID of a netdev to use as a backend",
.get = get_netdev,
.set = set_netdev,
@@ -515,6 +521,7 @@ static void set_audiodev(Object *obj, Visitor *v, const char* name,
const PropertyInfo qdev_prop_audiodev = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "ID of an audiodev to use as a backend",
/* release done on shutdown */
.get = get_audiodev,
@@ -584,7 +591,8 @@ static void qdev_propinfo_set_losttickpolicy(Object *obj, Visitor *v,
int *ptr = object_field_prop_ptr(obj, prop);
int value;
- if (!visit_type_enum(v, name, &value, prop->info->enum_table, errp)) {
+ if (!visit_type_enum(v, name, &value,
+ qdev_propinfo_enum_lookup(prop->info), errp)) {
return;
}
@@ -605,8 +613,8 @@ QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy) != sizeof(int));
const PropertyInfo qdev_prop_losttickpolicy = {
.type = "LostTickPolicy",
+ .qapi_type = &LostTickPolicy_type_info,
.description = "Policy for handling lost ticks (discard/delay/slew)",
- .enum_table = &LostTickPolicy_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_losttickpolicy,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -632,6 +640,7 @@ static void set_blocksize(Object *obj, Visitor *v, const char *name,
const PropertyInfo qdev_prop_blocksize = {
.type = "size",
+ .qapi_type = &size_type_info,
.description = "A power of two between " MIN_BLOCK_SIZE_STR
" and " MAX_BLOCK_SIZE_STR,
.get = qdev_propinfo_get_size32,
@@ -645,8 +654,8 @@ QEMU_BUILD_BUG_ON(sizeof(BlockdevOnError) != sizeof(int));
const PropertyInfo qdev_prop_blockdev_on_error = {
.type = "BlockdevOnError",
+ .qapi_type = &BlockdevOnError_type_info,
.description = "Error handling policy (report/ignore/enospc/stop/auto)",
- .enum_table = &BlockdevOnError_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -658,9 +667,9 @@ QEMU_BUILD_BUG_ON(sizeof(BiosAtaTranslation) != sizeof(int));
const PropertyInfo qdev_prop_bios_chs_trans = {
.type = "BiosAtaTranslation",
+ .qapi_type = &BiosAtaTranslation_type_info,
.description = "Logical CHS translation algorithm "
" (auto/none/lba/large/rechs)",
- .enum_table = &BiosAtaTranslation_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -670,8 +679,8 @@ const PropertyInfo qdev_prop_bios_chs_trans = {
const PropertyInfo qdev_prop_fdc_drive_type = {
.type = "FloppyDriveType",
+ .qapi_type = &FloppyDriveType_type_info,
.description = "Floppy drive type (144/288/120/none/auto)",
- .enum_table = &FloppyDriveType_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -681,9 +690,9 @@ const PropertyInfo qdev_prop_fdc_drive_type = {
const PropertyInfo qdev_prop_multifd_compression = {
.type = "MultiFDCompression",
+ .qapi_type = &MultiFDCompression_type_info,
.description = "multifd compression method"
" (none/zlib/zstd/qpl/uadk/qatzip)",
- .enum_table = &MultiFDCompression_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -695,8 +704,8 @@ QEMU_BUILD_BUG_ON(sizeof(MigMode) != sizeof(int));
const PropertyInfo qdev_prop_mig_mode = {
.type = "MigMode",
+ .qapi_type = &MigMode_type_info,
.description = "Migration mode (normal/cpr-reboot)",
- .enum_table = &MigMode_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -708,8 +717,8 @@ QEMU_BUILD_BUG_ON(sizeof(GranuleMode) != sizeof(int));
const PropertyInfo qdev_prop_granule_mode = {
.type = "GranuleMode",
+ .qapi_type = &GranuleMode_type_info,
.description = "Granule page size (4k/8k/16k/64k/host)",
- .enum_table = &GranuleMode_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -717,8 +726,8 @@ const PropertyInfo qdev_prop_granule_mode = {
const PropertyInfo qdev_prop_zero_page_detection = {
.type = "ZeroPageDetection",
+ .qapi_type = &ZeroPageDetection_type_info,
.description = "Zero page detection (none/legacy/multifd)",
- .enum_table = &ZeroPageDetection_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -730,8 +739,8 @@ QEMU_BUILD_BUG_ON(sizeof(SsidSizeMode) != sizeof(int));
const PropertyInfo qdev_prop_ssidsize_mode = {
.type = "SsidSizeMode",
+ .qapi_type = &SsidSizeMode_type_info,
.description = "ssidsize mode: auto, 0-20",
- .enum_table = &SsidSizeMode_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -743,8 +752,8 @@ QEMU_BUILD_BUG_ON(sizeof(OasMode) != sizeof(int));
const PropertyInfo qdev_prop_oas_mode = {
.type = "OasMode",
+ .qapi_type = &OasMode_type_info,
.description = "oas mode: auto, 32, 36, 40, 42, 44, 48, 52, 56",
- .enum_table = &OasMode_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -825,6 +834,7 @@ out:
const PropertyInfo qdev_prop_reserved_region = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "Reserved Region, example: 0xFEE00000:0xFEEFFFFF:0",
.get = get_reserved_region,
.set = set_reserved_region,
@@ -904,7 +914,16 @@ static char *print_pci_devfn(Object *obj, const Property *prop)
}
const PropertyInfo qdev_prop_pci_devfn = {
+ /*
+ * Both .type and .qapi_type are inaccurate. We actually accept
+ * string or integer. The natural QAPI type would be an
+ * alternate, but QAPI refuses this combination, because it
+ * wouldn't work with the QObject input keyval visitor.
+ * set_pci_devfn() bypasses this restriction by doing it manually.
+ * It can pick integer only with JSON input (QMP).
+ */
.type = "str",
+ .qapi_type = &int32_type_info,
.description = "Slot and optional function number, example: 06.0 or 06",
.print = print_pci_devfn,
.get = qdev_propinfo_get_int32,
@@ -1011,6 +1030,7 @@ inval:
const PropertyInfo qdev_prop_pci_host_devaddr = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "Address (bus:device.function) of "
"the host device, example: 04:10.0",
.get = get_pci_host_devaddr,
@@ -1021,8 +1041,8 @@ const PropertyInfo qdev_prop_pci_host_devaddr = {
const PropertyInfo qdev_prop_off_auto_pcibar = {
.type = "OffAutoPCIBAR",
+ .qapi_type = &OffAutoPCIBAR_type_info,
.description = "off/auto/bar0/bar1/bar2/bar3/bar4/bar5",
- .enum_table = &OffAutoPCIBAR_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -1061,7 +1081,8 @@ static void get_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
abort();
}
- visit_type_enum(v, name, &speed, prop->info->enum_table, errp);
+ visit_type_enum(v, name, &speed,
+ qdev_propinfo_enum_lookup(prop->info), errp);
}
static void set_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
@@ -1071,8 +1092,8 @@ static void set_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
PCIExpLinkSpeed *p = object_field_prop_ptr(obj, prop);
int speed;
- if (!visit_type_enum(v, name, &speed, prop->info->enum_table,
- errp)) {
+ if (!visit_type_enum(v, name, &speed,
+ qdev_propinfo_enum_lookup(prop->info), errp)) {
return;
}
@@ -1103,8 +1124,8 @@ static void set_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
const PropertyInfo qdev_prop_pcie_link_speed = {
.type = "PCIELinkSpeed",
+ .qapi_type = &PCIELinkSpeed_type_info,
.description = "2_5/5/8/16/32/64",
- .enum_table = &PCIELinkSpeed_lookup,
.get = get_prop_pcielinkspeed,
.set = set_prop_pcielinkspeed,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -1146,7 +1167,8 @@ static void get_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,
abort();
}
- visit_type_enum(v, name, &width, prop->info->enum_table, errp);
+ visit_type_enum(v, name, &width,
+ qdev_propinfo_enum_lookup(prop->info), errp);
}
static void set_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,
@@ -1156,8 +1178,8 @@ static void set_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,
PCIExpLinkWidth *p = object_field_prop_ptr(obj, prop);
int width;
- if (!visit_type_enum(v, name, &width, prop->info->enum_table,
- errp)) {
+ if (!visit_type_enum(v, name, &width,
+ qdev_propinfo_enum_lookup(prop->info), errp)) {
return;
}
@@ -1191,8 +1213,8 @@ static void set_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,
const PropertyInfo qdev_prop_pcie_link_width = {
.type = "PCIELinkWidth",
+ .qapi_type = &PCIELinkWidth_type_info,
.description = "1/2/4/8/12/16/32",
- .enum_table = &PCIELinkWidth_lookup,
.get = get_prop_pcielinkwidth,
.set = set_prop_pcielinkwidth,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -1241,6 +1263,7 @@ static void set_default_uuid_auto(ObjectProperty *op, const Property *prop)
const PropertyInfo qdev_prop_uuid = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "UUID (aka GUID) or \"" UUID_VALUE_AUTO
"\" for random value (default)",
.get = get_uuid,
@@ -1254,8 +1277,8 @@ QEMU_BUILD_BUG_ON(sizeof(S390CpuEntitlement) != sizeof(int));
const PropertyInfo qdev_prop_cpus390entitlement = {
.type = "S390CpuEntitlement",
+ .qapi_type = &S390CpuEntitlement_type_info,
.description = "auto/low/medium/high (default medium)",
- .enum_table = &S390CpuEntitlement_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -1299,6 +1322,7 @@ static void release_iothread_vq_mapping_list(Object *obj,
const PropertyInfo qdev_prop_iothread_vq_mapping_list = {
.type = "IOThreadVirtQueueMappingList",
+ .qapi_type = &IOThreadVirtQueueMappingList_type_info,
.description = "IOThread virtqueue mapping list [{\"iothread\":\"<id>\", "
"\"vqs\":[1,2,3,...]},...]",
.get = get_iothread_vq_mapping_list,
@@ -1310,8 +1334,8 @@ const PropertyInfo qdev_prop_iothread_vq_mapping_list = {
const PropertyInfo qdev_prop_endian_mode = {
.type = "EndianMode",
+ .qapi_type = &EndianMode_type_info,
.description = "Endian mode, big/little/unspecified",
- .enum_table = &EndianMode_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -1319,8 +1343,8 @@ const PropertyInfo qdev_prop_endian_mode = {
const PropertyInfo qdev_prop_vmapple_virtio_blk_variant = {
.type = "VMAppleVirtioBlkVariant",
+ .qapi_type = &VMAppleVirtioBlkVariant_type_info,
.description = "unspecified/root/aux",
- .enum_table = &VMAppleVirtioBlkVariant_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
@@ -1364,6 +1388,7 @@ static void release_virtio_gpu_output_list(Object *obj,
const PropertyInfo qdev_prop_virtio_gpu_output_list = {
.type = "VirtIOGPUOutputList",
+ .qapi_type = &VirtIOGPUOutputList_type_info,
.description = "VirtIO GPU output list [{\"name\":\"<name>\"},...]",
.get = get_virtio_gpu_output_list,
.set = set_virtio_gpu_output_list,
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index f891fc78ae..fb11eb1f1c 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -101,7 +101,7 @@ static ObjectPropertyAccessor *field_prop_setter(const PropertyInfo *info)
return info->set ? field_prop_set : NULL;
}
-static const QEnumLookup *qdev_propinfo_enum_lookup(const PropertyInfo *info)
+const QEnumLookup *qdev_propinfo_enum_lookup(const PropertyInfo *info)
{
if (info->qapi_type) {
assert(info->qapi_type->lookup);
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 48.5/56] hw/ufs: Convert PropertyInfo to QAPITypeInfo
2026-11-01 20:17 ` [PATCH v8 48/56] qdev: convert system " Markus Armbruster
@ 2026-11-02 9:49 ` Markus Armbruster
2026-11-02 11:20 ` Marc-André Lureau
0 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2026-11-02 9:49 UTC (permalink / raw)
To: Markus Armbruster
Cc: qemu-devel, marcandre.lureau, pbonzini, berrange, stanleyjhu,
jeuk20.kim
This gives properties "x-fault-inject-tag" and "x-fault-inject-mode" a
generated type_info with a valid masked_name, so it appears in
query-qmp-schema introspection and the qapi-type field of
qom-list-properties output.
The conversion is trivial for ufs_prop_get_fault_inject_tag. For
ufs_prop_get_fault_inject_tag, we need to conver UfsFaultInjectMode to
a QAPI enum.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
Fixup needed for commit c821f2f69f1 (hw/ufs: Add experimental fault
injection properties for holding requests)
qapi/common.json | 30 ++++++++++++++++++++++++++++++
hw/ufs/ufs.h | 34 ----------------------------------
hw/ufs/ufs.c | 15 +++------------
3 files changed, 33 insertions(+), 46 deletions(-)
diff --git a/qapi/common.json b/qapi/common.json
index 68b649ecf2..84f12c133a 100644
--- a/qapi/common.json
+++ b/qapi/common.json
@@ -245,3 +245,33 @@
'tm_hour': 'int32',
'tm_min': 'int32',
'tm_sec': 'int32' } }
+
+##
+# @UfsFaultInjectMode:
+# Fault injection modes for x-fault-inject-mode property.
+# Controls how the held transfer request and subsequent Task
+# Management Request (TMR) are resolved by the controller:
+#
+# @abort-success: TMR ABORT_TASK aborts the held request, clears its
+# state, and returns SUCCESS (COMPL).
+#
+# @abort-failed: TMR ABORT_TASK returns TASK_MANAGEMENT_FUNC_FAILED,
+# forcing host driver to escalate to Host Reset.
+#
+# @in-transition: TMR QUERY_TASK releases the held request to execute
+# normally through the SCSI layer and returns the real task status
+# (SUCCEEDED while the command is still in flight); ABORT_TASK
+# cancels the held request and returns FUNCTION_COMPLETE.
+#
+# @timeout: TMR ABORT_TASK does not complete or clear doorbell,
+# triggering hardware-level TMR timeout.
+#
+# @ssu-timeout: Intercepts SCSI START_STOP (0x1B) commands targeting
+# the UFS Device WLUN when x-fault-inject-tag is armed.
+#
+# Since: 11.2
+##
+{ 'enum': 'UfsFaultInjectMode',
+ 'prefix': 'UFS_FAULT_INJECT',
+ 'data': [ 'abort-success', 'abort-failed', 'in-transition', 'timeout',
+ 'ssu-timeout' ] }
diff --git a/hw/ufs/ufs.h b/hw/ufs/ufs.h
index 7ddc540546..0014978322 100644
--- a/hw/ufs/ufs.h
+++ b/hw/ufs/ufs.h
@@ -90,39 +90,6 @@ typedef struct UfsLu {
UfsScsiOp scsi_op;
} UfsLu;
-/*
- * Fault injection modes for x-fault-inject-mode property.
- * Controls how the held transfer request and subsequent Task Management
- * Request (TMR) are resolved by the controller:
- *
- * UFS_FAULT_INJECT_ABORT_SUCCESS: TMR ABORT_TASK aborts the held request,
- * clears its state, and returns SUCCESS
- * (COMPL).
- * UFS_FAULT_INJECT_ABORT_FAILED: TMR ABORT_TASK returns
- * TASK_MANAGEMENT_FUNC_FAILED, forcing host
- * driver to escalate to Host Reset.
- * UFS_FAULT_INJECT_IN_TRANSITION: TMR QUERY_TASK releases the held request to
- * execute normally through the SCSI layer and
- * returns the real task status (SUCCEEDED while
- * the command is still in flight);
- * ABORT_TASK cancels the held request and
- * returns FUNCTION_COMPLETE.
- * UFS_FAULT_INJECT_TIMEOUT: TMR ABORT_TASK does not complete or clear
- * doorbell, triggering hardware-level TMR
- * timeout.
- * UFS_FAULT_INJECT_SSU_TIMEOUT: Intercepts SCSI START_STOP (0x1B) commands
- * targeting the UFS Device WLUN when
- * x-fault-inject-tag is armed.
- */
-typedef enum UfsFaultInjectMode {
- UFS_FAULT_INJECT_ABORT_SUCCESS = 0,
- UFS_FAULT_INJECT_ABORT_FAILED,
- UFS_FAULT_INJECT_IN_TRANSITION,
- UFS_FAULT_INJECT_TIMEOUT,
- UFS_FAULT_INJECT_SSU_TIMEOUT,
- UFS_FAULT_INJECT_MODE_MAX,
-} UfsFaultInjectMode;
-
/*
* Sentinel values for x-fault-inject-tag property.
* Task Tags in UFS are 8-bit (0..255). Values >= 256 are reserved as
@@ -375,6 +342,5 @@ void ufs_unrealize(UfsHc *u);
extern const PropertyInfo ufs_prop_fault_inject_tag;
extern const PropertyInfo ufs_prop_fault_inject_mode;
-extern const QEnumLookup UfsFaultInjectMode_lookup;
#endif /* HW_UFS_UFS_H */
diff --git a/hw/ufs/ufs.c b/hw/ufs/ufs.c
index f8da7c9554..3de67831ea 100644
--- a/hw/ufs/ufs.c
+++ b/hw/ufs/ufs.c
@@ -15,6 +15,7 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
+#include "qapi/qapi-type-infos-common.h"
#include "qapi/visitor.h"
#include "scsi/constants.h"
#include "hw/core/irq.h"
@@ -3234,17 +3235,6 @@ static void ufs_init_hc(UfsHc *u)
ufs_fault_inject_init(u);
}
-const QEnumLookup UfsFaultInjectMode_lookup = {
- .array = (const char *const[]) {
- [UFS_FAULT_INJECT_ABORT_SUCCESS] = "abort-success",
- [UFS_FAULT_INJECT_ABORT_FAILED] = "abort-failed",
- [UFS_FAULT_INJECT_IN_TRANSITION] = "in-transition",
- [UFS_FAULT_INJECT_TIMEOUT] = "timeout",
- [UFS_FAULT_INJECT_SSU_TIMEOUT] = "ssu-timeout",
- },
- .size = UFS_FAULT_INJECT_MODE_MAX,
-};
-
static void ufs_prop_get_fault_inject_tag(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
@@ -3300,6 +3290,7 @@ static void ufs_prop_set_default_fault_inject_tag(ObjectProperty *op,
const PropertyInfo ufs_prop_fault_inject_tag = {
.type = "uint32",
+ .qapi_type = &uint32_type_info,
.description = "Task tag to hold for fault injection",
.get = ufs_prop_get_fault_inject_tag,
.set = ufs_prop_set_fault_inject_tag,
@@ -3309,9 +3300,9 @@ const PropertyInfo ufs_prop_fault_inject_tag = {
const PropertyInfo ufs_prop_fault_inject_mode = {
.type = "UfsFaultInjectMode",
+ .qapi_type = &UfsFaultInjectMode_type_info,
.description = "Fault injection mode: abort-success, abort-failed, "
"in-transition, timeout, ssu-timeout",
- .enum_table = &UfsFaultInjectMode_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* Re: [PATCH v8 48.5/56] hw/ufs: Convert PropertyInfo to QAPITypeInfo
2026-11-02 9:49 ` [PATCH v8 48.5/56] hw/ufs: Convert PropertyInfo to QAPITypeInfo Markus Armbruster
@ 2026-11-02 11:20 ` Marc-André Lureau
0 siblings, 0 replies; 66+ messages in thread
From: Marc-André Lureau @ 2026-11-02 11:20 UTC (permalink / raw)
To: Markus Armbruster; +Cc: qemu-devel, pbonzini, berrange, stanleyjhu, jeuk20.kim
On Mon, Nov 2, 2026 at 1:49 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> This gives properties "x-fault-inject-tag" and "x-fault-inject-mode" a
> generated type_info with a valid masked_name, so it appears in
> query-qmp-schema introspection and the qapi-type field of
> qom-list-properties output.
>
> The conversion is trivial for ufs_prop_get_fault_inject_tag. For
> ufs_prop_get_fault_inject_tag, we need to conver UfsFaultInjectMode to
> a QAPI enum.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
> Fixup needed for commit c821f2f69f1 (hw/ufs: Add experimental fault
> injection properties for holding requests)
>
> qapi/common.json | 30 ++++++++++++++++++++++++++++++
> hw/ufs/ufs.h | 34 ----------------------------------
> hw/ufs/ufs.c | 15 +++------------
> 3 files changed, 33 insertions(+), 46 deletions(-)
>
> diff --git a/qapi/common.json b/qapi/common.json
> index 68b649ecf2..84f12c133a 100644
> --- a/qapi/common.json
> +++ b/qapi/common.json
> @@ -245,3 +245,33 @@
> 'tm_hour': 'int32',
> 'tm_min': 'int32',
> 'tm_sec': 'int32' } }
> +
> +##
> +# @UfsFaultInjectMode:
> +# Fault injection modes for x-fault-inject-mode property.
> +# Controls how the held transfer request and subsequent Task
> +# Management Request (TMR) are resolved by the controller:
> +#
> +# @abort-success: TMR ABORT_TASK aborts the held request, clears its
> +# state, and returns SUCCESS (COMPL).
> +#
> +# @abort-failed: TMR ABORT_TASK returns TASK_MANAGEMENT_FUNC_FAILED,
> +# forcing host driver to escalate to Host Reset.
> +#
> +# @in-transition: TMR QUERY_TASK releases the held request to execute
> +# normally through the SCSI layer and returns the real task status
> +# (SUCCEEDED while the command is still in flight); ABORT_TASK
> +# cancels the held request and returns FUNCTION_COMPLETE.
> +#
> +# @timeout: TMR ABORT_TASK does not complete or clear doorbell,
> +# triggering hardware-level TMR timeout.
> +#
> +# @ssu-timeout: Intercepts SCSI START_STOP (0x1B) commands targeting
> +# the UFS Device WLUN when x-fault-inject-tag is armed.
> +#
> +# Since: 11.2
> +##
> +{ 'enum': 'UfsFaultInjectMode',
> + 'prefix': 'UFS_FAULT_INJECT',
> + 'data': [ 'abort-success', 'abort-failed', 'in-transition', 'timeout',
> + 'ssu-timeout' ] }
> diff --git a/hw/ufs/ufs.h b/hw/ufs/ufs.h
> index 7ddc540546..0014978322 100644
> --- a/hw/ufs/ufs.h
> +++ b/hw/ufs/ufs.h
> @@ -90,39 +90,6 @@ typedef struct UfsLu {
> UfsScsiOp scsi_op;
> } UfsLu;
>
> -/*
> - * Fault injection modes for x-fault-inject-mode property.
> - * Controls how the held transfer request and subsequent Task Management
> - * Request (TMR) are resolved by the controller:
> - *
> - * UFS_FAULT_INJECT_ABORT_SUCCESS: TMR ABORT_TASK aborts the held request,
> - * clears its state, and returns SUCCESS
> - * (COMPL).
> - * UFS_FAULT_INJECT_ABORT_FAILED: TMR ABORT_TASK returns
> - * TASK_MANAGEMENT_FUNC_FAILED, forcing host
> - * driver to escalate to Host Reset.
> - * UFS_FAULT_INJECT_IN_TRANSITION: TMR QUERY_TASK releases the held request to
> - * execute normally through the SCSI layer and
> - * returns the real task status (SUCCEEDED while
> - * the command is still in flight);
> - * ABORT_TASK cancels the held request and
> - * returns FUNCTION_COMPLETE.
> - * UFS_FAULT_INJECT_TIMEOUT: TMR ABORT_TASK does not complete or clear
> - * doorbell, triggering hardware-level TMR
> - * timeout.
> - * UFS_FAULT_INJECT_SSU_TIMEOUT: Intercepts SCSI START_STOP (0x1B) commands
> - * targeting the UFS Device WLUN when
> - * x-fault-inject-tag is armed.
> - */
> -typedef enum UfsFaultInjectMode {
> - UFS_FAULT_INJECT_ABORT_SUCCESS = 0,
> - UFS_FAULT_INJECT_ABORT_FAILED,
> - UFS_FAULT_INJECT_IN_TRANSITION,
> - UFS_FAULT_INJECT_TIMEOUT,
> - UFS_FAULT_INJECT_SSU_TIMEOUT,
> - UFS_FAULT_INJECT_MODE_MAX,
> -} UfsFaultInjectMode;
> -
> /*
> * Sentinel values for x-fault-inject-tag property.
> * Task Tags in UFS are 8-bit (0..255). Values >= 256 are reserved as
> @@ -375,6 +342,5 @@ void ufs_unrealize(UfsHc *u);
>
> extern const PropertyInfo ufs_prop_fault_inject_tag;
> extern const PropertyInfo ufs_prop_fault_inject_mode;
> -extern const QEnumLookup UfsFaultInjectMode_lookup;
>
> #endif /* HW_UFS_UFS_H */
> diff --git a/hw/ufs/ufs.c b/hw/ufs/ufs.c
> index f8da7c9554..3de67831ea 100644
> --- a/hw/ufs/ufs.c
> +++ b/hw/ufs/ufs.c
> @@ -15,6 +15,7 @@
>
> #include "qemu/osdep.h"
> #include "qapi/error.h"
> +#include "qapi/qapi-type-infos-common.h"
> #include "qapi/visitor.h"
> #include "scsi/constants.h"
> #include "hw/core/irq.h"
> @@ -3234,17 +3235,6 @@ static void ufs_init_hc(UfsHc *u)
> ufs_fault_inject_init(u);
> }
>
> -const QEnumLookup UfsFaultInjectMode_lookup = {
> - .array = (const char *const[]) {
> - [UFS_FAULT_INJECT_ABORT_SUCCESS] = "abort-success",
> - [UFS_FAULT_INJECT_ABORT_FAILED] = "abort-failed",
> - [UFS_FAULT_INJECT_IN_TRANSITION] = "in-transition",
> - [UFS_FAULT_INJECT_TIMEOUT] = "timeout",
> - [UFS_FAULT_INJECT_SSU_TIMEOUT] = "ssu-timeout",
> - },
> - .size = UFS_FAULT_INJECT_MODE_MAX,
> -};
> -
> static void ufs_prop_get_fault_inject_tag(Object *obj, Visitor *v,
> const char *name, void *opaque,
> Error **errp)
> @@ -3300,6 +3290,7 @@ static void ufs_prop_set_default_fault_inject_tag(ObjectProperty *op,
>
> const PropertyInfo ufs_prop_fault_inject_tag = {
> .type = "uint32",
> + .qapi_type = &uint32_type_info,
> .description = "Task tag to hold for fault injection",
> .get = ufs_prop_get_fault_inject_tag,
> .set = ufs_prop_set_fault_inject_tag,
> @@ -3309,9 +3300,9 @@ const PropertyInfo ufs_prop_fault_inject_tag = {
>
> const PropertyInfo ufs_prop_fault_inject_mode = {
> .type = "UfsFaultInjectMode",
> + .qapi_type = &UfsFaultInjectMode_type_info,
> .description = "Fault injection mode: abort-success, abort-failed, "
> "in-transition, timeout, ssu-timeout",
> - .enum_table = &UfsFaultInjectMode_lookup,
> .get = qdev_propinfo_get_enum,
> .set = qdev_propinfo_set_enum,
> .set_default_value = qdev_propinfo_set_default_value_enum,
> --
> 2.55.0
>
^ permalink raw reply [flat|nested] 66+ messages in thread
* [PATCH v8 49/56] hw: convert device-local PropertyInfo definitions to use qapi_type
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (47 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 48/56] qdev: convert system " Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 50/56] target/riscv: convert " Markus Armbruster
` (6 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Add a .qapi_type pointer to PropertyInfo definitions in
device-specific files. Mechanical, except for "display_mode" in
apple-gfx.m, which is a string of a specific format.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/block/xen-block.c | 2 ++
hw/misc/xlnx-versal-trng.c | 2 ++
hw/nvme/nguid.c | 2 ++
hw/nvram/xlnx-bbram.c | 2 ++
hw/nvram/xlnx-efuse.c | 2 ++
hw/pci/pci.c | 2 ++
hw/s390x/ccw-device.c | 2 ++
hw/s390x/css.c | 3 +++
hw/s390x/s390-pci-bus.c | 2 ++
hw/vfio/pci-quirks.c | 2 ++
hw/display/apple-gfx.m | 2 ++
11 files changed, 23 insertions(+)
diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
index 474c12fe4a..ffdb080657 100644
--- a/hw/block/xen-block.c
+++ b/hw/block/xen-block.c
@@ -29,6 +29,7 @@
#include "dataplane/xen-block.h"
#include "hw/xen/interface/io/xs_wire.h"
#include "trace.h"
+#include "qapi/qapi-builtin-type-infos.h"
#define XVDA_MAJOR 202
#define XVDQ_MAJOR (1 << 20)
@@ -664,6 +665,7 @@ invalid:
*/
static const PropertyInfo xen_block_prop_vdev = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "Virtual Disk specifier (d*p*/xvd*/hd*/sd*)",
.get = xen_block_get_vdev,
.set = xen_block_set_vdev,
diff --git a/hw/misc/xlnx-versal-trng.c b/hw/misc/xlnx-versal-trng.c
index 0584ee089e..3204e083ea 100644
--- a/hw/misc/xlnx-versal-trng.c
+++ b/hw/misc/xlnx-versal-trng.c
@@ -36,6 +36,7 @@
#include "qapi/visitor.h"
#include "migration/vmstate.h"
#include "hw/core/qdev-properties.h"
+#include "qapi/qapi-builtin-type-infos.h"
#ifndef XLNX_VERSAL_TRNG_ERR_DEBUG
#define XLNX_VERSAL_TRNG_ERR_DEBUG 0
@@ -663,6 +664,7 @@ static void trng_prop_fault_event_get(Object *obj, Visitor *v,
static const PropertyInfo trng_prop_fault_events = {
.type = "uint32",
+ .qapi_type = &uint32_type_info,
.description = "Set to trigger TRNG fault events",
.set = trng_prop_fault_event_set,
.get = trng_prop_fault_event_get,
diff --git a/hw/nvme/nguid.c b/hw/nvme/nguid.c
index 4cd6fad6ac..ccc12ac9f9 100644
--- a/hw/nvme/nguid.c
+++ b/hw/nvme/nguid.c
@@ -18,6 +18,7 @@
#include "qapi/visitor.h"
#include "qemu/ctype.h"
#include "nvme.h"
+#include "qapi/qapi-builtin-type-infos.h"
#define NGUID_SEPARATOR '-'
@@ -180,6 +181,7 @@ static void set_nguid(Object *obj, Visitor *v, const char *name, void *opaque,
const PropertyInfo qdev_prop_nguid = {
.type = "str",
+ .qapi_type = &str_type_info,
.description =
"NGUID or \"" NGUID_VALUE_AUTO "\" for random value",
.get = get_nguid,
diff --git a/hw/nvram/xlnx-bbram.c b/hw/nvram/xlnx-bbram.c
index e336874bde..8e7597621d 100644
--- a/hw/nvram/xlnx-bbram.c
+++ b/hw/nvram/xlnx-bbram.c
@@ -34,6 +34,7 @@
#include "hw/core/qdev-properties.h"
#include "hw/core/qdev-properties-system.h"
#include "hw/nvram/xlnx-efuse.h"
+#include "qapi/qapi-builtin-type-infos.h"
#ifndef XLNX_BBRAM_ERR_DEBUG
#define XLNX_BBRAM_ERR_DEBUG 0
@@ -487,6 +488,7 @@ static void bbram_prop_release_drive(Object *obj, const char *name,
static const PropertyInfo bbram_prop_drive = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "Node name or ID of a block device to use as BBRAM backend",
.realized_set_allowed = true,
.get = bbram_prop_get_drive,
diff --git a/hw/nvram/xlnx-efuse.c b/hw/nvram/xlnx-efuse.c
index 03c9fbc0d0..7d2030f7aa 100644
--- a/hw/nvram/xlnx-efuse.c
+++ b/hw/nvram/xlnx-efuse.c
@@ -34,6 +34,7 @@
#include "system/blockdev.h"
#include "hw/core/qdev-properties.h"
#include "hw/core/qdev-properties-system.h"
+#include "qapi/qapi-builtin-type-infos.h"
#define TBIT0_OFFSET 28
#define TBIT1_OFFSET 29
@@ -252,6 +253,7 @@ static void efuse_prop_release_drive(Object *obj, const char *name,
static const PropertyInfo efuse_prop_drive = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "Node name or ID of a block device to use as eFUSE backend",
.realized_set_allowed = true,
.get = efuse_prop_get_drive,
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 0efb4eb4bb..0f4c900991 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -53,6 +53,7 @@
#include "qapi/error.h"
#include "qemu/cutils.h"
#include "pci-internal.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "hw/xen/xen.h"
#include "hw/i386/kvm/xen_evtchn.h"
@@ -81,6 +82,7 @@ static void prop_pci_busnr_get(Object *obj, Visitor *v, const char *name,
static const PropertyInfo prop_pci_busnr = {
.type = "busnr",
+ .qapi_type = &uint8_type_info,
.get = prop_pci_busnr_get,
};
diff --git a/hw/s390x/ccw-device.c b/hw/s390x/ccw-device.c
index 25c4273279..54766f53e1 100644
--- a/hw/s390x/ccw-device.c
+++ b/hw/s390x/ccw-device.c
@@ -17,6 +17,7 @@
#include "qapi/visitor.h"
#include "qemu/ctype.h"
#include "qapi/error.h"
+#include "qapi/qapi-builtin-type-infos.h"
static void ccw_device_refill_ids(CcwDevice *dev)
{
@@ -75,6 +76,7 @@ static void ccw_device_set_loadparm(Object *obj, Visitor *v,
const PropertyInfo ccw_loadparm = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "Up to 8 chars in set of [A-Za-z0-9. ] to select"
" a guest kernel",
.get = ccw_device_get_loadparm,
diff --git a/hw/s390x/css.c b/hw/s390x/css.c
index 65341c68c3..44805ceb49 100644
--- a/hw/s390x/css.c
+++ b/hw/s390x/css.c
@@ -24,6 +24,7 @@
#include "hw/s390x/s390-virtio-ccw.h"
#include "hw/s390x/s390-ccw.h"
#include "exec/cpu-common.h"
+#include "qapi/qapi-builtin-type-infos.h"
typedef struct CrwContainer {
CRW crw;
@@ -2531,6 +2532,7 @@ out:
const PropertyInfo css_devid_propinfo = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "Identifier of an I/O device in the channel "
"subsystem, example: fe.1.23ab",
.get = get_css_devid,
@@ -2539,6 +2541,7 @@ const PropertyInfo css_devid_propinfo = {
const PropertyInfo css_devid_ro_propinfo = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "Read-only identifier of an I/O device in the channel "
"subsystem, example: fe.1.23ab",
.get = get_css_devid,
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index cdd75cdfd2..6703d4c1cb 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -35,6 +35,7 @@
#include "system/runstate.h"
#include "trace.h"
+#include "qapi/qapi-builtin-type-infos.h"
S390pciState *s390_get_phb(void)
{
@@ -1852,6 +1853,7 @@ static void s390_pci_set_fid(Object *obj, Visitor *v, const char *name,
static const PropertyInfo s390_pci_fid_propinfo = {
.type = "uint32",
+ .qapi_type = &uint32_type_info,
.description = "zpci_fid",
.get = s390_pci_get_fid,
.set = s390_pci_set_fid,
diff --git a/hw/vfio/pci-quirks.c b/hw/vfio/pci-quirks.c
index c5b4f9091d..a38a0e7a3a 100644
--- a/hw/vfio/pci-quirks.c
+++ b/hw/vfio/pci-quirks.c
@@ -26,6 +26,7 @@
#include "pci.h"
#include "pci-quirks.h"
#include "trace.h"
+#include "qapi/qapi-builtin-type-infos.h"
/*
* List of device ids/vendor ids for which to disable
@@ -1437,6 +1438,7 @@ static void set_nv_gpudirect_clique_id(Object *obj, Visitor *v,
const PropertyInfo qdev_prop_nv_gpudirect_clique = {
.type = "uint8",
+ .qapi_type = &uint8_type_info,
.description = "NVIDIA GPUDirect Clique ID (0 - 15)",
.get = get_nv_gpudirect_clique_id,
.set = set_nv_gpudirect_clique_id,
diff --git a/hw/display/apple-gfx.m b/hw/display/apple-gfx.m
index be0061b9db..4db80f0b10 100644
--- a/hw/display/apple-gfx.m
+++ b/hw/display/apple-gfx.m
@@ -15,6 +15,7 @@
#include "qemu/lockable.h"
#include "qemu/cutils.h"
#include "qemu/log.h"
+#include "qapi/qapi-builtin-type-infos.h"
#include "qapi/visitor.h"
#include "qapi/error.h"
#include "qemu/aio-wait.h"
@@ -872,6 +873,7 @@ static void apple_gfx_set_display_mode(Object *obj, Visitor *v,
const PropertyInfo qdev_prop_apple_gfx_display_mode = {
.type = "display_mode",
+ .qapi_type = &str_type_info,
.description =
"Display mode in pixels and Hertz, as <width>x<height>@<refresh-rate> "
"Example: 3840x2160@60",
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 50/56] target/riscv: convert PropertyInfo definitions to use qapi_type
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (48 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 49/56] hw: convert device-local PropertyInfo definitions to use qapi_type Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 51/56] qdev: " Markus Armbruster
` (5 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange, Alistair Francis
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Mechanically add a .qapi_type pointer to PropertyInfo definitions in
target/riscv/cpu.c.
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
target/riscv/cpu.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index adb53aad96..362e561809 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1730,6 +1730,7 @@ static void prop_pmu_num_get(Object *obj, Visitor *v, const char *name,
static const PropertyInfo prop_pmu_num = {
.type = "uint8",
+ .qapi_type = &uint8_type_info,
.description = "pmu-num",
.get = prop_pmu_num_get,
.set = prop_pmu_num_set,
@@ -1772,6 +1773,7 @@ static void prop_pmu_mask_get(Object *obj, Visitor *v, const char *name,
static const PropertyInfo prop_pmu_mask = {
.type = "uint32",
+ .qapi_type = &uint32_type_info,
.description = "pmu-mask",
.get = prop_pmu_mask_get,
.set = prop_pmu_mask_set,
@@ -1804,6 +1806,7 @@ static void prop_mmu_get(Object *obj, Visitor *v, const char *name,
static const PropertyInfo prop_mmu = {
.type = "bool",
+ .qapi_type = &bool_type_info,
.description = "mmu",
.get = prop_mmu_get,
.set = prop_mmu_set,
@@ -1837,6 +1840,7 @@ static void prop_pmp_get(Object *obj, Visitor *v, const char *name,
static const PropertyInfo prop_pmp = {
.type = "bool",
+ .qapi_type = &bool_type_info,
.description = "pmp",
.get = prop_pmp_get,
.set = prop_pmp_set,
@@ -1877,6 +1881,7 @@ static void prop_num_pmp_regions_get(Object *obj, Visitor *v, const char *name,
static const PropertyInfo prop_num_pmp_regions = {
.type = "uint8",
+ .qapi_type = &uint8_type_info,
.description = "num-pmp-regions",
.get = prop_num_pmp_regions_get,
.set = prop_num_pmp_regions_set,
@@ -1915,6 +1920,7 @@ static void prop_pmp_granularity_get(Object *obj, Visitor *v, const char *name,
static const PropertyInfo prop_pmp_granularity = {
.type = "uint32",
+ .qapi_type = &uint32_type_info,
.description = "pmp-granularity",
.get = prop_pmp_granularity_get,
.set = prop_pmp_granularity_set,
@@ -1991,6 +1997,7 @@ static void prop_priv_spec_get(Object *obj, Visitor *v, const char *name,
static const PropertyInfo prop_priv_spec = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "priv_spec",
/* FIXME enum? */
.get = prop_priv_spec_get,
@@ -2024,6 +2031,7 @@ static void prop_vext_spec_get(Object *obj, Visitor *v, const char *name,
static const PropertyInfo prop_vext_spec = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "vext_spec",
/* FIXME enum? */
.get = prop_vext_spec_get,
@@ -2108,6 +2116,7 @@ static void prop_elen_get(Object *obj, Visitor *v, const char *name,
static const PropertyInfo prop_elen = {
.type = "uint16",
+ .qapi_type = &uint16_type_info,
.description = "elen",
.get = prop_elen_get,
.set = prop_elen_set,
@@ -2144,6 +2153,7 @@ static void prop_cbom_blksize_get(Object *obj, Visitor *v, const char *name,
static const PropertyInfo prop_cbom_blksize = {
.type = "uint16",
+ .qapi_type = &uint16_type_info,
.description = "cbom_blocksize",
.get = prop_cbom_blksize_get,
.set = prop_cbom_blksize_set,
@@ -2180,6 +2190,7 @@ static void prop_cbop_blksize_get(Object *obj, Visitor *v, const char *name,
static const PropertyInfo prop_cbop_blksize = {
.type = "uint16",
+ .qapi_type = &uint16_type_info,
.description = "cbop_blocksize",
.get = prop_cbop_blksize_get,
.set = prop_cbop_blksize_set,
@@ -2216,6 +2227,7 @@ static void prop_cboz_blksize_get(Object *obj, Visitor *v, const char *name,
static const PropertyInfo prop_cboz_blksize = {
.type = "uint16",
+ .qapi_type = &uint16_type_info,
.description = "cboz_blocksize",
.get = prop_cboz_blksize_get,
.set = prop_cboz_blksize_set,
@@ -2252,6 +2264,7 @@ static void prop_mvendorid_get(Object *obj, Visitor *v, const char *name,
static const PropertyInfo prop_mvendorid = {
.type = "uint32",
+ .qapi_type = &uint32_type_info,
.description = "mvendorid",
.get = prop_mvendorid_get,
.set = prop_mvendorid_set,
@@ -2288,6 +2301,7 @@ static void prop_mimpid_get(Object *obj, Visitor *v, const char *name,
static const PropertyInfo prop_mimpid = {
.type = "uint64",
+ .qapi_type = &uint64_type_info,
.description = "mimpid",
.get = prop_mimpid_get,
.set = prop_mimpid_set,
@@ -2345,6 +2359,7 @@ static void prop_marchid_get(Object *obj, Visitor *v, const char *name,
static const PropertyInfo prop_marchid = {
.type = "uint64",
+ .qapi_type = &uint64_type_info,
.description = "marchid",
.get = prop_marchid_get,
.set = prop_marchid_set,
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 51/56] qdev: convert PropertyInfo definitions to use qapi_type
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (49 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 50/56] target/riscv: convert " Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 52/56] qdev: PropertyInfo.enum_table is no longer used, drop Markus Armbruster
` (4 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange, Stefan Berger
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Add a .qapi_type pointer to the remaining PropertyInfo definitions
outside hw/.
After this patch, all PropertyInfo definitions have .qapi_type set,
except qdev_prop_link (uses .create) and qdev_prop_array (left for
later).
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
backends/spdm-socket.c | 3 ++-
backends/tpm/tpm_util.c | 2 ++
migration/options.c | 3 +++
target/sparc/cpu.c | 2 ++
4 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/backends/spdm-socket.c b/backends/spdm-socket.c
index 826efc276d..e1d5626062 100644
--- a/backends/spdm-socket.c
+++ b/backends/spdm-socket.c
@@ -17,6 +17,7 @@
#include "hw/core/qdev-properties.h"
#include "hw/core/qdev-properties-system.h"
#include "hw/core/qdev-prop-internal.h"
+#include "qapi/qapi-type-infos-sockets.h"
static bool read_bytes(const int socket, uint8_t *buffer,
size_t number_of_bytes)
@@ -254,8 +255,8 @@ void spdm_socket_close(const int socket, SpdmTransportType transport_type)
const PropertyInfo qdev_prop_spdm_trans = {
.type = "SpdmTransportType",
+ .qapi_type = &SpdmTransportType_type_info,
.description = "Spdm Transport, doe/nvme/mctp/scsi/unspecified",
- .enum_table = &SpdmTransportType_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
diff --git a/backends/tpm/tpm_util.c b/backends/tpm/tpm_util.c
index 7019f7fd3e..e52f342933 100644
--- a/backends/tpm/tpm_util.c
+++ b/backends/tpm/tpm_util.c
@@ -30,6 +30,7 @@
#include "system/tpm_backend.h"
#include "system/tpm_util.h"
#include "trace.h"
+#include "qapi/qapi-builtin-type-infos.h"
/* tpm backend property */
@@ -78,6 +79,7 @@ static void release_tpm(Object *obj, const char *name, void *opaque)
const PropertyInfo qdev_prop_tpm = {
.type = "str",
+ .qapi_type = &str_type_info,
.description = "ID of a tpm to use as a backend",
.get = get_tpm,
.set = set_tpm,
diff --git a/migration/options.c b/migration/options.c
index 46d040fc3f..1be4151ea7 100644
--- a/migration/options.c
+++ b/migration/options.c
@@ -37,6 +37,8 @@
#include "ram.h"
#include "options.h"
#include "system/kvm.h"
+#include "qapi/qapi-builtin-type-infos.h"
+#include "qapi/qapi-type-infos-common.h"
/* Maximum migrate downtime set to 2000 seconds */
#define MAX_MIGRATE_DOWNTIME_SECONDS 2000
@@ -295,6 +297,7 @@ static void set_default_value_tls_opt(ObjectProperty *op, const Property *prop)
*/
const PropertyInfo qdev_prop_StrOrNull = {
.type = "StrOrNull",
+ .qapi_type = &StrOrNull_type_info,
.get = get_StrOrNull,
.set = set_StrOrNull,
.release = release_StrOrNull,
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
index 28ae629d50..7729413698 100644
--- a/target/sparc/cpu.c
+++ b/target/sparc/cpu.c
@@ -30,6 +30,7 @@
#include "tcg/tcg.h"
#include "fpu/softfloat.h"
#include "target/sparc/translate.h"
+#include "qapi/qapi-builtin-type-infos.h"
//#define DEBUG_FEATURES
@@ -950,6 +951,7 @@ static void sparc_set_nwindows(Object *obj, Visitor *v, const char *name,
static const PropertyInfo qdev_prop_nwindows = {
.type = "int",
+ .qapi_type = &int_type_info,
.description = "Number of register windows",
.get = sparc_get_nwindows,
.set = sparc_set_nwindows,
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 52/56] qdev: PropertyInfo.enum_table is no longer used, drop
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (50 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 51/56] qdev: " Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 53/56] hw/i386: convert PCSouthBridgeOption to QAPI enum Markus Armbruster
` (3 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Now that all PropertyInfo for enums definitions use .qapi_type, remove
the legacy .enum_table field from PropertyInfo, along with the
qdev_propinfo_enum_lookup() helper.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/core/qdev-prop-internal.h | 2 --
include/hw/core/qdev-properties.h | 1 -
hw/core/qdev-properties-system.c | 12 +++++-------
hw/core/qdev-properties.c | 17 ++++-------------
4 files changed, 9 insertions(+), 23 deletions(-)
diff --git a/hw/core/qdev-prop-internal.h b/hw/core/qdev-prop-internal.h
index c190b7b88c..d7b77844fe 100644
--- a/hw/core/qdev-prop-internal.h
+++ b/hw/core/qdev-prop-internal.h
@@ -8,8 +8,6 @@
#ifndef HW_CORE_QDEV_PROP_INTERNAL_H
#define HW_CORE_QDEV_PROP_INTERNAL_H
-const QEnumLookup *qdev_propinfo_enum_lookup(const PropertyInfo *info);
-
void qdev_propinfo_get_enum(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp);
void qdev_propinfo_set_enum(Object *obj, Visitor *v, const char *name,
diff --git a/include/hw/core/qdev-properties.h b/include/hw/core/qdev-properties.h
index 1ea2ba66bb..a57291a5a1 100644
--- a/include/hw/core/qdev-properties.h
+++ b/include/hw/core/qdev-properties.h
@@ -33,7 +33,6 @@ struct Property {
struct PropertyInfo {
const char *type;
const char *description;
- const QEnumLookup *enum_table;
const QAPITypeInfo *qapi_type;
bool realized_set_allowed; /* allow setting property on realized device */
char *(*print)(Object *obj, const Property *prop);
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index 8924f84806..4d605c2056 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -592,7 +592,7 @@ static void qdev_propinfo_set_losttickpolicy(Object *obj, Visitor *v,
int value;
if (!visit_type_enum(v, name, &value,
- qdev_propinfo_enum_lookup(prop->info), errp)) {
+ prop->info->qapi_type->lookup, errp)) {
return;
}
@@ -1081,8 +1081,7 @@ static void get_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
abort();
}
- visit_type_enum(v, name, &speed,
- qdev_propinfo_enum_lookup(prop->info), errp);
+ visit_type_enum(v, name, &speed, prop->info->qapi_type->lookup, errp);
}
static void set_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
@@ -1093,7 +1092,7 @@ static void set_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
int speed;
if (!visit_type_enum(v, name, &speed,
- qdev_propinfo_enum_lookup(prop->info), errp)) {
+ prop->info->qapi_type->lookup, errp)) {
return;
}
@@ -1167,8 +1166,7 @@ static void get_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,
abort();
}
- visit_type_enum(v, name, &width,
- qdev_propinfo_enum_lookup(prop->info), errp);
+ visit_type_enum(v, name, &width, prop->info->qapi_type->lookup, errp);
}
static void set_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,
@@ -1179,7 +1177,7 @@ static void set_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,
int width;
if (!visit_type_enum(v, name, &width,
- qdev_propinfo_enum_lookup(prop->info), errp)) {
+ prop->info->qapi_type->lookup, errp)) {
return;
}
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index fb11eb1f1c..e2ea894595 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -101,22 +101,13 @@ static ObjectPropertyAccessor *field_prop_setter(const PropertyInfo *info)
return info->set ? field_prop_set : NULL;
}
-const QEnumLookup *qdev_propinfo_enum_lookup(const PropertyInfo *info)
-{
- if (info->qapi_type) {
- assert(info->qapi_type->lookup);
- return info->qapi_type->lookup;
- }
- return info->enum_table;
-}
-
void qdev_propinfo_get_enum(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
const Property *prop = opaque;
int *ptr = object_field_prop_ptr(obj, prop);
- visit_type_enum(v, name, ptr, qdev_propinfo_enum_lookup(prop->info), errp);
+ visit_type_enum(v, name, ptr, prop->info->qapi_type->lookup, errp);
}
void qdev_propinfo_set_enum(Object *obj, Visitor *v, const char *name,
@@ -125,14 +116,14 @@ void qdev_propinfo_set_enum(Object *obj, Visitor *v, const char *name,
const Property *prop = opaque;
int *ptr = object_field_prop_ptr(obj, prop);
- visit_type_enum(v, name, ptr, qdev_propinfo_enum_lookup(prop->info), errp);
+ visit_type_enum(v, name, ptr, prop->info->qapi_type->lookup, errp);
}
void qdev_propinfo_set_default_value_enum(ObjectProperty *op,
const Property *prop)
{
object_property_set_default_str(op,
- qapi_enum_lookup(qdev_propinfo_enum_lookup(prop->info),
+ qapi_enum_lookup(prop->info->qapi_type->lookup,
prop->defval.i));
}
@@ -970,7 +961,7 @@ void qdev_prop_set_enum(DeviceState *dev, const char *name, int value)
prop = qdev_prop_find(dev, name);
object_property_set_str(OBJECT(dev), name,
- qapi_enum_lookup(qdev_propinfo_enum_lookup(prop->info), value),
+ qapi_enum_lookup(prop->info->qapi_type->lookup, value),
&error_abort);
}
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 53/56] hw/i386: convert PCSouthBridgeOption to QAPI enum
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (51 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 52/56] qdev: PropertyInfo.enum_table is no longer used, drop Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 54/56] qom: Drop object_property_add_enum() parameter @lookup Markus Armbruster
` (2 subsequent siblings)
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Move PCSouthBridgeOption from a hand-rolled C enum to a proper QAPI
enum in qapi/machine.json.
This gives the x-south-bridge property a generated type_info with a
valid masked_name, so it appears in query-qmp-schema introspection and
the qapi-type field of qom-list-properties output.
The south_bridge/default_south_bridge fields change from const char *
to PCSouthBridgeOption, with an explicit mapping table from enum value
to QOM device type name.
Enum values are changed: "PIIX3"->"ppix3", "piix4-isa"->"piix4", this
is under a x-property, so shouldn't be a breaking change.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
qapi/machine.json | 13 +++++++++++
include/hw/i386/pc.h | 4 ++--
hw/i386/pc_piix.c | 52 +++++++++++---------------------------------
3 files changed, 28 insertions(+), 41 deletions(-)
diff --git a/qapi/machine.json b/qapi/machine.json
index 80348b5350..c19eea2b4b 100644
--- a/qapi/machine.json
+++ b/qapi/machine.json
@@ -416,6 +416,19 @@
{ 'enum': 'LostTickPolicy',
'data': ['discard', 'delay', 'slew' ] }
+##
+# @PCSouthBridgeOption:
+# South bridge chipset option for PC i440FX machines.
+#
+# @piix3: Intel PIIX3 (default)
+#
+# @piix4: Intel PIIX4
+#
+# Since: 11.2
+##
+{ 'enum': 'PCSouthBridgeOption',
+ 'data': ['piix3', 'piix4'] }
+
##
# @inject-nmi:
# Injects a Non-Maskable Interrupt (machine specific: for example
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 8edec62a1a..3afd376116 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -47,7 +47,7 @@ typedef struct PCMachineState {
uint64_t max_ram_below_4g;
OnOffAuto vmport;
SmbiosEntryPointType smbios_entry_point_type;
- const char *south_bridge;
+ PCSouthBridgeOption south_bridge;
bool acpi_build_enabled;
bool wdat_enabled;
@@ -94,7 +94,7 @@ struct PCMachineClass {
/* Device configuration: */
bool pci_enabled;
- const char *default_south_bridge;
+ PCSouthBridgeOption default_south_bridge;
/* Compat options: */
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index ae07e6c56c..20bd4231c1 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -47,6 +47,7 @@
#include "hw/acpi/acpi.h"
#include "hw/vfio/types.h"
#include "qapi/error.h"
+#include "qapi/qapi-type-infos-machine.h"
#include "qemu/error-report.h"
#include "system/xen.h"
#ifdef CONFIG_XEN
@@ -75,6 +76,11 @@ static GlobalProperty pc_piix_compat_defaults[] = {
static const size_t pc_piix_compat_defaults_len =
G_N_ELEMENTS(pc_piix_compat_defaults);
+static const char *pc_south_bridge_type[] = {
+ [PC_SOUTH_BRIDGE_OPTION_PIIX3] = TYPE_PIIX3_DEVICE,
+ [PC_SOUTH_BRIDGE_OPTION_PIIX4] = TYPE_PIIX4_PCI_DEVICE,
+};
+
/*
* Return the global irq number corresponding to a given device irq
* pin. We could also use the bus number to have a more precise mapping.
@@ -236,7 +242,8 @@ static void pc_init1(MachineState *machine, const char *pci_type)
gsi_state = pc_gsi_create(&x86ms->gsi, true);
- pci_dev = pci_new_multifunction(-1, pcms->south_bridge);
+ pci_dev = pci_new_multifunction(-1,
+ pc_south_bridge_type[pcms->south_bridge]);
object_property_set_bool(OBJECT(pci_dev), "has-usb",
machine_usb(machine), &error_abort);
object_property_set_bool(OBJECT(pci_dev), "has-acpi",
@@ -317,51 +324,18 @@ static void pc_init1(MachineState *machine, const char *pci_type)
}
}
-typedef enum PCSouthBridgeOption {
- PC_SOUTH_BRIDGE_OPTION_PIIX3,
- PC_SOUTH_BRIDGE_OPTION_PIIX4,
- PC_SOUTH_BRIDGE_OPTION_MAX,
-} PCSouthBridgeOption;
-
-static const QEnumLookup PCSouthBridgeOption_lookup = {
- .array = (const char *const[]) {
- [PC_SOUTH_BRIDGE_OPTION_PIIX3] = TYPE_PIIX3_DEVICE,
- [PC_SOUTH_BRIDGE_OPTION_PIIX4] = TYPE_PIIX4_PCI_DEVICE,
- },
- .size = PC_SOUTH_BRIDGE_OPTION_MAX
-};
-
static int pc_get_south_bridge(Object *obj, Error **errp)
{
PCMachineState *pcms = PC_MACHINE(obj);
- int i;
- for (i = 0; i < PCSouthBridgeOption_lookup.size; i++) {
- if (g_strcmp0(PCSouthBridgeOption_lookup.array[i],
- pcms->south_bridge) == 0) {
- return i;
- }
- }
-
- error_setg(errp, "Invalid south bridge value set");
- return 0;
+ return pcms->south_bridge;
}
static void pc_set_south_bridge(Object *obj, int value, Error **errp)
{
PCMachineState *pcms = PC_MACHINE(obj);
- if (value < 0) {
- error_setg(errp, "Value can't be negative");
- return;
- }
-
- if (value >= PCSouthBridgeOption_lookup.size) {
- error_setg(errp, "Value too big");
- return;
- }
-
- pcms->south_bridge = PCSouthBridgeOption_lookup.array[value];
+ pcms->south_bridge = value;
}
#ifdef CONFIG_XEN
@@ -398,7 +372,7 @@ static void pc_i440fx_machine_options(MachineClass *m)
{
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
ObjectClass *oc = OBJECT_CLASS(m);
- pcmc->default_south_bridge = TYPE_PIIX3_DEVICE;
+ pcmc->default_south_bridge = PC_SOUTH_BRIDGE_OPTION_PIIX3;
pcmc->pci_root_uid = 0;
pcmc->default_cpu_version = 1;
@@ -414,8 +388,8 @@ static void pc_i440fx_machine_options(MachineClass *m)
machine_class_allow_dynamic_sysbus_dev(m, TYPE_UEFI_VARS_X64);
object_class_property_add_enum(oc, "x-south-bridge",
- "PCSouthBridgeOption", NULL,
- &PCSouthBridgeOption_lookup,
+ "PCSouthBridgeOption",
+ &PCSouthBridgeOption_type_info, NULL,
pc_get_south_bridge,
pc_set_south_bridge);
object_class_property_set_description(oc, "x-south-bridge",
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 54/56] qom: Drop object_property_add_enum() parameter @lookup
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (52 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 53/56] hw/i386: convert PCSouthBridgeOption to QAPI enum Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-02 5:39 ` marcandre.lureau
2026-11-01 20:17 ` [PATCH v8 55/56] qom: use QAPITypeInfo in object_property_get_enum Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 56/56] tests/qmp-cmd-test: assert qapi-type resolves in query-qmp-schema Markus Armbruster
55 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
All callers now pass non-null @qapi_type and null @lookup. Drop
@lookup and simplify the code accordingly.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
include/chardev/char.h | 3 +--
include/qom/object.h | 4 ----
accel/hvf/hvf-all.c | 2 +-
accel/kvm/kvm-all.c | 2 +-
accel/whpx/whpx-common.c | 4 ++--
authz/list.c | 1 -
backends/hostmem-file.c | 2 +-
backends/hostmem-memfd.c | 4 ++--
backends/hostmem.c | 2 +-
crypto/secret_common.c | 2 +-
crypto/tlscreds.c | 2 +-
hw/arm/virt.c | 4 ++--
hw/i386/microvm.c | 15 ++++++---------
hw/i386/pc.c | 5 ++---
hw/i386/pc_piix.c | 5 ++---
hw/i386/x86.c | 12 ++++--------
hw/loongarch/virt.c | 14 +++++++-------
hw/microblaze/petalogix_s3adsp1800_mmu.c | 2 +-
hw/riscv/virt.c | 10 +++++-----
monitor/qmp.c | 2 +-
net/filter.c | 5 +++--
qom/object.c | 15 ++++-----------
target/i386/kvm/kvm.c | 4 ++--
target/i386/sev.c | 2 +-
target/i386/whpx/whpx-all.c | 7 +++----
tests/unit/check-qom-proplist.c | 3 +--
ui/dbus.c | 4 ++--
ui/input-linux.c | 2 +-
28 files changed, 58 insertions(+), 81 deletions(-)
diff --git a/include/chardev/char.h b/include/chardev/char.h
index 61e6957118..45fc3edb5e 100644
--- a/include/chardev/char.h
+++ b/include/chardev/char.h
@@ -358,8 +358,7 @@ static inline void chardev_vc_add_encoding_prop(ObjectClass *oc,
void (*set)(Object *, int, Error **))
{
object_class_property_add_enum(oc, "encoding", "ChardevVCEncoding",
- &ChardevVCEncoding_type_info, NULL,
- get, set);
+ &ChardevVCEncoding_type_info, get, set);
}
#endif
diff --git a/include/qom/object.h b/include/qom/object.h
index d1699964fa..a90cd30675 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1988,7 +1988,6 @@ ObjectProperty *object_class_property_add_bool(ObjectClass *klass,
* @name: the name of the property
* @typename: the name of the enum data type
* @qapi_type: QAPI type info descriptor
- * @lookup: enum value namelookup table
* @get: the getter or %NULL if the property is write-only.
* @set: the setter or %NULL if the property is read-only
*
@@ -2000,7 +1999,6 @@ ObjectProperty *object_class_property_add_bool(ObjectClass *klass,
ObjectProperty *object_property_add_enum(Object *obj, const char *name,
const char *typename,
const QAPITypeInfo *qapi_type,
- const QEnumLookup *lookup,
int (*get)(Object *, Error **),
void (*set)(Object *, int, Error **));
@@ -2010,7 +2008,6 @@ ObjectProperty *object_property_add_enum(Object *obj, const char *name,
* @name: the name of the property
* @typename: the name of the enum data type
* @qapi_type: QAPI type info descriptor
- * @lookup: enum value namelookup table
* @get: the getter or %NULL if the property is write-only.
* @set: the setter or %NULL if the property is read-only
*
@@ -2023,7 +2020,6 @@ ObjectProperty *object_class_property_add_enum(ObjectClass *klass,
const char *name,
const char *typename,
const QAPITypeInfo *qapi_type,
- const QEnumLookup *lookup,
int (*get)(Object *, Error **),
void (*set)(Object *, int, Error **));
diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c
index 938379b9f2..f233d86c06 100644
--- a/accel/hvf/hvf-all.c
+++ b/accel/hvf/hvf-all.c
@@ -271,7 +271,7 @@ static void hvf_accel_class_init(ObjectClass *oc, const void *data)
object_class_property_add_enum(oc, "kernel-irqchip", "on|off|split",
&OnOffSplit_type_info, NULL,
- NULL, hvf_set_kernel_irqchip);
+ hvf_set_kernel_irqchip);
object_class_property_set_description(oc, "kernel-irqchip",
"Configure HVF irqchip");
}
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index dcb1db139d..313c41c4a2 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -4299,7 +4299,7 @@ static void kvm_accel_class_init(ObjectClass *oc, const void *data)
object_class_property_add_enum(oc, "kernel-irqchip", "on|off|split",
&OnOffSplit_type_info, NULL,
- NULL, kvm_set_kernel_irqchip);
+ kvm_set_kernel_irqchip);
object_class_property_set_description(oc, "kernel-irqchip",
"Configure KVM in-kernel irqchip");
diff --git a/accel/whpx/whpx-common.c b/accel/whpx/whpx-common.c
index 068258bf6c..78d2827809 100644
--- a/accel/whpx/whpx-common.c
+++ b/accel/whpx/whpx-common.c
@@ -510,12 +510,12 @@ static void whpx_accel_class_init(ObjectClass *oc, const void *data)
object_class_property_add_enum(oc, "kernel-irqchip", "on|off|split",
&OnOffSplit_type_info, NULL,
- NULL, whpx_set_kernel_irqchip);
+ whpx_set_kernel_irqchip);
object_class_property_set_description(oc, "kernel-irqchip",
"Configure WHPX in-kernel irqchip");
object_class_property_add_enum(oc, "hyperv", "OnOffAuto",
&OnOffAuto_type_info, NULL,
- NULL, whpx_set_hyperv);
+ whpx_set_hyperv);
object_class_property_set_description(oc, "hyperv",
"Configure Hyper-V enlightenments");
diff --git a/authz/list.c b/authz/list.c
index 75155cf077..c3dd9d7b68 100644
--- a/authz/list.c
+++ b/authz/list.c
@@ -123,7 +123,6 @@ qauthz_list_class_init(ObjectClass *oc, const void *data)
object_class_property_add_enum(oc, "policy", "QAuthZListPolicy",
&QAuthZListPolicy_type_info,
- NULL,
qauthz_list_prop_get_policy,
qauthz_list_prop_set_policy);
diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
index 2f65ca3678..6ad9cad032 100644
--- a/backends/hostmem-file.c
+++ b/backends/hostmem-file.c
@@ -293,7 +293,7 @@ file_backend_class_init(ObjectClass *oc, const void *data)
file_memory_backend_get_readonly,
file_memory_backend_set_readonly);
object_class_property_add_enum(oc, "rom", "OnOffAuto",
- &OnOffAuto_type_info, NULL,
+ &OnOffAuto_type_info,
file_memory_backend_get_rom,
file_memory_backend_set_rom);
object_class_property_set_description(oc, "rom",
diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c
index 19a9a5b409..496455f7aa 100644
--- a/backends/hostmem-memfd.c
+++ b/backends/hostmem-memfd.c
@@ -201,8 +201,8 @@ memfd_backend_class_init(ObjectClass *oc, const void *data)
"Huge pages size (ex: 2M, 1G)");
}
- object_class_property_add_enum(oc, "guest-memfd", "OnOffAuto",
- &OnOffAuto_type_info, NULL,
+ object_class_property_add_enum(oc, "guest-memfd", "OnOffAuto",
+ &OnOffAuto_type_info,
memfd_backend_get_guest_memfd,
memfd_backend_set_guest_memfd);
object_class_property_set_description(oc, "guest-memfd",
diff --git a/backends/hostmem.c b/backends/hostmem.c
index 0f39f4d1b7..173d042be3 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -554,7 +554,7 @@ host_memory_backend_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, "host-nodes",
"Binds memory to the list of NUMA host nodes");
object_class_property_add_enum(oc, "policy", "HostMemPolicy",
- &HostMemPolicy_type_info, NULL,
+ &HostMemPolicy_type_info,
host_memory_backend_get_policy,
host_memory_backend_set_policy);
object_class_property_set_description(oc, "policy",
diff --git a/crypto/secret_common.c b/crypto/secret_common.c
index 8e05f1365e..98898aa885 100644
--- a/crypto/secret_common.c
+++ b/crypto/secret_common.c
@@ -271,7 +271,7 @@ qcrypto_secret_class_init(ObjectClass *oc, const void *data)
ucc->complete = qcrypto_secret_complete;
object_class_property_add_enum(oc, "format", "QCryptoSecretFormat",
- &QCryptoSecretFormat_type_info, NULL,
+ &QCryptoSecretFormat_type_info,
qcrypto_secret_prop_get_format,
qcrypto_secret_prop_set_format);
object_class_property_add_str(oc, "keyid",
diff --git a/crypto/tlscreds.c b/crypto/tlscreds.c
index 021e4bf111..74d8d4fe00 100644
--- a/crypto/tlscreds.c
+++ b/crypto/tlscreds.c
@@ -223,7 +223,7 @@ qcrypto_tls_creds_class_init(ObjectClass *oc, const void *data)
qcrypto_tls_creds_prop_get_dir,
qcrypto_tls_creds_prop_set_dir);
object_class_property_add_enum(oc, "endpoint", "QCryptoTLSCredsEndpoint",
- &QCryptoTLSCredsEndpoint_type_info, NULL,
+ &QCryptoTLSCredsEndpoint_type_info,
qcrypto_tls_creds_prop_get_endpoint,
qcrypto_tls_creds_prop_set_endpoint);
object_class_property_add_str(oc, "priority",
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 2f03679afd..57bd78479f 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -4202,8 +4202,8 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
mc->default_nic = "virtio-net-pci";
object_class_property_add_enum(oc, "acpi", "OnOffAuto",
- &OnOffAuto_type_info, NULL,
- virt_get_acpi, virt_set_acpi);
+ &OnOffAuto_type_info, virt_get_acpi,
+ virt_set_acpi);
object_class_property_set_description(oc, "acpi",
"Enable ACPI");
object_class_property_add_bool(oc, "secure", virt_get_secure,
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index 7f010cb2f2..ed391c0596 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -658,25 +658,22 @@ static void microvm_class_init(ObjectClass *oc, const void *data)
hc->unplug_request = microvm_device_unplug_request_cb;
hc->unplug = microvm_device_unplug_cb;
- object_class_property_add_enum(oc, MICROVM_MACHINE_RTC,
- "OnOffAuto",
- &OnOffAuto_type_info, NULL,
+ object_class_property_add_enum(oc, MICROVM_MACHINE_RTC, "OnOffAuto",
+ &OnOffAuto_type_info,
microvm_machine_get_rtc,
microvm_machine_set_rtc);
object_class_property_set_description(oc, MICROVM_MACHINE_RTC,
"Enable MC146818 RTC");
- object_class_property_add_enum(oc, MICROVM_MACHINE_PCIE,
- "OnOffAuto",
- &OnOffAuto_type_info, NULL,
+ object_class_property_add_enum(oc, MICROVM_MACHINE_PCIE, "OnOffAuto",
+ &OnOffAuto_type_info,
microvm_machine_get_pcie,
microvm_machine_set_pcie);
object_class_property_set_description(oc, MICROVM_MACHINE_PCIE,
"Enable PCIe");
- object_class_property_add_enum(oc, MICROVM_MACHINE_IOAPIC2,
- "OnOffAuto",
- &OnOffAuto_type_info, NULL,
+ object_class_property_add_enum(oc, MICROVM_MACHINE_IOAPIC2, "OnOffAuto",
+ &OnOffAuto_type_info,
microvm_machine_get_ioapic2,
microvm_machine_set_ioapic2);
object_class_property_set_description(oc, MICROVM_MACHINE_IOAPIC2,
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 80940e81e5..4737eb471c 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1726,9 +1726,8 @@ static void pc_machine_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, PC_MACHINE_MAX_RAM_BELOW_4G,
"Maximum ram below the 4G boundary (32bit boundary)");
- object_class_property_add_enum(oc, PC_MACHINE_VMPORT,
- "OnOffAuto",
- &OnOffAuto_type_info, NULL,
+ object_class_property_add_enum(oc, PC_MACHINE_VMPORT, "OnOffAuto",
+ &OnOffAuto_type_info,
pc_machine_get_vmport,
pc_machine_set_vmport);
object_class_property_set_description(oc, PC_MACHINE_VMPORT,
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 20bd4231c1..211e3c5f9e 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -389,9 +389,8 @@ static void pc_i440fx_machine_options(MachineClass *m)
object_class_property_add_enum(oc, "x-south-bridge",
"PCSouthBridgeOption",
- &PCSouthBridgeOption_type_info, NULL,
- pc_get_south_bridge,
- pc_set_south_bridge);
+ &PCSouthBridgeOption_type_info,
+ pc_get_south_bridge, pc_set_south_bridge);
object_class_property_set_description(oc, "x-south-bridge",
"Use a different south bridge than PIIX3");
compat_props_add(m->compat_props,
diff --git a/hw/i386/x86.c b/hw/i386/x86.c
index 4e5a7cf270..4b75b7406a 100644
--- a/hw/i386/x86.c
+++ b/hw/i386/x86.c
@@ -373,29 +373,25 @@ static void x86_machine_class_init(ObjectClass *oc, const void *data)
nc->raise_nmi = x86_nmi;
object_class_property_add_enum(oc, X86_MACHINE_SMM, "OnOffAuto",
- &OnOffAuto_type_info, NULL,
- x86_machine_get_smm,
+ &OnOffAuto_type_info, x86_machine_get_smm,
x86_machine_set_smm);
object_class_property_set_description(oc, X86_MACHINE_SMM,
"Enable SMM");
object_class_property_add_enum(oc, X86_MACHINE_ACPI, "OnOffAuto",
- &OnOffAuto_type_info, NULL,
- x86_machine_get_acpi,
+ &OnOffAuto_type_info, x86_machine_get_acpi,
x86_machine_set_acpi);
object_class_property_set_description(oc, X86_MACHINE_ACPI,
"Enable ACPI");
object_class_property_add_enum(oc, X86_MACHINE_PIT, "OnOffAuto",
- &OnOffAuto_type_info, NULL,
- x86_machine_get_pit,
+ &OnOffAuto_type_info, x86_machine_get_pit,
x86_machine_set_pit);
object_class_property_set_description(oc, X86_MACHINE_PIT,
"Enable i8254 PIT");
object_class_property_add_enum(oc, X86_MACHINE_PIC, "OnOffAuto",
- &OnOffAuto_type_info, NULL,
- x86_machine_get_pic,
+ &OnOffAuto_type_info, x86_machine_get_pic,
x86_machine_set_pic);
object_class_property_set_description(oc, X86_MACHINE_PIC,
"Enable i8259 PIC");
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 1eae2bffe6..598898e0fb 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -1470,18 +1470,18 @@ static void virt_class_init(ObjectClass *oc, const void *data)
hc->unplug = virt_device_unplug;
object_class_property_add_enum(oc, "acpi", "OnOffAuto",
- &OnOffAuto_type_info, NULL,
- virt_get_acpi, virt_set_acpi);
+ &OnOffAuto_type_info, virt_get_acpi,
+ virt_set_acpi);
object_class_property_set_description(oc, "acpi",
"Enable ACPI");
object_class_property_add_enum(oc, "v-eiointc", "OnOffAuto",
- &OnOffAuto_type_info, NULL,
- virt_get_veiointc, virt_set_veiointc);
+ &OnOffAuto_type_info, virt_get_veiointc,
+ virt_set_veiointc);
object_class_property_set_description(oc, "v-eiointc",
"Enable Virt Extend I/O Interrupt Controller.");
- object_class_property_add_enum(oc, "dmsi", "OnOffAuto",
- &OnOffAuto_type_info, NULL,
- virt_get_dmsi, virt_set_dmsi);
+ object_class_property_add_enum(oc, "dmsi", "OnOffAuto",
+ &OnOffAuto_type_info, virt_get_dmsi,
+ virt_set_dmsi);
object_class_property_set_description(oc, "dmsi",
"Enable direct Message-interrupts Controller.");
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c b/hw/microblaze/petalogix_s3adsp1800_mmu.c
index b52f12924d..4ad04801ce 100644
--- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
+++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
@@ -176,7 +176,7 @@ static void petalogix_s3adsp1800_machine_class_init(ObjectClass *oc,
mc->is_default = true;
prop = object_class_property_add_enum(oc, "endianness", "EndianMode",
- &EndianMode_type_info, NULL,
+ &EndianMode_type_info,
machine_get_endianness,
machine_set_endianness);
object_property_set_default_str(prop, target_big_endian() ? "big"
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index 31fecdc964..0cb731482a 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -1175,14 +1175,14 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
}
object_class_property_add_enum(oc, "acpi", "OnOffAuto",
- &OnOffAuto_type_info, NULL,
- virt_get_acpi, virt_set_acpi);
+ &OnOffAuto_type_info, virt_get_acpi,
+ virt_set_acpi);
object_class_property_set_description(oc, "acpi",
"Enable ACPI");
- object_class_property_add_enum(oc, "iommu-sys", "OnOffAuto",
- &OnOffAuto_type_info, NULL,
- virt_get_iommu_sys, virt_set_iommu_sys);
+ object_class_property_add_enum(oc, "iommu-sys", "OnOffAuto",
+ &OnOffAuto_type_info, virt_get_iommu_sys,
+ virt_set_iommu_sys);
object_class_property_set_description(oc, "iommu-sys",
"Enable IOMMU platform device");
}
diff --git a/monitor/qmp.c b/monitor/qmp.c
index c6341f1a20..d2e45d3993 100644
--- a/monitor/qmp.c
+++ b/monitor/qmp.c
@@ -136,7 +136,7 @@ static void monitor_qmp_class_init(ObjectClass *cls, const void *data)
monitor_qmp_set_pretty);
object_class_property_add_enum(cls, "close-action",
"MonitorQMPCloseAction",
- &MonitorQMPCloseAction_type_info, NULL,
+ &MonitorQMPCloseAction_type_info,
monitor_qmp_get_close_action,
monitor_qmp_set_close_action);
diff --git a/net/filter.c b/net/filter.c
index 9013d872ea..145c72107a 100644
--- a/net/filter.c
+++ b/net/filter.c
@@ -344,8 +344,9 @@ static void netfilter_class_init(ObjectClass *oc, const void *data)
object_class_property_add_str(oc, "netdev",
netfilter_get_netdev_id, netfilter_set_netdev_id);
object_class_property_add_enum(oc, "queue", "NetFilterDirection",
- &NetFilterDirection_type_info, NULL,
- netfilter_get_direction, netfilter_set_direction);
+ &NetFilterDirection_type_info,
+ netfilter_get_direction,
+ netfilter_set_direction);
object_class_property_add_str(oc, "status",
netfilter_get_status, netfilter_set_status);
object_class_property_add_str(oc, "position",
diff --git a/qom/object.c b/qom/object.c
index 637459c2b1..c285eb849f 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -2501,8 +2501,7 @@ object_class_property_add_bool(ObjectClass *klass, const char *name,
}
typedef struct EnumProperty {
- const QAPITypeInfo *qapi_type; /* non-null for QAPI enums */
- const QEnumLookup *lookup;
+ const QAPITypeInfo *qapi_type;
int (*get)(Object *, Error **);
void (*set)(Object *, int, Error **);
} EnumProperty;
@@ -2520,7 +2519,7 @@ static void property_get_enum(Object *obj, Visitor *v, const char *name,
return;
}
- visit_type_enum(v, name, &value, prop->lookup, errp);
+ visit_type_enum(v, name, &value, prop->qapi_type->lookup, errp);
}
static void property_set_enum(Object *obj, Visitor *v, const char *name,
@@ -2529,7 +2528,7 @@ static void property_set_enum(Object *obj, Visitor *v, const char *name,
EnumProperty *prop = opaque;
int value;
- if (!visit_type_enum(v, name, &value, prop->lookup, errp)) {
+ if (!visit_type_enum(v, name, &value, prop->qapi_type->lookup, errp)) {
return;
}
prop->set(obj, value, errp);
@@ -2539,15 +2538,12 @@ ObjectProperty *
object_property_add_enum(Object *obj, const char *name,
const char *typename,
const QAPITypeInfo *qapi_type,
- const QEnumLookup *lookup,
int (*get)(Object *, Error **),
void (*set)(Object *, int, Error **))
{
EnumProperty *prop = g_malloc(sizeof(*prop));
- assert(!qapi_type != !lookup);
prop->qapi_type = qapi_type;
- prop->lookup = lookup ?: qapi_type->lookup;
prop->get = get;
prop->set = set;
@@ -2562,15 +2558,12 @@ ObjectProperty *
object_class_property_add_enum(ObjectClass *klass, const char *name,
const char *typename,
const QAPITypeInfo *qapi_type,
- const QEnumLookup *lookup,
int (*get)(Object *, Error **),
void (*set)(Object *, int, Error **))
{
EnumProperty *prop = g_malloc(sizeof(*prop));
- assert(!qapi_type != !lookup);
prop->qapi_type = qapi_type;
- prop->lookup = lookup ?: qapi_type->lookup;
prop->get = get;
prop->set = set;
@@ -2607,7 +2600,7 @@ int object_property_get_enum(Object *obj, const char *name,
return -1;
}
- ret = qapi_enum_parse(enumprop->lookup, str, -1, errp);
+ ret = qapi_enum_parse(enumprop->qapi_type->lookup, str, -1, errp);
g_free(str);
return ret;
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index e003e47c5b..64c9e2e379 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -7092,7 +7092,7 @@ static void kvm_arch_set_honor_guest_pat(Object *obj, int value, Error **errp)
void kvm_arch_accel_class_init(ObjectClass *oc)
{
object_class_property_add_enum(oc, "notify-vmexit", "NotifyVMexitOption",
- &NotifyVmexitOption_type_info, NULL,
+ &NotifyVmexitOption_type_info,
kvm_arch_get_notify_vmexit,
kvm_arch_set_notify_vmexit);
object_class_property_set_description(oc, "notify-vmexit",
@@ -7132,7 +7132,7 @@ void kvm_arch_accel_class_init(ObjectClass *oc)
"Maximum number of Xen PIRQs");
object_class_property_add_enum(oc, "honor-guest-pat", "OnOffAuto",
- &OnOffAuto_type_info, NULL,
+ &OnOffAuto_type_info,
kvm_arch_get_honor_guest_pat,
kvm_arch_set_honor_guest_pat);
object_class_property_set_description(oc, "honor-guest-pat",
diff --git a/target/i386/sev.c b/target/i386/sev.c
index c1c12d1125..604c2255ac 100644
--- a/target/i386/sev.c
+++ b/target/i386/sev.c
@@ -3019,7 +3019,7 @@ sev_guest_class_init(ObjectClass *oc, const void *data)
object_class_property_set_description(oc, "session-file",
"guest owners session parameters (encoded with base64)");
object_class_property_add_enum(oc, "legacy-vm-type", "OnOffAuto",
- &OnOffAuto_type_info, NULL,
+ &OnOffAuto_type_info,
sev_guest_get_legacy_vm_type,
sev_guest_set_legacy_vm_type);
object_class_property_set_description(oc, "legacy-vm-type",
diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c
index c459138c7e..e3e672dcd1 100644
--- a/target/i386/whpx/whpx-all.c
+++ b/target/i386/whpx/whpx-all.c
@@ -2974,17 +2974,16 @@ void whpx_arch_accel_class_init(ObjectClass *oc)
{
object_class_property_add_enum(oc, "ignore-unknown-msr", "OnOffAuto",
&OnOffAuto_type_info, NULL,
- NULL, whpx_set_unknown_msr);
+ whpx_set_unknown_msr);
object_class_property_set_description(oc, "ignore-unknown-msr",
"Configure unknown MSR behavior");
object_class_property_add_enum(oc, "intercept-msr-gp", "OnOffAuto",
&OnOffAuto_type_info, NULL,
- NULL, whpx_set_intercept_msr_gp);
+ whpx_set_intercept_msr_gp);
object_class_property_set_description(oc, "intercept-msr-gp",
"Intercept #GP to log erroring MSR accesses.");
object_class_property_add_enum(oc, "ssd", "OnOffAuto",
- &OnOffAuto_type_info, NULL,
- NULL, whpx_set_ssd);
+ &OnOffAuto_type_info, NULL, whpx_set_ssd);
object_class_property_set_description(oc, "ssd",
"Separate security domain");
}
diff --git a/tests/unit/check-qom-proplist.c b/tests/unit/check-qom-proplist.c
index 246935d714..381a868a80 100644
--- a/tests/unit/check-qom-proplist.c
+++ b/tests/unit/check-qom-proplist.c
@@ -152,8 +152,7 @@ static void dummy_class_init(ObjectClass *cls, const void *data)
dummy_get_sv, dummy_set_sv,
NULL, NULL);
object_class_property_add_enum(cls, "av", "DummyAnimal",
- &dummy_animal_qapi_type_info, NULL,
- dummy_get_av,
+ &dummy_animal_qapi_type_info, dummy_get_av,
dummy_set_av);
}
diff --git a/ui/dbus.c b/ui/dbus.c
index 9c21204771..f473a66889 100644
--- a/ui/dbus.c
+++ b/ui/dbus.c
@@ -511,8 +511,8 @@ dbus_display_class_init(ObjectClass *oc, const void *data)
object_class_property_add_str(oc, "addr", get_dbus_addr, set_dbus_addr);
object_class_property_add_str(oc, "audiodev", get_audiodev, set_audiodev);
object_class_property_add_enum(oc, "gl-mode", "DisplayGLMode",
- &DisplayGLMode_type_info, NULL,
- get_gl_mode, set_gl_mode);
+ &DisplayGLMode_type_info, get_gl_mode,
+ set_gl_mode);
}
#define TYPE_CHARDEV_VC "chardev-vc"
diff --git a/ui/input-linux.c b/ui/input-linux.c
index 127be74450..c7f9114036 100644
--- a/ui/input-linux.c
+++ b/ui/input-linux.c
@@ -508,7 +508,7 @@ static void input_linux_class_init(ObjectClass *oc, const void *data)
input_linux_get_repeat,
input_linux_set_repeat);
object_class_property_add_enum(oc, "grab-toggle", "GrabToggleKeys",
- &GrabToggleKeys_type_info, NULL,
+ &GrabToggleKeys_type_info,
input_linux_get_grab_toggle,
input_linux_set_grab_toggle);
}
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 55/56] qom: use QAPITypeInfo in object_property_get_enum
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (53 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 54/56] qom: Drop object_property_add_enum() parameter @lookup Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
2026-11-01 20:17 ` [PATCH v8 56/56] tests/qmp-cmd-test: assert qapi-type resolves in query-qmp-schema Markus Armbruster
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
The typename parameter becomes a QAPITypeInfo pointer, and the
validation compares prop->qapi_type against it instead of matching
prop->type strings.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
include/qom/object.h | 4 ++--
hw/core/machine-qmp-cmds.c | 4 +++-
qom/object.c | 14 ++++++--------
tests/unit/check-qom-proplist.c | 6 +++---
4 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/include/qom/object.h b/include/qom/object.h
index a90cd30675..9338f0b986 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1562,7 +1562,7 @@ uint64_t object_property_get_uint(Object *obj, const char *name,
* object_property_get_enum:
* @obj: the object
* @name: the name of the property
- * @typename: the name of the enum data type
+ * @type_info: the QAPITypeInfo of the enum
* @errp: returns an error if this function fails
*
* Returns: the value of the property, converted to an integer (which
@@ -1570,7 +1570,7 @@ uint64_t object_property_get_uint(Object *obj, const char *name,
* value is not an enum).
*/
int object_property_get_enum(Object *obj, const char *name,
- const char *typename, Error **errp);
+ const QAPITypeInfo *type_info, Error **errp);
/**
* object_property_set:
diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c
index 07a048d0a9..0558d6d703 100644
--- a/hw/core/machine-qmp-cmds.c
+++ b/hw/core/machine-qmp-cmds.c
@@ -18,6 +18,7 @@
#include "qapi/qapi-commands-accelerator.h"
#include "qapi/qapi-commands-machine.h"
#include "qobject/qobject.h"
+#include "qapi/qapi-type-infos-common.h"
#include "qapi/qobject-input-visitor.h"
#include "qapi/type-helpers.h"
#include "qemu/uuid.h"
@@ -278,7 +279,8 @@ static int query_memdev(Object *obj, void *opaque)
} else {
m->has_reserve = true;
}
- m->policy = object_property_get_enum(obj, "policy", "HostMemPolicy",
+ m->policy = object_property_get_enum(obj, "policy",
+ &HostMemPolicy_type_info,
&error_abort);
host_nodes = object_property_get_qobject(obj,
"host-nodes",
diff --git a/qom/object.c b/qom/object.c
index c285eb849f..0858c4a214 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -2575,32 +2575,30 @@ object_class_property_add_enum(ObjectClass *klass, const char *name,
}
int object_property_get_enum(Object *obj, const char *name,
- const char *typename, Error **errp)
+ const QAPITypeInfo *type_info, Error **errp)
{
char *str;
int ret;
ObjectProperty *prop = object_property_find_err(obj, name, errp);
- EnumProperty *enumprop;
if (prop == NULL) {
return -1;
}
- if (!g_str_equal(prop->type, typename)) {
+ if (prop->qapi_type != type_info) {
error_setg(errp, "Property %s on %s is not '%s' enum type",
- name, object_class_get_name(
- object_get_class(obj)), typename);
+ name, object_class_get_name(object_get_class(obj)),
+ type_info->name);
return -1;
}
- enumprop = prop->opaque;
-
str = object_property_get_str(obj, name, errp);
if (!str) {
return -1;
}
- ret = qapi_enum_parse(enumprop->qapi_type->lookup, str, -1, errp);
+ assert(prop->qapi_type);
+ ret = qapi_enum_parse(prop->qapi_type->lookup, str, -1, errp);
g_free(str);
return ret;
diff --git a/tests/unit/check-qom-proplist.c b/tests/unit/check-qom-proplist.c
index 381a868a80..bf7c1386be 100644
--- a/tests/unit/check-qom-proplist.c
+++ b/tests/unit/check-qom-proplist.c
@@ -580,14 +580,14 @@ static void test_dummy_getenum(void)
val = object_property_get_enum(OBJECT(dobj),
"av",
- "DummyAnimal",
+ &dummy_animal_qapi_type_info,
&error_abort);
g_assert(val == DUMMY_PLATYPUS);
/* A bad enum type name */
val = object_property_get_enum(OBJECT(dobj),
"av",
- "BadAnimal",
+ &dummy_str_qapi_type_info,
&err);
g_assert(val == -1);
error_free_or_abort(&err);
@@ -595,7 +595,7 @@ static void test_dummy_getenum(void)
/* A non-enum property name */
val = object_property_get_enum(OBJECT(dobj),
"iv",
- "DummyAnimal",
+ &dummy_animal_qapi_type_info,
&err);
g_assert(val == -1);
error_free_or_abort(&err);
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread* [PATCH v8 56/56] tests/qmp-cmd-test: assert qapi-type resolves in query-qmp-schema
2026-11-01 20:16 [PATCH v8 RESEND 00/56] qom/qdev: associate properties with QAPI schema types Markus Armbruster
` (54 preceding siblings ...)
2026-11-01 20:17 ` [PATCH v8 55/56] qom: use QAPITypeInfo in object_property_get_enum Markus Armbruster
@ 2026-11-01 20:17 ` Markus Armbruster
55 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2026-11-01 20:17 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, pbonzini, berrange
From: Marc-André Lureau <marcandre.lureau@redhat.com>
For every QOM type returned by qom-list-types, call qom-list-properties
and verify that each property's qapi-type value (when present) maps to
a valid entry in the query-qmp-schema introspection output.
The test is gated behind g_test_slow() since it iterates all registered
QOM types.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
tests/qtest/qmp-cmd-test.c | 55 +++++++++++++++++++++++++++++++++++++-
1 file changed, 54 insertions(+), 1 deletion(-)
diff --git a/tests/qtest/qmp-cmd-test.c b/tests/qtest/qmp-cmd-test.c
index 279a8f5614..acb7b0dd6a 100644
--- a/tests/qtest/qmp-cmd-test.c
+++ b/tests/qtest/qmp-cmd-test.c
@@ -15,6 +15,7 @@
#include "qapi/error.h"
#include "qapi/qapi-visit-introspect.h"
#include "qobject/qdict.h"
+#include "qobject/qlist.h"
#include "qapi/qobject-input-visitor.h"
const char common_args[] = "-nodefaults -machine none";
@@ -131,6 +132,8 @@ typedef struct {
GHashTable *hash;
} QmpSchema;
+static QmpSchema schema;
+
static void qmp_schema_init(QmpSchema *schema)
{
QDict *resp;
@@ -343,9 +346,56 @@ static void test_object_add_failure_modes(void)
qtest_quit(qts);
}
+static void test_qapi_type(void)
+{
+ QTestState *qts;
+ g_autoptr(QDict) resp = NULL;
+ QList *types;
+ QListEntry *type_entry, *prop_entry;
+
+ qts = qtest_init(common_args);
+
+ resp = qtest_qmp(qts,
+ "{ 'execute': 'qom-list-types',"
+ " 'arguments': { 'abstract': true } }");
+ g_assert(qdict_haskey(resp, "return"));
+ types = qdict_get_qlist(resp, "return");
+
+ QLIST_FOREACH_ENTRY(types, type_entry) {
+ QDict *type = qobject_to(QDict, qlist_entry_obj(type_entry));
+ const char *name = qdict_get_str(type, "name");
+ g_autoptr(QDict) props_resp = NULL;
+ QList *props;
+
+ props_resp = qtest_qmp(qts,
+ "{ 'execute': 'qom-list-properties',"
+ " 'arguments': { 'typename': %s } }",
+ name);
+ if (!qdict_haskey(props_resp, "return")) {
+ continue;
+ }
+ props = qdict_get_qlist(props_resp, "return");
+
+ QLIST_FOREACH_ENTRY(props, prop_entry) {
+ QDict *prop = qobject_to(QDict, qlist_entry_obj(prop_entry));
+ const char *qapi_type = qdict_get_try_str(prop, "qapi-type");
+ const char *propname = qdict_get_str(prop, "name");
+ const char *ty = qdict_get_str(prop, "type");
+
+ if (qapi_type) {
+ g_assert_nonnull(qmp_schema_lookup(&schema, qapi_type));
+ } else if (!g_str_has_prefix(ty, "child<") &&
+ !g_str_has_prefix(ty, "link<")) {
+ g_test_message("%s.%s %s has no associated qapi-type",
+ name, propname, ty);
+ }
+ }
+ }
+ qtest_quit(qts);
+}
+
int main(int argc, char *argv[])
{
- QmpSchema schema;
int ret;
g_test_init(&argc, &argv, NULL);
@@ -355,6 +405,9 @@ int main(int argc, char *argv[])
qtest_add_func("qmp/object-add-failure-modes",
test_object_add_failure_modes);
+ if (g_test_slow()) {
+ qtest_add_func("qmp/qapi-type", test_qapi_type);
+ }
ret = g_test_run();
--
2.55.0
^ permalink raw reply related [flat|nested] 66+ messages in thread