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 "hw/fw-path-provider.h"
31 #include "sysemu/sysemu.h"
32 #include "qapi/qmp/qerror.h"
33 #include "qapi/visitor.h"
34 #include "qapi/qmp/qjson.h"
35 #include "qemu/error-report.h"
36 #include "hw/hotplug.h"
37 #include "hw/boards.h"
38 #include "hw/sysbus.h"
39 #include "qapi-event.h"
40 #include "migration/migration.h"
43 static bool qdev_hot_added = false;
44 static bool qdev_hot_removed = false;
46 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
48 DeviceClass *dc = DEVICE_GET_CLASS(dev);
52 const char *qdev_fw_name(DeviceState *dev)
54 DeviceClass *dc = DEVICE_GET_CLASS(dev);
60 return object_get_typename(OBJECT(dev));
63 static void bus_remove_child(BusState *bus, DeviceState *child)
67 QTAILQ_FOREACH(kid, &bus->children, sibling) {
68 if (kid->child == child) {
71 snprintf(name, sizeof(name), "child[%d]", kid->index);
72 QTAILQ_REMOVE(&bus->children, kid, sibling);
74 /* This gives back ownership of kid->child back to us. */
75 object_property_del(OBJECT(bus), name, NULL);
76 object_unref(OBJECT(kid->child));
83 static void bus_add_child(BusState *bus, DeviceState *child)
86 BusChild *kid = g_malloc0(sizeof(*kid));
88 kid->index = bus->max_index++;
90 object_ref(OBJECT(kid->child));
92 QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
94 /* This transfers ownership of kid->child to the property. */
95 snprintf(name, sizeof(name), "child[%d]", kid->index);
96 object_property_add_link(OBJECT(bus), name,
97 object_get_typename(OBJECT(child)),
98 (Object **)&kid->child,
99 NULL, /* read-only property */
100 0, /* return ownership on prop deletion */
104 void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
106 dev->parent_bus = bus;
107 object_ref(OBJECT(bus));
108 bus_add_child(bus, dev);
111 /* Create a new device. This only initializes the device state
112 structure and allows properties to be set. The device still needs
113 to be realized. See qdev-core.h. */
114 DeviceState *qdev_create(BusState *bus, const char *name)
118 dev = qdev_try_create(bus, name);
121 error_report("Unknown device '%s' for bus '%s'", name,
122 object_get_typename(OBJECT(bus)));
124 error_report("Unknown device '%s' for default sysbus", name);
132 DeviceState *qdev_try_create(BusState *bus, const char *type)
136 if (object_class_by_name(type) == NULL) {
139 dev = DEVICE(object_new(type));
145 /* Assert that the device really is a SysBusDevice before
146 * we put it onto the sysbus. Non-sysbus devices which aren't
147 * being put onto a bus should be created with object_new(TYPE_FOO),
148 * not qdev_create(NULL, TYPE_FOO).
150 g_assert(object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE));
151 bus = sysbus_get_default();
154 qdev_set_parent_bus(dev, bus);
155 object_unref(OBJECT(dev));
159 static QTAILQ_HEAD(device_listeners, DeviceListener) device_listeners
160 = QTAILQ_HEAD_INITIALIZER(device_listeners);
162 enum ListenerDirection { Forward, Reverse };
164 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \
166 DeviceListener *_listener; \
168 switch (_direction) { \
170 QTAILQ_FOREACH(_listener, &device_listeners, link) { \
171 if (_listener->_callback) { \
172 _listener->_callback(_listener, ##_args); \
177 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \
178 device_listeners, link) { \
179 if (_listener->_callback) { \
180 _listener->_callback(_listener, ##_args); \
189 static int device_listener_add(DeviceState *dev, void *opaque)
191 DEVICE_LISTENER_CALL(realize, Forward, dev);
196 void device_listener_register(DeviceListener *listener)
198 QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
200 qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
204 void device_listener_unregister(DeviceListener *listener)
206 QTAILQ_REMOVE(&device_listeners, listener, link);
209 static void device_realize(DeviceState *dev, Error **errp)
211 DeviceClass *dc = DEVICE_GET_CLASS(dev);
214 int rc = dc->init(dev);
216 error_setg(errp, "Device initialization failed.");
222 static void device_unrealize(DeviceState *dev, Error **errp)
224 DeviceClass *dc = DEVICE_GET_CLASS(dev);
227 int rc = dc->exit(dev);
229 error_setg(errp, "Device exit failed.");
235 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
236 int required_for_version)
238 assert(!dev->realized);
239 dev->instance_id_alias = alias_id;
240 dev->alias_required_for_version = required_for_version;
243 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
245 HotplugHandler *hotplug_ctrl = NULL;
247 if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
248 hotplug_ctrl = dev->parent_bus->hotplug_handler;
249 } else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) {
250 MachineState *machine = MACHINE(qdev_get_machine());
251 MachineClass *mc = MACHINE_GET_CLASS(machine);
253 if (mc->get_hotplug_handler) {
254 hotplug_ctrl = mc->get_hotplug_handler(machine, dev);
260 void qdev_unplug(DeviceState *dev, Error **errp)
262 DeviceClass *dc = DEVICE_GET_CLASS(dev);
263 HotplugHandler *hotplug_ctrl;
264 HotplugHandlerClass *hdc;
266 if (dev->parent_bus && !qbus_is_hotpluggable(dev->parent_bus)) {
267 error_setg(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
271 if (!dc->hotpluggable) {
272 error_setg(errp, QERR_DEVICE_NO_HOTPLUG,
273 object_get_typename(OBJECT(dev)));
277 qdev_hot_removed = true;
279 hotplug_ctrl = qdev_get_hotplug_handler(dev);
280 /* hotpluggable device MUST have HotplugHandler, if it doesn't
281 * then something is very wrong with it */
282 g_assert(hotplug_ctrl);
284 /* If device supports async unplug just request it to be done,
285 * otherwise just remove it synchronously */
286 hdc = HOTPLUG_HANDLER_GET_CLASS(hotplug_ctrl);
287 if (hdc->unplug_request) {
288 hotplug_handler_unplug_request(hotplug_ctrl, dev, errp);
290 hotplug_handler_unplug(hotplug_ctrl, dev, errp);
294 static int qdev_reset_one(DeviceState *dev, void *opaque)
301 static int qbus_reset_one(BusState *bus, void *opaque)
303 BusClass *bc = BUS_GET_CLASS(bus);
310 void qdev_reset_all(DeviceState *dev)
312 qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
315 void qdev_reset_all_fn(void *opaque)
317 qdev_reset_all(DEVICE(opaque));
320 void qbus_reset_all(BusState *bus)
322 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
325 void qbus_reset_all_fn(void *opaque)
327 BusState *bus = opaque;
331 /* can be used as ->unplug() callback for the simple cases */
332 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
333 DeviceState *dev, Error **errp)
336 object_unparent(OBJECT(dev));
341 * Device properties should be set before calling this function. IRQs
342 * and MMIO regions should be connected/mapped after calling this
344 * On failure, report an error with error_report() and terminate the
345 * program. This is okay during machine creation. Don't use for
346 * hotplug, because there callers need to recover from failure.
347 * Exception: if you know the device's init() callback can't fail,
348 * then qdev_init_nofail() can't fail either, and is therefore usable
349 * even then. But relying on the device implementation that way is
350 * somewhat unclean, and best avoided.
352 void qdev_init_nofail(DeviceState *dev)
356 assert(!dev->realized);
358 object_ref(OBJECT(dev));
359 object_property_set_bool(OBJECT(dev), true, "realized", &err);
361 error_reportf_err(err, "Initialization of device %s failed: ",
362 object_get_typename(OBJECT(dev)));
365 object_unref(OBJECT(dev));
368 void qdev_machine_creation_done(void)
371 * ok, initial machine setup is done, starting from now we can
372 * only create hotpluggable devices
377 bool qdev_machine_modified(void)
379 return qdev_hot_added || qdev_hot_removed;
382 BusState *qdev_get_parent_bus(DeviceState *dev)
384 return dev->parent_bus;
387 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
392 QLIST_FOREACH(ngl, &dev->gpios, node) {
393 /* NULL is a valid and matchable name, otherwise do a normal
396 if ((!ngl->name && !name) ||
397 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
402 ngl = g_malloc0(sizeof(*ngl));
403 ngl->name = g_strdup(name);
404 QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
408 void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
409 const char *name, int n)
412 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
414 assert(gpio_list->num_out == 0 || !name);
415 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
419 name = "unnamed-gpio-in";
421 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
422 gchar *propname = g_strdup_printf("%s[%u]", name, i);
424 object_property_add_child(OBJECT(dev), propname,
425 OBJECT(gpio_list->in[i]), &error_abort);
429 gpio_list->num_in += n;
432 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
434 qdev_init_gpio_in_named(dev, handler, NULL, n);
437 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
438 const char *name, int n)
441 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
443 assert(gpio_list->num_in == 0 || !name);
446 name = "unnamed-gpio-out";
448 memset(pins, 0, sizeof(*pins) * n);
449 for (i = 0; i < n; ++i) {
450 gchar *propname = g_strdup_printf("%s[%u]", name,
451 gpio_list->num_out + i);
453 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
455 object_property_allow_set_link,
456 OBJ_PROP_LINK_UNREF_ON_RELEASE,
460 gpio_list->num_out += n;
463 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
465 qdev_init_gpio_out_named(dev, pins, NULL, n);
468 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
470 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
472 assert(n >= 0 && n < gpio_list->num_in);
473 return gpio_list->in[n];
476 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
478 return qdev_get_gpio_in_named(dev, NULL, n);
481 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
484 char *propname = g_strdup_printf("%s[%d]",
485 name ? name : "unnamed-gpio-out", n);
487 /* We need a name for object_property_set_link to work. If the
488 * object has a parent, object_property_add_child will come back
489 * with an error without doing anything. If it has none, it will
490 * never fail. So we can just call it with a NULL Error pointer.
492 object_property_add_child(container_get(qdev_get_machine(),
494 "non-qdev-gpio[*]", OBJECT(pin), NULL);
496 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
500 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
502 char *propname = g_strdup_printf("%s[%d]",
503 name ? name : "unnamed-gpio-out", n);
505 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
511 /* disconnect a GPIO output, returning the disconnected input (if any) */
513 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
514 const char *name, int n)
516 char *propname = g_strdup_printf("%s[%d]",
517 name ? name : "unnamed-gpio-out", n);
519 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
522 object_property_set_link(OBJECT(dev), NULL, propname, NULL);
528 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
529 const char *name, int n)
531 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
532 qdev_connect_gpio_out_named(dev, name, n, icpt);
536 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
538 qdev_connect_gpio_out_named(dev, NULL, n, pin);
541 void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
545 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
547 for (i = 0; i < ngl->num_in; i++) {
548 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
549 char *propname = g_strdup_printf("%s[%d]", nm, i);
551 object_property_add_alias(OBJECT(container), propname,
552 OBJECT(dev), propname,
556 for (i = 0; i < ngl->num_out; i++) {
557 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
558 char *propname = g_strdup_printf("%s[%d]", nm, i);
560 object_property_add_alias(OBJECT(container), propname,
561 OBJECT(dev), propname,
565 QLIST_REMOVE(ngl, node);
566 QLIST_INSERT_HEAD(&container->gpios, ngl, node);
569 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
572 Object *child = object_resolve_path_component(OBJECT(dev), name);
574 bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
579 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
580 if (strcmp(name, bus->name) == 0) {
587 int qdev_walk_children(DeviceState *dev,
588 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
589 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
596 err = pre_devfn(dev, opaque);
602 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
603 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
604 post_devfn, post_busfn, opaque);
611 err = post_devfn(dev, opaque);
620 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
626 QTAILQ_FOREACH(kid, &bus->children, sibling) {
627 DeviceState *dev = kid->child;
629 if (dev->id && strcmp(dev->id, id) == 0) {
633 QLIST_FOREACH(child, &dev->child_bus, sibling) {
634 ret = qdev_find_recursive(child, id);
643 static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
645 BusClass *bc = BUS_GET_CLASS(bus);
647 if (bc->get_fw_dev_path) {
648 return bc->get_fw_dev_path(dev);
654 static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
656 Object *obj = OBJECT(dev);
659 while (!d && obj->parent) {
661 d = fw_path_provider_try_get_dev_path(obj, bus, dev);
666 char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
668 Object *obj = OBJECT(dev);
670 return fw_path_provider_try_get_dev_path(obj, bus, dev);
673 static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
677 if (dev && dev->parent_bus) {
679 l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
680 d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
682 d = bus_get_fw_dev_path(dev->parent_bus, dev);
685 l += snprintf(p + l, size - l, "%s", d);
691 l += snprintf(p + l , size - l, "/");
696 char* qdev_get_fw_dev_path(DeviceState *dev)
701 l = qdev_get_fw_dev_path_helper(dev, path, 128);
705 return g_strdup(path);
708 char *qdev_get_dev_path(DeviceState *dev)
712 if (!dev || !dev->parent_bus) {
716 bc = BUS_GET_CLASS(dev->parent_bus);
717 if (bc->get_dev_path) {
718 return bc->get_dev_path(dev);
725 * Legacy property handling
728 static void qdev_get_legacy_property(Object *obj, Visitor *v,
729 const char *name, void *opaque,
732 DeviceState *dev = DEVICE(obj);
733 Property *prop = opaque;
738 prop->info->print(dev, prop, buffer, sizeof(buffer));
739 visit_type_str(v, name, &ptr, errp);
743 * qdev_property_add_legacy:
744 * @dev: Device to add the property to.
745 * @prop: The qdev property definition.
746 * @errp: location to store error information.
748 * Add a legacy QOM property to @dev for qdev property @prop.
749 * On error, store error in @errp.
751 * Legacy properties are string versions of QOM properties. The format of
752 * the string depends on the property type. Legacy properties are only
753 * needed for "info qtree".
755 * Do not use this is new code! QOM Properties added through this interface
756 * will be given names in the "legacy" namespace.
758 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
763 /* Register pointer properties as legacy properties */
764 if (!prop->info->print && prop->info->get) {
768 name = g_strdup_printf("legacy-%s", prop->name);
769 object_property_add(OBJECT(dev), name, "str",
770 prop->info->print ? qdev_get_legacy_property : prop->info->get,
779 * qdev_property_add_static:
780 * @dev: Device to add the property to.
781 * @prop: The qdev property definition.
782 * @errp: location to store error information.
784 * Add a static QOM property to @dev for qdev property @prop.
785 * On error, store error in @errp. Static properties access data in a struct.
786 * The type of the QOM property is derived from prop->info.
788 void qdev_property_add_static(DeviceState *dev, Property *prop,
791 Error *local_err = NULL;
792 Object *obj = OBJECT(dev);
795 * TODO qdev_prop_ptr does not have getters or setters. It must
796 * go now that it can be replaced with links. The test should be
797 * removed along with it: all static properties are read/write.
799 if (!prop->info->get && !prop->info->set) {
803 object_property_add(obj, prop->name, prop->info->name,
804 prop->info->get, prop->info->set,
809 error_propagate(errp, local_err);
813 object_property_set_description(obj, prop->name,
814 prop->info->description,
817 if (prop->qtype == QTYPE_NONE) {
821 if (prop->qtype == QTYPE_QBOOL) {
822 object_property_set_bool(obj, prop->defval, prop->name, &error_abort);
823 } else if (prop->info->enum_table) {
824 object_property_set_str(obj, prop->info->enum_table[prop->defval],
825 prop->name, &error_abort);
826 } else if (prop->qtype == QTYPE_QINT) {
827 object_property_set_int(obj, prop->defval, prop->name, &error_abort);
831 /* @qdev_alias_all_properties - Add alias properties to the source object for
832 * all qdev properties on the target DeviceState.
834 void qdev_alias_all_properties(DeviceState *target, Object *source)
839 class = object_get_class(OBJECT(target));
841 DeviceClass *dc = DEVICE_CLASS(class);
843 for (prop = dc->props; prop && prop->name; prop++) {
844 object_property_add_alias(source, prop->name,
845 OBJECT(target), prop->name,
848 class = object_class_get_parent(class);
849 } while (class != object_class_by_name(TYPE_DEVICE));
852 static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
854 GSList **list = opaque;
855 DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
862 if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
863 *list = g_slist_append(*list, dev);
869 GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
873 object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
878 static bool device_get_realized(Object *obj, Error **errp)
880 DeviceState *dev = DEVICE(obj);
881 return dev->realized;
884 static void device_set_realized(Object *obj, bool value, Error **errp)
886 DeviceState *dev = DEVICE(obj);
887 DeviceClass *dc = DEVICE_GET_CLASS(dev);
888 HotplugHandler *hotplug_ctrl;
890 Error *local_err = NULL;
891 bool unattached_parent = false;
892 static int unattached_count;
895 if (dev->hotplugged && !dc->hotpluggable) {
896 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
900 if (value && !dev->realized) {
901 ret = check_migratable(obj, &local_err);
907 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
909 object_property_add_child(container_get(qdev_get_machine(),
911 name, obj, &error_abort);
912 unattached_parent = true;
916 hotplug_ctrl = qdev_get_hotplug_handler(dev);
918 hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
919 if (local_err != NULL) {
925 dc->realize(dev, &local_err);
928 if (local_err != NULL) {
932 DEVICE_LISTENER_CALL(realize, Forward, dev);
935 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
938 if (local_err != NULL) {
939 goto post_realize_fail;
942 if (qdev_get_vmsd(dev)) {
943 if (vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
944 dev->instance_id_alias,
945 dev->alias_required_for_version,
947 goto post_realize_fail;
951 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
952 object_property_set_bool(OBJECT(bus), true, "realized",
954 if (local_err != NULL) {
955 goto child_realize_fail;
958 if (dev->hotplugged) {
961 dev->pending_deleted_event = false;
962 } else if (!value && dev->realized) {
963 Error **local_errp = NULL;
964 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
965 local_errp = local_err ? NULL : &local_err;
966 object_property_set_bool(OBJECT(bus), false, "realized",
969 if (qdev_get_vmsd(dev)) {
970 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
973 local_errp = local_err ? NULL : &local_err;
974 dc->unrealize(dev, local_errp);
976 dev->pending_deleted_event = true;
977 DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
980 if (local_err != NULL) {
984 dev->realized = value;
988 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
989 object_property_set_bool(OBJECT(bus), false, "realized",
993 if (qdev_get_vmsd(dev)) {
994 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
999 dc->unrealize(dev, NULL);
1003 error_propagate(errp, local_err);
1004 if (unattached_parent) {
1005 object_unparent(OBJECT(dev));
1010 static bool device_get_hotpluggable(Object *obj, Error **errp)
1012 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1013 DeviceState *dev = DEVICE(obj);
1015 return dc->hotpluggable && (dev->parent_bus == NULL ||
1016 qbus_is_hotpluggable(dev->parent_bus));
1019 static bool device_get_hotplugged(Object *obj, Error **err)
1021 DeviceState *dev = DEVICE(obj);
1023 return dev->hotplugged;
1026 static void device_set_hotplugged(Object *obj, bool value, Error **err)
1028 DeviceState *dev = DEVICE(obj);
1030 dev->hotplugged = value;
1033 static void device_initfn(Object *obj)
1035 DeviceState *dev = DEVICE(obj);
1040 dev->hotplugged = 1;
1041 qdev_hot_added = true;
1044 dev->instance_id_alias = -1;
1045 dev->realized = false;
1047 object_property_add_bool(obj, "realized",
1048 device_get_realized, device_set_realized, NULL);
1049 object_property_add_bool(obj, "hotpluggable",
1050 device_get_hotpluggable, NULL, NULL);
1051 object_property_add_bool(obj, "hotplugged",
1052 device_get_hotplugged, device_set_hotplugged,
1055 class = object_get_class(OBJECT(dev));
1057 for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
1058 qdev_property_add_legacy(dev, prop, &error_abort);
1059 qdev_property_add_static(dev, prop, &error_abort);
1061 class = object_class_get_parent(class);
1062 } while (class != object_class_by_name(TYPE_DEVICE));
1064 object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
1065 (Object **)&dev->parent_bus, NULL, 0,
1067 QLIST_INIT(&dev->gpios);
1070 static void device_post_init(Object *obj)
1072 qdev_prop_set_globals(DEVICE(obj));
1075 /* Unlink device from bus and free the structure. */
1076 static void device_finalize(Object *obj)
1078 NamedGPIOList *ngl, *next;
1080 DeviceState *dev = DEVICE(obj);
1082 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1083 QLIST_REMOVE(ngl, node);
1084 qemu_free_irqs(ngl->in, ngl->num_in);
1087 /* ngl->out irqs are owned by the other end and should not be freed
1093 static void device_class_base_init(ObjectClass *class, void *data)
1095 DeviceClass *klass = DEVICE_CLASS(class);
1097 /* We explicitly look up properties in the superclasses,
1098 * so do not propagate them to the subclasses.
1100 klass->props = NULL;
1103 static void device_unparent(Object *obj)
1105 DeviceState *dev = DEVICE(obj);
1108 if (dev->realized) {
1109 object_property_set_bool(obj, false, "realized", NULL);
1111 while (dev->num_child_bus) {
1112 bus = QLIST_FIRST(&dev->child_bus);
1113 object_unparent(OBJECT(bus));
1115 if (dev->parent_bus) {
1116 bus_remove_child(dev->parent_bus, dev);
1117 object_unref(OBJECT(dev->parent_bus));
1118 dev->parent_bus = NULL;
1121 /* Only send event if the device had been completely realized */
1122 if (dev->pending_deleted_event) {
1123 gchar *path = object_get_canonical_path(OBJECT(dev));
1125 qapi_event_send_device_deleted(!!dev->id, dev->id, path, &error_abort);
1129 qemu_opts_del(dev->opts);
1133 static void device_class_init(ObjectClass *class, void *data)
1135 DeviceClass *dc = DEVICE_CLASS(class);
1137 class->unparent = device_unparent;
1138 dc->realize = device_realize;
1139 dc->unrealize = device_unrealize;
1141 /* by default all devices were considered as hotpluggable,
1142 * so with intent to check it in generic qdev_unplug() /
1143 * device_set_realized() functions make every device
1144 * hotpluggable. Devices that shouldn't be hotpluggable,
1145 * should override it in their class_init()
1147 dc->hotpluggable = true;
1150 void device_reset(DeviceState *dev)
1152 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1159 Object *qdev_get_machine(void)
1164 dev = container_get(object_get_root(), "/machine");
1170 static const TypeInfo device_type_info = {
1171 .name = TYPE_DEVICE,
1172 .parent = TYPE_OBJECT,
1173 .instance_size = sizeof(DeviceState),
1174 .instance_init = device_initfn,
1175 .instance_post_init = device_post_init,
1176 .instance_finalize = device_finalize,
1177 .class_base_init = device_class_base_init,
1178 .class_init = device_class_init,
1180 .class_size = sizeof(DeviceClass),
1183 static void qdev_register_types(void)
1185 type_register_static(&device_type_info);
1188 type_init(qdev_register_types)