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