xref: /qemu/hw/core/qdev.c (revision 4f2d31fb)
1 /*
2  *  Dynamic device configuration and creation.
3  *
4  *  Copyright (c) 2009 CodeSourcery
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 /* The theory here is that it should be possible to create a machine without
21    knowledge of specific devices.  Historically board init routines have
22    passed a bunch of arguments to each device, requiring the board know
23    exactly which device it is dealing with.  This file provides an abstract
24    API for device configuration and initialization.  Devices will generally
25    inherit from a particular bus (e.g. PCI or I2C) rather than
26    this API directly.  */
27 
28 #include "hw/qdev.h"
29 #include "hw/fw-path-provider.h"
30 #include "sysemu/sysemu.h"
31 #include "qapi/error.h"
32 #include "qapi/qmp/qerror.h"
33 #include "qapi/visitor.h"
34 #include "qapi/qmp/qjson.h"
35 #include "qemu/error-report.h"
36 #include "hw/hotplug.h"
37 #include "hw/boards.h"
38 #include "qapi-event.h"
39 
40 int qdev_hotplug = 0;
41 static bool qdev_hot_added = false;
42 static bool qdev_hot_removed = false;
43 
44 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
45 {
46     DeviceClass *dc = DEVICE_GET_CLASS(dev);
47     return dc->vmsd;
48 }
49 
50 const char *qdev_fw_name(DeviceState *dev)
51 {
52     DeviceClass *dc = DEVICE_GET_CLASS(dev);
53 
54     if (dc->fw_name) {
55         return dc->fw_name;
56     }
57 
58     return object_get_typename(OBJECT(dev));
59 }
60 
61 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
62                                      Error **errp);
63 
64 static void bus_remove_child(BusState *bus, DeviceState *child)
65 {
66     BusChild *kid;
67 
68     QTAILQ_FOREACH(kid, &bus->children, sibling) {
69         if (kid->child == child) {
70             char name[32];
71 
72             snprintf(name, sizeof(name), "child[%d]", kid->index);
73             QTAILQ_REMOVE(&bus->children, kid, sibling);
74 
75             /* This gives back ownership of kid->child back to us.  */
76             object_property_del(OBJECT(bus), name, NULL);
77             object_unref(OBJECT(kid->child));
78             g_free(kid);
79             return;
80         }
81     }
82 }
83 
84 static void bus_add_child(BusState *bus, DeviceState *child)
85 {
86     char name[32];
87     BusChild *kid = g_malloc0(sizeof(*kid));
88 
89     kid->index = bus->max_index++;
90     kid->child = child;
91     object_ref(OBJECT(kid->child));
92 
93     QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
94 
95     /* This transfers ownership of kid->child to the property.  */
96     snprintf(name, sizeof(name), "child[%d]", kid->index);
97     object_property_add_link(OBJECT(bus), name,
98                              object_get_typename(OBJECT(child)),
99                              (Object **)&kid->child,
100                              NULL, /* read-only property */
101                              0, /* return ownership on prop deletion */
102                              NULL);
103 }
104 
105 void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
106 {
107     dev->parent_bus = bus;
108     object_ref(OBJECT(bus));
109     bus_add_child(bus, dev);
110 }
111 
112 static void qbus_set_hotplug_handler_internal(BusState *bus, Object *handler,
113                                               Error **errp)
114 {
115 
116     object_property_set_link(OBJECT(bus), OBJECT(handler),
117                              QDEV_HOTPLUG_HANDLER_PROPERTY, errp);
118 }
119 
120 void qbus_set_hotplug_handler(BusState *bus, DeviceState *handler, Error **errp)
121 {
122     qbus_set_hotplug_handler_internal(bus, OBJECT(handler), errp);
123 }
124 
125 void qbus_set_bus_hotplug_handler(BusState *bus, Error **errp)
126 {
127     qbus_set_hotplug_handler_internal(bus, OBJECT(bus), errp);
128 }
129 
130 /* Create a new device.  This only initializes the device state
131    structure and allows properties to be set.  The device still needs
132    to be realized.  See qdev-core.h.  */
133 DeviceState *qdev_create(BusState *bus, const char *name)
134 {
135     DeviceState *dev;
136 
137     dev = qdev_try_create(bus, name);
138     if (!dev) {
139         if (bus) {
140             error_report("Unknown device '%s' for bus '%s'", name,
141                          object_get_typename(OBJECT(bus)));
142         } else {
143             error_report("Unknown device '%s' for default sysbus", name);
144         }
145         abort();
146     }
147 
148     return dev;
149 }
150 
151 DeviceState *qdev_try_create(BusState *bus, const char *type)
152 {
153     DeviceState *dev;
154 
155     if (object_class_by_name(type) == NULL) {
156         return NULL;
157     }
158     dev = DEVICE(object_new(type));
159     if (!dev) {
160         return NULL;
161     }
162 
163     if (!bus) {
164         bus = sysbus_get_default();
165     }
166 
167     qdev_set_parent_bus(dev, bus);
168     object_unref(OBJECT(dev));
169     return dev;
170 }
171 
172 static QTAILQ_HEAD(device_listeners, DeviceListener) device_listeners
173     = QTAILQ_HEAD_INITIALIZER(device_listeners);
174 
175 enum ListenerDirection { Forward, Reverse };
176 
177 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...)     \
178     do {                                                          \
179         DeviceListener *_listener;                                \
180                                                                   \
181         switch (_direction) {                                     \
182         case Forward:                                             \
183             QTAILQ_FOREACH(_listener, &device_listeners, link) {  \
184                 if (_listener->_callback) {                       \
185                     _listener->_callback(_listener, ##_args);     \
186                 }                                                 \
187             }                                                     \
188             break;                                                \
189         case Reverse:                                             \
190             QTAILQ_FOREACH_REVERSE(_listener, &device_listeners,  \
191                                    device_listeners, link) {      \
192                 if (_listener->_callback) {                       \
193                     _listener->_callback(_listener, ##_args);     \
194                 }                                                 \
195             }                                                     \
196             break;                                                \
197         default:                                                  \
198             abort();                                              \
199         }                                                         \
200     } while (0)
201 
202 static int device_listener_add(DeviceState *dev, void *opaque)
203 {
204     DEVICE_LISTENER_CALL(realize, Forward, dev);
205 
206     return 0;
207 }
208 
209 void device_listener_register(DeviceListener *listener)
210 {
211     QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
212 
213     qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
214                        NULL, NULL);
215 }
216 
217 void device_listener_unregister(DeviceListener *listener)
218 {
219     QTAILQ_REMOVE(&device_listeners, listener, link);
220 }
221 
222 static void device_realize(DeviceState *dev, Error **errp)
223 {
224     DeviceClass *dc = DEVICE_GET_CLASS(dev);
225 
226     if (dc->init) {
227         int rc = dc->init(dev);
228         if (rc < 0) {
229             error_setg(errp, "Device initialization failed.");
230             return;
231         }
232     }
233 }
234 
235 static void device_unrealize(DeviceState *dev, Error **errp)
236 {
237     DeviceClass *dc = DEVICE_GET_CLASS(dev);
238 
239     if (dc->exit) {
240         int rc = dc->exit(dev);
241         if (rc < 0) {
242             error_setg(errp, "Device exit failed.");
243             return;
244         }
245     }
246 }
247 
248 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
249                                  int required_for_version)
250 {
251     assert(!dev->realized);
252     dev->instance_id_alias = alias_id;
253     dev->alias_required_for_version = required_for_version;
254 }
255 
256 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
257 {
258     HotplugHandler *hotplug_ctrl = NULL;
259 
260     if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
261         hotplug_ctrl = dev->parent_bus->hotplug_handler;
262     } else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) {
263         MachineState *machine = MACHINE(qdev_get_machine());
264         MachineClass *mc = MACHINE_GET_CLASS(machine);
265 
266         if (mc->get_hotplug_handler) {
267             hotplug_ctrl = mc->get_hotplug_handler(machine, dev);
268         }
269     }
270     return hotplug_ctrl;
271 }
272 
273 void qdev_unplug(DeviceState *dev, Error **errp)
274 {
275     DeviceClass *dc = DEVICE_GET_CLASS(dev);
276     HotplugHandler *hotplug_ctrl;
277     HotplugHandlerClass *hdc;
278 
279     if (dev->parent_bus && !qbus_is_hotpluggable(dev->parent_bus)) {
280         error_setg(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
281         return;
282     }
283 
284     if (!dc->hotpluggable) {
285         error_setg(errp, QERR_DEVICE_NO_HOTPLUG,
286                    object_get_typename(OBJECT(dev)));
287         return;
288     }
289 
290     qdev_hot_removed = true;
291 
292     hotplug_ctrl = qdev_get_hotplug_handler(dev);
293     /* hotpluggable device MUST have HotplugHandler, if it doesn't
294      * then something is very wrong with it */
295     g_assert(hotplug_ctrl);
296 
297     /* If device supports async unplug just request it to be done,
298      * otherwise just remove it synchronously */
299     hdc = HOTPLUG_HANDLER_GET_CLASS(hotplug_ctrl);
300     if (hdc->unplug_request) {
301         hotplug_handler_unplug_request(hotplug_ctrl, dev, errp);
302     } else {
303         hotplug_handler_unplug(hotplug_ctrl, dev, errp);
304     }
305 }
306 
307 static int qdev_reset_one(DeviceState *dev, void *opaque)
308 {
309     device_reset(dev);
310 
311     return 0;
312 }
313 
314 static int qbus_reset_one(BusState *bus, void *opaque)
315 {
316     BusClass *bc = BUS_GET_CLASS(bus);
317     if (bc->reset) {
318         bc->reset(bus);
319     }
320     return 0;
321 }
322 
323 void qdev_reset_all(DeviceState *dev)
324 {
325     qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
326 }
327 
328 void 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_report("Initialization of device %s failed: %s",
374                      object_get_typename(OBJECT(dev)),
375                      error_get_pretty(err));
376         exit(1);
377     }
378 }
379 
380 void qdev_machine_creation_done(void)
381 {
382     /*
383      * ok, initial machine setup is done, starting from now we can
384      * only create hotpluggable devices
385      */
386     qdev_hotplug = 1;
387 }
388 
389 bool qdev_machine_modified(void)
390 {
391     return qdev_hot_added || qdev_hot_removed;
392 }
393 
394 BusState *qdev_get_parent_bus(DeviceState *dev)
395 {
396     return dev->parent_bus;
397 }
398 
399 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
400                                                const char *name)
401 {
402     NamedGPIOList *ngl;
403 
404     QLIST_FOREACH(ngl, &dev->gpios, node) {
405         /* NULL is a valid and matchable name, otherwise do a normal
406          * strcmp match.
407          */
408         if ((!ngl->name && !name) ||
409                 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
410             return ngl;
411         }
412     }
413 
414     ngl = g_malloc0(sizeof(*ngl));
415     ngl->name = g_strdup(name);
416     QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
417     return ngl;
418 }
419 
420 void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
421                              const char *name, int n)
422 {
423     int i;
424     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
425 
426     assert(gpio_list->num_out == 0 || !name);
427     gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
428                                      dev, n);
429 
430     if (!name) {
431         name = "unnamed-gpio-in";
432     }
433     for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
434         gchar *propname = g_strdup_printf("%s[%u]", name, i);
435 
436         object_property_add_child(OBJECT(dev), propname,
437                                   OBJECT(gpio_list->in[i]), &error_abort);
438         g_free(propname);
439     }
440 
441     gpio_list->num_in += n;
442 }
443 
444 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
445 {
446     qdev_init_gpio_in_named(dev, handler, NULL, n);
447 }
448 
449 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
450                               const char *name, int n)
451 {
452     int i;
453     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
454 
455     assert(gpio_list->num_in == 0 || !name);
456 
457     if (!name) {
458         name = "unnamed-gpio-out";
459     }
460     memset(pins, 0, sizeof(*pins) * n);
461     for (i = 0; i < n; ++i) {
462         gchar *propname = g_strdup_printf("%s[%u]", name,
463                                           gpio_list->num_out + i);
464 
465         object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
466                                  (Object **)&pins[i],
467                                  object_property_allow_set_link,
468                                  OBJ_PROP_LINK_UNREF_ON_RELEASE,
469                                  &error_abort);
470         g_free(propname);
471     }
472     gpio_list->num_out += n;
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 output, 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_setg(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