3 #include "qapi/qmp/qerror.h"
4 #include "sysemu/blockdev.h"
5 #include "hw/block/block.h"
7 #include "qapi/visitor.h"
8 #include "sysemu/char.h"
10 void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
14 error_setg(errp, "Attempt to set property '%s' on device '%s' "
15 "(type '%s') after it was realized", name, dev->id,
16 object_get_typename(OBJECT(dev)));
18 error_setg(errp, "Attempt to set property '%s' on anonymous device "
19 "(type '%s') after it was realized", name,
20 object_get_typename(OBJECT(dev)));
24 void *qdev_get_prop_ptr(DeviceState *dev, Property *prop)
31 static void get_enum(Object *obj, Visitor *v, void *opaque,
32 const char *name, Error **errp)
34 DeviceState *dev = DEVICE(obj);
35 Property *prop = opaque;
36 int *ptr = qdev_get_prop_ptr(dev, prop);
38 visit_type_enum(v, ptr, prop->info->enum_table,
39 prop->info->name, prop->name, errp);
42 static void set_enum(Object *obj, Visitor *v, void *opaque,
43 const char *name, Error **errp)
45 DeviceState *dev = DEVICE(obj);
46 Property *prop = opaque;
47 int *ptr = qdev_get_prop_ptr(dev, prop);
50 qdev_prop_set_after_realize(dev, name, errp);
54 visit_type_enum(v, ptr, prop->info->enum_table,
55 prop->info->name, prop->name, errp);
60 static uint32_t qdev_get_prop_mask(Property *prop)
62 assert(prop->info == &qdev_prop_bit);
63 return 0x1 << prop->bitnr;
66 static void bit_prop_set(DeviceState *dev, Property *props, bool val)
68 uint32_t *p = qdev_get_prop_ptr(dev, props);
69 uint32_t mask = qdev_get_prop_mask(props);
77 static int print_bit(DeviceState *dev, Property *prop, char *dest, size_t len)
79 uint32_t *p = qdev_get_prop_ptr(dev, prop);
80 return snprintf(dest, len, (*p & qdev_get_prop_mask(prop)) ? "on" : "off");
83 static void get_bit(Object *obj, Visitor *v, void *opaque,
84 const char *name, Error **errp)
86 DeviceState *dev = DEVICE(obj);
87 Property *prop = opaque;
88 uint32_t *p = qdev_get_prop_ptr(dev, prop);
89 bool value = (*p & qdev_get_prop_mask(prop)) != 0;
91 visit_type_bool(v, &value, name, errp);
94 static void set_bit(Object *obj, Visitor *v, void *opaque,
95 const char *name, Error **errp)
97 DeviceState *dev = DEVICE(obj);
98 Property *prop = opaque;
99 Error *local_err = NULL;
103 qdev_prop_set_after_realize(dev, name, errp);
107 visit_type_bool(v, &value, name, &local_err);
109 error_propagate(errp, local_err);
112 bit_prop_set(dev, prop, value);
115 PropertyInfo qdev_prop_bit = {
117 .legacy_name = "on/off",
125 static void get_bool(Object *obj, Visitor *v, void *opaque,
126 const char *name, Error **errp)
128 DeviceState *dev = DEVICE(obj);
129 Property *prop = opaque;
130 bool *ptr = qdev_get_prop_ptr(dev, prop);
132 visit_type_bool(v, ptr, name, errp);
135 static void set_bool(Object *obj, Visitor *v, void *opaque,
136 const char *name, Error **errp)
138 DeviceState *dev = DEVICE(obj);
139 Property *prop = opaque;
140 bool *ptr = qdev_get_prop_ptr(dev, prop);
143 qdev_prop_set_after_realize(dev, name, errp);
147 visit_type_bool(v, ptr, name, errp);
150 PropertyInfo qdev_prop_bool = {
156 /* --- 8bit integer --- */
158 static void get_uint8(Object *obj, Visitor *v, void *opaque,
159 const char *name, Error **errp)
161 DeviceState *dev = DEVICE(obj);
162 Property *prop = opaque;
163 uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
165 visit_type_uint8(v, ptr, name, errp);
168 static void set_uint8(Object *obj, Visitor *v, void *opaque,
169 const char *name, Error **errp)
171 DeviceState *dev = DEVICE(obj);
172 Property *prop = opaque;
173 uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
176 qdev_prop_set_after_realize(dev, name, errp);
180 visit_type_uint8(v, ptr, name, errp);
183 PropertyInfo qdev_prop_uint8 = {
189 /* --- 8bit hex value --- */
191 static int parse_hex8(DeviceState *dev, Property *prop, const char *str)
193 uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
196 if (str[0] != '0' || str[1] != 'x') {
200 *ptr = strtoul(str, &end, 16);
201 if ((*end != '\0') || (end == str)) {
208 static int print_hex8(DeviceState *dev, Property *prop, char *dest, size_t len)
210 uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
211 return snprintf(dest, len, "0x%" PRIx8, *ptr);
214 PropertyInfo qdev_prop_hex8 = {
216 .legacy_name = "hex8",
223 /* --- 16bit integer --- */
225 static void get_uint16(Object *obj, Visitor *v, void *opaque,
226 const char *name, Error **errp)
228 DeviceState *dev = DEVICE(obj);
229 Property *prop = opaque;
230 uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
232 visit_type_uint16(v, ptr, name, errp);
235 static void set_uint16(Object *obj, Visitor *v, void *opaque,
236 const char *name, Error **errp)
238 DeviceState *dev = DEVICE(obj);
239 Property *prop = opaque;
240 uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
243 qdev_prop_set_after_realize(dev, name, errp);
247 visit_type_uint16(v, ptr, name, errp);
250 PropertyInfo qdev_prop_uint16 = {
256 /* --- 32bit integer --- */
258 static void get_uint32(Object *obj, Visitor *v, void *opaque,
259 const char *name, Error **errp)
261 DeviceState *dev = DEVICE(obj);
262 Property *prop = opaque;
263 uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
265 visit_type_uint32(v, ptr, name, errp);
268 static void set_uint32(Object *obj, Visitor *v, void *opaque,
269 const char *name, Error **errp)
271 DeviceState *dev = DEVICE(obj);
272 Property *prop = opaque;
273 uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
276 qdev_prop_set_after_realize(dev, name, errp);
280 visit_type_uint32(v, ptr, name, errp);
283 static void get_int32(Object *obj, Visitor *v, void *opaque,
284 const char *name, Error **errp)
286 DeviceState *dev = DEVICE(obj);
287 Property *prop = opaque;
288 int32_t *ptr = qdev_get_prop_ptr(dev, prop);
290 visit_type_int32(v, ptr, name, errp);
293 static void set_int32(Object *obj, Visitor *v, void *opaque,
294 const char *name, Error **errp)
296 DeviceState *dev = DEVICE(obj);
297 Property *prop = opaque;
298 int32_t *ptr = qdev_get_prop_ptr(dev, prop);
301 qdev_prop_set_after_realize(dev, name, errp);
305 visit_type_int32(v, ptr, name, errp);
308 PropertyInfo qdev_prop_uint32 = {
314 PropertyInfo qdev_prop_int32 = {
320 /* --- 32bit hex value --- */
322 static int parse_hex32(DeviceState *dev, Property *prop, const char *str)
324 uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
327 if (str[0] != '0' || str[1] != 'x') {
331 *ptr = strtoul(str, &end, 16);
332 if ((*end != '\0') || (end == str)) {
339 static int print_hex32(DeviceState *dev, Property *prop, char *dest, size_t len)
341 uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
342 return snprintf(dest, len, "0x%" PRIx32, *ptr);
345 PropertyInfo qdev_prop_hex32 = {
347 .legacy_name = "hex32",
348 .parse = parse_hex32,
349 .print = print_hex32,
354 /* --- 64bit integer --- */
356 static void get_uint64(Object *obj, Visitor *v, void *opaque,
357 const char *name, Error **errp)
359 DeviceState *dev = DEVICE(obj);
360 Property *prop = opaque;
361 uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
363 visit_type_uint64(v, ptr, name, errp);
366 static void set_uint64(Object *obj, Visitor *v, void *opaque,
367 const char *name, Error **errp)
369 DeviceState *dev = DEVICE(obj);
370 Property *prop = opaque;
371 uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
374 qdev_prop_set_after_realize(dev, name, errp);
378 visit_type_uint64(v, ptr, name, errp);
381 PropertyInfo qdev_prop_uint64 = {
387 /* --- 64bit hex value --- */
389 static int parse_hex64(DeviceState *dev, Property *prop, const char *str)
391 uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
394 if (str[0] != '0' || str[1] != 'x') {
398 *ptr = strtoull(str, &end, 16);
399 if ((*end != '\0') || (end == str)) {
406 static int print_hex64(DeviceState *dev, Property *prop, char *dest, size_t len)
408 uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
409 return snprintf(dest, len, "0x%" PRIx64, *ptr);
412 PropertyInfo qdev_prop_hex64 = {
414 .legacy_name = "hex64",
415 .parse = parse_hex64,
416 .print = print_hex64,
423 static void release_string(Object *obj, const char *name, void *opaque)
425 Property *prop = opaque;
426 g_free(*(char **)qdev_get_prop_ptr(DEVICE(obj), prop));
429 static int print_string(DeviceState *dev, Property *prop, char *dest,
432 char **ptr = qdev_get_prop_ptr(dev, prop);
434 return snprintf(dest, len, "<null>");
436 return snprintf(dest, len, "\"%s\"", *ptr);
439 static void get_string(Object *obj, Visitor *v, void *opaque,
440 const char *name, Error **errp)
442 DeviceState *dev = DEVICE(obj);
443 Property *prop = opaque;
444 char **ptr = qdev_get_prop_ptr(dev, prop);
447 char *str = (char *)"";
448 visit_type_str(v, &str, name, errp);
450 visit_type_str(v, ptr, name, errp);
454 static void set_string(Object *obj, Visitor *v, void *opaque,
455 const char *name, Error **errp)
457 DeviceState *dev = DEVICE(obj);
458 Property *prop = opaque;
459 char **ptr = qdev_get_prop_ptr(dev, prop);
460 Error *local_err = NULL;
464 qdev_prop_set_after_realize(dev, name, errp);
468 visit_type_str(v, &str, name, &local_err);
470 error_propagate(errp, local_err);
479 PropertyInfo qdev_prop_string = {
481 .print = print_string,
482 .release = release_string,
487 /* --- pointer --- */
489 /* Not a proper property, just for dirty hacks. TODO Remove it! */
490 PropertyInfo qdev_prop_ptr = {
494 /* --- mac address --- */
497 * accepted syntax versions:
501 static void get_mac(Object *obj, Visitor *v, void *opaque,
502 const char *name, Error **errp)
504 DeviceState *dev = DEVICE(obj);
505 Property *prop = opaque;
506 MACAddr *mac = qdev_get_prop_ptr(dev, prop);
507 char buffer[2 * 6 + 5 + 1];
510 snprintf(buffer, sizeof(buffer), "%02x:%02x:%02x:%02x:%02x:%02x",
511 mac->a[0], mac->a[1], mac->a[2],
512 mac->a[3], mac->a[4], mac->a[5]);
514 visit_type_str(v, &p, name, errp);
517 static void set_mac(Object *obj, Visitor *v, void *opaque,
518 const char *name, Error **errp)
520 DeviceState *dev = DEVICE(obj);
521 Property *prop = opaque;
522 MACAddr *mac = qdev_get_prop_ptr(dev, prop);
523 Error *local_err = NULL;
528 qdev_prop_set_after_realize(dev, name, errp);
532 visit_type_str(v, &str, name, &local_err);
534 error_propagate(errp, local_err);
538 for (i = 0, pos = 0; i < 6; i++, pos += 3) {
539 if (!qemu_isxdigit(str[pos])) {
542 if (!qemu_isxdigit(str[pos+1])) {
546 if (str[pos+2] != '\0') {
550 if (str[pos+2] != ':' && str[pos+2] != '-') {
554 mac->a[i] = strtol(str+pos, &p, 16);
560 error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
564 PropertyInfo qdev_prop_macaddr = {
570 /* --- lost tick policy --- */
572 static const char *lost_tick_policy_table[LOST_TICK_MAX+1] = {
573 [LOST_TICK_DISCARD] = "discard",
574 [LOST_TICK_DELAY] = "delay",
575 [LOST_TICK_MERGE] = "merge",
576 [LOST_TICK_SLEW] = "slew",
577 [LOST_TICK_MAX] = NULL,
580 QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy) != sizeof(int));
582 PropertyInfo qdev_prop_losttickpolicy = {
583 .name = "LostTickPolicy",
584 .enum_table = lost_tick_policy_table,
589 /* --- BIOS CHS translation */
591 static const char *bios_chs_trans_table[] = {
592 [BIOS_ATA_TRANSLATION_AUTO] = "auto",
593 [BIOS_ATA_TRANSLATION_NONE] = "none",
594 [BIOS_ATA_TRANSLATION_LBA] = "lba",
597 PropertyInfo qdev_prop_bios_chs_trans = {
598 .name = "bios-chs-trans",
599 .enum_table = bios_chs_trans_table,
604 /* --- pci address --- */
607 * bus-local address, i.e. "$slot" or "$slot.$fn"
609 static void set_pci_devfn(Object *obj, Visitor *v, void *opaque,
610 const char *name, Error **errp)
612 DeviceState *dev = DEVICE(obj);
613 Property *prop = opaque;
614 int32_t value, *ptr = qdev_get_prop_ptr(dev, prop);
615 unsigned int slot, fn, n;
616 Error *local_err = NULL;
620 qdev_prop_set_after_realize(dev, name, errp);
624 visit_type_str(v, &str, name, &local_err);
626 error_free(local_err);
628 visit_type_int32(v, &value, name, &local_err);
630 error_propagate(errp, local_err);
631 } else if (value < -1 || value > 255) {
632 error_set(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null",
640 if (sscanf(str, "%x.%x%n", &slot, &fn, &n) != 2) {
642 if (sscanf(str, "%x%n", &slot, &n) != 1) {
646 if (str[n] != '\0' || fn > 7 || slot > 31) {
649 *ptr = slot << 3 | fn;
654 error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
658 static int print_pci_devfn(DeviceState *dev, Property *prop, char *dest,
661 int32_t *ptr = qdev_get_prop_ptr(dev, prop);
664 return snprintf(dest, len, "<unset>");
666 return snprintf(dest, len, "%02x.%x", *ptr >> 3, *ptr & 7);
670 PropertyInfo qdev_prop_pci_devfn = {
672 .legacy_name = "pci-devfn",
673 .print = print_pci_devfn,
675 .set = set_pci_devfn,
678 /* --- blocksize --- */
680 static void set_blocksize(Object *obj, Visitor *v, void *opaque,
681 const char *name, Error **errp)
683 DeviceState *dev = DEVICE(obj);
684 Property *prop = opaque;
685 uint16_t value, *ptr = qdev_get_prop_ptr(dev, prop);
686 Error *local_err = NULL;
687 const int64_t min = 512;
688 const int64_t max = 32768;
691 qdev_prop_set_after_realize(dev, name, errp);
695 visit_type_uint16(v, &value, name, &local_err);
697 error_propagate(errp, local_err);
700 if (value < min || value > max) {
701 error_set(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE,
702 dev->id?:"", name, (int64_t)value, min, max);
706 /* We rely on power-of-2 blocksizes for bitmasks */
707 if ((value & (value - 1)) != 0) {
708 error_set(errp, QERR_PROPERTY_VALUE_NOT_POWER_OF_2,
709 dev->id?:"", name, (int64_t)value);
716 PropertyInfo qdev_prop_blocksize = {
719 .set = set_blocksize,
722 /* --- pci host address --- */
724 static void get_pci_host_devaddr(Object *obj, Visitor *v, void *opaque,
725 const char *name, Error **errp)
727 DeviceState *dev = DEVICE(obj);
728 Property *prop = opaque;
729 PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop);
730 char buffer[] = "xxxx:xx:xx.x";
734 rc = snprintf(buffer, sizeof(buffer), "%04x:%02x:%02x.%d",
735 addr->domain, addr->bus, addr->slot, addr->function);
736 assert(rc == sizeof(buffer) - 1);
738 visit_type_str(v, &p, name, errp);
742 * Parse [<domain>:]<bus>:<slot>.<func>
743 * if <domain> is not supplied, it's assumed to be 0.
745 static void set_pci_host_devaddr(Object *obj, Visitor *v, void *opaque,
746 const char *name, Error **errp)
748 DeviceState *dev = DEVICE(obj);
749 Property *prop = opaque;
750 PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop);
751 Error *local_err = NULL;
755 unsigned long dom = 0, bus = 0;
756 unsigned int slot = 0, func = 0;
759 qdev_prop_set_after_realize(dev, name, errp);
763 visit_type_str(v, &str, name, &local_err);
765 error_propagate(errp, local_err);
770 val = strtoul(p, &e, 16);
771 if (e == p || *e != ':') {
777 val = strtoul(p, &e, 16);
785 val = strtoul(p, &e, 16);
796 val = strtoul(p, &e, 10);
802 if (dom > 0xffff || bus > 0xff || slot > 0x1f || func > 7) {
813 addr->function = func;
819 error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
823 PropertyInfo qdev_prop_pci_host_devaddr = {
824 .name = "pci-host-devaddr",
825 .get = get_pci_host_devaddr,
826 .set = set_pci_host_devaddr,
829 /* --- support for array properties --- */
831 /* Used as an opaque for the object properties we add for each
832 * array element. Note that the struct Property must be first
833 * in the struct so that a pointer to this works as the opaque
834 * for the underlying element's property hooks as well as for
835 * our own release callback.
838 struct Property prop;
840 ObjectPropertyRelease *release;
841 } ArrayElementProperty;
843 /* object property release callback for array element properties:
844 * we call the underlying element's property release hook, and
845 * then free the memory we allocated when we added the property.
847 static void array_element_release(Object *obj, const char *name, void *opaque)
849 ArrayElementProperty *p = opaque;
851 p->release(obj, name, opaque);
857 static void set_prop_arraylen(Object *obj, Visitor *v, void *opaque,
858 const char *name, Error **errp)
860 /* Setter for the property which defines the length of a
861 * variable-sized property array. As well as actually setting the
862 * array-length field in the device struct, we have to create the
863 * array itself and dynamically add the corresponding properties.
865 DeviceState *dev = DEVICE(obj);
866 Property *prop = opaque;
867 uint32_t *alenptr = qdev_get_prop_ptr(dev, prop);
868 void **arrayptr = (void *)dev + prop->arrayoffset;
870 const char *arrayname;
874 qdev_prop_set_after_realize(dev, name, errp);
878 error_setg(errp, "array size property %s may not be set more than once",
882 visit_type_uint32(v, alenptr, name, errp);
883 if (error_is_set(errp)) {
890 /* DEFINE_PROP_ARRAY guarantees that name should start with this prefix;
891 * strip it off so we can get the name of the array itself.
893 assert(strncmp(name, PROP_ARRAY_LEN_PREFIX,
894 strlen(PROP_ARRAY_LEN_PREFIX)) == 0);
895 arrayname = name + strlen(PROP_ARRAY_LEN_PREFIX);
897 /* Note that it is the responsibility of the individual device's deinit
898 * to free the array proper.
900 *arrayptr = eltptr = g_malloc0(*alenptr * prop->arrayfieldsize);
901 for (i = 0; i < *alenptr; i++, eltptr += prop->arrayfieldsize) {
902 char *propname = g_strdup_printf("%s[%d]", arrayname, i);
903 ArrayElementProperty *arrayprop = g_new0(ArrayElementProperty, 1);
904 arrayprop->release = prop->arrayinfo->release;
905 arrayprop->propname = propname;
906 arrayprop->prop.info = prop->arrayinfo;
907 arrayprop->prop.name = propname;
908 /* This ugly piece of pointer arithmetic sets up the offset so
909 * that when the underlying get/set hooks call qdev_get_prop_ptr
910 * they get the right answer despite the array element not actually
911 * being inside the device struct.
913 arrayprop->prop.offset = eltptr - (void *)dev;
914 assert(qdev_get_prop_ptr(dev, &arrayprop->prop) == eltptr);
915 object_property_add(obj, propname,
916 arrayprop->prop.info->name,
917 arrayprop->prop.info->get,
918 arrayprop->prop.info->set,
919 array_element_release,
921 if (error_is_set(errp)) {
927 PropertyInfo qdev_prop_arraylen = {
930 .set = set_prop_arraylen,
933 /* --- public helpers --- */
935 static Property *qdev_prop_walk(Property *props, const char *name)
940 while (props->name) {
941 if (strcmp(props->name, name) == 0) {
949 static Property *qdev_prop_find(DeviceState *dev, const char *name)
954 /* device properties */
955 class = object_get_class(OBJECT(dev));
957 prop = qdev_prop_walk(DEVICE_CLASS(class)->props, name);
961 class = object_class_get_parent(class);
962 } while (class != object_class_by_name(TYPE_DEVICE));
967 void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
968 Property *prop, const char *value)
972 error_set(errp, QERR_PROPERTY_VALUE_IN_USE,
973 object_get_typename(OBJECT(dev)), prop->name, value);
977 error_set(errp, QERR_PROPERTY_VALUE_BAD,
978 object_get_typename(OBJECT(dev)), prop->name, value);
981 error_set(errp, QERR_PROPERTY_VALUE_NOT_FOUND,
982 object_get_typename(OBJECT(dev)), prop->name, value);
989 int qdev_prop_parse(DeviceState *dev, const char *name, const char *value)
994 legacy_name = g_strdup_printf("legacy-%s", name);
995 if (object_property_get_type(OBJECT(dev), legacy_name, NULL)) {
996 object_property_parse(OBJECT(dev), value, legacy_name, &err);
998 object_property_parse(OBJECT(dev), value, name, &err);
1000 g_free(legacy_name);
1003 qerror_report_err(err);
1010 void qdev_prop_set_bit(DeviceState *dev, const char *name, bool value)
1013 object_property_set_bool(OBJECT(dev), value, name, &errp);
1014 assert_no_error(errp);
1017 void qdev_prop_set_uint8(DeviceState *dev, const char *name, uint8_t value)
1020 object_property_set_int(OBJECT(dev), value, name, &errp);
1021 assert_no_error(errp);
1024 void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value)
1027 object_property_set_int(OBJECT(dev), value, name, &errp);
1028 assert_no_error(errp);
1031 void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value)
1034 object_property_set_int(OBJECT(dev), value, name, &errp);
1035 assert_no_error(errp);
1038 void qdev_prop_set_int32(DeviceState *dev, const char *name, int32_t value)
1041 object_property_set_int(OBJECT(dev), value, name, &errp);
1042 assert_no_error(errp);
1045 void qdev_prop_set_uint64(DeviceState *dev, const char *name, uint64_t value)
1048 object_property_set_int(OBJECT(dev), value, name, &errp);
1049 assert_no_error(errp);
1052 void qdev_prop_set_string(DeviceState *dev, const char *name, const char *value)
1055 object_property_set_str(OBJECT(dev), value, name, &errp);
1056 assert_no_error(errp);
1059 void qdev_prop_set_macaddr(DeviceState *dev, const char *name, uint8_t *value)
1062 char str[2 * 6 + 5 + 1];
1063 snprintf(str, sizeof(str), "%02x:%02x:%02x:%02x:%02x:%02x",
1064 value[0], value[1], value[2], value[3], value[4], value[5]);
1066 object_property_set_str(OBJECT(dev), str, name, &errp);
1067 assert_no_error(errp);
1070 void qdev_prop_set_enum(DeviceState *dev, const char *name, int value)
1075 prop = qdev_prop_find(dev, name);
1076 object_property_set_str(OBJECT(dev), prop->info->enum_table[value],
1078 assert_no_error(errp);
1081 void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value)
1086 prop = qdev_prop_find(dev, name);
1087 assert(prop && prop->info == &qdev_prop_ptr);
1088 ptr = qdev_get_prop_ptr(dev, prop);
1092 static QTAILQ_HEAD(, GlobalProperty) global_props =
1093 QTAILQ_HEAD_INITIALIZER(global_props);
1095 void qdev_prop_register_global(GlobalProperty *prop)
1097 QTAILQ_INSERT_TAIL(&global_props, prop, next);
1100 void qdev_prop_register_global_list(GlobalProperty *props)
1104 for (i = 0; props[i].driver != NULL; i++) {
1105 qdev_prop_register_global(props+i);
1109 void qdev_prop_set_globals(DeviceState *dev)
1111 ObjectClass *class = object_get_class(OBJECT(dev));
1114 GlobalProperty *prop;
1115 QTAILQ_FOREACH(prop, &global_props, next) {
1116 if (strcmp(object_class_get_name(class), prop->driver) != 0) {
1119 if (qdev_prop_parse(dev, prop->property, prop->value) != 0) {
1123 class = object_class_get_parent(class);