xref: /openbmc/qemu/hw/core/qdev.c (revision da34e65c)
1 /*
2  *  Dynamic device configuration and creation.
3  *
4  *  Copyright (c) 2009 CodeSourcery
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 /* The theory here is that it should be possible to create a machine without
21    knowledge of specific devices.  Historically board init routines have
22    passed a bunch of arguments to each device, requiring the board know
23    exactly which device it is dealing with.  This file provides an abstract
24    API for device configuration and initialization.  Devices will generally
25    inherit from a particular bus (e.g. PCI or I2C) rather than
26    this API directly.  */
27 
28 #include "qemu/osdep.h"
29 #include "hw/qdev.h"
30 #include "hw/fw-path-provider.h"
31 #include "sysemu/sysemu.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 qdev_reset_all_fn(void *opaque)
329 {
330     qdev_reset_all(DEVICE(opaque));
331 }
332 
333 void qbus_reset_all(BusState *bus)
334 {
335     qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
336 }
337 
338 void qbus_reset_all_fn(void *opaque)
339 {
340     BusState *bus = opaque;
341     qbus_reset_all(bus);
342 }
343 
344 /* can be used as ->unplug() callback for the simple cases */
345 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
346                                   DeviceState *dev, Error **errp)
347 {
348     /* just zap it */
349     object_unparent(OBJECT(dev));
350 }
351 
352 /*
353  * Realize @dev.
354  * Device properties should be set before calling this function.  IRQs
355  * and MMIO regions should be connected/mapped after calling this
356  * function.
357  * On failure, report an error with error_report() and terminate the
358  * program.  This is okay during machine creation.  Don't use for
359  * hotplug, because there callers need to recover from failure.
360  * Exception: if you know the device's init() callback can't fail,
361  * then qdev_init_nofail() can't fail either, and is therefore usable
362  * even then.  But relying on the device implementation that way is
363  * somewhat unclean, and best avoided.
364  */
365 void qdev_init_nofail(DeviceState *dev)
366 {
367     Error *err = NULL;
368 
369     assert(!dev->realized);
370 
371     object_property_set_bool(OBJECT(dev), true, "realized", &err);
372     if (err) {
373         error_reportf_err(err, "Initialization of device %s failed: ",
374                           object_get_typename(OBJECT(dev)));
375         exit(1);
376     }
377 }
378 
379 void qdev_machine_creation_done(void)
380 {
381     /*
382      * ok, initial machine setup is done, starting from now we can
383      * only create hotpluggable devices
384      */
385     qdev_hotplug = 1;
386 }
387 
388 bool qdev_machine_modified(void)
389 {
390     return qdev_hot_added || qdev_hot_removed;
391 }
392 
393 BusState *qdev_get_parent_bus(DeviceState *dev)
394 {
395     return dev->parent_bus;
396 }
397 
398 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
399                                                const char *name)
400 {
401     NamedGPIOList *ngl;
402 
403     QLIST_FOREACH(ngl, &dev->gpios, node) {
404         /* NULL is a valid and matchable name, otherwise do a normal
405          * strcmp match.
406          */
407         if ((!ngl->name && !name) ||
408                 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
409             return ngl;
410         }
411     }
412 
413     ngl = g_malloc0(sizeof(*ngl));
414     ngl->name = g_strdup(name);
415     QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
416     return ngl;
417 }
418 
419 void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
420                              const char *name, int n)
421 {
422     int i;
423     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
424 
425     assert(gpio_list->num_out == 0 || !name);
426     gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
427                                      dev, n);
428 
429     if (!name) {
430         name = "unnamed-gpio-in";
431     }
432     for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
433         gchar *propname = g_strdup_printf("%s[%u]", name, i);
434 
435         object_property_add_child(OBJECT(dev), propname,
436                                   OBJECT(gpio_list->in[i]), &error_abort);
437         g_free(propname);
438     }
439 
440     gpio_list->num_in += n;
441 }
442 
443 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
444 {
445     qdev_init_gpio_in_named(dev, handler, NULL, n);
446 }
447 
448 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
449                               const char *name, int n)
450 {
451     int i;
452     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
453 
454     assert(gpio_list->num_in == 0 || !name);
455 
456     if (!name) {
457         name = "unnamed-gpio-out";
458     }
459     memset(pins, 0, sizeof(*pins) * n);
460     for (i = 0; i < n; ++i) {
461         gchar *propname = g_strdup_printf("%s[%u]", name,
462                                           gpio_list->num_out + i);
463 
464         object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
465                                  (Object **)&pins[i],
466                                  object_property_allow_set_link,
467                                  OBJ_PROP_LINK_UNREF_ON_RELEASE,
468                                  &error_abort);
469         g_free(propname);
470     }
471     gpio_list->num_out += n;
472 }
473 
474 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
475 {
476     qdev_init_gpio_out_named(dev, pins, NULL, n);
477 }
478 
479 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
480 {
481     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
482 
483     assert(n >= 0 && n < gpio_list->num_in);
484     return gpio_list->in[n];
485 }
486 
487 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
488 {
489     return qdev_get_gpio_in_named(dev, NULL, n);
490 }
491 
492 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
493                                  qemu_irq pin)
494 {
495     char *propname = g_strdup_printf("%s[%d]",
496                                      name ? name : "unnamed-gpio-out", n);
497     if (pin) {
498         /* We need a name for object_property_set_link to work.  If the
499          * object has a parent, object_property_add_child will come back
500          * with an error without doing anything.  If it has none, it will
501          * never fail.  So we can just call it with a NULL Error pointer.
502          */
503         object_property_add_child(container_get(qdev_get_machine(),
504                                                 "/unattached"),
505                                   "non-qdev-gpio[*]", OBJECT(pin), NULL);
506     }
507     object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
508     g_free(propname);
509 }
510 
511 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
512 {
513     char *propname = g_strdup_printf("%s[%d]",
514                                      name ? name : "unnamed-gpio-out", n);
515 
516     qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
517                                                       NULL);
518 
519     return ret;
520 }
521 
522 /* disconnect a GPIO output, returning the disconnected input (if any) */
523 
524 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
525                                                const char *name, int n)
526 {
527     char *propname = g_strdup_printf("%s[%d]",
528                                      name ? name : "unnamed-gpio-out", n);
529 
530     qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
531                                                       NULL);
532     if (ret) {
533         object_property_set_link(OBJECT(dev), NULL, propname, NULL);
534     }
535     g_free(propname);
536     return ret;
537 }
538 
539 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
540                                  const char *name, int n)
541 {
542     qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
543     qdev_connect_gpio_out_named(dev, name, n, icpt);
544     return disconnected;
545 }
546 
547 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
548 {
549     qdev_connect_gpio_out_named(dev, NULL, n, pin);
550 }
551 
552 void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
553                      const char *name)
554 {
555     int i;
556     NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
557 
558     for (i = 0; i < ngl->num_in; i++) {
559         const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
560         char *propname = g_strdup_printf("%s[%d]", nm, i);
561 
562         object_property_add_alias(OBJECT(container), propname,
563                                   OBJECT(dev), propname,
564                                   &error_abort);
565         g_free(propname);
566     }
567     for (i = 0; i < ngl->num_out; i++) {
568         const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
569         char *propname = g_strdup_printf("%s[%d]", nm, i);
570 
571         object_property_add_alias(OBJECT(container), propname,
572                                   OBJECT(dev), propname,
573                                   &error_abort);
574         g_free(propname);
575     }
576     QLIST_REMOVE(ngl, node);
577     QLIST_INSERT_HEAD(&container->gpios, ngl, node);
578 }
579 
580 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
581 {
582     BusState *bus;
583     Object *child = object_resolve_path_component(OBJECT(dev), name);
584 
585     bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
586     if (bus) {
587         return bus;
588     }
589 
590     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
591         if (strcmp(name, bus->name) == 0) {
592             return bus;
593         }
594     }
595     return NULL;
596 }
597 
598 int qbus_walk_children(BusState *bus,
599                        qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
600                        qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
601                        void *opaque)
602 {
603     BusChild *kid;
604     int err;
605 
606     if (pre_busfn) {
607         err = pre_busfn(bus, opaque);
608         if (err) {
609             return err;
610         }
611     }
612 
613     QTAILQ_FOREACH(kid, &bus->children, sibling) {
614         err = qdev_walk_children(kid->child,
615                                  pre_devfn, pre_busfn,
616                                  post_devfn, post_busfn, opaque);
617         if (err < 0) {
618             return err;
619         }
620     }
621 
622     if (post_busfn) {
623         err = post_busfn(bus, opaque);
624         if (err) {
625             return err;
626         }
627     }
628 
629     return 0;
630 }
631 
632 int qdev_walk_children(DeviceState *dev,
633                        qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
634                        qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
635                        void *opaque)
636 {
637     BusState *bus;
638     int err;
639 
640     if (pre_devfn) {
641         err = pre_devfn(dev, opaque);
642         if (err) {
643             return err;
644         }
645     }
646 
647     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
648         err = qbus_walk_children(bus, pre_devfn, pre_busfn,
649                                  post_devfn, post_busfn, opaque);
650         if (err < 0) {
651             return err;
652         }
653     }
654 
655     if (post_devfn) {
656         err = post_devfn(dev, opaque);
657         if (err) {
658             return err;
659         }
660     }
661 
662     return 0;
663 }
664 
665 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
666 {
667     BusChild *kid;
668     DeviceState *ret;
669     BusState *child;
670 
671     QTAILQ_FOREACH(kid, &bus->children, sibling) {
672         DeviceState *dev = kid->child;
673 
674         if (dev->id && strcmp(dev->id, id) == 0) {
675             return dev;
676         }
677 
678         QLIST_FOREACH(child, &dev->child_bus, sibling) {
679             ret = qdev_find_recursive(child, id);
680             if (ret) {
681                 return ret;
682             }
683         }
684     }
685     return NULL;
686 }
687 
688 static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
689 {
690     const char *typename = object_get_typename(OBJECT(bus));
691     BusClass *bc;
692     char *buf;
693     int i, len, bus_id;
694 
695     bus->parent = parent;
696 
697     if (name) {
698         bus->name = g_strdup(name);
699     } else if (bus->parent && bus->parent->id) {
700         /* parent device has id -> use it plus parent-bus-id for bus name */
701         bus_id = bus->parent->num_child_bus;
702 
703         len = strlen(bus->parent->id) + 16;
704         buf = g_malloc(len);
705         snprintf(buf, len, "%s.%d", bus->parent->id, bus_id);
706         bus->name = buf;
707     } else {
708         /* no id -> use lowercase bus type plus global bus-id for bus name */
709         bc = BUS_GET_CLASS(bus);
710         bus_id = bc->automatic_ids++;
711 
712         len = strlen(typename) + 16;
713         buf = g_malloc(len);
714         len = snprintf(buf, len, "%s.%d", typename, bus_id);
715         for (i = 0; i < len; i++) {
716             buf[i] = qemu_tolower(buf[i]);
717         }
718         bus->name = buf;
719     }
720 
721     if (bus->parent) {
722         QLIST_INSERT_HEAD(&bus->parent->child_bus, bus, sibling);
723         bus->parent->num_child_bus++;
724         object_property_add_child(OBJECT(bus->parent), bus->name, OBJECT(bus), NULL);
725         object_unref(OBJECT(bus));
726     } else if (bus != sysbus_get_default()) {
727         /* TODO: once all bus devices are qdevified,
728            only reset handler for main_system_bus should be registered here. */
729         qemu_register_reset(qbus_reset_all_fn, bus);
730     }
731 }
732 
733 static void bus_unparent(Object *obj)
734 {
735     BusState *bus = BUS(obj);
736     BusChild *kid;
737 
738     while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) {
739         DeviceState *dev = kid->child;
740         object_unparent(OBJECT(dev));
741     }
742     if (bus->parent) {
743         QLIST_REMOVE(bus, sibling);
744         bus->parent->num_child_bus--;
745         bus->parent = NULL;
746     } else {
747         assert(bus != sysbus_get_default()); /* main_system_bus is never freed */
748         qemu_unregister_reset(qbus_reset_all_fn, bus);
749     }
750 }
751 
752 static bool bus_get_realized(Object *obj, Error **errp)
753 {
754     BusState *bus = BUS(obj);
755 
756     return bus->realized;
757 }
758 
759 static void bus_set_realized(Object *obj, bool value, Error **errp)
760 {
761     BusState *bus = BUS(obj);
762     BusClass *bc = BUS_GET_CLASS(bus);
763     BusChild *kid;
764     Error *local_err = NULL;
765 
766     if (value && !bus->realized) {
767         if (bc->realize) {
768             bc->realize(bus, &local_err);
769         }
770 
771         /* TODO: recursive realization */
772     } else if (!value && bus->realized) {
773         QTAILQ_FOREACH(kid, &bus->children, sibling) {
774             DeviceState *dev = kid->child;
775             object_property_set_bool(OBJECT(dev), false, "realized",
776                                      &local_err);
777             if (local_err != NULL) {
778                 break;
779             }
780         }
781         if (bc->unrealize && local_err == NULL) {
782             bc->unrealize(bus, &local_err);
783         }
784     }
785 
786     if (local_err != NULL) {
787         error_propagate(errp, local_err);
788         return;
789     }
790 
791     bus->realized = value;
792 }
793 
794 void qbus_create_inplace(void *bus, size_t size, const char *typename,
795                          DeviceState *parent, const char *name)
796 {
797     object_initialize(bus, size, typename);
798     qbus_realize(bus, parent, name);
799 }
800 
801 BusState *qbus_create(const char *typename, DeviceState *parent, const char *name)
802 {
803     BusState *bus;
804 
805     bus = BUS(object_new(typename));
806     qbus_realize(bus, parent, name);
807 
808     return bus;
809 }
810 
811 static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
812 {
813     BusClass *bc = BUS_GET_CLASS(bus);
814 
815     if (bc->get_fw_dev_path) {
816         return bc->get_fw_dev_path(dev);
817     }
818 
819     return NULL;
820 }
821 
822 static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
823 {
824     Object *obj = OBJECT(dev);
825     char *d = NULL;
826 
827     while (!d && obj->parent) {
828         obj = obj->parent;
829         d = fw_path_provider_try_get_dev_path(obj, bus, dev);
830     }
831     return d;
832 }
833 
834 char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
835 {
836     Object *obj = OBJECT(dev);
837 
838     return fw_path_provider_try_get_dev_path(obj, bus, dev);
839 }
840 
841 static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
842 {
843     int l = 0;
844 
845     if (dev && dev->parent_bus) {
846         char *d;
847         l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
848         d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
849         if (!d) {
850             d = bus_get_fw_dev_path(dev->parent_bus, dev);
851         }
852         if (d) {
853             l += snprintf(p + l, size - l, "%s", d);
854             g_free(d);
855         } else {
856             return l;
857         }
858     }
859     l += snprintf(p + l , size - l, "/");
860 
861     return l;
862 }
863 
864 char* qdev_get_fw_dev_path(DeviceState *dev)
865 {
866     char path[128];
867     int l;
868 
869     l = qdev_get_fw_dev_path_helper(dev, path, 128);
870 
871     path[l-1] = '\0';
872 
873     return g_strdup(path);
874 }
875 
876 char *qdev_get_dev_path(DeviceState *dev)
877 {
878     BusClass *bc;
879 
880     if (!dev || !dev->parent_bus) {
881         return NULL;
882     }
883 
884     bc = BUS_GET_CLASS(dev->parent_bus);
885     if (bc->get_dev_path) {
886         return bc->get_dev_path(dev);
887     }
888 
889     return NULL;
890 }
891 
892 /**
893  * Legacy property handling
894  */
895 
896 static void qdev_get_legacy_property(Object *obj, Visitor *v,
897                                      const char *name, void *opaque,
898                                      Error **errp)
899 {
900     DeviceState *dev = DEVICE(obj);
901     Property *prop = opaque;
902 
903     char buffer[1024];
904     char *ptr = buffer;
905 
906     prop->info->print(dev, prop, buffer, sizeof(buffer));
907     visit_type_str(v, name, &ptr, errp);
908 }
909 
910 /**
911  * @qdev_add_legacy_property - adds a legacy property
912  *
913  * Do not use this is new code!  Properties added through this interface will
914  * be given names and types in the "legacy" namespace.
915  *
916  * Legacy properties are string versions of other OOM properties.  The format
917  * of the string depends on the property type.
918  */
919 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
920                                      Error **errp)
921 {
922     gchar *name;
923 
924     /* Register pointer properties as legacy properties */
925     if (!prop->info->print && prop->info->get) {
926         return;
927     }
928 
929     name = g_strdup_printf("legacy-%s", prop->name);
930     object_property_add(OBJECT(dev), name, "str",
931                         prop->info->print ? qdev_get_legacy_property : prop->info->get,
932                         NULL,
933                         NULL,
934                         prop, errp);
935 
936     g_free(name);
937 }
938 
939 /**
940  * @qdev_property_add_static - add a @Property to a device.
941  *
942  * Static properties access data in a struct.  The actual type of the
943  * property and the field depends on the property type.
944  */
945 void qdev_property_add_static(DeviceState *dev, Property *prop,
946                               Error **errp)
947 {
948     Error *local_err = NULL;
949     Object *obj = OBJECT(dev);
950 
951     /*
952      * TODO qdev_prop_ptr does not have getters or setters.  It must
953      * go now that it can be replaced with links.  The test should be
954      * removed along with it: all static properties are read/write.
955      */
956     if (!prop->info->get && !prop->info->set) {
957         return;
958     }
959 
960     object_property_add(obj, prop->name, prop->info->name,
961                         prop->info->get, prop->info->set,
962                         prop->info->release,
963                         prop, &local_err);
964 
965     if (local_err) {
966         error_propagate(errp, local_err);
967         return;
968     }
969 
970     object_property_set_description(obj, prop->name,
971                                     prop->info->description,
972                                     &error_abort);
973 
974     if (prop->qtype == QTYPE_NONE) {
975         return;
976     }
977 
978     if (prop->qtype == QTYPE_QBOOL) {
979         object_property_set_bool(obj, prop->defval, prop->name, &error_abort);
980     } else if (prop->info->enum_table) {
981         object_property_set_str(obj, prop->info->enum_table[prop->defval],
982                                 prop->name, &error_abort);
983     } else if (prop->qtype == QTYPE_QINT) {
984         object_property_set_int(obj, prop->defval, prop->name, &error_abort);
985     }
986 }
987 
988 /* @qdev_alias_all_properties - Add alias properties to the source object for
989  * all qdev properties on the target DeviceState.
990  */
991 void qdev_alias_all_properties(DeviceState *target, Object *source)
992 {
993     ObjectClass *class;
994     Property *prop;
995 
996     class = object_get_class(OBJECT(target));
997     do {
998         DeviceClass *dc = DEVICE_CLASS(class);
999 
1000         for (prop = dc->props; prop && prop->name; prop++) {
1001             object_property_add_alias(source, prop->name,
1002                                       OBJECT(target), prop->name,
1003                                       &error_abort);
1004         }
1005         class = object_class_get_parent(class);
1006     } while (class != object_class_by_name(TYPE_DEVICE));
1007 }
1008 
1009 static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
1010 {
1011     GSList **list = opaque;
1012     DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
1013                                                           TYPE_DEVICE);
1014 
1015     if (dev == NULL) {
1016         return 0;
1017     }
1018 
1019     if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
1020         *list = g_slist_append(*list, dev);
1021     }
1022 
1023     return 0;
1024 }
1025 
1026 GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
1027 {
1028     GSList *list = NULL;
1029 
1030     object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
1031 
1032     return list;
1033 }
1034 
1035 static bool device_get_realized(Object *obj, Error **errp)
1036 {
1037     DeviceState *dev = DEVICE(obj);
1038     return dev->realized;
1039 }
1040 
1041 static void device_set_realized(Object *obj, bool value, Error **errp)
1042 {
1043     DeviceState *dev = DEVICE(obj);
1044     DeviceClass *dc = DEVICE_GET_CLASS(dev);
1045     HotplugHandler *hotplug_ctrl;
1046     BusState *bus;
1047     Error *local_err = NULL;
1048 
1049     if (dev->hotplugged && !dc->hotpluggable) {
1050         error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
1051         return;
1052     }
1053 
1054     if (value && !dev->realized) {
1055         if (!obj->parent) {
1056             static int unattached_count;
1057             gchar *name = g_strdup_printf("device[%d]", unattached_count++);
1058 
1059             object_property_add_child(container_get(qdev_get_machine(),
1060                                                     "/unattached"),
1061                                       name, obj, &error_abort);
1062             g_free(name);
1063         }
1064 
1065         if (dc->realize) {
1066             dc->realize(dev, &local_err);
1067         }
1068 
1069         if (local_err != NULL) {
1070             goto fail;
1071         }
1072 
1073         DEVICE_LISTENER_CALL(realize, Forward, dev);
1074 
1075         hotplug_ctrl = qdev_get_hotplug_handler(dev);
1076         if (hotplug_ctrl) {
1077             hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
1078         }
1079 
1080         if (local_err != NULL) {
1081             goto post_realize_fail;
1082         }
1083 
1084         if (qdev_get_vmsd(dev)) {
1085             vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
1086                                            dev->instance_id_alias,
1087                                            dev->alias_required_for_version);
1088         }
1089 
1090         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1091             object_property_set_bool(OBJECT(bus), true, "realized",
1092                                          &local_err);
1093             if (local_err != NULL) {
1094                 goto child_realize_fail;
1095             }
1096         }
1097         if (dev->hotplugged) {
1098             device_reset(dev);
1099         }
1100         dev->pending_deleted_event = false;
1101     } else if (!value && dev->realized) {
1102         Error **local_errp = NULL;
1103         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1104             local_errp = local_err ? NULL : &local_err;
1105             object_property_set_bool(OBJECT(bus), false, "realized",
1106                                      local_errp);
1107         }
1108         if (qdev_get_vmsd(dev)) {
1109             vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
1110         }
1111         if (dc->unrealize) {
1112             local_errp = local_err ? NULL : &local_err;
1113             dc->unrealize(dev, local_errp);
1114         }
1115         dev->pending_deleted_event = true;
1116         DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
1117     }
1118 
1119     if (local_err != NULL) {
1120         goto fail;
1121     }
1122 
1123     dev->realized = value;
1124     return;
1125 
1126 child_realize_fail:
1127     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1128         object_property_set_bool(OBJECT(bus), false, "realized",
1129                                  NULL);
1130     }
1131 
1132     if (qdev_get_vmsd(dev)) {
1133         vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
1134     }
1135 
1136 post_realize_fail:
1137     if (dc->unrealize) {
1138         dc->unrealize(dev, NULL);
1139     }
1140 
1141 fail:
1142     error_propagate(errp, local_err);
1143 }
1144 
1145 static bool device_get_hotpluggable(Object *obj, Error **errp)
1146 {
1147     DeviceClass *dc = DEVICE_GET_CLASS(obj);
1148     DeviceState *dev = DEVICE(obj);
1149 
1150     return dc->hotpluggable && (dev->parent_bus == NULL ||
1151                                 qbus_is_hotpluggable(dev->parent_bus));
1152 }
1153 
1154 static bool device_get_hotplugged(Object *obj, Error **err)
1155 {
1156     DeviceState *dev = DEVICE(obj);
1157 
1158     return dev->hotplugged;
1159 }
1160 
1161 static void device_set_hotplugged(Object *obj, bool value, Error **err)
1162 {
1163     DeviceState *dev = DEVICE(obj);
1164 
1165     dev->hotplugged = value;
1166 }
1167 
1168 static void device_initfn(Object *obj)
1169 {
1170     DeviceState *dev = DEVICE(obj);
1171     ObjectClass *class;
1172     Property *prop;
1173 
1174     if (qdev_hotplug) {
1175         dev->hotplugged = 1;
1176         qdev_hot_added = true;
1177     }
1178 
1179     dev->instance_id_alias = -1;
1180     dev->realized = false;
1181 
1182     object_property_add_bool(obj, "realized",
1183                              device_get_realized, device_set_realized, NULL);
1184     object_property_add_bool(obj, "hotpluggable",
1185                              device_get_hotpluggable, NULL, NULL);
1186     object_property_add_bool(obj, "hotplugged",
1187                              device_get_hotplugged, device_set_hotplugged,
1188                              &error_abort);
1189 
1190     class = object_get_class(OBJECT(dev));
1191     do {
1192         for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
1193             qdev_property_add_legacy(dev, prop, &error_abort);
1194             qdev_property_add_static(dev, prop, &error_abort);
1195         }
1196         class = object_class_get_parent(class);
1197     } while (class != object_class_by_name(TYPE_DEVICE));
1198 
1199     object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
1200                              (Object **)&dev->parent_bus, NULL, 0,
1201                              &error_abort);
1202     QLIST_INIT(&dev->gpios);
1203 }
1204 
1205 static void device_post_init(Object *obj)
1206 {
1207     qdev_prop_set_globals(DEVICE(obj));
1208 }
1209 
1210 /* Unlink device from bus and free the structure.  */
1211 static void device_finalize(Object *obj)
1212 {
1213     NamedGPIOList *ngl, *next;
1214 
1215     DeviceState *dev = DEVICE(obj);
1216 
1217     QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1218         QLIST_REMOVE(ngl, node);
1219         qemu_free_irqs(ngl->in, ngl->num_in);
1220         g_free(ngl->name);
1221         g_free(ngl);
1222         /* ngl->out irqs are owned by the other end and should not be freed
1223          * here
1224          */
1225     }
1226 }
1227 
1228 static void device_class_base_init(ObjectClass *class, void *data)
1229 {
1230     DeviceClass *klass = DEVICE_CLASS(class);
1231 
1232     /* We explicitly look up properties in the superclasses,
1233      * so do not propagate them to the subclasses.
1234      */
1235     klass->props = NULL;
1236 }
1237 
1238 static void device_unparent(Object *obj)
1239 {
1240     DeviceState *dev = DEVICE(obj);
1241     BusState *bus;
1242 
1243     if (dev->realized) {
1244         object_property_set_bool(obj, false, "realized", NULL);
1245     }
1246     while (dev->num_child_bus) {
1247         bus = QLIST_FIRST(&dev->child_bus);
1248         object_unparent(OBJECT(bus));
1249     }
1250     if (dev->parent_bus) {
1251         bus_remove_child(dev->parent_bus, dev);
1252         object_unref(OBJECT(dev->parent_bus));
1253         dev->parent_bus = NULL;
1254     }
1255 
1256     /* Only send event if the device had been completely realized */
1257     if (dev->pending_deleted_event) {
1258         gchar *path = object_get_canonical_path(OBJECT(dev));
1259 
1260         qapi_event_send_device_deleted(!!dev->id, dev->id, path, &error_abort);
1261         g_free(path);
1262     }
1263 
1264     qemu_opts_del(dev->opts);
1265     dev->opts = NULL;
1266 }
1267 
1268 static void device_class_init(ObjectClass *class, void *data)
1269 {
1270     DeviceClass *dc = DEVICE_CLASS(class);
1271 
1272     class->unparent = device_unparent;
1273     dc->realize = device_realize;
1274     dc->unrealize = device_unrealize;
1275 
1276     /* by default all devices were considered as hotpluggable,
1277      * so with intent to check it in generic qdev_unplug() /
1278      * device_set_realized() functions make every device
1279      * hotpluggable. Devices that shouldn't be hotpluggable,
1280      * should override it in their class_init()
1281      */
1282     dc->hotpluggable = true;
1283 }
1284 
1285 void device_reset(DeviceState *dev)
1286 {
1287     DeviceClass *klass = DEVICE_GET_CLASS(dev);
1288 
1289     if (klass->reset) {
1290         klass->reset(dev);
1291     }
1292 }
1293 
1294 Object *qdev_get_machine(void)
1295 {
1296     static Object *dev;
1297 
1298     if (dev == NULL) {
1299         dev = container_get(object_get_root(), "/machine");
1300     }
1301 
1302     return dev;
1303 }
1304 
1305 static const TypeInfo device_type_info = {
1306     .name = TYPE_DEVICE,
1307     .parent = TYPE_OBJECT,
1308     .instance_size = sizeof(DeviceState),
1309     .instance_init = device_initfn,
1310     .instance_post_init = device_post_init,
1311     .instance_finalize = device_finalize,
1312     .class_base_init = device_class_base_init,
1313     .class_init = device_class_init,
1314     .abstract = true,
1315     .class_size = sizeof(DeviceClass),
1316 };
1317 
1318 static void qbus_initfn(Object *obj)
1319 {
1320     BusState *bus = BUS(obj);
1321 
1322     QTAILQ_INIT(&bus->children);
1323     object_property_add_link(obj, QDEV_HOTPLUG_HANDLER_PROPERTY,
1324                              TYPE_HOTPLUG_HANDLER,
1325                              (Object **)&bus->hotplug_handler,
1326                              object_property_allow_set_link,
1327                              OBJ_PROP_LINK_UNREF_ON_RELEASE,
1328                              NULL);
1329     object_property_add_bool(obj, "realized",
1330                              bus_get_realized, bus_set_realized, NULL);
1331 }
1332 
1333 static char *default_bus_get_fw_dev_path(DeviceState *dev)
1334 {
1335     return g_strdup(object_get_typename(OBJECT(dev)));
1336 }
1337 
1338 static void bus_class_init(ObjectClass *class, void *data)
1339 {
1340     BusClass *bc = BUS_CLASS(class);
1341 
1342     class->unparent = bus_unparent;
1343     bc->get_fw_dev_path = default_bus_get_fw_dev_path;
1344 }
1345 
1346 static void qbus_finalize(Object *obj)
1347 {
1348     BusState *bus = BUS(obj);
1349 
1350     g_free((char *)bus->name);
1351 }
1352 
1353 static const TypeInfo bus_info = {
1354     .name = TYPE_BUS,
1355     .parent = TYPE_OBJECT,
1356     .instance_size = sizeof(BusState),
1357     .abstract = true,
1358     .class_size = sizeof(BusClass),
1359     .instance_init = qbus_initfn,
1360     .instance_finalize = qbus_finalize,
1361     .class_init = bus_class_init,
1362 };
1363 
1364 static void qdev_register_types(void)
1365 {
1366     type_register_static(&bus_info);
1367     type_register_static(&device_type_info);
1368 }
1369 
1370 type_init(qdev_register_types)
1371