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