mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-31 14:02:05 -06:00
qdev: register properties as class properties
Use class properties facilities to add properties to the class during device_class_set_props(). qdev_property_add_static() must be adapted as PropertyInfo now operates with classes (and not instances), so we must set_default_value() on the ObjectProperty, before calling its init() method on the object instance. Also, PropertyInfo.create() is now exclusively used for class properties. Fortunately, qdev_property_add_static() is only used in target/arm/cpu.c so far, which doesn't use "link" properties (that require create()). Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20200110153039.1379601-22-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
c68fc9359b
commit
77b06bba62
3 changed files with 65 additions and 60 deletions
|
@ -73,12 +73,10 @@ static void set_enum(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||||
visit_type_enum(v, prop->name, ptr, prop->info->enum_table, errp);
|
visit_type_enum(v, prop->name, ptr, prop->info->enum_table, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_default_value_enum(Object *obj, const Property *prop)
|
static void set_default_value_enum(ObjectProperty *op, const Property *prop)
|
||||||
{
|
{
|
||||||
object_property_set_str(obj,
|
object_property_set_default_str(op,
|
||||||
qapi_enum_lookup(prop->info->enum_table,
|
qapi_enum_lookup(prop->info->enum_table, prop->defval.i));
|
||||||
prop->defval.i),
|
|
||||||
prop->name, &error_abort);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Bit */
|
/* Bit */
|
||||||
|
@ -132,9 +130,9 @@ static void prop_set_bit(Object *obj, Visitor *v, const char *name,
|
||||||
bit_prop_set(dev, prop, value);
|
bit_prop_set(dev, prop, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_default_value_bool(Object *obj, const Property *prop)
|
static void set_default_value_bool(ObjectProperty *op, const Property *prop)
|
||||||
{
|
{
|
||||||
object_property_set_bool(obj, prop->defval.u, prop->name, &error_abort);
|
object_property_set_default_bool(op, prop->defval.u);
|
||||||
}
|
}
|
||||||
|
|
||||||
const PropertyInfo qdev_prop_bit = {
|
const PropertyInfo qdev_prop_bit = {
|
||||||
|
@ -265,14 +263,14 @@ static void set_uint8(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||||
visit_type_uint8(v, name, ptr, errp);
|
visit_type_uint8(v, name, ptr, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_default_value_int(Object *obj, const Property *prop)
|
static void set_default_value_int(ObjectProperty *op, const Property *prop)
|
||||||
{
|
{
|
||||||
object_property_set_int(obj, prop->defval.i, prop->name, &error_abort);
|
object_property_set_default_int(op, prop->defval.i);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_default_value_uint(Object *obj, const Property *prop)
|
static void set_default_value_uint(ObjectProperty *op, const Property *prop)
|
||||||
{
|
{
|
||||||
object_property_set_uint(obj, prop->defval.u, prop->name, &error_abort);
|
object_property_set_default_uint(op, prop->defval.u);
|
||||||
}
|
}
|
||||||
|
|
||||||
const PropertyInfo qdev_prop_uint8 = {
|
const PropertyInfo qdev_prop_uint8 = {
|
||||||
|
@ -925,9 +923,9 @@ static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||||
g_free(str);
|
g_free(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_default_uuid_auto(Object *obj, const Property *prop)
|
static void set_default_uuid_auto(ObjectProperty *op, const Property *prop)
|
||||||
{
|
{
|
||||||
object_property_set_str(obj, UUID_VALUE_AUTO, prop->name, &error_abort);
|
object_property_set_default_str(op, UUID_VALUE_AUTO);
|
||||||
}
|
}
|
||||||
|
|
||||||
const PropertyInfo qdev_prop_uuid = {
|
const PropertyInfo qdev_prop_uuid = {
|
||||||
|
@ -1243,15 +1241,13 @@ const PropertyInfo qdev_prop_size = {
|
||||||
|
|
||||||
/* --- object link property --- */
|
/* --- object link property --- */
|
||||||
|
|
||||||
static void create_link_property(Object *obj, Property *prop, Error **errp)
|
static void create_link_property(ObjectClass *oc, Property *prop, Error **errp)
|
||||||
{
|
{
|
||||||
Object **child = qdev_get_prop_ptr(DEVICE(obj), prop);
|
object_class_property_add_link(oc, prop->name, prop->link_type,
|
||||||
|
prop->offset,
|
||||||
object_property_add_link(obj, prop->name, prop->link_type,
|
qdev_prop_allow_set_link_before_realize,
|
||||||
child,
|
OBJ_PROP_LINK_STRONG,
|
||||||
qdev_prop_allow_set_link_before_realize,
|
errp);
|
||||||
OBJ_PROP_LINK_STRONG,
|
|
||||||
errp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const PropertyInfo qdev_prop_link = {
|
const PropertyInfo qdev_prop_link = {
|
||||||
|
|
|
@ -678,13 +678,11 @@ static void qdev_get_legacy_property(Object *obj, Visitor *v,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qdev_property_add_legacy:
|
* qdev_class_add_legacy_property:
|
||||||
* @dev: Device to add the property to.
|
* @dev: Device to add the property to.
|
||||||
* @prop: The qdev property definition.
|
* @prop: The qdev property definition.
|
||||||
* @errp: location to store error information.
|
|
||||||
*
|
*
|
||||||
* Add a legacy QOM property to @dev for qdev property @prop.
|
* Add a legacy QOM property to @dev for qdev property @prop.
|
||||||
* On error, store error in @errp.
|
|
||||||
*
|
*
|
||||||
* Legacy properties are string versions of QOM properties. The format of
|
* Legacy properties are string versions of QOM properties. The format of
|
||||||
* the string depends on the property type. Legacy properties are only
|
* the string depends on the property type. Legacy properties are only
|
||||||
|
@ -693,52 +691,68 @@ static void qdev_get_legacy_property(Object *obj, Visitor *v,
|
||||||
* Do not use this in new code! QOM Properties added through this interface
|
* Do not use this in new code! QOM Properties added through this interface
|
||||||
* will be given names in the "legacy" namespace.
|
* will be given names in the "legacy" namespace.
|
||||||
*/
|
*/
|
||||||
static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
|
static void qdev_class_add_legacy_property(DeviceClass *dc, Property *prop)
|
||||||
Error **errp)
|
|
||||||
{
|
{
|
||||||
gchar *name;
|
g_autofree char *name = NULL;
|
||||||
|
|
||||||
/* Register pointer properties as legacy properties */
|
/* Register pointer properties as legacy properties */
|
||||||
if (!prop->info->print && prop->info->get) {
|
if (!prop->info->print && prop->info->get) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prop->info->create) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
name = g_strdup_printf("legacy-%s", prop->name);
|
name = g_strdup_printf("legacy-%s", prop->name);
|
||||||
object_property_add(OBJECT(dev), name, "str",
|
object_class_property_add(OBJECT_CLASS(dc), name, "str",
|
||||||
prop->info->print ? qdev_get_legacy_property : prop->info->get,
|
prop->info->print ? qdev_get_legacy_property : prop->info->get,
|
||||||
NULL,
|
NULL, NULL, prop, &error_abort);
|
||||||
NULL,
|
|
||||||
prop, errp);
|
|
||||||
|
|
||||||
g_free(name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void qdev_property_add_static(DeviceState *dev, Property *prop)
|
void qdev_property_add_static(DeviceState *dev, Property *prop)
|
||||||
{
|
{
|
||||||
Object *obj = OBJECT(dev);
|
Object *obj = OBJECT(dev);
|
||||||
|
ObjectProperty *op;
|
||||||
|
|
||||||
if (prop->info->create) {
|
assert(!prop->info->create);
|
||||||
prop->info->create(obj, prop, &error_abort);
|
|
||||||
} else {
|
op = object_property_add(obj, prop->name, prop->info->name,
|
||||||
object_property_add(obj, prop->name, prop->info->name,
|
prop->info->get, prop->info->set,
|
||||||
prop->info->get, prop->info->set,
|
prop->info->release,
|
||||||
prop->info->release,
|
prop, &error_abort);
|
||||||
prop, &error_abort);
|
|
||||||
}
|
|
||||||
|
|
||||||
object_property_set_description(obj, prop->name,
|
object_property_set_description(obj, prop->name,
|
||||||
prop->info->description,
|
prop->info->description,
|
||||||
&error_abort);
|
&error_abort);
|
||||||
|
|
||||||
if (prop->set_default) {
|
if (prop->set_default) {
|
||||||
prop->info->set_default_value(obj, prop);
|
prop->info->set_default_value(op, prop);
|
||||||
|
if (op->init) {
|
||||||
|
op->init(obj, op);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void qdev_class_add_property(DeviceClass *klass, Property *prop)
|
||||||
|
{
|
||||||
|
ObjectClass *oc = OBJECT_CLASS(klass);
|
||||||
|
|
||||||
|
if (prop->info->create) {
|
||||||
|
prop->info->create(oc, prop, &error_abort);
|
||||||
|
} else {
|
||||||
|
ObjectProperty *op;
|
||||||
|
|
||||||
|
op = object_class_property_add(oc,
|
||||||
|
prop->name, prop->info->name,
|
||||||
|
prop->info->get, prop->info->set,
|
||||||
|
prop->info->release,
|
||||||
|
prop, &error_abort);
|
||||||
|
if (prop->set_default) {
|
||||||
|
prop->info->set_default_value(op, prop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
object_class_property_set_description(oc, prop->name,
|
||||||
|
prop->info->description,
|
||||||
|
&error_abort);
|
||||||
|
}
|
||||||
|
|
||||||
/* @qdev_alias_all_properties - Add alias properties to the source object for
|
/* @qdev_alias_all_properties - Add alias properties to the source object for
|
||||||
* all qdev properties on the target DeviceState.
|
* all qdev properties on the target DeviceState.
|
||||||
*/
|
*/
|
||||||
|
@ -932,8 +946,6 @@ static bool device_get_hotplugged(Object *obj, Error **errp)
|
||||||
static void device_initfn(Object *obj)
|
static void device_initfn(Object *obj)
|
||||||
{
|
{
|
||||||
DeviceState *dev = DEVICE(obj);
|
DeviceState *dev = DEVICE(obj);
|
||||||
ObjectClass *class;
|
|
||||||
Property *prop;
|
|
||||||
|
|
||||||
if (qdev_hotplug) {
|
if (qdev_hotplug) {
|
||||||
dev->hotplugged = 1;
|
dev->hotplugged = 1;
|
||||||
|
@ -944,15 +956,6 @@ static void device_initfn(Object *obj)
|
||||||
dev->realized = false;
|
dev->realized = false;
|
||||||
dev->allow_unplug_during_migration = false;
|
dev->allow_unplug_during_migration = false;
|
||||||
|
|
||||||
class = object_get_class(OBJECT(dev));
|
|
||||||
do {
|
|
||||||
for (prop = DEVICE_CLASS(class)->props_; prop && prop->name; prop++) {
|
|
||||||
qdev_property_add_legacy(dev, prop, &error_abort);
|
|
||||||
qdev_property_add_static(dev, prop);
|
|
||||||
}
|
|
||||||
class = object_class_get_parent(class);
|
|
||||||
} while (class != object_class_by_name(TYPE_DEVICE));
|
|
||||||
|
|
||||||
QLIST_INIT(&dev->gpios);
|
QLIST_INIT(&dev->gpios);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1065,7 +1068,13 @@ static void device_class_init(ObjectClass *class, void *data)
|
||||||
|
|
||||||
void device_class_set_props(DeviceClass *dc, Property *props)
|
void device_class_set_props(DeviceClass *dc, Property *props)
|
||||||
{
|
{
|
||||||
|
Property *prop;
|
||||||
|
|
||||||
dc->props_ = props;
|
dc->props_ = props;
|
||||||
|
for (prop = props; prop && prop->name; prop++) {
|
||||||
|
qdev_class_add_legacy_property(dc, prop);
|
||||||
|
qdev_class_add_property(dc, prop);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void device_class_set_parent_reset(DeviceClass *dc,
|
void device_class_set_parent_reset(DeviceClass *dc,
|
||||||
|
|
|
@ -263,8 +263,8 @@ struct PropertyInfo {
|
||||||
const char *description;
|
const char *description;
|
||||||
const QEnumLookup *enum_table;
|
const QEnumLookup *enum_table;
|
||||||
int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
|
int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
|
||||||
void (*set_default_value)(Object *obj, const Property *prop);
|
void (*set_default_value)(ObjectProperty *op, const Property *prop);
|
||||||
void (*create)(Object *obj, Property *prop, Error **errp);
|
void (*create)(ObjectClass *oc, Property *prop, Error **errp);
|
||||||
ObjectPropertyAccessor *get;
|
ObjectPropertyAccessor *get;
|
||||||
ObjectPropertyAccessor *set;
|
ObjectPropertyAccessor *set;
|
||||||
ObjectPropertyRelease *release;
|
ObjectPropertyRelease *release;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue