6 void *qdev_get_prop_ptr(DeviceState
*dev
, Property
*prop
)
13 static uint32_t qdev_get_prop_mask(Property
*prop
)
15 assert(prop
->info
->type
== PROP_TYPE_BIT
);
16 return 0x1 << prop
->bitnr
;
19 static void bit_prop_set(DeviceState
*dev
, Property
*props
, bool val
)
21 uint32_t *p
= qdev_get_prop_ptr(dev
, props
);
22 uint32_t mask
= qdev_get_prop_mask(props
);
30 static int parse_bit(DeviceState
*dev
, Property
*prop
, const char *str
)
32 if (!strcasecmp(str
, "on"))
33 bit_prop_set(dev
, prop
, true);
34 else if (!strcasecmp(str
, "off"))
35 bit_prop_set(dev
, prop
, false);
41 static int print_bit(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
43 uint32_t *p
= qdev_get_prop_ptr(dev
, prop
);
44 return snprintf(dest
, len
, (*p
& qdev_get_prop_mask(prop
)) ? "on" : "off");
47 static void get_bit(Object
*obj
, Visitor
*v
, void *opaque
,
48 const char *name
, Error
**errp
)
50 DeviceState
*dev
= DEVICE(obj
);
51 Property
*prop
= opaque
;
52 uint32_t *p
= qdev_get_prop_ptr(dev
, prop
);
53 bool value
= (*p
& qdev_get_prop_mask(prop
)) != 0;
55 visit_type_bool(v
, &value
, name
, errp
);
58 static void set_bit(Object
*obj
, Visitor
*v
, void *opaque
,
59 const char *name
, Error
**errp
)
61 DeviceState
*dev
= DEVICE(obj
);
62 Property
*prop
= opaque
;
63 Error
*local_err
= NULL
;
66 if (dev
->state
!= DEV_STATE_CREATED
) {
67 error_set(errp
, QERR_PERMISSION_DENIED
);
71 visit_type_bool(v
, &value
, name
, &local_err
);
73 error_propagate(errp
, local_err
);
76 bit_prop_set(dev
, prop
, value
);
79 PropertyInfo qdev_prop_bit
= {
81 .legacy_name
= "on/off",
82 .type
= PROP_TYPE_BIT
,
83 .size
= sizeof(uint32_t),
90 /* --- 8bit integer --- */
92 static int parse_uint8(DeviceState
*dev
, Property
*prop
, const char *str
)
94 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
97 /* accept both hex and decimal */
98 *ptr
= strtoul(str
, &end
, 0);
99 if ((*end
!= '\0') || (end
== str
)) {
106 static int print_uint8(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
108 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
109 return snprintf(dest
, len
, "%" PRIu8
, *ptr
);
112 static void get_int8(Object
*obj
, Visitor
*v
, void *opaque
,
113 const char *name
, Error
**errp
)
115 DeviceState
*dev
= DEVICE(obj
);
116 Property
*prop
= opaque
;
117 int8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
121 visit_type_int(v
, &value
, name
, errp
);
124 static void set_int8(Object
*obj
, Visitor
*v
, void *opaque
,
125 const char *name
, Error
**errp
)
127 DeviceState
*dev
= DEVICE(obj
);
128 Property
*prop
= opaque
;
129 int8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
130 Error
*local_err
= NULL
;
133 if (dev
->state
!= DEV_STATE_CREATED
) {
134 error_set(errp
, QERR_PERMISSION_DENIED
);
138 visit_type_int(v
, &value
, name
, &local_err
);
140 error_propagate(errp
, local_err
);
143 if (value
>= prop
->info
->min
&& value
<= prop
->info
->max
) {
146 error_set(errp
, QERR_PROPERTY_VALUE_OUT_OF_RANGE
,
147 dev
->id
?:"", name
, value
, prop
->info
->min
,
152 PropertyInfo qdev_prop_uint8
= {
154 .type
= PROP_TYPE_UINT8
,
155 .size
= sizeof(uint8_t),
156 .parse
= parse_uint8
,
157 .print
= print_uint8
,
164 /* --- 8bit hex value --- */
166 static int parse_hex8(DeviceState
*dev
, Property
*prop
, const char *str
)
168 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
171 *ptr
= strtoul(str
, &end
, 16);
172 if ((*end
!= '\0') || (end
== str
)) {
179 static int print_hex8(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
181 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
182 return snprintf(dest
, len
, "0x%" PRIx8
, *ptr
);
185 PropertyInfo qdev_prop_hex8
= {
187 .legacy_name
= "hex8",
188 .type
= PROP_TYPE_UINT8
,
189 .size
= sizeof(uint8_t),
198 /* --- 16bit integer --- */
200 static int parse_uint16(DeviceState
*dev
, Property
*prop
, const char *str
)
202 uint16_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
205 /* accept both hex and decimal */
206 *ptr
= strtoul(str
, &end
, 0);
207 if ((*end
!= '\0') || (end
== str
)) {
214 static int print_uint16(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
216 uint16_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
217 return snprintf(dest
, len
, "%" PRIu16
, *ptr
);
220 static void get_int16(Object
*obj
, Visitor
*v
, void *opaque
,
221 const char *name
, Error
**errp
)
223 DeviceState
*dev
= DEVICE(obj
);
224 Property
*prop
= opaque
;
225 int16_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
229 visit_type_int(v
, &value
, name
, errp
);
232 static void set_int16(Object
*obj
, Visitor
*v
, void *opaque
,
233 const char *name
, Error
**errp
)
235 DeviceState
*dev
= DEVICE(obj
);
236 Property
*prop
= opaque
;
237 int16_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
238 Error
*local_err
= NULL
;
241 if (dev
->state
!= DEV_STATE_CREATED
) {
242 error_set(errp
, QERR_PERMISSION_DENIED
);
246 visit_type_int(v
, &value
, name
, &local_err
);
248 error_propagate(errp
, local_err
);
251 if (value
>= prop
->info
->min
&& value
<= prop
->info
->max
) {
254 error_set(errp
, QERR_PROPERTY_VALUE_OUT_OF_RANGE
,
255 dev
->id
?:"", name
, value
, prop
->info
->min
,
260 PropertyInfo qdev_prop_uint16
= {
262 .type
= PROP_TYPE_UINT16
,
263 .size
= sizeof(uint16_t),
264 .parse
= parse_uint16
,
265 .print
= print_uint16
,
272 /* --- 32bit integer --- */
274 static int parse_uint32(DeviceState
*dev
, Property
*prop
, const char *str
)
276 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
279 /* accept both hex and decimal */
280 *ptr
= strtoul(str
, &end
, 0);
281 if ((*end
!= '\0') || (end
== str
)) {
288 static int print_uint32(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
290 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
291 return snprintf(dest
, len
, "%" PRIu32
, *ptr
);
294 static void get_int32(Object
*obj
, Visitor
*v
, void *opaque
,
295 const char *name
, Error
**errp
)
297 DeviceState
*dev
= DEVICE(obj
);
298 Property
*prop
= opaque
;
299 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
303 visit_type_int(v
, &value
, name
, errp
);
306 static void set_int32(Object
*obj
, Visitor
*v
, void *opaque
,
307 const char *name
, Error
**errp
)
309 DeviceState
*dev
= DEVICE(obj
);
310 Property
*prop
= opaque
;
311 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
312 Error
*local_err
= NULL
;
315 if (dev
->state
!= DEV_STATE_CREATED
) {
316 error_set(errp
, QERR_PERMISSION_DENIED
);
320 visit_type_int(v
, &value
, name
, &local_err
);
322 error_propagate(errp
, local_err
);
325 if (value
>= prop
->info
->min
&& value
<= prop
->info
->max
) {
328 error_set(errp
, QERR_PROPERTY_VALUE_OUT_OF_RANGE
,
329 dev
->id
?:"", name
, value
, prop
->info
->min
,
334 PropertyInfo qdev_prop_uint32
= {
336 .type
= PROP_TYPE_UINT32
,
337 .size
= sizeof(uint32_t),
338 .parse
= parse_uint32
,
339 .print
= print_uint32
,
343 .max
= 0xFFFFFFFFULL
,
346 static int parse_int32(DeviceState
*dev
, Property
*prop
, const char *str
)
348 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
351 *ptr
= strtol(str
, &end
, 10);
352 if ((*end
!= '\0') || (end
== str
)) {
359 static int print_int32(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
361 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
362 return snprintf(dest
, len
, "%" PRId32
, *ptr
);
365 PropertyInfo qdev_prop_int32
= {
367 .type
= PROP_TYPE_INT32
,
368 .size
= sizeof(int32_t),
369 .parse
= parse_int32
,
370 .print
= print_int32
,
373 .min
= -0x80000000LL
,
377 /* --- 32bit hex value --- */
379 static int parse_hex32(DeviceState
*dev
, Property
*prop
, const char *str
)
381 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
384 *ptr
= strtoul(str
, &end
, 16);
385 if ((*end
!= '\0') || (end
== str
)) {
392 static int print_hex32(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
394 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
395 return snprintf(dest
, len
, "0x%" PRIx32
, *ptr
);
398 PropertyInfo qdev_prop_hex32
= {
400 .legacy_name
= "hex32",
401 .type
= PROP_TYPE_UINT32
,
402 .size
= sizeof(uint32_t),
403 .parse
= parse_hex32
,
404 .print
= print_hex32
,
408 .max
= 0xFFFFFFFFULL
,
411 /* --- 64bit integer --- */
413 static int parse_uint64(DeviceState
*dev
, Property
*prop
, const char *str
)
415 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
418 /* accept both hex and decimal */
419 *ptr
= strtoull(str
, &end
, 0);
420 if ((*end
!= '\0') || (end
== str
)) {
427 static int print_uint64(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
429 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
430 return snprintf(dest
, len
, "%" PRIu64
, *ptr
);
433 static void get_int64(Object
*obj
, Visitor
*v
, void *opaque
,
434 const char *name
, Error
**errp
)
436 DeviceState
*dev
= DEVICE(obj
);
437 Property
*prop
= opaque
;
438 int64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
440 visit_type_int(v
, ptr
, name
, errp
);
443 static void set_int64(Object
*obj
, Visitor
*v
, void *opaque
,
444 const char *name
, Error
**errp
)
446 DeviceState
*dev
= DEVICE(obj
);
447 Property
*prop
= opaque
;
448 int64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
450 if (dev
->state
!= DEV_STATE_CREATED
) {
451 error_set(errp
, QERR_PERMISSION_DENIED
);
455 visit_type_int(v
, ptr
, name
, errp
);
458 PropertyInfo qdev_prop_uint64
= {
460 .type
= PROP_TYPE_UINT64
,
461 .size
= sizeof(uint64_t),
462 .parse
= parse_uint64
,
463 .print
= print_uint64
,
468 /* --- 64bit hex value --- */
470 static int parse_hex64(DeviceState
*dev
, Property
*prop
, const char *str
)
472 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
475 *ptr
= strtoull(str
, &end
, 16);
476 if ((*end
!= '\0') || (end
== str
)) {
483 static int print_hex64(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
485 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
486 return snprintf(dest
, len
, "0x%" PRIx64
, *ptr
);
489 PropertyInfo qdev_prop_hex64
= {
491 .legacy_name
= "hex64",
492 .type
= PROP_TYPE_UINT64
,
493 .size
= sizeof(uint64_t),
494 .parse
= parse_hex64
,
495 .print
= print_hex64
,
502 static void release_string(Object
*obj
, const char *name
, void *opaque
)
504 Property
*prop
= opaque
;
505 g_free(*(char **)qdev_get_prop_ptr(DEVICE(obj
), prop
));
508 static int print_string(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
510 char **ptr
= qdev_get_prop_ptr(dev
, prop
);
512 return snprintf(dest
, len
, "<null>");
513 return snprintf(dest
, len
, "\"%s\"", *ptr
);
516 static void get_string(Object
*obj
, Visitor
*v
, void *opaque
,
517 const char *name
, Error
**errp
)
519 DeviceState
*dev
= DEVICE(obj
);
520 Property
*prop
= opaque
;
521 char **ptr
= qdev_get_prop_ptr(dev
, prop
);
524 char *str
= (char *)"";
525 visit_type_str(v
, &str
, name
, errp
);
527 visit_type_str(v
, ptr
, name
, errp
);
531 static void set_string(Object
*obj
, Visitor
*v
, void *opaque
,
532 const char *name
, Error
**errp
)
534 DeviceState
*dev
= DEVICE(obj
);
535 Property
*prop
= opaque
;
536 char **ptr
= qdev_get_prop_ptr(dev
, prop
);
537 Error
*local_err
= NULL
;
540 if (dev
->state
!= DEV_STATE_CREATED
) {
541 error_set(errp
, QERR_PERMISSION_DENIED
);
545 visit_type_str(v
, &str
, name
, &local_err
);
547 error_propagate(errp
, local_err
);
560 PropertyInfo qdev_prop_string
= {
562 .type
= PROP_TYPE_STRING
,
563 .size
= sizeof(char*),
564 .print
= print_string
,
565 .release
= release_string
,
572 static int parse_drive(DeviceState
*dev
, const char *str
, void **ptr
)
574 BlockDriverState
*bs
;
579 if (bdrv_attach_dev(bs
, dev
) < 0)
585 static void release_drive(Object
*obj
, const char *name
, void *opaque
)
587 DeviceState
*dev
= DEVICE(obj
);
588 Property
*prop
= opaque
;
589 BlockDriverState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
592 bdrv_detach_dev(*ptr
, dev
);
593 blockdev_auto_del(*ptr
);
597 static const char *print_drive(void *ptr
)
599 return bdrv_get_device_name(ptr
);
602 static void get_pointer(Object
*obj
, Visitor
*v
, Property
*prop
,
603 const char *(*print
)(void *ptr
),
604 const char *name
, Error
**errp
)
606 DeviceState
*dev
= DEVICE(obj
);
607 void **ptr
= qdev_get_prop_ptr(dev
, prop
);
610 p
= (char *) (*ptr
? print(*ptr
) : "");
611 visit_type_str(v
, &p
, name
, errp
);
614 static void set_pointer(Object
*obj
, Visitor
*v
, Property
*prop
,
615 int (*parse
)(DeviceState
*dev
, const char *str
, void **ptr
),
616 const char *name
, Error
**errp
)
618 DeviceState
*dev
= DEVICE(obj
);
619 Error
*local_err
= NULL
;
620 void **ptr
= qdev_get_prop_ptr(dev
, prop
);
624 if (dev
->state
!= DEV_STATE_CREATED
) {
625 error_set(errp
, QERR_PERMISSION_DENIED
);
629 visit_type_str(v
, &str
, name
, &local_err
);
631 error_propagate(errp
, local_err
);
636 error_set_from_qdev_prop_error(errp
, EINVAL
, dev
, prop
, str
);
639 ret
= parse(dev
, str
, ptr
);
640 error_set_from_qdev_prop_error(errp
, ret
, dev
, prop
, str
);
644 static void get_drive(Object
*obj
, Visitor
*v
, void *opaque
,
645 const char *name
, Error
**errp
)
647 get_pointer(obj
, v
, opaque
, print_drive
, name
, errp
);
650 static void set_drive(Object
*obj
, Visitor
*v
, void *opaque
,
651 const char *name
, Error
**errp
)
653 set_pointer(obj
, v
, opaque
, parse_drive
, name
, errp
);
656 PropertyInfo qdev_prop_drive
= {
658 .type
= PROP_TYPE_DRIVE
,
659 .size
= sizeof(BlockDriverState
*),
662 .release
= release_drive
,
665 /* --- character device --- */
667 static int parse_chr(DeviceState
*dev
, const char *str
, void **ptr
)
669 CharDriverState
*chr
= qemu_chr_find(str
);
673 if (chr
->avail_connections
< 1) {
677 --chr
->avail_connections
;
681 static void release_chr(Object
*obj
, const char *name
, void *opaque
)
683 DeviceState
*dev
= DEVICE(obj
);
684 Property
*prop
= opaque
;
685 CharDriverState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
688 qemu_chr_add_handlers(*ptr
, NULL
, NULL
, NULL
, NULL
);
693 static const char *print_chr(void *ptr
)
695 CharDriverState
*chr
= ptr
;
697 return chr
->label
? chr
->label
: "";
700 static void get_chr(Object
*obj
, Visitor
*v
, void *opaque
,
701 const char *name
, Error
**errp
)
703 get_pointer(obj
, v
, opaque
, print_chr
, name
, errp
);
706 static void set_chr(Object
*obj
, Visitor
*v
, void *opaque
,
707 const char *name
, Error
**errp
)
709 set_pointer(obj
, v
, opaque
, parse_chr
, name
, errp
);
712 PropertyInfo qdev_prop_chr
= {
714 .type
= PROP_TYPE_CHR
,
715 .size
= sizeof(CharDriverState
*),
718 .release
= release_chr
,
721 /* --- netdev device --- */
723 static int parse_netdev(DeviceState
*dev
, const char *str
, void **ptr
)
725 VLANClientState
*netdev
= qemu_find_netdev(str
);
727 if (netdev
== NULL
) {
737 static const char *print_netdev(void *ptr
)
739 VLANClientState
*netdev
= ptr
;
741 return netdev
->name
? netdev
->name
: "";
744 static void get_netdev(Object
*obj
, Visitor
*v
, void *opaque
,
745 const char *name
, Error
**errp
)
747 get_pointer(obj
, v
, opaque
, print_netdev
, name
, errp
);
750 static void set_netdev(Object
*obj
, Visitor
*v
, void *opaque
,
751 const char *name
, Error
**errp
)
753 set_pointer(obj
, v
, opaque
, parse_netdev
, name
, errp
);
756 PropertyInfo qdev_prop_netdev
= {
758 .type
= PROP_TYPE_NETDEV
,
759 .size
= sizeof(VLANClientState
*),
766 static int parse_vlan(DeviceState
*dev
, Property
*prop
, const char *str
)
768 VLANState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
771 if (sscanf(str
, "%d", &id
) != 1)
773 *ptr
= qemu_find_vlan(id
, 1);
779 static int print_vlan(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
781 VLANState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
784 return snprintf(dest
, len
, "%d", (*ptr
)->id
);
786 return snprintf(dest
, len
, "<null>");
790 static void get_vlan(Object
*obj
, Visitor
*v
, void *opaque
,
791 const char *name
, Error
**errp
)
793 DeviceState
*dev
= DEVICE(obj
);
794 Property
*prop
= opaque
;
795 VLANState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
798 id
= *ptr
? (*ptr
)->id
: -1;
799 visit_type_int(v
, &id
, name
, errp
);
802 static void set_vlan(Object
*obj
, Visitor
*v
, void *opaque
,
803 const char *name
, Error
**errp
)
805 DeviceState
*dev
= DEVICE(obj
);
806 Property
*prop
= opaque
;
807 VLANState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
808 Error
*local_err
= NULL
;
812 if (dev
->state
!= DEV_STATE_CREATED
) {
813 error_set(errp
, QERR_PERMISSION_DENIED
);
817 visit_type_int(v
, &id
, name
, &local_err
);
819 error_propagate(errp
, local_err
);
826 vlan
= qemu_find_vlan(id
, 1);
828 error_set(errp
, QERR_INVALID_PARAMETER_VALUE
,
829 name
, prop
->info
->name
);
835 PropertyInfo qdev_prop_vlan
= {
837 .type
= PROP_TYPE_VLAN
,
838 .size
= sizeof(VLANClientState
*),
845 /* --- pointer --- */
847 /* Not a proper property, just for dirty hacks. TODO Remove it! */
848 PropertyInfo qdev_prop_ptr
= {
850 .type
= PROP_TYPE_PTR
,
851 .size
= sizeof(void*),
854 /* --- mac address --- */
857 * accepted syntax versions:
861 static void get_mac(Object
*obj
, Visitor
*v
, void *opaque
,
862 const char *name
, Error
**errp
)
864 DeviceState
*dev
= DEVICE(obj
);
865 Property
*prop
= opaque
;
866 MACAddr
*mac
= qdev_get_prop_ptr(dev
, prop
);
867 char buffer
[2 * 6 + 5 + 1];
870 snprintf(buffer
, sizeof(buffer
), "%02x:%02x:%02x:%02x:%02x:%02x",
871 mac
->a
[0], mac
->a
[1], mac
->a
[2],
872 mac
->a
[3], mac
->a
[4], mac
->a
[5]);
874 visit_type_str(v
, &p
, name
, errp
);
877 static void set_mac(Object
*obj
, Visitor
*v
, void *opaque
,
878 const char *name
, Error
**errp
)
880 DeviceState
*dev
= DEVICE(obj
);
881 Property
*prop
= opaque
;
882 MACAddr
*mac
= qdev_get_prop_ptr(dev
, prop
);
883 Error
*local_err
= NULL
;
887 if (dev
->state
!= DEV_STATE_CREATED
) {
888 error_set(errp
, QERR_PERMISSION_DENIED
);
892 visit_type_str(v
, &str
, name
, &local_err
);
894 error_propagate(errp
, local_err
);
898 for (i
= 0, pos
= 0; i
< 6; i
++, pos
+= 3) {
899 if (!qemu_isxdigit(str
[pos
]))
901 if (!qemu_isxdigit(str
[pos
+1]))
904 if (str
[pos
+2] != '\0')
907 if (str
[pos
+2] != ':' && str
[pos
+2] != '-')
910 mac
->a
[i
] = strtol(str
+pos
, &p
, 16);
915 error_set_from_qdev_prop_error(errp
, EINVAL
, dev
, prop
, str
);
918 PropertyInfo qdev_prop_macaddr
= {
920 .type
= PROP_TYPE_MACADDR
,
921 .size
= sizeof(MACAddr
),
927 /* --- lost tick policy --- */
929 static const char *lost_tick_policy_table
[LOST_TICK_MAX
+1] = {
930 [LOST_TICK_DISCARD
] = "discard",
931 [LOST_TICK_DELAY
] = "delay",
932 [LOST_TICK_MERGE
] = "merge",
933 [LOST_TICK_SLEW
] = "slew",
934 [LOST_TICK_MAX
] = NULL
,
937 QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy
) != sizeof(int));
939 static void get_enum(Object
*obj
, Visitor
*v
, void *opaque
,
940 const char *name
, Error
**errp
)
942 DeviceState
*dev
= DEVICE(obj
);
943 Property
*prop
= opaque
;
944 int *ptr
= qdev_get_prop_ptr(dev
, prop
);
946 visit_type_enum(v
, ptr
, prop
->info
->enum_table
,
947 prop
->info
->name
, prop
->name
, errp
);
950 static void set_enum(Object
*obj
, Visitor
*v
, void *opaque
,
951 const char *name
, Error
**errp
)
953 DeviceState
*dev
= DEVICE(obj
);
954 Property
*prop
= opaque
;
955 int *ptr
= qdev_get_prop_ptr(dev
, prop
);
957 if (dev
->state
!= DEV_STATE_CREATED
) {
958 error_set(errp
, QERR_PERMISSION_DENIED
);
962 visit_type_enum(v
, ptr
, prop
->info
->enum_table
,
963 prop
->info
->name
, prop
->name
, errp
);
966 PropertyInfo qdev_prop_losttickpolicy
= {
967 .name
= "LostTickPolicy",
968 .type
= PROP_TYPE_LOSTTICKPOLICY
,
969 .size
= sizeof(LostTickPolicy
),
970 .enum_table
= lost_tick_policy_table
,
975 /* --- pci address --- */
978 * bus-local address, i.e. "$slot" or "$slot.$fn"
980 static int parse_pci_devfn(DeviceState
*dev
, Property
*prop
, const char *str
)
982 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
983 unsigned int slot
, fn
, n
;
985 if (sscanf(str
, "%x.%x%n", &slot
, &fn
, &n
) != 2) {
987 if (sscanf(str
, "%x%n", &slot
, &n
) != 1) {
997 *ptr
= slot
<< 3 | fn
;
1001 static int print_pci_devfn(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
1003 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
1006 return snprintf(dest
, len
, "<unset>");
1008 return snprintf(dest
, len
, "%02x.%x", *ptr
>> 3, *ptr
& 7);
1012 PropertyInfo qdev_prop_pci_devfn
= {
1014 .legacy_name
= "pci-devfn",
1015 .type
= PROP_TYPE_UINT32
,
1016 .size
= sizeof(uint32_t),
1017 .parse
= parse_pci_devfn
,
1018 .print
= print_pci_devfn
,
1021 /* FIXME: this should be -1...255, but the address is stored
1022 * into an uint32_t rather than int32_t.
1025 .max
= 0xFFFFFFFFULL
,
1028 /* --- public helpers --- */
1030 static Property
*qdev_prop_walk(Property
*props
, const char *name
)
1034 while (props
->name
) {
1035 if (strcmp(props
->name
, name
) == 0)
1042 static Property
*qdev_prop_find(DeviceState
*dev
, const char *name
)
1046 /* device properties */
1047 prop
= qdev_prop_walk(qdev_get_props(dev
), name
);
1051 /* bus properties */
1052 prop
= qdev_prop_walk(dev
->parent_bus
->info
->props
, name
);
1059 int qdev_prop_exists(DeviceState
*dev
, const char *name
)
1061 return qdev_prop_find(dev
, name
) ? true : false;
1064 void error_set_from_qdev_prop_error(Error
**errp
, int ret
, DeviceState
*dev
,
1065 Property
*prop
, const char *value
)
1069 error_set(errp
, QERR_PROPERTY_VALUE_IN_USE
,
1070 object_get_typename(OBJECT(dev
)), prop
->name
, value
);
1074 error_set(errp
, QERR_PROPERTY_VALUE_BAD
,
1075 object_get_typename(OBJECT(dev
)), prop
->name
, value
);
1078 error_set(errp
, QERR_PROPERTY_VALUE_NOT_FOUND
,
1079 object_get_typename(OBJECT(dev
)), prop
->name
, value
);
1086 int qdev_prop_parse(DeviceState
*dev
, const char *name
, const char *value
)
1091 legacy_name
= g_strdup_printf("legacy-%s", name
);
1092 if (object_property_get_type(OBJECT(dev
), legacy_name
, NULL
)) {
1093 object_property_set_str(OBJECT(dev
), value
, legacy_name
, &err
);
1095 object_property_set_str(OBJECT(dev
), value
, name
, &err
);
1097 g_free(legacy_name
);
1100 qerror_report_err(err
);
1107 void qdev_prop_set_bit(DeviceState
*dev
, const char *name
, bool value
)
1110 object_property_set_bool(OBJECT(dev
), value
, name
, &errp
);
1114 void qdev_prop_set_uint8(DeviceState
*dev
, const char *name
, uint8_t value
)
1117 object_property_set_int(OBJECT(dev
), value
, name
, &errp
);
1121 void qdev_prop_set_uint16(DeviceState
*dev
, const char *name
, uint16_t value
)
1124 object_property_set_int(OBJECT(dev
), value
, name
, &errp
);
1128 void qdev_prop_set_uint32(DeviceState
*dev
, const char *name
, uint32_t value
)
1131 object_property_set_int(OBJECT(dev
), value
, name
, &errp
);
1135 void qdev_prop_set_int32(DeviceState
*dev
, const char *name
, int32_t value
)
1138 object_property_set_int(OBJECT(dev
), value
, name
, &errp
);
1142 void qdev_prop_set_uint64(DeviceState
*dev
, const char *name
, uint64_t value
)
1145 object_property_set_int(OBJECT(dev
), value
, name
, &errp
);
1149 void qdev_prop_set_string(DeviceState
*dev
, const char *name
, char *value
)
1152 object_property_set_str(OBJECT(dev
), value
, name
, &errp
);
1156 int qdev_prop_set_drive(DeviceState
*dev
, const char *name
, BlockDriverState
*value
)
1159 object_property_set_str(OBJECT(dev
), bdrv_get_device_name(value
),
1162 qerror_report_err(errp
);
1169 void qdev_prop_set_drive_nofail(DeviceState
*dev
, const char *name
, BlockDriverState
*value
)
1171 if (qdev_prop_set_drive(dev
, name
, value
) < 0) {
1175 void qdev_prop_set_chr(DeviceState
*dev
, const char *name
, CharDriverState
*value
)
1178 assert(value
->label
);
1179 object_property_set_str(OBJECT(dev
), value
->label
, name
, &errp
);
1183 void qdev_prop_set_netdev(DeviceState
*dev
, const char *name
, VLANClientState
*value
)
1186 assert(value
->name
);
1187 object_property_set_str(OBJECT(dev
), value
->name
, name
, &errp
);
1191 void qdev_prop_set_vlan(DeviceState
*dev
, const char *name
, VLANState
*value
)
1194 object_property_set_int(OBJECT(dev
), value
? value
->id
: -1, name
, &errp
);
1198 void qdev_prop_set_macaddr(DeviceState
*dev
, const char *name
, uint8_t *value
)
1201 char str
[2 * 6 + 5 + 1];
1202 snprintf(str
, sizeof(str
), "%02x:%02x:%02x:%02x:%02x:%02x",
1203 value
[0], value
[1], value
[2], value
[3], value
[4], value
[5]);
1205 object_property_set_str(OBJECT(dev
), str
, name
, &errp
);
1209 void qdev_prop_set_enum(DeviceState
*dev
, const char *name
, int value
)
1214 prop
= qdev_prop_find(dev
, name
);
1215 object_property_set_str(OBJECT(dev
), prop
->info
->enum_table
[value
],
1220 void qdev_prop_set_ptr(DeviceState
*dev
, const char *name
, void *value
)
1225 prop
= qdev_prop_find(dev
, name
);
1226 assert(prop
&& prop
->info
== &qdev_prop_ptr
);
1227 ptr
= qdev_get_prop_ptr(dev
, prop
);
1231 void qdev_prop_set_defaults(DeviceState
*dev
, Property
*props
)
1233 Object
*obj
= OBJECT(dev
);
1236 for (; props
->name
; props
++) {
1238 if (props
->qtype
== QTYPE_NONE
) {
1241 if (props
->qtype
== QTYPE_QBOOL
) {
1242 object_property_set_bool(obj
, props
->defval
, props
->name
, &errp
);
1243 } else if (props
->info
->enum_table
) {
1244 object_property_set_str(obj
, props
->info
->enum_table
[props
->defval
],
1245 props
->name
, &errp
);
1246 } else if (props
->qtype
== QTYPE_QINT
) {
1247 object_property_set_int(obj
, props
->defval
, props
->name
, &errp
);
1253 static QTAILQ_HEAD(, GlobalProperty
) global_props
= QTAILQ_HEAD_INITIALIZER(global_props
);
1255 static void qdev_prop_register_global(GlobalProperty
*prop
)
1257 QTAILQ_INSERT_TAIL(&global_props
, prop
, next
);
1260 void qdev_prop_register_global_list(GlobalProperty
*props
)
1264 for (i
= 0; props
[i
].driver
!= NULL
; i
++) {
1265 qdev_prop_register_global(props
+i
);
1269 void qdev_prop_set_globals(DeviceState
*dev
)
1271 GlobalProperty
*prop
;
1273 QTAILQ_FOREACH(prop
, &global_props
, next
) {
1274 if (strcmp(object_get_typename(OBJECT(dev
)), prop
->driver
) != 0 &&
1275 strcmp(qdev_get_bus_info(dev
)->name
, prop
->driver
) != 0) {
1278 if (qdev_prop_parse(dev
, prop
->property
, prop
->value
) != 0) {
1284 static int qdev_add_one_global(QemuOpts
*opts
, void *opaque
)
1288 g
= g_malloc0(sizeof(*g
));
1289 g
->driver
= qemu_opt_get(opts
, "driver");
1290 g
->property
= qemu_opt_get(opts
, "property");
1291 g
->value
= qemu_opt_get(opts
, "value");
1292 qdev_prop_register_global(g
);
1296 void qemu_add_globals(void)
1298 qemu_opts_foreach(qemu_find_opts("global"), qdev_add_one_global
, NULL
, 0);