xref: /openbmc/qemu/hw/core/qdev.c (revision d3fd6e7380b6212a3cd0b9f1304c84d8caa8dcf7)
1 /*
2  *  Dynamic device configuration and creation.
3  *
4  *  Copyright (c) 2009 CodeSourcery
5  *
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.
10  *
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.
15  *
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/>.
18  */
19 
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.  */
27 
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"
43 
44 bool qdev_hotplug = false;
45 static bool qdev_hot_added = false;
46 bool qdev_hot_removed = false;
47 
48 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
49 {
50     DeviceClass *dc = DEVICE_GET_CLASS(dev);
51     return dc->vmsd;
52 }
53 
54 static void bus_free_bus_child(BusChild *kid)
55 {
56     object_unref(OBJECT(kid->child));
57     g_free(kid);
58 }
59 
60 static void bus_remove_child(BusState *bus, DeviceState *child)
61 {
62     BusChild *kid;
63 
64     QTAILQ_FOREACH(kid, &bus->children, sibling) {
65         if (kid->child == child) {
66             char name[32];
67 
68             snprintf(name, sizeof(name), "child[%d]", kid->index);
69             QTAILQ_REMOVE_RCU(&bus->children, kid, sibling);
70 
71             bus->num_children--;
72 
73             /* This gives back ownership of kid->child back to us.  */
74             object_property_del(OBJECT(bus), name);
75 
76             /* free the bus kid, when it is safe to do so*/
77             call_rcu(kid, bus_free_bus_child, rcu);
78             break;
79         }
80     }
81 }
82 
83 static void bus_add_child(BusState *bus, DeviceState *child)
84 {
85     char name[32];
86     BusChild *kid = g_malloc0(sizeof(*kid));
87 
88     bus->num_children++;
89     kid->index = bus->max_index++;
90     kid->child = child;
91     object_ref(OBJECT(kid->child));
92 
93     QTAILQ_INSERT_HEAD_RCU(&bus->children, kid, sibling);
94 
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 */
101                              0);
102 }
103 
104 static bool bus_check_address(BusState *bus, DeviceState *child, Error **errp)
105 {
106     BusClass *bc = BUS_GET_CLASS(bus);
107     return !bc->check_address || bc->check_address(bus, child, errp);
108 }
109 
110 bool qdev_set_parent_bus(DeviceState *dev, BusState *bus, Error **errp)
111 {
112     BusState *old_parent_bus = dev->parent_bus;
113     DeviceClass *dc = DEVICE_GET_CLASS(dev);
114 
115     assert(dc->bus_type && object_dynamic_cast(OBJECT(bus), dc->bus_type));
116 
117     if (!bus_check_address(bus, dev, errp)) {
118         return false;
119     }
120 
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)));
125         /*
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.
131          */
132         object_ref(OBJECT(dev));
133         bus_remove_child(dev->parent_bus, dev);
134     }
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));
141     }
142     if (old_parent_bus) {
143         object_unref(OBJECT(old_parent_bus));
144         object_unref(OBJECT(dev));
145     }
146     return true;
147 }
148 
149 DeviceState *qdev_new(const char *name)
150 {
151     if (!object_class_by_name(name)) {
152         module_load_qom_one(name);
153     }
154     return DEVICE(object_new(name));
155 }
156 
157 DeviceState *qdev_try_new(const char *name)
158 {
159     if (!module_object_class_by_name(name)) {
160         return NULL;
161     }
162     return DEVICE(object_new(name));
163 }
164 
165 static QTAILQ_HEAD(, DeviceListener) device_listeners
166     = QTAILQ_HEAD_INITIALIZER(device_listeners);
167 
168 enum ListenerDirection { Forward, Reverse };
169 
170 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...)     \
171     do {                                                          \
172         DeviceListener *_listener;                                \
173                                                                   \
174         switch (_direction) {                                     \
175         case Forward:                                             \
176             QTAILQ_FOREACH(_listener, &device_listeners, link) {  \
177                 if (_listener->_callback) {                       \
178                     _listener->_callback(_listener, ##_args);     \
179                 }                                                 \
180             }                                                     \
181             break;                                                \
182         case Reverse:                                             \
183             QTAILQ_FOREACH_REVERSE(_listener, &device_listeners,  \
184                                    link) {                        \
185                 if (_listener->_callback) {                       \
186                     _listener->_callback(_listener, ##_args);     \
187                 }                                                 \
188             }                                                     \
189             break;                                                \
190         default:                                                  \
191             abort();                                              \
192         }                                                         \
193     } while (0)
194 
195 static int device_listener_add(DeviceState *dev, void *opaque)
196 {
197     DEVICE_LISTENER_CALL(realize, Forward, dev);
198 
199     return 0;
200 }
201 
202 void device_listener_register(DeviceListener *listener)
203 {
204     QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
205 
206     qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
207                        NULL, NULL);
208 }
209 
210 void device_listener_unregister(DeviceListener *listener)
211 {
212     QTAILQ_REMOVE(&device_listeners, listener, link);
213 }
214 
215 bool qdev_should_hide_device(QemuOpts *opts)
216 {
217     DeviceListener *listener;
218 
219     QTAILQ_FOREACH(listener, &device_listeners, link) {
220         if (listener->hide_device) {
221             if (listener->hide_device(listener, opts)) {
222                 return true;
223             }
224         }
225     }
226 
227     return false;
228 }
229 
230 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
231                                  int required_for_version)
232 {
233     assert(!dev->realized);
234     dev->instance_id_alias = alias_id;
235     dev->alias_required_for_version = required_for_version;
236 }
237 
238 HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev)
239 {
240     MachineState *machine;
241     MachineClass *mc;
242     Object *m_obj = qdev_get_machine();
243 
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);
249         }
250     }
251 
252     return NULL;
253 }
254 
255 bool qdev_hotplug_allowed(DeviceState *dev, Error **errp)
256 {
257     MachineState *machine;
258     MachineClass *mc;
259     Object *m_obj = qdev_get_machine();
260 
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);
266         }
267     }
268 
269     return true;
270 }
271 
272 HotplugHandler *qdev_get_bus_hotplug_handler(DeviceState *dev)
273 {
274     if (dev->parent_bus) {
275         return dev->parent_bus->hotplug_handler;
276     }
277     return NULL;
278 }
279 
280 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
281 {
282     HotplugHandler *hotplug_ctrl = qdev_get_machine_hotplug_handler(dev);
283 
284     if (hotplug_ctrl == NULL && dev->parent_bus) {
285         hotplug_ctrl = qdev_get_bus_hotplug_handler(dev);
286     }
287     return hotplug_ctrl;
288 }
289 
290 static int qdev_prereset(DeviceState *dev, void *opaque)
291 {
292     trace_qdev_reset_tree(dev, object_get_typename(OBJECT(dev)));
293     return 0;
294 }
295 
296 static int qbus_prereset(BusState *bus, void *opaque)
297 {
298     trace_qbus_reset_tree(bus, object_get_typename(OBJECT(bus)));
299     return 0;
300 }
301 
302 static int qdev_reset_one(DeviceState *dev, void *opaque)
303 {
304     device_legacy_reset(dev);
305 
306     return 0;
307 }
308 
309 static int qbus_reset_one(BusState *bus, void *opaque)
310 {
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);
315     }
316     return 0;
317 }
318 
319 void qdev_reset_all(DeviceState *dev)
320 {
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);
324 }
325 
326 void qdev_reset_all_fn(void *opaque)
327 {
328     qdev_reset_all(DEVICE(opaque));
329 }
330 
331 void qbus_reset_all(BusState *bus)
332 {
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);
336 }
337 
338 void qbus_reset_all_fn(void *opaque)
339 {
340     BusState *bus = opaque;
341     qbus_reset_all(bus);
342 }
343 
344 void device_cold_reset(DeviceState *dev)
345 {
346     resettable_reset(OBJECT(dev), RESET_TYPE_COLD);
347 }
348 
349 bool device_is_in_reset(DeviceState *dev)
350 {
351     return resettable_is_in_reset(OBJECT(dev));
352 }
353 
354 static ResettableState *device_get_reset_state(Object *obj)
355 {
356     DeviceState *dev = DEVICE(obj);
357     return &dev->reset;
358 }
359 
360 static void device_reset_child_foreach(Object *obj, ResettableChildCallback cb,
361                                        void *opaque, ResetType type)
362 {
363     DeviceState *dev = DEVICE(obj);
364     BusState *bus;
365 
366     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
367         cb(OBJECT(bus), opaque, type);
368     }
369 }
370 
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)
374 {
375     qdev_unrealize(dev);
376 }
377 
378 bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp)
379 {
380     assert(!dev->realized && !dev->parent_bus);
381 
382     if (bus) {
383         if (!qdev_set_parent_bus(dev, bus, errp)) {
384             return false;
385         }
386     } else {
387         assert(!DEVICE_GET_CLASS(dev)->bus_type);
388     }
389 
390     return object_property_set_bool(OBJECT(dev), "realized", true, errp);
391 }
392 
393 bool qdev_realize_and_unref(DeviceState *dev, BusState *bus, Error **errp)
394 {
395     bool ret;
396 
397     ret = qdev_realize(dev, bus, errp);
398     object_unref(OBJECT(dev));
399     return ret;
400 }
401 
402 void qdev_unrealize(DeviceState *dev)
403 {
404     object_property_set_bool(OBJECT(dev), "realized", false, &error_abort);
405 }
406 
407 static int qdev_assert_realized_properly(Object *obj, void *opaque)
408 {
409     DeviceState *dev = DEVICE(object_dynamic_cast(obj, TYPE_DEVICE));
410     DeviceClass *dc;
411 
412     if (dev) {
413         dc = DEVICE_GET_CLASS(dev);
414         assert(dev->realized);
415         assert(dev->parent_bus || !dc->bus_type);
416     }
417     return 0;
418 }
419 
420 void qdev_machine_creation_done(void)
421 {
422     /*
423      * ok, initial machine setup is done, starting from now we can
424      * only create hotpluggable devices
425      */
426     qdev_hotplug = true;
427 
428     object_child_foreach_recursive(object_get_root(),
429                                    qdev_assert_realized_properly, NULL);
430 }
431 
432 bool qdev_machine_modified(void)
433 {
434     return qdev_hot_added || qdev_hot_removed;
435 }
436 
437 BusState *qdev_get_parent_bus(DeviceState *dev)
438 {
439     return dev->parent_bus;
440 }
441 
442 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
443                                                const char *name)
444 {
445     NamedGPIOList *ngl;
446 
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;
451         }
452     }
453 
454     ngl = g_malloc0(sizeof(*ngl));
455     ngl->name = g_strdup(name);
456     QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
457     return ngl;
458 }
459 
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)
464 {
465     int i;
466     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
467 
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);
471 
472     if (!name) {
473         name = "unnamed-gpio-in";
474     }
475     for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
476         gchar *propname = g_strdup_printf("%s[%u]", name, i);
477 
478         object_property_add_child(OBJECT(dev), propname,
479                                   OBJECT(gpio_list->in[i]));
480         g_free(propname);
481     }
482 
483     gpio_list->num_in += n;
484 }
485 
486 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
487 {
488     qdev_init_gpio_in_named(dev, handler, NULL, n);
489 }
490 
491 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
492                               const char *name, int n)
493 {
494     int i;
495     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
496 
497     assert(gpio_list->num_in == 0 || !name);
498 
499     if (!name) {
500         name = "unnamed-gpio-out";
501     }
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);
506 
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);
512     }
513     gpio_list->num_out += n;
514 }
515 
516 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
517 {
518     qdev_init_gpio_out_named(dev, pins, NULL, n);
519 }
520 
521 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
522 {
523     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
524 
525     assert(n >= 0 && n < gpio_list->num_in);
526     return gpio_list->in[n];
527 }
528 
529 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
530 {
531     return qdev_get_gpio_in_named(dev, NULL, n);
532 }
533 
534 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
535                                  qemu_irq pin)
536 {
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));
544     }
545     object_property_set_link(OBJECT(dev), propname, OBJECT(pin), &error_abort);
546     g_free(propname);
547 }
548 
549 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
550 {
551     g_autofree char *propname = g_strdup_printf("%s[%d]",
552                                      name ? name : "unnamed-gpio-out", n);
553 
554     qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
555                                                       NULL);
556 
557     return ret;
558 }
559 
560 /* disconnect a GPIO output, returning the disconnected input (if any) */
561 
562 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
563                                                const char *name, int n)
564 {
565     char *propname = g_strdup_printf("%s[%d]",
566                                      name ? name : "unnamed-gpio-out", n);
567 
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);
572     }
573     g_free(propname);
574     return ret;
575 }
576 
577 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
578                                  const char *name, int n)
579 {
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;
583 }
584 
585 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
586 {
587     qdev_connect_gpio_out_named(dev, NULL, n, pin);
588 }
589 
590 void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
591                      const char *name)
592 {
593     int i;
594     NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
595 
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);
599 
600         object_property_add_alias(OBJECT(container), propname,
601                                   OBJECT(dev), propname);
602         g_free(propname);
603     }
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);
607 
608         object_property_add_alias(OBJECT(container), propname,
609                                   OBJECT(dev), propname);
610         g_free(propname);
611     }
612     QLIST_REMOVE(ngl, node);
613     QLIST_INSERT_HEAD(&container->gpios, ngl, node);
614 }
615 
616 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
617 {
618     BusState *bus;
619     Object *child = object_resolve_path_component(OBJECT(dev), name);
620 
621     bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
622     if (bus) {
623         return bus;
624     }
625 
626     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
627         if (strcmp(name, bus->name) == 0) {
628             return bus;
629         }
630     }
631     return NULL;
632 }
633 
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)
638 {
639     BusState *bus;
640     int err;
641 
642     if (pre_devfn) {
643         err = pre_devfn(dev, opaque);
644         if (err) {
645             return err;
646         }
647     }
648 
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;
654         }
655     }
656 
657     if (post_devfn) {
658         err = post_devfn(dev, opaque);
659         if (err) {
660             return err;
661         }
662     }
663 
664     return 0;
665 }
666 
667 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
668 {
669     BusChild *kid;
670     DeviceState *ret;
671     BusState *child;
672 
673     WITH_RCU_READ_LOCK_GUARD() {
674         QTAILQ_FOREACH_RCU(kid, &bus->children, sibling) {
675             DeviceState *dev = kid->child;
676 
677             if (dev->id && strcmp(dev->id, id) == 0) {
678                 return dev;
679             }
680 
681             QLIST_FOREACH(child, &dev->child_bus, sibling) {
682                 ret = qdev_find_recursive(child, id);
683                 if (ret) {
684                     return ret;
685                 }
686             }
687         }
688     }
689     return NULL;
690 }
691 
692 char *qdev_get_dev_path(DeviceState *dev)
693 {
694     BusClass *bc;
695 
696     if (!dev || !dev->parent_bus) {
697         return NULL;
698     }
699 
700     bc = BUS_GET_CLASS(dev->parent_bus);
701     if (bc->get_dev_path) {
702         return bc->get_dev_path(dev);
703     }
704 
705     return NULL;
706 }
707 
708 static bool device_get_realized(Object *obj, Error **errp)
709 {
710     DeviceState *dev = DEVICE(obj);
711     return dev->realized;
712 }
713 
714 static bool check_only_migratable(Object *obj, Error **errp)
715 {
716     DeviceClass *dc = DEVICE_GET_CLASS(obj);
717 
718     if (!vmstate_check_only_migratable(dc->vmsd)) {
719         error_setg(errp, "Device %s is not migratable, but "
720                    "--only-migratable was specified",
721                    object_get_typename(obj));
722         return false;
723     }
724 
725     return true;
726 }
727 
728 static void device_set_realized(Object *obj, bool value, Error **errp)
729 {
730     DeviceState *dev = DEVICE(obj);
731     DeviceClass *dc = DEVICE_GET_CLASS(dev);
732     HotplugHandler *hotplug_ctrl;
733     BusState *bus;
734     NamedClockList *ncl;
735     Error *local_err = NULL;
736     bool unattached_parent = false;
737     static int unattached_count;
738 
739     if (dev->hotplugged && !dc->hotpluggable) {
740         error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
741         return;
742     }
743 
744     if (value && !dev->realized) {
745         if (!check_only_migratable(obj, errp)) {
746             goto fail;
747         }
748 
749         if (!obj->parent) {
750             gchar *name = g_strdup_printf("device[%d]", unattached_count++);
751 
752             object_property_add_child(container_get(qdev_get_machine(),
753                                                     "/unattached"),
754                                       name, obj);
755             unattached_parent = true;
756             g_free(name);
757         }
758 
759         hotplug_ctrl = qdev_get_hotplug_handler(dev);
760         if (hotplug_ctrl) {
761             hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
762             if (local_err != NULL) {
763                 goto fail;
764             }
765         }
766 
767         if (dc->realize) {
768             dc->realize(dev, &local_err);
769             if (local_err != NULL) {
770                 goto fail;
771             }
772         }
773 
774         DEVICE_LISTENER_CALL(realize, Forward, dev);
775 
776         /*
777          * always free/re-initialize here since the value cannot be cleaned up
778          * in device_unrealize due to its usage later on in the unplug path
779          */
780         g_free(dev->canonical_path);
781         dev->canonical_path = object_get_canonical_path(OBJECT(dev));
782         QLIST_FOREACH(ncl, &dev->clocks, node) {
783             if (ncl->alias) {
784                 continue;
785             } else {
786                 clock_setup_canonical_path(ncl->clock);
787             }
788         }
789 
790         if (qdev_get_vmsd(dev)) {
791             if (vmstate_register_with_alias_id(VMSTATE_IF(dev),
792                                                VMSTATE_INSTANCE_ID_ANY,
793                                                qdev_get_vmsd(dev), dev,
794                                                dev->instance_id_alias,
795                                                dev->alias_required_for_version,
796                                                &local_err) < 0) {
797                 goto post_realize_fail;
798             }
799         }
800 
801         /*
802          * Clear the reset state, in case the object was previously unrealized
803          * with a dirty state.
804          */
805         resettable_state_clear(&dev->reset);
806 
807         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
808             if (!qbus_realize(bus, errp)) {
809                 goto child_realize_fail;
810             }
811         }
812         if (dev->hotplugged) {
813             /*
814              * Reset the device, as well as its subtree which, at this point,
815              * should be realized too.
816              */
817             resettable_assert_reset(OBJECT(dev), RESET_TYPE_COLD);
818             resettable_change_parent(OBJECT(dev), OBJECT(dev->parent_bus),
819                                      NULL);
820             resettable_release_reset(OBJECT(dev), RESET_TYPE_COLD);
821         }
822         dev->pending_deleted_event = false;
823 
824         if (hotplug_ctrl) {
825             hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
826             if (local_err != NULL) {
827                 goto child_realize_fail;
828             }
829        }
830 
831        qatomic_store_release(&dev->realized, value);
832 
833     } else if (!value && dev->realized) {
834 
835         /*
836          * Change the value so that any concurrent users are aware
837          * that the device is going to be unrealized
838          *
839          * TODO: change .realized property to enum that states
840          * each phase of the device realization/unrealization
841          */
842 
843         qatomic_set(&dev->realized, value);
844         /*
845          * Ensure that concurrent users see this update prior to
846          * any other changes done by unrealize.
847          */
848         smp_wmb();
849 
850         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
851             qbus_unrealize(bus);
852         }
853         if (qdev_get_vmsd(dev)) {
854             vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
855         }
856         if (dc->unrealize) {
857             dc->unrealize(dev);
858         }
859         dev->pending_deleted_event = true;
860         DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
861     }
862 
863     assert(local_err == NULL);
864     return;
865 
866 child_realize_fail:
867     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
868         qbus_unrealize(bus);
869     }
870 
871     if (qdev_get_vmsd(dev)) {
872         vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
873     }
874 
875 post_realize_fail:
876     g_free(dev->canonical_path);
877     dev->canonical_path = NULL;
878     if (dc->unrealize) {
879         dc->unrealize(dev);
880     }
881 
882 fail:
883     error_propagate(errp, local_err);
884     if (unattached_parent) {
885         /*
886          * Beware, this doesn't just revert
887          * object_property_add_child(), it also runs bus_remove()!
888          */
889         object_unparent(OBJECT(dev));
890         unattached_count--;
891     }
892 }
893 
894 static bool device_get_hotpluggable(Object *obj, Error **errp)
895 {
896     DeviceClass *dc = DEVICE_GET_CLASS(obj);
897     DeviceState *dev = DEVICE(obj);
898 
899     return dc->hotpluggable && (dev->parent_bus == NULL ||
900                                 qbus_is_hotpluggable(dev->parent_bus));
901 }
902 
903 static bool device_get_hotplugged(Object *obj, Error **errp)
904 {
905     DeviceState *dev = DEVICE(obj);
906 
907     return dev->hotplugged;
908 }
909 
910 static void device_initfn(Object *obj)
911 {
912     DeviceState *dev = DEVICE(obj);
913 
914     if (qdev_hotplug) {
915         dev->hotplugged = 1;
916         qdev_hot_added = true;
917     }
918 
919     dev->instance_id_alias = -1;
920     dev->realized = false;
921     dev->allow_unplug_during_migration = false;
922 
923     QLIST_INIT(&dev->gpios);
924     QLIST_INIT(&dev->clocks);
925 }
926 
927 static void device_post_init(Object *obj)
928 {
929     /*
930      * Note: ordered so that the user's global properties take
931      * precedence.
932      */
933     object_apply_compat_props(obj);
934     qdev_prop_set_globals(DEVICE(obj));
935 }
936 
937 /* Unlink device from bus and free the structure.  */
938 static void device_finalize(Object *obj)
939 {
940     NamedGPIOList *ngl, *next;
941 
942     DeviceState *dev = DEVICE(obj);
943 
944     QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
945         QLIST_REMOVE(ngl, node);
946         qemu_free_irqs(ngl->in, ngl->num_in);
947         g_free(ngl->name);
948         g_free(ngl);
949         /* ngl->out irqs are owned by the other end and should not be freed
950          * here
951          */
952     }
953 
954     qdev_finalize_clocklist(dev);
955 
956     /* Only send event if the device had been completely realized */
957     if (dev->pending_deleted_event) {
958         g_assert(dev->canonical_path);
959 
960         qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path);
961         g_free(dev->canonical_path);
962         dev->canonical_path = NULL;
963     }
964 
965     qemu_opts_del(dev->opts);
966 }
967 
968 static void device_class_base_init(ObjectClass *class, void *data)
969 {
970     DeviceClass *klass = DEVICE_CLASS(class);
971 
972     /* We explicitly look up properties in the superclasses,
973      * so do not propagate them to the subclasses.
974      */
975     klass->props_ = NULL;
976 }
977 
978 static void device_unparent(Object *obj)
979 {
980     DeviceState *dev = DEVICE(obj);
981     BusState *bus;
982 
983     if (dev->realized) {
984         qdev_unrealize(dev);
985     }
986     while (dev->num_child_bus) {
987         bus = QLIST_FIRST(&dev->child_bus);
988         object_unparent(OBJECT(bus));
989     }
990     if (dev->parent_bus) {
991         bus_remove_child(dev->parent_bus, dev);
992         object_unref(OBJECT(dev->parent_bus));
993         dev->parent_bus = NULL;
994     }
995 }
996 
997 static char *
998 device_vmstate_if_get_id(VMStateIf *obj)
999 {
1000     DeviceState *dev = DEVICE(obj);
1001 
1002     return qdev_get_dev_path(dev);
1003 }
1004 
1005 /**
1006  * device_phases_reset:
1007  * Transition reset method for devices to allow moving
1008  * smoothly from legacy reset method to multi-phases
1009  */
1010 static void device_phases_reset(DeviceState *dev)
1011 {
1012     ResettableClass *rc = RESETTABLE_GET_CLASS(dev);
1013 
1014     if (rc->phases.enter) {
1015         rc->phases.enter(OBJECT(dev), RESET_TYPE_COLD);
1016     }
1017     if (rc->phases.hold) {
1018         rc->phases.hold(OBJECT(dev));
1019     }
1020     if (rc->phases.exit) {
1021         rc->phases.exit(OBJECT(dev));
1022     }
1023 }
1024 
1025 static void device_transitional_reset(Object *obj)
1026 {
1027     DeviceClass *dc = DEVICE_GET_CLASS(obj);
1028 
1029     /*
1030      * This will call either @device_phases_reset (for multi-phases transitioned
1031      * devices) or a device's specific method for not-yet transitioned devices.
1032      * In both case, it does not reset children.
1033      */
1034     if (dc->reset) {
1035         dc->reset(DEVICE(obj));
1036     }
1037 }
1038 
1039 /**
1040  * device_get_transitional_reset:
1041  * check if the device's class is ready for multi-phase
1042  */
1043 static ResettableTrFunction device_get_transitional_reset(Object *obj)
1044 {
1045     DeviceClass *dc = DEVICE_GET_CLASS(obj);
1046     if (dc->reset != device_phases_reset) {
1047         /*
1048          * dc->reset has been overridden by a subclass,
1049          * the device is not ready for multi phase yet.
1050          */
1051         return device_transitional_reset;
1052     }
1053     return NULL;
1054 }
1055 
1056 static void device_class_init(ObjectClass *class, void *data)
1057 {
1058     DeviceClass *dc = DEVICE_CLASS(class);
1059     VMStateIfClass *vc = VMSTATE_IF_CLASS(class);
1060     ResettableClass *rc = RESETTABLE_CLASS(class);
1061 
1062     class->unparent = device_unparent;
1063 
1064     /* by default all devices were considered as hotpluggable,
1065      * so with intent to check it in generic qdev_unplug() /
1066      * device_set_realized() functions make every device
1067      * hotpluggable. Devices that shouldn't be hotpluggable,
1068      * should override it in their class_init()
1069      */
1070     dc->hotpluggable = true;
1071     dc->user_creatable = true;
1072     vc->get_id = device_vmstate_if_get_id;
1073     rc->get_state = device_get_reset_state;
1074     rc->child_foreach = device_reset_child_foreach;
1075 
1076     /*
1077      * @device_phases_reset is put as the default reset method below, allowing
1078      * to do the multi-phase transition from base classes to leaf classes. It
1079      * allows a legacy-reset Device class to extend a multi-phases-reset
1080      * Device class for the following reason:
1081      * + If a base class B has been moved to multi-phase, then it does not
1082      *   override this default reset method and may have defined phase methods.
1083      * + A child class C (extending class B) which uses
1084      *   device_class_set_parent_reset() (or similar means) to override the
1085      *   reset method will still work as expected. @device_phases_reset function
1086      *   will be registered as the parent reset method and effectively call
1087      *   parent reset phases.
1088      */
1089     dc->reset = device_phases_reset;
1090     rc->get_transitional_function = device_get_transitional_reset;
1091 
1092     object_class_property_add_bool(class, "realized",
1093                                    device_get_realized, device_set_realized);
1094     object_class_property_add_bool(class, "hotpluggable",
1095                                    device_get_hotpluggable, NULL);
1096     object_class_property_add_bool(class, "hotplugged",
1097                                    device_get_hotplugged, NULL);
1098     object_class_property_add_link(class, "parent_bus", TYPE_BUS,
1099                                    offsetof(DeviceState, parent_bus), NULL, 0);
1100 }
1101 
1102 void device_class_set_parent_reset(DeviceClass *dc,
1103                                    DeviceReset dev_reset,
1104                                    DeviceReset *parent_reset)
1105 {
1106     *parent_reset = dc->reset;
1107     dc->reset = dev_reset;
1108 }
1109 
1110 void device_class_set_parent_realize(DeviceClass *dc,
1111                                      DeviceRealize dev_realize,
1112                                      DeviceRealize *parent_realize)
1113 {
1114     *parent_realize = dc->realize;
1115     dc->realize = dev_realize;
1116 }
1117 
1118 void device_class_set_parent_unrealize(DeviceClass *dc,
1119                                        DeviceUnrealize dev_unrealize,
1120                                        DeviceUnrealize *parent_unrealize)
1121 {
1122     *parent_unrealize = dc->unrealize;
1123     dc->unrealize = dev_unrealize;
1124 }
1125 
1126 void device_legacy_reset(DeviceState *dev)
1127 {
1128     DeviceClass *klass = DEVICE_GET_CLASS(dev);
1129 
1130     trace_qdev_reset(dev, object_get_typename(OBJECT(dev)));
1131     if (klass->reset) {
1132         klass->reset(dev);
1133     }
1134 }
1135 
1136 Object *qdev_get_machine(void)
1137 {
1138     static Object *dev;
1139 
1140     if (dev == NULL) {
1141         dev = container_get(object_get_root(), "/machine");
1142     }
1143 
1144     return dev;
1145 }
1146 
1147 static const TypeInfo device_type_info = {
1148     .name = TYPE_DEVICE,
1149     .parent = TYPE_OBJECT,
1150     .instance_size = sizeof(DeviceState),
1151     .instance_init = device_initfn,
1152     .instance_post_init = device_post_init,
1153     .instance_finalize = device_finalize,
1154     .class_base_init = device_class_base_init,
1155     .class_init = device_class_init,
1156     .abstract = true,
1157     .class_size = sizeof(DeviceClass),
1158     .interfaces = (InterfaceInfo[]) {
1159         { TYPE_VMSTATE_IF },
1160         { TYPE_RESETTABLE_INTERFACE },
1161         { }
1162     }
1163 };
1164 
1165 static void qdev_register_types(void)
1166 {
1167     type_register_static(&device_type_info);
1168 }
1169 
1170 type_init(qdev_register_types)
1171