xref: /openbmc/qemu/hw/core/qdev.c (revision 5bfb75f15297a91161f720f997792dd9abc05dea)
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  void device_cold_reset(DeviceState *dev)
254  {
255      resettable_reset(OBJECT(dev), RESET_TYPE_COLD);
256  }
257  
258  bool device_is_in_reset(DeviceState *dev)
259  {
260      return resettable_is_in_reset(OBJECT(dev));
261  }
262  
263  static ResettableState *device_get_reset_state(Object *obj)
264  {
265      DeviceState *dev = DEVICE(obj);
266      return &dev->reset;
267  }
268  
269  static void device_reset_child_foreach(Object *obj, ResettableChildCallback cb,
270                                         void *opaque, ResetType type)
271  {
272      DeviceState *dev = DEVICE(obj);
273      BusState *bus;
274  
275      QLIST_FOREACH(bus, &dev->child_bus, sibling) {
276          cb(OBJECT(bus), opaque, type);
277      }
278  }
279  
280  bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp)
281  {
282      assert(!dev->realized && !dev->parent_bus);
283  
284      if (bus) {
285          if (!qdev_set_parent_bus(dev, bus, errp)) {
286              return false;
287          }
288      } else {
289          assert(!DEVICE_GET_CLASS(dev)->bus_type);
290      }
291  
292      return object_property_set_bool(OBJECT(dev), "realized", true, errp);
293  }
294  
295  bool qdev_realize_and_unref(DeviceState *dev, BusState *bus, Error **errp)
296  {
297      bool ret;
298  
299      ret = qdev_realize(dev, bus, errp);
300      object_unref(OBJECT(dev));
301      return ret;
302  }
303  
304  void qdev_unrealize(DeviceState *dev)
305  {
306      object_property_set_bool(OBJECT(dev), "realized", false, &error_abort);
307  }
308  
309  static int qdev_assert_realized_properly_cb(Object *obj, void *opaque)
310  {
311      DeviceState *dev = DEVICE(object_dynamic_cast(obj, TYPE_DEVICE));
312      DeviceClass *dc;
313  
314      if (dev) {
315          dc = DEVICE_GET_CLASS(dev);
316          assert(dev->realized);
317          assert(dev->parent_bus || !dc->bus_type);
318      }
319      return 0;
320  }
321  
322  void qdev_assert_realized_properly(void)
323  {
324      object_child_foreach_recursive(object_get_root(),
325                                     qdev_assert_realized_properly_cb, NULL);
326  }
327  
328  bool qdev_machine_modified(void)
329  {
330      return qdev_hot_added || qdev_hot_removed;
331  }
332  
333  BusState *qdev_get_parent_bus(const DeviceState *dev)
334  {
335      return dev->parent_bus;
336  }
337  
338  BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
339  {
340      BusState *bus;
341      Object *child = object_resolve_path_component(OBJECT(dev), name);
342  
343      bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
344      if (bus) {
345          return bus;
346      }
347  
348      QLIST_FOREACH(bus, &dev->child_bus, sibling) {
349          if (strcmp(name, bus->name) == 0) {
350              return bus;
351          }
352      }
353      return NULL;
354  }
355  
356  int qdev_walk_children(DeviceState *dev,
357                         qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
358                         qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
359                         void *opaque)
360  {
361      BusState *bus;
362      int err;
363  
364      if (pre_devfn) {
365          err = pre_devfn(dev, opaque);
366          if (err) {
367              return err;
368          }
369      }
370  
371      QLIST_FOREACH(bus, &dev->child_bus, sibling) {
372          err = qbus_walk_children(bus, pre_devfn, pre_busfn,
373                                   post_devfn, post_busfn, opaque);
374          if (err < 0) {
375              return err;
376          }
377      }
378  
379      if (post_devfn) {
380          err = post_devfn(dev, opaque);
381          if (err) {
382              return err;
383          }
384      }
385  
386      return 0;
387  }
388  
389  DeviceState *qdev_find_recursive(BusState *bus, const char *id)
390  {
391      BusChild *kid;
392      DeviceState *ret;
393      BusState *child;
394  
395      WITH_RCU_READ_LOCK_GUARD() {
396          QTAILQ_FOREACH_RCU(kid, &bus->children, sibling) {
397              DeviceState *dev = kid->child;
398  
399              if (dev->id && strcmp(dev->id, id) == 0) {
400                  return dev;
401              }
402  
403              QLIST_FOREACH(child, &dev->child_bus, sibling) {
404                  ret = qdev_find_recursive(child, id);
405                  if (ret) {
406                      return ret;
407                  }
408              }
409          }
410      }
411      return NULL;
412  }
413  
414  char *qdev_get_dev_path(DeviceState *dev)
415  {
416      BusClass *bc;
417  
418      if (!dev || !dev->parent_bus) {
419          return NULL;
420      }
421  
422      bc = BUS_GET_CLASS(dev->parent_bus);
423      if (bc->get_dev_path) {
424          return bc->get_dev_path(dev);
425      }
426  
427      return NULL;
428  }
429  
430  void qdev_add_unplug_blocker(DeviceState *dev, Error *reason)
431  {
432      dev->unplug_blockers = g_slist_prepend(dev->unplug_blockers, reason);
433  }
434  
435  void qdev_del_unplug_blocker(DeviceState *dev, Error *reason)
436  {
437      dev->unplug_blockers = g_slist_remove(dev->unplug_blockers, reason);
438  }
439  
440  bool qdev_unplug_blocked(DeviceState *dev, Error **errp)
441  {
442      if (dev->unplug_blockers) {
443          error_propagate(errp, error_copy(dev->unplug_blockers->data));
444          return true;
445      }
446  
447      return false;
448  }
449  
450  static bool device_get_realized(Object *obj, Error **errp)
451  {
452      DeviceState *dev = DEVICE(obj);
453      return dev->realized;
454  }
455  
456  static bool check_only_migratable(Object *obj, Error **errp)
457  {
458      DeviceClass *dc = DEVICE_GET_CLASS(obj);
459  
460      if (!vmstate_check_only_migratable(dc->vmsd)) {
461          error_setg(errp, "Device %s is not migratable, but "
462                     "--only-migratable was specified",
463                     object_get_typename(obj));
464          return false;
465      }
466  
467      return true;
468  }
469  
470  static void device_set_realized(Object *obj, bool value, Error **errp)
471  {
472      DeviceState *dev = DEVICE(obj);
473      DeviceClass *dc = DEVICE_GET_CLASS(dev);
474      HotplugHandler *hotplug_ctrl;
475      BusState *bus;
476      NamedClockList *ncl;
477      Error *local_err = NULL;
478      bool unattached_parent = false;
479      static int unattached_count;
480  
481      if (dev->hotplugged && !dc->hotpluggable) {
482          error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
483          return;
484      }
485  
486      if (value && !dev->realized) {
487          if (!check_only_migratable(obj, errp)) {
488              goto fail;
489          }
490  
491          if (!obj->parent) {
492              gchar *name = g_strdup_printf("device[%d]", unattached_count++);
493  
494              object_property_add_child(container_get(qdev_get_machine(),
495                                                      "/unattached"),
496                                        name, obj);
497              unattached_parent = true;
498              g_free(name);
499          }
500  
501          hotplug_ctrl = qdev_get_hotplug_handler(dev);
502          if (hotplug_ctrl) {
503              hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
504              if (local_err != NULL) {
505                  goto fail;
506              }
507          }
508  
509          if (dc->realize) {
510              dc->realize(dev, &local_err);
511              if (local_err != NULL) {
512                  goto fail;
513              }
514          }
515  
516          DEVICE_LISTENER_CALL(realize, Forward, dev);
517  
518          /*
519           * always free/re-initialize here since the value cannot be cleaned up
520           * in device_unrealize due to its usage later on in the unplug path
521           */
522          g_free(dev->canonical_path);
523          dev->canonical_path = object_get_canonical_path(OBJECT(dev));
524          QLIST_FOREACH(ncl, &dev->clocks, node) {
525              if (ncl->alias) {
526                  continue;
527              } else {
528                  clock_setup_canonical_path(ncl->clock);
529              }
530          }
531  
532          if (qdev_get_vmsd(dev)) {
533              if (vmstate_register_with_alias_id(VMSTATE_IF(dev),
534                                                 VMSTATE_INSTANCE_ID_ANY,
535                                                 qdev_get_vmsd(dev), dev,
536                                                 dev->instance_id_alias,
537                                                 dev->alias_required_for_version,
538                                                 &local_err) < 0) {
539                  goto post_realize_fail;
540              }
541          }
542  
543          /*
544           * Clear the reset state, in case the object was previously unrealized
545           * with a dirty state.
546           */
547          resettable_state_clear(&dev->reset);
548  
549          QLIST_FOREACH(bus, &dev->child_bus, sibling) {
550              if (!qbus_realize(bus, errp)) {
551                  goto child_realize_fail;
552              }
553          }
554          if (dev->hotplugged) {
555              /*
556               * Reset the device, as well as its subtree which, at this point,
557               * should be realized too.
558               */
559              resettable_assert_reset(OBJECT(dev), RESET_TYPE_COLD);
560              resettable_change_parent(OBJECT(dev), OBJECT(dev->parent_bus),
561                                       NULL);
562              resettable_release_reset(OBJECT(dev), RESET_TYPE_COLD);
563          }
564          dev->pending_deleted_event = false;
565  
566          if (hotplug_ctrl) {
567              hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
568              if (local_err != NULL) {
569                  goto child_realize_fail;
570              }
571         }
572  
573         qatomic_store_release(&dev->realized, value);
574  
575      } else if (!value && dev->realized) {
576  
577          /*
578           * Change the value so that any concurrent users are aware
579           * that the device is going to be unrealized
580           *
581           * TODO: change .realized property to enum that states
582           * each phase of the device realization/unrealization
583           */
584  
585          qatomic_set(&dev->realized, value);
586          /*
587           * Ensure that concurrent users see this update prior to
588           * any other changes done by unrealize.
589           */
590          smp_wmb();
591  
592          QLIST_FOREACH(bus, &dev->child_bus, sibling) {
593              qbus_unrealize(bus);
594          }
595          if (qdev_get_vmsd(dev)) {
596              vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
597          }
598          if (dc->unrealize) {
599              dc->unrealize(dev);
600          }
601          dev->pending_deleted_event = true;
602          DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
603      }
604  
605      assert(local_err == NULL);
606      return;
607  
608  child_realize_fail:
609      QLIST_FOREACH(bus, &dev->child_bus, sibling) {
610          qbus_unrealize(bus);
611      }
612  
613      if (qdev_get_vmsd(dev)) {
614          vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
615      }
616  
617  post_realize_fail:
618      g_free(dev->canonical_path);
619      dev->canonical_path = NULL;
620      if (dc->unrealize) {
621          dc->unrealize(dev);
622      }
623  
624  fail:
625      error_propagate(errp, local_err);
626      if (unattached_parent) {
627          /*
628           * Beware, this doesn't just revert
629           * object_property_add_child(), it also runs bus_remove()!
630           */
631          object_unparent(OBJECT(dev));
632          unattached_count--;
633      }
634  }
635  
636  static bool device_get_hotpluggable(Object *obj, Error **errp)
637  {
638      DeviceClass *dc = DEVICE_GET_CLASS(obj);
639      DeviceState *dev = DEVICE(obj);
640  
641      return dc->hotpluggable && (dev->parent_bus == NULL ||
642                                  qbus_is_hotpluggable(dev->parent_bus));
643  }
644  
645  static bool device_get_hotplugged(Object *obj, Error **errp)
646  {
647      DeviceState *dev = DEVICE(obj);
648  
649      return dev->hotplugged;
650  }
651  
652  static void device_initfn(Object *obj)
653  {
654      DeviceState *dev = DEVICE(obj);
655  
656      if (phase_check(PHASE_MACHINE_READY)) {
657          dev->hotplugged = 1;
658          qdev_hot_added = true;
659      }
660  
661      dev->instance_id_alias = -1;
662      dev->realized = false;
663      dev->allow_unplug_during_migration = false;
664  
665      QLIST_INIT(&dev->gpios);
666      QLIST_INIT(&dev->clocks);
667  }
668  
669  static void device_post_init(Object *obj)
670  {
671      /*
672       * Note: ordered so that the user's global properties take
673       * precedence.
674       */
675      object_apply_compat_props(obj);
676      qdev_prop_set_globals(DEVICE(obj));
677  }
678  
679  /* Unlink device from bus and free the structure.  */
680  static void device_finalize(Object *obj)
681  {
682      NamedGPIOList *ngl, *next;
683  
684      DeviceState *dev = DEVICE(obj);
685  
686      g_assert(!dev->unplug_blockers);
687  
688      QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
689          QLIST_REMOVE(ngl, node);
690          qemu_free_irqs(ngl->in, ngl->num_in);
691          g_free(ngl->name);
692          g_free(ngl);
693          /* ngl->out irqs are owned by the other end and should not be freed
694           * here
695           */
696      }
697  
698      qdev_finalize_clocklist(dev);
699  
700      /* Only send event if the device had been completely realized */
701      if (dev->pending_deleted_event) {
702          g_assert(dev->canonical_path);
703  
704          qapi_event_send_device_deleted(dev->id, dev->canonical_path);
705          g_free(dev->canonical_path);
706          dev->canonical_path = NULL;
707      }
708  
709      qobject_unref(dev->opts);
710      g_free(dev->id);
711  }
712  
713  static void device_class_base_init(ObjectClass *class, void *data)
714  {
715      DeviceClass *klass = DEVICE_CLASS(class);
716  
717      /* We explicitly look up properties in the superclasses,
718       * so do not propagate them to the subclasses.
719       */
720      klass->props_ = NULL;
721  }
722  
723  static void device_unparent(Object *obj)
724  {
725      DeviceState *dev = DEVICE(obj);
726      BusState *bus;
727  
728      if (dev->realized) {
729          qdev_unrealize(dev);
730      }
731      while (dev->num_child_bus) {
732          bus = QLIST_FIRST(&dev->child_bus);
733          object_unparent(OBJECT(bus));
734      }
735      if (dev->parent_bus) {
736          bus_remove_child(dev->parent_bus, dev);
737          object_unref(OBJECT(dev->parent_bus));
738          dev->parent_bus = NULL;
739      }
740  }
741  
742  static char *
743  device_vmstate_if_get_id(VMStateIf *obj)
744  {
745      DeviceState *dev = DEVICE(obj);
746  
747      return qdev_get_dev_path(dev);
748  }
749  
750  /**
751   * device_phases_reset:
752   * Transition reset method for devices to allow moving
753   * smoothly from legacy reset method to multi-phases
754   */
755  static void device_phases_reset(DeviceState *dev)
756  {
757      ResettableClass *rc = RESETTABLE_GET_CLASS(dev);
758  
759      if (rc->phases.enter) {
760          rc->phases.enter(OBJECT(dev), RESET_TYPE_COLD);
761      }
762      if (rc->phases.hold) {
763          rc->phases.hold(OBJECT(dev));
764      }
765      if (rc->phases.exit) {
766          rc->phases.exit(OBJECT(dev));
767      }
768  }
769  
770  static void device_transitional_reset(Object *obj)
771  {
772      DeviceClass *dc = DEVICE_GET_CLASS(obj);
773  
774      /*
775       * This will call either @device_phases_reset (for multi-phases transitioned
776       * devices) or a device's specific method for not-yet transitioned devices.
777       * In both case, it does not reset children.
778       */
779      if (dc->reset) {
780          dc->reset(DEVICE(obj));
781      }
782  }
783  
784  /**
785   * device_get_transitional_reset:
786   * check if the device's class is ready for multi-phase
787   */
788  static ResettableTrFunction device_get_transitional_reset(Object *obj)
789  {
790      DeviceClass *dc = DEVICE_GET_CLASS(obj);
791      if (dc->reset != device_phases_reset) {
792          /*
793           * dc->reset has been overridden by a subclass,
794           * the device is not ready for multi phase yet.
795           */
796          return device_transitional_reset;
797      }
798      return NULL;
799  }
800  
801  static void device_class_init(ObjectClass *class, void *data)
802  {
803      DeviceClass *dc = DEVICE_CLASS(class);
804      VMStateIfClass *vc = VMSTATE_IF_CLASS(class);
805      ResettableClass *rc = RESETTABLE_CLASS(class);
806  
807      class->unparent = device_unparent;
808  
809      /* by default all devices were considered as hotpluggable,
810       * so with intent to check it in generic qdev_unplug() /
811       * device_set_realized() functions make every device
812       * hotpluggable. Devices that shouldn't be hotpluggable,
813       * should override it in their class_init()
814       */
815      dc->hotpluggable = true;
816      dc->user_creatable = true;
817      vc->get_id = device_vmstate_if_get_id;
818      rc->get_state = device_get_reset_state;
819      rc->child_foreach = device_reset_child_foreach;
820  
821      /*
822       * @device_phases_reset is put as the default reset method below, allowing
823       * to do the multi-phase transition from base classes to leaf classes. It
824       * allows a legacy-reset Device class to extend a multi-phases-reset
825       * Device class for the following reason:
826       * + If a base class B has been moved to multi-phase, then it does not
827       *   override this default reset method and may have defined phase methods.
828       * + A child class C (extending class B) which uses
829       *   device_class_set_parent_reset() (or similar means) to override the
830       *   reset method will still work as expected. @device_phases_reset function
831       *   will be registered as the parent reset method and effectively call
832       *   parent reset phases.
833       */
834      dc->reset = device_phases_reset;
835      rc->get_transitional_function = device_get_transitional_reset;
836  
837      object_class_property_add_bool(class, "realized",
838                                     device_get_realized, device_set_realized);
839      object_class_property_add_bool(class, "hotpluggable",
840                                     device_get_hotpluggable, NULL);
841      object_class_property_add_bool(class, "hotplugged",
842                                     device_get_hotplugged, NULL);
843      object_class_property_add_link(class, "parent_bus", TYPE_BUS,
844                                     offsetof(DeviceState, parent_bus), NULL, 0);
845  }
846  
847  void device_class_set_parent_reset(DeviceClass *dc,
848                                     DeviceReset dev_reset,
849                                     DeviceReset *parent_reset)
850  {
851      *parent_reset = dc->reset;
852      dc->reset = dev_reset;
853  }
854  
855  void device_class_set_parent_realize(DeviceClass *dc,
856                                       DeviceRealize dev_realize,
857                                       DeviceRealize *parent_realize)
858  {
859      *parent_realize = dc->realize;
860      dc->realize = dev_realize;
861  }
862  
863  void device_class_set_parent_unrealize(DeviceClass *dc,
864                                         DeviceUnrealize dev_unrealize,
865                                         DeviceUnrealize *parent_unrealize)
866  {
867      *parent_unrealize = dc->unrealize;
868      dc->unrealize = dev_unrealize;
869  }
870  
871  Object *qdev_get_machine(void)
872  {
873      static Object *dev;
874  
875      if (dev == NULL) {
876          dev = container_get(object_get_root(), "/machine");
877      }
878  
879      return dev;
880  }
881  
882  char *qdev_get_human_name(DeviceState *dev)
883  {
884      g_assert(dev != NULL);
885  
886      return dev->id ?
887             g_strdup(dev->id) : object_get_canonical_path(OBJECT(dev));
888  }
889  
890  static MachineInitPhase machine_phase;
891  
892  bool phase_check(MachineInitPhase phase)
893  {
894      return machine_phase >= phase;
895  }
896  
897  void phase_advance(MachineInitPhase phase)
898  {
899      assert(machine_phase == phase - 1);
900      machine_phase = phase;
901  }
902  
903  static const TypeInfo device_type_info = {
904      .name = TYPE_DEVICE,
905      .parent = TYPE_OBJECT,
906      .instance_size = sizeof(DeviceState),
907      .instance_init = device_initfn,
908      .instance_post_init = device_post_init,
909      .instance_finalize = device_finalize,
910      .class_base_init = device_class_base_init,
911      .class_init = device_class_init,
912      .abstract = true,
913      .class_size = sizeof(DeviceClass),
914      .interfaces = (InterfaceInfo[]) {
915          { TYPE_VMSTATE_IF },
916          { TYPE_RESETTABLE_INTERFACE },
917          { }
918      }
919  };
920  
921  static void qdev_register_types(void)
922  {
923      type_register_static(&device_type_info);
924  }
925  
926  type_init(qdev_register_types)
927