xref: /openbmc/qemu/hw/core/qdev.c (revision 4875a779)
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 "hw/qdev.h"
29 #include "hw/fw-path-provider.h"
30 #include "sysemu/sysemu.h"
31 #include "qapi/error.h"
32 #include "qapi/qmp/qerror.h"
33 #include "qapi/visitor.h"
34 #include "qapi/qmp/qjson.h"
35 #include "hw/hotplug.h"
36 #include "hw/boards.h"
37 #include "qapi-event.h"
38 
39 int qdev_hotplug = 0;
40 static bool qdev_hot_added = false;
41 static bool qdev_hot_removed = false;
42 
43 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
44 {
45     DeviceClass *dc = DEVICE_GET_CLASS(dev);
46     return dc->vmsd;
47 }
48 
49 const char *qdev_fw_name(DeviceState *dev)
50 {
51     DeviceClass *dc = DEVICE_GET_CLASS(dev);
52 
53     if (dc->fw_name) {
54         return dc->fw_name;
55     }
56 
57     return object_get_typename(OBJECT(dev));
58 }
59 
60 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
61                                      Error **errp);
62 
63 static void bus_remove_child(BusState *bus, DeviceState *child)
64 {
65     BusChild *kid;
66 
67     QTAILQ_FOREACH(kid, &bus->children, sibling) {
68         if (kid->child == child) {
69             char name[32];
70 
71             snprintf(name, sizeof(name), "child[%d]", kid->index);
72             QTAILQ_REMOVE(&bus->children, kid, sibling);
73 
74             /* This gives back ownership of kid->child back to us.  */
75             object_property_del(OBJECT(bus), name, NULL);
76             object_unref(OBJECT(kid->child));
77             g_free(kid);
78             return;
79         }
80     }
81 }
82 
83 static void bus_add_child(BusState *bus, DeviceState *child)
84 {
85     char name[32];
86     BusChild *kid = g_malloc0(sizeof(*kid));
87 
88     kid->index = bus->max_index++;
89     kid->child = child;
90     object_ref(OBJECT(kid->child));
91 
92     QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
93 
94     /* This transfers ownership of kid->child to the property.  */
95     snprintf(name, sizeof(name), "child[%d]", kid->index);
96     object_property_add_link(OBJECT(bus), name,
97                              object_get_typename(OBJECT(child)),
98                              (Object **)&kid->child,
99                              NULL, /* read-only property */
100                              0, /* return ownership on prop deletion */
101                              NULL);
102 }
103 
104 void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
105 {
106     dev->parent_bus = bus;
107     object_ref(OBJECT(bus));
108     bus_add_child(bus, dev);
109 }
110 
111 static void qbus_set_hotplug_handler_internal(BusState *bus, Object *handler,
112                                               Error **errp)
113 {
114 
115     object_property_set_link(OBJECT(bus), OBJECT(handler),
116                              QDEV_HOTPLUG_HANDLER_PROPERTY, errp);
117 }
118 
119 void qbus_set_hotplug_handler(BusState *bus, DeviceState *handler, Error **errp)
120 {
121     qbus_set_hotplug_handler_internal(bus, OBJECT(handler), errp);
122 }
123 
124 void qbus_set_bus_hotplug_handler(BusState *bus, Error **errp)
125 {
126     qbus_set_hotplug_handler_internal(bus, OBJECT(bus), errp);
127 }
128 
129 /* Create a new device.  This only initializes the device state structure
130    and allows properties to be set.  qdev_init should be called to
131    initialize the actual device emulation.  */
132 DeviceState *qdev_create(BusState *bus, const char *name)
133 {
134     DeviceState *dev;
135 
136     dev = qdev_try_create(bus, name);
137     if (!dev) {
138         if (bus) {
139             error_report("Unknown device '%s' for bus '%s'", name,
140                          object_get_typename(OBJECT(bus)));
141         } else {
142             error_report("Unknown device '%s' for default sysbus", name);
143         }
144         abort();
145     }
146 
147     return dev;
148 }
149 
150 DeviceState *qdev_try_create(BusState *bus, const char *type)
151 {
152     DeviceState *dev;
153 
154     if (object_class_by_name(type) == NULL) {
155         return NULL;
156     }
157     dev = DEVICE(object_new(type));
158     if (!dev) {
159         return NULL;
160     }
161 
162     if (!bus) {
163         bus = sysbus_get_default();
164     }
165 
166     qdev_set_parent_bus(dev, bus);
167     object_unref(OBJECT(dev));
168     return dev;
169 }
170 
171 /* Initialize a device.  Device properties should be set before calling
172    this function.  IRQs and MMIO regions should be connected/mapped after
173    calling this function.
174    On failure, destroy the device and return negative value.
175    Return 0 on success.  */
176 int qdev_init(DeviceState *dev)
177 {
178     Error *local_err = NULL;
179 
180     assert(!dev->realized);
181 
182     object_property_set_bool(OBJECT(dev), true, "realized", &local_err);
183     if (local_err != NULL) {
184         qerror_report_err(local_err);
185         error_free(local_err);
186         object_unparent(OBJECT(dev));
187         return -1;
188     }
189     return 0;
190 }
191 
192 static void device_realize(DeviceState *dev, Error **errp)
193 {
194     DeviceClass *dc = DEVICE_GET_CLASS(dev);
195 
196     if (dc->init) {
197         int rc = dc->init(dev);
198         if (rc < 0) {
199             error_setg(errp, "Device initialization failed.");
200             return;
201         }
202     }
203 }
204 
205 static void device_unrealize(DeviceState *dev, Error **errp)
206 {
207     DeviceClass *dc = DEVICE_GET_CLASS(dev);
208 
209     if (dc->exit) {
210         int rc = dc->exit(dev);
211         if (rc < 0) {
212             error_setg(errp, "Device exit failed.");
213             return;
214         }
215     }
216 }
217 
218 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
219                                  int required_for_version)
220 {
221     assert(!dev->realized);
222     dev->instance_id_alias = alias_id;
223     dev->alias_required_for_version = required_for_version;
224 }
225 
226 static HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
227 {
228     HotplugHandler *hotplug_ctrl = NULL;
229 
230     if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
231         hotplug_ctrl = dev->parent_bus->hotplug_handler;
232     } else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) {
233         MachineState *machine = MACHINE(qdev_get_machine());
234         MachineClass *mc = MACHINE_GET_CLASS(machine);
235 
236         if (mc->get_hotplug_handler) {
237             hotplug_ctrl = mc->get_hotplug_handler(machine, dev);
238         }
239     }
240     return hotplug_ctrl;
241 }
242 
243 void qdev_unplug(DeviceState *dev, Error **errp)
244 {
245     DeviceClass *dc = DEVICE_GET_CLASS(dev);
246     HotplugHandler *hotplug_ctrl;
247     HotplugHandlerClass *hdc;
248 
249     if (dev->parent_bus && !qbus_is_hotpluggable(dev->parent_bus)) {
250         error_set(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
251         return;
252     }
253 
254     if (!dc->hotpluggable) {
255         error_set(errp, QERR_DEVICE_NO_HOTPLUG,
256                   object_get_typename(OBJECT(dev)));
257         return;
258     }
259 
260     qdev_hot_removed = true;
261 
262     hotplug_ctrl = qdev_get_hotplug_handler(dev);
263     /* hotpluggable device MUST have HotplugHandler, if it doesn't
264      * then something is very wrong with it */
265     g_assert(hotplug_ctrl);
266 
267     /* If device supports async unplug just request it to be done,
268      * otherwise just remove it synchronously */
269     hdc = HOTPLUG_HANDLER_GET_CLASS(hotplug_ctrl);
270     if (hdc->unplug_request) {
271         hotplug_handler_unplug_request(hotplug_ctrl, dev, errp);
272     } else {
273         hotplug_handler_unplug(hotplug_ctrl, dev, errp);
274     }
275 }
276 
277 static int qdev_reset_one(DeviceState *dev, void *opaque)
278 {
279     device_reset(dev);
280 
281     return 0;
282 }
283 
284 static int qbus_reset_one(BusState *bus, void *opaque)
285 {
286     BusClass *bc = BUS_GET_CLASS(bus);
287     if (bc->reset) {
288         bc->reset(bus);
289     }
290     return 0;
291 }
292 
293 void qdev_reset_all(DeviceState *dev)
294 {
295     qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
296 }
297 
298 void qbus_reset_all(BusState *bus)
299 {
300     qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
301 }
302 
303 void qbus_reset_all_fn(void *opaque)
304 {
305     BusState *bus = opaque;
306     qbus_reset_all(bus);
307 }
308 
309 /* can be used as ->unplug() callback for the simple cases */
310 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
311                                   DeviceState *dev, Error **errp)
312 {
313     /* just zap it */
314     object_unparent(OBJECT(dev));
315 }
316 
317 /* Like qdev_init(), but terminate program via error_report() instead of
318    returning an error value.  This is okay during machine creation.
319    Don't use for hotplug, because there callers need to recover from
320    failure.  Exception: if you know the device's init() callback can't
321    fail, then qdev_init_nofail() can't fail either, and is therefore
322    usable even then.  But relying on the device implementation that
323    way is somewhat unclean, and best avoided.  */
324 void qdev_init_nofail(DeviceState *dev)
325 {
326     const char *typename = object_get_typename(OBJECT(dev));
327 
328     if (qdev_init(dev) < 0) {
329         error_report("Initialization of device %s failed", typename);
330         exit(1);
331     }
332 }
333 
334 void qdev_machine_creation_done(void)
335 {
336     /*
337      * ok, initial machine setup is done, starting from now we can
338      * only create hotpluggable devices
339      */
340     qdev_hotplug = 1;
341 }
342 
343 bool qdev_machine_modified(void)
344 {
345     return qdev_hot_added || qdev_hot_removed;
346 }
347 
348 BusState *qdev_get_parent_bus(DeviceState *dev)
349 {
350     return dev->parent_bus;
351 }
352 
353 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
354                                                const char *name)
355 {
356     NamedGPIOList *ngl;
357 
358     QLIST_FOREACH(ngl, &dev->gpios, node) {
359         /* NULL is a valid and matchable name, otherwise do a normal
360          * strcmp match.
361          */
362         if ((!ngl->name && !name) ||
363                 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
364             return ngl;
365         }
366     }
367 
368     ngl = g_malloc0(sizeof(*ngl));
369     ngl->name = g_strdup(name);
370     QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
371     return ngl;
372 }
373 
374 void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
375                              const char *name, int n)
376 {
377     int i;
378     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
379     char *propname = g_strdup_printf("%s[*]", name ? name : "unnamed-gpio-in");
380 
381     assert(gpio_list->num_out == 0 || !name);
382     gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
383                                      dev, n);
384 
385     for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
386         object_property_add_child(OBJECT(dev), propname,
387                                   OBJECT(gpio_list->in[i]), &error_abort);
388     }
389     g_free(propname);
390 
391     gpio_list->num_in += n;
392 }
393 
394 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
395 {
396     qdev_init_gpio_in_named(dev, handler, NULL, n);
397 }
398 
399 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
400                               const char *name, int n)
401 {
402     int i;
403     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
404     char *propname = g_strdup_printf("%s[*]", name ? name : "unnamed-gpio-out");
405 
406     assert(gpio_list->num_in == 0 || !name);
407     gpio_list->num_out += n;
408 
409     for (i = 0; i < n; ++i) {
410         memset(&pins[i], 0, sizeof(*pins));
411         object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
412                                  (Object **)&pins[i],
413                                  object_property_allow_set_link,
414                                  OBJ_PROP_LINK_UNREF_ON_RELEASE,
415                                  &error_abort);
416     }
417     g_free(propname);
418 }
419 
420 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
421 {
422     qdev_init_gpio_out_named(dev, pins, NULL, n);
423 }
424 
425 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
426 {
427     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
428 
429     assert(n >= 0 && n < gpio_list->num_in);
430     return gpio_list->in[n];
431 }
432 
433 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
434 {
435     return qdev_get_gpio_in_named(dev, NULL, n);
436 }
437 
438 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
439                                  qemu_irq pin)
440 {
441     char *propname = g_strdup_printf("%s[%d]",
442                                      name ? name : "unnamed-gpio-out", n);
443     if (pin) {
444         /* We need a name for object_property_set_link to work.  If the
445          * object has a parent, object_property_add_child will come back
446          * with an error without doing anything.  If it has none, it will
447          * never fail.  So we can just call it with a NULL Error pointer.
448          */
449         object_property_add_child(qdev_get_machine(), "non-qdev-gpio[*]",
450                                   OBJECT(pin), NULL);
451     }
452     object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
453     g_free(propname);
454 }
455 
456 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
457 {
458     char *propname = g_strdup_printf("%s[%d]",
459                                      name ? name : "unnamed-gpio-out", n);
460 
461     qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
462                                                       NULL);
463 
464     return ret;
465 }
466 
467 /* disconnect a GPIO ouput, returning the disconnected input (if any) */
468 
469 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
470                                                const char *name, int n)
471 {
472     char *propname = g_strdup_printf("%s[%d]",
473                                      name ? name : "unnamed-gpio-out", n);
474 
475     qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
476                                                       NULL);
477     if (ret) {
478         object_property_set_link(OBJECT(dev), NULL, propname, NULL);
479     }
480     g_free(propname);
481     return ret;
482 }
483 
484 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
485                                  const char *name, int n)
486 {
487     qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
488     qdev_connect_gpio_out_named(dev, name, n, icpt);
489     return disconnected;
490 }
491 
492 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
493 {
494     qdev_connect_gpio_out_named(dev, NULL, n, pin);
495 }
496 
497 void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
498                      const char *name)
499 {
500     int i;
501     NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
502 
503     for (i = 0; i < ngl->num_in; i++) {
504         const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
505         char *propname = g_strdup_printf("%s[%d]", nm, i);
506 
507         object_property_add_alias(OBJECT(container), propname,
508                                   OBJECT(dev), propname,
509                                   &error_abort);
510     }
511     for (i = 0; i < ngl->num_out; i++) {
512         const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
513         char *propname = g_strdup_printf("%s[%d]", nm, i);
514 
515         object_property_add_alias(OBJECT(container), propname,
516                                   OBJECT(dev), propname,
517                                   &error_abort);
518     }
519     QLIST_REMOVE(ngl, node);
520     QLIST_INSERT_HEAD(&container->gpios, ngl, node);
521 }
522 
523 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
524 {
525     BusState *bus;
526 
527     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
528         if (strcmp(name, bus->name) == 0) {
529             return bus;
530         }
531     }
532     return NULL;
533 }
534 
535 int qbus_walk_children(BusState *bus,
536                        qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
537                        qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
538                        void *opaque)
539 {
540     BusChild *kid;
541     int err;
542 
543     if (pre_busfn) {
544         err = pre_busfn(bus, opaque);
545         if (err) {
546             return err;
547         }
548     }
549 
550     QTAILQ_FOREACH(kid, &bus->children, sibling) {
551         err = qdev_walk_children(kid->child,
552                                  pre_devfn, pre_busfn,
553                                  post_devfn, post_busfn, opaque);
554         if (err < 0) {
555             return err;
556         }
557     }
558 
559     if (post_busfn) {
560         err = post_busfn(bus, opaque);
561         if (err) {
562             return err;
563         }
564     }
565 
566     return 0;
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 static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
626 {
627     const char *typename = object_get_typename(OBJECT(bus));
628     BusClass *bc;
629     char *buf;
630     int i, len, bus_id;
631 
632     bus->parent = parent;
633 
634     if (name) {
635         bus->name = g_strdup(name);
636     } else if (bus->parent && bus->parent->id) {
637         /* parent device has id -> use it plus parent-bus-id for bus name */
638         bus_id = bus->parent->num_child_bus;
639 
640         len = strlen(bus->parent->id) + 16;
641         buf = g_malloc(len);
642         snprintf(buf, len, "%s.%d", bus->parent->id, bus_id);
643         bus->name = buf;
644     } else {
645         /* no id -> use lowercase bus type plus global bus-id for bus name */
646         bc = BUS_GET_CLASS(bus);
647         bus_id = bc->automatic_ids++;
648 
649         len = strlen(typename) + 16;
650         buf = g_malloc(len);
651         len = snprintf(buf, len, "%s.%d", typename, bus_id);
652         for (i = 0; i < len; i++) {
653             buf[i] = qemu_tolower(buf[i]);
654         }
655         bus->name = buf;
656     }
657 
658     if (bus->parent) {
659         QLIST_INSERT_HEAD(&bus->parent->child_bus, bus, sibling);
660         bus->parent->num_child_bus++;
661         object_property_add_child(OBJECT(bus->parent), bus->name, OBJECT(bus), NULL);
662         object_unref(OBJECT(bus));
663     } else if (bus != sysbus_get_default()) {
664         /* TODO: once all bus devices are qdevified,
665            only reset handler for main_system_bus should be registered here. */
666         qemu_register_reset(qbus_reset_all_fn, bus);
667     }
668 }
669 
670 static void bus_unparent(Object *obj)
671 {
672     BusState *bus = BUS(obj);
673     BusChild *kid;
674 
675     while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) {
676         DeviceState *dev = kid->child;
677         object_unparent(OBJECT(dev));
678     }
679     if (bus->parent) {
680         QLIST_REMOVE(bus, sibling);
681         bus->parent->num_child_bus--;
682         bus->parent = NULL;
683     } else {
684         assert(bus != sysbus_get_default()); /* main_system_bus is never freed */
685         qemu_unregister_reset(qbus_reset_all_fn, bus);
686     }
687 }
688 
689 static bool bus_get_realized(Object *obj, Error **errp)
690 {
691     BusState *bus = BUS(obj);
692 
693     return bus->realized;
694 }
695 
696 static void bus_set_realized(Object *obj, bool value, Error **errp)
697 {
698     BusState *bus = BUS(obj);
699     BusClass *bc = BUS_GET_CLASS(bus);
700     BusChild *kid;
701     Error *local_err = NULL;
702 
703     if (value && !bus->realized) {
704         if (bc->realize) {
705             bc->realize(bus, &local_err);
706         }
707 
708         /* TODO: recursive realization */
709     } else if (!value && bus->realized) {
710         QTAILQ_FOREACH(kid, &bus->children, sibling) {
711             DeviceState *dev = kid->child;
712             object_property_set_bool(OBJECT(dev), false, "realized",
713                                      &local_err);
714             if (local_err != NULL) {
715                 break;
716             }
717         }
718         if (bc->unrealize && local_err == NULL) {
719             bc->unrealize(bus, &local_err);
720         }
721     }
722 
723     if (local_err != NULL) {
724         error_propagate(errp, local_err);
725         return;
726     }
727 
728     bus->realized = value;
729 }
730 
731 void qbus_create_inplace(void *bus, size_t size, const char *typename,
732                          DeviceState *parent, const char *name)
733 {
734     object_initialize(bus, size, typename);
735     qbus_realize(bus, parent, name);
736 }
737 
738 BusState *qbus_create(const char *typename, DeviceState *parent, const char *name)
739 {
740     BusState *bus;
741 
742     bus = BUS(object_new(typename));
743     qbus_realize(bus, parent, name);
744 
745     return bus;
746 }
747 
748 static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
749 {
750     BusClass *bc = BUS_GET_CLASS(bus);
751 
752     if (bc->get_fw_dev_path) {
753         return bc->get_fw_dev_path(dev);
754     }
755 
756     return NULL;
757 }
758 
759 static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
760 {
761     Object *obj = OBJECT(dev);
762     char *d = NULL;
763 
764     while (!d && obj->parent) {
765         obj = obj->parent;
766         d = fw_path_provider_try_get_dev_path(obj, bus, dev);
767     }
768     return d;
769 }
770 
771 static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
772 {
773     int l = 0;
774 
775     if (dev && dev->parent_bus) {
776         char *d;
777         l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
778         d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
779         if (!d) {
780             d = bus_get_fw_dev_path(dev->parent_bus, dev);
781         }
782         if (d) {
783             l += snprintf(p + l, size - l, "%s", d);
784             g_free(d);
785         } else {
786             return l;
787         }
788     }
789     l += snprintf(p + l , size - l, "/");
790 
791     return l;
792 }
793 
794 char* qdev_get_fw_dev_path(DeviceState *dev)
795 {
796     char path[128];
797     int l;
798 
799     l = qdev_get_fw_dev_path_helper(dev, path, 128);
800 
801     path[l-1] = '\0';
802 
803     return g_strdup(path);
804 }
805 
806 char *qdev_get_dev_path(DeviceState *dev)
807 {
808     BusClass *bc;
809 
810     if (!dev || !dev->parent_bus) {
811         return NULL;
812     }
813 
814     bc = BUS_GET_CLASS(dev->parent_bus);
815     if (bc->get_dev_path) {
816         return bc->get_dev_path(dev);
817     }
818 
819     return NULL;
820 }
821 
822 /**
823  * Legacy property handling
824  */
825 
826 static void qdev_get_legacy_property(Object *obj, Visitor *v, void *opaque,
827                                      const char *name, Error **errp)
828 {
829     DeviceState *dev = DEVICE(obj);
830     Property *prop = opaque;
831 
832     char buffer[1024];
833     char *ptr = buffer;
834 
835     prop->info->print(dev, prop, buffer, sizeof(buffer));
836     visit_type_str(v, &ptr, name, errp);
837 }
838 
839 /**
840  * @qdev_add_legacy_property - adds a legacy property
841  *
842  * Do not use this is new code!  Properties added through this interface will
843  * be given names and types in the "legacy" namespace.
844  *
845  * Legacy properties are string versions of other OOM properties.  The format
846  * of the string depends on the property type.
847  */
848 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
849                                      Error **errp)
850 {
851     gchar *name;
852 
853     /* Register pointer properties as legacy properties */
854     if (!prop->info->print && prop->info->get) {
855         return;
856     }
857 
858     name = g_strdup_printf("legacy-%s", prop->name);
859     object_property_add(OBJECT(dev), name, "str",
860                         prop->info->print ? qdev_get_legacy_property : prop->info->get,
861                         NULL,
862                         NULL,
863                         prop, errp);
864 
865     g_free(name);
866 }
867 
868 /**
869  * @qdev_property_add_static - add a @Property to a device.
870  *
871  * Static properties access data in a struct.  The actual type of the
872  * property and the field depends on the property type.
873  */
874 void qdev_property_add_static(DeviceState *dev, Property *prop,
875                               Error **errp)
876 {
877     Error *local_err = NULL;
878     Object *obj = OBJECT(dev);
879 
880     /*
881      * TODO qdev_prop_ptr does not have getters or setters.  It must
882      * go now that it can be replaced with links.  The test should be
883      * removed along with it: all static properties are read/write.
884      */
885     if (!prop->info->get && !prop->info->set) {
886         return;
887     }
888 
889     object_property_add(obj, prop->name, prop->info->name,
890                         prop->info->get, prop->info->set,
891                         prop->info->release,
892                         prop, &local_err);
893 
894     if (local_err) {
895         error_propagate(errp, local_err);
896         return;
897     }
898 
899     object_property_set_description(obj, prop->name,
900                                     prop->info->description,
901                                     &error_abort);
902 
903     if (prop->qtype == QTYPE_NONE) {
904         return;
905     }
906 
907     if (prop->qtype == QTYPE_QBOOL) {
908         object_property_set_bool(obj, prop->defval, prop->name, &error_abort);
909     } else if (prop->info->enum_table) {
910         object_property_set_str(obj, prop->info->enum_table[prop->defval],
911                                 prop->name, &error_abort);
912     } else if (prop->qtype == QTYPE_QINT) {
913         object_property_set_int(obj, prop->defval, prop->name, &error_abort);
914     }
915 }
916 
917 /* @qdev_alias_all_properties - Add alias properties to the source object for
918  * all qdev properties on the target DeviceState.
919  */
920 void qdev_alias_all_properties(DeviceState *target, Object *source)
921 {
922     ObjectClass *class;
923     Property *prop;
924 
925     class = object_get_class(OBJECT(target));
926     do {
927         DeviceClass *dc = DEVICE_CLASS(class);
928 
929         for (prop = dc->props; prop && prop->name; prop++) {
930             object_property_add_alias(source, prop->name,
931                                       OBJECT(target), prop->name,
932                                       &error_abort);
933         }
934         class = object_class_get_parent(class);
935     } while (class != object_class_by_name(TYPE_DEVICE));
936 }
937 
938 static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
939 {
940     GSList **list = opaque;
941     DeviceState *dev = DEVICE(obj);
942 
943     if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
944         *list = g_slist_append(*list, dev);
945     }
946 
947     return 0;
948 }
949 
950 GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
951 {
952     GSList *list = NULL;
953 
954     object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
955 
956     return list;
957 }
958 
959 static bool device_get_realized(Object *obj, Error **errp)
960 {
961     DeviceState *dev = DEVICE(obj);
962     return dev->realized;
963 }
964 
965 static void device_set_realized(Object *obj, bool value, Error **errp)
966 {
967     DeviceState *dev = DEVICE(obj);
968     DeviceClass *dc = DEVICE_GET_CLASS(dev);
969     HotplugHandler *hotplug_ctrl;
970     BusState *bus;
971     Error *local_err = NULL;
972 
973     if (dev->hotplugged && !dc->hotpluggable) {
974         error_set(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
975         return;
976     }
977 
978     if (value && !dev->realized) {
979         if (!obj->parent) {
980             static int unattached_count;
981             gchar *name = g_strdup_printf("device[%d]", unattached_count++);
982 
983             object_property_add_child(container_get(qdev_get_machine(),
984                                                     "/unattached"),
985                                       name, obj, &error_abort);
986             g_free(name);
987         }
988 
989         if (dc->realize) {
990             dc->realize(dev, &local_err);
991         }
992 
993         if (local_err != NULL) {
994             goto fail;
995         }
996 
997         hotplug_ctrl = qdev_get_hotplug_handler(dev);
998         if (hotplug_ctrl) {
999             hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
1000         }
1001 
1002         if (local_err != NULL) {
1003             goto post_realize_fail;
1004         }
1005 
1006         if (qdev_get_vmsd(dev)) {
1007             vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
1008                                            dev->instance_id_alias,
1009                                            dev->alias_required_for_version);
1010         }
1011 
1012         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1013             object_property_set_bool(OBJECT(bus), true, "realized",
1014                                          &local_err);
1015             if (local_err != NULL) {
1016                 goto child_realize_fail;
1017             }
1018         }
1019         if (dev->hotplugged) {
1020             device_reset(dev);
1021         }
1022         dev->pending_deleted_event = false;
1023     } else if (!value && dev->realized) {
1024         Error **local_errp = NULL;
1025         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1026             local_errp = local_err ? NULL : &local_err;
1027             object_property_set_bool(OBJECT(bus), false, "realized",
1028                                      local_errp);
1029         }
1030         if (qdev_get_vmsd(dev)) {
1031             vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
1032         }
1033         if (dc->unrealize) {
1034             local_errp = local_err ? NULL : &local_err;
1035             dc->unrealize(dev, local_errp);
1036         }
1037         dev->pending_deleted_event = true;
1038     }
1039 
1040     if (local_err != NULL) {
1041         goto fail;
1042     }
1043 
1044     dev->realized = value;
1045     return;
1046 
1047 child_realize_fail:
1048     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1049         object_property_set_bool(OBJECT(bus), false, "realized",
1050                                  NULL);
1051     }
1052 
1053     if (qdev_get_vmsd(dev)) {
1054         vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
1055     }
1056 
1057 post_realize_fail:
1058     if (dc->unrealize) {
1059         dc->unrealize(dev, NULL);
1060     }
1061 
1062 fail:
1063     error_propagate(errp, local_err);
1064     return;
1065 }
1066 
1067 static bool device_get_hotpluggable(Object *obj, Error **errp)
1068 {
1069     DeviceClass *dc = DEVICE_GET_CLASS(obj);
1070     DeviceState *dev = DEVICE(obj);
1071 
1072     return dc->hotpluggable && (dev->parent_bus == NULL ||
1073                                 qbus_is_hotpluggable(dev->parent_bus));
1074 }
1075 
1076 static bool device_get_hotplugged(Object *obj, Error **err)
1077 {
1078     DeviceState *dev = DEVICE(obj);
1079 
1080     return dev->hotplugged;
1081 }
1082 
1083 static void device_set_hotplugged(Object *obj, bool value, Error **err)
1084 {
1085     DeviceState *dev = DEVICE(obj);
1086 
1087     dev->hotplugged = value;
1088 }
1089 
1090 static void device_initfn(Object *obj)
1091 {
1092     DeviceState *dev = DEVICE(obj);
1093     ObjectClass *class;
1094     Property *prop;
1095 
1096     if (qdev_hotplug) {
1097         dev->hotplugged = 1;
1098         qdev_hot_added = true;
1099     }
1100 
1101     dev->instance_id_alias = -1;
1102     dev->realized = false;
1103 
1104     object_property_add_bool(obj, "realized",
1105                              device_get_realized, device_set_realized, NULL);
1106     object_property_add_bool(obj, "hotpluggable",
1107                              device_get_hotpluggable, NULL, NULL);
1108     object_property_add_bool(obj, "hotplugged",
1109                              device_get_hotplugged, device_set_hotplugged,
1110                              &error_abort);
1111 
1112     class = object_get_class(OBJECT(dev));
1113     do {
1114         for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
1115             qdev_property_add_legacy(dev, prop, &error_abort);
1116             qdev_property_add_static(dev, prop, &error_abort);
1117         }
1118         class = object_class_get_parent(class);
1119     } while (class != object_class_by_name(TYPE_DEVICE));
1120 
1121     object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
1122                              (Object **)&dev->parent_bus, NULL, 0,
1123                              &error_abort);
1124     QLIST_INIT(&dev->gpios);
1125 }
1126 
1127 static void device_post_init(Object *obj)
1128 {
1129     Error *err = NULL;
1130     qdev_prop_set_globals(DEVICE(obj), &err);
1131     if (err) {
1132         qerror_report_err(err);
1133         error_free(err);
1134         exit(EXIT_FAILURE);
1135     }
1136 }
1137 
1138 /* Unlink device from bus and free the structure.  */
1139 static void device_finalize(Object *obj)
1140 {
1141     NamedGPIOList *ngl, *next;
1142 
1143     DeviceState *dev = DEVICE(obj);
1144     if (dev->opts) {
1145         qemu_opts_del(dev->opts);
1146     }
1147 
1148     QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1149         QLIST_REMOVE(ngl, node);
1150         qemu_free_irqs(ngl->in, ngl->num_in);
1151         g_free(ngl->name);
1152         g_free(ngl);
1153         /* ngl->out irqs are owned by the other end and should not be freed
1154          * here
1155          */
1156     }
1157 }
1158 
1159 static void device_class_base_init(ObjectClass *class, void *data)
1160 {
1161     DeviceClass *klass = DEVICE_CLASS(class);
1162 
1163     /* We explicitly look up properties in the superclasses,
1164      * so do not propagate them to the subclasses.
1165      */
1166     klass->props = NULL;
1167 }
1168 
1169 static void device_unparent(Object *obj)
1170 {
1171     DeviceState *dev = DEVICE(obj);
1172     BusState *bus;
1173 
1174     if (dev->realized) {
1175         object_property_set_bool(obj, false, "realized", NULL);
1176     }
1177     while (dev->num_child_bus) {
1178         bus = QLIST_FIRST(&dev->child_bus);
1179         object_unparent(OBJECT(bus));
1180     }
1181     if (dev->parent_bus) {
1182         bus_remove_child(dev->parent_bus, dev);
1183         object_unref(OBJECT(dev->parent_bus));
1184         dev->parent_bus = NULL;
1185     }
1186 
1187     /* Only send event if the device had been completely realized */
1188     if (dev->pending_deleted_event) {
1189         gchar *path = object_get_canonical_path(OBJECT(dev));
1190 
1191         qapi_event_send_device_deleted(!!dev->id, dev->id, path, &error_abort);
1192         g_free(path);
1193     }
1194 }
1195 
1196 static void device_class_init(ObjectClass *class, void *data)
1197 {
1198     DeviceClass *dc = DEVICE_CLASS(class);
1199 
1200     class->unparent = device_unparent;
1201     dc->realize = device_realize;
1202     dc->unrealize = device_unrealize;
1203 
1204     /* by default all devices were considered as hotpluggable,
1205      * so with intent to check it in generic qdev_unplug() /
1206      * device_set_realized() functions make every device
1207      * hotpluggable. Devices that shouldn't be hotpluggable,
1208      * should override it in their class_init()
1209      */
1210     dc->hotpluggable = true;
1211 }
1212 
1213 void device_reset(DeviceState *dev)
1214 {
1215     DeviceClass *klass = DEVICE_GET_CLASS(dev);
1216 
1217     if (klass->reset) {
1218         klass->reset(dev);
1219     }
1220 }
1221 
1222 Object *qdev_get_machine(void)
1223 {
1224     static Object *dev;
1225 
1226     if (dev == NULL) {
1227         dev = container_get(object_get_root(), "/machine");
1228     }
1229 
1230     return dev;
1231 }
1232 
1233 static const TypeInfo device_type_info = {
1234     .name = TYPE_DEVICE,
1235     .parent = TYPE_OBJECT,
1236     .instance_size = sizeof(DeviceState),
1237     .instance_init = device_initfn,
1238     .instance_post_init = device_post_init,
1239     .instance_finalize = device_finalize,
1240     .class_base_init = device_class_base_init,
1241     .class_init = device_class_init,
1242     .abstract = true,
1243     .class_size = sizeof(DeviceClass),
1244 };
1245 
1246 static void qbus_initfn(Object *obj)
1247 {
1248     BusState *bus = BUS(obj);
1249 
1250     QTAILQ_INIT(&bus->children);
1251     object_property_add_link(obj, QDEV_HOTPLUG_HANDLER_PROPERTY,
1252                              TYPE_HOTPLUG_HANDLER,
1253                              (Object **)&bus->hotplug_handler,
1254                              object_property_allow_set_link,
1255                              OBJ_PROP_LINK_UNREF_ON_RELEASE,
1256                              NULL);
1257     object_property_add_bool(obj, "realized",
1258                              bus_get_realized, bus_set_realized, NULL);
1259 }
1260 
1261 static char *default_bus_get_fw_dev_path(DeviceState *dev)
1262 {
1263     return g_strdup(object_get_typename(OBJECT(dev)));
1264 }
1265 
1266 static void bus_class_init(ObjectClass *class, void *data)
1267 {
1268     BusClass *bc = BUS_CLASS(class);
1269 
1270     class->unparent = bus_unparent;
1271     bc->get_fw_dev_path = default_bus_get_fw_dev_path;
1272 }
1273 
1274 static void qbus_finalize(Object *obj)
1275 {
1276     BusState *bus = BUS(obj);
1277 
1278     g_free((char *)bus->name);
1279 }
1280 
1281 static const TypeInfo bus_info = {
1282     .name = TYPE_BUS,
1283     .parent = TYPE_OBJECT,
1284     .instance_size = sizeof(BusState),
1285     .abstract = true,
1286     .class_size = sizeof(BusClass),
1287     .instance_init = qbus_initfn,
1288     .instance_finalize = qbus_finalize,
1289     .class_init = bus_class_init,
1290 };
1291 
1292 static void qdev_register_types(void)
1293 {
1294     type_register_static(&bus_info);
1295     type_register_static(&device_type_info);
1296 }
1297 
1298 type_init(qdev_register_types)
1299