xref: /qemu/hw/core/qdev.c (revision 1b5c15ce)
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 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 "migration/vmstate.h"
41 
42 bool qdev_hotplug = false;
43 static bool qdev_hot_added = false;
44 bool qdev_hot_removed = false;
45 
46 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
47 {
48     DeviceClass *dc = DEVICE_GET_CLASS(dev);
49     return dc->vmsd;
50 }
51 
52 static void bus_remove_child(BusState *bus, DeviceState *child)
53 {
54     BusChild *kid;
55 
56     QTAILQ_FOREACH(kid, &bus->children, sibling) {
57         if (kid->child == child) {
58             char name[32];
59 
60             snprintf(name, sizeof(name), "child[%d]", kid->index);
61             QTAILQ_REMOVE(&bus->children, kid, sibling);
62 
63             bus->num_children--;
64 
65             /* This gives back ownership of kid->child back to us.  */
66             object_property_del(OBJECT(bus), name, NULL);
67             object_unref(OBJECT(kid->child));
68             g_free(kid);
69             return;
70         }
71     }
72 }
73 
74 static void bus_add_child(BusState *bus, DeviceState *child)
75 {
76     char name[32];
77     BusChild *kid = g_malloc0(sizeof(*kid));
78 
79     bus->num_children++;
80     kid->index = bus->max_index++;
81     kid->child = child;
82     object_ref(OBJECT(kid->child));
83 
84     QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
85 
86     /* This transfers ownership of kid->child to the property.  */
87     snprintf(name, sizeof(name), "child[%d]", kid->index);
88     object_property_add_link(OBJECT(bus), name,
89                              object_get_typename(OBJECT(child)),
90                              (Object **)&kid->child,
91                              NULL, /* read-only property */
92                              0, /* return ownership on prop deletion */
93                              NULL);
94 }
95 
96 void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
97 {
98     bool replugging = dev->parent_bus != NULL;
99 
100     if (replugging) {
101         /* Keep a reference to the device while it's not plugged into
102          * any bus, to avoid it potentially evaporating when it is
103          * dereffed in bus_remove_child().
104          */
105         object_ref(OBJECT(dev));
106         bus_remove_child(dev->parent_bus, dev);
107         object_unref(OBJECT(dev->parent_bus));
108     }
109     dev->parent_bus = bus;
110     object_ref(OBJECT(bus));
111     bus_add_child(bus, dev);
112     if (replugging) {
113         object_unref(OBJECT(dev));
114     }
115 }
116 
117 /* Create a new device.  This only initializes the device state
118    structure and allows properties to be set.  The device still needs
119    to be realized.  See qdev-core.h.  */
120 DeviceState *qdev_create(BusState *bus, const char *name)
121 {
122     DeviceState *dev;
123 
124     dev = qdev_try_create(bus, name);
125     if (!dev) {
126         if (bus) {
127             error_report("Unknown device '%s' for bus '%s'", name,
128                          object_get_typename(OBJECT(bus)));
129         } else {
130             error_report("Unknown device '%s' for default sysbus", name);
131         }
132         abort();
133     }
134 
135     return dev;
136 }
137 
138 DeviceState *qdev_try_create(BusState *bus, const char *type)
139 {
140     DeviceState *dev;
141 
142     if (object_class_by_name(type) == NULL) {
143         return NULL;
144     }
145     dev = DEVICE(object_new(type));
146     if (!dev) {
147         return NULL;
148     }
149 
150     if (!bus) {
151         /* Assert that the device really is a SysBusDevice before
152          * we put it onto the sysbus. Non-sysbus devices which aren't
153          * being put onto a bus should be created with object_new(TYPE_FOO),
154          * not qdev_create(NULL, TYPE_FOO).
155          */
156         g_assert(object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE));
157         bus = sysbus_get_default();
158     }
159 
160     qdev_set_parent_bus(dev, bus);
161     object_unref(OBJECT(dev));
162     return dev;
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 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
216                                  int required_for_version)
217 {
218     assert(!dev->realized);
219     dev->instance_id_alias = alias_id;
220     dev->alias_required_for_version = required_for_version;
221 }
222 
223 HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev)
224 {
225     MachineState *machine;
226     MachineClass *mc;
227     Object *m_obj = qdev_get_machine();
228 
229     if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
230         machine = MACHINE(m_obj);
231         mc = MACHINE_GET_CLASS(machine);
232         if (mc->get_hotplug_handler) {
233             return mc->get_hotplug_handler(machine, dev);
234         }
235     }
236 
237     return NULL;
238 }
239 
240 bool qdev_hotplug_allowed(DeviceState *dev, Error **errp)
241 {
242     MachineState *machine;
243     MachineClass *mc;
244     Object *m_obj = qdev_get_machine();
245 
246     if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
247         machine = MACHINE(m_obj);
248         mc = MACHINE_GET_CLASS(machine);
249         if (mc->hotplug_allowed) {
250             return mc->hotplug_allowed(machine, dev, errp);
251         }
252     }
253 
254     return true;
255 }
256 
257 HotplugHandler *qdev_get_bus_hotplug_handler(DeviceState *dev)
258 {
259     if (dev->parent_bus) {
260         return dev->parent_bus->hotplug_handler;
261     }
262     return NULL;
263 }
264 
265 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
266 {
267     HotplugHandler *hotplug_ctrl = qdev_get_machine_hotplug_handler(dev);
268 
269     if (hotplug_ctrl == NULL && dev->parent_bus) {
270         hotplug_ctrl = qdev_get_bus_hotplug_handler(dev);
271     }
272     return hotplug_ctrl;
273 }
274 
275 static int qdev_reset_one(DeviceState *dev, void *opaque)
276 {
277     device_reset(dev);
278 
279     return 0;
280 }
281 
282 static int qbus_reset_one(BusState *bus, void *opaque)
283 {
284     BusClass *bc = BUS_GET_CLASS(bus);
285     if (bc->reset) {
286         bc->reset(bus);
287     }
288     return 0;
289 }
290 
291 void qdev_reset_all(DeviceState *dev)
292 {
293     qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
294 }
295 
296 void qdev_reset_all_fn(void *opaque)
297 {
298     qdev_reset_all(DEVICE(opaque));
299 }
300 
301 void qbus_reset_all(BusState *bus)
302 {
303     qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
304 }
305 
306 void qbus_reset_all_fn(void *opaque)
307 {
308     BusState *bus = opaque;
309     qbus_reset_all(bus);
310 }
311 
312 /* can be used as ->unplug() callback for the simple cases */
313 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
314                                   DeviceState *dev, Error **errp)
315 {
316     object_property_set_bool(OBJECT(dev), false, "realized", NULL);
317 }
318 
319 /*
320  * Realize @dev.
321  * Device properties should be set before calling this function.  IRQs
322  * and MMIO regions should be connected/mapped after calling this
323  * function.
324  * On failure, report an error with error_report() and terminate the
325  * program.  This is okay during machine creation.  Don't use for
326  * hotplug, because there callers need to recover from failure.
327  * Exception: if you know the device's init() callback can't fail,
328  * then qdev_init_nofail() can't fail either, and is therefore usable
329  * even then.  But relying on the device implementation that way is
330  * somewhat unclean, and best avoided.
331  */
332 void qdev_init_nofail(DeviceState *dev)
333 {
334     Error *err = NULL;
335 
336     assert(!dev->realized);
337 
338     object_ref(OBJECT(dev));
339     object_property_set_bool(OBJECT(dev), true, "realized", &err);
340     if (err) {
341         error_reportf_err(err, "Initialization of device %s failed: ",
342                           object_get_typename(OBJECT(dev)));
343         exit(1);
344     }
345     object_unref(OBJECT(dev));
346 }
347 
348 void qdev_machine_creation_done(void)
349 {
350     /*
351      * ok, initial machine setup is done, starting from now we can
352      * only create hotpluggable devices
353      */
354     qdev_hotplug = true;
355 }
356 
357 bool qdev_machine_modified(void)
358 {
359     return qdev_hot_added || qdev_hot_removed;
360 }
361 
362 BusState *qdev_get_parent_bus(DeviceState *dev)
363 {
364     return dev->parent_bus;
365 }
366 
367 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
368                                                const char *name)
369 {
370     NamedGPIOList *ngl;
371 
372     QLIST_FOREACH(ngl, &dev->gpios, node) {
373         /* NULL is a valid and matchable name, otherwise do a normal
374          * strcmp match.
375          */
376         if ((!ngl->name && !name) ||
377                 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
378             return ngl;
379         }
380     }
381 
382     ngl = g_malloc0(sizeof(*ngl));
383     ngl->name = g_strdup(name);
384     QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
385     return ngl;
386 }
387 
388 void qdev_init_gpio_in_named_with_opaque(DeviceState *dev,
389                                          qemu_irq_handler handler,
390                                          void *opaque,
391                                          const char *name, int n)
392 {
393     int i;
394     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
395 
396     assert(gpio_list->num_out == 0 || !name);
397     gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
398                                      opaque, n);
399 
400     if (!name) {
401         name = "unnamed-gpio-in";
402     }
403     for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
404         gchar *propname = g_strdup_printf("%s[%u]", name, i);
405 
406         object_property_add_child(OBJECT(dev), propname,
407                                   OBJECT(gpio_list->in[i]), &error_abort);
408         g_free(propname);
409     }
410 
411     gpio_list->num_in += n;
412 }
413 
414 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
415 {
416     qdev_init_gpio_in_named(dev, handler, NULL, n);
417 }
418 
419 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
420                               const char *name, int n)
421 {
422     int i;
423     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
424 
425     assert(gpio_list->num_in == 0 || !name);
426 
427     if (!name) {
428         name = "unnamed-gpio-out";
429     }
430     memset(pins, 0, sizeof(*pins) * n);
431     for (i = 0; i < n; ++i) {
432         gchar *propname = g_strdup_printf("%s[%u]", name,
433                                           gpio_list->num_out + i);
434 
435         object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
436                                  (Object **)&pins[i],
437                                  object_property_allow_set_link,
438                                  OBJ_PROP_LINK_STRONG,
439                                  &error_abort);
440         g_free(propname);
441     }
442     gpio_list->num_out += n;
443 }
444 
445 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
446 {
447     qdev_init_gpio_out_named(dev, pins, NULL, n);
448 }
449 
450 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
451 {
452     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
453 
454     assert(n >= 0 && n < gpio_list->num_in);
455     return gpio_list->in[n];
456 }
457 
458 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
459 {
460     return qdev_get_gpio_in_named(dev, NULL, n);
461 }
462 
463 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
464                                  qemu_irq pin)
465 {
466     char *propname = g_strdup_printf("%s[%d]",
467                                      name ? name : "unnamed-gpio-out", n);
468     if (pin) {
469         /* We need a name for object_property_set_link to work.  If the
470          * object has a parent, object_property_add_child will come back
471          * with an error without doing anything.  If it has none, it will
472          * never fail.  So we can just call it with a NULL Error pointer.
473          */
474         object_property_add_child(container_get(qdev_get_machine(),
475                                                 "/unattached"),
476                                   "non-qdev-gpio[*]", OBJECT(pin), NULL);
477     }
478     object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
479     g_free(propname);
480 }
481 
482 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
483 {
484     char *propname = g_strdup_printf("%s[%d]",
485                                      name ? name : "unnamed-gpio-out", n);
486 
487     qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
488                                                       NULL);
489 
490     return ret;
491 }
492 
493 /* disconnect a GPIO output, returning the disconnected input (if any) */
494 
495 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
496                                                const char *name, int n)
497 {
498     char *propname = g_strdup_printf("%s[%d]",
499                                      name ? name : "unnamed-gpio-out", n);
500 
501     qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
502                                                       NULL);
503     if (ret) {
504         object_property_set_link(OBJECT(dev), NULL, propname, NULL);
505     }
506     g_free(propname);
507     return ret;
508 }
509 
510 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
511                                  const char *name, int n)
512 {
513     qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
514     qdev_connect_gpio_out_named(dev, name, n, icpt);
515     return disconnected;
516 }
517 
518 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
519 {
520     qdev_connect_gpio_out_named(dev, NULL, n, pin);
521 }
522 
523 void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
524                      const char *name)
525 {
526     int i;
527     NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
528 
529     for (i = 0; i < ngl->num_in; i++) {
530         const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
531         char *propname = g_strdup_printf("%s[%d]", nm, i);
532 
533         object_property_add_alias(OBJECT(container), propname,
534                                   OBJECT(dev), propname,
535                                   &error_abort);
536         g_free(propname);
537     }
538     for (i = 0; i < ngl->num_out; i++) {
539         const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
540         char *propname = g_strdup_printf("%s[%d]", nm, i);
541 
542         object_property_add_alias(OBJECT(container), propname,
543                                   OBJECT(dev), propname,
544                                   &error_abort);
545         g_free(propname);
546     }
547     QLIST_REMOVE(ngl, node);
548     QLIST_INSERT_HEAD(&container->gpios, ngl, node);
549 }
550 
551 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
552 {
553     BusState *bus;
554     Object *child = object_resolve_path_component(OBJECT(dev), name);
555 
556     bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
557     if (bus) {
558         return bus;
559     }
560 
561     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
562         if (strcmp(name, bus->name) == 0) {
563             return bus;
564         }
565     }
566     return NULL;
567 }
568 
569 int qdev_walk_children(DeviceState *dev,
570                        qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
571                        qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
572                        void *opaque)
573 {
574     BusState *bus;
575     int err;
576 
577     if (pre_devfn) {
578         err = pre_devfn(dev, opaque);
579         if (err) {
580             return err;
581         }
582     }
583 
584     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
585         err = qbus_walk_children(bus, pre_devfn, pre_busfn,
586                                  post_devfn, post_busfn, opaque);
587         if (err < 0) {
588             return err;
589         }
590     }
591 
592     if (post_devfn) {
593         err = post_devfn(dev, opaque);
594         if (err) {
595             return err;
596         }
597     }
598 
599     return 0;
600 }
601 
602 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
603 {
604     BusChild *kid;
605     DeviceState *ret;
606     BusState *child;
607 
608     QTAILQ_FOREACH(kid, &bus->children, sibling) {
609         DeviceState *dev = kid->child;
610 
611         if (dev->id && strcmp(dev->id, id) == 0) {
612             return dev;
613         }
614 
615         QLIST_FOREACH(child, &dev->child_bus, sibling) {
616             ret = qdev_find_recursive(child, id);
617             if (ret) {
618                 return ret;
619             }
620         }
621     }
622     return NULL;
623 }
624 
625 char *qdev_get_dev_path(DeviceState *dev)
626 {
627     BusClass *bc;
628 
629     if (!dev || !dev->parent_bus) {
630         return NULL;
631     }
632 
633     bc = BUS_GET_CLASS(dev->parent_bus);
634     if (bc->get_dev_path) {
635         return bc->get_dev_path(dev);
636     }
637 
638     return NULL;
639 }
640 
641 /**
642  * Legacy property handling
643  */
644 
645 static void qdev_get_legacy_property(Object *obj, Visitor *v,
646                                      const char *name, void *opaque,
647                                      Error **errp)
648 {
649     DeviceState *dev = DEVICE(obj);
650     Property *prop = opaque;
651 
652     char buffer[1024];
653     char *ptr = buffer;
654 
655     prop->info->print(dev, prop, buffer, sizeof(buffer));
656     visit_type_str(v, name, &ptr, errp);
657 }
658 
659 /**
660  * qdev_property_add_legacy:
661  * @dev: Device to add the property to.
662  * @prop: The qdev property definition.
663  * @errp: location to store error information.
664  *
665  * Add a legacy QOM property to @dev for qdev property @prop.
666  * On error, store error in @errp.
667  *
668  * Legacy properties are string versions of QOM properties.  The format of
669  * the string depends on the property type.  Legacy properties are only
670  * needed for "info qtree".
671  *
672  * Do not use this in new code!  QOM Properties added through this interface
673  * will be given names in the "legacy" namespace.
674  */
675 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
676                                      Error **errp)
677 {
678     gchar *name;
679 
680     /* Register pointer properties as legacy properties */
681     if (!prop->info->print && prop->info->get) {
682         return;
683     }
684 
685     if (prop->info->create) {
686         return;
687     }
688 
689     name = g_strdup_printf("legacy-%s", prop->name);
690     object_property_add(OBJECT(dev), name, "str",
691                         prop->info->print ? qdev_get_legacy_property : prop->info->get,
692                         NULL,
693                         NULL,
694                         prop, errp);
695 
696     g_free(name);
697 }
698 
699 /**
700  * qdev_property_add_static:
701  * @dev: Device to add the property to.
702  * @prop: The qdev property definition.
703  * @errp: location to store error information.
704  *
705  * Add a static QOM property to @dev for qdev property @prop.
706  * On error, store error in @errp.  Static properties access data in a struct.
707  * The type of the QOM property is derived from prop->info.
708  */
709 void qdev_property_add_static(DeviceState *dev, Property *prop,
710                               Error **errp)
711 {
712     Error *local_err = NULL;
713     Object *obj = OBJECT(dev);
714 
715     if (prop->info->create) {
716         prop->info->create(obj, prop, &local_err);
717     } else {
718         /*
719          * TODO qdev_prop_ptr does not have getters or setters.  It must
720          * go now that it can be replaced with links.  The test should be
721          * removed along with it: all static properties are read/write.
722          */
723         if (!prop->info->get && !prop->info->set) {
724             return;
725         }
726         object_property_add(obj, prop->name, prop->info->name,
727                             prop->info->get, prop->info->set,
728                             prop->info->release,
729                             prop, &local_err);
730     }
731 
732     if (local_err) {
733         error_propagate(errp, local_err);
734         return;
735     }
736 
737     object_property_set_description(obj, prop->name,
738                                     prop->info->description,
739                                     &error_abort);
740 
741     if (prop->set_default) {
742         prop->info->set_default_value(obj, prop);
743     }
744 }
745 
746 /* @qdev_alias_all_properties - Add alias properties to the source object for
747  * all qdev properties on the target DeviceState.
748  */
749 void qdev_alias_all_properties(DeviceState *target, Object *source)
750 {
751     ObjectClass *class;
752     Property *prop;
753 
754     class = object_get_class(OBJECT(target));
755     do {
756         DeviceClass *dc = DEVICE_CLASS(class);
757 
758         for (prop = dc->props; prop && prop->name; prop++) {
759             object_property_add_alias(source, prop->name,
760                                       OBJECT(target), prop->name,
761                                       &error_abort);
762         }
763         class = object_class_get_parent(class);
764     } while (class != object_class_by_name(TYPE_DEVICE));
765 }
766 
767 static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
768 {
769     GSList **list = opaque;
770     DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
771                                                           TYPE_DEVICE);
772 
773     if (dev == NULL) {
774         return 0;
775     }
776 
777     if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
778         *list = g_slist_append(*list, dev);
779     }
780 
781     return 0;
782 }
783 
784 GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
785 {
786     GSList *list = NULL;
787 
788     object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
789 
790     return list;
791 }
792 
793 static bool device_get_realized(Object *obj, Error **errp)
794 {
795     DeviceState *dev = DEVICE(obj);
796     return dev->realized;
797 }
798 
799 static bool check_only_migratable(Object *obj, Error **err)
800 {
801     DeviceClass *dc = DEVICE_GET_CLASS(obj);
802 
803     if (!vmstate_check_only_migratable(dc->vmsd)) {
804         error_setg(err, "Device %s is not migratable, but "
805                    "--only-migratable was specified",
806                    object_get_typename(obj));
807         return false;
808     }
809 
810     return true;
811 }
812 
813 static void device_set_realized(Object *obj, bool value, Error **errp)
814 {
815     DeviceState *dev = DEVICE(obj);
816     DeviceClass *dc = DEVICE_GET_CLASS(dev);
817     HotplugHandler *hotplug_ctrl;
818     BusState *bus;
819     Error *local_err = NULL;
820     bool unattached_parent = false;
821     static int unattached_count;
822 
823     if (dev->hotplugged && !dc->hotpluggable) {
824         error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
825         return;
826     }
827 
828     if (value && !dev->realized) {
829         if (!check_only_migratable(obj, &local_err)) {
830             goto fail;
831         }
832 
833         if (!obj->parent) {
834             gchar *name = g_strdup_printf("device[%d]", unattached_count++);
835 
836             object_property_add_child(container_get(qdev_get_machine(),
837                                                     "/unattached"),
838                                       name, obj, &error_abort);
839             unattached_parent = true;
840             g_free(name);
841         }
842 
843         hotplug_ctrl = qdev_get_hotplug_handler(dev);
844         if (hotplug_ctrl) {
845             hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
846             if (local_err != NULL) {
847                 goto fail;
848             }
849         }
850 
851         if (dc->realize) {
852             dc->realize(dev, &local_err);
853         }
854 
855         if (local_err != NULL) {
856             goto fail;
857         }
858 
859         DEVICE_LISTENER_CALL(realize, Forward, dev);
860 
861         /*
862          * always free/re-initialize here since the value cannot be cleaned up
863          * in device_unrealize due to its usage later on in the unplug path
864          */
865         g_free(dev->canonical_path);
866         dev->canonical_path = object_get_canonical_path(OBJECT(dev));
867 
868         if (qdev_get_vmsd(dev)) {
869             if (vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
870                                                dev->instance_id_alias,
871                                                dev->alias_required_for_version,
872                                                &local_err) < 0) {
873                 goto post_realize_fail;
874             }
875         }
876 
877         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
878             object_property_set_bool(OBJECT(bus), true, "realized",
879                                          &local_err);
880             if (local_err != NULL) {
881                 goto child_realize_fail;
882             }
883         }
884         if (dev->hotplugged) {
885             device_reset(dev);
886         }
887         dev->pending_deleted_event = false;
888 
889         if (hotplug_ctrl) {
890             hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
891             if (local_err != NULL) {
892                 goto child_realize_fail;
893             }
894        }
895 
896     } else if (!value && dev->realized) {
897         Error **local_errp = NULL;
898         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
899             local_errp = local_err ? NULL : &local_err;
900             object_property_set_bool(OBJECT(bus), false, "realized",
901                                      local_errp);
902         }
903         if (qdev_get_vmsd(dev)) {
904             vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
905         }
906         if (dc->unrealize) {
907             local_errp = local_err ? NULL : &local_err;
908             dc->unrealize(dev, local_errp);
909         }
910         dev->pending_deleted_event = true;
911         DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
912     }
913 
914     if (local_err != NULL) {
915         goto fail;
916     }
917 
918     dev->realized = value;
919     return;
920 
921 child_realize_fail:
922     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
923         object_property_set_bool(OBJECT(bus), false, "realized",
924                                  NULL);
925     }
926 
927     if (qdev_get_vmsd(dev)) {
928         vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
929     }
930 
931 post_realize_fail:
932     g_free(dev->canonical_path);
933     dev->canonical_path = NULL;
934     if (dc->unrealize) {
935         dc->unrealize(dev, NULL);
936     }
937 
938 fail:
939     error_propagate(errp, local_err);
940     if (unattached_parent) {
941         object_unparent(OBJECT(dev));
942         unattached_count--;
943     }
944 }
945 
946 static bool device_get_hotpluggable(Object *obj, Error **errp)
947 {
948     DeviceClass *dc = DEVICE_GET_CLASS(obj);
949     DeviceState *dev = DEVICE(obj);
950 
951     return dc->hotpluggable && (dev->parent_bus == NULL ||
952                                 qbus_is_hotpluggable(dev->parent_bus));
953 }
954 
955 static bool device_get_hotplugged(Object *obj, Error **err)
956 {
957     DeviceState *dev = DEVICE(obj);
958 
959     return dev->hotplugged;
960 }
961 
962 static void device_initfn(Object *obj)
963 {
964     DeviceState *dev = DEVICE(obj);
965     ObjectClass *class;
966     Property *prop;
967 
968     if (qdev_hotplug) {
969         dev->hotplugged = 1;
970         qdev_hot_added = true;
971     }
972 
973     dev->instance_id_alias = -1;
974     dev->realized = false;
975 
976     object_property_add_bool(obj, "realized",
977                              device_get_realized, device_set_realized, NULL);
978     object_property_add_bool(obj, "hotpluggable",
979                              device_get_hotpluggable, NULL, NULL);
980     object_property_add_bool(obj, "hotplugged",
981                              device_get_hotplugged, NULL,
982                              &error_abort);
983 
984     class = object_get_class(OBJECT(dev));
985     do {
986         for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
987             qdev_property_add_legacy(dev, prop, &error_abort);
988             qdev_property_add_static(dev, prop, &error_abort);
989         }
990         class = object_class_get_parent(class);
991     } while (class != object_class_by_name(TYPE_DEVICE));
992 
993     object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
994                              (Object **)&dev->parent_bus, NULL, 0,
995                              &error_abort);
996     QLIST_INIT(&dev->gpios);
997 }
998 
999 static void device_post_init(Object *obj)
1000 {
1001     /*
1002      * Note: ordered so that the user's global properties take
1003      * precedence.
1004      */
1005     object_apply_compat_props(obj);
1006     qdev_prop_set_globals(DEVICE(obj));
1007 }
1008 
1009 /* Unlink device from bus and free the structure.  */
1010 static void device_finalize(Object *obj)
1011 {
1012     NamedGPIOList *ngl, *next;
1013 
1014     DeviceState *dev = DEVICE(obj);
1015 
1016     QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1017         QLIST_REMOVE(ngl, node);
1018         qemu_free_irqs(ngl->in, ngl->num_in);
1019         g_free(ngl->name);
1020         g_free(ngl);
1021         /* ngl->out irqs are owned by the other end and should not be freed
1022          * here
1023          */
1024     }
1025 
1026     /* Only send event if the device had been completely realized */
1027     if (dev->pending_deleted_event) {
1028         g_assert(dev->canonical_path);
1029 
1030         qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path);
1031         g_free(dev->canonical_path);
1032         dev->canonical_path = NULL;
1033     }
1034 
1035     qemu_opts_del(dev->opts);
1036 }
1037 
1038 static void device_class_base_init(ObjectClass *class, void *data)
1039 {
1040     DeviceClass *klass = DEVICE_CLASS(class);
1041 
1042     /* We explicitly look up properties in the superclasses,
1043      * so do not propagate them to the subclasses.
1044      */
1045     klass->props = NULL;
1046 }
1047 
1048 static void device_unparent(Object *obj)
1049 {
1050     DeviceState *dev = DEVICE(obj);
1051     BusState *bus;
1052 
1053     if (dev->realized) {
1054         object_property_set_bool(obj, false, "realized", NULL);
1055     }
1056     while (dev->num_child_bus) {
1057         bus = QLIST_FIRST(&dev->child_bus);
1058         object_unparent(OBJECT(bus));
1059     }
1060     if (dev->parent_bus) {
1061         bus_remove_child(dev->parent_bus, dev);
1062         object_unref(OBJECT(dev->parent_bus));
1063         dev->parent_bus = NULL;
1064     }
1065 }
1066 
1067 static void device_class_init(ObjectClass *class, void *data)
1068 {
1069     DeviceClass *dc = DEVICE_CLASS(class);
1070 
1071     class->unparent = device_unparent;
1072 
1073     /* by default all devices were considered as hotpluggable,
1074      * so with intent to check it in generic qdev_unplug() /
1075      * device_set_realized() functions make every device
1076      * hotpluggable. Devices that shouldn't be hotpluggable,
1077      * should override it in their class_init()
1078      */
1079     dc->hotpluggable = true;
1080     dc->user_creatable = true;
1081 }
1082 
1083 void device_class_set_parent_reset(DeviceClass *dc,
1084                                    DeviceReset dev_reset,
1085                                    DeviceReset *parent_reset)
1086 {
1087     *parent_reset = dc->reset;
1088     dc->reset = dev_reset;
1089 }
1090 
1091 void device_class_set_parent_realize(DeviceClass *dc,
1092                                      DeviceRealize dev_realize,
1093                                      DeviceRealize *parent_realize)
1094 {
1095     *parent_realize = dc->realize;
1096     dc->realize = dev_realize;
1097 }
1098 
1099 void device_class_set_parent_unrealize(DeviceClass *dc,
1100                                        DeviceUnrealize dev_unrealize,
1101                                        DeviceUnrealize *parent_unrealize)
1102 {
1103     *parent_unrealize = dc->unrealize;
1104     dc->unrealize = dev_unrealize;
1105 }
1106 
1107 void device_reset(DeviceState *dev)
1108 {
1109     DeviceClass *klass = DEVICE_GET_CLASS(dev);
1110 
1111     if (klass->reset) {
1112         klass->reset(dev);
1113     }
1114 }
1115 
1116 Object *qdev_get_machine(void)
1117 {
1118     static Object *dev;
1119 
1120     if (dev == NULL) {
1121         dev = container_get(object_get_root(), "/machine");
1122     }
1123 
1124     return dev;
1125 }
1126 
1127 static const TypeInfo device_type_info = {
1128     .name = TYPE_DEVICE,
1129     .parent = TYPE_OBJECT,
1130     .instance_size = sizeof(DeviceState),
1131     .instance_init = device_initfn,
1132     .instance_post_init = device_post_init,
1133     .instance_finalize = device_finalize,
1134     .class_base_init = device_class_base_init,
1135     .class_init = device_class_init,
1136     .abstract = true,
1137     .class_size = sizeof(DeviceClass),
1138 };
1139 
1140 static void qdev_register_types(void)
1141 {
1142     type_register_static(&device_type_info);
1143 }
1144 
1145 type_init(qdev_register_types)
1146