Lines Matching +full:bool +full:- +full:property
2 #include "hw/qdev-properties.h"
4 #include "qapi/qapi-types-misc.h"
7 #include "qemu/error-report.h"
11 #include "qdev-prop-internal.h"
12 #include "qom/qom-qobject.h"
17 if (dev->id) { in qdev_prop_set_after_realize()
18 error_setg(errp, "Attempt to set property '%s' on device '%s' " in qdev_prop_set_after_realize()
19 "(type '%s') after it was realized", name, dev->id, in qdev_prop_set_after_realize()
22 error_setg(errp, "Attempt to set property '%s' on anonymous device " in qdev_prop_set_after_realize()
28 /* returns: true if property is allowed to be set, false otherwise */
29 static bool qdev_prop_allow_set(Object *obj, const char *name, in qdev_prop_allow_set()
34 if (dev->realized && !info->realized_set_allowed) { in qdev_prop_allow_set()
47 if (dev->realized) { in qdev_prop_allow_set_link_before_realize()
48 error_setg(errp, "Attempt to set link property '%s' on device '%s' " in qdev_prop_allow_set_link_before_realize()
50 name, dev->id, object_get_typename(obj)); in qdev_prop_allow_set_link_before_realize()
54 void *object_field_prop_ptr(Object *obj, const Property *prop) in object_field_prop_ptr()
57 ptr += prop->offset; in object_field_prop_ptr()
64 const Property *prop = opaque; in field_prop_get()
65 return prop->info->get(obj, v, name, opaque, errp); in field_prop_get()
69 * field_prop_getter: Return getter function to be used for property
75 return info->get ? field_prop_get : NULL; in field_prop_getter()
81 const Property *prop = opaque; in field_prop_set()
83 if (!qdev_prop_allow_set(obj, name, prop->info, errp)) { in field_prop_set()
87 return prop->info->set(obj, v, name, opaque, errp); in field_prop_set()
91 * field_prop_setter: Return setter function to be used for property
97 return info->set ? field_prop_set : NULL; in field_prop_setter()
103 const Property *prop = opaque; in qdev_propinfo_get_enum()
106 visit_type_enum(v, name, ptr, prop->info->enum_table, errp); in qdev_propinfo_get_enum()
112 const Property *prop = opaque; in qdev_propinfo_set_enum()
115 visit_type_enum(v, name, ptr, prop->info->enum_table, errp); in qdev_propinfo_set_enum()
119 const Property *prop) in qdev_propinfo_set_default_value_enum()
122 qapi_enum_lookup(prop->info->enum_table, prop->defval.i)); in qdev_propinfo_set_default_value_enum()
127 static uint32_t qdev_get_prop_mask(const Property *prop) in qdev_get_prop_mask()
129 assert(prop->info == &qdev_prop_bit); in qdev_get_prop_mask()
130 return 0x1 << prop->bitnr; in qdev_get_prop_mask()
133 static void bit_prop_set(Object *obj, const Property *props, bool val) in bit_prop_set()
147 const Property *prop = opaque; in prop_get_bit()
149 bool value = (*p & qdev_get_prop_mask(prop)) != 0; in prop_get_bit()
157 const Property *prop = opaque; in prop_set_bit()
158 bool value; in prop_set_bit()
166 static void set_default_value_bool(ObjectProperty *op, const Property *prop) in set_default_value_bool()
168 object_property_set_default_bool(op, prop->defval.u); in set_default_value_bool()
172 .type = "bool",
181 static uint64_t qdev_get_prop_mask64(const Property *prop) in qdev_get_prop_mask64()
183 assert(prop->info == &qdev_prop_bit64); in qdev_get_prop_mask64()
184 return 0x1ull << prop->bitnr; in qdev_get_prop_mask64()
187 static void bit64_prop_set(Object *obj, const Property *props, bool val) in bit64_prop_set()
201 const Property *prop = opaque; in prop_get_bit64()
203 bool value = (*p & qdev_get_prop_mask64(prop)) != 0; in prop_get_bit64()
211 const Property *prop = opaque; in prop_set_bit64()
212 bool value; in prop_set_bit64()
221 .type = "bool",
228 /* --- bool --- */
233 const Property *prop = opaque; in get_bool()
234 bool *ptr = object_field_prop_ptr(obj, prop); in get_bool()
242 const Property *prop = opaque; in set_bool()
243 bool *ptr = object_field_prop_ptr(obj, prop); in set_bool()
249 .type = "bool",
256 /* --- 8bit integer --- */
261 const Property *prop = opaque; in get_uint8()
270 const Property *prop = opaque; in set_uint8()
277 const Property *prop) in qdev_propinfo_set_default_value_int()
279 object_property_set_default_int(op, prop->defval.i); in qdev_propinfo_set_default_value_int()
283 const Property *prop) in qdev_propinfo_set_default_value_uint()
285 object_property_set_default_uint(op, prop->defval.u); in qdev_propinfo_set_default_value_uint()
295 /* --- 16bit integer --- */
300 const Property *prop = opaque; in get_uint16()
309 const Property *prop = opaque; in set_uint16()
322 /* --- 32bit integer --- */
327 const Property *prop = opaque; in get_uint32()
336 const Property *prop = opaque; in set_uint32()
345 const Property *prop = opaque; in qdev_propinfo_get_int32()
354 const Property *prop = opaque; in set_int32()
374 /* --- 64bit integer --- */
379 const Property *prop = opaque; in get_uint64()
388 const Property *prop = opaque; in set_uint64()
397 const Property *prop = opaque; in get_int64()
406 const Property *prop = opaque; in set_int64()
429 const Property *prop = opaque; in set_uint64_checkmask()
433 if (*ptr & ~prop->bitmask) { in set_uint64_checkmask()
434 error_setg(errp, "Property value for '%s' has bits outside mask '0x%" PRIx64 "'", in set_uint64_checkmask()
435 name, prop->bitmask); in set_uint64_checkmask()
445 /* --- pointer-size integer --- */
450 const Property *prop = opaque; in get_usize()
464 const Property *prop = opaque; in set_usize()
482 /* --- string --- */
486 const Property *prop = opaque; in release_string()
493 const Property *prop = opaque; in get_string()
507 const Property *prop = opaque; in set_string()
525 /* --- on/off/auto --- */
536 /* --- 32bit unsigned int 'size' type --- */
541 const Property *prop = opaque; in qdev_propinfo_get_size32()
551 const Property *prop = opaque; in set_size32()
561 "Property %s.%s doesn't take value %" PRIu64 in set_size32()
577 /* --- support for array properties --- */
587 * Given an array property @parent_prop in @obj, return a Property for a
591 static Property array_elem_prop(Object *obj, const Property *parent_prop, in array_elem_prop()
594 return (Property) { in array_elem_prop()
595 .info = parent_prop->arrayinfo, in array_elem_prop()
603 .offset = (uintptr_t)elem - (uintptr_t)obj, in array_elem_prop()
608 * Object property release callback for array properties: We call the
609 * underlying element's property release hook for each element.
616 const Property *prop = opaque; in release_prop_array()
618 void **arrayptr = (void *)obj + prop->arrayoffset; in release_prop_array()
622 if (!prop->arrayinfo->release) { in release_prop_array()
627 Property elem_prop = array_elem_prop(obj, prop, name, elem); in release_prop_array()
628 prop->arrayinfo->release(obj, NULL, &elem_prop); in release_prop_array()
629 elem += prop->arrayfieldsize; in release_prop_array()
634 * Setter for an array property. This sets both the array length (which
635 * is technically the property field in the object) and the array itself
637 * prop->arrayoffset).
643 const Property *prop = opaque; in set_prop_array()
645 void **arrayptr = (void *)obj + prop->arrayoffset; in set_prop_array()
649 bool ok = true; in set_prop_array()
652 error_setg(errp, "array size property %s may not be set more than once", in set_prop_array()
664 Property elem_prop; in set_prop_array()
666 elem->value = g_malloc0(prop->arrayfieldsize); in set_prop_array()
667 elem_prop = array_elem_prop(obj, prop, name, elem->value); in set_prop_array()
668 prop->arrayinfo->set(obj, v, NULL, &elem_prop, errp); in set_prop_array()
688 Property elem_prop = array_elem_prop(obj, prop, name, in set_prop_array()
689 elem->value); in set_prop_array()
690 if (prop->arrayinfo->release) { in set_prop_array()
691 prop->arrayinfo->release(obj, NULL, &elem_prop); in set_prop_array()
693 next = elem->next; in set_prop_array()
694 g_free(elem->value); in set_prop_array()
704 *arrayptr = g_malloc_n(*alenptr, prop->arrayfieldsize); in set_prop_array()
707 memcpy(elemptr, elem->value, prop->arrayfieldsize); in set_prop_array()
708 elemptr += prop->arrayfieldsize; in set_prop_array()
709 next = elem->next; in set_prop_array()
710 g_free(elem->value); in set_prop_array()
719 const Property *prop = opaque; in get_prop_array()
721 void **arrayptr = (void *)obj + prop->arrayoffset; in get_prop_array()
727 bool ok; in get_prop_array()
732 elem->value = elemptr; in get_prop_array()
733 elemptr += prop->arrayfieldsize; in get_prop_array()
736 tail = &elem->next; in get_prop_array()
745 Property elem_prop = array_elem_prop(obj, prop, name, elem->value); in get_prop_array()
746 prop->arrayinfo->get(obj, v, NULL, &elem_prop, errp); in get_prop_array()
763 list = elem->next; in get_prop_array()
768 static void default_prop_array(ObjectProperty *op, const Property *prop) in default_prop_array()
781 /* --- public helpers --- */
783 static const Property *qdev_prop_walk(DeviceClass *cls, const char *name) in qdev_prop_walk()
785 for (int i = 0, n = cls->props_count_; i < n; ++i) { in qdev_prop_walk()
786 const Property *prop = &cls->props_[i]; in qdev_prop_walk()
787 if (strcmp(prop->name, name) == 0) { in qdev_prop_walk()
794 static const Property *qdev_prop_find(DeviceState *dev, const char *name) in qdev_prop_find()
797 const Property *prop; in qdev_prop_find()
816 case -EEXIST: in error_set_from_qdev_prop_error()
817 error_setg(errp, "Property '%s.%s' can't take value '%s', it's in use", in error_set_from_qdev_prop_error()
821 case -EINVAL: in error_set_from_qdev_prop_error()
822 error_setg(errp, "Property '%s.%s' doesn't take value '%s'", in error_set_from_qdev_prop_error()
825 case -ENOENT: in error_set_from_qdev_prop_error()
826 error_setg(errp, "Property '%s.%s' can't find value '%s'", in error_set_from_qdev_prop_error()
834 void qdev_prop_set_bit(DeviceState *dev, const char *name, bool value) in qdev_prop_set_bit()
871 const Property *prop; in qdev_prop_set_enum()
875 qapi_enum_lookup(prop->info->enum_table, value), in qdev_prop_set_enum()
909 for (i = 0; i < props->len; i++) { in qdev_find_global_prop()
911 if (object_dynamic_cast(obj, p->driver) in qdev_find_global_prop()
912 && !strcmp(p->property, name)) { in qdev_find_global_prop()
923 for (i = 0; i < global_props()->len; i++) { in qdev_prop_check_globals()
929 if (prop->used) { in qdev_prop_check_globals()
932 oc = object_class_by_name(prop->driver); in qdev_prop_check_globals()
936 prop->driver, prop->property); in qdev_prop_check_globals()
941 if (!dc->hotpluggable && !prop->used) { in qdev_prop_check_globals()
943 prop->driver, prop->property, prop->value); in qdev_prop_check_globals()
954 dev->hotplugged ? NULL : &error_fatal); in qdev_prop_set_globals()
957 /* --- 64bit unsigned int 'size' type --- */
962 const Property *prop = opaque; in get_size()
971 const Property *prop = opaque; in set_size()
984 /* --- object link property --- */
987 const Property *prop) in create_link_property()
989 return object_class_property_add_link(oc, name, prop->link_type, in create_link_property()
990 prop->offset, in create_link_property()
1000 void qdev_property_add_static(DeviceState *dev, const Property *prop) in qdev_property_add_static()
1005 assert(!prop->info->create); in qdev_property_add_static()
1007 op = object_property_add(obj, prop->name, prop->info->type, in qdev_property_add_static()
1008 field_prop_getter(prop->info), in qdev_property_add_static()
1009 field_prop_setter(prop->info), in qdev_property_add_static()
1010 prop->info->release, in qdev_property_add_static()
1011 (Property *)prop); in qdev_property_add_static()
1013 object_property_set_description(obj, prop->name, in qdev_property_add_static()
1014 prop->info->description); in qdev_property_add_static()
1016 if (prop->set_default) { in qdev_property_add_static()
1017 prop->info->set_default_value(op, prop); in qdev_property_add_static()
1018 if (op->init) { in qdev_property_add_static()
1019 op->init(obj, op); in qdev_property_add_static()
1025 const Property *prop) in qdev_class_add_property()
1030 if (prop->info->create) { in qdev_class_add_property()
1031 op = prop->info->create(oc, name, prop); in qdev_class_add_property()
1034 name, prop->info->type, in qdev_class_add_property()
1035 field_prop_getter(prop->info), in qdev_class_add_property()
1036 field_prop_setter(prop->info), in qdev_class_add_property()
1037 prop->info->release, in qdev_class_add_property()
1038 (Property *)prop); in qdev_class_add_property()
1040 if (prop->set_default) { in qdev_class_add_property()
1041 prop->info->set_default_value(op, prop); in qdev_class_add_property()
1043 object_class_property_set_description(oc, name, prop->info->description); in qdev_class_add_property()
1047 * Legacy property handling
1054 const Property *prop = opaque; in qdev_get_legacy_property()
1059 prop->info->print(obj, prop, buffer, sizeof(buffer)); in qdev_get_legacy_property()
1065 * @dev: Device to add the property to.
1066 * @prop: The qdev property definition.
1068 * Add a legacy QOM property to @dev for qdev property @prop.
1071 * the string depends on the property type. Legacy properties are only
1077 static void qdev_class_add_legacy_property(DeviceClass *dc, const Property *prop) in qdev_class_add_legacy_property()
1082 if (!prop->info->print && prop->info->get) { in qdev_class_add_legacy_property()
1086 name = g_strdup_printf("legacy-%s", prop->name); in qdev_class_add_legacy_property()
1088 prop->info->print ? qdev_get_legacy_property : prop->info->get, in qdev_class_add_legacy_property()
1089 NULL, NULL, (Property *)prop); in qdev_class_add_legacy_property()
1092 void device_class_set_props_n(DeviceClass *dc, const Property *props, size_t n) in device_class_set_props_n()
1098 dc->props_ = props; in device_class_set_props_n()
1099 dc->props_count_ = n; in device_class_set_props_n()
1102 const Property *prop = &props[i]; in device_class_set_props_n()
1103 assert(prop->name); in device_class_set_props_n()
1105 qdev_class_add_property(dc, prop->name, prop); in device_class_set_props_n()
1119 if (object_property_find(source, prop->name)) { in qdev_alias_all_properties()
1123 object_property_add_alias(source, prop->name, in qdev_alias_all_properties()
1124 OBJECT(target), prop->name); in qdev_alias_all_properties()