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