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