6 void *qdev_get_prop_ptr(DeviceState
*dev
, Property
*prop
)
13 static uint32_t qdev_get_prop_mask(Property
*prop
)
15 assert(prop
->info
== &qdev_prop_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
);
31 static int print_bit(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
33 uint32_t *p
= qdev_get_prop_ptr(dev
, prop
);
34 return snprintf(dest
, len
, (*p
& qdev_get_prop_mask(prop
)) ? "on" : "off");
37 static void get_bit(Object
*obj
, Visitor
*v
, void *opaque
,
38 const char *name
, Error
**errp
)
40 DeviceState
*dev
= DEVICE(obj
);
41 Property
*prop
= opaque
;
42 uint32_t *p
= qdev_get_prop_ptr(dev
, prop
);
43 bool value
= (*p
& qdev_get_prop_mask(prop
)) != 0;
45 visit_type_bool(v
, &value
, name
, errp
);
48 static void set_bit(Object
*obj
, Visitor
*v
, void *opaque
,
49 const char *name
, Error
**errp
)
51 DeviceState
*dev
= DEVICE(obj
);
52 Property
*prop
= opaque
;
53 Error
*local_err
= NULL
;
56 if (dev
->state
!= DEV_STATE_CREATED
) {
57 error_set(errp
, QERR_PERMISSION_DENIED
);
61 visit_type_bool(v
, &value
, name
, &local_err
);
63 error_propagate(errp
, local_err
);
66 bit_prop_set(dev
, prop
, value
);
69 PropertyInfo qdev_prop_bit
= {
71 .legacy_name
= "on/off",
77 /* --- 8bit integer --- */
79 static void get_uint8(Object
*obj
, Visitor
*v
, void *opaque
,
80 const char *name
, Error
**errp
)
82 DeviceState
*dev
= DEVICE(obj
);
83 Property
*prop
= opaque
;
84 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
86 visit_type_uint8(v
, ptr
, name
, errp
);
89 static void set_uint8(Object
*obj
, Visitor
*v
, void *opaque
,
90 const char *name
, Error
**errp
)
92 DeviceState
*dev
= DEVICE(obj
);
93 Property
*prop
= opaque
;
94 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
96 if (dev
->state
!= DEV_STATE_CREATED
) {
97 error_set(errp
, QERR_PERMISSION_DENIED
);
101 visit_type_uint8(v
, ptr
, name
, errp
);
104 PropertyInfo qdev_prop_uint8
= {
110 /* --- 8bit hex value --- */
112 static int parse_hex8(DeviceState
*dev
, Property
*prop
, const char *str
)
114 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
117 if (str
[0] != '0' || str
[1] != 'x') {
121 *ptr
= strtoul(str
, &end
, 16);
122 if ((*end
!= '\0') || (end
== str
)) {
129 static int print_hex8(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
131 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
132 return snprintf(dest
, len
, "0x%" PRIx8
, *ptr
);
135 PropertyInfo qdev_prop_hex8
= {
137 .legacy_name
= "hex8",
144 /* --- 16bit integer --- */
146 static void get_uint16(Object
*obj
, Visitor
*v
, void *opaque
,
147 const char *name
, Error
**errp
)
149 DeviceState
*dev
= DEVICE(obj
);
150 Property
*prop
= opaque
;
151 uint16_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
153 visit_type_uint16(v
, ptr
, name
, errp
);
156 static void set_uint16(Object
*obj
, Visitor
*v
, void *opaque
,
157 const char *name
, Error
**errp
)
159 DeviceState
*dev
= DEVICE(obj
);
160 Property
*prop
= opaque
;
161 uint16_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
163 if (dev
->state
!= DEV_STATE_CREATED
) {
164 error_set(errp
, QERR_PERMISSION_DENIED
);
168 visit_type_uint16(v
, ptr
, name
, errp
);
171 PropertyInfo qdev_prop_uint16
= {
177 /* --- 32bit integer --- */
179 static void get_uint32(Object
*obj
, Visitor
*v
, void *opaque
,
180 const char *name
, Error
**errp
)
182 DeviceState
*dev
= DEVICE(obj
);
183 Property
*prop
= opaque
;
184 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
186 visit_type_uint32(v
, ptr
, name
, errp
);
189 static void set_uint32(Object
*obj
, Visitor
*v
, void *opaque
,
190 const char *name
, Error
**errp
)
192 DeviceState
*dev
= DEVICE(obj
);
193 Property
*prop
= opaque
;
194 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
196 if (dev
->state
!= DEV_STATE_CREATED
) {
197 error_set(errp
, QERR_PERMISSION_DENIED
);
201 visit_type_uint32(v
, ptr
, name
, errp
);
204 static void get_int32(Object
*obj
, Visitor
*v
, void *opaque
,
205 const char *name
, Error
**errp
)
207 DeviceState
*dev
= DEVICE(obj
);
208 Property
*prop
= opaque
;
209 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
211 visit_type_int32(v
, ptr
, name
, errp
);
214 static void set_int32(Object
*obj
, Visitor
*v
, void *opaque
,
215 const char *name
, Error
**errp
)
217 DeviceState
*dev
= DEVICE(obj
);
218 Property
*prop
= opaque
;
219 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
221 if (dev
->state
!= DEV_STATE_CREATED
) {
222 error_set(errp
, QERR_PERMISSION_DENIED
);
226 visit_type_int32(v
, ptr
, name
, errp
);
229 PropertyInfo qdev_prop_uint32
= {
235 PropertyInfo qdev_prop_int32
= {
241 /* --- 32bit hex value --- */
243 static int parse_hex32(DeviceState
*dev
, Property
*prop
, const char *str
)
245 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
248 if (str
[0] != '0' || str
[1] != 'x') {
252 *ptr
= strtoul(str
, &end
, 16);
253 if ((*end
!= '\0') || (end
== str
)) {
260 static int print_hex32(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
262 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
263 return snprintf(dest
, len
, "0x%" PRIx32
, *ptr
);
266 PropertyInfo qdev_prop_hex32
= {
268 .legacy_name
= "hex32",
269 .parse
= parse_hex32
,
270 .print
= print_hex32
,
275 /* --- 64bit integer --- */
277 static void get_uint64(Object
*obj
, Visitor
*v
, void *opaque
,
278 const char *name
, Error
**errp
)
280 DeviceState
*dev
= DEVICE(obj
);
281 Property
*prop
= opaque
;
282 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
284 visit_type_uint64(v
, ptr
, name
, errp
);
287 static void set_uint64(Object
*obj
, Visitor
*v
, void *opaque
,
288 const char *name
, Error
**errp
)
290 DeviceState
*dev
= DEVICE(obj
);
291 Property
*prop
= opaque
;
292 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
294 if (dev
->state
!= DEV_STATE_CREATED
) {
295 error_set(errp
, QERR_PERMISSION_DENIED
);
299 visit_type_uint64(v
, ptr
, name
, errp
);
302 PropertyInfo qdev_prop_uint64
= {
308 /* --- 64bit hex value --- */
310 static int parse_hex64(DeviceState
*dev
, Property
*prop
, const char *str
)
312 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
315 if (str
[0] != '0' || str
[1] != 'x') {
319 *ptr
= strtoull(str
, &end
, 16);
320 if ((*end
!= '\0') || (end
== str
)) {
327 static int print_hex64(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
329 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
330 return snprintf(dest
, len
, "0x%" PRIx64
, *ptr
);
333 PropertyInfo qdev_prop_hex64
= {
335 .legacy_name
= "hex64",
336 .parse
= parse_hex64
,
337 .print
= print_hex64
,
344 static void release_string(Object
*obj
, const char *name
, void *opaque
)
346 Property
*prop
= opaque
;
347 g_free(*(char **)qdev_get_prop_ptr(DEVICE(obj
), prop
));
350 static int print_string(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
352 char **ptr
= qdev_get_prop_ptr(dev
, prop
);
354 return snprintf(dest
, len
, "<null>");
355 return snprintf(dest
, len
, "\"%s\"", *ptr
);
358 static void get_string(Object
*obj
, Visitor
*v
, void *opaque
,
359 const char *name
, Error
**errp
)
361 DeviceState
*dev
= DEVICE(obj
);
362 Property
*prop
= opaque
;
363 char **ptr
= qdev_get_prop_ptr(dev
, prop
);
366 char *str
= (char *)"";
367 visit_type_str(v
, &str
, name
, errp
);
369 visit_type_str(v
, ptr
, name
, errp
);
373 static void set_string(Object
*obj
, Visitor
*v
, void *opaque
,
374 const char *name
, Error
**errp
)
376 DeviceState
*dev
= DEVICE(obj
);
377 Property
*prop
= opaque
;
378 char **ptr
= qdev_get_prop_ptr(dev
, prop
);
379 Error
*local_err
= NULL
;
382 if (dev
->state
!= DEV_STATE_CREATED
) {
383 error_set(errp
, QERR_PERMISSION_DENIED
);
387 visit_type_str(v
, &str
, name
, &local_err
);
389 error_propagate(errp
, local_err
);
398 PropertyInfo qdev_prop_string
= {
400 .print
= print_string
,
401 .release
= release_string
,
408 static int parse_drive(DeviceState
*dev
, const char *str
, void **ptr
)
410 BlockDriverState
*bs
;
415 if (bdrv_attach_dev(bs
, dev
) < 0)
421 static void release_drive(Object
*obj
, const char *name
, void *opaque
)
423 DeviceState
*dev
= DEVICE(obj
);
424 Property
*prop
= opaque
;
425 BlockDriverState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
428 bdrv_detach_dev(*ptr
, dev
);
429 blockdev_auto_del(*ptr
);
433 static const char *print_drive(void *ptr
)
435 return bdrv_get_device_name(ptr
);
438 static void get_pointer(Object
*obj
, Visitor
*v
, Property
*prop
,
439 const char *(*print
)(void *ptr
),
440 const char *name
, Error
**errp
)
442 DeviceState
*dev
= DEVICE(obj
);
443 void **ptr
= qdev_get_prop_ptr(dev
, prop
);
446 p
= (char *) (*ptr
? print(*ptr
) : "");
447 visit_type_str(v
, &p
, name
, errp
);
450 static void set_pointer(Object
*obj
, Visitor
*v
, Property
*prop
,
451 int (*parse
)(DeviceState
*dev
, const char *str
, void **ptr
),
452 const char *name
, Error
**errp
)
454 DeviceState
*dev
= DEVICE(obj
);
455 Error
*local_err
= NULL
;
456 void **ptr
= qdev_get_prop_ptr(dev
, prop
);
460 if (dev
->state
!= DEV_STATE_CREATED
) {
461 error_set(errp
, QERR_PERMISSION_DENIED
);
465 visit_type_str(v
, &str
, name
, &local_err
);
467 error_propagate(errp
, local_err
);
475 ret
= parse(dev
, str
, ptr
);
476 error_set_from_qdev_prop_error(errp
, ret
, dev
, prop
, str
);
480 static void get_drive(Object
*obj
, Visitor
*v
, void *opaque
,
481 const char *name
, Error
**errp
)
483 get_pointer(obj
, v
, opaque
, print_drive
, name
, errp
);
486 static void set_drive(Object
*obj
, Visitor
*v
, void *opaque
,
487 const char *name
, Error
**errp
)
489 set_pointer(obj
, v
, opaque
, parse_drive
, name
, errp
);
492 PropertyInfo qdev_prop_drive
= {
496 .release
= release_drive
,
499 /* --- character device --- */
501 static int parse_chr(DeviceState
*dev
, const char *str
, void **ptr
)
503 CharDriverState
*chr
= qemu_chr_find(str
);
507 if (chr
->avail_connections
< 1) {
511 --chr
->avail_connections
;
515 static void release_chr(Object
*obj
, const char *name
, void *opaque
)
517 DeviceState
*dev
= DEVICE(obj
);
518 Property
*prop
= opaque
;
519 CharDriverState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
522 qemu_chr_add_handlers(*ptr
, NULL
, NULL
, NULL
, NULL
);
527 static const char *print_chr(void *ptr
)
529 CharDriverState
*chr
= ptr
;
531 return chr
->label
? chr
->label
: "";
534 static void get_chr(Object
*obj
, Visitor
*v
, void *opaque
,
535 const char *name
, Error
**errp
)
537 get_pointer(obj
, v
, opaque
, print_chr
, name
, errp
);
540 static void set_chr(Object
*obj
, Visitor
*v
, void *opaque
,
541 const char *name
, Error
**errp
)
543 set_pointer(obj
, v
, opaque
, parse_chr
, name
, errp
);
546 PropertyInfo qdev_prop_chr
= {
550 .release
= release_chr
,
553 /* --- netdev device --- */
555 static int parse_netdev(DeviceState
*dev
, const char *str
, void **ptr
)
557 VLANClientState
*netdev
= qemu_find_netdev(str
);
559 if (netdev
== NULL
) {
569 static const char *print_netdev(void *ptr
)
571 VLANClientState
*netdev
= ptr
;
573 return netdev
->name
? netdev
->name
: "";
576 static void get_netdev(Object
*obj
, Visitor
*v
, void *opaque
,
577 const char *name
, Error
**errp
)
579 get_pointer(obj
, v
, opaque
, print_netdev
, name
, errp
);
582 static void set_netdev(Object
*obj
, Visitor
*v
, void *opaque
,
583 const char *name
, Error
**errp
)
585 set_pointer(obj
, v
, opaque
, parse_netdev
, name
, errp
);
588 PropertyInfo qdev_prop_netdev
= {
596 static int print_vlan(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
598 VLANState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
601 return snprintf(dest
, len
, "%d", (*ptr
)->id
);
603 return snprintf(dest
, len
, "<null>");
607 static void get_vlan(Object
*obj
, Visitor
*v
, void *opaque
,
608 const char *name
, Error
**errp
)
610 DeviceState
*dev
= DEVICE(obj
);
611 Property
*prop
= opaque
;
612 VLANState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
615 id
= *ptr
? (*ptr
)->id
: -1;
616 visit_type_int64(v
, &id
, name
, errp
);
619 static void set_vlan(Object
*obj
, Visitor
*v
, void *opaque
,
620 const char *name
, Error
**errp
)
622 DeviceState
*dev
= DEVICE(obj
);
623 Property
*prop
= opaque
;
624 VLANState
**ptr
= qdev_get_prop_ptr(dev
, prop
);
625 Error
*local_err
= NULL
;
629 if (dev
->state
!= DEV_STATE_CREATED
) {
630 error_set(errp
, QERR_PERMISSION_DENIED
);
634 visit_type_int64(v
, &id
, name
, &local_err
);
636 error_propagate(errp
, local_err
);
643 vlan
= qemu_find_vlan(id
, 1);
645 error_set(errp
, QERR_INVALID_PARAMETER_VALUE
,
646 name
, prop
->info
->name
);
652 PropertyInfo qdev_prop_vlan
= {
659 /* --- pointer --- */
661 /* Not a proper property, just for dirty hacks. TODO Remove it! */
662 PropertyInfo qdev_prop_ptr
= {
666 /* --- mac address --- */
669 * accepted syntax versions:
673 static void get_mac(Object
*obj
, Visitor
*v
, void *opaque
,
674 const char *name
, Error
**errp
)
676 DeviceState
*dev
= DEVICE(obj
);
677 Property
*prop
= opaque
;
678 MACAddr
*mac
= qdev_get_prop_ptr(dev
, prop
);
679 char buffer
[2 * 6 + 5 + 1];
682 snprintf(buffer
, sizeof(buffer
), "%02x:%02x:%02x:%02x:%02x:%02x",
683 mac
->a
[0], mac
->a
[1], mac
->a
[2],
684 mac
->a
[3], mac
->a
[4], mac
->a
[5]);
686 visit_type_str(v
, &p
, name
, errp
);
689 static void set_mac(Object
*obj
, Visitor
*v
, void *opaque
,
690 const char *name
, Error
**errp
)
692 DeviceState
*dev
= DEVICE(obj
);
693 Property
*prop
= opaque
;
694 MACAddr
*mac
= qdev_get_prop_ptr(dev
, prop
);
695 Error
*local_err
= NULL
;
699 if (dev
->state
!= DEV_STATE_CREATED
) {
700 error_set(errp
, QERR_PERMISSION_DENIED
);
704 visit_type_str(v
, &str
, name
, &local_err
);
706 error_propagate(errp
, local_err
);
710 for (i
= 0, pos
= 0; i
< 6; i
++, pos
+= 3) {
711 if (!qemu_isxdigit(str
[pos
]))
713 if (!qemu_isxdigit(str
[pos
+1]))
716 if (str
[pos
+2] != '\0')
719 if (str
[pos
+2] != ':' && str
[pos
+2] != '-')
722 mac
->a
[i
] = strtol(str
+pos
, &p
, 16);
728 error_set_from_qdev_prop_error(errp
, EINVAL
, dev
, prop
, str
);
732 PropertyInfo qdev_prop_macaddr
= {
739 /* --- lost tick policy --- */
741 static const char *lost_tick_policy_table
[LOST_TICK_MAX
+1] = {
742 [LOST_TICK_DISCARD
] = "discard",
743 [LOST_TICK_DELAY
] = "delay",
744 [LOST_TICK_MERGE
] = "merge",
745 [LOST_TICK_SLEW
] = "slew",
746 [LOST_TICK_MAX
] = NULL
,
749 QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy
) != sizeof(int));
751 static void get_enum(Object
*obj
, Visitor
*v
, void *opaque
,
752 const char *name
, Error
**errp
)
754 DeviceState
*dev
= DEVICE(obj
);
755 Property
*prop
= opaque
;
756 int *ptr
= qdev_get_prop_ptr(dev
, prop
);
758 visit_type_enum(v
, ptr
, prop
->info
->enum_table
,
759 prop
->info
->name
, prop
->name
, errp
);
762 static void set_enum(Object
*obj
, Visitor
*v
, void *opaque
,
763 const char *name
, Error
**errp
)
765 DeviceState
*dev
= DEVICE(obj
);
766 Property
*prop
= opaque
;
767 int *ptr
= qdev_get_prop_ptr(dev
, prop
);
769 if (dev
->state
!= DEV_STATE_CREATED
) {
770 error_set(errp
, QERR_PERMISSION_DENIED
);
774 visit_type_enum(v
, ptr
, prop
->info
->enum_table
,
775 prop
->info
->name
, prop
->name
, errp
);
778 PropertyInfo qdev_prop_losttickpolicy
= {
779 .name
= "LostTickPolicy",
780 .enum_table
= lost_tick_policy_table
,
785 /* --- pci address --- */
788 * bus-local address, i.e. "$slot" or "$slot.$fn"
790 static void set_pci_devfn(Object
*obj
, Visitor
*v
, void *opaque
,
791 const char *name
, Error
**errp
)
793 DeviceState
*dev
= DEVICE(obj
);
794 Property
*prop
= opaque
;
795 int32_t value
, *ptr
= qdev_get_prop_ptr(dev
, prop
);
796 unsigned int slot
, fn
, n
;
797 Error
*local_err
= NULL
;
800 if (dev
->state
!= DEV_STATE_CREATED
) {
801 error_set(errp
, QERR_PERMISSION_DENIED
);
805 visit_type_str(v
, &str
, name
, &local_err
);
807 error_free(local_err
);
809 visit_type_int32(v
, &value
, name
, &local_err
);
811 error_propagate(errp
, local_err
);
812 } else if (value
< -1 || value
> 255) {
813 error_set(errp
, QERR_INVALID_PARAMETER_VALUE
, name
? name
: "null",
821 if (sscanf(str
, "%x.%x%n", &slot
, &fn
, &n
) != 2) {
823 if (sscanf(str
, "%x%n", &slot
, &n
) != 1) {
827 if (str
[n
] != '\0' || fn
> 7 || slot
> 31) {
830 *ptr
= slot
<< 3 | fn
;
835 error_set_from_qdev_prop_error(errp
, EINVAL
, dev
, prop
, str
);
839 static int print_pci_devfn(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
841 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
844 return snprintf(dest
, len
, "<unset>");
846 return snprintf(dest
, len
, "%02x.%x", *ptr
>> 3, *ptr
& 7);
850 PropertyInfo qdev_prop_pci_devfn
= {
852 .legacy_name
= "pci-devfn",
853 .print
= print_pci_devfn
,
855 .set
= set_pci_devfn
,
858 /* --- blocksize --- */
860 static void set_blocksize(Object
*obj
, Visitor
*v
, void *opaque
,
861 const char *name
, Error
**errp
)
863 DeviceState
*dev
= DEVICE(obj
);
864 Property
*prop
= opaque
;
865 uint16_t value
, *ptr
= qdev_get_prop_ptr(dev
, prop
);
866 Error
*local_err
= NULL
;
867 const int64_t min
= 512;
868 const int64_t max
= 32768;
870 if (dev
->state
!= DEV_STATE_CREATED
) {
871 error_set(errp
, QERR_PERMISSION_DENIED
);
875 visit_type_uint16(v
, &value
, name
, &local_err
);
877 error_propagate(errp
, local_err
);
880 if (value
< min
|| value
> max
) {
881 error_set(errp
, QERR_PROPERTY_VALUE_OUT_OF_RANGE
,
882 dev
->id
?:"", name
, (int64_t)value
, min
, max
);
886 /* We rely on power-of-2 blocksizes for bitmasks */
887 if ((value
& (value
- 1)) != 0) {
888 error_set(errp
, QERR_PROPERTY_VALUE_NOT_POWER_OF_2
,
889 dev
->id
?:"", name
, (int64_t)value
);
896 PropertyInfo qdev_prop_blocksize
= {
899 .set
= set_blocksize
,
902 /* --- pci host address --- */
904 static void get_pci_host_devaddr(Object
*obj
, Visitor
*v
, void *opaque
,
905 const char *name
, Error
**errp
)
907 DeviceState
*dev
= DEVICE(obj
);
908 Property
*prop
= opaque
;
909 PCIHostDeviceAddress
*addr
= qdev_get_prop_ptr(dev
, prop
);
910 char buffer
[] = "xxxx:xx:xx.x";
914 rc
= snprintf(buffer
, sizeof(buffer
), "%04x:%02x:%02x.%d",
915 addr
->domain
, addr
->bus
, addr
->slot
, addr
->function
);
916 assert(rc
== sizeof(buffer
) - 1);
918 visit_type_str(v
, &p
, name
, errp
);
922 * Parse [<domain>:]<bus>:<slot>.<func>
923 * if <domain> is not supplied, it's assumed to be 0.
925 static void set_pci_host_devaddr(Object
*obj
, Visitor
*v
, void *opaque
,
926 const char *name
, Error
**errp
)
928 DeviceState
*dev
= DEVICE(obj
);
929 Property
*prop
= opaque
;
930 PCIHostDeviceAddress
*addr
= qdev_get_prop_ptr(dev
, prop
);
931 Error
*local_err
= NULL
;
935 unsigned long dom
= 0, bus
= 0;
936 unsigned int slot
= 0, func
= 0;
938 if (dev
->state
!= DEV_STATE_CREATED
) {
939 error_set(errp
, QERR_PERMISSION_DENIED
);
943 visit_type_str(v
, &str
, name
, &local_err
);
945 error_propagate(errp
, local_err
);
950 val
= strtoul(p
, &e
, 16);
951 if (e
== p
|| *e
!= ':') {
957 val
= strtoul(p
, &e
, 16);
965 val
= strtoul(p
, &e
, 16);
976 val
= strtoul(p
, &e
, 10);
982 if (dom
> 0xffff || bus
> 0xff || slot
> 0x1f || func
> 7) {
993 addr
->function
= func
;
999 error_set_from_qdev_prop_error(errp
, EINVAL
, dev
, prop
, str
);
1003 PropertyInfo qdev_prop_pci_host_devaddr
= {
1004 .name
= "pci-host-devaddr",
1005 .get
= get_pci_host_devaddr
,
1006 .set
= set_pci_host_devaddr
,
1009 /* --- public helpers --- */
1011 static Property
*qdev_prop_walk(Property
*props
, const char *name
)
1015 while (props
->name
) {
1016 if (strcmp(props
->name
, name
) == 0)
1023 static Property
*qdev_prop_find(DeviceState
*dev
, const char *name
)
1028 /* device properties */
1029 class = object_get_class(OBJECT(dev
));
1031 prop
= qdev_prop_walk(DEVICE_CLASS(class)->props
, name
);
1035 class = object_class_get_parent(class);
1036 } while (class != object_class_by_name(TYPE_DEVICE
));
1041 void error_set_from_qdev_prop_error(Error
**errp
, int ret
, DeviceState
*dev
,
1042 Property
*prop
, const char *value
)
1046 error_set(errp
, QERR_PROPERTY_VALUE_IN_USE
,
1047 object_get_typename(OBJECT(dev
)), prop
->name
, value
);
1051 error_set(errp
, QERR_PROPERTY_VALUE_BAD
,
1052 object_get_typename(OBJECT(dev
)), prop
->name
, value
);
1055 error_set(errp
, QERR_PROPERTY_VALUE_NOT_FOUND
,
1056 object_get_typename(OBJECT(dev
)), prop
->name
, value
);
1063 int qdev_prop_parse(DeviceState
*dev
, const char *name
, const char *value
)
1068 legacy_name
= g_strdup_printf("legacy-%s", name
);
1069 if (object_property_get_type(OBJECT(dev
), legacy_name
, NULL
)) {
1070 object_property_parse(OBJECT(dev
), value
, legacy_name
, &err
);
1072 object_property_parse(OBJECT(dev
), value
, name
, &err
);
1074 g_free(legacy_name
);
1077 qerror_report_err(err
);
1084 void qdev_prop_set_bit(DeviceState
*dev
, const char *name
, bool value
)
1087 object_property_set_bool(OBJECT(dev
), value
, name
, &errp
);
1088 assert_no_error(errp
);
1091 void qdev_prop_set_uint8(DeviceState
*dev
, const char *name
, uint8_t value
)
1094 object_property_set_int(OBJECT(dev
), value
, name
, &errp
);
1095 assert_no_error(errp
);
1098 void qdev_prop_set_uint16(DeviceState
*dev
, const char *name
, uint16_t value
)
1101 object_property_set_int(OBJECT(dev
), value
, name
, &errp
);
1102 assert_no_error(errp
);
1105 void qdev_prop_set_uint32(DeviceState
*dev
, const char *name
, uint32_t value
)
1108 object_property_set_int(OBJECT(dev
), value
, name
, &errp
);
1109 assert_no_error(errp
);
1112 void qdev_prop_set_int32(DeviceState
*dev
, const char *name
, int32_t value
)
1115 object_property_set_int(OBJECT(dev
), value
, name
, &errp
);
1116 assert_no_error(errp
);
1119 void qdev_prop_set_uint64(DeviceState
*dev
, const char *name
, uint64_t value
)
1122 object_property_set_int(OBJECT(dev
), value
, name
, &errp
);
1123 assert_no_error(errp
);
1126 void qdev_prop_set_string(DeviceState
*dev
, const char *name
, char *value
)
1129 object_property_set_str(OBJECT(dev
), value
, name
, &errp
);
1130 assert_no_error(errp
);
1133 int qdev_prop_set_drive(DeviceState
*dev
, const char *name
, BlockDriverState
*value
)
1136 const char *bdrv_name
= value
? bdrv_get_device_name(value
) : "";
1137 object_property_set_str(OBJECT(dev
), bdrv_name
,
1140 qerror_report_err(errp
);
1147 void qdev_prop_set_drive_nofail(DeviceState
*dev
, const char *name
, BlockDriverState
*value
)
1149 if (qdev_prop_set_drive(dev
, name
, value
) < 0) {
1153 void qdev_prop_set_chr(DeviceState
*dev
, const char *name
, CharDriverState
*value
)
1156 assert(!value
|| value
->label
);
1157 object_property_set_str(OBJECT(dev
),
1158 value
? value
->label
: "", name
, &errp
);
1159 assert_no_error(errp
);
1162 void qdev_prop_set_netdev(DeviceState
*dev
, const char *name
, VLANClientState
*value
)
1165 assert(!value
|| value
->name
);
1166 object_property_set_str(OBJECT(dev
),
1167 value
? value
->name
: "", name
, &errp
);
1168 assert_no_error(errp
);
1171 void qdev_prop_set_vlan(DeviceState
*dev
, const char *name
, VLANState
*value
)
1174 object_property_set_int(OBJECT(dev
), value
? value
->id
: -1, name
, &errp
);
1175 assert_no_error(errp
);
1178 void qdev_prop_set_macaddr(DeviceState
*dev
, const char *name
, uint8_t *value
)
1181 char str
[2 * 6 + 5 + 1];
1182 snprintf(str
, sizeof(str
), "%02x:%02x:%02x:%02x:%02x:%02x",
1183 value
[0], value
[1], value
[2], value
[3], value
[4], value
[5]);
1185 object_property_set_str(OBJECT(dev
), str
, name
, &errp
);
1186 assert_no_error(errp
);
1189 void qdev_prop_set_enum(DeviceState
*dev
, const char *name
, int value
)
1194 prop
= qdev_prop_find(dev
, name
);
1195 object_property_set_str(OBJECT(dev
), prop
->info
->enum_table
[value
],
1197 assert_no_error(errp
);
1200 void qdev_prop_set_ptr(DeviceState
*dev
, const char *name
, void *value
)
1205 prop
= qdev_prop_find(dev
, name
);
1206 assert(prop
&& prop
->info
== &qdev_prop_ptr
);
1207 ptr
= qdev_get_prop_ptr(dev
, prop
);
1211 static QTAILQ_HEAD(, GlobalProperty
) global_props
= QTAILQ_HEAD_INITIALIZER(global_props
);
1213 static void qdev_prop_register_global(GlobalProperty
*prop
)
1215 QTAILQ_INSERT_TAIL(&global_props
, prop
, next
);
1218 void qdev_prop_register_global_list(GlobalProperty
*props
)
1222 for (i
= 0; props
[i
].driver
!= NULL
; i
++) {
1223 qdev_prop_register_global(props
+i
);
1227 void qdev_prop_set_globals(DeviceState
*dev
)
1229 ObjectClass
*class = object_get_class(OBJECT(dev
));
1232 GlobalProperty
*prop
;
1233 QTAILQ_FOREACH(prop
, &global_props
, next
) {
1234 if (strcmp(object_class_get_name(class), prop
->driver
) != 0) {
1237 if (qdev_prop_parse(dev
, prop
->property
, prop
->value
) != 0) {
1241 class = object_class_get_parent(class);
1245 static int qdev_add_one_global(QemuOpts
*opts
, void *opaque
)
1249 g
= g_malloc0(sizeof(*g
));
1250 g
->driver
= qemu_opt_get(opts
, "driver");
1251 g
->property
= qemu_opt_get(opts
, "property");
1252 g
->value
= qemu_opt_get(opts
, "value");
1253 qdev_prop_register_global(g
);
1257 void qemu_add_globals(void)
1259 qemu_opts_foreach(qemu_find_opts("global"), qdev_add_one_global
, NULL
, 0);