target/mips: Do not include CP0 helpers in user-mode emulation
[qemu/ar7.git] / hw / core / qdev.c
blobcbdff0b6c676f74e3844e1b26afffe39aef22bc3
1 /*
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.1 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
26 this API directly. */
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"
36 #include "hw/irq.h"
37 #include "hw/qdev-properties.h"
38 #include "hw/boards.h"
39 #include "hw/sysbus.h"
40 #include "hw/qdev-clock.h"
41 #include "migration/vmstate.h"
42 #include "trace.h"
44 bool qdev_hotplug = false;
45 static bool qdev_hot_added = false;
46 bool qdev_hot_removed = false;
48 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
50 DeviceClass *dc = DEVICE_GET_CLASS(dev);
51 return dc->vmsd;
54 static void bus_free_bus_child(BusChild *kid)
56 object_unref(OBJECT(kid->child));
57 g_free(kid);
60 static void bus_remove_child(BusState *bus, DeviceState *child)
62 BusChild *kid;
64 QTAILQ_FOREACH(kid, &bus->children, sibling) {
65 if (kid->child == child) {
66 char name[32];
68 snprintf(name, sizeof(name), "child[%d]", kid->index);
69 QTAILQ_REMOVE_RCU(&bus->children, kid, sibling);
71 bus->num_children--;
73 /* This gives back ownership of kid->child back to us. */
74 object_property_del(OBJECT(bus), name);
76 /* free the bus kid, when it is safe to do so*/
77 call_rcu(kid, bus_free_bus_child, rcu);
78 break;
83 static void bus_add_child(BusState *bus, DeviceState *child)
85 char name[32];
86 BusChild *kid = g_malloc0(sizeof(*kid));
88 bus->num_children++;
89 kid->index = bus->max_index++;
90 kid->child = child;
91 object_ref(OBJECT(kid->child));
93 QTAILQ_INSERT_HEAD_RCU(&bus->children, kid, sibling);
95 /* This transfers ownership of kid->child to the property. */
96 snprintf(name, sizeof(name), "child[%d]", kid->index);
97 object_property_add_link(OBJECT(bus), name,
98 object_get_typename(OBJECT(child)),
99 (Object **)&kid->child,
100 NULL, /* read-only property */
104 static bool bus_check_address(BusState *bus, DeviceState *child, Error **errp)
106 BusClass *bc = BUS_GET_CLASS(bus);
107 return !bc->check_address || bc->check_address(bus, child, errp);
110 bool qdev_set_parent_bus(DeviceState *dev, BusState *bus, Error **errp)
112 BusState *old_parent_bus = dev->parent_bus;
113 DeviceClass *dc = DEVICE_GET_CLASS(dev);
115 assert(dc->bus_type && object_dynamic_cast(OBJECT(bus), dc->bus_type));
117 if (!bus_check_address(bus, dev, errp)) {
118 return false;
121 if (old_parent_bus) {
122 trace_qdev_update_parent_bus(dev, object_get_typename(OBJECT(dev)),
123 old_parent_bus, object_get_typename(OBJECT(old_parent_bus)),
124 OBJECT(bus), object_get_typename(OBJECT(bus)));
126 * Keep a reference to the device while it's not plugged into
127 * any bus, to avoid it potentially evaporating when it is
128 * dereffed in bus_remove_child().
129 * Also keep the ref of the parent bus until the end, so that
130 * we can safely call resettable_change_parent() below.
132 object_ref(OBJECT(dev));
133 bus_remove_child(dev->parent_bus, dev);
135 dev->parent_bus = bus;
136 object_ref(OBJECT(bus));
137 bus_add_child(bus, dev);
138 if (dev->realized) {
139 resettable_change_parent(OBJECT(dev), OBJECT(bus),
140 OBJECT(old_parent_bus));
142 if (old_parent_bus) {
143 object_unref(OBJECT(old_parent_bus));
144 object_unref(OBJECT(dev));
146 return true;
149 DeviceState *qdev_new(const char *name)
151 if (!object_class_by_name(name)) {
152 module_load_qom_one(name);
154 return DEVICE(object_new(name));
157 DeviceState *qdev_try_new(const char *name)
159 if (!module_object_class_by_name(name)) {
160 return NULL;
162 return DEVICE(object_new(name));
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...) \
171 do { \
172 DeviceListener *_listener; \
174 switch (_direction) { \
175 case Forward: \
176 QTAILQ_FOREACH(_listener, &device_listeners, link) { \
177 if (_listener->_callback) { \
178 _listener->_callback(_listener, ##_args); \
181 break; \
182 case Reverse: \
183 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \
184 link) { \
185 if (_listener->_callback) { \
186 _listener->_callback(_listener, ##_args); \
189 break; \
190 default: \
191 abort(); \
193 } while (0)
195 static int device_listener_add(DeviceState *dev, void *opaque)
197 DEVICE_LISTENER_CALL(realize, Forward, dev);
199 return 0;
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,
207 NULL, NULL);
210 void device_listener_unregister(DeviceListener *listener)
212 QTAILQ_REMOVE(&device_listeners, listener, link);
215 bool qdev_should_hide_device(QemuOpts *opts)
217 DeviceListener *listener;
219 QTAILQ_FOREACH(listener, &device_listeners, link) {
220 if (listener->hide_device) {
221 if (listener->hide_device(listener, opts)) {
222 return true;
227 return false;
230 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
231 int required_for_version)
233 assert(!dev->realized);
234 dev->instance_id_alias = alias_id;
235 dev->alias_required_for_version = required_for_version;
238 HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev)
240 MachineState *machine;
241 MachineClass *mc;
242 Object *m_obj = qdev_get_machine();
244 if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
245 machine = MACHINE(m_obj);
246 mc = MACHINE_GET_CLASS(machine);
247 if (mc->get_hotplug_handler) {
248 return mc->get_hotplug_handler(machine, dev);
252 return NULL;
255 bool qdev_hotplug_allowed(DeviceState *dev, Error **errp)
257 MachineState *machine;
258 MachineClass *mc;
259 Object *m_obj = qdev_get_machine();
261 if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
262 machine = MACHINE(m_obj);
263 mc = MACHINE_GET_CLASS(machine);
264 if (mc->hotplug_allowed) {
265 return mc->hotplug_allowed(machine, dev, errp);
269 return true;
272 HotplugHandler *qdev_get_bus_hotplug_handler(DeviceState *dev)
274 if (dev->parent_bus) {
275 return dev->parent_bus->hotplug_handler;
277 return NULL;
280 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
282 HotplugHandler *hotplug_ctrl = qdev_get_machine_hotplug_handler(dev);
284 if (hotplug_ctrl == NULL && dev->parent_bus) {
285 hotplug_ctrl = qdev_get_bus_hotplug_handler(dev);
287 return hotplug_ctrl;
290 static int qdev_prereset(DeviceState *dev, void *opaque)
292 trace_qdev_reset_tree(dev, object_get_typename(OBJECT(dev)));
293 return 0;
296 static int qbus_prereset(BusState *bus, void *opaque)
298 trace_qbus_reset_tree(bus, object_get_typename(OBJECT(bus)));
299 return 0;
302 static int qdev_reset_one(DeviceState *dev, void *opaque)
304 device_legacy_reset(dev);
306 return 0;
309 static int qbus_reset_one(BusState *bus, void *opaque)
311 BusClass *bc = BUS_GET_CLASS(bus);
312 trace_qbus_reset(bus, object_get_typename(OBJECT(bus)));
313 if (bc->reset) {
314 bc->reset(bus);
316 return 0;
319 void qdev_reset_all(DeviceState *dev)
321 trace_qdev_reset_all(dev, object_get_typename(OBJECT(dev)));
322 qdev_walk_children(dev, qdev_prereset, qbus_prereset,
323 qdev_reset_one, qbus_reset_one, NULL);
326 void qdev_reset_all_fn(void *opaque)
328 qdev_reset_all(DEVICE(opaque));
331 void qbus_reset_all(BusState *bus)
333 trace_qbus_reset_all(bus, object_get_typename(OBJECT(bus)));
334 qbus_walk_children(bus, qdev_prereset, qbus_prereset,
335 qdev_reset_one, qbus_reset_one, NULL);
338 void qbus_reset_all_fn(void *opaque)
340 BusState *bus = opaque;
341 qbus_reset_all(bus);
344 void device_cold_reset(DeviceState *dev)
346 resettable_reset(OBJECT(dev), RESET_TYPE_COLD);
349 bool device_is_in_reset(DeviceState *dev)
351 return resettable_is_in_reset(OBJECT(dev));
354 static ResettableState *device_get_reset_state(Object *obj)
356 DeviceState *dev = DEVICE(obj);
357 return &dev->reset;
360 static void device_reset_child_foreach(Object *obj, ResettableChildCallback cb,
361 void *opaque, ResetType type)
363 DeviceState *dev = DEVICE(obj);
364 BusState *bus;
366 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
367 cb(OBJECT(bus), opaque, type);
371 /* can be used as ->unplug() callback for the simple cases */
372 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
373 DeviceState *dev, Error **errp)
375 qdev_unrealize(dev);
378 bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp)
380 assert(!dev->realized && !dev->parent_bus);
382 if (bus) {
383 if (!qdev_set_parent_bus(dev, bus, errp)) {
384 return false;
386 } else {
387 assert(!DEVICE_GET_CLASS(dev)->bus_type);
390 return object_property_set_bool(OBJECT(dev), "realized", true, errp);
393 bool qdev_realize_and_unref(DeviceState *dev, BusState *bus, Error **errp)
395 bool ret;
397 ret = qdev_realize(dev, bus, errp);
398 object_unref(OBJECT(dev));
399 return ret;
402 void qdev_unrealize(DeviceState *dev)
404 object_property_set_bool(OBJECT(dev), "realized", false, &error_abort);
407 static int qdev_assert_realized_properly(Object *obj, void *opaque)
409 DeviceState *dev = DEVICE(object_dynamic_cast(obj, TYPE_DEVICE));
410 DeviceClass *dc;
412 if (dev) {
413 dc = DEVICE_GET_CLASS(dev);
414 assert(dev->realized);
415 assert(dev->parent_bus || !dc->bus_type);
417 return 0;
420 void qdev_machine_creation_done(void)
423 * ok, initial machine setup is done, starting from now we can
424 * only create hotpluggable devices
426 qdev_hotplug = true;
428 object_child_foreach_recursive(object_get_root(),
429 qdev_assert_realized_properly, NULL);
432 bool qdev_machine_modified(void)
434 return qdev_hot_added || qdev_hot_removed;
437 BusState *qdev_get_parent_bus(DeviceState *dev)
439 return dev->parent_bus;
442 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
443 const char *name)
445 NamedGPIOList *ngl;
447 QLIST_FOREACH(ngl, &dev->gpios, node) {
448 /* NULL is a valid and matchable name. */
449 if (g_strcmp0(name, ngl->name) == 0) {
450 return ngl;
454 ngl = g_malloc0(sizeof(*ngl));
455 ngl->name = g_strdup(name);
456 QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
457 return ngl;
460 void qdev_init_gpio_in_named_with_opaque(DeviceState *dev,
461 qemu_irq_handler handler,
462 void *opaque,
463 const char *name, int n)
465 int i;
466 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
468 assert(gpio_list->num_out == 0 || !name);
469 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
470 opaque, n);
472 if (!name) {
473 name = "unnamed-gpio-in";
475 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
476 gchar *propname = g_strdup_printf("%s[%u]", name, i);
478 object_property_add_child(OBJECT(dev), propname,
479 OBJECT(gpio_list->in[i]));
480 g_free(propname);
483 gpio_list->num_in += n;
486 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
488 qdev_init_gpio_in_named(dev, handler, NULL, n);
491 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
492 const char *name, int n)
494 int i;
495 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
497 assert(gpio_list->num_in == 0 || !name);
499 if (!name) {
500 name = "unnamed-gpio-out";
502 memset(pins, 0, sizeof(*pins) * n);
503 for (i = 0; i < n; ++i) {
504 gchar *propname = g_strdup_printf("%s[%u]", name,
505 gpio_list->num_out + i);
507 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
508 (Object **)&pins[i],
509 object_property_allow_set_link,
510 OBJ_PROP_LINK_STRONG);
511 g_free(propname);
513 gpio_list->num_out += n;
516 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
518 qdev_init_gpio_out_named(dev, pins, NULL, n);
521 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
523 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
525 assert(n >= 0 && n < gpio_list->num_in);
526 return gpio_list->in[n];
529 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
531 return qdev_get_gpio_in_named(dev, NULL, n);
534 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
535 qemu_irq pin)
537 char *propname = g_strdup_printf("%s[%d]",
538 name ? name : "unnamed-gpio-out", n);
539 if (pin && !OBJECT(pin)->parent) {
540 /* We need a name for object_property_set_link to work */
541 object_property_add_child(container_get(qdev_get_machine(),
542 "/unattached"),
543 "non-qdev-gpio[*]", OBJECT(pin));
545 object_property_set_link(OBJECT(dev), propname, OBJECT(pin), &error_abort);
546 g_free(propname);
549 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
551 g_autofree char *propname = g_strdup_printf("%s[%d]",
552 name ? name : "unnamed-gpio-out", n);
554 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
555 NULL);
557 return ret;
560 /* disconnect a GPIO output, returning the disconnected input (if any) */
562 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
563 const char *name, int n)
565 char *propname = g_strdup_printf("%s[%d]",
566 name ? name : "unnamed-gpio-out", n);
568 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
569 NULL);
570 if (ret) {
571 object_property_set_link(OBJECT(dev), propname, NULL, NULL);
573 g_free(propname);
574 return ret;
577 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
578 const char *name, int n)
580 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
581 qdev_connect_gpio_out_named(dev, name, n, icpt);
582 return disconnected;
585 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
587 qdev_connect_gpio_out_named(dev, NULL, n, pin);
590 void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
591 const char *name)
593 int i;
594 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
596 for (i = 0; i < ngl->num_in; i++) {
597 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
598 char *propname = g_strdup_printf("%s[%d]", nm, i);
600 object_property_add_alias(OBJECT(container), propname,
601 OBJECT(dev), propname);
602 g_free(propname);
604 for (i = 0; i < ngl->num_out; i++) {
605 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
606 char *propname = g_strdup_printf("%s[%d]", nm, i);
608 object_property_add_alias(OBJECT(container), propname,
609 OBJECT(dev), propname);
610 g_free(propname);
612 QLIST_REMOVE(ngl, node);
613 QLIST_INSERT_HEAD(&container->gpios, ngl, node);
616 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
618 BusState *bus;
619 Object *child = object_resolve_path_component(OBJECT(dev), name);
621 bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
622 if (bus) {
623 return bus;
626 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
627 if (strcmp(name, bus->name) == 0) {
628 return bus;
631 return NULL;
634 int qdev_walk_children(DeviceState *dev,
635 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
636 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
637 void *opaque)
639 BusState *bus;
640 int err;
642 if (pre_devfn) {
643 err = pre_devfn(dev, opaque);
644 if (err) {
645 return err;
649 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
650 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
651 post_devfn, post_busfn, opaque);
652 if (err < 0) {
653 return err;
657 if (post_devfn) {
658 err = post_devfn(dev, opaque);
659 if (err) {
660 return err;
664 return 0;
667 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
669 BusChild *kid;
670 DeviceState *ret;
671 BusState *child;
673 WITH_RCU_READ_LOCK_GUARD() {
674 QTAILQ_FOREACH_RCU(kid, &bus->children, sibling) {
675 DeviceState *dev = kid->child;
677 if (dev->id && strcmp(dev->id, id) == 0) {
678 return dev;
681 QLIST_FOREACH(child, &dev->child_bus, sibling) {
682 ret = qdev_find_recursive(child, id);
683 if (ret) {
684 return ret;
689 return NULL;
692 char *qdev_get_dev_path(DeviceState *dev)
694 BusClass *bc;
696 if (!dev || !dev->parent_bus) {
697 return NULL;
700 bc = BUS_GET_CLASS(dev->parent_bus);
701 if (bc->get_dev_path) {
702 return bc->get_dev_path(dev);
705 return NULL;
709 * Legacy property handling
712 static void qdev_get_legacy_property(Object *obj, Visitor *v,
713 const char *name, void *opaque,
714 Error **errp)
716 DeviceState *dev = DEVICE(obj);
717 Property *prop = opaque;
719 char buffer[1024];
720 char *ptr = buffer;
722 prop->info->print(dev, prop, buffer, sizeof(buffer));
723 visit_type_str(v, name, &ptr, errp);
727 * qdev_class_add_legacy_property:
728 * @dev: Device to add the property to.
729 * @prop: The qdev property definition.
731 * Add a legacy QOM property to @dev for qdev property @prop.
733 * Legacy properties are string versions of QOM properties. The format of
734 * the string depends on the property type. Legacy properties are only
735 * needed for "info qtree".
737 * Do not use this in new code! QOM Properties added through this interface
738 * will be given names in the "legacy" namespace.
740 static void qdev_class_add_legacy_property(DeviceClass *dc, Property *prop)
742 g_autofree char *name = NULL;
744 /* Register pointer properties as legacy properties */
745 if (!prop->info->print && prop->info->get) {
746 return;
749 name = g_strdup_printf("legacy-%s", prop->name);
750 object_class_property_add(OBJECT_CLASS(dc), name, "str",
751 prop->info->print ? qdev_get_legacy_property : prop->info->get,
752 NULL, NULL, prop);
755 void qdev_property_add_static(DeviceState *dev, Property *prop)
757 Object *obj = OBJECT(dev);
758 ObjectProperty *op;
760 assert(!prop->info->create);
762 op = object_property_add(obj, prop->name, prop->info->name,
763 prop->info->get, prop->info->set,
764 prop->info->release,
765 prop);
767 object_property_set_description(obj, prop->name,
768 prop->info->description);
770 if (prop->set_default) {
771 prop->info->set_default_value(op, prop);
772 if (op->init) {
773 op->init(obj, op);
778 static void qdev_class_add_property(DeviceClass *klass, Property *prop)
780 ObjectClass *oc = OBJECT_CLASS(klass);
782 if (prop->info->create) {
783 prop->info->create(oc, prop);
784 } else {
785 ObjectProperty *op;
787 op = object_class_property_add(oc,
788 prop->name, prop->info->name,
789 prop->info->get, prop->info->set,
790 prop->info->release,
791 prop);
792 if (prop->set_default) {
793 prop->info->set_default_value(op, prop);
796 object_class_property_set_description(oc, prop->name,
797 prop->info->description);
800 void qdev_alias_all_properties(DeviceState *target, Object *source)
802 ObjectClass *class;
803 Property *prop;
805 class = object_get_class(OBJECT(target));
806 do {
807 DeviceClass *dc = DEVICE_CLASS(class);
809 for (prop = dc->props_; prop && prop->name; prop++) {
810 object_property_add_alias(source, prop->name,
811 OBJECT(target), prop->name);
813 class = object_class_get_parent(class);
814 } while (class != object_class_by_name(TYPE_DEVICE));
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));
831 return false;
834 return true;
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;
842 BusState *bus;
843 NamedClockList *ncl;
844 Error *local_err = NULL;
845 bool unattached_parent = false;
846 static int unattached_count;
848 if (dev->hotplugged && !dc->hotpluggable) {
849 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
850 return;
853 if (value && !dev->realized) {
854 if (!check_only_migratable(obj, errp)) {
855 goto fail;
858 if (!obj->parent) {
859 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
861 object_property_add_child(container_get(qdev_get_machine(),
862 "/unattached"),
863 name, obj);
864 unattached_parent = true;
865 g_free(name);
868 hotplug_ctrl = qdev_get_hotplug_handler(dev);
869 if (hotplug_ctrl) {
870 hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
871 if (local_err != NULL) {
872 goto fail;
876 if (dc->realize) {
877 dc->realize(dev, &local_err);
878 if (local_err != NULL) {
879 goto fail;
883 DEVICE_LISTENER_CALL(realize, Forward, dev);
886 * always free/re-initialize here since the value cannot be cleaned up
887 * in device_unrealize due to its usage later on in the unplug path
889 g_free(dev->canonical_path);
890 dev->canonical_path = object_get_canonical_path(OBJECT(dev));
891 QLIST_FOREACH(ncl, &dev->clocks, node) {
892 if (ncl->alias) {
893 continue;
894 } else {
895 clock_setup_canonical_path(ncl->clock);
899 if (qdev_get_vmsd(dev)) {
900 if (vmstate_register_with_alias_id(VMSTATE_IF(dev),
901 VMSTATE_INSTANCE_ID_ANY,
902 qdev_get_vmsd(dev), dev,
903 dev->instance_id_alias,
904 dev->alias_required_for_version,
905 &local_err) < 0) {
906 goto post_realize_fail;
911 * Clear the reset state, in case the object was previously unrealized
912 * with a dirty state.
914 resettable_state_clear(&dev->reset);
916 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
917 if (!qbus_realize(bus, errp)) {
918 goto child_realize_fail;
921 if (dev->hotplugged) {
923 * Reset the device, as well as its subtree which, at this point,
924 * should be realized too.
926 resettable_assert_reset(OBJECT(dev), RESET_TYPE_COLD);
927 resettable_change_parent(OBJECT(dev), OBJECT(dev->parent_bus),
928 NULL);
929 resettable_release_reset(OBJECT(dev), RESET_TYPE_COLD);
931 dev->pending_deleted_event = false;
933 if (hotplug_ctrl) {
934 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
935 if (local_err != NULL) {
936 goto child_realize_fail;
940 qatomic_store_release(&dev->realized, value);
942 } else if (!value && dev->realized) {
945 * Change the value so that any concurrent users are aware
946 * that the device is going to be unrealized
948 * TODO: change .realized property to enum that states
949 * each phase of the device realization/unrealization
952 qatomic_set(&dev->realized, value);
954 * Ensure that concurrent users see this update prior to
955 * any other changes done by unrealize.
957 smp_wmb();
959 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
960 qbus_unrealize(bus);
962 if (qdev_get_vmsd(dev)) {
963 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
965 if (dc->unrealize) {
966 dc->unrealize(dev);
968 dev->pending_deleted_event = true;
969 DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
972 assert(local_err == NULL);
973 return;
975 child_realize_fail:
976 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
977 qbus_unrealize(bus);
980 if (qdev_get_vmsd(dev)) {
981 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
984 post_realize_fail:
985 g_free(dev->canonical_path);
986 dev->canonical_path = NULL;
987 if (dc->unrealize) {
988 dc->unrealize(dev);
991 fail:
992 error_propagate(errp, local_err);
993 if (unattached_parent) {
995 * Beware, this doesn't just revert
996 * object_property_add_child(), it also runs bus_remove()!
998 object_unparent(OBJECT(dev));
999 unattached_count--;
1003 static bool device_get_hotpluggable(Object *obj, Error **errp)
1005 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1006 DeviceState *dev = DEVICE(obj);
1008 return dc->hotpluggable && (dev->parent_bus == NULL ||
1009 qbus_is_hotpluggable(dev->parent_bus));
1012 static bool device_get_hotplugged(Object *obj, Error **errp)
1014 DeviceState *dev = DEVICE(obj);
1016 return dev->hotplugged;
1019 static void device_initfn(Object *obj)
1021 DeviceState *dev = DEVICE(obj);
1023 if (qdev_hotplug) {
1024 dev->hotplugged = 1;
1025 qdev_hot_added = true;
1028 dev->instance_id_alias = -1;
1029 dev->realized = false;
1030 dev->allow_unplug_during_migration = false;
1032 QLIST_INIT(&dev->gpios);
1033 QLIST_INIT(&dev->clocks);
1036 static void device_post_init(Object *obj)
1039 * Note: ordered so that the user's global properties take
1040 * precedence.
1042 object_apply_compat_props(obj);
1043 qdev_prop_set_globals(DEVICE(obj));
1046 /* Unlink device from bus and free the structure. */
1047 static void device_finalize(Object *obj)
1049 NamedGPIOList *ngl, *next;
1051 DeviceState *dev = DEVICE(obj);
1053 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1054 QLIST_REMOVE(ngl, node);
1055 qemu_free_irqs(ngl->in, ngl->num_in);
1056 g_free(ngl->name);
1057 g_free(ngl);
1058 /* ngl->out irqs are owned by the other end and should not be freed
1059 * here
1063 qdev_finalize_clocklist(dev);
1065 /* Only send event if the device had been completely realized */
1066 if (dev->pending_deleted_event) {
1067 g_assert(dev->canonical_path);
1069 qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path);
1070 g_free(dev->canonical_path);
1071 dev->canonical_path = NULL;
1074 qemu_opts_del(dev->opts);
1077 static void device_class_base_init(ObjectClass *class, void *data)
1079 DeviceClass *klass = DEVICE_CLASS(class);
1081 /* We explicitly look up properties in the superclasses,
1082 * so do not propagate them to the subclasses.
1084 klass->props_ = NULL;
1087 static void device_unparent(Object *obj)
1089 DeviceState *dev = DEVICE(obj);
1090 BusState *bus;
1092 if (dev->realized) {
1093 qdev_unrealize(dev);
1095 while (dev->num_child_bus) {
1096 bus = QLIST_FIRST(&dev->child_bus);
1097 object_unparent(OBJECT(bus));
1099 if (dev->parent_bus) {
1100 bus_remove_child(dev->parent_bus, dev);
1101 object_unref(OBJECT(dev->parent_bus));
1102 dev->parent_bus = NULL;
1106 static char *
1107 device_vmstate_if_get_id(VMStateIf *obj)
1109 DeviceState *dev = DEVICE(obj);
1111 return qdev_get_dev_path(dev);
1115 * device_phases_reset:
1116 * Transition reset method for devices to allow moving
1117 * smoothly from legacy reset method to multi-phases
1119 static void device_phases_reset(DeviceState *dev)
1121 ResettableClass *rc = RESETTABLE_GET_CLASS(dev);
1123 if (rc->phases.enter) {
1124 rc->phases.enter(OBJECT(dev), RESET_TYPE_COLD);
1126 if (rc->phases.hold) {
1127 rc->phases.hold(OBJECT(dev));
1129 if (rc->phases.exit) {
1130 rc->phases.exit(OBJECT(dev));
1134 static void device_transitional_reset(Object *obj)
1136 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1139 * This will call either @device_phases_reset (for multi-phases transitioned
1140 * devices) or a device's specific method for not-yet transitioned devices.
1141 * In both case, it does not reset children.
1143 if (dc->reset) {
1144 dc->reset(DEVICE(obj));
1149 * device_get_transitional_reset:
1150 * check if the device's class is ready for multi-phase
1152 static ResettableTrFunction device_get_transitional_reset(Object *obj)
1154 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1155 if (dc->reset != device_phases_reset) {
1157 * dc->reset has been overridden by a subclass,
1158 * the device is not ready for multi phase yet.
1160 return device_transitional_reset;
1162 return NULL;
1165 static void device_class_init(ObjectClass *class, void *data)
1167 DeviceClass *dc = DEVICE_CLASS(class);
1168 VMStateIfClass *vc = VMSTATE_IF_CLASS(class);
1169 ResettableClass *rc = RESETTABLE_CLASS(class);
1171 class->unparent = device_unparent;
1173 /* by default all devices were considered as hotpluggable,
1174 * so with intent to check it in generic qdev_unplug() /
1175 * device_set_realized() functions make every device
1176 * hotpluggable. Devices that shouldn't be hotpluggable,
1177 * should override it in their class_init()
1179 dc->hotpluggable = true;
1180 dc->user_creatable = true;
1181 vc->get_id = device_vmstate_if_get_id;
1182 rc->get_state = device_get_reset_state;
1183 rc->child_foreach = device_reset_child_foreach;
1186 * @device_phases_reset is put as the default reset method below, allowing
1187 * to do the multi-phase transition from base classes to leaf classes. It
1188 * allows a legacy-reset Device class to extend a multi-phases-reset
1189 * Device class for the following reason:
1190 * + If a base class B has been moved to multi-phase, then it does not
1191 * override this default reset method and may have defined phase methods.
1192 * + A child class C (extending class B) which uses
1193 * device_class_set_parent_reset() (or similar means) to override the
1194 * reset method will still work as expected. @device_phases_reset function
1195 * will be registered as the parent reset method and effectively call
1196 * parent reset phases.
1198 dc->reset = device_phases_reset;
1199 rc->get_transitional_function = device_get_transitional_reset;
1201 object_class_property_add_bool(class, "realized",
1202 device_get_realized, device_set_realized);
1203 object_class_property_add_bool(class, "hotpluggable",
1204 device_get_hotpluggable, NULL);
1205 object_class_property_add_bool(class, "hotplugged",
1206 device_get_hotplugged, NULL);
1207 object_class_property_add_link(class, "parent_bus", TYPE_BUS,
1208 offsetof(DeviceState, parent_bus), NULL, 0);
1211 void device_class_set_props(DeviceClass *dc, Property *props)
1213 Property *prop;
1215 dc->props_ = props;
1216 for (prop = props; prop && prop->name; prop++) {
1217 qdev_class_add_legacy_property(dc, prop);
1218 qdev_class_add_property(dc, prop);
1222 void device_class_set_parent_reset(DeviceClass *dc,
1223 DeviceReset dev_reset,
1224 DeviceReset *parent_reset)
1226 *parent_reset = dc->reset;
1227 dc->reset = dev_reset;
1230 void device_class_set_parent_realize(DeviceClass *dc,
1231 DeviceRealize dev_realize,
1232 DeviceRealize *parent_realize)
1234 *parent_realize = dc->realize;
1235 dc->realize = dev_realize;
1238 void device_class_set_parent_unrealize(DeviceClass *dc,
1239 DeviceUnrealize dev_unrealize,
1240 DeviceUnrealize *parent_unrealize)
1242 *parent_unrealize = dc->unrealize;
1243 dc->unrealize = dev_unrealize;
1246 void device_legacy_reset(DeviceState *dev)
1248 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1250 trace_qdev_reset(dev, object_get_typename(OBJECT(dev)));
1251 if (klass->reset) {
1252 klass->reset(dev);
1256 Object *qdev_get_machine(void)
1258 static Object *dev;
1260 if (dev == NULL) {
1261 dev = container_get(object_get_root(), "/machine");
1264 return dev;
1267 static const TypeInfo device_type_info = {
1268 .name = TYPE_DEVICE,
1269 .parent = TYPE_OBJECT,
1270 .instance_size = sizeof(DeviceState),
1271 .instance_init = device_initfn,
1272 .instance_post_init = device_post_init,
1273 .instance_finalize = device_finalize,
1274 .class_base_init = device_class_base_init,
1275 .class_init = device_class_init,
1276 .abstract = true,
1277 .class_size = sizeof(DeviceClass),
1278 .interfaces = (InterfaceInfo[]) {
1279 { TYPE_VMSTATE_IF },
1280 { TYPE_RESETTABLE_INTERFACE },
1285 static void qdev_register_types(void)
1287 type_register_static(&device_type_info);
1290 type_init(qdev_register_types)