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"
29 #include "qapi/error.h"
30 #include "qapi/qapi-events-qdev.h"
31 #include "qapi/qmp/qerror.h"
32 #include "qapi/visitor.h"
33 #include "qemu/error-report.h"
34 #include "qemu/option.h"
35 #include "hw/hotplug.h"
37 #include "hw/qdev-properties.h"
38 #include "hw/boards.h"
39 #include "hw/sysbus.h"
40 #include "migration/vmstate.h"
42 bool qdev_hotplug = false;
43 static bool qdev_hot_added = false;
44 bool qdev_hot_removed = false;
46 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
48 DeviceClass *dc = DEVICE_GET_CLASS(dev);
52 static void bus_remove_child(BusState *bus, DeviceState *child)
56 QTAILQ_FOREACH(kid, &bus->children, sibling) {
57 if (kid->child == child) {
60 snprintf(name, sizeof(name), "child[%d]", kid->index);
61 QTAILQ_REMOVE(&bus->children, kid, sibling);
65 /* This gives back ownership of kid->child back to us. */
66 object_property_del(OBJECT(bus), name, NULL);
67 object_unref(OBJECT(kid->child));
74 static void bus_add_child(BusState *bus, DeviceState *child)
77 BusChild *kid = g_malloc0(sizeof(*kid));
80 kid->index = bus->max_index++;
82 object_ref(OBJECT(kid->child));
84 QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
86 /* This transfers ownership of kid->child to the property. */
87 snprintf(name, sizeof(name), "child[%d]", kid->index);
88 object_property_add_link(OBJECT(bus), name,
89 object_get_typename(OBJECT(child)),
90 (Object **)&kid->child,
91 NULL, /* read-only property */
92 0, /* return ownership on prop deletion */
96 void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
98 bool replugging = dev->parent_bus != NULL;
101 /* Keep a reference to the device while it's not plugged into
102 * any bus, to avoid it potentially evaporating when it is
103 * dereffed in bus_remove_child().
105 object_ref(OBJECT(dev));
106 bus_remove_child(dev->parent_bus, dev);
107 object_unref(OBJECT(dev->parent_bus));
109 dev->parent_bus = bus;
110 object_ref(OBJECT(bus));
111 bus_add_child(bus, dev);
113 object_unref(OBJECT(dev));
117 /* Create a new device. This only initializes the device state
118 structure and allows properties to be set. The device still needs
119 to be realized. See qdev-core.h. */
120 DeviceState *qdev_create(BusState *bus, const char *name)
124 dev = qdev_try_create(bus, name);
127 error_report("Unknown device '%s' for bus '%s'", name,
128 object_get_typename(OBJECT(bus)));
130 error_report("Unknown device '%s' for default sysbus", name);
138 DeviceState *qdev_try_create(BusState *bus, const char *type)
142 if (object_class_by_name(type) == NULL) {
145 dev = DEVICE(object_new(type));
151 /* Assert that the device really is a SysBusDevice before
152 * we put it onto the sysbus. Non-sysbus devices which aren't
153 * being put onto a bus should be created with object_new(TYPE_FOO),
154 * not qdev_create(NULL, TYPE_FOO).
156 g_assert(object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE));
157 bus = sysbus_get_default();
160 qdev_set_parent_bus(dev, bus);
161 object_unref(OBJECT(dev));
165 static QTAILQ_HEAD(, DeviceListener) device_listeners
166 = QTAILQ_HEAD_INITIALIZER(device_listeners);
168 enum ListenerDirection { Forward, Reverse };
170 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \
172 DeviceListener *_listener; \
174 switch (_direction) { \
176 QTAILQ_FOREACH(_listener, &device_listeners, link) { \
177 if (_listener->_callback) { \
178 _listener->_callback(_listener, ##_args); \
183 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \
185 if (_listener->_callback) { \
186 _listener->_callback(_listener, ##_args); \
195 static int device_listener_add(DeviceState *dev, void *opaque)
197 DEVICE_LISTENER_CALL(realize, Forward, dev);
202 void device_listener_register(DeviceListener *listener)
204 QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
206 qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
210 void device_listener_unregister(DeviceListener *listener)
212 QTAILQ_REMOVE(&device_listeners, listener, link);
215 bool qdev_should_hide_device(QemuOpts *opts)
218 DeviceListener *listener;
220 QTAILQ_FOREACH(listener, &device_listeners, link) {
221 if (listener->should_be_hidden) {
223 * should_be_hidden_will return
224 * 1 if device matches opts and it should be hidden
225 * 0 if device matches opts and should not be hidden
226 * -1 if device doesn't match ops
228 rc = listener->should_be_hidden(listener, opts);
239 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
240 int required_for_version)
242 assert(!dev->realized);
243 dev->instance_id_alias = alias_id;
244 dev->alias_required_for_version = required_for_version;
247 HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev)
249 MachineState *machine;
251 Object *m_obj = qdev_get_machine();
253 if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
254 machine = MACHINE(m_obj);
255 mc = MACHINE_GET_CLASS(machine);
256 if (mc->get_hotplug_handler) {
257 return mc->get_hotplug_handler(machine, dev);
264 bool qdev_hotplug_allowed(DeviceState *dev, Error **errp)
266 MachineState *machine;
268 Object *m_obj = qdev_get_machine();
270 if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
271 machine = MACHINE(m_obj);
272 mc = MACHINE_GET_CLASS(machine);
273 if (mc->hotplug_allowed) {
274 return mc->hotplug_allowed(machine, dev, errp);
281 HotplugHandler *qdev_get_bus_hotplug_handler(DeviceState *dev)
283 if (dev->parent_bus) {
284 return dev->parent_bus->hotplug_handler;
289 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
291 HotplugHandler *hotplug_ctrl = qdev_get_machine_hotplug_handler(dev);
293 if (hotplug_ctrl == NULL && dev->parent_bus) {
294 hotplug_ctrl = qdev_get_bus_hotplug_handler(dev);
299 static int qdev_reset_one(DeviceState *dev, void *opaque)
306 static int qbus_reset_one(BusState *bus, void *opaque)
308 BusClass *bc = BUS_GET_CLASS(bus);
315 void qdev_reset_all(DeviceState *dev)
317 qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
320 void qdev_reset_all_fn(void *opaque)
322 qdev_reset_all(DEVICE(opaque));
325 void qbus_reset_all(BusState *bus)
327 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
330 void qbus_reset_all_fn(void *opaque)
332 BusState *bus = opaque;
336 /* can be used as ->unplug() callback for the simple cases */
337 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
338 DeviceState *dev, Error **errp)
340 object_property_set_bool(OBJECT(dev), false, "realized", NULL);
345 * Device properties should be set before calling this function. IRQs
346 * and MMIO regions should be connected/mapped after calling this
348 * On failure, report an error with error_report() and terminate the
349 * program. This is okay during machine creation. Don't use for
350 * hotplug, because there callers need to recover from failure.
351 * Exception: if you know the device's init() callback can't fail,
352 * then qdev_init_nofail() can't fail either, and is therefore usable
353 * even then. But relying on the device implementation that way is
354 * somewhat unclean, and best avoided.
356 void qdev_init_nofail(DeviceState *dev)
360 assert(!dev->realized);
362 object_ref(OBJECT(dev));
363 object_property_set_bool(OBJECT(dev), true, "realized", &err);
365 error_reportf_err(err, "Initialization of device %s failed: ",
366 object_get_typename(OBJECT(dev)));
369 object_unref(OBJECT(dev));
372 void qdev_machine_creation_done(void)
375 * ok, initial machine setup is done, starting from now we can
376 * only create hotpluggable devices
381 bool qdev_machine_modified(void)
383 return qdev_hot_added || qdev_hot_removed;
386 BusState *qdev_get_parent_bus(DeviceState *dev)
388 return dev->parent_bus;
391 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
396 QLIST_FOREACH(ngl, &dev->gpios, node) {
397 /* NULL is a valid and matchable name, otherwise do a normal
400 if ((!ngl->name && !name) ||
401 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
406 ngl = g_malloc0(sizeof(*ngl));
407 ngl->name = g_strdup(name);
408 QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
412 void qdev_init_gpio_in_named_with_opaque(DeviceState *dev,
413 qemu_irq_handler handler,
415 const char *name, int n)
418 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
420 assert(gpio_list->num_out == 0 || !name);
421 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
425 name = "unnamed-gpio-in";
427 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
428 gchar *propname = g_strdup_printf("%s[%u]", name, i);
430 object_property_add_child(OBJECT(dev), propname,
431 OBJECT(gpio_list->in[i]), &error_abort);
435 gpio_list->num_in += n;
438 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
440 qdev_init_gpio_in_named(dev, handler, NULL, n);
443 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
444 const char *name, int n)
447 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
449 assert(gpio_list->num_in == 0 || !name);
452 name = "unnamed-gpio-out";
454 memset(pins, 0, sizeof(*pins) * n);
455 for (i = 0; i < n; ++i) {
456 gchar *propname = g_strdup_printf("%s[%u]", name,
457 gpio_list->num_out + i);
459 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
461 object_property_allow_set_link,
462 OBJ_PROP_LINK_STRONG,
466 gpio_list->num_out += n;
469 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
471 qdev_init_gpio_out_named(dev, pins, NULL, n);
474 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
476 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
478 assert(n >= 0 && n < gpio_list->num_in);
479 return gpio_list->in[n];
482 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
484 return qdev_get_gpio_in_named(dev, NULL, n);
487 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
490 char *propname = g_strdup_printf("%s[%d]",
491 name ? name : "unnamed-gpio-out", n);
493 /* We need a name for object_property_set_link to work. If the
494 * object has a parent, object_property_add_child will come back
495 * with an error without doing anything. If it has none, it will
496 * never fail. So we can just call it with a NULL Error pointer.
498 object_property_add_child(container_get(qdev_get_machine(),
500 "non-qdev-gpio[*]", OBJECT(pin), NULL);
502 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
506 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
508 char *propname = g_strdup_printf("%s[%d]",
509 name ? name : "unnamed-gpio-out", n);
511 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
517 /* disconnect a GPIO output, returning the disconnected input (if any) */
519 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
520 const char *name, int n)
522 char *propname = g_strdup_printf("%s[%d]",
523 name ? name : "unnamed-gpio-out", n);
525 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
528 object_property_set_link(OBJECT(dev), NULL, propname, NULL);
534 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
535 const char *name, int n)
537 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
538 qdev_connect_gpio_out_named(dev, name, n, icpt);
542 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
544 qdev_connect_gpio_out_named(dev, NULL, n, pin);
547 void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
551 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
553 for (i = 0; i < ngl->num_in; i++) {
554 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
555 char *propname = g_strdup_printf("%s[%d]", nm, i);
557 object_property_add_alias(OBJECT(container), propname,
558 OBJECT(dev), propname,
562 for (i = 0; i < ngl->num_out; i++) {
563 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
564 char *propname = g_strdup_printf("%s[%d]", nm, i);
566 object_property_add_alias(OBJECT(container), propname,
567 OBJECT(dev), propname,
571 QLIST_REMOVE(ngl, node);
572 QLIST_INSERT_HEAD(&container->gpios, ngl, node);
575 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
578 Object *child = object_resolve_path_component(OBJECT(dev), name);
580 bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
585 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
586 if (strcmp(name, bus->name) == 0) {
593 int qdev_walk_children(DeviceState *dev,
594 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
595 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
602 err = pre_devfn(dev, opaque);
608 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
609 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
610 post_devfn, post_busfn, opaque);
617 err = post_devfn(dev, opaque);
626 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
632 QTAILQ_FOREACH(kid, &bus->children, sibling) {
633 DeviceState *dev = kid->child;
635 if (dev->id && strcmp(dev->id, id) == 0) {
639 QLIST_FOREACH(child, &dev->child_bus, sibling) {
640 ret = qdev_find_recursive(child, id);
649 char *qdev_get_dev_path(DeviceState *dev)
653 if (!dev || !dev->parent_bus) {
657 bc = BUS_GET_CLASS(dev->parent_bus);
658 if (bc->get_dev_path) {
659 return bc->get_dev_path(dev);
666 * Legacy property handling
669 static void qdev_get_legacy_property(Object *obj, Visitor *v,
670 const char *name, void *opaque,
673 DeviceState *dev = DEVICE(obj);
674 Property *prop = opaque;
679 prop->info->print(dev, prop, buffer, sizeof(buffer));
680 visit_type_str(v, name, &ptr, errp);
684 * qdev_property_add_legacy:
685 * @dev: Device to add the property to.
686 * @prop: The qdev property definition.
687 * @errp: location to store error information.
689 * Add a legacy QOM property to @dev for qdev property @prop.
690 * On error, store error in @errp.
692 * Legacy properties are string versions of QOM properties. The format of
693 * the string depends on the property type. Legacy properties are only
694 * needed for "info qtree".
696 * Do not use this in new code! QOM Properties added through this interface
697 * will be given names in the "legacy" namespace.
699 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
704 /* Register pointer properties as legacy properties */
705 if (!prop->info->print && prop->info->get) {
709 if (prop->info->create) {
713 name = g_strdup_printf("legacy-%s", prop->name);
714 object_property_add(OBJECT(dev), name, "str",
715 prop->info->print ? qdev_get_legacy_property : prop->info->get,
724 * qdev_property_add_static:
725 * @dev: Device to add the property to.
726 * @prop: The qdev property definition.
727 * @errp: location to store error information.
729 * Add a static QOM property to @dev for qdev property @prop.
730 * On error, store error in @errp. Static properties access data in a struct.
731 * The type of the QOM property is derived from prop->info.
733 void qdev_property_add_static(DeviceState *dev, Property *prop,
736 Error *local_err = NULL;
737 Object *obj = OBJECT(dev);
739 if (prop->info->create) {
740 prop->info->create(obj, prop, &local_err);
743 * TODO qdev_prop_ptr does not have getters or setters. It must
744 * go now that it can be replaced with links. The test should be
745 * removed along with it: all static properties are read/write.
747 if (!prop->info->get && !prop->info->set) {
750 object_property_add(obj, prop->name, prop->info->name,
751 prop->info->get, prop->info->set,
757 error_propagate(errp, local_err);
761 object_property_set_description(obj, prop->name,
762 prop->info->description,
765 if (prop->set_default) {
766 prop->info->set_default_value(obj, prop);
770 /* @qdev_alias_all_properties - Add alias properties to the source object for
771 * all qdev properties on the target DeviceState.
773 void qdev_alias_all_properties(DeviceState *target, Object *source)
778 class = object_get_class(OBJECT(target));
780 DeviceClass *dc = DEVICE_CLASS(class);
782 for (prop = dc->props; prop && prop->name; prop++) {
783 object_property_add_alias(source, prop->name,
784 OBJECT(target), prop->name,
787 class = object_class_get_parent(class);
788 } while (class != object_class_by_name(TYPE_DEVICE));
791 static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
793 GSList **list = opaque;
794 DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
801 if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
802 *list = g_slist_append(*list, dev);
808 GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
812 object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
817 static bool device_get_realized(Object *obj, Error **errp)
819 DeviceState *dev = DEVICE(obj);
820 return dev->realized;
823 static bool check_only_migratable(Object *obj, Error **errp)
825 DeviceClass *dc = DEVICE_GET_CLASS(obj);
827 if (!vmstate_check_only_migratable(dc->vmsd)) {
828 error_setg(errp, "Device %s is not migratable, but "
829 "--only-migratable was specified",
830 object_get_typename(obj));
837 static void device_set_realized(Object *obj, bool value, Error **errp)
839 DeviceState *dev = DEVICE(obj);
840 DeviceClass *dc = DEVICE_GET_CLASS(dev);
841 HotplugHandler *hotplug_ctrl;
843 Error *local_err = NULL;
844 bool unattached_parent = false;
845 static int unattached_count;
847 if (dev->hotplugged && !dc->hotpluggable) {
848 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
852 if (value && !dev->realized) {
853 if (!check_only_migratable(obj, &local_err)) {
858 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
860 object_property_add_child(container_get(qdev_get_machine(),
862 name, obj, &error_abort);
863 unattached_parent = true;
867 hotplug_ctrl = qdev_get_hotplug_handler(dev);
869 hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
870 if (local_err != NULL) {
876 dc->realize(dev, &local_err);
877 if (local_err != NULL) {
882 DEVICE_LISTENER_CALL(realize, Forward, dev);
885 * always free/re-initialize here since the value cannot be cleaned up
886 * in device_unrealize due to its usage later on in the unplug path
888 g_free(dev->canonical_path);
889 dev->canonical_path = object_get_canonical_path(OBJECT(dev));
891 if (qdev_get_vmsd(dev)) {
892 if (vmstate_register_with_alias_id(VMSTATE_IF(dev),
893 -1, qdev_get_vmsd(dev), dev,
894 dev->instance_id_alias,
895 dev->alias_required_for_version,
897 goto post_realize_fail;
901 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
902 object_property_set_bool(OBJECT(bus), true, "realized",
904 if (local_err != NULL) {
905 goto child_realize_fail;
908 if (dev->hotplugged) {
911 dev->pending_deleted_event = false;
914 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
915 if (local_err != NULL) {
916 goto child_realize_fail;
920 } else if (!value && dev->realized) {
921 /* We want local_err to track only the first error */
922 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
923 object_property_set_bool(OBJECT(bus), false, "realized",
924 local_err ? NULL : &local_err);
926 if (qdev_get_vmsd(dev)) {
927 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
930 dc->unrealize(dev, local_err ? NULL : &local_err);
932 dev->pending_deleted_event = true;
933 DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
935 if (local_err != NULL) {
940 assert(local_err == NULL);
941 dev->realized = value;
945 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
946 object_property_set_bool(OBJECT(bus), false, "realized",
950 if (qdev_get_vmsd(dev)) {
951 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
955 g_free(dev->canonical_path);
956 dev->canonical_path = NULL;
958 dc->unrealize(dev, NULL);
962 error_propagate(errp, local_err);
963 if (unattached_parent) {
964 object_unparent(OBJECT(dev));
969 static bool device_get_hotpluggable(Object *obj, Error **errp)
971 DeviceClass *dc = DEVICE_GET_CLASS(obj);
972 DeviceState *dev = DEVICE(obj);
974 return dc->hotpluggable && (dev->parent_bus == NULL ||
975 qbus_is_hotpluggable(dev->parent_bus));
978 static bool device_get_hotplugged(Object *obj, Error **errp)
980 DeviceState *dev = DEVICE(obj);
982 return dev->hotplugged;
985 static void device_initfn(Object *obj)
987 DeviceState *dev = DEVICE(obj);
993 qdev_hot_added = true;
996 dev->instance_id_alias = -1;
997 dev->realized = false;
998 dev->allow_unplug_during_migration = false;
1000 object_property_add_bool(obj, "realized",
1001 device_get_realized, device_set_realized, NULL);
1002 object_property_add_bool(obj, "hotpluggable",
1003 device_get_hotpluggable, NULL, NULL);
1004 object_property_add_bool(obj, "hotplugged",
1005 device_get_hotplugged, NULL,
1008 class = object_get_class(OBJECT(dev));
1010 for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
1011 qdev_property_add_legacy(dev, prop, &error_abort);
1012 qdev_property_add_static(dev, prop, &error_abort);
1014 class = object_class_get_parent(class);
1015 } while (class != object_class_by_name(TYPE_DEVICE));
1017 object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
1018 (Object **)&dev->parent_bus, NULL, 0,
1020 QLIST_INIT(&dev->gpios);
1023 static void device_post_init(Object *obj)
1026 * Note: ordered so that the user's global properties take
1029 object_apply_compat_props(obj);
1030 qdev_prop_set_globals(DEVICE(obj));
1033 /* Unlink device from bus and free the structure. */
1034 static void device_finalize(Object *obj)
1036 NamedGPIOList *ngl, *next;
1038 DeviceState *dev = DEVICE(obj);
1040 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1041 QLIST_REMOVE(ngl, node);
1042 qemu_free_irqs(ngl->in, ngl->num_in);
1045 /* ngl->out irqs are owned by the other end and should not be freed
1050 /* Only send event if the device had been completely realized */
1051 if (dev->pending_deleted_event) {
1052 g_assert(dev->canonical_path);
1054 qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path);
1055 g_free(dev->canonical_path);
1056 dev->canonical_path = NULL;
1059 qemu_opts_del(dev->opts);
1062 static void device_class_base_init(ObjectClass *class, void *data)
1064 DeviceClass *klass = DEVICE_CLASS(class);
1066 /* We explicitly look up properties in the superclasses,
1067 * so do not propagate them to the subclasses.
1069 klass->props = NULL;
1072 static void device_unparent(Object *obj)
1074 DeviceState *dev = DEVICE(obj);
1077 if (dev->realized) {
1078 object_property_set_bool(obj, false, "realized", NULL);
1080 while (dev->num_child_bus) {
1081 bus = QLIST_FIRST(&dev->child_bus);
1082 object_unparent(OBJECT(bus));
1084 if (dev->parent_bus) {
1085 bus_remove_child(dev->parent_bus, dev);
1086 object_unref(OBJECT(dev->parent_bus));
1087 dev->parent_bus = NULL;
1092 device_vmstate_if_get_id(VMStateIf *obj)
1094 DeviceState *dev = DEVICE(obj);
1096 return qdev_get_dev_path(dev);
1099 static void device_class_init(ObjectClass *class, void *data)
1101 DeviceClass *dc = DEVICE_CLASS(class);
1102 VMStateIfClass *vc = VMSTATE_IF_CLASS(class);
1104 class->unparent = device_unparent;
1106 /* by default all devices were considered as hotpluggable,
1107 * so with intent to check it in generic qdev_unplug() /
1108 * device_set_realized() functions make every device
1109 * hotpluggable. Devices that shouldn't be hotpluggable,
1110 * should override it in their class_init()
1112 dc->hotpluggable = true;
1113 dc->user_creatable = true;
1114 vc->get_id = device_vmstate_if_get_id;
1117 void device_class_set_parent_reset(DeviceClass *dc,
1118 DeviceReset dev_reset,
1119 DeviceReset *parent_reset)
1121 *parent_reset = dc->reset;
1122 dc->reset = dev_reset;
1125 void device_class_set_parent_realize(DeviceClass *dc,
1126 DeviceRealize dev_realize,
1127 DeviceRealize *parent_realize)
1129 *parent_realize = dc->realize;
1130 dc->realize = dev_realize;
1133 void device_class_set_parent_unrealize(DeviceClass *dc,
1134 DeviceUnrealize dev_unrealize,
1135 DeviceUnrealize *parent_unrealize)
1137 *parent_unrealize = dc->unrealize;
1138 dc->unrealize = dev_unrealize;
1141 void device_reset(DeviceState *dev)
1143 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1150 Object *qdev_get_machine(void)
1155 dev = container_get(object_get_root(), "/machine");
1161 static const TypeInfo device_type_info = {
1162 .name = TYPE_DEVICE,
1163 .parent = TYPE_OBJECT,
1164 .instance_size = sizeof(DeviceState),
1165 .instance_init = device_initfn,
1166 .instance_post_init = device_post_init,
1167 .instance_finalize = device_finalize,
1168 .class_base_init = device_class_base_init,
1169 .class_init = device_class_init,
1171 .class_size = sizeof(DeviceClass),
1172 .interfaces = (InterfaceInfo[]) {
1173 { TYPE_VMSTATE_IF },
1178 static void qdev_register_types(void)
1180 type_register_static(&device_type_info);
1183 type_init(qdev_register_types)