xref: /openbmc/qemu/hw/core/qdev.c (revision aef0869e8ed83ec201488020a9a1cc44d85d72bf)
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 /* disconnect a GPIO ouput, returning the disconnected input (if any) */
457 
458 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
459                                                const char *name, int n)
460 {
461     char *propname = g_strdup_printf("%s[%d]",
462                                      name ? name : "unnamed-gpio-out", n);
463 
464     qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
465                                                       NULL);
466     if (ret) {
467         object_property_set_link(OBJECT(dev), NULL, propname, NULL);
468     }
469     g_free(propname);
470     return ret;
471 }
472 
473 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
474                                  const char *name, int n)
475 {
476     qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
477     qdev_connect_gpio_out_named(dev, name, n, icpt);
478     return disconnected;
479 }
480 
481 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
482 {
483     qdev_connect_gpio_out_named(dev, NULL, n, pin);
484 }
485 
486 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
487 {
488     BusState *bus;
489 
490     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
491         if (strcmp(name, bus->name) == 0) {
492             return bus;
493         }
494     }
495     return NULL;
496 }
497 
498 int qbus_walk_children(BusState *bus,
499                        qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
500                        qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
501                        void *opaque)
502 {
503     BusChild *kid;
504     int err;
505 
506     if (pre_busfn) {
507         err = pre_busfn(bus, opaque);
508         if (err) {
509             return err;
510         }
511     }
512 
513     QTAILQ_FOREACH(kid, &bus->children, sibling) {
514         err = qdev_walk_children(kid->child,
515                                  pre_devfn, pre_busfn,
516                                  post_devfn, post_busfn, opaque);
517         if (err < 0) {
518             return err;
519         }
520     }
521 
522     if (post_busfn) {
523         err = post_busfn(bus, opaque);
524         if (err) {
525             return err;
526         }
527     }
528 
529     return 0;
530 }
531 
532 int qdev_walk_children(DeviceState *dev,
533                        qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
534                        qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
535                        void *opaque)
536 {
537     BusState *bus;
538     int err;
539 
540     if (pre_devfn) {
541         err = pre_devfn(dev, opaque);
542         if (err) {
543             return err;
544         }
545     }
546 
547     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
548         err = qbus_walk_children(bus, pre_devfn, pre_busfn,
549                                  post_devfn, post_busfn, opaque);
550         if (err < 0) {
551             return err;
552         }
553     }
554 
555     if (post_devfn) {
556         err = post_devfn(dev, opaque);
557         if (err) {
558             return err;
559         }
560     }
561 
562     return 0;
563 }
564 
565 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
566 {
567     BusChild *kid;
568     DeviceState *ret;
569     BusState *child;
570 
571     QTAILQ_FOREACH(kid, &bus->children, sibling) {
572         DeviceState *dev = kid->child;
573 
574         if (dev->id && strcmp(dev->id, id) == 0) {
575             return dev;
576         }
577 
578         QLIST_FOREACH(child, &dev->child_bus, sibling) {
579             ret = qdev_find_recursive(child, id);
580             if (ret) {
581                 return ret;
582             }
583         }
584     }
585     return NULL;
586 }
587 
588 static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
589 {
590     const char *typename = object_get_typename(OBJECT(bus));
591     BusClass *bc;
592     char *buf;
593     int i, len, bus_id;
594 
595     bus->parent = parent;
596 
597     if (name) {
598         bus->name = g_strdup(name);
599     } else if (bus->parent && bus->parent->id) {
600         /* parent device has id -> use it plus parent-bus-id for bus name */
601         bus_id = bus->parent->num_child_bus;
602 
603         len = strlen(bus->parent->id) + 16;
604         buf = g_malloc(len);
605         snprintf(buf, len, "%s.%d", bus->parent->id, bus_id);
606         bus->name = buf;
607     } else {
608         /* no id -> use lowercase bus type plus global bus-id for bus name */
609         bc = BUS_GET_CLASS(bus);
610         bus_id = bc->automatic_ids++;
611 
612         len = strlen(typename) + 16;
613         buf = g_malloc(len);
614         len = snprintf(buf, len, "%s.%d", typename, bus_id);
615         for (i = 0; i < len; i++) {
616             buf[i] = qemu_tolower(buf[i]);
617         }
618         bus->name = buf;
619     }
620 
621     if (bus->parent) {
622         QLIST_INSERT_HEAD(&bus->parent->child_bus, bus, sibling);
623         bus->parent->num_child_bus++;
624         object_property_add_child(OBJECT(bus->parent), bus->name, OBJECT(bus), NULL);
625         object_unref(OBJECT(bus));
626     } else if (bus != sysbus_get_default()) {
627         /* TODO: once all bus devices are qdevified,
628            only reset handler for main_system_bus should be registered here. */
629         qemu_register_reset(qbus_reset_all_fn, bus);
630     }
631 }
632 
633 static void bus_unparent(Object *obj)
634 {
635     BusState *bus = BUS(obj);
636     BusChild *kid;
637 
638     while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) {
639         DeviceState *dev = kid->child;
640         object_unparent(OBJECT(dev));
641     }
642     if (bus->parent) {
643         QLIST_REMOVE(bus, sibling);
644         bus->parent->num_child_bus--;
645         bus->parent = NULL;
646     } else {
647         assert(bus != sysbus_get_default()); /* main_system_bus is never freed */
648         qemu_unregister_reset(qbus_reset_all_fn, bus);
649     }
650 }
651 
652 static bool bus_get_realized(Object *obj, Error **errp)
653 {
654     BusState *bus = BUS(obj);
655 
656     return bus->realized;
657 }
658 
659 static void bus_set_realized(Object *obj, bool value, Error **errp)
660 {
661     BusState *bus = BUS(obj);
662     BusClass *bc = BUS_GET_CLASS(bus);
663     BusChild *kid;
664     Error *local_err = NULL;
665 
666     if (value && !bus->realized) {
667         if (bc->realize) {
668             bc->realize(bus, &local_err);
669         }
670 
671         /* TODO: recursive realization */
672     } else if (!value && bus->realized) {
673         QTAILQ_FOREACH(kid, &bus->children, sibling) {
674             DeviceState *dev = kid->child;
675             object_property_set_bool(OBJECT(dev), false, "realized",
676                                      &local_err);
677             if (local_err != NULL) {
678                 break;
679             }
680         }
681         if (bc->unrealize && local_err == NULL) {
682             bc->unrealize(bus, &local_err);
683         }
684     }
685 
686     if (local_err != NULL) {
687         error_propagate(errp, local_err);
688         return;
689     }
690 
691     bus->realized = value;
692 }
693 
694 void qbus_create_inplace(void *bus, size_t size, const char *typename,
695                          DeviceState *parent, const char *name)
696 {
697     object_initialize(bus, size, typename);
698     qbus_realize(bus, parent, name);
699 }
700 
701 BusState *qbus_create(const char *typename, DeviceState *parent, const char *name)
702 {
703     BusState *bus;
704 
705     bus = BUS(object_new(typename));
706     qbus_realize(bus, parent, name);
707 
708     return bus;
709 }
710 
711 static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
712 {
713     BusClass *bc = BUS_GET_CLASS(bus);
714 
715     if (bc->get_fw_dev_path) {
716         return bc->get_fw_dev_path(dev);
717     }
718 
719     return NULL;
720 }
721 
722 static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
723 {
724     Object *obj = OBJECT(dev);
725     char *d = NULL;
726 
727     while (!d && obj->parent) {
728         obj = obj->parent;
729         d = fw_path_provider_try_get_dev_path(obj, bus, dev);
730     }
731     return d;
732 }
733 
734 static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
735 {
736     int l = 0;
737 
738     if (dev && dev->parent_bus) {
739         char *d;
740         l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
741         d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
742         if (!d) {
743             d = bus_get_fw_dev_path(dev->parent_bus, dev);
744         }
745         if (d) {
746             l += snprintf(p + l, size - l, "%s", d);
747             g_free(d);
748         } else {
749             return l;
750         }
751     }
752     l += snprintf(p + l , size - l, "/");
753 
754     return l;
755 }
756 
757 char* qdev_get_fw_dev_path(DeviceState *dev)
758 {
759     char path[128];
760     int l;
761 
762     l = qdev_get_fw_dev_path_helper(dev, path, 128);
763 
764     path[l-1] = '\0';
765 
766     return g_strdup(path);
767 }
768 
769 char *qdev_get_dev_path(DeviceState *dev)
770 {
771     BusClass *bc;
772 
773     if (!dev || !dev->parent_bus) {
774         return NULL;
775     }
776 
777     bc = BUS_GET_CLASS(dev->parent_bus);
778     if (bc->get_dev_path) {
779         return bc->get_dev_path(dev);
780     }
781 
782     return NULL;
783 }
784 
785 /**
786  * Legacy property handling
787  */
788 
789 static void qdev_get_legacy_property(Object *obj, Visitor *v, void *opaque,
790                                      const char *name, Error **errp)
791 {
792     DeviceState *dev = DEVICE(obj);
793     Property *prop = opaque;
794 
795     char buffer[1024];
796     char *ptr = buffer;
797 
798     prop->info->print(dev, prop, buffer, sizeof(buffer));
799     visit_type_str(v, &ptr, name, errp);
800 }
801 
802 /**
803  * @qdev_add_legacy_property - adds a legacy property
804  *
805  * Do not use this is new code!  Properties added through this interface will
806  * be given names and types in the "legacy" namespace.
807  *
808  * Legacy properties are string versions of other OOM properties.  The format
809  * of the string depends on the property type.
810  */
811 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
812                                      Error **errp)
813 {
814     gchar *name;
815 
816     /* Register pointer properties as legacy properties */
817     if (!prop->info->print && prop->info->get) {
818         return;
819     }
820 
821     name = g_strdup_printf("legacy-%s", prop->name);
822     object_property_add(OBJECT(dev), name, "str",
823                         prop->info->print ? qdev_get_legacy_property : prop->info->get,
824                         NULL,
825                         NULL,
826                         prop, errp);
827 
828     g_free(name);
829 }
830 
831 /**
832  * @qdev_property_add_static - add a @Property to a device.
833  *
834  * Static properties access data in a struct.  The actual type of the
835  * property and the field depends on the property type.
836  */
837 void qdev_property_add_static(DeviceState *dev, Property *prop,
838                               Error **errp)
839 {
840     Error *local_err = NULL;
841     Object *obj = OBJECT(dev);
842 
843     /*
844      * TODO qdev_prop_ptr does not have getters or setters.  It must
845      * go now that it can be replaced with links.  The test should be
846      * removed along with it: all static properties are read/write.
847      */
848     if (!prop->info->get && !prop->info->set) {
849         return;
850     }
851 
852     object_property_add(obj, prop->name, prop->info->name,
853                         prop->info->get, prop->info->set,
854                         prop->info->release,
855                         prop, &local_err);
856 
857     if (local_err) {
858         error_propagate(errp, local_err);
859         return;
860     }
861 
862     object_property_set_description(obj, prop->name,
863                                     prop->info->description,
864                                     &error_abort);
865 
866     if (prop->qtype == QTYPE_NONE) {
867         return;
868     }
869 
870     if (prop->qtype == QTYPE_QBOOL) {
871         object_property_set_bool(obj, prop->defval, prop->name, &error_abort);
872     } else if (prop->info->enum_table) {
873         object_property_set_str(obj, prop->info->enum_table[prop->defval],
874                                 prop->name, &error_abort);
875     } else if (prop->qtype == QTYPE_QINT) {
876         object_property_set_int(obj, prop->defval, prop->name, &error_abort);
877     }
878 }
879 
880 /* @qdev_alias_all_properties - Add alias properties to the source object for
881  * all qdev properties on the target DeviceState.
882  */
883 void qdev_alias_all_properties(DeviceState *target, Object *source)
884 {
885     ObjectClass *class;
886     Property *prop;
887 
888     class = object_get_class(OBJECT(target));
889     do {
890         DeviceClass *dc = DEVICE_CLASS(class);
891 
892         for (prop = dc->props; prop && prop->name; prop++) {
893             object_property_add_alias(source, prop->name,
894                                       OBJECT(target), prop->name,
895                                       &error_abort);
896         }
897         class = object_class_get_parent(class);
898     } while (class != object_class_by_name(TYPE_DEVICE));
899 }
900 
901 static bool device_get_realized(Object *obj, Error **errp)
902 {
903     DeviceState *dev = DEVICE(obj);
904     return dev->realized;
905 }
906 
907 static void device_set_realized(Object *obj, bool value, Error **errp)
908 {
909     DeviceState *dev = DEVICE(obj);
910     DeviceClass *dc = DEVICE_GET_CLASS(dev);
911     HotplugHandler *hotplug_ctrl;
912     BusState *bus;
913     Error *local_err = NULL;
914 
915     if (dev->hotplugged && !dc->hotpluggable) {
916         error_set(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
917         return;
918     }
919 
920     if (value && !dev->realized) {
921         if (!obj->parent) {
922             static int unattached_count;
923             gchar *name = g_strdup_printf("device[%d]", unattached_count++);
924 
925             object_property_add_child(container_get(qdev_get_machine(),
926                                                     "/unattached"),
927                                       name, obj, &error_abort);
928             g_free(name);
929         }
930 
931         if (dc->realize) {
932             dc->realize(dev, &local_err);
933         }
934 
935         if (local_err != NULL) {
936             goto fail;
937         }
938 
939         hotplug_ctrl = qdev_get_hotplug_handler(dev);
940         if (hotplug_ctrl) {
941             hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
942         }
943 
944         if (local_err != NULL) {
945             goto post_realize_fail;
946         }
947 
948         if (qdev_get_vmsd(dev)) {
949             vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
950                                            dev->instance_id_alias,
951                                            dev->alias_required_for_version);
952         }
953 
954         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
955             object_property_set_bool(OBJECT(bus), true, "realized",
956                                          &local_err);
957             if (local_err != NULL) {
958                 goto child_realize_fail;
959             }
960         }
961         if (dev->hotplugged) {
962             device_reset(dev);
963         }
964         dev->pending_deleted_event = false;
965     } else if (!value && dev->realized) {
966         Error **local_errp = NULL;
967         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
968             local_errp = local_err ? NULL : &local_err;
969             object_property_set_bool(OBJECT(bus), false, "realized",
970                                      local_errp);
971         }
972         if (qdev_get_vmsd(dev)) {
973             vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
974         }
975         if (dc->unrealize) {
976             local_errp = local_err ? NULL : &local_err;
977             dc->unrealize(dev, local_errp);
978         }
979         dev->pending_deleted_event = true;
980     }
981 
982     if (local_err != NULL) {
983         goto fail;
984     }
985 
986     dev->realized = value;
987     return;
988 
989 child_realize_fail:
990     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
991         object_property_set_bool(OBJECT(bus), false, "realized",
992                                  NULL);
993     }
994 
995     if (qdev_get_vmsd(dev)) {
996         vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
997     }
998 
999 post_realize_fail:
1000     if (dc->unrealize) {
1001         dc->unrealize(dev, NULL);
1002     }
1003 
1004 fail:
1005     error_propagate(errp, local_err);
1006     return;
1007 }
1008 
1009 static bool device_get_hotpluggable(Object *obj, Error **errp)
1010 {
1011     DeviceClass *dc = DEVICE_GET_CLASS(obj);
1012     DeviceState *dev = DEVICE(obj);
1013 
1014     return dc->hotpluggable && (dev->parent_bus == NULL ||
1015                                 qbus_is_hotpluggable(dev->parent_bus));
1016 }
1017 
1018 static bool device_get_hotplugged(Object *obj, Error **err)
1019 {
1020     DeviceState *dev = DEVICE(obj);
1021 
1022     return dev->hotplugged;
1023 }
1024 
1025 static void device_set_hotplugged(Object *obj, bool value, Error **err)
1026 {
1027     DeviceState *dev = DEVICE(obj);
1028 
1029     dev->hotplugged = value;
1030 }
1031 
1032 static void device_initfn(Object *obj)
1033 {
1034     DeviceState *dev = DEVICE(obj);
1035     ObjectClass *class;
1036     Property *prop;
1037 
1038     if (qdev_hotplug) {
1039         dev->hotplugged = 1;
1040         qdev_hot_added = true;
1041     }
1042 
1043     dev->instance_id_alias = -1;
1044     dev->realized = false;
1045 
1046     object_property_add_bool(obj, "realized",
1047                              device_get_realized, device_set_realized, NULL);
1048     object_property_add_bool(obj, "hotpluggable",
1049                              device_get_hotpluggable, NULL, NULL);
1050     object_property_add_bool(obj, "hotplugged",
1051                              device_get_hotplugged, device_set_hotplugged,
1052                              &error_abort);
1053 
1054     class = object_get_class(OBJECT(dev));
1055     do {
1056         for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
1057             qdev_property_add_legacy(dev, prop, &error_abort);
1058             qdev_property_add_static(dev, prop, &error_abort);
1059         }
1060         class = object_class_get_parent(class);
1061     } while (class != object_class_by_name(TYPE_DEVICE));
1062 
1063     object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
1064                              (Object **)&dev->parent_bus, NULL, 0,
1065                              &error_abort);
1066     QLIST_INIT(&dev->gpios);
1067 }
1068 
1069 static void device_post_init(Object *obj)
1070 {
1071     Error *err = NULL;
1072     qdev_prop_set_globals(DEVICE(obj), &err);
1073     if (err) {
1074         qerror_report_err(err);
1075         error_free(err);
1076         exit(EXIT_FAILURE);
1077     }
1078 }
1079 
1080 /* Unlink device from bus and free the structure.  */
1081 static void device_finalize(Object *obj)
1082 {
1083     NamedGPIOList *ngl, *next;
1084 
1085     DeviceState *dev = DEVICE(obj);
1086     if (dev->opts) {
1087         qemu_opts_del(dev->opts);
1088     }
1089 
1090     QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1091         QLIST_REMOVE(ngl, node);
1092         qemu_free_irqs(ngl->in, ngl->num_in);
1093         g_free(ngl->name);
1094         g_free(ngl);
1095         /* ngl->out irqs are owned by the other end and should not be freed
1096          * here
1097          */
1098     }
1099 }
1100 
1101 static void device_class_base_init(ObjectClass *class, void *data)
1102 {
1103     DeviceClass *klass = DEVICE_CLASS(class);
1104 
1105     /* We explicitly look up properties in the superclasses,
1106      * so do not propagate them to the subclasses.
1107      */
1108     klass->props = NULL;
1109 }
1110 
1111 static void device_unparent(Object *obj)
1112 {
1113     DeviceState *dev = DEVICE(obj);
1114     BusState *bus;
1115 
1116     if (dev->realized) {
1117         object_property_set_bool(obj, false, "realized", NULL);
1118     }
1119     while (dev->num_child_bus) {
1120         bus = QLIST_FIRST(&dev->child_bus);
1121         object_unparent(OBJECT(bus));
1122     }
1123     if (dev->parent_bus) {
1124         bus_remove_child(dev->parent_bus, dev);
1125         object_unref(OBJECT(dev->parent_bus));
1126         dev->parent_bus = NULL;
1127     }
1128 
1129     /* Only send event if the device had been completely realized */
1130     if (dev->pending_deleted_event) {
1131         gchar *path = object_get_canonical_path(OBJECT(dev));
1132 
1133         qapi_event_send_device_deleted(!!dev->id, dev->id, path, &error_abort);
1134         g_free(path);
1135     }
1136 }
1137 
1138 static void device_class_init(ObjectClass *class, void *data)
1139 {
1140     DeviceClass *dc = DEVICE_CLASS(class);
1141 
1142     class->unparent = device_unparent;
1143     dc->realize = device_realize;
1144     dc->unrealize = device_unrealize;
1145 
1146     /* by default all devices were considered as hotpluggable,
1147      * so with intent to check it in generic qdev_unplug() /
1148      * device_set_realized() functions make every device
1149      * hotpluggable. Devices that shouldn't be hotpluggable,
1150      * should override it in their class_init()
1151      */
1152     dc->hotpluggable = true;
1153 }
1154 
1155 void device_reset(DeviceState *dev)
1156 {
1157     DeviceClass *klass = DEVICE_GET_CLASS(dev);
1158 
1159     if (klass->reset) {
1160         klass->reset(dev);
1161     }
1162 }
1163 
1164 Object *qdev_get_machine(void)
1165 {
1166     static Object *dev;
1167 
1168     if (dev == NULL) {
1169         dev = container_get(object_get_root(), "/machine");
1170     }
1171 
1172     return dev;
1173 }
1174 
1175 static const TypeInfo device_type_info = {
1176     .name = TYPE_DEVICE,
1177     .parent = TYPE_OBJECT,
1178     .instance_size = sizeof(DeviceState),
1179     .instance_init = device_initfn,
1180     .instance_post_init = device_post_init,
1181     .instance_finalize = device_finalize,
1182     .class_base_init = device_class_base_init,
1183     .class_init = device_class_init,
1184     .abstract = true,
1185     .class_size = sizeof(DeviceClass),
1186 };
1187 
1188 static void qbus_initfn(Object *obj)
1189 {
1190     BusState *bus = BUS(obj);
1191 
1192     QTAILQ_INIT(&bus->children);
1193     object_property_add_link(obj, QDEV_HOTPLUG_HANDLER_PROPERTY,
1194                              TYPE_HOTPLUG_HANDLER,
1195                              (Object **)&bus->hotplug_handler,
1196                              object_property_allow_set_link,
1197                              OBJ_PROP_LINK_UNREF_ON_RELEASE,
1198                              NULL);
1199     object_property_add_bool(obj, "realized",
1200                              bus_get_realized, bus_set_realized, NULL);
1201 }
1202 
1203 static char *default_bus_get_fw_dev_path(DeviceState *dev)
1204 {
1205     return g_strdup(object_get_typename(OBJECT(dev)));
1206 }
1207 
1208 static void bus_class_init(ObjectClass *class, void *data)
1209 {
1210     BusClass *bc = BUS_CLASS(class);
1211 
1212     class->unparent = bus_unparent;
1213     bc->get_fw_dev_path = default_bus_get_fw_dev_path;
1214 }
1215 
1216 static void qbus_finalize(Object *obj)
1217 {
1218     BusState *bus = BUS(obj);
1219 
1220     g_free((char *)bus->name);
1221 }
1222 
1223 static const TypeInfo bus_info = {
1224     .name = TYPE_BUS,
1225     .parent = TYPE_OBJECT,
1226     .instance_size = sizeof(BusState),
1227     .abstract = true,
1228     .class_size = sizeof(BusClass),
1229     .instance_init = qbus_initfn,
1230     .instance_finalize = qbus_finalize,
1231     .class_init = bus_class_init,
1232 };
1233 
1234 static void qdev_register_types(void)
1235 {
1236     type_register_static(&bus_info);
1237     type_register_static(&device_type_info);
1238 }
1239 
1240 type_init(qdev_register_types)
1241