1 #include "qemu/osdep.h"
2 #include "hw/qdev-properties.h"
3 #include "qapi/error.h"
4 #include "qapi/qapi-types-misc.h"
5 #include "qapi/qmp/qerror.h"
6 #include "qemu/ctype.h"
7 #include "qemu/error-report.h"
8 #include "qapi/visitor.h"
10 #include "qemu/units.h"
11 #include "qemu/cutils.h"
12 #include "qdev-prop-internal.h"
14 void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
18 error_setg(errp, "Attempt to set property '%s' on device '%s' "
19 "(type '%s') after it was realized", name, dev->id,
20 object_get_typename(OBJECT(dev)));
22 error_setg(errp, "Attempt to set property '%s' on anonymous device "
23 "(type '%s') after it was realized", name,
24 object_get_typename(OBJECT(dev)));
28 void qdev_prop_allow_set_link_before_realize(const Object *obj,
30 Object *val, Error **errp)
32 DeviceState *dev = DEVICE(obj);
35 error_setg(errp, "Attempt to set link property '%s' on device '%s' "
36 "(type '%s') after it was realized",
37 name, dev->id, object_get_typename(obj));
41 void *qdev_get_prop_ptr(Object *obj, Property *prop)
48 void qdev_propinfo_get_enum(Object *obj, Visitor *v, const char *name,
49 void *opaque, Error **errp)
51 Property *prop = opaque;
52 int *ptr = qdev_get_prop_ptr(obj, prop);
54 visit_type_enum(v, prop->name, ptr, prop->info->enum_table, errp);
57 void qdev_propinfo_set_enum(Object *obj, Visitor *v, const char *name,
58 void *opaque, Error **errp)
60 DeviceState *dev = DEVICE(obj);
61 Property *prop = opaque;
62 int *ptr = qdev_get_prop_ptr(obj, prop);
65 qdev_prop_set_after_realize(dev, name, errp);
69 visit_type_enum(v, prop->name, ptr, prop->info->enum_table, errp);
72 void qdev_propinfo_set_default_value_enum(ObjectProperty *op,
75 object_property_set_default_str(op,
76 qapi_enum_lookup(prop->info->enum_table, prop->defval.i));
79 const PropertyInfo qdev_prop_enum = {
81 .get = qdev_propinfo_get_enum,
82 .set = qdev_propinfo_set_enum,
83 .set_default_value = qdev_propinfo_set_default_value_enum,
88 static uint32_t qdev_get_prop_mask(Property *prop)
90 assert(prop->info == &qdev_prop_bit);
91 return 0x1 << prop->bitnr;
94 static void bit_prop_set(Object *obj, Property *props, bool val)
96 uint32_t *p = qdev_get_prop_ptr(obj, props);
97 uint32_t mask = qdev_get_prop_mask(props);
105 static void prop_get_bit(Object *obj, Visitor *v, const char *name,
106 void *opaque, Error **errp)
108 Property *prop = opaque;
109 uint32_t *p = qdev_get_prop_ptr(obj, prop);
110 bool value = (*p & qdev_get_prop_mask(prop)) != 0;
112 visit_type_bool(v, name, &value, errp);
115 static void prop_set_bit(Object *obj, Visitor *v, const char *name,
116 void *opaque, Error **errp)
118 DeviceState *dev = DEVICE(obj);
119 Property *prop = opaque;
123 qdev_prop_set_after_realize(dev, name, errp);
127 if (!visit_type_bool(v, name, &value, errp)) {
130 bit_prop_set(obj, prop, value);
133 static void set_default_value_bool(ObjectProperty *op, const Property *prop)
135 object_property_set_default_bool(op, prop->defval.u);
138 const PropertyInfo qdev_prop_bit = {
140 .description = "on/off",
143 .set_default_value = set_default_value_bool,
148 static uint64_t qdev_get_prop_mask64(Property *prop)
150 assert(prop->info == &qdev_prop_bit64);
151 return 0x1ull << prop->bitnr;
154 static void bit64_prop_set(Object *obj, Property *props, bool val)
156 uint64_t *p = qdev_get_prop_ptr(obj, props);
157 uint64_t mask = qdev_get_prop_mask64(props);
165 static void prop_get_bit64(Object *obj, Visitor *v, const char *name,
166 void *opaque, Error **errp)
168 Property *prop = opaque;
169 uint64_t *p = qdev_get_prop_ptr(obj, prop);
170 bool value = (*p & qdev_get_prop_mask64(prop)) != 0;
172 visit_type_bool(v, name, &value, errp);
175 static void prop_set_bit64(Object *obj, Visitor *v, const char *name,
176 void *opaque, Error **errp)
178 DeviceState *dev = DEVICE(obj);
179 Property *prop = opaque;
183 qdev_prop_set_after_realize(dev, name, errp);
187 if (!visit_type_bool(v, name, &value, errp)) {
190 bit64_prop_set(obj, prop, value);
193 const PropertyInfo qdev_prop_bit64 = {
195 .description = "on/off",
196 .get = prop_get_bit64,
197 .set = prop_set_bit64,
198 .set_default_value = set_default_value_bool,
203 static void get_bool(Object *obj, Visitor *v, const char *name, void *opaque,
206 Property *prop = opaque;
207 bool *ptr = qdev_get_prop_ptr(obj, prop);
209 visit_type_bool(v, name, ptr, errp);
212 static void set_bool(Object *obj, Visitor *v, const char *name, void *opaque,
215 DeviceState *dev = DEVICE(obj);
216 Property *prop = opaque;
217 bool *ptr = qdev_get_prop_ptr(obj, prop);
220 qdev_prop_set_after_realize(dev, name, errp);
224 visit_type_bool(v, name, ptr, errp);
227 const PropertyInfo qdev_prop_bool = {
231 .set_default_value = set_default_value_bool,
234 /* --- 8bit integer --- */
236 static void get_uint8(Object *obj, Visitor *v, const char *name, void *opaque,
239 Property *prop = opaque;
240 uint8_t *ptr = qdev_get_prop_ptr(obj, prop);
242 visit_type_uint8(v, name, ptr, errp);
245 static void set_uint8(Object *obj, Visitor *v, const char *name, void *opaque,
248 DeviceState *dev = DEVICE(obj);
249 Property *prop = opaque;
250 uint8_t *ptr = qdev_get_prop_ptr(obj, prop);
253 qdev_prop_set_after_realize(dev, name, errp);
257 visit_type_uint8(v, name, ptr, errp);
260 void qdev_propinfo_set_default_value_int(ObjectProperty *op,
261 const Property *prop)
263 object_property_set_default_int(op, prop->defval.i);
266 void qdev_propinfo_set_default_value_uint(ObjectProperty *op,
267 const Property *prop)
269 object_property_set_default_uint(op, prop->defval.u);
272 const PropertyInfo qdev_prop_uint8 = {
276 .set_default_value = qdev_propinfo_set_default_value_uint,
279 /* --- 16bit integer --- */
281 void qdev_propinfo_get_uint16(Object *obj, Visitor *v, const char *name,
282 void *opaque, Error **errp)
284 Property *prop = opaque;
285 uint16_t *ptr = qdev_get_prop_ptr(obj, prop);
287 visit_type_uint16(v, name, ptr, errp);
290 static void set_uint16(Object *obj, Visitor *v, const char *name,
291 void *opaque, Error **errp)
293 DeviceState *dev = DEVICE(obj);
294 Property *prop = opaque;
295 uint16_t *ptr = qdev_get_prop_ptr(obj, prop);
298 qdev_prop_set_after_realize(dev, name, errp);
302 visit_type_uint16(v, name, ptr, errp);
305 const PropertyInfo qdev_prop_uint16 = {
307 .get = qdev_propinfo_get_uint16,
309 .set_default_value = qdev_propinfo_set_default_value_uint,
312 /* --- 32bit integer --- */
314 static void get_uint32(Object *obj, Visitor *v, const char *name,
315 void *opaque, Error **errp)
317 Property *prop = opaque;
318 uint32_t *ptr = qdev_get_prop_ptr(obj, prop);
320 visit_type_uint32(v, name, ptr, errp);
323 static void set_uint32(Object *obj, Visitor *v, const char *name,
324 void *opaque, Error **errp)
326 DeviceState *dev = DEVICE(obj);
327 Property *prop = opaque;
328 uint32_t *ptr = qdev_get_prop_ptr(obj, prop);
331 qdev_prop_set_after_realize(dev, name, errp);
335 visit_type_uint32(v, name, ptr, errp);
338 void qdev_propinfo_get_int32(Object *obj, Visitor *v, const char *name,
339 void *opaque, Error **errp)
341 Property *prop = opaque;
342 int32_t *ptr = qdev_get_prop_ptr(obj, prop);
344 visit_type_int32(v, name, ptr, errp);
347 static void set_int32(Object *obj, Visitor *v, const char *name, void *opaque,
350 DeviceState *dev = DEVICE(obj);
351 Property *prop = opaque;
352 int32_t *ptr = qdev_get_prop_ptr(obj, prop);
355 qdev_prop_set_after_realize(dev, name, errp);
359 visit_type_int32(v, name, ptr, errp);
362 const PropertyInfo qdev_prop_uint32 = {
366 .set_default_value = qdev_propinfo_set_default_value_uint,
369 const PropertyInfo qdev_prop_int32 = {
371 .get = qdev_propinfo_get_int32,
373 .set_default_value = qdev_propinfo_set_default_value_int,
376 /* --- 64bit integer --- */
378 static void get_uint64(Object *obj, Visitor *v, const char *name,
379 void *opaque, Error **errp)
381 Property *prop = opaque;
382 uint64_t *ptr = qdev_get_prop_ptr(obj, prop);
384 visit_type_uint64(v, name, ptr, errp);
387 static void set_uint64(Object *obj, Visitor *v, const char *name,
388 void *opaque, Error **errp)
390 DeviceState *dev = DEVICE(obj);
391 Property *prop = opaque;
392 uint64_t *ptr = qdev_get_prop_ptr(obj, prop);
395 qdev_prop_set_after_realize(dev, name, errp);
399 visit_type_uint64(v, name, ptr, errp);
402 static void get_int64(Object *obj, Visitor *v, const char *name,
403 void *opaque, Error **errp)
405 Property *prop = opaque;
406 int64_t *ptr = qdev_get_prop_ptr(obj, prop);
408 visit_type_int64(v, name, ptr, errp);
411 static void set_int64(Object *obj, Visitor *v, const char *name,
412 void *opaque, Error **errp)
414 DeviceState *dev = DEVICE(obj);
415 Property *prop = opaque;
416 int64_t *ptr = qdev_get_prop_ptr(obj, prop);
419 qdev_prop_set_after_realize(dev, name, errp);
423 visit_type_int64(v, name, ptr, errp);
426 const PropertyInfo qdev_prop_uint64 = {
430 .set_default_value = qdev_propinfo_set_default_value_uint,
433 const PropertyInfo qdev_prop_int64 = {
437 .set_default_value = qdev_propinfo_set_default_value_int,
442 static void release_string(Object *obj, const char *name, void *opaque)
444 Property *prop = opaque;
445 g_free(*(char **)qdev_get_prop_ptr(obj, prop));
448 static void get_string(Object *obj, Visitor *v, const char *name,
449 void *opaque, Error **errp)
451 Property *prop = opaque;
452 char **ptr = qdev_get_prop_ptr(obj, prop);
455 char *str = (char *)"";
456 visit_type_str(v, name, &str, errp);
458 visit_type_str(v, name, ptr, errp);
462 static void set_string(Object *obj, Visitor *v, const char *name,
463 void *opaque, Error **errp)
465 DeviceState *dev = DEVICE(obj);
466 Property *prop = opaque;
467 char **ptr = qdev_get_prop_ptr(obj, prop);
471 qdev_prop_set_after_realize(dev, name, errp);
475 if (!visit_type_str(v, name, &str, errp)) {
482 const PropertyInfo qdev_prop_string = {
484 .release = release_string,
489 /* --- on/off/auto --- */
491 const PropertyInfo qdev_prop_on_off_auto = {
493 .description = "on/off/auto",
494 .enum_table = &OnOffAuto_lookup,
495 .get = qdev_propinfo_get_enum,
496 .set = qdev_propinfo_set_enum,
497 .set_default_value = qdev_propinfo_set_default_value_enum,
500 /* --- 32bit unsigned int 'size' type --- */
502 void qdev_propinfo_get_size32(Object *obj, Visitor *v, const char *name,
503 void *opaque, Error **errp)
505 Property *prop = opaque;
506 uint32_t *ptr = qdev_get_prop_ptr(obj, prop);
507 uint64_t value = *ptr;
509 visit_type_size(v, name, &value, errp);
512 static void set_size32(Object *obj, Visitor *v, const char *name, void *opaque,
515 DeviceState *dev = DEVICE(obj);
516 Property *prop = opaque;
517 uint32_t *ptr = qdev_get_prop_ptr(obj, prop);
521 qdev_prop_set_after_realize(dev, name, errp);
525 if (!visit_type_size(v, name, &value, errp)) {
529 if (value > UINT32_MAX) {
531 "Property %s.%s doesn't take value %" PRIu64
533 object_get_typename(obj), name, value, UINT32_MAX);
540 const PropertyInfo qdev_prop_size32 = {
542 .get = qdev_propinfo_get_size32,
544 .set_default_value = qdev_propinfo_set_default_value_uint,
549 static void get_uuid(Object *obj, Visitor *v, const char *name, void *opaque,
552 Property *prop = opaque;
553 QemuUUID *uuid = qdev_get_prop_ptr(obj, prop);
554 char buffer[UUID_FMT_LEN + 1];
557 qemu_uuid_unparse(uuid, buffer);
559 visit_type_str(v, name, &p, errp);
562 #define UUID_VALUE_AUTO "auto"
564 static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque,
567 DeviceState *dev = DEVICE(obj);
568 Property *prop = opaque;
569 QemuUUID *uuid = qdev_get_prop_ptr(obj, prop);
573 qdev_prop_set_after_realize(dev, name, errp);
577 if (!visit_type_str(v, name, &str, errp)) {
581 if (!strcmp(str, UUID_VALUE_AUTO)) {
582 qemu_uuid_generate(uuid);
583 } else if (qemu_uuid_parse(str, uuid) < 0) {
584 error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
589 static void set_default_uuid_auto(ObjectProperty *op, const Property *prop)
591 object_property_set_default_str(op, UUID_VALUE_AUTO);
594 const PropertyInfo qdev_prop_uuid = {
596 .description = "UUID (aka GUID) or \"" UUID_VALUE_AUTO
597 "\" for random value (default)",
600 .set_default_value = set_default_uuid_auto,
603 /* --- support for array properties --- */
605 /* Used as an opaque for the object properties we add for each
606 * array element. Note that the struct Property must be first
607 * in the struct so that a pointer to this works as the opaque
608 * for the underlying element's property hooks as well as for
609 * our own release callback.
612 struct Property prop;
614 ObjectPropertyRelease *release;
615 } ArrayElementProperty;
617 /* object property release callback for array element properties:
618 * we call the underlying element's property release hook, and
619 * then free the memory we allocated when we added the property.
621 static void array_element_release(Object *obj, const char *name, void *opaque)
623 ArrayElementProperty *p = opaque;
625 p->release(obj, name, opaque);
631 static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,
632 void *opaque, Error **errp)
634 /* Setter for the property which defines the length of a
635 * variable-sized property array. As well as actually setting the
636 * array-length field in the device struct, we have to create the
637 * array itself and dynamically add the corresponding properties.
639 DeviceState *dev = DEVICE(obj);
640 Property *prop = opaque;
641 uint32_t *alenptr = qdev_get_prop_ptr(obj, prop);
642 void **arrayptr = (void *)dev + prop->arrayoffset;
644 const char *arrayname;
648 qdev_prop_set_after_realize(dev, name, errp);
652 error_setg(errp, "array size property %s may not be set more than once",
656 if (!visit_type_uint32(v, name, alenptr, errp)) {
663 /* DEFINE_PROP_ARRAY guarantees that name should start with this prefix;
664 * strip it off so we can get the name of the array itself.
666 assert(strncmp(name, PROP_ARRAY_LEN_PREFIX,
667 strlen(PROP_ARRAY_LEN_PREFIX)) == 0);
668 arrayname = name + strlen(PROP_ARRAY_LEN_PREFIX);
670 /* Note that it is the responsibility of the individual device's deinit
671 * to free the array proper.
673 *arrayptr = eltptr = g_malloc0(*alenptr * prop->arrayfieldsize);
674 for (i = 0; i < *alenptr; i++, eltptr += prop->arrayfieldsize) {
675 char *propname = g_strdup_printf("%s[%d]", arrayname, i);
676 ArrayElementProperty *arrayprop = g_new0(ArrayElementProperty, 1);
677 arrayprop->release = prop->arrayinfo->release;
678 arrayprop->propname = propname;
679 arrayprop->prop.info = prop->arrayinfo;
680 arrayprop->prop.name = propname;
681 /* This ugly piece of pointer arithmetic sets up the offset so
682 * that when the underlying get/set hooks call qdev_get_prop_ptr
683 * they get the right answer despite the array element not actually
684 * being inside the device struct.
686 arrayprop->prop.offset = eltptr - (void *)dev;
687 assert(qdev_get_prop_ptr(obj, &arrayprop->prop) == eltptr);
688 object_property_add(obj, propname,
689 arrayprop->prop.info->name,
690 arrayprop->prop.info->get,
691 arrayprop->prop.info->set,
692 array_element_release,
697 const PropertyInfo qdev_prop_arraylen = {
700 .set = set_prop_arraylen,
701 .set_default_value = qdev_propinfo_set_default_value_uint,
704 /* --- public helpers --- */
706 static Property *qdev_prop_walk(Property *props, const char *name)
711 while (props->name) {
712 if (strcmp(props->name, name) == 0) {
720 static Property *qdev_prop_find(DeviceState *dev, const char *name)
725 /* device properties */
726 class = object_get_class(OBJECT(dev));
728 prop = qdev_prop_walk(DEVICE_CLASS(class)->props_, name);
732 class = object_class_get_parent(class);
733 } while (class != object_class_by_name(TYPE_DEVICE));
738 void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
739 Property *prop, const char *value)
743 error_setg(errp, "Property '%s.%s' can't take value '%s', it's in use",
744 object_get_typename(OBJECT(dev)), prop->name, value);
748 error_setg(errp, QERR_PROPERTY_VALUE_BAD,
749 object_get_typename(OBJECT(dev)), prop->name, value);
752 error_setg(errp, "Property '%s.%s' can't find value '%s'",
753 object_get_typename(OBJECT(dev)), prop->name, value);
760 void qdev_prop_set_bit(DeviceState *dev, const char *name, bool value)
762 object_property_set_bool(OBJECT(dev), name, value, &error_abort);
765 void qdev_prop_set_uint8(DeviceState *dev, const char *name, uint8_t value)
767 object_property_set_int(OBJECT(dev), name, value, &error_abort);
770 void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value)
772 object_property_set_int(OBJECT(dev), name, value, &error_abort);
775 void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value)
777 object_property_set_int(OBJECT(dev), name, value, &error_abort);
780 void qdev_prop_set_int32(DeviceState *dev, const char *name, int32_t value)
782 object_property_set_int(OBJECT(dev), name, value, &error_abort);
785 void qdev_prop_set_uint64(DeviceState *dev, const char *name, uint64_t value)
787 object_property_set_int(OBJECT(dev), name, value, &error_abort);
790 void qdev_prop_set_string(DeviceState *dev, const char *name, const char *value)
792 object_property_set_str(OBJECT(dev), name, value, &error_abort);
795 void qdev_prop_set_enum(DeviceState *dev, const char *name, int value)
799 prop = qdev_prop_find(dev, name);
800 object_property_set_str(OBJECT(dev), name,
801 qapi_enum_lookup(prop->info->enum_table, value),
805 static GPtrArray *global_props(void)
807 static GPtrArray *gp;
810 gp = g_ptr_array_new();
816 void qdev_prop_register_global(GlobalProperty *prop)
818 g_ptr_array_add(global_props(), prop);
821 const GlobalProperty *qdev_find_global_prop(Object *obj,
824 GPtrArray *props = global_props();
825 const GlobalProperty *p;
828 for (i = 0; i < props->len; i++) {
829 p = g_ptr_array_index(props, i);
830 if (object_dynamic_cast(obj, p->driver)
831 && !strcmp(p->property, name)) {
838 int qdev_prop_check_globals(void)
842 for (i = 0; i < global_props()->len; i++) {
843 GlobalProperty *prop;
847 prop = g_ptr_array_index(global_props(), i);
851 oc = object_class_by_name(prop->driver);
852 oc = object_class_dynamic_cast(oc, TYPE_DEVICE);
854 warn_report("global %s.%s has invalid class name",
855 prop->driver, prop->property);
859 dc = DEVICE_CLASS(oc);
860 if (!dc->hotpluggable && !prop->used) {
861 warn_report("global %s.%s=%s not used",
862 prop->driver, prop->property, prop->value);
870 void qdev_prop_set_globals(DeviceState *dev)
872 object_apply_global_props(OBJECT(dev), global_props(),
873 dev->hotplugged ? NULL : &error_fatal);
876 /* --- 64bit unsigned int 'size' type --- */
878 static void get_size(Object *obj, Visitor *v, const char *name, void *opaque,
881 Property *prop = opaque;
882 uint64_t *ptr = qdev_get_prop_ptr(obj, prop);
884 visit_type_size(v, name, ptr, errp);
887 static void set_size(Object *obj, Visitor *v, const char *name, void *opaque,
890 DeviceState *dev = DEVICE(obj);
891 Property *prop = opaque;
892 uint64_t *ptr = qdev_get_prop_ptr(obj, prop);
895 qdev_prop_set_after_realize(dev, name, errp);
899 visit_type_size(v, name, ptr, errp);
902 const PropertyInfo qdev_prop_size = {
906 .set_default_value = qdev_propinfo_set_default_value_uint,
909 /* --- object link property --- */
911 static void create_link_property(ObjectClass *oc, Property *prop)
913 object_class_property_add_link(oc, prop->name, prop->link_type,
915 qdev_prop_allow_set_link_before_realize,
916 OBJ_PROP_LINK_STRONG);
919 const PropertyInfo qdev_prop_link = {
921 .create = create_link_property,
924 void qdev_property_add_static(DeviceState *dev, Property *prop)
926 Object *obj = OBJECT(dev);
929 assert(!prop->info->create);
931 op = object_property_add(obj, prop->name, prop->info->name,
932 prop->info->get, prop->info->set,
936 object_property_set_description(obj, prop->name,
937 prop->info->description);
939 if (prop->set_default) {
940 prop->info->set_default_value(op, prop);
947 static void qdev_class_add_property(DeviceClass *klass, Property *prop)
949 ObjectClass *oc = OBJECT_CLASS(klass);
951 if (prop->info->create) {
952 prop->info->create(oc, prop);
956 op = object_class_property_add(oc,
957 prop->name, prop->info->name,
958 prop->info->get, prop->info->set,
961 if (prop->set_default) {
962 prop->info->set_default_value(op, prop);
965 object_class_property_set_description(oc, prop->name,
966 prop->info->description);
970 * Legacy property handling
973 static void qdev_get_legacy_property(Object *obj, Visitor *v,
974 const char *name, void *opaque,
977 Property *prop = opaque;
982 prop->info->print(obj, prop, buffer, sizeof(buffer));
983 visit_type_str(v, name, &ptr, errp);
987 * qdev_class_add_legacy_property:
988 * @dev: Device to add the property to.
989 * @prop: The qdev property definition.
991 * Add a legacy QOM property to @dev for qdev property @prop.
993 * Legacy properties are string versions of QOM properties. The format of
994 * the string depends on the property type. Legacy properties are only
995 * needed for "info qtree".
997 * Do not use this in new code! QOM Properties added through this interface
998 * will be given names in the "legacy" namespace.
1000 static void qdev_class_add_legacy_property(DeviceClass *dc, Property *prop)
1002 g_autofree char *name = NULL;
1004 /* Register pointer properties as legacy properties */
1005 if (!prop->info->print && prop->info->get) {
1009 name = g_strdup_printf("legacy-%s", prop->name);
1010 object_class_property_add(OBJECT_CLASS(dc), name, "str",
1011 prop->info->print ? qdev_get_legacy_property : prop->info->get,
1015 void device_class_set_props(DeviceClass *dc, Property *props)
1020 for (prop = props; prop && prop->name; prop++) {
1021 qdev_class_add_legacy_property(dc, prop);
1022 qdev_class_add_property(dc, prop);
1026 void qdev_alias_all_properties(DeviceState *target, Object *source)
1031 class = object_get_class(OBJECT(target));
1033 DeviceClass *dc = DEVICE_CLASS(class);
1035 for (prop = dc->props_; prop && prop->name; prop++) {
1036 object_property_add_alias(source, prop->name,
1037 OBJECT(target), prop->name);
1039 class = object_class_get_parent(class);
1040 } while (class != object_class_by_name(TYPE_DEVICE));