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