2 * Dynamic device configuration and creation.
4 * Copyright (c) 2009 CodeSourcery
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
20 /* The theory here is that it should be possible to create a machine without
21 knowledge of specific devices. Historically board init routines have
22 passed a bunch of arguments to each device, requiring the board know
23 exactly which device it is dealing with. This file provides an abstract
24 API for device configuration and initialization. Devices will generally
25 inherit from a particular bus (e.g. PCI or I2C) rather than
28 #include "qemu/osdep.h"
30 #include "sysemu/sysemu.h"
31 #include "qapi/error.h"
32 #include "qapi/qapi-events-misc.h"
33 #include "qapi/qmp/qerror.h"
34 #include "qapi/visitor.h"
35 #include "qemu/error-report.h"
36 #include "qemu/option.h"
37 #include "hw/hotplug.h"
38 #include "hw/boards.h"
39 #include "hw/sysbus.h"
41 bool qdev_hotplug
= false;
42 static bool qdev_hot_added
= false;
43 bool qdev_hot_removed
= false;
45 const VMStateDescription
*qdev_get_vmsd(DeviceState
*dev
)
47 DeviceClass
*dc
= DEVICE_GET_CLASS(dev
);
51 static void bus_remove_child(BusState
*bus
, DeviceState
*child
)
55 QTAILQ_FOREACH(kid
, &bus
->children
, sibling
) {
56 if (kid
->child
== child
) {
59 snprintf(name
, sizeof(name
), "child[%d]", kid
->index
);
60 QTAILQ_REMOVE(&bus
->children
, kid
, sibling
);
62 /* This gives back ownership of kid->child back to us. */
63 object_property_del(OBJECT(bus
), name
, NULL
);
64 object_unref(OBJECT(kid
->child
));
71 static void bus_add_child(BusState
*bus
, DeviceState
*child
)
74 BusChild
*kid
= g_malloc0(sizeof(*kid
));
76 kid
->index
= bus
->max_index
++;
78 object_ref(OBJECT(kid
->child
));
80 QTAILQ_INSERT_HEAD(&bus
->children
, kid
, sibling
);
82 /* This transfers ownership of kid->child to the property. */
83 snprintf(name
, sizeof(name
), "child[%d]", kid
->index
);
84 object_property_add_link(OBJECT(bus
), name
,
85 object_get_typename(OBJECT(child
)),
86 (Object
**)&kid
->child
,
87 NULL
, /* read-only property */
88 0, /* return ownership on prop deletion */
92 void qdev_set_parent_bus(DeviceState
*dev
, BusState
*bus
)
94 bool replugging
= dev
->parent_bus
!= NULL
;
97 /* Keep a reference to the device while it's not plugged into
98 * any bus, to avoid it potentially evaporating when it is
99 * dereffed in bus_remove_child().
101 object_ref(OBJECT(dev
));
102 bus_remove_child(dev
->parent_bus
, dev
);
103 object_unref(OBJECT(dev
->parent_bus
));
105 dev
->parent_bus
= bus
;
106 object_ref(OBJECT(bus
));
107 bus_add_child(bus
, dev
);
109 object_unref(OBJECT(dev
));
113 /* Create a new device. This only initializes the device state
114 structure and allows properties to be set. The device still needs
115 to be realized. See qdev-core.h. */
116 DeviceState
*qdev_create(BusState
*bus
, const char *name
)
120 dev
= qdev_try_create(bus
, name
);
123 error_report("Unknown device '%s' for bus '%s'", name
,
124 object_get_typename(OBJECT(bus
)));
126 error_report("Unknown device '%s' for default sysbus", name
);
134 DeviceState
*qdev_try_create(BusState
*bus
, const char *type
)
138 if (object_class_by_name(type
) == NULL
) {
141 dev
= DEVICE(object_new(type
));
147 /* Assert that the device really is a SysBusDevice before
148 * we put it onto the sysbus. Non-sysbus devices which aren't
149 * being put onto a bus should be created with object_new(TYPE_FOO),
150 * not qdev_create(NULL, TYPE_FOO).
152 g_assert(object_dynamic_cast(OBJECT(dev
), TYPE_SYS_BUS_DEVICE
));
153 bus
= sysbus_get_default();
156 qdev_set_parent_bus(dev
, bus
);
157 object_unref(OBJECT(dev
));
161 static QTAILQ_HEAD(device_listeners
, DeviceListener
) device_listeners
162 = QTAILQ_HEAD_INITIALIZER(device_listeners
);
164 enum ListenerDirection
{ Forward
, Reverse
};
166 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \
168 DeviceListener *_listener; \
170 switch (_direction) { \
172 QTAILQ_FOREACH(_listener, &device_listeners, link) { \
173 if (_listener->_callback) { \
174 _listener->_callback(_listener, ##_args); \
179 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \
180 device_listeners, link) { \
181 if (_listener->_callback) { \
182 _listener->_callback(_listener, ##_args); \
191 static int device_listener_add(DeviceState
*dev
, void *opaque
)
193 DEVICE_LISTENER_CALL(realize
, Forward
, dev
);
198 void device_listener_register(DeviceListener
*listener
)
200 QTAILQ_INSERT_TAIL(&device_listeners
, listener
, link
);
202 qbus_walk_children(sysbus_get_default(), NULL
, NULL
, device_listener_add
,
206 void device_listener_unregister(DeviceListener
*listener
)
208 QTAILQ_REMOVE(&device_listeners
, listener
, link
);
211 static void device_realize(DeviceState
*dev
, Error
**errp
)
213 DeviceClass
*dc
= DEVICE_GET_CLASS(dev
);
216 int rc
= dc
->init(dev
);
218 error_setg(errp
, "Device initialization failed.");
224 static void device_unrealize(DeviceState
*dev
, Error
**errp
)
226 DeviceClass
*dc
= DEVICE_GET_CLASS(dev
);
229 int rc
= dc
->exit(dev
);
231 error_setg(errp
, "Device exit failed.");
237 void qdev_set_legacy_instance_id(DeviceState
*dev
, int alias_id
,
238 int required_for_version
)
240 assert(!dev
->realized
);
241 dev
->instance_id_alias
= alias_id
;
242 dev
->alias_required_for_version
= required_for_version
;
245 HotplugHandler
*qdev_get_machine_hotplug_handler(DeviceState
*dev
)
247 MachineState
*machine
;
249 Object
*m_obj
= qdev_get_machine();
251 if (object_dynamic_cast(m_obj
, TYPE_MACHINE
)) {
252 machine
= MACHINE(m_obj
);
253 mc
= MACHINE_GET_CLASS(machine
);
254 if (mc
->get_hotplug_handler
) {
255 return mc
->get_hotplug_handler(machine
, dev
);
262 HotplugHandler
*qdev_get_hotplug_handler(DeviceState
*dev
)
264 HotplugHandler
*hotplug_ctrl
;
266 if (dev
->parent_bus
&& dev
->parent_bus
->hotplug_handler
) {
267 hotplug_ctrl
= dev
->parent_bus
->hotplug_handler
;
269 hotplug_ctrl
= qdev_get_machine_hotplug_handler(dev
);
274 static int qdev_reset_one(DeviceState
*dev
, void *opaque
)
281 static int qbus_reset_one(BusState
*bus
, void *opaque
)
283 BusClass
*bc
= BUS_GET_CLASS(bus
);
290 void qdev_reset_all(DeviceState
*dev
)
292 qdev_walk_children(dev
, NULL
, NULL
, qdev_reset_one
, qbus_reset_one
, NULL
);
295 void qdev_reset_all_fn(void *opaque
)
297 qdev_reset_all(DEVICE(opaque
));
300 void qbus_reset_all(BusState
*bus
)
302 qbus_walk_children(bus
, NULL
, NULL
, qdev_reset_one
, qbus_reset_one
, NULL
);
305 void qbus_reset_all_fn(void *opaque
)
307 BusState
*bus
= opaque
;
311 /* can be used as ->unplug() callback for the simple cases */
312 void qdev_simple_device_unplug_cb(HotplugHandler
*hotplug_dev
,
313 DeviceState
*dev
, Error
**errp
)
316 object_unparent(OBJECT(dev
));
321 * Device properties should be set before calling this function. IRQs
322 * and MMIO regions should be connected/mapped after calling this
324 * On failure, report an error with error_report() and terminate the
325 * program. This is okay during machine creation. Don't use for
326 * hotplug, because there callers need to recover from failure.
327 * Exception: if you know the device's init() callback can't fail,
328 * then qdev_init_nofail() can't fail either, and is therefore usable
329 * even then. But relying on the device implementation that way is
330 * somewhat unclean, and best avoided.
332 void qdev_init_nofail(DeviceState
*dev
)
336 assert(!dev
->realized
);
338 object_ref(OBJECT(dev
));
339 object_property_set_bool(OBJECT(dev
), true, "realized", &err
);
341 error_reportf_err(err
, "Initialization of device %s failed: ",
342 object_get_typename(OBJECT(dev
)));
345 object_unref(OBJECT(dev
));
348 void qdev_machine_creation_done(void)
351 * ok, initial machine setup is done, starting from now we can
352 * only create hotpluggable devices
357 bool qdev_machine_modified(void)
359 return qdev_hot_added
|| qdev_hot_removed
;
362 BusState
*qdev_get_parent_bus(DeviceState
*dev
)
364 return dev
->parent_bus
;
367 static NamedGPIOList
*qdev_get_named_gpio_list(DeviceState
*dev
,
372 QLIST_FOREACH(ngl
, &dev
->gpios
, node
) {
373 /* NULL is a valid and matchable name, otherwise do a normal
376 if ((!ngl
->name
&& !name
) ||
377 (name
&& ngl
->name
&& strcmp(name
, ngl
->name
) == 0)) {
382 ngl
= g_malloc0(sizeof(*ngl
));
383 ngl
->name
= g_strdup(name
);
384 QLIST_INSERT_HEAD(&dev
->gpios
, ngl
, node
);
388 void qdev_init_gpio_in_named_with_opaque(DeviceState
*dev
,
389 qemu_irq_handler handler
,
391 const char *name
, int n
)
394 NamedGPIOList
*gpio_list
= qdev_get_named_gpio_list(dev
, name
);
396 assert(gpio_list
->num_out
== 0 || !name
);
397 gpio_list
->in
= qemu_extend_irqs(gpio_list
->in
, gpio_list
->num_in
, handler
,
401 name
= "unnamed-gpio-in";
403 for (i
= gpio_list
->num_in
; i
< gpio_list
->num_in
+ n
; i
++) {
404 gchar
*propname
= g_strdup_printf("%s[%u]", name
, i
);
406 object_property_add_child(OBJECT(dev
), propname
,
407 OBJECT(gpio_list
->in
[i
]), &error_abort
);
411 gpio_list
->num_in
+= n
;
414 void qdev_init_gpio_in(DeviceState
*dev
, qemu_irq_handler handler
, int n
)
416 qdev_init_gpio_in_named(dev
, handler
, NULL
, n
);
419 void qdev_init_gpio_out_named(DeviceState
*dev
, qemu_irq
*pins
,
420 const char *name
, int n
)
423 NamedGPIOList
*gpio_list
= qdev_get_named_gpio_list(dev
, name
);
425 assert(gpio_list
->num_in
== 0 || !name
);
428 name
= "unnamed-gpio-out";
430 memset(pins
, 0, sizeof(*pins
) * n
);
431 for (i
= 0; i
< n
; ++i
) {
432 gchar
*propname
= g_strdup_printf("%s[%u]", name
,
433 gpio_list
->num_out
+ i
);
435 object_property_add_link(OBJECT(dev
), propname
, TYPE_IRQ
,
437 object_property_allow_set_link
,
438 OBJ_PROP_LINK_UNREF_ON_RELEASE
,
442 gpio_list
->num_out
+= n
;
445 void qdev_init_gpio_out(DeviceState
*dev
, qemu_irq
*pins
, int n
)
447 qdev_init_gpio_out_named(dev
, pins
, NULL
, n
);
450 qemu_irq
qdev_get_gpio_in_named(DeviceState
*dev
, const char *name
, int n
)
452 NamedGPIOList
*gpio_list
= qdev_get_named_gpio_list(dev
, name
);
454 assert(n
>= 0 && n
< gpio_list
->num_in
);
455 return gpio_list
->in
[n
];
458 qemu_irq
qdev_get_gpio_in(DeviceState
*dev
, int n
)
460 return qdev_get_gpio_in_named(dev
, NULL
, n
);
463 void qdev_connect_gpio_out_named(DeviceState
*dev
, const char *name
, int n
,
466 char *propname
= g_strdup_printf("%s[%d]",
467 name
? name
: "unnamed-gpio-out", n
);
469 /* We need a name for object_property_set_link to work. If the
470 * object has a parent, object_property_add_child will come back
471 * with an error without doing anything. If it has none, it will
472 * never fail. So we can just call it with a NULL Error pointer.
474 object_property_add_child(container_get(qdev_get_machine(),
476 "non-qdev-gpio[*]", OBJECT(pin
), NULL
);
478 object_property_set_link(OBJECT(dev
), OBJECT(pin
), propname
, &error_abort
);
482 qemu_irq
qdev_get_gpio_out_connector(DeviceState
*dev
, const char *name
, int n
)
484 char *propname
= g_strdup_printf("%s[%d]",
485 name
? name
: "unnamed-gpio-out", n
);
487 qemu_irq ret
= (qemu_irq
)object_property_get_link(OBJECT(dev
), propname
,
493 /* disconnect a GPIO output, returning the disconnected input (if any) */
495 static qemu_irq
qdev_disconnect_gpio_out_named(DeviceState
*dev
,
496 const char *name
, int n
)
498 char *propname
= g_strdup_printf("%s[%d]",
499 name
? name
: "unnamed-gpio-out", n
);
501 qemu_irq ret
= (qemu_irq
)object_property_get_link(OBJECT(dev
), propname
,
504 object_property_set_link(OBJECT(dev
), NULL
, propname
, NULL
);
510 qemu_irq
qdev_intercept_gpio_out(DeviceState
*dev
, qemu_irq icpt
,
511 const char *name
, int n
)
513 qemu_irq disconnected
= qdev_disconnect_gpio_out_named(dev
, name
, n
);
514 qdev_connect_gpio_out_named(dev
, name
, n
, icpt
);
518 void qdev_connect_gpio_out(DeviceState
* dev
, int n
, qemu_irq pin
)
520 qdev_connect_gpio_out_named(dev
, NULL
, n
, pin
);
523 void qdev_pass_gpios(DeviceState
*dev
, DeviceState
*container
,
527 NamedGPIOList
*ngl
= qdev_get_named_gpio_list(dev
, name
);
529 for (i
= 0; i
< ngl
->num_in
; i
++) {
530 const char *nm
= ngl
->name
? ngl
->name
: "unnamed-gpio-in";
531 char *propname
= g_strdup_printf("%s[%d]", nm
, i
);
533 object_property_add_alias(OBJECT(container
), propname
,
534 OBJECT(dev
), propname
,
538 for (i
= 0; i
< ngl
->num_out
; i
++) {
539 const char *nm
= ngl
->name
? ngl
->name
: "unnamed-gpio-out";
540 char *propname
= g_strdup_printf("%s[%d]", nm
, i
);
542 object_property_add_alias(OBJECT(container
), propname
,
543 OBJECT(dev
), propname
,
547 QLIST_REMOVE(ngl
, node
);
548 QLIST_INSERT_HEAD(&container
->gpios
, ngl
, node
);
551 BusState
*qdev_get_child_bus(DeviceState
*dev
, const char *name
)
554 Object
*child
= object_resolve_path_component(OBJECT(dev
), name
);
556 bus
= (BusState
*)object_dynamic_cast(child
, TYPE_BUS
);
561 QLIST_FOREACH(bus
, &dev
->child_bus
, sibling
) {
562 if (strcmp(name
, bus
->name
) == 0) {
569 int qdev_walk_children(DeviceState
*dev
,
570 qdev_walkerfn
*pre_devfn
, qbus_walkerfn
*pre_busfn
,
571 qdev_walkerfn
*post_devfn
, qbus_walkerfn
*post_busfn
,
578 err
= pre_devfn(dev
, opaque
);
584 QLIST_FOREACH(bus
, &dev
->child_bus
, sibling
) {
585 err
= qbus_walk_children(bus
, pre_devfn
, pre_busfn
,
586 post_devfn
, post_busfn
, opaque
);
593 err
= post_devfn(dev
, opaque
);
602 DeviceState
*qdev_find_recursive(BusState
*bus
, const char *id
)
608 QTAILQ_FOREACH(kid
, &bus
->children
, sibling
) {
609 DeviceState
*dev
= kid
->child
;
611 if (dev
->id
&& strcmp(dev
->id
, id
) == 0) {
615 QLIST_FOREACH(child
, &dev
->child_bus
, sibling
) {
616 ret
= qdev_find_recursive(child
, id
);
625 char *qdev_get_dev_path(DeviceState
*dev
)
629 if (!dev
|| !dev
->parent_bus
) {
633 bc
= BUS_GET_CLASS(dev
->parent_bus
);
634 if (bc
->get_dev_path
) {
635 return bc
->get_dev_path(dev
);
642 * Legacy property handling
645 static void qdev_get_legacy_property(Object
*obj
, Visitor
*v
,
646 const char *name
, void *opaque
,
649 DeviceState
*dev
= DEVICE(obj
);
650 Property
*prop
= opaque
;
655 prop
->info
->print(dev
, prop
, buffer
, sizeof(buffer
));
656 visit_type_str(v
, name
, &ptr
, errp
);
660 * qdev_property_add_legacy:
661 * @dev: Device to add the property to.
662 * @prop: The qdev property definition.
663 * @errp: location to store error information.
665 * Add a legacy QOM property to @dev for qdev property @prop.
666 * On error, store error in @errp.
668 * Legacy properties are string versions of QOM properties. The format of
669 * the string depends on the property type. Legacy properties are only
670 * needed for "info qtree".
672 * Do not use this is new code! QOM Properties added through this interface
673 * will be given names in the "legacy" namespace.
675 static void qdev_property_add_legacy(DeviceState
*dev
, Property
*prop
,
680 /* Register pointer properties as legacy properties */
681 if (!prop
->info
->print
&& prop
->info
->get
) {
685 if (prop
->info
->create
) {
689 name
= g_strdup_printf("legacy-%s", prop
->name
);
690 object_property_add(OBJECT(dev
), name
, "str",
691 prop
->info
->print
? qdev_get_legacy_property
: prop
->info
->get
,
700 * qdev_property_add_static:
701 * @dev: Device to add the property to.
702 * @prop: The qdev property definition.
703 * @errp: location to store error information.
705 * Add a static QOM property to @dev for qdev property @prop.
706 * On error, store error in @errp. Static properties access data in a struct.
707 * The type of the QOM property is derived from prop->info.
709 void qdev_property_add_static(DeviceState
*dev
, Property
*prop
,
712 Error
*local_err
= NULL
;
713 Object
*obj
= OBJECT(dev
);
715 if (prop
->info
->create
) {
716 prop
->info
->create(obj
, prop
, &local_err
);
719 * TODO qdev_prop_ptr does not have getters or setters. It must
720 * go now that it can be replaced with links. The test should be
721 * removed along with it: all static properties are read/write.
723 if (!prop
->info
->get
&& !prop
->info
->set
) {
726 object_property_add(obj
, prop
->name
, prop
->info
->name
,
727 prop
->info
->get
, prop
->info
->set
,
733 error_propagate(errp
, local_err
);
737 object_property_set_description(obj
, prop
->name
,
738 prop
->info
->description
,
741 if (prop
->set_default
) {
742 prop
->info
->set_default_value(obj
, prop
);
746 /* @qdev_alias_all_properties - Add alias properties to the source object for
747 * all qdev properties on the target DeviceState.
749 void qdev_alias_all_properties(DeviceState
*target
, Object
*source
)
754 class = object_get_class(OBJECT(target
));
756 DeviceClass
*dc
= DEVICE_CLASS(class);
758 for (prop
= dc
->props
; prop
&& prop
->name
; prop
++) {
759 object_property_add_alias(source
, prop
->name
,
760 OBJECT(target
), prop
->name
,
763 class = object_class_get_parent(class);
764 } while (class != object_class_by_name(TYPE_DEVICE
));
767 static int qdev_add_hotpluggable_device(Object
*obj
, void *opaque
)
769 GSList
**list
= opaque
;
770 DeviceState
*dev
= (DeviceState
*)object_dynamic_cast(OBJECT(obj
),
777 if (dev
->realized
&& object_property_get_bool(obj
, "hotpluggable", NULL
)) {
778 *list
= g_slist_append(*list
, dev
);
784 GSList
*qdev_build_hotpluggable_device_list(Object
*peripheral
)
788 object_child_foreach(peripheral
, qdev_add_hotpluggable_device
, &list
);
793 static bool device_get_realized(Object
*obj
, Error
**errp
)
795 DeviceState
*dev
= DEVICE(obj
);
796 return dev
->realized
;
799 static bool check_only_migratable(Object
*obj
, Error
**err
)
801 DeviceClass
*dc
= DEVICE_GET_CLASS(obj
);
803 if (!vmstate_check_only_migratable(dc
->vmsd
)) {
804 error_setg(err
, "Device %s is not migratable, but "
805 "--only-migratable was specified",
806 object_get_typename(obj
));
813 static void device_set_realized(Object
*obj
, bool value
, Error
**errp
)
815 DeviceState
*dev
= DEVICE(obj
);
816 DeviceClass
*dc
= DEVICE_GET_CLASS(dev
);
817 HotplugHandler
*hotplug_ctrl
;
819 Error
*local_err
= NULL
;
820 bool unattached_parent
= false;
821 static int unattached_count
;
823 if (dev
->hotplugged
&& !dc
->hotpluggable
) {
824 error_setg(errp
, QERR_DEVICE_NO_HOTPLUG
, object_get_typename(obj
));
828 if (value
&& !dev
->realized
) {
829 if (!check_only_migratable(obj
, &local_err
)) {
834 gchar
*name
= g_strdup_printf("device[%d]", unattached_count
++);
836 object_property_add_child(container_get(qdev_get_machine(),
838 name
, obj
, &error_abort
);
839 unattached_parent
= true;
843 hotplug_ctrl
= qdev_get_hotplug_handler(dev
);
845 hotplug_handler_pre_plug(hotplug_ctrl
, dev
, &local_err
);
846 if (local_err
!= NULL
) {
852 dc
->realize(dev
, &local_err
);
855 if (local_err
!= NULL
) {
859 DEVICE_LISTENER_CALL(realize
, Forward
, dev
);
862 hotplug_handler_plug(hotplug_ctrl
, dev
, &local_err
);
865 if (local_err
!= NULL
) {
866 goto post_realize_fail
;
870 * always free/re-initialize here since the value cannot be cleaned up
871 * in device_unrealize due to its usage later on in the unplug path
873 g_free(dev
->canonical_path
);
874 dev
->canonical_path
= object_get_canonical_path(OBJECT(dev
));
876 if (qdev_get_vmsd(dev
)) {
877 if (vmstate_register_with_alias_id(dev
, -1, qdev_get_vmsd(dev
), dev
,
878 dev
->instance_id_alias
,
879 dev
->alias_required_for_version
,
881 goto post_realize_fail
;
885 QLIST_FOREACH(bus
, &dev
->child_bus
, sibling
) {
886 object_property_set_bool(OBJECT(bus
), true, "realized",
888 if (local_err
!= NULL
) {
889 goto child_realize_fail
;
892 if (dev
->hotplugged
) {
895 dev
->pending_deleted_event
= false;
896 } else if (!value
&& dev
->realized
) {
897 Error
**local_errp
= NULL
;
898 QLIST_FOREACH(bus
, &dev
->child_bus
, sibling
) {
899 local_errp
= local_err
? NULL
: &local_err
;
900 object_property_set_bool(OBJECT(bus
), false, "realized",
903 if (qdev_get_vmsd(dev
)) {
904 vmstate_unregister(dev
, qdev_get_vmsd(dev
), dev
);
907 local_errp
= local_err
? NULL
: &local_err
;
908 dc
->unrealize(dev
, local_errp
);
910 dev
->pending_deleted_event
= true;
911 DEVICE_LISTENER_CALL(unrealize
, Reverse
, dev
);
914 if (local_err
!= NULL
) {
918 dev
->realized
= value
;
922 QLIST_FOREACH(bus
, &dev
->child_bus
, sibling
) {
923 object_property_set_bool(OBJECT(bus
), false, "realized",
927 if (qdev_get_vmsd(dev
)) {
928 vmstate_unregister(dev
, qdev_get_vmsd(dev
), dev
);
932 g_free(dev
->canonical_path
);
933 dev
->canonical_path
= NULL
;
935 dc
->unrealize(dev
, NULL
);
939 error_propagate(errp
, local_err
);
940 if (unattached_parent
) {
941 object_unparent(OBJECT(dev
));
946 static bool device_get_hotpluggable(Object
*obj
, Error
**errp
)
948 DeviceClass
*dc
= DEVICE_GET_CLASS(obj
);
949 DeviceState
*dev
= DEVICE(obj
);
951 return dc
->hotpluggable
&& (dev
->parent_bus
== NULL
||
952 qbus_is_hotpluggable(dev
->parent_bus
));
955 static bool device_get_hotplugged(Object
*obj
, Error
**err
)
957 DeviceState
*dev
= DEVICE(obj
);
959 return dev
->hotplugged
;
962 static void device_initfn(Object
*obj
)
964 DeviceState
*dev
= DEVICE(obj
);
970 qdev_hot_added
= true;
973 dev
->instance_id_alias
= -1;
974 dev
->realized
= false;
976 object_property_add_bool(obj
, "realized",
977 device_get_realized
, device_set_realized
, NULL
);
978 object_property_add_bool(obj
, "hotpluggable",
979 device_get_hotpluggable
, NULL
, NULL
);
980 object_property_add_bool(obj
, "hotplugged",
981 device_get_hotplugged
, NULL
,
984 class = object_get_class(OBJECT(dev
));
986 for (prop
= DEVICE_CLASS(class)->props
; prop
&& prop
->name
; prop
++) {
987 qdev_property_add_legacy(dev
, prop
, &error_abort
);
988 qdev_property_add_static(dev
, prop
, &error_abort
);
990 class = object_class_get_parent(class);
991 } while (class != object_class_by_name(TYPE_DEVICE
));
993 object_property_add_link(OBJECT(dev
), "parent_bus", TYPE_BUS
,
994 (Object
**)&dev
->parent_bus
, NULL
, 0,
996 QLIST_INIT(&dev
->gpios
);
999 static void device_post_init(Object
*obj
)
1001 qdev_prop_set_globals(DEVICE(obj
));
1004 /* Unlink device from bus and free the structure. */
1005 static void device_finalize(Object
*obj
)
1007 NamedGPIOList
*ngl
, *next
;
1009 DeviceState
*dev
= DEVICE(obj
);
1011 QLIST_FOREACH_SAFE(ngl
, &dev
->gpios
, node
, next
) {
1012 QLIST_REMOVE(ngl
, node
);
1013 qemu_free_irqs(ngl
->in
, ngl
->num_in
);
1016 /* ngl->out irqs are owned by the other end and should not be freed
1021 /* Only send event if the device had been completely realized */
1022 if (dev
->pending_deleted_event
) {
1023 g_assert(dev
->canonical_path
);
1025 qapi_event_send_device_deleted(!!dev
->id
, dev
->id
, dev
->canonical_path
,
1027 g_free(dev
->canonical_path
);
1028 dev
->canonical_path
= NULL
;
1031 qemu_opts_del(dev
->opts
);
1034 static void device_class_base_init(ObjectClass
*class, void *data
)
1036 DeviceClass
*klass
= DEVICE_CLASS(class);
1038 /* We explicitly look up properties in the superclasses,
1039 * so do not propagate them to the subclasses.
1041 klass
->props
= NULL
;
1044 static void device_unparent(Object
*obj
)
1046 DeviceState
*dev
= DEVICE(obj
);
1049 if (dev
->realized
) {
1050 object_property_set_bool(obj
, false, "realized", NULL
);
1052 while (dev
->num_child_bus
) {
1053 bus
= QLIST_FIRST(&dev
->child_bus
);
1054 object_unparent(OBJECT(bus
));
1056 if (dev
->parent_bus
) {
1057 bus_remove_child(dev
->parent_bus
, dev
);
1058 object_unref(OBJECT(dev
->parent_bus
));
1059 dev
->parent_bus
= NULL
;
1063 static void device_class_init(ObjectClass
*class, void *data
)
1065 DeviceClass
*dc
= DEVICE_CLASS(class);
1067 class->unparent
= device_unparent
;
1068 dc
->realize
= device_realize
;
1069 dc
->unrealize
= device_unrealize
;
1071 /* by default all devices were considered as hotpluggable,
1072 * so with intent to check it in generic qdev_unplug() /
1073 * device_set_realized() functions make every device
1074 * hotpluggable. Devices that shouldn't be hotpluggable,
1075 * should override it in their class_init()
1077 dc
->hotpluggable
= true;
1078 dc
->user_creatable
= true;
1081 void device_class_set_parent_reset(DeviceClass
*dc
,
1082 DeviceReset dev_reset
,
1083 DeviceReset
*parent_reset
)
1085 *parent_reset
= dc
->reset
;
1086 dc
->reset
= dev_reset
;
1089 void device_class_set_parent_realize(DeviceClass
*dc
,
1090 DeviceRealize dev_realize
,
1091 DeviceRealize
*parent_realize
)
1093 *parent_realize
= dc
->realize
;
1094 dc
->realize
= dev_realize
;
1097 void device_class_set_parent_unrealize(DeviceClass
*dc
,
1098 DeviceUnrealize dev_unrealize
,
1099 DeviceUnrealize
*parent_unrealize
)
1101 *parent_unrealize
= dc
->unrealize
;
1102 dc
->unrealize
= dev_unrealize
;
1105 void device_reset(DeviceState
*dev
)
1107 DeviceClass
*klass
= DEVICE_GET_CLASS(dev
);
1114 Object
*qdev_get_machine(void)
1119 dev
= container_get(object_get_root(), "/machine");
1125 static const TypeInfo device_type_info
= {
1126 .name
= TYPE_DEVICE
,
1127 .parent
= TYPE_OBJECT
,
1128 .instance_size
= sizeof(DeviceState
),
1129 .instance_init
= device_initfn
,
1130 .instance_post_init
= device_post_init
,
1131 .instance_finalize
= device_finalize
,
1132 .class_base_init
= device_class_base_init
,
1133 .class_init
= device_class_init
,
1135 .class_size
= sizeof(DeviceClass
),
1138 static void qdev_register_types(void)
1140 type_register_static(&device_type_info
);
1143 type_init(qdev_register_types
)