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