xref: /openbmc/qemu/hw/core/qdev.c (revision e0091133)
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/qdict.h"
32 #include "qapi/qmp/qerror.h"
33 #include "qapi/visitor.h"
34 #include "qemu/error-report.h"
35 #include "qemu/option.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 static bool qdev_hot_added = false;
45 bool qdev_hot_removed = false;
46 
47 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
48 {
49     DeviceClass *dc = DEVICE_GET_CLASS(dev);
50     return dc->vmsd;
51 }
52 
53 static void bus_free_bus_child(BusChild *kid)
54 {
55     object_unref(OBJECT(kid->child));
56     g_free(kid);
57 }
58 
59 static void bus_remove_child(BusState *bus, DeviceState *child)
60 {
61     BusChild *kid;
62 
63     QTAILQ_FOREACH(kid, &bus->children, sibling) {
64         if (kid->child == child) {
65             char name[32];
66 
67             snprintf(name, sizeof(name), "child[%d]", kid->index);
68             QTAILQ_REMOVE_RCU(&bus->children, kid, sibling);
69 
70             bus->num_children--;
71 
72             /* This gives back ownership of kid->child back to us.  */
73             object_property_del(OBJECT(bus), name);
74 
75             /* free the bus kid, when it is safe to do so*/
76             call_rcu(kid, bus_free_bus_child, rcu);
77             break;
78         }
79     }
80 }
81 
82 static void bus_add_child(BusState *bus, DeviceState *child)
83 {
84     char name[32];
85     BusChild *kid = g_malloc0(sizeof(*kid));
86 
87     bus->num_children++;
88     kid->index = bus->max_index++;
89     kid->child = child;
90     object_ref(OBJECT(kid->child));
91 
92     QTAILQ_INSERT_HEAD_RCU(&bus->children, kid, sibling);
93 
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);
101 }
102 
103 static bool bus_check_address(BusState *bus, DeviceState *child, Error **errp)
104 {
105     BusClass *bc = BUS_GET_CLASS(bus);
106     return !bc->check_address || bc->check_address(bus, child, errp);
107 }
108 
109 bool qdev_set_parent_bus(DeviceState *dev, BusState *bus, Error **errp)
110 {
111     BusState *old_parent_bus = dev->parent_bus;
112     DeviceClass *dc = DEVICE_GET_CLASS(dev);
113 
114     assert(dc->bus_type && object_dynamic_cast(OBJECT(bus), dc->bus_type));
115 
116     if (!bus_check_address(bus, dev, errp)) {
117         return false;
118     }
119 
120     if (old_parent_bus) {
121         trace_qdev_update_parent_bus(dev, object_get_typename(OBJECT(dev)),
122             old_parent_bus, object_get_typename(OBJECT(old_parent_bus)),
123             OBJECT(bus), object_get_typename(OBJECT(bus)));
124         /*
125          * Keep a reference to the device while it's not plugged into
126          * any bus, to avoid it potentially evaporating when it is
127          * dereffed in bus_remove_child().
128          * Also keep the ref of the parent bus until the end, so that
129          * we can safely call resettable_change_parent() below.
130          */
131         object_ref(OBJECT(dev));
132         bus_remove_child(dev->parent_bus, dev);
133     }
134     dev->parent_bus = bus;
135     object_ref(OBJECT(bus));
136     bus_add_child(bus, dev);
137     if (dev->realized) {
138         resettable_change_parent(OBJECT(dev), OBJECT(bus),
139                                  OBJECT(old_parent_bus));
140     }
141     if (old_parent_bus) {
142         object_unref(OBJECT(old_parent_bus));
143         object_unref(OBJECT(dev));
144     }
145     return true;
146 }
147 
148 DeviceState *qdev_new(const char *name)
149 {
150     ObjectClass *oc = object_class_by_name(name);
151 #ifdef CONFIG_MODULES
152     if (!oc) {
153         int rv = module_load_qom(name, &error_fatal);
154         if (rv > 0) {
155             oc = object_class_by_name(name);
156         } else {
157             error_report("could not find a module for type '%s'", name);
158             exit(1);
159         }
160     }
161 #endif
162     if (!oc) {
163         error_report("unknown type '%s'", name);
164         abort();
165     }
166     return DEVICE(object_new(name));
167 }
168 
169 DeviceState *qdev_try_new(const char *name)
170 {
171     if (!module_object_class_by_name(name)) {
172         return NULL;
173     }
174     return DEVICE(object_new(name));
175 }
176 
177 static QTAILQ_HEAD(, DeviceListener) device_listeners
178     = QTAILQ_HEAD_INITIALIZER(device_listeners);
179 
180 enum ListenerDirection { Forward, Reverse };
181 
182 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...)     \
183     do {                                                          \
184         DeviceListener *_listener;                                \
185                                                                   \
186         switch (_direction) {                                     \
187         case Forward:                                             \
188             QTAILQ_FOREACH(_listener, &device_listeners, link) {  \
189                 if (_listener->_callback) {                       \
190                     _listener->_callback(_listener, ##_args);     \
191                 }                                                 \
192             }                                                     \
193             break;                                                \
194         case Reverse:                                             \
195             QTAILQ_FOREACH_REVERSE(_listener, &device_listeners,  \
196                                    link) {                        \
197                 if (_listener->_callback) {                       \
198                     _listener->_callback(_listener, ##_args);     \
199                 }                                                 \
200             }                                                     \
201             break;                                                \
202         default:                                                  \
203             abort();                                              \
204         }                                                         \
205     } while (0)
206 
207 static int device_listener_add(DeviceState *dev, void *opaque)
208 {
209     DEVICE_LISTENER_CALL(realize, Forward, dev);
210 
211     return 0;
212 }
213 
214 void device_listener_register(DeviceListener *listener)
215 {
216     QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
217 
218     qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
219                        NULL, NULL);
220 }
221 
222 void device_listener_unregister(DeviceListener *listener)
223 {
224     QTAILQ_REMOVE(&device_listeners, listener, link);
225 }
226 
227 bool qdev_should_hide_device(const QDict *opts, bool from_json, Error **errp)
228 {
229     ERRP_GUARD();
230     DeviceListener *listener;
231 
232     QTAILQ_FOREACH(listener, &device_listeners, link) {
233         if (listener->hide_device) {
234             if (listener->hide_device(listener, opts, from_json, errp)) {
235                 return true;
236             } else if (*errp) {
237                 return false;
238             }
239         }
240     }
241 
242     return false;
243 }
244 
245 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
246                                  int required_for_version)
247 {
248     assert(!dev->realized);
249     dev->instance_id_alias = alias_id;
250     dev->alias_required_for_version = required_for_version;
251 }
252 
253 static int qdev_prereset(DeviceState *dev, void *opaque)
254 {
255     trace_qdev_reset_tree(dev, object_get_typename(OBJECT(dev)));
256     return 0;
257 }
258 
259 static int qbus_prereset(BusState *bus, void *opaque)
260 {
261     trace_qbus_reset_tree(bus, object_get_typename(OBJECT(bus)));
262     return 0;
263 }
264 
265 static int qdev_reset_one(DeviceState *dev, void *opaque)
266 {
267     device_legacy_reset(dev);
268 
269     return 0;
270 }
271 
272 static int qbus_reset_one(BusState *bus, void *opaque)
273 {
274     BusClass *bc = BUS_GET_CLASS(bus);
275     trace_qbus_reset(bus, object_get_typename(OBJECT(bus)));
276     if (bc->reset) {
277         bc->reset(bus);
278     }
279     return 0;
280 }
281 
282 void qdev_reset_all(DeviceState *dev)
283 {
284     trace_qdev_reset_all(dev, object_get_typename(OBJECT(dev)));
285     qdev_walk_children(dev, qdev_prereset, qbus_prereset,
286                        qdev_reset_one, qbus_reset_one, NULL);
287 }
288 
289 void qdev_reset_all_fn(void *opaque)
290 {
291     qdev_reset_all(DEVICE(opaque));
292 }
293 
294 void qbus_reset_all(BusState *bus)
295 {
296     trace_qbus_reset_all(bus, object_get_typename(OBJECT(bus)));
297     qbus_walk_children(bus, qdev_prereset, qbus_prereset,
298                        qdev_reset_one, qbus_reset_one, NULL);
299 }
300 
301 void qbus_reset_all_fn(void *opaque)
302 {
303     BusState *bus = opaque;
304     qbus_reset_all(bus);
305 }
306 
307 void device_cold_reset(DeviceState *dev)
308 {
309     resettable_reset(OBJECT(dev), RESET_TYPE_COLD);
310 }
311 
312 bool device_is_in_reset(DeviceState *dev)
313 {
314     return resettable_is_in_reset(OBJECT(dev));
315 }
316 
317 static ResettableState *device_get_reset_state(Object *obj)
318 {
319     DeviceState *dev = DEVICE(obj);
320     return &dev->reset;
321 }
322 
323 static void device_reset_child_foreach(Object *obj, ResettableChildCallback cb,
324                                        void *opaque, ResetType type)
325 {
326     DeviceState *dev = DEVICE(obj);
327     BusState *bus;
328 
329     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
330         cb(OBJECT(bus), opaque, type);
331     }
332 }
333 
334 bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp)
335 {
336     assert(!dev->realized && !dev->parent_bus);
337 
338     if (bus) {
339         if (!qdev_set_parent_bus(dev, bus, errp)) {
340             return false;
341         }
342     } else {
343         assert(!DEVICE_GET_CLASS(dev)->bus_type);
344     }
345 
346     return object_property_set_bool(OBJECT(dev), "realized", true, errp);
347 }
348 
349 bool qdev_realize_and_unref(DeviceState *dev, BusState *bus, Error **errp)
350 {
351     bool ret;
352 
353     ret = qdev_realize(dev, bus, errp);
354     object_unref(OBJECT(dev));
355     return ret;
356 }
357 
358 void qdev_unrealize(DeviceState *dev)
359 {
360     object_property_set_bool(OBJECT(dev), "realized", false, &error_abort);
361 }
362 
363 static int qdev_assert_realized_properly_cb(Object *obj, void *opaque)
364 {
365     DeviceState *dev = DEVICE(object_dynamic_cast(obj, TYPE_DEVICE));
366     DeviceClass *dc;
367 
368     if (dev) {
369         dc = DEVICE_GET_CLASS(dev);
370         assert(dev->realized);
371         assert(dev->parent_bus || !dc->bus_type);
372     }
373     return 0;
374 }
375 
376 void qdev_assert_realized_properly(void)
377 {
378     object_child_foreach_recursive(object_get_root(),
379                                    qdev_assert_realized_properly_cb, NULL);
380 }
381 
382 bool qdev_machine_modified(void)
383 {
384     return qdev_hot_added || qdev_hot_removed;
385 }
386 
387 BusState *qdev_get_parent_bus(DeviceState *dev)
388 {
389     return dev->parent_bus;
390 }
391 
392 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
393 {
394     BusState *bus;
395     Object *child = object_resolve_path_component(OBJECT(dev), name);
396 
397     bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
398     if (bus) {
399         return bus;
400     }
401 
402     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
403         if (strcmp(name, bus->name) == 0) {
404             return bus;
405         }
406     }
407     return NULL;
408 }
409 
410 int qdev_walk_children(DeviceState *dev,
411                        qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
412                        qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
413                        void *opaque)
414 {
415     BusState *bus;
416     int err;
417 
418     if (pre_devfn) {
419         err = pre_devfn(dev, opaque);
420         if (err) {
421             return err;
422         }
423     }
424 
425     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
426         err = qbus_walk_children(bus, pre_devfn, pre_busfn,
427                                  post_devfn, post_busfn, opaque);
428         if (err < 0) {
429             return err;
430         }
431     }
432 
433     if (post_devfn) {
434         err = post_devfn(dev, opaque);
435         if (err) {
436             return err;
437         }
438     }
439 
440     return 0;
441 }
442 
443 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
444 {
445     BusChild *kid;
446     DeviceState *ret;
447     BusState *child;
448 
449     WITH_RCU_READ_LOCK_GUARD() {
450         QTAILQ_FOREACH_RCU(kid, &bus->children, sibling) {
451             DeviceState *dev = kid->child;
452 
453             if (dev->id && strcmp(dev->id, id) == 0) {
454                 return dev;
455             }
456 
457             QLIST_FOREACH(child, &dev->child_bus, sibling) {
458                 ret = qdev_find_recursive(child, id);
459                 if (ret) {
460                     return ret;
461                 }
462             }
463         }
464     }
465     return NULL;
466 }
467 
468 char *qdev_get_dev_path(DeviceState *dev)
469 {
470     BusClass *bc;
471 
472     if (!dev || !dev->parent_bus) {
473         return NULL;
474     }
475 
476     bc = BUS_GET_CLASS(dev->parent_bus);
477     if (bc->get_dev_path) {
478         return bc->get_dev_path(dev);
479     }
480 
481     return NULL;
482 }
483 
484 void qdev_add_unplug_blocker(DeviceState *dev, Error *reason)
485 {
486     dev->unplug_blockers = g_slist_prepend(dev->unplug_blockers, reason);
487 }
488 
489 void qdev_del_unplug_blocker(DeviceState *dev, Error *reason)
490 {
491     dev->unplug_blockers = g_slist_remove(dev->unplug_blockers, reason);
492 }
493 
494 bool qdev_unplug_blocked(DeviceState *dev, Error **errp)
495 {
496     ERRP_GUARD();
497 
498     if (dev->unplug_blockers) {
499         error_propagate(errp, error_copy(dev->unplug_blockers->data));
500         return true;
501     }
502 
503     return false;
504 }
505 
506 static bool device_get_realized(Object *obj, Error **errp)
507 {
508     DeviceState *dev = DEVICE(obj);
509     return dev->realized;
510 }
511 
512 static bool check_only_migratable(Object *obj, Error **errp)
513 {
514     DeviceClass *dc = DEVICE_GET_CLASS(obj);
515 
516     if (!vmstate_check_only_migratable(dc->vmsd)) {
517         error_setg(errp, "Device %s is not migratable, but "
518                    "--only-migratable was specified",
519                    object_get_typename(obj));
520         return false;
521     }
522 
523     return true;
524 }
525 
526 static void device_set_realized(Object *obj, bool value, Error **errp)
527 {
528     DeviceState *dev = DEVICE(obj);
529     DeviceClass *dc = DEVICE_GET_CLASS(dev);
530     HotplugHandler *hotplug_ctrl;
531     BusState *bus;
532     NamedClockList *ncl;
533     Error *local_err = NULL;
534     bool unattached_parent = false;
535     static int unattached_count;
536 
537     if (dev->hotplugged && !dc->hotpluggable) {
538         error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
539         return;
540     }
541 
542     if (value && !dev->realized) {
543         if (!check_only_migratable(obj, errp)) {
544             goto fail;
545         }
546 
547         if (!obj->parent) {
548             gchar *name = g_strdup_printf("device[%d]", unattached_count++);
549 
550             object_property_add_child(container_get(qdev_get_machine(),
551                                                     "/unattached"),
552                                       name, obj);
553             unattached_parent = true;
554             g_free(name);
555         }
556 
557         hotplug_ctrl = qdev_get_hotplug_handler(dev);
558         if (hotplug_ctrl) {
559             hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
560             if (local_err != NULL) {
561                 goto fail;
562             }
563         }
564 
565         if (dc->realize) {
566             dc->realize(dev, &local_err);
567             if (local_err != NULL) {
568                 goto fail;
569             }
570         }
571 
572         DEVICE_LISTENER_CALL(realize, Forward, dev);
573 
574         /*
575          * always free/re-initialize here since the value cannot be cleaned up
576          * in device_unrealize due to its usage later on in the unplug path
577          */
578         g_free(dev->canonical_path);
579         dev->canonical_path = object_get_canonical_path(OBJECT(dev));
580         QLIST_FOREACH(ncl, &dev->clocks, node) {
581             if (ncl->alias) {
582                 continue;
583             } else {
584                 clock_setup_canonical_path(ncl->clock);
585             }
586         }
587 
588         if (qdev_get_vmsd(dev)) {
589             if (vmstate_register_with_alias_id(VMSTATE_IF(dev),
590                                                VMSTATE_INSTANCE_ID_ANY,
591                                                qdev_get_vmsd(dev), dev,
592                                                dev->instance_id_alias,
593                                                dev->alias_required_for_version,
594                                                &local_err) < 0) {
595                 goto post_realize_fail;
596             }
597         }
598 
599         /*
600          * Clear the reset state, in case the object was previously unrealized
601          * with a dirty state.
602          */
603         resettable_state_clear(&dev->reset);
604 
605         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
606             if (!qbus_realize(bus, errp)) {
607                 goto child_realize_fail;
608             }
609         }
610         if (dev->hotplugged) {
611             /*
612              * Reset the device, as well as its subtree which, at this point,
613              * should be realized too.
614              */
615             resettable_assert_reset(OBJECT(dev), RESET_TYPE_COLD);
616             resettable_change_parent(OBJECT(dev), OBJECT(dev->parent_bus),
617                                      NULL);
618             resettable_release_reset(OBJECT(dev), RESET_TYPE_COLD);
619         }
620         dev->pending_deleted_event = false;
621 
622         if (hotplug_ctrl) {
623             hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
624             if (local_err != NULL) {
625                 goto child_realize_fail;
626             }
627        }
628 
629        qatomic_store_release(&dev->realized, value);
630 
631     } else if (!value && dev->realized) {
632 
633         /*
634          * Change the value so that any concurrent users are aware
635          * that the device is going to be unrealized
636          *
637          * TODO: change .realized property to enum that states
638          * each phase of the device realization/unrealization
639          */
640 
641         qatomic_set(&dev->realized, value);
642         /*
643          * Ensure that concurrent users see this update prior to
644          * any other changes done by unrealize.
645          */
646         smp_wmb();
647 
648         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
649             qbus_unrealize(bus);
650         }
651         if (qdev_get_vmsd(dev)) {
652             vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
653         }
654         if (dc->unrealize) {
655             dc->unrealize(dev);
656         }
657         dev->pending_deleted_event = true;
658         DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
659     }
660 
661     assert(local_err == NULL);
662     return;
663 
664 child_realize_fail:
665     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
666         qbus_unrealize(bus);
667     }
668 
669     if (qdev_get_vmsd(dev)) {
670         vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
671     }
672 
673 post_realize_fail:
674     g_free(dev->canonical_path);
675     dev->canonical_path = NULL;
676     if (dc->unrealize) {
677         dc->unrealize(dev);
678     }
679 
680 fail:
681     error_propagate(errp, local_err);
682     if (unattached_parent) {
683         /*
684          * Beware, this doesn't just revert
685          * object_property_add_child(), it also runs bus_remove()!
686          */
687         object_unparent(OBJECT(dev));
688         unattached_count--;
689     }
690 }
691 
692 static bool device_get_hotpluggable(Object *obj, Error **errp)
693 {
694     DeviceClass *dc = DEVICE_GET_CLASS(obj);
695     DeviceState *dev = DEVICE(obj);
696 
697     return dc->hotpluggable && (dev->parent_bus == NULL ||
698                                 qbus_is_hotpluggable(dev->parent_bus));
699 }
700 
701 static bool device_get_hotplugged(Object *obj, Error **errp)
702 {
703     DeviceState *dev = DEVICE(obj);
704 
705     return dev->hotplugged;
706 }
707 
708 static void device_initfn(Object *obj)
709 {
710     DeviceState *dev = DEVICE(obj);
711 
712     if (phase_check(PHASE_MACHINE_READY)) {
713         dev->hotplugged = 1;
714         qdev_hot_added = true;
715     }
716 
717     dev->instance_id_alias = -1;
718     dev->realized = false;
719     dev->allow_unplug_during_migration = false;
720 
721     QLIST_INIT(&dev->gpios);
722     QLIST_INIT(&dev->clocks);
723 }
724 
725 static void device_post_init(Object *obj)
726 {
727     /*
728      * Note: ordered so that the user's global properties take
729      * precedence.
730      */
731     object_apply_compat_props(obj);
732     qdev_prop_set_globals(DEVICE(obj));
733 }
734 
735 /* Unlink device from bus and free the structure.  */
736 static void device_finalize(Object *obj)
737 {
738     NamedGPIOList *ngl, *next;
739 
740     DeviceState *dev = DEVICE(obj);
741 
742     g_assert(!dev->unplug_blockers);
743 
744     QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
745         QLIST_REMOVE(ngl, node);
746         qemu_free_irqs(ngl->in, ngl->num_in);
747         g_free(ngl->name);
748         g_free(ngl);
749         /* ngl->out irqs are owned by the other end and should not be freed
750          * here
751          */
752     }
753 
754     qdev_finalize_clocklist(dev);
755 
756     /* Only send event if the device had been completely realized */
757     if (dev->pending_deleted_event) {
758         g_assert(dev->canonical_path);
759 
760         qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path);
761         g_free(dev->canonical_path);
762         dev->canonical_path = NULL;
763     }
764 
765     qobject_unref(dev->opts);
766     g_free(dev->id);
767 }
768 
769 static void device_class_base_init(ObjectClass *class, void *data)
770 {
771     DeviceClass *klass = DEVICE_CLASS(class);
772 
773     /* We explicitly look up properties in the superclasses,
774      * so do not propagate them to the subclasses.
775      */
776     klass->props_ = NULL;
777 }
778 
779 static void device_unparent(Object *obj)
780 {
781     DeviceState *dev = DEVICE(obj);
782     BusState *bus;
783 
784     if (dev->realized) {
785         qdev_unrealize(dev);
786     }
787     while (dev->num_child_bus) {
788         bus = QLIST_FIRST(&dev->child_bus);
789         object_unparent(OBJECT(bus));
790     }
791     if (dev->parent_bus) {
792         bus_remove_child(dev->parent_bus, dev);
793         object_unref(OBJECT(dev->parent_bus));
794         dev->parent_bus = NULL;
795     }
796 }
797 
798 static char *
799 device_vmstate_if_get_id(VMStateIf *obj)
800 {
801     DeviceState *dev = DEVICE(obj);
802 
803     return qdev_get_dev_path(dev);
804 }
805 
806 /**
807  * device_phases_reset:
808  * Transition reset method for devices to allow moving
809  * smoothly from legacy reset method to multi-phases
810  */
811 static void device_phases_reset(DeviceState *dev)
812 {
813     ResettableClass *rc = RESETTABLE_GET_CLASS(dev);
814 
815     if (rc->phases.enter) {
816         rc->phases.enter(OBJECT(dev), RESET_TYPE_COLD);
817     }
818     if (rc->phases.hold) {
819         rc->phases.hold(OBJECT(dev));
820     }
821     if (rc->phases.exit) {
822         rc->phases.exit(OBJECT(dev));
823     }
824 }
825 
826 static void device_transitional_reset(Object *obj)
827 {
828     DeviceClass *dc = DEVICE_GET_CLASS(obj);
829 
830     /*
831      * This will call either @device_phases_reset (for multi-phases transitioned
832      * devices) or a device's specific method for not-yet transitioned devices.
833      * In both case, it does not reset children.
834      */
835     if (dc->reset) {
836         dc->reset(DEVICE(obj));
837     }
838 }
839 
840 /**
841  * device_get_transitional_reset:
842  * check if the device's class is ready for multi-phase
843  */
844 static ResettableTrFunction device_get_transitional_reset(Object *obj)
845 {
846     DeviceClass *dc = DEVICE_GET_CLASS(obj);
847     if (dc->reset != device_phases_reset) {
848         /*
849          * dc->reset has been overridden by a subclass,
850          * the device is not ready for multi phase yet.
851          */
852         return device_transitional_reset;
853     }
854     return NULL;
855 }
856 
857 static void device_class_init(ObjectClass *class, void *data)
858 {
859     DeviceClass *dc = DEVICE_CLASS(class);
860     VMStateIfClass *vc = VMSTATE_IF_CLASS(class);
861     ResettableClass *rc = RESETTABLE_CLASS(class);
862 
863     class->unparent = device_unparent;
864 
865     /* by default all devices were considered as hotpluggable,
866      * so with intent to check it in generic qdev_unplug() /
867      * device_set_realized() functions make every device
868      * hotpluggable. Devices that shouldn't be hotpluggable,
869      * should override it in their class_init()
870      */
871     dc->hotpluggable = true;
872     dc->user_creatable = true;
873     vc->get_id = device_vmstate_if_get_id;
874     rc->get_state = device_get_reset_state;
875     rc->child_foreach = device_reset_child_foreach;
876 
877     /*
878      * @device_phases_reset is put as the default reset method below, allowing
879      * to do the multi-phase transition from base classes to leaf classes. It
880      * allows a legacy-reset Device class to extend a multi-phases-reset
881      * Device class for the following reason:
882      * + If a base class B has been moved to multi-phase, then it does not
883      *   override this default reset method and may have defined phase methods.
884      * + A child class C (extending class B) which uses
885      *   device_class_set_parent_reset() (or similar means) to override the
886      *   reset method will still work as expected. @device_phases_reset function
887      *   will be registered as the parent reset method and effectively call
888      *   parent reset phases.
889      */
890     dc->reset = device_phases_reset;
891     rc->get_transitional_function = device_get_transitional_reset;
892 
893     object_class_property_add_bool(class, "realized",
894                                    device_get_realized, device_set_realized);
895     object_class_property_add_bool(class, "hotpluggable",
896                                    device_get_hotpluggable, NULL);
897     object_class_property_add_bool(class, "hotplugged",
898                                    device_get_hotplugged, NULL);
899     object_class_property_add_link(class, "parent_bus", TYPE_BUS,
900                                    offsetof(DeviceState, parent_bus), NULL, 0);
901 }
902 
903 void device_class_set_parent_reset(DeviceClass *dc,
904                                    DeviceReset dev_reset,
905                                    DeviceReset *parent_reset)
906 {
907     *parent_reset = dc->reset;
908     dc->reset = dev_reset;
909 }
910 
911 void device_class_set_parent_realize(DeviceClass *dc,
912                                      DeviceRealize dev_realize,
913                                      DeviceRealize *parent_realize)
914 {
915     *parent_realize = dc->realize;
916     dc->realize = dev_realize;
917 }
918 
919 void device_class_set_parent_unrealize(DeviceClass *dc,
920                                        DeviceUnrealize dev_unrealize,
921                                        DeviceUnrealize *parent_unrealize)
922 {
923     *parent_unrealize = dc->unrealize;
924     dc->unrealize = dev_unrealize;
925 }
926 
927 void device_legacy_reset(DeviceState *dev)
928 {
929     DeviceClass *klass = DEVICE_GET_CLASS(dev);
930 
931     trace_qdev_reset(dev, object_get_typename(OBJECT(dev)));
932     if (klass->reset) {
933         klass->reset(dev);
934     }
935 }
936 
937 Object *qdev_get_machine(void)
938 {
939     static Object *dev;
940 
941     if (dev == NULL) {
942         dev = container_get(object_get_root(), "/machine");
943     }
944 
945     return dev;
946 }
947 
948 static MachineInitPhase machine_phase;
949 
950 bool phase_check(MachineInitPhase phase)
951 {
952     return machine_phase >= phase;
953 }
954 
955 void phase_advance(MachineInitPhase phase)
956 {
957     assert(machine_phase == phase - 1);
958     machine_phase = phase;
959 }
960 
961 static const TypeInfo device_type_info = {
962     .name = TYPE_DEVICE,
963     .parent = TYPE_OBJECT,
964     .instance_size = sizeof(DeviceState),
965     .instance_init = device_initfn,
966     .instance_post_init = device_post_init,
967     .instance_finalize = device_finalize,
968     .class_base_init = device_class_base_init,
969     .class_init = device_class_init,
970     .abstract = true,
971     .class_size = sizeof(DeviceClass),
972     .interfaces = (InterfaceInfo[]) {
973         { TYPE_VMSTATE_IF },
974         { TYPE_RESETTABLE_INTERFACE },
975         { }
976     }
977 };
978 
979 static void qdev_register_types(void)
980 {
981     type_register_static(&device_type_info);
982 }
983 
984 type_init(qdev_register_types)
985