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