5 #include "hw/block-common.h"
7 #include "qapi/qapi-visit-core.h"
9 void *qdev_get_prop_ptr(DeviceState
*dev
, Property
*prop
)
16 static void get_enum(Object
*obj
, Visitor
*v
, void *opaque
,
17 const char *name
, Error
**errp
)
19 DeviceState
*dev
= DEVICE(obj
);
20 Property
*prop
= opaque
;
21 int *ptr
= qdev_get_prop_ptr(dev
, prop
);
23 visit_type_enum(v
, ptr
, prop
->info
->enum_table
,
24 prop
->info
->name
, prop
->name
, errp
);
27 static void set_enum(Object
*obj
, Visitor
*v
, void *opaque
,
28 const char *name
, Error
**errp
)
30 DeviceState
*dev
= DEVICE(obj
);
31 Property
*prop
= opaque
;
32 int *ptr
= qdev_get_prop_ptr(dev
, prop
);
34 if (dev
->state
!= DEV_STATE_CREATED
) {
35 error_set(errp
, QERR_PERMISSION_DENIED
);
39 visit_type_enum(v
, ptr
, prop
->info
->enum_table
,
40 prop
->info
->name
, prop
->name
, errp
);
45 static uint32_t qdev_get_prop_mask(Property
*prop
)
47 assert(prop
->info
== &qdev_prop_bit
);
48 return 0x1 << prop
->bitnr
;
51 static void bit_prop_set(DeviceState
*dev
, Property
*props
, bool val
)
53 uint32_t *p
= qdev_get_prop_ptr(dev
, props
);
54 uint32_t mask
= qdev_get_prop_mask(props
);
62 static int print_bit(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
64 uint32_t *p
= qdev_get_prop_ptr(dev
, prop
);
65 return snprintf(dest
, len
, (*p
& qdev_get_prop_mask(prop
)) ? "on" : "off");
68 static void get_bit(Object
*obj
, Visitor
*v
, void *opaque
,
69 const char *name
, Error
**errp
)
71 DeviceState
*dev
= DEVICE(obj
);
72 Property
*prop
= opaque
;
73 uint32_t *p
= qdev_get_prop_ptr(dev
, prop
);
74 bool value
= (*p
& qdev_get_prop_mask(prop
)) != 0;
76 visit_type_bool(v
, &value
, name
, errp
);
79 static void set_bit(Object
*obj
, Visitor
*v
, void *opaque
,
80 const char *name
, Error
**errp
)
82 DeviceState
*dev
= DEVICE(obj
);
83 Property
*prop
= opaque
;
84 Error
*local_err
= NULL
;
87 if (dev
->state
!= DEV_STATE_CREATED
) {
88 error_set(errp
, QERR_PERMISSION_DENIED
);
92 visit_type_bool(v
, &value
, name
, &local_err
);
94 error_propagate(errp
, local_err
);
97 bit_prop_set(dev
, prop
, value
);
100 PropertyInfo qdev_prop_bit
= {
102 .legacy_name
= "on/off",
108 /* --- 8bit integer --- */
110 static void get_uint8(Object
*obj
, Visitor
*v
, void *opaque
,
111 const char *name
, Error
**errp
)
113 DeviceState
*dev
= DEVICE(obj
);
114 Property
*prop
= opaque
;
115 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
117 visit_type_uint8(v
, ptr
, name
, errp
);
120 static void set_uint8(Object
*obj
, Visitor
*v
, void *opaque
,
121 const char *name
, Error
**errp
)
123 DeviceState
*dev
= DEVICE(obj
);
124 Property
*prop
= opaque
;
125 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
127 if (dev
->state
!= DEV_STATE_CREATED
) {
128 error_set(errp
, QERR_PERMISSION_DENIED
);
132 visit_type_uint8(v
, ptr
, name
, errp
);
135 PropertyInfo qdev_prop_uint8
= {
141 /* --- 8bit hex value --- */
143 static int parse_hex8(DeviceState
*dev
, Property
*prop
, const char *str
)
145 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
148 if (str
[0] != '0' || str
[1] != 'x') {
152 *ptr
= strtoul(str
, &end
, 16);
153 if ((*end
!= '\0') || (end
== str
)) {
160 static int print_hex8(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
162 uint8_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
163 return snprintf(dest
, len
, "0x%" PRIx8
, *ptr
);
166 PropertyInfo qdev_prop_hex8
= {
168 .legacy_name
= "hex8",
175 /* --- 16bit integer --- */
177 static void get_uint16(Object
*obj
, Visitor
*v
, void *opaque
,
178 const char *name
, Error
**errp
)
180 DeviceState
*dev
= DEVICE(obj
);
181 Property
*prop
= opaque
;
182 uint16_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
184 visit_type_uint16(v
, ptr
, name
, errp
);
187 static void set_uint16(Object
*obj
, Visitor
*v
, void *opaque
,
188 const char *name
, Error
**errp
)
190 DeviceState
*dev
= DEVICE(obj
);
191 Property
*prop
= opaque
;
192 uint16_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
194 if (dev
->state
!= DEV_STATE_CREATED
) {
195 error_set(errp
, QERR_PERMISSION_DENIED
);
199 visit_type_uint16(v
, ptr
, name
, errp
);
202 PropertyInfo qdev_prop_uint16
= {
208 /* --- 32bit integer --- */
210 static void get_uint32(Object
*obj
, Visitor
*v
, void *opaque
,
211 const char *name
, Error
**errp
)
213 DeviceState
*dev
= DEVICE(obj
);
214 Property
*prop
= opaque
;
215 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
217 visit_type_uint32(v
, ptr
, name
, errp
);
220 static void set_uint32(Object
*obj
, Visitor
*v
, void *opaque
,
221 const char *name
, Error
**errp
)
223 DeviceState
*dev
= DEVICE(obj
);
224 Property
*prop
= opaque
;
225 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
227 if (dev
->state
!= DEV_STATE_CREATED
) {
228 error_set(errp
, QERR_PERMISSION_DENIED
);
232 visit_type_uint32(v
, ptr
, name
, errp
);
235 static void get_int32(Object
*obj
, Visitor
*v
, void *opaque
,
236 const char *name
, Error
**errp
)
238 DeviceState
*dev
= DEVICE(obj
);
239 Property
*prop
= opaque
;
240 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
242 visit_type_int32(v
, ptr
, name
, errp
);
245 static void set_int32(Object
*obj
, Visitor
*v
, void *opaque
,
246 const char *name
, Error
**errp
)
248 DeviceState
*dev
= DEVICE(obj
);
249 Property
*prop
= opaque
;
250 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
252 if (dev
->state
!= DEV_STATE_CREATED
) {
253 error_set(errp
, QERR_PERMISSION_DENIED
);
257 visit_type_int32(v
, ptr
, name
, errp
);
260 PropertyInfo qdev_prop_uint32
= {
266 PropertyInfo qdev_prop_int32
= {
272 /* --- 32bit hex value --- */
274 static int parse_hex32(DeviceState
*dev
, Property
*prop
, const char *str
)
276 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
279 if (str
[0] != '0' || str
[1] != 'x') {
283 *ptr
= strtoul(str
, &end
, 16);
284 if ((*end
!= '\0') || (end
== str
)) {
291 static int print_hex32(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
293 uint32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
294 return snprintf(dest
, len
, "0x%" PRIx32
, *ptr
);
297 PropertyInfo qdev_prop_hex32
= {
299 .legacy_name
= "hex32",
300 .parse
= parse_hex32
,
301 .print
= print_hex32
,
306 /* --- 64bit integer --- */
308 static void get_uint64(Object
*obj
, Visitor
*v
, void *opaque
,
309 const char *name
, Error
**errp
)
311 DeviceState
*dev
= DEVICE(obj
);
312 Property
*prop
= opaque
;
313 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
315 visit_type_uint64(v
, ptr
, name
, errp
);
318 static void set_uint64(Object
*obj
, Visitor
*v
, void *opaque
,
319 const char *name
, Error
**errp
)
321 DeviceState
*dev
= DEVICE(obj
);
322 Property
*prop
= opaque
;
323 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
325 if (dev
->state
!= DEV_STATE_CREATED
) {
326 error_set(errp
, QERR_PERMISSION_DENIED
);
330 visit_type_uint64(v
, ptr
, name
, errp
);
333 PropertyInfo qdev_prop_uint64
= {
339 /* --- 64bit hex value --- */
341 static int parse_hex64(DeviceState
*dev
, Property
*prop
, const char *str
)
343 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
346 if (str
[0] != '0' || str
[1] != 'x') {
350 *ptr
= strtoull(str
, &end
, 16);
351 if ((*end
!= '\0') || (end
== str
)) {
358 static int print_hex64(DeviceState
*dev
, Property
*prop
, char *dest
, size_t len
)
360 uint64_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
361 return snprintf(dest
, len
, "0x%" PRIx64
, *ptr
);
364 PropertyInfo qdev_prop_hex64
= {
366 .legacy_name
= "hex64",
367 .parse
= parse_hex64
,
368 .print
= print_hex64
,
375 static void release_string(Object
*obj
, const char *name
, void *opaque
)
377 Property
*prop
= opaque
;
378 g_free(*(char **)qdev_get_prop_ptr(DEVICE(obj
), prop
));
381 static int print_string(DeviceState
*dev
, Property
*prop
, char *dest
,
384 char **ptr
= qdev_get_prop_ptr(dev
, prop
);
386 return snprintf(dest
, len
, "<null>");
388 return snprintf(dest
, len
, "\"%s\"", *ptr
);
391 static void get_string(Object
*obj
, Visitor
*v
, void *opaque
,
392 const char *name
, Error
**errp
)
394 DeviceState
*dev
= DEVICE(obj
);
395 Property
*prop
= opaque
;
396 char **ptr
= qdev_get_prop_ptr(dev
, prop
);
399 char *str
= (char *)"";
400 visit_type_str(v
, &str
, name
, errp
);
402 visit_type_str(v
, ptr
, name
, errp
);
406 static void set_string(Object
*obj
, Visitor
*v
, void *opaque
,
407 const char *name
, Error
**errp
)
409 DeviceState
*dev
= DEVICE(obj
);
410 Property
*prop
= opaque
;
411 char **ptr
= qdev_get_prop_ptr(dev
, prop
);
412 Error
*local_err
= NULL
;
415 if (dev
->state
!= DEV_STATE_CREATED
) {
416 error_set(errp
, QERR_PERMISSION_DENIED
);
420 visit_type_str(v
, &str
, name
, &local_err
);
422 error_propagate(errp
, local_err
);
431 PropertyInfo qdev_prop_string
= {
433 .print
= print_string
,
434 .release
= release_string
,
439 /* --- pointer --- */
441 /* Not a proper property, just for dirty hacks. TODO Remove it! */
442 PropertyInfo qdev_prop_ptr
= {
446 /* --- mac address --- */
449 * accepted syntax versions:
453 static void get_mac(Object
*obj
, Visitor
*v
, void *opaque
,
454 const char *name
, Error
**errp
)
456 DeviceState
*dev
= DEVICE(obj
);
457 Property
*prop
= opaque
;
458 MACAddr
*mac
= qdev_get_prop_ptr(dev
, prop
);
459 char buffer
[2 * 6 + 5 + 1];
462 snprintf(buffer
, sizeof(buffer
), "%02x:%02x:%02x:%02x:%02x:%02x",
463 mac
->a
[0], mac
->a
[1], mac
->a
[2],
464 mac
->a
[3], mac
->a
[4], mac
->a
[5]);
466 visit_type_str(v
, &p
, name
, errp
);
469 static void set_mac(Object
*obj
, Visitor
*v
, void *opaque
,
470 const char *name
, Error
**errp
)
472 DeviceState
*dev
= DEVICE(obj
);
473 Property
*prop
= opaque
;
474 MACAddr
*mac
= qdev_get_prop_ptr(dev
, prop
);
475 Error
*local_err
= NULL
;
479 if (dev
->state
!= DEV_STATE_CREATED
) {
480 error_set(errp
, QERR_PERMISSION_DENIED
);
484 visit_type_str(v
, &str
, name
, &local_err
);
486 error_propagate(errp
, local_err
);
490 for (i
= 0, pos
= 0; i
< 6; i
++, pos
+= 3) {
491 if (!qemu_isxdigit(str
[pos
])) {
494 if (!qemu_isxdigit(str
[pos
+1])) {
498 if (str
[pos
+2] != '\0') {
502 if (str
[pos
+2] != ':' && str
[pos
+2] != '-') {
506 mac
->a
[i
] = strtol(str
+pos
, &p
, 16);
512 error_set_from_qdev_prop_error(errp
, EINVAL
, dev
, prop
, str
);
516 PropertyInfo qdev_prop_macaddr
= {
522 /* --- lost tick policy --- */
524 static const char *lost_tick_policy_table
[LOST_TICK_MAX
+1] = {
525 [LOST_TICK_DISCARD
] = "discard",
526 [LOST_TICK_DELAY
] = "delay",
527 [LOST_TICK_MERGE
] = "merge",
528 [LOST_TICK_SLEW
] = "slew",
529 [LOST_TICK_MAX
] = NULL
,
532 QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy
) != sizeof(int));
534 PropertyInfo qdev_prop_losttickpolicy
= {
535 .name
= "LostTickPolicy",
536 .enum_table
= lost_tick_policy_table
,
541 /* --- BIOS CHS translation */
543 static const char *bios_chs_trans_table
[] = {
544 [BIOS_ATA_TRANSLATION_AUTO
] = "auto",
545 [BIOS_ATA_TRANSLATION_NONE
] = "none",
546 [BIOS_ATA_TRANSLATION_LBA
] = "lba",
549 PropertyInfo qdev_prop_bios_chs_trans
= {
550 .name
= "bios-chs-trans",
551 .enum_table
= bios_chs_trans_table
,
556 /* --- pci address --- */
559 * bus-local address, i.e. "$slot" or "$slot.$fn"
561 static void set_pci_devfn(Object
*obj
, Visitor
*v
, void *opaque
,
562 const char *name
, Error
**errp
)
564 DeviceState
*dev
= DEVICE(obj
);
565 Property
*prop
= opaque
;
566 int32_t value
, *ptr
= qdev_get_prop_ptr(dev
, prop
);
567 unsigned int slot
, fn
, n
;
568 Error
*local_err
= NULL
;
571 if (dev
->state
!= DEV_STATE_CREATED
) {
572 error_set(errp
, QERR_PERMISSION_DENIED
);
576 visit_type_str(v
, &str
, name
, &local_err
);
578 error_free(local_err
);
580 visit_type_int32(v
, &value
, name
, &local_err
);
582 error_propagate(errp
, local_err
);
583 } else if (value
< -1 || value
> 255) {
584 error_set(errp
, QERR_INVALID_PARAMETER_VALUE
, name
? name
: "null",
592 if (sscanf(str
, "%x.%x%n", &slot
, &fn
, &n
) != 2) {
594 if (sscanf(str
, "%x%n", &slot
, &n
) != 1) {
598 if (str
[n
] != '\0' || fn
> 7 || slot
> 31) {
601 *ptr
= slot
<< 3 | fn
;
606 error_set_from_qdev_prop_error(errp
, EINVAL
, dev
, prop
, str
);
610 static int print_pci_devfn(DeviceState
*dev
, Property
*prop
, char *dest
,
613 int32_t *ptr
= qdev_get_prop_ptr(dev
, prop
);
616 return snprintf(dest
, len
, "<unset>");
618 return snprintf(dest
, len
, "%02x.%x", *ptr
>> 3, *ptr
& 7);
622 PropertyInfo qdev_prop_pci_devfn
= {
624 .legacy_name
= "pci-devfn",
625 .print
= print_pci_devfn
,
627 .set
= set_pci_devfn
,
630 /* --- blocksize --- */
632 static void set_blocksize(Object
*obj
, Visitor
*v
, void *opaque
,
633 const char *name
, Error
**errp
)
635 DeviceState
*dev
= DEVICE(obj
);
636 Property
*prop
= opaque
;
637 uint16_t value
, *ptr
= qdev_get_prop_ptr(dev
, prop
);
638 Error
*local_err
= NULL
;
639 const int64_t min
= 512;
640 const int64_t max
= 32768;
642 if (dev
->state
!= DEV_STATE_CREATED
) {
643 error_set(errp
, QERR_PERMISSION_DENIED
);
647 visit_type_uint16(v
, &value
, name
, &local_err
);
649 error_propagate(errp
, local_err
);
652 if (value
< min
|| value
> max
) {
653 error_set(errp
, QERR_PROPERTY_VALUE_OUT_OF_RANGE
,
654 dev
->id
?:"", name
, (int64_t)value
, min
, max
);
658 /* We rely on power-of-2 blocksizes for bitmasks */
659 if ((value
& (value
- 1)) != 0) {
660 error_set(errp
, QERR_PROPERTY_VALUE_NOT_POWER_OF_2
,
661 dev
->id
?:"", name
, (int64_t)value
);
668 PropertyInfo qdev_prop_blocksize
= {
671 .set
= set_blocksize
,
674 /* --- pci host address --- */
676 static void get_pci_host_devaddr(Object
*obj
, Visitor
*v
, void *opaque
,
677 const char *name
, Error
**errp
)
679 DeviceState
*dev
= DEVICE(obj
);
680 Property
*prop
= opaque
;
681 PCIHostDeviceAddress
*addr
= qdev_get_prop_ptr(dev
, prop
);
682 char buffer
[] = "xxxx:xx:xx.x";
686 rc
= snprintf(buffer
, sizeof(buffer
), "%04x:%02x:%02x.%d",
687 addr
->domain
, addr
->bus
, addr
->slot
, addr
->function
);
688 assert(rc
== sizeof(buffer
) - 1);
690 visit_type_str(v
, &p
, name
, errp
);
694 * Parse [<domain>:]<bus>:<slot>.<func>
695 * if <domain> is not supplied, it's assumed to be 0.
697 static void set_pci_host_devaddr(Object
*obj
, Visitor
*v
, void *opaque
,
698 const char *name
, Error
**errp
)
700 DeviceState
*dev
= DEVICE(obj
);
701 Property
*prop
= opaque
;
702 PCIHostDeviceAddress
*addr
= qdev_get_prop_ptr(dev
, prop
);
703 Error
*local_err
= NULL
;
707 unsigned long dom
= 0, bus
= 0;
708 unsigned int slot
= 0, func
= 0;
710 if (dev
->state
!= DEV_STATE_CREATED
) {
711 error_set(errp
, QERR_PERMISSION_DENIED
);
715 visit_type_str(v
, &str
, name
, &local_err
);
717 error_propagate(errp
, local_err
);
722 val
= strtoul(p
, &e
, 16);
723 if (e
== p
|| *e
!= ':') {
729 val
= strtoul(p
, &e
, 16);
737 val
= strtoul(p
, &e
, 16);
748 val
= strtoul(p
, &e
, 10);
754 if (dom
> 0xffff || bus
> 0xff || slot
> 0x1f || func
> 7) {
765 addr
->function
= func
;
771 error_set_from_qdev_prop_error(errp
, EINVAL
, dev
, prop
, str
);
775 PropertyInfo qdev_prop_pci_host_devaddr
= {
776 .name
= "pci-host-devaddr",
777 .get
= get_pci_host_devaddr
,
778 .set
= set_pci_host_devaddr
,
781 /* --- public helpers --- */
783 static Property
*qdev_prop_walk(Property
*props
, const char *name
)
788 while (props
->name
) {
789 if (strcmp(props
->name
, name
) == 0) {
797 static Property
*qdev_prop_find(DeviceState
*dev
, const char *name
)
802 /* device properties */
803 class = object_get_class(OBJECT(dev
));
805 prop
= qdev_prop_walk(DEVICE_CLASS(class)->props
, name
);
809 class = object_class_get_parent(class);
810 } while (class != object_class_by_name(TYPE_DEVICE
));
815 void error_set_from_qdev_prop_error(Error
**errp
, int ret
, DeviceState
*dev
,
816 Property
*prop
, const char *value
)
820 error_set(errp
, QERR_PROPERTY_VALUE_IN_USE
,
821 object_get_typename(OBJECT(dev
)), prop
->name
, value
);
825 error_set(errp
, QERR_PROPERTY_VALUE_BAD
,
826 object_get_typename(OBJECT(dev
)), prop
->name
, value
);
829 error_set(errp
, QERR_PROPERTY_VALUE_NOT_FOUND
,
830 object_get_typename(OBJECT(dev
)), prop
->name
, value
);
837 int qdev_prop_parse(DeviceState
*dev
, const char *name
, const char *value
)
842 legacy_name
= g_strdup_printf("legacy-%s", name
);
843 if (object_property_get_type(OBJECT(dev
), legacy_name
, NULL
)) {
844 object_property_parse(OBJECT(dev
), value
, legacy_name
, &err
);
846 object_property_parse(OBJECT(dev
), value
, name
, &err
);
851 qerror_report_err(err
);
858 void qdev_prop_set_bit(DeviceState
*dev
, const char *name
, bool value
)
861 object_property_set_bool(OBJECT(dev
), value
, name
, &errp
);
862 assert_no_error(errp
);
865 void qdev_prop_set_uint8(DeviceState
*dev
, const char *name
, uint8_t value
)
868 object_property_set_int(OBJECT(dev
), value
, name
, &errp
);
869 assert_no_error(errp
);
872 void qdev_prop_set_uint16(DeviceState
*dev
, const char *name
, uint16_t value
)
875 object_property_set_int(OBJECT(dev
), value
, name
, &errp
);
876 assert_no_error(errp
);
879 void qdev_prop_set_uint32(DeviceState
*dev
, const char *name
, uint32_t value
)
882 object_property_set_int(OBJECT(dev
), value
, name
, &errp
);
883 assert_no_error(errp
);
886 void qdev_prop_set_int32(DeviceState
*dev
, const char *name
, int32_t value
)
889 object_property_set_int(OBJECT(dev
), value
, name
, &errp
);
890 assert_no_error(errp
);
893 void qdev_prop_set_uint64(DeviceState
*dev
, const char *name
, uint64_t value
)
896 object_property_set_int(OBJECT(dev
), value
, name
, &errp
);
897 assert_no_error(errp
);
900 void qdev_prop_set_string(DeviceState
*dev
, const char *name
, const char *value
)
903 object_property_set_str(OBJECT(dev
), value
, name
, &errp
);
904 assert_no_error(errp
);
907 void qdev_prop_set_macaddr(DeviceState
*dev
, const char *name
, uint8_t *value
)
910 char str
[2 * 6 + 5 + 1];
911 snprintf(str
, sizeof(str
), "%02x:%02x:%02x:%02x:%02x:%02x",
912 value
[0], value
[1], value
[2], value
[3], value
[4], value
[5]);
914 object_property_set_str(OBJECT(dev
), str
, name
, &errp
);
915 assert_no_error(errp
);
918 void qdev_prop_set_enum(DeviceState
*dev
, const char *name
, int value
)
923 prop
= qdev_prop_find(dev
, name
);
924 object_property_set_str(OBJECT(dev
), prop
->info
->enum_table
[value
],
926 assert_no_error(errp
);
929 void qdev_prop_set_ptr(DeviceState
*dev
, const char *name
, void *value
)
934 prop
= qdev_prop_find(dev
, name
);
935 assert(prop
&& prop
->info
== &qdev_prop_ptr
);
936 ptr
= qdev_get_prop_ptr(dev
, prop
);
940 static QTAILQ_HEAD(, GlobalProperty
) global_props
=
941 QTAILQ_HEAD_INITIALIZER(global_props
);
943 void qdev_prop_register_global(GlobalProperty
*prop
)
945 QTAILQ_INSERT_TAIL(&global_props
, prop
, next
);
948 void qdev_prop_register_global_list(GlobalProperty
*props
)
952 for (i
= 0; props
[i
].driver
!= NULL
; i
++) {
953 qdev_prop_register_global(props
+i
);
957 void qdev_prop_set_globals(DeviceState
*dev
)
959 ObjectClass
*class = object_get_class(OBJECT(dev
));
962 GlobalProperty
*prop
;
963 QTAILQ_FOREACH(prop
, &global_props
, next
) {
964 if (strcmp(object_class_get_name(class), prop
->driver
) != 0) {
967 if (qdev_prop_parse(dev
, prop
->property
, prop
->value
) != 0) {
971 class = object_class_get_parent(class);