1 #include "qemu/osdep.h"
4 #include "qapi/error.h"
5 #include "hw/pci/pci.h"
6 #include "qapi/qmp/qerror.h"
7 #include "qemu/error-report.h"
8 #include "sysemu/block-backend.h"
9 #include "hw/block/block.h"
11 #include "qapi/visitor.h"
12 #include "chardev/char.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(Object *obj, const char *name,
29 Object *val, Error **errp)
31 DeviceState *dev = DEVICE(obj);
34 error_setg(errp, "Attempt to set link property '%s' on device '%s' "
35 "(type '%s') after it was realized",
36 name, dev->id, object_get_typename(obj));
40 void *qdev_get_prop_ptr(DeviceState *dev, Property *prop)
47 static void get_enum(Object *obj, Visitor *v, const char *name, void *opaque,
50 DeviceState *dev = DEVICE(obj);
51 Property *prop = opaque;
52 int *ptr = qdev_get_prop_ptr(dev, prop);
54 visit_type_enum(v, prop->name, ptr, prop->info->enum_table, errp);
57 static void set_enum(Object *obj, Visitor *v, const char *name, void *opaque,
60 DeviceState *dev = DEVICE(obj);
61 Property *prop = opaque;
62 int *ptr = qdev_get_prop_ptr(dev, prop);
65 qdev_prop_set_after_realize(dev, name, errp);
69 visit_type_enum(v, prop->name, ptr, prop->info->enum_table, errp);
72 static void set_default_value_enum(Object *obj, const Property *prop)
74 object_property_set_str(obj, prop->info->enum_table[prop->defval],
75 prop->name, &error_abort);
80 static uint32_t qdev_get_prop_mask(Property *prop)
82 assert(prop->info == &qdev_prop_bit);
83 return 0x1 << prop->bitnr;
86 static void bit_prop_set(DeviceState *dev, Property *props, bool val)
88 uint32_t *p = qdev_get_prop_ptr(dev, props);
89 uint32_t mask = qdev_get_prop_mask(props);
97 static void prop_get_bit(Object *obj, Visitor *v, const char *name,
98 void *opaque, Error **errp)
100 DeviceState *dev = DEVICE(obj);
101 Property *prop = opaque;
102 uint32_t *p = qdev_get_prop_ptr(dev, prop);
103 bool value = (*p & qdev_get_prop_mask(prop)) != 0;
105 visit_type_bool(v, name, &value, errp);
108 static void prop_set_bit(Object *obj, Visitor *v, const char *name,
109 void *opaque, Error **errp)
111 DeviceState *dev = DEVICE(obj);
112 Property *prop = opaque;
113 Error *local_err = NULL;
117 qdev_prop_set_after_realize(dev, name, errp);
121 visit_type_bool(v, name, &value, &local_err);
123 error_propagate(errp, local_err);
126 bit_prop_set(dev, prop, value);
129 static void set_default_value_bool(Object *obj, const Property *prop)
131 object_property_set_bool(obj, prop->defval, prop->name, &error_abort);
134 PropertyInfo qdev_prop_bit = {
136 .description = "on/off",
139 .set_default_value = set_default_value_bool,
144 static uint64_t qdev_get_prop_mask64(Property *prop)
146 assert(prop->info == &qdev_prop_bit64);
147 return 0x1ull << prop->bitnr;
150 static void bit64_prop_set(DeviceState *dev, Property *props, bool val)
152 uint64_t *p = qdev_get_prop_ptr(dev, props);
153 uint64_t mask = qdev_get_prop_mask64(props);
161 static void prop_get_bit64(Object *obj, Visitor *v, const char *name,
162 void *opaque, Error **errp)
164 DeviceState *dev = DEVICE(obj);
165 Property *prop = opaque;
166 uint64_t *p = qdev_get_prop_ptr(dev, prop);
167 bool value = (*p & qdev_get_prop_mask64(prop)) != 0;
169 visit_type_bool(v, name, &value, errp);
172 static void prop_set_bit64(Object *obj, Visitor *v, const char *name,
173 void *opaque, Error **errp)
175 DeviceState *dev = DEVICE(obj);
176 Property *prop = opaque;
177 Error *local_err = NULL;
181 qdev_prop_set_after_realize(dev, name, errp);
185 visit_type_bool(v, name, &value, &local_err);
187 error_propagate(errp, local_err);
190 bit64_prop_set(dev, prop, value);
193 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 DeviceState *dev = DEVICE(obj);
207 Property *prop = opaque;
208 bool *ptr = qdev_get_prop_ptr(dev, prop);
210 visit_type_bool(v, name, ptr, errp);
213 static void set_bool(Object *obj, Visitor *v, const char *name, void *opaque,
216 DeviceState *dev = DEVICE(obj);
217 Property *prop = opaque;
218 bool *ptr = qdev_get_prop_ptr(dev, prop);
221 qdev_prop_set_after_realize(dev, name, errp);
225 visit_type_bool(v, name, ptr, errp);
228 PropertyInfo qdev_prop_bool = {
232 .set_default_value = set_default_value_bool,
235 /* --- 8bit integer --- */
237 static void get_uint8(Object *obj, Visitor *v, const char *name, void *opaque,
240 DeviceState *dev = DEVICE(obj);
241 Property *prop = opaque;
242 uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
244 visit_type_uint8(v, name, ptr, errp);
247 static void set_uint8(Object *obj, Visitor *v, const char *name, void *opaque,
250 DeviceState *dev = DEVICE(obj);
251 Property *prop = opaque;
252 uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
255 qdev_prop_set_after_realize(dev, name, errp);
259 visit_type_uint8(v, name, ptr, errp);
262 static void set_default_value_int(Object *obj, const Property *prop)
264 object_property_set_int(obj, prop->defval, prop->name, &error_abort);
267 PropertyInfo qdev_prop_uint8 = {
271 .set_default_value = set_default_value_int,
274 /* --- 16bit integer --- */
276 static void get_uint16(Object *obj, Visitor *v, const char *name,
277 void *opaque, Error **errp)
279 DeviceState *dev = DEVICE(obj);
280 Property *prop = opaque;
281 uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
283 visit_type_uint16(v, name, ptr, errp);
286 static void set_uint16(Object *obj, Visitor *v, const char *name,
287 void *opaque, Error **errp)
289 DeviceState *dev = DEVICE(obj);
290 Property *prop = opaque;
291 uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
294 qdev_prop_set_after_realize(dev, name, errp);
298 visit_type_uint16(v, name, ptr, errp);
301 PropertyInfo qdev_prop_uint16 = {
305 .set_default_value = set_default_value_int,
308 /* --- 32bit integer --- */
310 static void get_uint32(Object *obj, Visitor *v, const char *name,
311 void *opaque, Error **errp)
313 DeviceState *dev = DEVICE(obj);
314 Property *prop = opaque;
315 uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
317 visit_type_uint32(v, name, ptr, errp);
320 static void set_uint32(Object *obj, Visitor *v, const char *name,
321 void *opaque, Error **errp)
323 DeviceState *dev = DEVICE(obj);
324 Property *prop = opaque;
325 uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
328 qdev_prop_set_after_realize(dev, name, errp);
332 visit_type_uint32(v, name, ptr, errp);
335 static void get_int32(Object *obj, Visitor *v, const char *name, void *opaque,
338 DeviceState *dev = DEVICE(obj);
339 Property *prop = opaque;
340 int32_t *ptr = qdev_get_prop_ptr(dev, prop);
342 visit_type_int32(v, name, ptr, errp);
345 static void set_int32(Object *obj, Visitor *v, const char *name, void *opaque,
348 DeviceState *dev = DEVICE(obj);
349 Property *prop = opaque;
350 int32_t *ptr = qdev_get_prop_ptr(dev, prop);
353 qdev_prop_set_after_realize(dev, name, errp);
357 visit_type_int32(v, name, ptr, errp);
360 PropertyInfo qdev_prop_uint32 = {
364 .set_default_value = set_default_value_int,
367 PropertyInfo qdev_prop_int32 = {
371 .set_default_value = set_default_value_int,
374 /* --- 64bit integer --- */
376 static void get_uint64(Object *obj, Visitor *v, const char *name,
377 void *opaque, Error **errp)
379 DeviceState *dev = DEVICE(obj);
380 Property *prop = opaque;
381 uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
383 visit_type_uint64(v, name, ptr, errp);
386 static void set_uint64(Object *obj, Visitor *v, const char *name,
387 void *opaque, Error **errp)
389 DeviceState *dev = DEVICE(obj);
390 Property *prop = opaque;
391 uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
394 qdev_prop_set_after_realize(dev, name, errp);
398 visit_type_uint64(v, name, ptr, errp);
401 PropertyInfo qdev_prop_uint64 = {
405 .set_default_value = set_default_value_int,
410 static void release_string(Object *obj, const char *name, void *opaque)
412 Property *prop = opaque;
413 g_free(*(char **)qdev_get_prop_ptr(DEVICE(obj), prop));
416 static void get_string(Object *obj, Visitor *v, const char *name,
417 void *opaque, Error **errp)
419 DeviceState *dev = DEVICE(obj);
420 Property *prop = opaque;
421 char **ptr = qdev_get_prop_ptr(dev, prop);
424 char *str = (char *)"";
425 visit_type_str(v, name, &str, errp);
427 visit_type_str(v, name, ptr, errp);
431 static void set_string(Object *obj, Visitor *v, const char *name,
432 void *opaque, Error **errp)
434 DeviceState *dev = DEVICE(obj);
435 Property *prop = opaque;
436 char **ptr = qdev_get_prop_ptr(dev, prop);
437 Error *local_err = NULL;
441 qdev_prop_set_after_realize(dev, name, errp);
445 visit_type_str(v, name, &str, &local_err);
447 error_propagate(errp, local_err);
454 PropertyInfo qdev_prop_string = {
456 .release = release_string,
461 /* --- pointer --- */
463 /* Not a proper property, just for dirty hacks. TODO Remove it! */
464 PropertyInfo qdev_prop_ptr = {
468 /* --- mac address --- */
471 * accepted syntax versions:
475 static void get_mac(Object *obj, Visitor *v, const char *name, void *opaque,
478 DeviceState *dev = DEVICE(obj);
479 Property *prop = opaque;
480 MACAddr *mac = qdev_get_prop_ptr(dev, prop);
481 char buffer[2 * 6 + 5 + 1];
484 snprintf(buffer, sizeof(buffer), "%02x:%02x:%02x:%02x:%02x:%02x",
485 mac->a[0], mac->a[1], mac->a[2],
486 mac->a[3], mac->a[4], mac->a[5]);
488 visit_type_str(v, name, &p, errp);
491 static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,
494 DeviceState *dev = DEVICE(obj);
495 Property *prop = opaque;
496 MACAddr *mac = qdev_get_prop_ptr(dev, prop);
497 Error *local_err = NULL;
502 qdev_prop_set_after_realize(dev, name, errp);
506 visit_type_str(v, name, &str, &local_err);
508 error_propagate(errp, local_err);
512 for (i = 0, pos = 0; i < 6; i++, pos += 3) {
513 if (!qemu_isxdigit(str[pos])) {
516 if (!qemu_isxdigit(str[pos+1])) {
520 if (str[pos+2] != '\0') {
524 if (str[pos+2] != ':' && str[pos+2] != '-') {
528 mac->a[i] = strtol(str+pos, &p, 16);
534 error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
538 PropertyInfo qdev_prop_macaddr = {
540 .description = "Ethernet 6-byte MAC Address, example: 52:54:00:12:34:56",
545 /* --- on/off/auto --- */
547 PropertyInfo qdev_prop_on_off_auto = {
549 .description = "on/off/auto",
550 .enum_table = OnOffAuto_lookup,
553 .set_default_value = set_default_value_enum,
556 /* --- lost tick policy --- */
558 QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy) != sizeof(int));
560 PropertyInfo qdev_prop_losttickpolicy = {
561 .name = "LostTickPolicy",
562 .enum_table = LostTickPolicy_lookup,
565 .set_default_value = set_default_value_enum,
568 /* --- Block device error handling policy --- */
570 QEMU_BUILD_BUG_ON(sizeof(BlockdevOnError) != sizeof(int));
572 PropertyInfo qdev_prop_blockdev_on_error = {
573 .name = "BlockdevOnError",
574 .description = "Error handling policy, "
575 "report/ignore/enospc/stop/auto",
576 .enum_table = BlockdevOnError_lookup,
579 .set_default_value = set_default_value_enum,
582 /* --- BIOS CHS translation */
584 QEMU_BUILD_BUG_ON(sizeof(BiosAtaTranslation) != sizeof(int));
586 PropertyInfo qdev_prop_bios_chs_trans = {
587 .name = "BiosAtaTranslation",
588 .description = "Logical CHS translation algorithm, "
589 "auto/none/lba/large/rechs",
590 .enum_table = BiosAtaTranslation_lookup,
593 .set_default_value = set_default_value_enum,
596 /* --- FDC default drive types */
598 PropertyInfo qdev_prop_fdc_drive_type = {
599 .name = "FdcDriveType",
600 .description = "FDC drive type, "
601 "144/288/120/none/auto",
602 .enum_table = FloppyDriveType_lookup,
605 .set_default_value = set_default_value_enum,
608 /* --- pci address --- */
611 * bus-local address, i.e. "$slot" or "$slot.$fn"
613 static void set_pci_devfn(Object *obj, Visitor *v, const char *name,
614 void *opaque, Error **errp)
616 DeviceState *dev = DEVICE(obj);
617 Property *prop = opaque;
618 int32_t value, *ptr = qdev_get_prop_ptr(dev, prop);
619 unsigned int slot, fn, n;
620 Error *local_err = NULL;
624 qdev_prop_set_after_realize(dev, name, errp);
628 visit_type_str(v, name, &str, &local_err);
630 error_free(local_err);
632 visit_type_int32(v, name, &value, &local_err);
634 error_propagate(errp, local_err);
635 } else if (value < -1 || value > 255) {
636 error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
637 name ? name : "null", "pci_devfn");
644 if (sscanf(str, "%x.%x%n", &slot, &fn, &n) != 2) {
646 if (sscanf(str, "%x%n", &slot, &n) != 1) {
650 if (str[n] != '\0' || fn > 7 || slot > 31) {
653 *ptr = slot << 3 | fn;
658 error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
662 static int print_pci_devfn(DeviceState *dev, Property *prop, char *dest,
665 int32_t *ptr = qdev_get_prop_ptr(dev, prop);
668 return snprintf(dest, len, "<unset>");
670 return snprintf(dest, len, "%02x.%x", *ptr >> 3, *ptr & 7);
674 PropertyInfo qdev_prop_pci_devfn = {
676 .description = "Slot and optional function number, example: 06.0 or 06",
677 .print = print_pci_devfn,
679 .set = set_pci_devfn,
680 .set_default_value = set_default_value_int,
683 /* --- blocksize --- */
685 static void set_blocksize(Object *obj, Visitor *v, const char *name,
686 void *opaque, Error **errp)
688 DeviceState *dev = DEVICE(obj);
689 Property *prop = opaque;
690 uint16_t value, *ptr = qdev_get_prop_ptr(dev, prop);
691 Error *local_err = NULL;
692 const int64_t min = 512;
693 const int64_t max = 32768;
696 qdev_prop_set_after_realize(dev, name, errp);
700 visit_type_uint16(v, name, &value, &local_err);
702 error_propagate(errp, local_err);
705 /* value of 0 means "unset" */
706 if (value && (value < min || value > max)) {
707 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE,
708 dev->id ? : "", name, (int64_t)value, min, max);
712 /* We rely on power-of-2 blocksizes for bitmasks */
713 if ((value & (value - 1)) != 0) {
715 "Property %s.%s doesn't take value '%" PRId64 "', it's not a power of 2",
716 dev->id ?: "", name, (int64_t)value);
723 PropertyInfo qdev_prop_blocksize = {
725 .description = "A power of two between 512 and 32768",
727 .set = set_blocksize,
728 .set_default_value = set_default_value_int,
731 /* --- pci host address --- */
733 static void get_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
734 void *opaque, Error **errp)
736 DeviceState *dev = DEVICE(obj);
737 Property *prop = opaque;
738 PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop);
739 char buffer[] = "ffff:ff:ff.f";
744 * Catch "invalid" device reference from vfio-pci and allow the
745 * default buffer representing the non-existent device to be used.
747 if (~addr->domain || ~addr->bus || ~addr->slot || ~addr->function) {
748 rc = snprintf(buffer, sizeof(buffer), "%04x:%02x:%02x.%0d",
749 addr->domain, addr->bus, addr->slot, addr->function);
750 assert(rc == sizeof(buffer) - 1);
753 visit_type_str(v, name, &p, errp);
757 * Parse [<domain>:]<bus>:<slot>.<func>
758 * if <domain> is not supplied, it's assumed to be 0.
760 static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
761 void *opaque, Error **errp)
763 DeviceState *dev = DEVICE(obj);
764 Property *prop = opaque;
765 PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop);
766 Error *local_err = NULL;
770 unsigned long dom = 0, bus = 0;
771 unsigned int slot = 0, func = 0;
774 qdev_prop_set_after_realize(dev, name, errp);
778 visit_type_str(v, name, &str, &local_err);
780 error_propagate(errp, local_err);
785 val = strtoul(p, &e, 16);
786 if (e == p || *e != ':') {
792 val = strtoul(p, &e, 16);
800 val = strtoul(p, &e, 16);
811 val = strtoul(p, &e, 10);
817 if (dom > 0xffff || bus > 0xff || slot > 0x1f || func > 7) {
828 addr->function = func;
834 error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
838 PropertyInfo qdev_prop_pci_host_devaddr = {
840 .description = "Address (bus/device/function) of "
841 "the host device, example: 04:10.0",
842 .get = get_pci_host_devaddr,
843 .set = set_pci_host_devaddr,
846 /* --- support for array properties --- */
848 /* Used as an opaque for the object properties we add for each
849 * array element. Note that the struct Property must be first
850 * in the struct so that a pointer to this works as the opaque
851 * for the underlying element's property hooks as well as for
852 * our own release callback.
855 struct Property prop;
857 ObjectPropertyRelease *release;
858 } ArrayElementProperty;
860 /* object property release callback for array element properties:
861 * we call the underlying element's property release hook, and
862 * then free the memory we allocated when we added the property.
864 static void array_element_release(Object *obj, const char *name, void *opaque)
866 ArrayElementProperty *p = opaque;
868 p->release(obj, name, opaque);
874 static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,
875 void *opaque, Error **errp)
877 /* Setter for the property which defines the length of a
878 * variable-sized property array. As well as actually setting the
879 * array-length field in the device struct, we have to create the
880 * array itself and dynamically add the corresponding properties.
882 DeviceState *dev = DEVICE(obj);
883 Property *prop = opaque;
884 uint32_t *alenptr = qdev_get_prop_ptr(dev, prop);
885 void **arrayptr = (void *)dev + prop->arrayoffset;
886 Error *local_err = NULL;
888 const char *arrayname;
892 qdev_prop_set_after_realize(dev, name, errp);
896 error_setg(errp, "array size property %s may not be set more than once",
900 visit_type_uint32(v, name, alenptr, &local_err);
902 error_propagate(errp, local_err);
909 /* DEFINE_PROP_ARRAY guarantees that name should start with this prefix;
910 * strip it off so we can get the name of the array itself.
912 assert(strncmp(name, PROP_ARRAY_LEN_PREFIX,
913 strlen(PROP_ARRAY_LEN_PREFIX)) == 0);
914 arrayname = name + strlen(PROP_ARRAY_LEN_PREFIX);
916 /* Note that it is the responsibility of the individual device's deinit
917 * to free the array proper.
919 *arrayptr = eltptr = g_malloc0(*alenptr * prop->arrayfieldsize);
920 for (i = 0; i < *alenptr; i++, eltptr += prop->arrayfieldsize) {
921 char *propname = g_strdup_printf("%s[%d]", arrayname, i);
922 ArrayElementProperty *arrayprop = g_new0(ArrayElementProperty, 1);
923 arrayprop->release = prop->arrayinfo->release;
924 arrayprop->propname = propname;
925 arrayprop->prop.info = prop->arrayinfo;
926 arrayprop->prop.name = propname;
927 /* This ugly piece of pointer arithmetic sets up the offset so
928 * that when the underlying get/set hooks call qdev_get_prop_ptr
929 * they get the right answer despite the array element not actually
930 * being inside the device struct.
932 arrayprop->prop.offset = eltptr - (void *)dev;
933 assert(qdev_get_prop_ptr(dev, &arrayprop->prop) == eltptr);
934 object_property_add(obj, propname,
935 arrayprop->prop.info->name,
936 arrayprop->prop.info->get,
937 arrayprop->prop.info->set,
938 array_element_release,
939 arrayprop, &local_err);
941 error_propagate(errp, local_err);
947 PropertyInfo qdev_prop_arraylen = {
950 .set = set_prop_arraylen,
951 .set_default_value = set_default_value_int,
954 /* --- public helpers --- */
956 static Property *qdev_prop_walk(Property *props, const char *name)
961 while (props->name) {
962 if (strcmp(props->name, name) == 0) {
970 static Property *qdev_prop_find(DeviceState *dev, const char *name)
975 /* device properties */
976 class = object_get_class(OBJECT(dev));
978 prop = qdev_prop_walk(DEVICE_CLASS(class)->props, name);
982 class = object_class_get_parent(class);
983 } while (class != object_class_by_name(TYPE_DEVICE));
988 void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
989 Property *prop, const char *value)
993 error_setg(errp, "Property '%s.%s' can't take value '%s', it's in use",
994 object_get_typename(OBJECT(dev)), prop->name, value);
998 error_setg(errp, QERR_PROPERTY_VALUE_BAD,
999 object_get_typename(OBJECT(dev)), prop->name, value);
1002 error_setg(errp, "Property '%s.%s' can't find value '%s'",
1003 object_get_typename(OBJECT(dev)), prop->name, value);
1010 void qdev_prop_set_bit(DeviceState *dev, const char *name, bool value)
1012 object_property_set_bool(OBJECT(dev), value, name, &error_abort);
1015 void qdev_prop_set_uint8(DeviceState *dev, const char *name, uint8_t value)
1017 object_property_set_int(OBJECT(dev), value, name, &error_abort);
1020 void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value)
1022 object_property_set_int(OBJECT(dev), value, name, &error_abort);
1025 void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value)
1027 object_property_set_int(OBJECT(dev), value, name, &error_abort);
1030 void qdev_prop_set_int32(DeviceState *dev, const char *name, int32_t value)
1032 object_property_set_int(OBJECT(dev), value, name, &error_abort);
1035 void qdev_prop_set_uint64(DeviceState *dev, const char *name, uint64_t value)
1037 object_property_set_int(OBJECT(dev), value, name, &error_abort);
1040 void qdev_prop_set_string(DeviceState *dev, const char *name, const char *value)
1042 object_property_set_str(OBJECT(dev), value, name, &error_abort);
1045 void qdev_prop_set_macaddr(DeviceState *dev, const char *name,
1046 const uint8_t *value)
1048 char str[2 * 6 + 5 + 1];
1049 snprintf(str, sizeof(str), "%02x:%02x:%02x:%02x:%02x:%02x",
1050 value[0], value[1], value[2], value[3], value[4], value[5]);
1052 object_property_set_str(OBJECT(dev), str, name, &error_abort);
1055 void qdev_prop_set_enum(DeviceState *dev, const char *name, int value)
1059 prop = qdev_prop_find(dev, name);
1060 object_property_set_str(OBJECT(dev), prop->info->enum_table[value],
1061 name, &error_abort);
1064 void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value)
1069 prop = qdev_prop_find(dev, name);
1070 assert(prop && prop->info == &qdev_prop_ptr);
1071 ptr = qdev_get_prop_ptr(dev, prop);
1075 static GList *global_props;
1077 void qdev_prop_register_global(GlobalProperty *prop)
1079 global_props = g_list_append(global_props, prop);
1082 void qdev_prop_register_global_list(GlobalProperty *props)
1086 for (i = 0; props[i].driver != NULL; i++) {
1087 qdev_prop_register_global(props+i);
1091 int qdev_prop_check_globals(void)
1096 for (l = global_props; l; l = l->next) {
1097 GlobalProperty *prop = l->data;
1103 if (!prop->user_provided) {
1106 oc = object_class_by_name(prop->driver);
1107 oc = object_class_dynamic_cast(oc, TYPE_DEVICE);
1109 error_report("Warning: global %s.%s has invalid class name",
1110 prop->driver, prop->property);
1114 dc = DEVICE_CLASS(oc);
1115 if (!dc->hotpluggable && !prop->used) {
1116 error_report("Warning: global %s.%s=%s not used",
1117 prop->driver, prop->property, prop->value);
1125 static void qdev_prop_set_globals_for_type(DeviceState *dev,
1126 const char *typename)
1130 for (l = global_props; l; l = l->next) {
1131 GlobalProperty *prop = l->data;
1134 if (strcmp(typename, prop->driver) != 0) {
1138 object_property_parse(OBJECT(dev), prop->value, prop->property, &err);
1140 error_prepend(&err, "can't apply global %s.%s=%s: ",
1141 prop->driver, prop->property, prop->value);
1142 if (!dev->hotplugged && prop->errp) {
1143 error_propagate(prop->errp, err);
1145 assert(prop->user_provided);
1146 error_reportf_err(err, "Warning: ");
1152 void qdev_prop_set_globals(DeviceState *dev)
1154 ObjectClass *class = object_get_class(OBJECT(dev));
1157 qdev_prop_set_globals_for_type(dev, object_class_get_name(class));
1158 class = object_class_get_parent(class);
1162 /* --- 64bit unsigned int 'size' type --- */
1164 static void get_size(Object *obj, Visitor *v, const char *name, void *opaque,
1167 DeviceState *dev = DEVICE(obj);
1168 Property *prop = opaque;
1169 uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
1171 visit_type_size(v, name, ptr, errp);
1174 static void set_size(Object *obj, Visitor *v, const char *name, void *opaque,
1177 DeviceState *dev = DEVICE(obj);
1178 Property *prop = opaque;
1179 uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
1181 visit_type_size(v, name, ptr, errp);
1184 PropertyInfo qdev_prop_size = {
1188 .set_default_value = set_default_value_int,