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
);
29 static void qdev_prop_cpy(DeviceState
*dev
, Property
*props
, void *src
)
31 if (props
->info
->type
== PROP_TYPE_BIT
) {
33 bit_prop_set(dev
, props
, *defval
);
35 char *dst
= qdev_get_prop_ptr(dev
, props
);
36 memcpy(dst
, src
, props
->info
->size
);
41 static int parse_bit(DeviceState
*dev
, Property
*prop
, const char *str
)
43 if (!strcasecmp(str
, "on"))
44 bit_prop_set(dev
, prop
, true);
45 else if (!strcasecmp(str
, "off"))
46 bit_prop_set(dev
, prop
, false);
52 static int print_bit(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
54 uint32_t *p
= qdev_get_prop_ptr(dev
, prop
);
55 return snprintf(dest
, len
, (*p
& qdev_get_prop_mask(prop
)) ? "on" : "off");
58 static void get_bit(Object
*obj
, Visitor
*v
, void *opaque
,
59 const char *name
, Error
**errp
)
61 DeviceState
*dev
= DEVICE(obj
);
62 Property
*prop
= opaque
;
63 uint32_t *p
= qdev_get_prop_ptr(dev
, prop
);
64 bool value
= (*p
& qdev_get_prop_mask(prop
)) != 0;
66 visit_type_bool(v
, &value
, name
, errp
);
69 static void set_bit(Object
*obj
, Visitor
*v
, void *opaque
,
70 const char *name
, Error
**errp
)
72 DeviceState
*dev
= DEVICE(obj
);
73 Property
*prop
= opaque
;
74 Error
*local_err
= NULL
;
77 if (dev
->state
!= DEV_STATE_CREATED
) {
78 error_set(errp
, QERR_PERMISSION_DENIED
);
82 visit_type_bool(v
, &value
, name
, &local_err
);
84 error_propagate(errp
, local_err
);
87 bit_prop_set(dev
, prop
, value
);
90 PropertyInfo qdev_prop_bit
= {
92 .legacy_name
= "on/off",
93 .type
= PROP_TYPE_BIT
,
94 .size
= sizeof(uint32_t),
101 /* --- 8bit integer --- */
103 static int parse_uint8(DeviceState
*dev
, Property
*prop
, const char *str
)
105 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
108 /* accept both hex and decimal */
109 *ptr
= strtoul(str
, &end
, 0);
110 if ((*end
!= '\0') || (end
== str
)) {
117 static int print_uint8(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
119 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
120 return snprintf(dest
, len
, "%" PRIu8
, *ptr
);
123 static void get_int8(Object
*obj
, Visitor
*v
, void *opaque
,
124 const char *name
, Error
**errp
)
126 DeviceState
*dev
= DEVICE(obj
);
127 Property
*prop
= opaque
;
128 int8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
132 visit_type_int(v
, &value
, name
, errp
);
135 static void set_int8(Object
*obj
, Visitor
*v
, void *opaque
,
136 const char *name
, Error
**errp
)
138 DeviceState
*dev
= DEVICE(obj
);
139 Property
*prop
= opaque
;
140 int8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
141 Error
*local_err
= NULL
;
144 if (dev
->state
!= DEV_STATE_CREATED
) {
145 error_set(errp
, QERR_PERMISSION_DENIED
);
149 visit_type_int(v
, &value
, name
, &local_err
);
151 error_propagate(errp
, local_err
);
154 if (value
> prop
->info
->min
&& value
<= prop
->info
->max
) {
157 error_set(errp
, QERR_PROPERTY_VALUE_OUT_OF_RANGE
,
158 dev
->id
?:"", name
, value
, prop
->info
->min
,
163 PropertyInfo qdev_prop_uint8
= {
165 .type
= PROP_TYPE_UINT8
,
166 .size
= sizeof(uint8_t),
167 .parse
= parse_uint8
,
168 .print
= print_uint8
,
175 /* --- 8bit hex value --- */
177 static int parse_hex8(DeviceState
*dev
, Property
*prop
, const char *str
)
179 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
182 *ptr
= strtoul(str
, &end
, 16);
183 if ((*end
!= '\0') || (end
== str
)) {
190 static int print_hex8(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
192 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
193 return snprintf(dest
, len
, "0x%" PRIx8
, *ptr
);
196 PropertyInfo qdev_prop_hex8
= {
198 .legacy_name
= "hex8",
199 .type
= PROP_TYPE_UINT8
,
200 .size
= sizeof(uint8_t),
209 /* --- 16bit integer --- */
211 static int parse_uint16(DeviceState
*dev
, Property
*prop
, const char *str
)
213 uint16_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
216 /* accept both hex and decimal */
217 *ptr
= strtoul(str
, &end
, 0);
218 if ((*end
!= '\0') || (end
== str
)) {
225 static int print_uint16(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
227 uint16_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
228 return snprintf(dest
, len
, "%" PRIu16
, *ptr
);
231 static void get_int16(Object
*obj
, Visitor
*v
, void *opaque
,
232 const char *name
, Error
**errp
)
234 DeviceState
*dev
= DEVICE(obj
);
235 Property
*prop
= opaque
;
236 int16_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
240 visit_type_int(v
, &value
, name
, errp
);
243 static void set_int16(Object
*obj
, Visitor
*v
, void *opaque
,
244 const char *name
, Error
**errp
)
246 DeviceState
*dev
= DEVICE(obj
);
247 Property
*prop
= opaque
;
248 int16_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
249 Error
*local_err
= NULL
;
252 if (dev
->state
!= DEV_STATE_CREATED
) {
253 error_set(errp
, QERR_PERMISSION_DENIED
);
257 visit_type_int(v
, &value
, name
, &local_err
);
259 error_propagate(errp
, local_err
);
262 if (value
> prop
->info
->min
&& value
<= prop
->info
->max
) {
265 error_set(errp
, QERR_PROPERTY_VALUE_OUT_OF_RANGE
,
266 dev
->id
?:"", name
, value
, prop
->info
->min
,
271 PropertyInfo qdev_prop_uint16
= {
273 .type
= PROP_TYPE_UINT16
,
274 .size
= sizeof(uint16_t),
275 .parse
= parse_uint16
,
276 .print
= print_uint16
,
283 /* --- 32bit integer --- */
285 static int parse_uint32(DeviceState
*dev
, Property
*prop
, const char *str
)
287 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
290 /* accept both hex and decimal */
291 *ptr
= strtoul(str
, &end
, 0);
292 if ((*end
!= '\0') || (end
== str
)) {
299 static int print_uint32(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
301 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
302 return snprintf(dest
, len
, "%" PRIu32
, *ptr
);
305 static void get_int32(Object
*obj
, Visitor
*v
, void *opaque
,
306 const char *name
, Error
**errp
)
308 DeviceState
*dev
= DEVICE(obj
);
309 Property
*prop
= opaque
;
310 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
314 visit_type_int(v
, &value
, name
, errp
);
317 static void set_int32(Object
*obj
, Visitor
*v
, void *opaque
,
318 const char *name
, Error
**errp
)
320 DeviceState
*dev
= DEVICE(obj
);
321 Property
*prop
= opaque
;
322 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
323 Error
*local_err
= NULL
;
326 if (dev
->state
!= DEV_STATE_CREATED
) {
327 error_set(errp
, QERR_PERMISSION_DENIED
);
331 visit_type_int(v
, &value
, name
, &local_err
);
333 error_propagate(errp
, local_err
);
336 if (value
> prop
->info
->min
&& value
<= prop
->info
->max
) {
339 error_set(errp
, QERR_PROPERTY_VALUE_OUT_OF_RANGE
,
340 dev
->id
?:"", name
, value
, prop
->info
->min
,
345 PropertyInfo qdev_prop_uint32
= {
347 .type
= PROP_TYPE_UINT32
,
348 .size
= sizeof(uint32_t),
349 .parse
= parse_uint32
,
350 .print
= print_uint32
,
354 .max
= 0xFFFFFFFFULL
,
357 static int parse_int32(DeviceState
*dev
, Property
*prop
, const char *str
)
359 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
362 *ptr
= strtol(str
, &end
, 10);
363 if ((*end
!= '\0') || (end
== str
)) {
370 static int print_int32(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
372 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
373 return snprintf(dest
, len
, "%" PRId32
, *ptr
);
376 PropertyInfo qdev_prop_int32
= {
378 .type
= PROP_TYPE_INT32
,
379 .size
= sizeof(int32_t),
380 .parse
= parse_int32
,
381 .print
= print_int32
,
384 .min
= -0x80000000LL
,
388 /* --- 32bit hex value --- */
390 static int parse_hex32(DeviceState
*dev
, Property
*prop
, const char *str
)
392 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
395 *ptr
= strtoul(str
, &end
, 16);
396 if ((*end
!= '\0') || (end
== str
)) {
403 static int print_hex32(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
405 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
406 return snprintf(dest
, len
, "0x%" PRIx32
, *ptr
);
409 PropertyInfo qdev_prop_hex32
= {
411 .legacy_name
= "hex32",
412 .type
= PROP_TYPE_UINT32
,
413 .size
= sizeof(uint32_t),
414 .parse
= parse_hex32
,
415 .print
= print_hex32
,
419 .max
= 0xFFFFFFFFULL
,
422 /* --- 64bit integer --- */
424 static int parse_uint64(DeviceState
*dev
, Property
*prop
, const char *str
)
426 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
429 /* accept both hex and decimal */
430 *ptr
= strtoull(str
, &end
, 0);
431 if ((*end
!= '\0') || (end
== str
)) {
438 static int print_uint64(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
440 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
441 return snprintf(dest
, len
, "%" PRIu64
, *ptr
);
444 static void get_int64(Object
*obj
, Visitor
*v
, void *opaque
,
445 const char *name
, Error
**errp
)
447 DeviceState
*dev
= DEVICE(obj
);
448 Property
*prop
= opaque
;
449 int64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
451 visit_type_int(v
, ptr
, name
, errp
);
454 static void set_int64(Object
*obj
, Visitor
*v
, void *opaque
,
455 const char *name
, Error
**errp
)
457 DeviceState
*dev
= DEVICE(obj
);
458 Property
*prop
= opaque
;
459 int64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
461 if (dev
->state
!= DEV_STATE_CREATED
) {
462 error_set(errp
, QERR_PERMISSION_DENIED
);
466 visit_type_int(v
, ptr
, name
, errp
);
469 PropertyInfo qdev_prop_uint64
= {
471 .type
= PROP_TYPE_UINT64
,
472 .size
= sizeof(uint64_t),
473 .parse
= parse_uint64
,
474 .print
= print_uint64
,
479 /* --- 64bit hex value --- */
481 static int parse_hex64(DeviceState
*dev
, Property
*prop
, const char *str
)
483 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
486 *ptr
= strtoull(str
, &end
, 16);
487 if ((*end
!= '\0') || (end
== str
)) {
494 static int print_hex64(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
496 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
497 return snprintf(dest
, len
, "0x%" PRIx64
, *ptr
);
500 PropertyInfo qdev_prop_hex64
= {
502 .legacy_name
= "hex64",
503 .type
= PROP_TYPE_UINT64
,
504 .size
= sizeof(uint64_t),
505 .parse
= parse_hex64
,
506 .print
= print_hex64
,
513 static void free_string(DeviceState
*dev
, Property
*prop
)
515 g_free(*(char **)qdev_get_prop_ptr(dev
, prop
));
518 static int print_string(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
520 char **ptr
= qdev_get_prop_ptr(dev
, prop
);
522 return snprintf(dest
, len
, "<null>");
523 return snprintf(dest
, len
, "\"%s\"", *ptr
);
526 static void get_string(Object
*obj
, Visitor
*v
, void *opaque
,
527 const char *name
, Error
**errp
)
529 DeviceState
*dev
= DEVICE(obj
);
530 Property
*prop
= opaque
;
531 char **ptr
= qdev_get_prop_ptr(dev
, prop
);
534 char *str
= (char *)"";
535 visit_type_str(v
, &str
, name
, errp
);
537 visit_type_str(v
, ptr
, name
, errp
);
541 static void set_string(Object
*obj
, Visitor
*v
, void *opaque
,
542 const char *name
, Error
**errp
)
544 DeviceState
*dev
= DEVICE(obj
);
545 Property
*prop
= opaque
;
546 char **ptr
= qdev_get_prop_ptr(dev
, prop
);
547 Error
*local_err
= NULL
;
550 if (dev
->state
!= DEV_STATE_CREATED
) {
551 error_set(errp
, QERR_PERMISSION_DENIED
);
555 visit_type_str(v
, &str
, name
, &local_err
);
557 error_propagate(errp
, local_err
);
570 PropertyInfo qdev_prop_string
= {
572 .type
= PROP_TYPE_STRING
,
573 .size
= sizeof(char*),
574 .print
= print_string
,
582 static int parse_drive(DeviceState
*dev
, Property
*prop
, const char *str
)
584 BlockDriverState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
585 BlockDriverState
*bs
;
590 if (bdrv_attach_dev(bs
, dev
) < 0)
596 static void free_drive(DeviceState
*dev
, Property
*prop
)
598 BlockDriverState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
601 bdrv_detach_dev(*ptr
, dev
);
602 blockdev_auto_del(*ptr
);
606 static int print_drive(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
608 BlockDriverState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
609 return snprintf(dest
, len
, "%s",
610 *ptr
? bdrv_get_device_name(*ptr
) : "<null>");
613 static void get_generic(Object
*obj
, Visitor
*v
, void *opaque
,
614 const char *name
, Error
**errp
)
616 DeviceState
*dev
= DEVICE(obj
);
617 Property
*prop
= opaque
;
618 void **ptr
= qdev_get_prop_ptr(dev
, prop
);
624 prop
->info
->print(dev
, prop
, buffer
, sizeof(buffer
));
626 visit_type_str(v
, &p
, name
, errp
);
629 static void set_generic(Object
*obj
, Visitor
*v
, void *opaque
,
630 const char *name
, Error
**errp
)
632 DeviceState
*dev
= DEVICE(obj
);
633 Property
*prop
= opaque
;
634 Error
*local_err
= NULL
;
638 if (dev
->state
!= DEV_STATE_CREATED
) {
639 error_set(errp
, QERR_PERMISSION_DENIED
);
643 visit_type_str(v
, &str
, name
, &local_err
);
645 error_propagate(errp
, local_err
);
650 error_set_from_qdev_prop_error(errp
, EINVAL
, dev
, prop
, str
);
653 ret
= prop
->info
->parse(dev
, prop
, str
);
654 error_set_from_qdev_prop_error(errp
, ret
, dev
, prop
, str
);
658 PropertyInfo qdev_prop_drive
= {
660 .type
= PROP_TYPE_DRIVE
,
661 .size
= sizeof(BlockDriverState
*),
662 .parse
= parse_drive
,
663 .print
= print_drive
,
669 /* --- character device --- */
671 static int parse_chr(DeviceState
*dev
, Property
*prop
, const char *str
)
673 CharDriverState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
675 *ptr
= qemu_chr_find(str
);
679 if ((*ptr
)->avail_connections
< 1) {
682 --(*ptr
)->avail_connections
;
686 static void free_chr(DeviceState
*dev
, Property
*prop
)
688 CharDriverState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
691 qemu_chr_add_handlers(*ptr
, NULL
, NULL
, NULL
, NULL
);
696 static int print_chr(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
698 CharDriverState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
700 if (*ptr
&& (*ptr
)->label
) {
701 return snprintf(dest
, len
, "%s", (*ptr
)->label
);
703 return snprintf(dest
, len
, "<null>");
707 PropertyInfo qdev_prop_chr
= {
709 .type
= PROP_TYPE_CHR
,
710 .size
= sizeof(CharDriverState
*),
718 /* --- netdev device --- */
720 static int parse_netdev(DeviceState
*dev
, Property
*prop
, const char *str
)
722 VLANClientState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
724 *ptr
= qemu_find_netdev(str
);
733 static int print_netdev(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
735 VLANClientState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
737 if (*ptr
&& (*ptr
)->name
) {
738 return snprintf(dest
, len
, "%s", (*ptr
)->name
);
740 return snprintf(dest
, len
, "<null>");
744 PropertyInfo qdev_prop_netdev
= {
746 .type
= PROP_TYPE_NETDEV
,
747 .size
= sizeof(VLANClientState
*),
748 .parse
= parse_netdev
,
749 .print
= print_netdev
,
756 static int parse_vlan(DeviceState
*dev
, Property
*prop
, const char *str
)
758 VLANState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
761 if (sscanf(str
, "%d", &id
) != 1)
763 *ptr
= qemu_find_vlan(id
, 1);
769 static int print_vlan(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
771 VLANState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
774 return snprintf(dest
, len
, "%d", (*ptr
)->id
);
776 return snprintf(dest
, len
, "<null>");
780 static void get_vlan(Object
*obj
, Visitor
*v
, void *opaque
,
781 const char *name
, Error
**errp
)
783 DeviceState
*dev
= DEVICE(obj
);
784 Property
*prop
= opaque
;
785 VLANState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
788 id
= *ptr
? (*ptr
)->id
: -1;
789 visit_type_int(v
, &id
, name
, errp
);
792 static void set_vlan(Object
*obj
, Visitor
*v
, void *opaque
,
793 const char *name
, Error
**errp
)
795 DeviceState
*dev
= DEVICE(obj
);
796 Property
*prop
= opaque
;
797 VLANState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
798 Error
*local_err
= NULL
;
802 if (dev
->state
!= DEV_STATE_CREATED
) {
803 error_set(errp
, QERR_PERMISSION_DENIED
);
807 visit_type_int(v
, &id
, name
, &local_err
);
809 error_propagate(errp
, local_err
);
816 vlan
= qemu_find_vlan(id
, 1);
818 error_set(errp
, QERR_INVALID_PARAMETER_VALUE
,
819 name
, prop
->info
->name
);
825 PropertyInfo qdev_prop_vlan
= {
827 .type
= PROP_TYPE_VLAN
,
828 .size
= sizeof(VLANClientState
*),
835 /* --- pointer --- */
837 /* Not a proper property, just for dirty hacks. TODO Remove it! */
838 PropertyInfo qdev_prop_ptr
= {
840 .type
= PROP_TYPE_PTR
,
841 .size
= sizeof(void*),
844 /* --- mac address --- */
847 * accepted syntax versions:
851 static void get_mac(Object
*obj
, Visitor
*v
, void *opaque
,
852 const char *name
, Error
**errp
)
854 DeviceState
*dev
= DEVICE(obj
);
855 Property
*prop
= opaque
;
856 MACAddr
*mac
= qdev_get_prop_ptr(dev
, prop
);
857 char buffer
[2 * 6 + 5 + 1];
860 snprintf(buffer
, sizeof(buffer
), "%02x:%02x:%02x:%02x:%02x:%02x",
861 mac
->a
[0], mac
->a
[1], mac
->a
[2],
862 mac
->a
[3], mac
->a
[4], mac
->a
[5]);
864 visit_type_str(v
, &p
, name
, errp
);
867 static void set_mac(Object
*obj
, Visitor
*v
, void *opaque
,
868 const char *name
, Error
**errp
)
870 DeviceState
*dev
= DEVICE(obj
);
871 Property
*prop
= opaque
;
872 MACAddr
*mac
= qdev_get_prop_ptr(dev
, prop
);
873 Error
*local_err
= NULL
;
877 if (dev
->state
!= DEV_STATE_CREATED
) {
878 error_set(errp
, QERR_PERMISSION_DENIED
);
882 visit_type_str(v
, &str
, name
, &local_err
);
884 error_propagate(errp
, local_err
);
888 for (i
= 0, pos
= 0; i
< 6; i
++, pos
+= 3) {
889 if (!qemu_isxdigit(str
[pos
]))
891 if (!qemu_isxdigit(str
[pos
+1]))
894 if (str
[pos
+2] != '\0')
897 if (str
[pos
+2] != ':' && str
[pos
+2] != '-')
900 mac
->a
[i
] = strtol(str
+pos
, &p
, 16);
905 error_set_from_qdev_prop_error(errp
, EINVAL
, dev
, prop
, str
);
908 PropertyInfo qdev_prop_macaddr
= {
910 .type
= PROP_TYPE_MACADDR
,
911 .size
= sizeof(MACAddr
),
917 /* --- lost tick policy --- */
919 static const char *lost_tick_policy_table
[LOST_TICK_MAX
+1] = {
920 [LOST_TICK_DISCARD
] = "discard",
921 [LOST_TICK_DELAY
] = "delay",
922 [LOST_TICK_MERGE
] = "merge",
923 [LOST_TICK_SLEW
] = "slew",
924 [LOST_TICK_MAX
] = NULL
,
927 QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy
) != sizeof(int));
929 static void get_enum(Object
*obj
, Visitor
*v
, void *opaque
,
930 const char *name
, Error
**errp
)
932 DeviceState
*dev
= DEVICE(obj
);
933 Property
*prop
= opaque
;
934 int *ptr
= qdev_get_prop_ptr(dev
, prop
);
936 visit_type_enum(v
, ptr
, prop
->info
->enum_table
,
937 prop
->info
->name
, prop
->name
, errp
);
940 static void set_enum(Object
*obj
, Visitor
*v
, void *opaque
,
941 const char *name
, Error
**errp
)
943 DeviceState
*dev
= DEVICE(obj
);
944 Property
*prop
= opaque
;
945 int *ptr
= qdev_get_prop_ptr(dev
, prop
);
947 if (dev
->state
!= DEV_STATE_CREATED
) {
948 error_set(errp
, QERR_PERMISSION_DENIED
);
952 visit_type_enum(v
, ptr
, prop
->info
->enum_table
,
953 prop
->info
->name
, prop
->name
, errp
);
956 PropertyInfo qdev_prop_losttickpolicy
= {
957 .name
= "LostTickPolicy",
958 .type
= PROP_TYPE_LOSTTICKPOLICY
,
959 .size
= sizeof(LostTickPolicy
),
960 .enum_table
= lost_tick_policy_table
,
965 /* --- pci address --- */
968 * bus-local address, i.e. "$slot" or "$slot.$fn"
970 static int parse_pci_devfn(DeviceState
*dev
, Property
*prop
, const char *str
)
972 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
973 unsigned int slot
, fn
, n
;
975 if (sscanf(str
, "%x.%x%n", &slot
, &fn
, &n
) != 2) {
977 if (sscanf(str
, "%x%n", &slot
, &n
) != 1) {
987 *ptr
= slot
<< 3 | fn
;
991 static int print_pci_devfn(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
993 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
996 return snprintf(dest
, len
, "<unset>");
998 return snprintf(dest
, len
, "%02x.%x", *ptr
>> 3, *ptr
& 7);
1002 static void get_pci_devfn(Object
*obj
, Visitor
*v
, void *opaque
,
1003 const char *name
, Error
**errp
)
1005 DeviceState
*dev
= DEVICE(obj
);
1006 Property
*prop
= opaque
;
1007 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
1013 snprintf(buffer
, sizeof(buffer
), "%02x.%x", *ptr
>> 3, *ptr
& 7);
1015 visit_type_str(v
, &p
, name
, errp
);
1018 PropertyInfo qdev_prop_pci_devfn
= {
1019 .name
= "pci-devfn",
1020 .type
= PROP_TYPE_UINT32
,
1021 .size
= sizeof(uint32_t),
1022 .parse
= parse_pci_devfn
,
1023 .print
= print_pci_devfn
,
1024 .get
= get_pci_devfn
,
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(DeviceState
*dev
, const char *name
, void *src
, enum PropertyType type
)
1111 prop
= qdev_prop_find(dev
, name
);
1113 fprintf(stderr
, "%s: property \"%s.%s\" not found\n",
1114 __FUNCTION__
, object_get_typename(OBJECT(dev
)), name
);
1117 if (prop
->info
->type
!= type
) {
1118 fprintf(stderr
, "%s: property \"%s.%s\" type mismatch\n",
1119 __FUNCTION__
, object_get_typename(OBJECT(dev
)), name
);
1122 qdev_prop_cpy(dev
, prop
, src
);
1125 void qdev_prop_set_bit(DeviceState
*dev
, const char *name
, bool value
)
1127 qdev_prop_set(dev
, name
, &value
, PROP_TYPE_BIT
);
1130 void qdev_prop_set_uint8(DeviceState
*dev
, const char *name
, uint8_t value
)
1132 qdev_prop_set(dev
, name
, &value
, PROP_TYPE_UINT8
);
1135 void qdev_prop_set_uint16(DeviceState
*dev
, const char *name
, uint16_t value
)
1137 qdev_prop_set(dev
, name
, &value
, PROP_TYPE_UINT16
);
1140 void qdev_prop_set_uint32(DeviceState
*dev
, const char *name
, uint32_t value
)
1142 qdev_prop_set(dev
, name
, &value
, PROP_TYPE_UINT32
);
1145 void qdev_prop_set_int32(DeviceState
*dev
, const char *name
, int32_t value
)
1147 qdev_prop_set(dev
, name
, &value
, PROP_TYPE_INT32
);
1150 void qdev_prop_set_uint64(DeviceState
*dev
, const char *name
, uint64_t value
)
1152 qdev_prop_set(dev
, name
, &value
, PROP_TYPE_UINT64
);
1155 void qdev_prop_set_string(DeviceState
*dev
, const char *name
, char *value
)
1157 qdev_prop_set(dev
, name
, &value
, PROP_TYPE_STRING
);
1160 int qdev_prop_set_drive(DeviceState
*dev
, const char *name
, BlockDriverState
*value
)
1164 res
= bdrv_attach_dev(value
, dev
);
1166 error_report("Can't attach drive %s to %s.%s: %s",
1167 bdrv_get_device_name(value
),
1168 dev
->id
? dev
->id
: object_get_typename(OBJECT(dev
)),
1169 name
, strerror(-res
));
1172 qdev_prop_set(dev
, name
, &value
, PROP_TYPE_DRIVE
);
1176 void qdev_prop_set_drive_nofail(DeviceState
*dev
, const char *name
, BlockDriverState
*value
)
1178 if (qdev_prop_set_drive(dev
, name
, value
) < 0) {
1182 void qdev_prop_set_chr(DeviceState
*dev
, const char *name
, CharDriverState
*value
)
1184 qdev_prop_set(dev
, name
, &value
, PROP_TYPE_CHR
);
1187 void qdev_prop_set_netdev(DeviceState
*dev
, const char *name
, VLANClientState
*value
)
1189 qdev_prop_set(dev
, name
, &value
, PROP_TYPE_NETDEV
);
1192 void qdev_prop_set_vlan(DeviceState
*dev
, const char *name
, VLANState
*value
)
1194 qdev_prop_set(dev
, name
, &value
, PROP_TYPE_VLAN
);
1197 void qdev_prop_set_macaddr(DeviceState
*dev
, const char *name
, uint8_t *value
)
1199 qdev_prop_set(dev
, name
, value
, PROP_TYPE_MACADDR
);
1202 void qdev_prop_set_losttickpolicy(DeviceState
*dev
, const char *name
,
1203 LostTickPolicy
*value
)
1205 qdev_prop_set(dev
, name
, value
, PROP_TYPE_LOSTTICKPOLICY
);
1208 void qdev_prop_set_ptr(DeviceState
*dev
, const char *name
, void *value
)
1210 qdev_prop_set(dev
, name
, &value
, PROP_TYPE_PTR
);
1213 void qdev_prop_set_defaults(DeviceState
*dev
, Property
*props
)
1217 while (props
->name
) {
1218 if (props
->defval
) {
1219 qdev_prop_cpy(dev
, props
, props
->defval
);
1225 static QTAILQ_HEAD(, GlobalProperty
) global_props
= QTAILQ_HEAD_INITIALIZER(global_props
);
1227 static void qdev_prop_register_global(GlobalProperty
*prop
)
1229 QTAILQ_INSERT_TAIL(&global_props
, prop
, next
);
1232 void qdev_prop_register_global_list(GlobalProperty
*props
)
1236 for (i
= 0; props
[i
].driver
!= NULL
; i
++) {
1237 qdev_prop_register_global(props
+i
);
1241 void qdev_prop_set_globals(DeviceState
*dev
)
1243 GlobalProperty
*prop
;
1245 QTAILQ_FOREACH(prop
, &global_props
, next
) {
1246 if (strcmp(object_get_typename(OBJECT(dev
)), prop
->driver
) != 0 &&
1247 strcmp(qdev_get_bus_info(dev
)->name
, prop
->driver
) != 0) {
1250 if (qdev_prop_parse(dev
, prop
->property
, prop
->value
) != 0) {
1256 static int qdev_add_one_global(QemuOpts
*opts
, void *opaque
)
1260 g
= g_malloc0(sizeof(*g
));
1261 g
->driver
= qemu_opt_get(opts
, "driver");
1262 g
->property
= qemu_opt_get(opts
, "property");
1263 g
->value
= qemu_opt_get(opts
, "value");
1264 qdev_prop_register_global(g
);
1268 void qemu_add_globals(void)
1270 qemu_opts_foreach(qemu_find_opts("global"), qdev_add_one_global
, NULL
, 0);