|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v7 52/65] qdev: add qapi_type field to PropertyInfo with fallback registration
Add a qapi_type field to PropertyInfo to prepare for the transition
from string-based type metadata to QAPI type-info.
Add a qdev_prop_qapi_type() helper that resolves the QAPI type for a
property from .qapi_type. It will be later extended to cope with array
types.
Update qdev_property_add_static() and qdev_class_add_property() to
prefer object_property_add_qapi() when a QAPI type is available, falling
back to the old object_property_add() for unconverted properties.
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 the fallback paths are always taken. This patch
is no-op for now.
Signed-off-by: Markus Armbruster <armbru@xxxxxxxxxx>
Signed-off-by: Marc-André Lureau <marcandre.lureau@xxxxxxxxxx>
---
hw/core/qdev-properties.c | 68 ++++++++++++++++++++++++++++++---------
include/hw/core/qdev-properties.h | 1 +
2 files changed, 53 insertions(+), 16 deletions(-)
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 34d7b26a7303..ee50fbb9f570 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)
@@ -1143,18 +1153,33 @@ const PropertyInfo qdev_prop_link = {
.set = set_link,
};
+static const QAPITypeInfo *qdev_prop_qapi_type(const Property *prop)
+{
+ /* this will be later extended to cope with QAPI array properties */
+ return prop->info->qapi_type;
+}
+
void qdev_property_add_static(DeviceState *dev, const Property *prop)
{
Object *obj = OBJECT(dev);
ObjectProperty *op;
+ const QAPITypeInfo *qapi_type = qdev_prop_qapi_type(prop);
assert(!prop->info->create);
- op = object_property_add(obj, prop->name, prop->info->type,
- field_prop_getter(prop->info),
- field_prop_setter(prop->info),
- prop->info->release,
- (Property *)prop);
+ if (qapi_type) {
+ op = object_property_add_qapi(obj, prop->name, qapi_type,
+ field_prop_getter(prop->info),
+ field_prop_setter(prop->info),
+ prop->info->release,
+ (Property *)prop);
+ } else {
+ op = object_property_add(obj, prop->name, prop->info->type,
+ field_prop_getter(prop->info),
+ field_prop_setter(prop->info),
+ prop->info->release,
+ (Property *)prop);
+ }
object_property_set_description(obj, prop->name,
prop->info->description);
@@ -1176,12 +1201,23 @@ 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,
- field_prop_getter(prop->info),
- field_prop_setter(prop->info),
- prop->info->release,
- (Property *)prop);
+ const QAPITypeInfo *qapi_type = qdev_prop_qapi_type(prop);
+
+ if (qapi_type) {
+ op = object_class_property_add_qapi(oc,
+ name, qapi_type,
+ field_prop_getter(prop->info),
+ field_prop_setter(prop->info),
+ prop->info->release,
+ (Property *)prop);
+ } else {
+ op = object_class_property_add(oc,
+ name, prop->info->type,
+ field_prop_getter(prop->info),
+ field_prop_setter(prop->info),
+ prop->info->release,
+ (Property *)prop);
+ }
}
if (prop->set_default) {
prop->info->set_default_value(op, prop);
diff --git a/include/hw/core/qdev-properties.h
b/include/hw/core/qdev-properties.h
index eba5436e53b1..1ea2ba66bb37 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);
--
2.56.0.116.g6de20f6092dc
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |