|
@@ -51,7 +51,7 @@ void qdev_prop_allow_set_link_before_realize(const Object *obj,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void *object_field_prop_ptr(Object *obj, Property *prop)
|
|
|
+void *object_field_prop_ptr(Object *obj, const Property *prop)
|
|
|
{
|
|
|
void *ptr = obj;
|
|
|
ptr += prop->offset;
|
|
@@ -61,7 +61,7 @@ void *object_field_prop_ptr(Object *obj, Property *prop)
|
|
|
static void field_prop_get(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
return prop->info->get(obj, v, name, opaque, errp);
|
|
|
}
|
|
|
|
|
@@ -78,7 +78,7 @@ static ObjectPropertyAccessor *field_prop_getter(const PropertyInfo *info)
|
|
|
static void field_prop_set(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
|
|
|
if (!qdev_prop_allow_set(obj, name, prop->info, errp)) {
|
|
|
return;
|
|
@@ -100,7 +100,7 @@ static ObjectPropertyAccessor *field_prop_setter(const PropertyInfo *info)
|
|
|
void qdev_propinfo_get_enum(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
int *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_enum(v, name, ptr, prop->info->enum_table, errp);
|
|
@@ -109,7 +109,7 @@ void qdev_propinfo_get_enum(Object *obj, Visitor *v, const char *name,
|
|
|
void qdev_propinfo_set_enum(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
int *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_enum(v, name, ptr, prop->info->enum_table, errp);
|
|
@@ -131,13 +131,13 @@ const PropertyInfo qdev_prop_enum = {
|
|
|
|
|
|
/* Bit */
|
|
|
|
|
|
-static uint32_t qdev_get_prop_mask(Property *prop)
|
|
|
+static uint32_t qdev_get_prop_mask(const Property *prop)
|
|
|
{
|
|
|
assert(prop->info == &qdev_prop_bit);
|
|
|
return 0x1 << prop->bitnr;
|
|
|
}
|
|
|
|
|
|
-static void bit_prop_set(Object *obj, Property *props, bool val)
|
|
|
+static void bit_prop_set(Object *obj, const Property *props, bool val)
|
|
|
{
|
|
|
uint32_t *p = object_field_prop_ptr(obj, props);
|
|
|
uint32_t mask = qdev_get_prop_mask(props);
|
|
@@ -151,7 +151,7 @@ static void bit_prop_set(Object *obj, Property *props, bool val)
|
|
|
static void prop_get_bit(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint32_t *p = object_field_prop_ptr(obj, prop);
|
|
|
bool value = (*p & qdev_get_prop_mask(prop)) != 0;
|
|
|
|
|
@@ -161,7 +161,7 @@ static void prop_get_bit(Object *obj, Visitor *v, const char *name,
|
|
|
static void prop_set_bit(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
bool value;
|
|
|
|
|
|
if (!visit_type_bool(v, name, &value, errp)) {
|
|
@@ -185,13 +185,13 @@ const PropertyInfo qdev_prop_bit = {
|
|
|
|
|
|
/* Bit64 */
|
|
|
|
|
|
-static uint64_t qdev_get_prop_mask64(Property *prop)
|
|
|
+static uint64_t qdev_get_prop_mask64(const Property *prop)
|
|
|
{
|
|
|
assert(prop->info == &qdev_prop_bit64);
|
|
|
return 0x1ull << prop->bitnr;
|
|
|
}
|
|
|
|
|
|
-static void bit64_prop_set(Object *obj, Property *props, bool val)
|
|
|
+static void bit64_prop_set(Object *obj, const Property *props, bool val)
|
|
|
{
|
|
|
uint64_t *p = object_field_prop_ptr(obj, props);
|
|
|
uint64_t mask = qdev_get_prop_mask64(props);
|
|
@@ -205,7 +205,7 @@ static void bit64_prop_set(Object *obj, Property *props, bool val)
|
|
|
static void prop_get_bit64(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint64_t *p = object_field_prop_ptr(obj, prop);
|
|
|
bool value = (*p & qdev_get_prop_mask64(prop)) != 0;
|
|
|
|
|
@@ -215,7 +215,7 @@ static void prop_get_bit64(Object *obj, Visitor *v, const char *name,
|
|
|
static void prop_set_bit64(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
bool value;
|
|
|
|
|
|
if (!visit_type_bool(v, name, &value, errp)) {
|
|
@@ -237,7 +237,7 @@ const PropertyInfo qdev_prop_bit64 = {
|
|
|
static void get_bool(Object *obj, Visitor *v, const char *name, void *opaque,
|
|
|
Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
bool *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_bool(v, name, ptr, errp);
|
|
@@ -246,7 +246,7 @@ static void get_bool(Object *obj, Visitor *v, const char *name, void *opaque,
|
|
|
static void set_bool(Object *obj, Visitor *v, const char *name, void *opaque,
|
|
|
Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
bool *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_bool(v, name, ptr, errp);
|
|
@@ -264,7 +264,7 @@ const PropertyInfo qdev_prop_bool = {
|
|
|
static void get_uint8(Object *obj, Visitor *v, const char *name, void *opaque,
|
|
|
Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint8_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_uint8(v, name, ptr, errp);
|
|
@@ -273,7 +273,7 @@ static void get_uint8(Object *obj, Visitor *v, const char *name, void *opaque,
|
|
|
static void set_uint8(Object *obj, Visitor *v, const char *name, void *opaque,
|
|
|
Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint8_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_uint8(v, name, ptr, errp);
|
|
@@ -303,7 +303,7 @@ const PropertyInfo qdev_prop_uint8 = {
|
|
|
static void get_uint16(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint16_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_uint16(v, name, ptr, errp);
|
|
@@ -312,7 +312,7 @@ static void get_uint16(Object *obj, Visitor *v, const char *name,
|
|
|
static void set_uint16(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint16_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_uint16(v, name, ptr, errp);
|
|
@@ -330,7 +330,7 @@ const PropertyInfo qdev_prop_uint16 = {
|
|
|
static void get_uint32(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint32_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_uint32(v, name, ptr, errp);
|
|
@@ -339,7 +339,7 @@ static void get_uint32(Object *obj, Visitor *v, const char *name,
|
|
|
static void set_uint32(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint32_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_uint32(v, name, ptr, errp);
|
|
@@ -348,7 +348,7 @@ static void set_uint32(Object *obj, Visitor *v, const char *name,
|
|
|
void qdev_propinfo_get_int32(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
int32_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_int32(v, name, ptr, errp);
|
|
@@ -357,7 +357,7 @@ void qdev_propinfo_get_int32(Object *obj, Visitor *v, const char *name,
|
|
|
static void set_int32(Object *obj, Visitor *v, const char *name, void *opaque,
|
|
|
Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
int32_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_int32(v, name, ptr, errp);
|
|
@@ -382,7 +382,7 @@ const PropertyInfo qdev_prop_int32 = {
|
|
|
static void get_uint64(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint64_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_uint64(v, name, ptr, errp);
|
|
@@ -391,7 +391,7 @@ static void get_uint64(Object *obj, Visitor *v, const char *name,
|
|
|
static void set_uint64(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint64_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_uint64(v, name, ptr, errp);
|
|
@@ -400,7 +400,7 @@ static void set_uint64(Object *obj, Visitor *v, const char *name,
|
|
|
static void get_int64(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
int64_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_int64(v, name, ptr, errp);
|
|
@@ -409,7 +409,7 @@ static void get_int64(Object *obj, Visitor *v, const char *name,
|
|
|
static void set_int64(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
int64_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_int64(v, name, ptr, errp);
|
|
@@ -432,7 +432,7 @@ const PropertyInfo qdev_prop_int64 = {
|
|
|
static void set_uint64_checkmask(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint64_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_uint64(v, name, ptr, errp);
|
|
@@ -452,14 +452,14 @@ const PropertyInfo qdev_prop_uint64_checkmask = {
|
|
|
|
|
|
static void release_string(Object *obj, const char *name, void *opaque)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
g_free(*(char **)object_field_prop_ptr(obj, prop));
|
|
|
}
|
|
|
|
|
|
static void get_string(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
char **ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
if (!*ptr) {
|
|
@@ -473,7 +473,7 @@ static void get_string(Object *obj, Visitor *v, const char *name,
|
|
|
static void set_string(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
char **ptr = object_field_prop_ptr(obj, prop);
|
|
|
char *str;
|
|
|
|
|
@@ -507,7 +507,7 @@ const PropertyInfo qdev_prop_on_off_auto = {
|
|
|
void qdev_propinfo_get_size32(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint32_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
uint64_t value = *ptr;
|
|
|
|
|
@@ -517,7 +517,7 @@ void qdev_propinfo_get_size32(Object *obj, Visitor *v, const char *name,
|
|
|
static void set_size32(Object *obj, Visitor *v, const char *name, void *opaque,
|
|
|
Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint32_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
uint64_t value;
|
|
|
|
|
@@ -557,7 +557,7 @@ struct ArrayElementList {
|
|
|
* specific element of the array. Arrays are backed by an uint32_t length field
|
|
|
* and an element array. @elem points at an element in this element array.
|
|
|
*/
|
|
|
-static Property array_elem_prop(Object *obj, Property *parent_prop,
|
|
|
+static Property array_elem_prop(Object *obj, const Property *parent_prop,
|
|
|
const char *name, char *elem)
|
|
|
{
|
|
|
return (Property) {
|
|
@@ -582,7 +582,7 @@ static Property array_elem_prop(Object *obj, Property *parent_prop,
|
|
|
*/
|
|
|
static void release_prop_array(Object *obj, const char *name, void *opaque)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint32_t *alenptr = object_field_prop_ptr(obj, prop);
|
|
|
void **arrayptr = (void *)obj + prop->arrayoffset;
|
|
|
char *elem = *arrayptr;
|
|
@@ -609,7 +609,7 @@ static void set_prop_array(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
ERRP_GUARD();
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint32_t *alenptr = object_field_prop_ptr(obj, prop);
|
|
|
void **arrayptr = (void *)obj + prop->arrayoffset;
|
|
|
ArrayElementList *list, *elem, *next;
|
|
@@ -685,7 +685,7 @@ static void get_prop_array(Object *obj, Visitor *v, const char *name,
|
|
|
void *opaque, Error **errp)
|
|
|
{
|
|
|
ERRP_GUARD();
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint32_t *alenptr = object_field_prop_ptr(obj, prop);
|
|
|
void **arrayptr = (void *)obj + prop->arrayoffset;
|
|
|
char *elemptr = *arrayptr;
|
|
@@ -749,16 +749,13 @@ const PropertyInfo qdev_prop_array = {
|
|
|
|
|
|
/* --- public helpers --- */
|
|
|
|
|
|
-static const Property *qdev_prop_walk(const Property *props, const char *name)
|
|
|
+static const Property *qdev_prop_walk(DeviceClass *cls, const char *name)
|
|
|
{
|
|
|
- if (!props) {
|
|
|
- return NULL;
|
|
|
- }
|
|
|
- while (props->name) {
|
|
|
- if (strcmp(props->name, name) == 0) {
|
|
|
- return props;
|
|
|
+ for (int i = 0, n = cls->props_count_; i < n; ++i) {
|
|
|
+ const Property *prop = &cls->props_[i];
|
|
|
+ if (strcmp(prop->name, name) == 0) {
|
|
|
+ return prop;
|
|
|
}
|
|
|
- props++;
|
|
|
}
|
|
|
return NULL;
|
|
|
}
|
|
@@ -771,7 +768,7 @@ static const Property *qdev_prop_find(DeviceState *dev, const char *name)
|
|
|
/* device properties */
|
|
|
class = object_get_class(OBJECT(dev));
|
|
|
do {
|
|
|
- prop = qdev_prop_walk(DEVICE_CLASS(class)->props_, name);
|
|
|
+ prop = qdev_prop_walk(DEVICE_CLASS(class), name);
|
|
|
if (prop) {
|
|
|
return prop;
|
|
|
}
|
|
@@ -931,7 +928,7 @@ void qdev_prop_set_globals(DeviceState *dev)
|
|
|
static void get_size(Object *obj, Visitor *v, const char *name, void *opaque,
|
|
|
Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint64_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_size(v, name, ptr, errp);
|
|
@@ -940,7 +937,7 @@ static void get_size(Object *obj, Visitor *v, const char *name, void *opaque,
|
|
|
static void set_size(Object *obj, Visitor *v, const char *name, void *opaque,
|
|
|
Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
uint64_t *ptr = object_field_prop_ptr(obj, prop);
|
|
|
|
|
|
visit_type_size(v, name, ptr, errp);
|
|
@@ -1023,7 +1020,7 @@ static void qdev_get_legacy_property(Object *obj, Visitor *v,
|
|
|
const char *name, void *opaque,
|
|
|
Error **errp)
|
|
|
{
|
|
|
- Property *prop = opaque;
|
|
|
+ const Property *prop = opaque;
|
|
|
|
|
|
char buffer[1024];
|
|
|
char *ptr = buffer;
|
|
@@ -1061,12 +1058,18 @@ static void qdev_class_add_legacy_property(DeviceClass *dc, const Property *prop
|
|
|
NULL, NULL, (Property *)prop);
|
|
|
}
|
|
|
|
|
|
-void device_class_set_props(DeviceClass *dc, const Property *props)
|
|
|
+void device_class_set_props_n(DeviceClass *dc, const Property *props, size_t n)
|
|
|
{
|
|
|
- const Property *prop;
|
|
|
+ /* We used a hole in DeviceClass because that's still a lot. */
|
|
|
+ assert(n <= UINT16_MAX);
|
|
|
+ assert(n != 0);
|
|
|
|
|
|
dc->props_ = props;
|
|
|
- for (prop = props; prop && prop->name; prop++) {
|
|
|
+ dc->props_count_ = n;
|
|
|
+
|
|
|
+ for (size_t i = 0; i < n; ++i) {
|
|
|
+ const Property *prop = &props[i];
|
|
|
+ assert(prop->name);
|
|
|
qdev_class_add_legacy_property(dc, prop);
|
|
|
qdev_class_add_property(dc, prop->name, prop);
|
|
|
}
|