1 #include "qemu/osdep.h"
3 #include "hw/qdev-properties.h"
4 #include "qapi/error.h"
5 #include "hw/pci/pci.h"
6 #include "qapi/qapi-types-block.h"
7 #include "qapi/qapi-types-misc.h"
8 #include "qapi/qmp/qerror.h"
9 #include "qemu/ctype.h"
10 #include "qemu/error-report.h"
11 #include "hw/block/block.h"
13 #include "qapi/visitor.h"
14 #include "chardev/char.h"
15 #include "qemu/uuid.h"
17 void qdev_prop_set_after_realize(DeviceState
*dev
, const char *name
,
21 error_setg(errp
, "Attempt to set property '%s' on device '%s' "
22 "(type '%s') after it was realized", name
, dev
->id
,
23 object_get_typename(OBJECT(dev
)));
25 error_setg(errp
, "Attempt to set property '%s' on anonymous device "
26 "(type '%s') after it was realized", name
,
27 object_get_typename(OBJECT(dev
)));
31 void qdev_prop_allow_set_link_before_realize(const Object
*obj
,
33 Object
*val
, Error
**errp
)
35 DeviceState
*dev
= DEVICE(obj
);
38 error_setg(errp
, "Attempt to set link property '%s' on device '%s' "
39 "(type '%s') after it was realized",
40 name
, dev
->id
, object_get_typename(obj
));
44 void *qdev_get_prop_ptr(DeviceState
*dev
, Property
*prop
)
51 static void get_enum(Object
*obj
, Visitor
*v
, const char *name
, void *opaque
,
54 DeviceState
*dev
= DEVICE(obj
);
55 Property
*prop
= opaque
;
56 int *ptr
= qdev_get_prop_ptr(dev
, prop
);
58 visit_type_enum(v
, prop
->name
, ptr
, prop
->info
->enum_table
, errp
);
61 static void set_enum(Object
*obj
, Visitor
*v
, const char *name
, void *opaque
,
64 DeviceState
*dev
= DEVICE(obj
);
65 Property
*prop
= opaque
;
66 int *ptr
= qdev_get_prop_ptr(dev
, prop
);
69 qdev_prop_set_after_realize(dev
, name
, errp
);
73 visit_type_enum(v
, prop
->name
, ptr
, prop
->info
->enum_table
, errp
);
76 static void set_default_value_enum(ObjectProperty
*op
, const Property
*prop
)
78 object_property_set_default_str(op
,
79 qapi_enum_lookup(prop
->info
->enum_table
, prop
->defval
.i
));
84 static uint32_t qdev_get_prop_mask(Property
*prop
)
86 assert(prop
->info
== &qdev_prop_bit
);
87 return 0x1 << prop
->bitnr
;
90 static void bit_prop_set(DeviceState
*dev
, Property
*props
, bool val
)
92 uint32_t *p
= qdev_get_prop_ptr(dev
, props
);
93 uint32_t mask
= qdev_get_prop_mask(props
);
101 static void prop_get_bit(Object
*obj
, Visitor
*v
, const char *name
,
102 void *opaque
, Error
**errp
)
104 DeviceState
*dev
= DEVICE(obj
);
105 Property
*prop
= opaque
;
106 uint32_t *p
= qdev_get_prop_ptr(dev
, prop
);
107 bool value
= (*p
& qdev_get_prop_mask(prop
)) != 0;
109 visit_type_bool(v
, name
, &value
, errp
);
112 static void prop_set_bit(Object
*obj
, Visitor
*v
, const char *name
,
113 void *opaque
, Error
**errp
)
115 DeviceState
*dev
= DEVICE(obj
);
116 Property
*prop
= opaque
;
117 Error
*local_err
= NULL
;
121 qdev_prop_set_after_realize(dev
, name
, errp
);
125 visit_type_bool(v
, name
, &value
, &local_err
);
127 error_propagate(errp
, local_err
);
130 bit_prop_set(dev
, 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(DeviceState
*dev
, Property
*props
, bool val
)
156 uint64_t *p
= qdev_get_prop_ptr(dev
, 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 DeviceState
*dev
= DEVICE(obj
);
169 Property
*prop
= opaque
;
170 uint64_t *p
= qdev_get_prop_ptr(dev
, prop
);
171 bool value
= (*p
& qdev_get_prop_mask64(prop
)) != 0;
173 visit_type_bool(v
, name
, &value
, errp
);
176 static void prop_set_bit64(Object
*obj
, Visitor
*v
, const char *name
,
177 void *opaque
, Error
**errp
)
179 DeviceState
*dev
= DEVICE(obj
);
180 Property
*prop
= opaque
;
181 Error
*local_err
= NULL
;
185 qdev_prop_set_after_realize(dev
, name
, errp
);
189 visit_type_bool(v
, name
, &value
, &local_err
);
191 error_propagate(errp
, local_err
);
194 bit64_prop_set(dev
, prop
, value
);
197 const PropertyInfo qdev_prop_bit64
= {
199 .description
= "on/off",
200 .get
= prop_get_bit64
,
201 .set
= prop_set_bit64
,
202 .set_default_value
= set_default_value_bool
,
207 static void get_bool(Object
*obj
, Visitor
*v
, const char *name
, void *opaque
,
210 DeviceState
*dev
= DEVICE(obj
);
211 Property
*prop
= opaque
;
212 bool *ptr
= qdev_get_prop_ptr(dev
, prop
);
214 visit_type_bool(v
, name
, ptr
, errp
);
217 static void set_bool(Object
*obj
, Visitor
*v
, const char *name
, void *opaque
,
220 DeviceState
*dev
= DEVICE(obj
);
221 Property
*prop
= opaque
;
222 bool *ptr
= qdev_get_prop_ptr(dev
, prop
);
225 qdev_prop_set_after_realize(dev
, name
, errp
);
229 visit_type_bool(v
, name
, ptr
, errp
);
232 const PropertyInfo qdev_prop_bool
= {
236 .set_default_value
= set_default_value_bool
,
239 /* --- 8bit integer --- */
241 static void get_uint8(Object
*obj
, Visitor
*v
, const char *name
, void *opaque
,
244 DeviceState
*dev
= DEVICE(obj
);
245 Property
*prop
= opaque
;
246 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
248 visit_type_uint8(v
, name
, ptr
, errp
);
251 static void set_uint8(Object
*obj
, Visitor
*v
, const char *name
, void *opaque
,
254 DeviceState
*dev
= DEVICE(obj
);
255 Property
*prop
= opaque
;
256 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
259 qdev_prop_set_after_realize(dev
, name
, errp
);
263 visit_type_uint8(v
, name
, ptr
, errp
);
266 static void set_default_value_int(ObjectProperty
*op
, const Property
*prop
)
268 object_property_set_default_int(op
, prop
->defval
.i
);
271 static void set_default_value_uint(ObjectProperty
*op
, const Property
*prop
)
273 object_property_set_default_uint(op
, prop
->defval
.u
);
276 const PropertyInfo qdev_prop_uint8
= {
280 .set_default_value
= set_default_value_uint
,
283 /* --- 16bit integer --- */
285 static void get_uint16(Object
*obj
, Visitor
*v
, const char *name
,
286 void *opaque
, Error
**errp
)
288 DeviceState
*dev
= DEVICE(obj
);
289 Property
*prop
= opaque
;
290 uint16_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
292 visit_type_uint16(v
, name
, ptr
, errp
);
295 static void set_uint16(Object
*obj
, Visitor
*v
, const char *name
,
296 void *opaque
, Error
**errp
)
298 DeviceState
*dev
= DEVICE(obj
);
299 Property
*prop
= opaque
;
300 uint16_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
303 qdev_prop_set_after_realize(dev
, name
, errp
);
307 visit_type_uint16(v
, name
, ptr
, errp
);
310 const PropertyInfo qdev_prop_uint16
= {
314 .set_default_value
= set_default_value_uint
,
317 /* --- 32bit integer --- */
319 static void get_uint32(Object
*obj
, Visitor
*v
, const char *name
,
320 void *opaque
, Error
**errp
)
322 DeviceState
*dev
= DEVICE(obj
);
323 Property
*prop
= opaque
;
324 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
326 visit_type_uint32(v
, name
, ptr
, errp
);
329 static void set_uint32(Object
*obj
, Visitor
*v
, const char *name
,
330 void *opaque
, Error
**errp
)
332 DeviceState
*dev
= DEVICE(obj
);
333 Property
*prop
= opaque
;
334 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
337 qdev_prop_set_after_realize(dev
, name
, errp
);
341 visit_type_uint32(v
, name
, ptr
, errp
);
344 static void get_int32(Object
*obj
, Visitor
*v
, const char *name
, void *opaque
,
347 DeviceState
*dev
= DEVICE(obj
);
348 Property
*prop
= opaque
;
349 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
351 visit_type_int32(v
, name
, ptr
, errp
);
354 static void set_int32(Object
*obj
, Visitor
*v
, const char *name
, void *opaque
,
357 DeviceState
*dev
= DEVICE(obj
);
358 Property
*prop
= opaque
;
359 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
362 qdev_prop_set_after_realize(dev
, name
, errp
);
366 visit_type_int32(v
, name
, ptr
, errp
);
369 const PropertyInfo qdev_prop_uint32
= {
373 .set_default_value
= set_default_value_uint
,
376 const PropertyInfo qdev_prop_int32
= {
380 .set_default_value
= set_default_value_int
,
383 /* --- 64bit integer --- */
385 static void get_uint64(Object
*obj
, Visitor
*v
, const char *name
,
386 void *opaque
, Error
**errp
)
388 DeviceState
*dev
= DEVICE(obj
);
389 Property
*prop
= opaque
;
390 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
392 visit_type_uint64(v
, name
, ptr
, errp
);
395 static void set_uint64(Object
*obj
, Visitor
*v
, const char *name
,
396 void *opaque
, Error
**errp
)
398 DeviceState
*dev
= DEVICE(obj
);
399 Property
*prop
= opaque
;
400 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
403 qdev_prop_set_after_realize(dev
, name
, errp
);
407 visit_type_uint64(v
, name
, ptr
, errp
);
410 static void get_int64(Object
*obj
, Visitor
*v
, const char *name
,
411 void *opaque
, Error
**errp
)
413 DeviceState
*dev
= DEVICE(obj
);
414 Property
*prop
= opaque
;
415 int64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
417 visit_type_int64(v
, name
, ptr
, errp
);
420 static void set_int64(Object
*obj
, Visitor
*v
, const char *name
,
421 void *opaque
, Error
**errp
)
423 DeviceState
*dev
= DEVICE(obj
);
424 Property
*prop
= opaque
;
425 int64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
428 qdev_prop_set_after_realize(dev
, name
, errp
);
432 visit_type_int64(v
, name
, ptr
, errp
);
435 const PropertyInfo qdev_prop_uint64
= {
439 .set_default_value
= set_default_value_uint
,
442 const PropertyInfo qdev_prop_int64
= {
446 .set_default_value
= set_default_value_int
,
451 static void release_string(Object
*obj
, const char *name
, void *opaque
)
453 Property
*prop
= opaque
;
454 g_free(*(char **)qdev_get_prop_ptr(DEVICE(obj
), prop
));
457 static void get_string(Object
*obj
, Visitor
*v
, const char *name
,
458 void *opaque
, Error
**errp
)
460 DeviceState
*dev
= DEVICE(obj
);
461 Property
*prop
= opaque
;
462 char **ptr
= qdev_get_prop_ptr(dev
, prop
);
465 char *str
= (char *)"";
466 visit_type_str(v
, name
, &str
, errp
);
468 visit_type_str(v
, name
, ptr
, errp
);
472 static void set_string(Object
*obj
, Visitor
*v
, const char *name
,
473 void *opaque
, Error
**errp
)
475 DeviceState
*dev
= DEVICE(obj
);
476 Property
*prop
= opaque
;
477 char **ptr
= qdev_get_prop_ptr(dev
, prop
);
478 Error
*local_err
= NULL
;
482 qdev_prop_set_after_realize(dev
, name
, errp
);
486 visit_type_str(v
, name
, &str
, &local_err
);
488 error_propagate(errp
, local_err
);
495 const PropertyInfo qdev_prop_string
= {
497 .release
= release_string
,
502 /* --- mac address --- */
505 * accepted syntax versions:
509 static void get_mac(Object
*obj
, Visitor
*v
, const char *name
, void *opaque
,
512 DeviceState
*dev
= DEVICE(obj
);
513 Property
*prop
= opaque
;
514 MACAddr
*mac
= qdev_get_prop_ptr(dev
, prop
);
515 char buffer
[2 * 6 + 5 + 1];
518 snprintf(buffer
, sizeof(buffer
), "%02x:%02x:%02x:%02x:%02x:%02x",
519 mac
->a
[0], mac
->a
[1], mac
->a
[2],
520 mac
->a
[3], mac
->a
[4], mac
->a
[5]);
522 visit_type_str(v
, name
, &p
, errp
);
525 static void set_mac(Object
*obj
, Visitor
*v
, const char *name
, void *opaque
,
528 DeviceState
*dev
= DEVICE(obj
);
529 Property
*prop
= opaque
;
530 MACAddr
*mac
= qdev_get_prop_ptr(dev
, prop
);
531 Error
*local_err
= NULL
;
536 qdev_prop_set_after_realize(dev
, name
, errp
);
540 visit_type_str(v
, name
, &str
, &local_err
);
542 error_propagate(errp
, local_err
);
546 for (i
= 0, pos
= 0; i
< 6; i
++, pos
+= 3) {
547 if (!qemu_isxdigit(str
[pos
])) {
550 if (!qemu_isxdigit(str
[pos
+1])) {
554 if (str
[pos
+2] != '\0') {
558 if (str
[pos
+2] != ':' && str
[pos
+2] != '-') {
562 mac
->a
[i
] = strtol(str
+pos
, &p
, 16);
568 error_set_from_qdev_prop_error(errp
, EINVAL
, dev
, prop
, str
);
572 const PropertyInfo qdev_prop_macaddr
= {
574 .description
= "Ethernet 6-byte MAC Address, example: 52:54:00:12:34:56",
579 /* --- on/off/auto --- */
581 const PropertyInfo qdev_prop_on_off_auto
= {
583 .description
= "on/off/auto",
584 .enum_table
= &OnOffAuto_lookup
,
587 .set_default_value
= set_default_value_enum
,
590 /* --- lost tick policy --- */
592 QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy
) != sizeof(int));
594 const PropertyInfo qdev_prop_losttickpolicy
= {
595 .name
= "LostTickPolicy",
596 .enum_table
= &LostTickPolicy_lookup
,
599 .set_default_value
= set_default_value_enum
,
602 /* --- Block device error handling policy --- */
604 QEMU_BUILD_BUG_ON(sizeof(BlockdevOnError
) != sizeof(int));
606 const PropertyInfo qdev_prop_blockdev_on_error
= {
607 .name
= "BlockdevOnError",
608 .description
= "Error handling policy, "
609 "report/ignore/enospc/stop/auto",
610 .enum_table
= &BlockdevOnError_lookup
,
613 .set_default_value
= set_default_value_enum
,
616 /* --- BIOS CHS translation */
618 QEMU_BUILD_BUG_ON(sizeof(BiosAtaTranslation
) != sizeof(int));
620 const PropertyInfo qdev_prop_bios_chs_trans
= {
621 .name
= "BiosAtaTranslation",
622 .description
= "Logical CHS translation algorithm, "
623 "auto/none/lba/large/rechs",
624 .enum_table
= &BiosAtaTranslation_lookup
,
627 .set_default_value
= set_default_value_enum
,
630 /* --- FDC default drive types */
632 const PropertyInfo qdev_prop_fdc_drive_type
= {
633 .name
= "FdcDriveType",
634 .description
= "FDC drive type, "
635 "144/288/120/none/auto",
636 .enum_table
= &FloppyDriveType_lookup
,
639 .set_default_value
= set_default_value_enum
,
642 /* --- pci address --- */
645 * bus-local address, i.e. "$slot" or "$slot.$fn"
647 static void set_pci_devfn(Object
*obj
, Visitor
*v
, const char *name
,
648 void *opaque
, Error
**errp
)
650 DeviceState
*dev
= DEVICE(obj
);
651 Property
*prop
= opaque
;
652 int32_t value
, *ptr
= qdev_get_prop_ptr(dev
, prop
);
653 unsigned int slot
, fn
, n
;
654 Error
*local_err
= NULL
;
658 qdev_prop_set_after_realize(dev
, name
, errp
);
662 visit_type_str(v
, name
, &str
, &local_err
);
664 error_free(local_err
);
666 visit_type_int32(v
, name
, &value
, &local_err
);
668 error_propagate(errp
, local_err
);
669 } else if (value
< -1 || value
> 255) {
670 error_setg(errp
, QERR_INVALID_PARAMETER_VALUE
,
671 name
? name
: "null", "pci_devfn");
678 if (sscanf(str
, "%x.%x%n", &slot
, &fn
, &n
) != 2) {
680 if (sscanf(str
, "%x%n", &slot
, &n
) != 1) {
684 if (str
[n
] != '\0' || fn
> 7 || slot
> 31) {
687 *ptr
= slot
<< 3 | fn
;
692 error_set_from_qdev_prop_error(errp
, EINVAL
, dev
, prop
, str
);
696 static int print_pci_devfn(DeviceState
*dev
, Property
*prop
, char *dest
,
699 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
702 return snprintf(dest
, len
, "<unset>");
704 return snprintf(dest
, len
, "%02x.%x", *ptr
>> 3, *ptr
& 7);
708 const PropertyInfo qdev_prop_pci_devfn
= {
710 .description
= "Slot and optional function number, example: 06.0 or 06",
711 .print
= print_pci_devfn
,
713 .set
= set_pci_devfn
,
714 .set_default_value
= set_default_value_int
,
717 /* --- blocksize --- */
719 static void set_blocksize(Object
*obj
, Visitor
*v
, const char *name
,
720 void *opaque
, Error
**errp
)
722 DeviceState
*dev
= DEVICE(obj
);
723 Property
*prop
= opaque
;
724 uint16_t value
, *ptr
= qdev_get_prop_ptr(dev
, prop
);
725 Error
*local_err
= NULL
;
726 const int64_t min
= 512;
727 const int64_t max
= 32768;
730 qdev_prop_set_after_realize(dev
, name
, errp
);
734 visit_type_uint16(v
, name
, &value
, &local_err
);
736 error_propagate(errp
, local_err
);
739 /* value of 0 means "unset" */
740 if (value
&& (value
< min
|| value
> max
)) {
741 error_setg(errp
, QERR_PROPERTY_VALUE_OUT_OF_RANGE
,
742 dev
->id
? : "", name
, (int64_t)value
, min
, max
);
746 /* We rely on power-of-2 blocksizes for bitmasks */
747 if ((value
& (value
- 1)) != 0) {
749 "Property %s.%s doesn't take value '%" PRId64
"', it's not a power of 2",
750 dev
->id
?: "", name
, (int64_t)value
);
757 const PropertyInfo qdev_prop_blocksize
= {
759 .description
= "A power of two between 512 and 32768",
761 .set
= set_blocksize
,
762 .set_default_value
= set_default_value_uint
,
765 /* --- pci host address --- */
767 static void get_pci_host_devaddr(Object
*obj
, Visitor
*v
, const char *name
,
768 void *opaque
, Error
**errp
)
770 DeviceState
*dev
= DEVICE(obj
);
771 Property
*prop
= opaque
;
772 PCIHostDeviceAddress
*addr
= qdev_get_prop_ptr(dev
, prop
);
773 char buffer
[] = "ffff:ff:ff.f";
778 * Catch "invalid" device reference from vfio-pci and allow the
779 * default buffer representing the non-existent device to be used.
781 if (~addr
->domain
|| ~addr
->bus
|| ~addr
->slot
|| ~addr
->function
) {
782 rc
= snprintf(buffer
, sizeof(buffer
), "%04x:%02x:%02x.%0d",
783 addr
->domain
, addr
->bus
, addr
->slot
, addr
->function
);
784 assert(rc
== sizeof(buffer
) - 1);
787 visit_type_str(v
, name
, &p
, errp
);
791 * Parse [<domain>:]<bus>:<slot>.<func>
792 * if <domain> is not supplied, it's assumed to be 0.
794 static void set_pci_host_devaddr(Object
*obj
, Visitor
*v
, const char *name
,
795 void *opaque
, Error
**errp
)
797 DeviceState
*dev
= DEVICE(obj
);
798 Property
*prop
= opaque
;
799 PCIHostDeviceAddress
*addr
= qdev_get_prop_ptr(dev
, prop
);
800 Error
*local_err
= NULL
;
804 unsigned long dom
= 0, bus
= 0;
805 unsigned int slot
= 0, func
= 0;
808 qdev_prop_set_after_realize(dev
, name
, errp
);
812 visit_type_str(v
, name
, &str
, &local_err
);
814 error_propagate(errp
, local_err
);
819 val
= strtoul(p
, &e
, 16);
820 if (e
== p
|| *e
!= ':') {
826 val
= strtoul(p
, &e
, 16);
834 val
= strtoul(p
, &e
, 16);
845 val
= strtoul(p
, &e
, 10);
851 if (dom
> 0xffff || bus
> 0xff || slot
> 0x1f || func
> 7) {
862 addr
->function
= func
;
868 error_set_from_qdev_prop_error(errp
, EINVAL
, dev
, prop
, str
);
872 const PropertyInfo qdev_prop_pci_host_devaddr
= {
874 .description
= "Address (bus/device/function) of "
875 "the host device, example: 04:10.0",
876 .get
= get_pci_host_devaddr
,
877 .set
= set_pci_host_devaddr
,
882 static void get_uuid(Object
*obj
, Visitor
*v
, const char *name
, void *opaque
,
885 DeviceState
*dev
= DEVICE(obj
);
886 Property
*prop
= opaque
;
887 QemuUUID
*uuid
= qdev_get_prop_ptr(dev
, prop
);
888 char buffer
[UUID_FMT_LEN
+ 1];
891 qemu_uuid_unparse(uuid
, buffer
);
893 visit_type_str(v
, name
, &p
, errp
);
896 #define UUID_VALUE_AUTO "auto"
898 static void set_uuid(Object
*obj
, Visitor
*v
, const char *name
, void *opaque
,
901 DeviceState
*dev
= DEVICE(obj
);
902 Property
*prop
= opaque
;
903 QemuUUID
*uuid
= qdev_get_prop_ptr(dev
, prop
);
904 Error
*local_err
= NULL
;
908 qdev_prop_set_after_realize(dev
, name
, errp
);
912 visit_type_str(v
, name
, &str
, &local_err
);
914 error_propagate(errp
, local_err
);
918 if (!strcmp(str
, UUID_VALUE_AUTO
)) {
919 qemu_uuid_generate(uuid
);
920 } else if (qemu_uuid_parse(str
, uuid
) < 0) {
921 error_set_from_qdev_prop_error(errp
, EINVAL
, dev
, prop
, str
);
926 static void set_default_uuid_auto(ObjectProperty
*op
, const Property
*prop
)
928 object_property_set_default_str(op
, UUID_VALUE_AUTO
);
931 const PropertyInfo qdev_prop_uuid
= {
933 .description
= "UUID (aka GUID) or \"" UUID_VALUE_AUTO
934 "\" for random value (default)",
937 .set_default_value
= set_default_uuid_auto
,
940 /* --- support for array properties --- */
942 /* Used as an opaque for the object properties we add for each
943 * array element. Note that the struct Property must be first
944 * in the struct so that a pointer to this works as the opaque
945 * for the underlying element's property hooks as well as for
946 * our own release callback.
949 struct Property prop
;
951 ObjectPropertyRelease
*release
;
952 } ArrayElementProperty
;
954 /* object property release callback for array element properties:
955 * we call the underlying element's property release hook, and
956 * then free the memory we allocated when we added the property.
958 static void array_element_release(Object
*obj
, const char *name
, void *opaque
)
960 ArrayElementProperty
*p
= opaque
;
962 p
->release(obj
, name
, opaque
);
968 static void set_prop_arraylen(Object
*obj
, Visitor
*v
, const char *name
,
969 void *opaque
, Error
**errp
)
971 /* Setter for the property which defines the length of a
972 * variable-sized property array. As well as actually setting the
973 * array-length field in the device struct, we have to create the
974 * array itself and dynamically add the corresponding properties.
976 DeviceState
*dev
= DEVICE(obj
);
977 Property
*prop
= opaque
;
978 uint32_t *alenptr
= qdev_get_prop_ptr(dev
, prop
);
979 void **arrayptr
= (void *)dev
+ prop
->arrayoffset
;
980 Error
*local_err
= NULL
;
982 const char *arrayname
;
986 qdev_prop_set_after_realize(dev
, name
, errp
);
990 error_setg(errp
, "array size property %s may not be set more than once",
994 visit_type_uint32(v
, name
, alenptr
, &local_err
);
996 error_propagate(errp
, local_err
);
1003 /* DEFINE_PROP_ARRAY guarantees that name should start with this prefix;
1004 * strip it off so we can get the name of the array itself.
1006 assert(strncmp(name
, PROP_ARRAY_LEN_PREFIX
,
1007 strlen(PROP_ARRAY_LEN_PREFIX
)) == 0);
1008 arrayname
= name
+ strlen(PROP_ARRAY_LEN_PREFIX
);
1010 /* Note that it is the responsibility of the individual device's deinit
1011 * to free the array proper.
1013 *arrayptr
= eltptr
= g_malloc0(*alenptr
* prop
->arrayfieldsize
);
1014 for (i
= 0; i
< *alenptr
; i
++, eltptr
+= prop
->arrayfieldsize
) {
1015 char *propname
= g_strdup_printf("%s[%d]", arrayname
, i
);
1016 ArrayElementProperty
*arrayprop
= g_new0(ArrayElementProperty
, 1);
1017 arrayprop
->release
= prop
->arrayinfo
->release
;
1018 arrayprop
->propname
= propname
;
1019 arrayprop
->prop
.info
= prop
->arrayinfo
;
1020 arrayprop
->prop
.name
= propname
;
1021 /* This ugly piece of pointer arithmetic sets up the offset so
1022 * that when the underlying get/set hooks call qdev_get_prop_ptr
1023 * they get the right answer despite the array element not actually
1024 * being inside the device struct.
1026 arrayprop
->prop
.offset
= eltptr
- (void *)dev
;
1027 assert(qdev_get_prop_ptr(dev
, &arrayprop
->prop
) == eltptr
);
1028 object_property_add(obj
, propname
,
1029 arrayprop
->prop
.info
->name
,
1030 arrayprop
->prop
.info
->get
,
1031 arrayprop
->prop
.info
->set
,
1032 array_element_release
,
1033 arrayprop
, &local_err
);
1035 error_propagate(errp
, local_err
);
1041 const PropertyInfo qdev_prop_arraylen
= {
1044 .set
= set_prop_arraylen
,
1045 .set_default_value
= set_default_value_uint
,
1048 /* --- public helpers --- */
1050 static Property
*qdev_prop_walk(Property
*props
, const char *name
)
1055 while (props
->name
) {
1056 if (strcmp(props
->name
, name
) == 0) {
1064 static Property
*qdev_prop_find(DeviceState
*dev
, const char *name
)
1069 /* device properties */
1070 class = object_get_class(OBJECT(dev
));
1072 prop
= qdev_prop_walk(DEVICE_CLASS(class)->props_
, name
);
1076 class = object_class_get_parent(class);
1077 } while (class != object_class_by_name(TYPE_DEVICE
));
1082 void error_set_from_qdev_prop_error(Error
**errp
, int ret
, DeviceState
*dev
,
1083 Property
*prop
, const char *value
)
1087 error_setg(errp
, "Property '%s.%s' can't take value '%s', it's in use",
1088 object_get_typename(OBJECT(dev
)), prop
->name
, value
);
1092 error_setg(errp
, QERR_PROPERTY_VALUE_BAD
,
1093 object_get_typename(OBJECT(dev
)), prop
->name
, value
);
1096 error_setg(errp
, "Property '%s.%s' can't find value '%s'",
1097 object_get_typename(OBJECT(dev
)), prop
->name
, value
);
1104 void qdev_prop_set_bit(DeviceState
*dev
, const char *name
, bool value
)
1106 object_property_set_bool(OBJECT(dev
), value
, name
, &error_abort
);
1109 void qdev_prop_set_uint8(DeviceState
*dev
, const char *name
, uint8_t value
)
1111 object_property_set_int(OBJECT(dev
), value
, name
, &error_abort
);
1114 void qdev_prop_set_uint16(DeviceState
*dev
, const char *name
, uint16_t value
)
1116 object_property_set_int(OBJECT(dev
), value
, name
, &error_abort
);
1119 void qdev_prop_set_uint32(DeviceState
*dev
, const char *name
, uint32_t value
)
1121 object_property_set_int(OBJECT(dev
), value
, name
, &error_abort
);
1124 void qdev_prop_set_int32(DeviceState
*dev
, const char *name
, int32_t value
)
1126 object_property_set_int(OBJECT(dev
), value
, name
, &error_abort
);
1129 void qdev_prop_set_uint64(DeviceState
*dev
, const char *name
, uint64_t value
)
1131 object_property_set_int(OBJECT(dev
), value
, name
, &error_abort
);
1134 void qdev_prop_set_string(DeviceState
*dev
, const char *name
, const char *value
)
1136 object_property_set_str(OBJECT(dev
), value
, name
, &error_abort
);
1139 void qdev_prop_set_macaddr(DeviceState
*dev
, const char *name
,
1140 const uint8_t *value
)
1142 char str
[2 * 6 + 5 + 1];
1143 snprintf(str
, sizeof(str
), "%02x:%02x:%02x:%02x:%02x:%02x",
1144 value
[0], value
[1], value
[2], value
[3], value
[4], value
[5]);
1146 object_property_set_str(OBJECT(dev
), str
, name
, &error_abort
);
1149 void qdev_prop_set_enum(DeviceState
*dev
, const char *name
, int value
)
1153 prop
= qdev_prop_find(dev
, name
);
1154 object_property_set_str(OBJECT(dev
),
1155 qapi_enum_lookup(prop
->info
->enum_table
, value
),
1156 name
, &error_abort
);
1159 static GPtrArray
*global_props(void)
1161 static GPtrArray
*gp
;
1164 gp
= g_ptr_array_new();
1170 void qdev_prop_register_global(GlobalProperty
*prop
)
1172 g_ptr_array_add(global_props(), prop
);
1175 int qdev_prop_check_globals(void)
1179 for (i
= 0; i
< global_props()->len
; i
++) {
1180 GlobalProperty
*prop
;
1184 prop
= g_ptr_array_index(global_props(), i
);
1188 oc
= object_class_by_name(prop
->driver
);
1189 oc
= object_class_dynamic_cast(oc
, TYPE_DEVICE
);
1191 warn_report("global %s.%s has invalid class name",
1192 prop
->driver
, prop
->property
);
1196 dc
= DEVICE_CLASS(oc
);
1197 if (!dc
->hotpluggable
&& !prop
->used
) {
1198 warn_report("global %s.%s=%s not used",
1199 prop
->driver
, prop
->property
, prop
->value
);
1207 void qdev_prop_set_globals(DeviceState
*dev
)
1209 object_apply_global_props(OBJECT(dev
), global_props(),
1210 dev
->hotplugged
? NULL
: &error_fatal
);
1213 /* --- 64bit unsigned int 'size' type --- */
1215 static void get_size(Object
*obj
, Visitor
*v
, const char *name
, void *opaque
,
1218 DeviceState
*dev
= DEVICE(obj
);
1219 Property
*prop
= opaque
;
1220 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
1222 visit_type_size(v
, name
, ptr
, errp
);
1225 static void set_size(Object
*obj
, Visitor
*v
, const char *name
, void *opaque
,
1228 DeviceState
*dev
= DEVICE(obj
);
1229 Property
*prop
= opaque
;
1230 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
1232 visit_type_size(v
, name
, ptr
, errp
);
1235 const PropertyInfo qdev_prop_size
= {
1239 .set_default_value
= set_default_value_uint
,
1242 /* --- object link property --- */
1244 static void create_link_property(ObjectClass
*oc
, Property
*prop
, Error
**errp
)
1246 object_class_property_add_link(oc
, prop
->name
, prop
->link_type
,
1248 qdev_prop_allow_set_link_before_realize
,
1249 OBJ_PROP_LINK_STRONG
,
1253 const PropertyInfo qdev_prop_link
= {
1255 .create
= create_link_property
,
1258 /* --- OffAutoPCIBAR off/auto/bar0/bar1/bar2/bar3/bar4/bar5 --- */
1260 const PropertyInfo qdev_prop_off_auto_pcibar
= {
1261 .name
= "OffAutoPCIBAR",
1262 .description
= "off/auto/bar0/bar1/bar2/bar3/bar4/bar5",
1263 .enum_table
= &OffAutoPCIBAR_lookup
,
1266 .set_default_value
= set_default_value_enum
,
1269 /* --- PCIELinkSpeed 2_5/5/8/16 -- */
1271 static void get_prop_pcielinkspeed(Object
*obj
, Visitor
*v
, const char *name
,
1272 void *opaque
, Error
**errp
)
1274 DeviceState
*dev
= DEVICE(obj
);
1275 Property
*prop
= opaque
;
1276 PCIExpLinkSpeed
*p
= qdev_get_prop_ptr(dev
, prop
);
1280 case QEMU_PCI_EXP_LNK_2_5GT
:
1281 speed
= PCIE_LINK_SPEED_2_5
;
1283 case QEMU_PCI_EXP_LNK_5GT
:
1284 speed
= PCIE_LINK_SPEED_5
;
1286 case QEMU_PCI_EXP_LNK_8GT
:
1287 speed
= PCIE_LINK_SPEED_8
;
1289 case QEMU_PCI_EXP_LNK_16GT
:
1290 speed
= PCIE_LINK_SPEED_16
;
1297 visit_type_enum(v
, prop
->name
, &speed
, prop
->info
->enum_table
, errp
);
1300 static void set_prop_pcielinkspeed(Object
*obj
, Visitor
*v
, const char *name
,
1301 void *opaque
, Error
**errp
)
1303 DeviceState
*dev
= DEVICE(obj
);
1304 Property
*prop
= opaque
;
1305 PCIExpLinkSpeed
*p
= qdev_get_prop_ptr(dev
, prop
);
1307 Error
*local_err
= NULL
;
1309 if (dev
->realized
) {
1310 qdev_prop_set_after_realize(dev
, name
, errp
);
1314 visit_type_enum(v
, prop
->name
, &speed
, prop
->info
->enum_table
, &local_err
);
1316 error_propagate(errp
, local_err
);
1321 case PCIE_LINK_SPEED_2_5
:
1322 *p
= QEMU_PCI_EXP_LNK_2_5GT
;
1324 case PCIE_LINK_SPEED_5
:
1325 *p
= QEMU_PCI_EXP_LNK_5GT
;
1327 case PCIE_LINK_SPEED_8
:
1328 *p
= QEMU_PCI_EXP_LNK_8GT
;
1330 case PCIE_LINK_SPEED_16
:
1331 *p
= QEMU_PCI_EXP_LNK_16GT
;
1339 const PropertyInfo qdev_prop_pcie_link_speed
= {
1340 .name
= "PCIELinkSpeed",
1341 .description
= "2_5/5/8/16",
1342 .enum_table
= &PCIELinkSpeed_lookup
,
1343 .get
= get_prop_pcielinkspeed
,
1344 .set
= set_prop_pcielinkspeed
,
1345 .set_default_value
= set_default_value_enum
,
1348 /* --- PCIELinkWidth 1/2/4/8/12/16/32 -- */
1350 static void get_prop_pcielinkwidth(Object
*obj
, Visitor
*v
, const char *name
,
1351 void *opaque
, Error
**errp
)
1353 DeviceState
*dev
= DEVICE(obj
);
1354 Property
*prop
= opaque
;
1355 PCIExpLinkWidth
*p
= qdev_get_prop_ptr(dev
, prop
);
1359 case QEMU_PCI_EXP_LNK_X1
:
1360 width
= PCIE_LINK_WIDTH_1
;
1362 case QEMU_PCI_EXP_LNK_X2
:
1363 width
= PCIE_LINK_WIDTH_2
;
1365 case QEMU_PCI_EXP_LNK_X4
:
1366 width
= PCIE_LINK_WIDTH_4
;
1368 case QEMU_PCI_EXP_LNK_X8
:
1369 width
= PCIE_LINK_WIDTH_8
;
1371 case QEMU_PCI_EXP_LNK_X12
:
1372 width
= PCIE_LINK_WIDTH_12
;
1374 case QEMU_PCI_EXP_LNK_X16
:
1375 width
= PCIE_LINK_WIDTH_16
;
1377 case QEMU_PCI_EXP_LNK_X32
:
1378 width
= PCIE_LINK_WIDTH_32
;
1385 visit_type_enum(v
, prop
->name
, &width
, prop
->info
->enum_table
, errp
);
1388 static void set_prop_pcielinkwidth(Object
*obj
, Visitor
*v
, const char *name
,
1389 void *opaque
, Error
**errp
)
1391 DeviceState
*dev
= DEVICE(obj
);
1392 Property
*prop
= opaque
;
1393 PCIExpLinkWidth
*p
= qdev_get_prop_ptr(dev
, prop
);
1395 Error
*local_err
= NULL
;
1397 if (dev
->realized
) {
1398 qdev_prop_set_after_realize(dev
, name
, errp
);
1402 visit_type_enum(v
, prop
->name
, &width
, prop
->info
->enum_table
, &local_err
);
1404 error_propagate(errp
, local_err
);
1409 case PCIE_LINK_WIDTH_1
:
1410 *p
= QEMU_PCI_EXP_LNK_X1
;
1412 case PCIE_LINK_WIDTH_2
:
1413 *p
= QEMU_PCI_EXP_LNK_X2
;
1415 case PCIE_LINK_WIDTH_4
:
1416 *p
= QEMU_PCI_EXP_LNK_X4
;
1418 case PCIE_LINK_WIDTH_8
:
1419 *p
= QEMU_PCI_EXP_LNK_X8
;
1421 case PCIE_LINK_WIDTH_12
:
1422 *p
= QEMU_PCI_EXP_LNK_X12
;
1424 case PCIE_LINK_WIDTH_16
:
1425 *p
= QEMU_PCI_EXP_LNK_X16
;
1427 case PCIE_LINK_WIDTH_32
:
1428 *p
= QEMU_PCI_EXP_LNK_X32
;
1436 const PropertyInfo qdev_prop_pcie_link_width
= {
1437 .name
= "PCIELinkWidth",
1438 .description
= "1/2/4/8/12/16/32",
1439 .enum_table
= &PCIELinkWidth_lookup
,
1440 .get
= get_prop_pcielinkwidth
,
1441 .set
= set_prop_pcielinkwidth
,
1442 .set_default_value
= set_default_value_enum
,