xref: /openbmc/qemu/hw/core/qdev.c (revision 7b95a50858502485b0e159a1adabfa9912214147)
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 void device_realize(DeviceState *dev, Error **errp)
193 {
194     DeviceClass *dc = DEVICE_GET_CLASS(dev);
195 
196     if (dc->init) {
197         int rc = dc->init(dev);
198         if (rc < 0) {
199             error_setg(errp, "Device initialization failed.");
200             return;
201         }
202     }
203 }
204 
205 static void device_unrealize(DeviceState *dev, Error **errp)
206 {
207     DeviceClass *dc = DEVICE_GET_CLASS(dev);
208 
209     if (dc->exit) {
210         int rc = dc->exit(dev);
211         if (rc < 0) {
212             error_setg(errp, "Device exit failed.");
213             return;
214         }
215     }
216 }
217 
218 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
219                                  int required_for_version)
220 {
221     assert(!dev->realized);
222     dev->instance_id_alias = alias_id;
223     dev->alias_required_for_version = required_for_version;
224 }
225 
226 static HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
227 {
228     HotplugHandler *hotplug_ctrl = NULL;
229 
230     if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
231         hotplug_ctrl = dev->parent_bus->hotplug_handler;
232     } else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) {
233         MachineState *machine = MACHINE(qdev_get_machine());
234         MachineClass *mc = MACHINE_GET_CLASS(machine);
235 
236         if (mc->get_hotplug_handler) {
237             hotplug_ctrl = mc->get_hotplug_handler(machine, dev);
238         }
239     }
240     return hotplug_ctrl;
241 }
242 
243 void qdev_unplug(DeviceState *dev, Error **errp)
244 {
245     DeviceClass *dc = DEVICE_GET_CLASS(dev);
246     HotplugHandler *hotplug_ctrl;
247     HotplugHandlerClass *hdc;
248 
249     if (dev->parent_bus && !qbus_is_hotpluggable(dev->parent_bus)) {
250         error_set(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
251         return;
252     }
253 
254     if (!dc->hotpluggable) {
255         error_set(errp, QERR_DEVICE_NO_HOTPLUG,
256                   object_get_typename(OBJECT(dev)));
257         return;
258     }
259 
260     qdev_hot_removed = true;
261 
262     hotplug_ctrl = qdev_get_hotplug_handler(dev);
263     /* hotpluggable device MUST have HotplugHandler, if it doesn't
264      * then something is very wrong with it */
265     g_assert(hotplug_ctrl);
266 
267     /* If device supports async unplug just request it to be done,
268      * otherwise just remove it synchronously */
269     hdc = HOTPLUG_HANDLER_GET_CLASS(hotplug_ctrl);
270     if (hdc->unplug_request) {
271         hotplug_handler_unplug_request(hotplug_ctrl, dev, errp);
272     } else {
273         hotplug_handler_unplug(hotplug_ctrl, dev, errp);
274     }
275 }
276 
277 static int qdev_reset_one(DeviceState *dev, void *opaque)
278 {
279     device_reset(dev);
280 
281     return 0;
282 }
283 
284 static int qbus_reset_one(BusState *bus, void *opaque)
285 {
286     BusClass *bc = BUS_GET_CLASS(bus);
287     if (bc->reset) {
288         bc->reset(bus);
289     }
290     return 0;
291 }
292 
293 void qdev_reset_all(DeviceState *dev)
294 {
295     qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
296 }
297 
298 void qbus_reset_all(BusState *bus)
299 {
300     qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
301 }
302 
303 void qbus_reset_all_fn(void *opaque)
304 {
305     BusState *bus = opaque;
306     qbus_reset_all(bus);
307 }
308 
309 /* can be used as ->unplug() callback for the simple cases */
310 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
311                                   DeviceState *dev, Error **errp)
312 {
313     /* just zap it */
314     object_unparent(OBJECT(dev));
315 }
316 
317 /* Like qdev_init(), but terminate program via error_report() instead of
318    returning an error value.  This is okay during machine creation.
319    Don't use for hotplug, because there callers need to recover from
320    failure.  Exception: if you know the device's init() callback can't
321    fail, then qdev_init_nofail() can't fail either, and is therefore
322    usable even then.  But relying on the device implementation that
323    way is somewhat unclean, and best avoided.  */
324 void qdev_init_nofail(DeviceState *dev)
325 {
326     const char *typename = object_get_typename(OBJECT(dev));
327 
328     if (qdev_init(dev) < 0) {
329         error_report("Initialization of device %s failed", typename);
330         exit(1);
331     }
332 }
333 
334 void qdev_machine_creation_done(void)
335 {
336     /*
337      * ok, initial machine setup is done, starting from now we can
338      * only create hotpluggable devices
339      */
340     qdev_hotplug = 1;
341 }
342 
343 bool qdev_machine_modified(void)
344 {
345     return qdev_hot_added || qdev_hot_removed;
346 }
347 
348 BusState *qdev_get_parent_bus(DeviceState *dev)
349 {
350     return dev->parent_bus;
351 }
352 
353 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
354                                                const char *name)
355 {
356     NamedGPIOList *ngl;
357 
358     QLIST_FOREACH(ngl, &dev->gpios, node) {
359         /* NULL is a valid and matchable name, otherwise do a normal
360          * strcmp match.
361          */
362         if ((!ngl->name && !name) ||
363                 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
364             return ngl;
365         }
366     }
367 
368     ngl = g_malloc0(sizeof(*ngl));
369     ngl->name = g_strdup(name);
370     QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
371     return ngl;
372 }
373 
374 void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
375                              const char *name, int n)
376 {
377     int i;
378     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
379     char *propname = g_strdup_printf("%s[*]", name ? name : "unnamed-gpio-in");
380 
381     assert(gpio_list->num_out == 0 || !name);
382     gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
383                                      dev, n);
384 
385     for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
386         object_property_add_child(OBJECT(dev), propname,
387                                   OBJECT(gpio_list->in[i]), &error_abort);
388     }
389     g_free(propname);
390 
391     gpio_list->num_in += n;
392 }
393 
394 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
395 {
396     qdev_init_gpio_in_named(dev, handler, NULL, n);
397 }
398 
399 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
400                               const char *name, int n)
401 {
402     int i;
403     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
404     char *propname = g_strdup_printf("%s[*]", name ? name : "unnamed-gpio-out");
405 
406     assert(gpio_list->num_in == 0 || !name);
407     assert(gpio_list->num_out == 0);
408     gpio_list->num_out = n;
409     gpio_list->out = pins;
410 
411     for (i = 0; i < n; ++i) {
412         memset(&pins[i], 0, sizeof(*pins));
413         object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
414                                  (Object **)&pins[i],
415                                  object_property_allow_set_link,
416                                  OBJ_PROP_LINK_UNREF_ON_RELEASE,
417                                  &error_abort);
418     }
419     g_free(propname);
420 }
421 
422 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
423 {
424     qdev_init_gpio_out_named(dev, pins, NULL, n);
425 }
426 
427 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
428 {
429     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
430 
431     assert(n >= 0 && n < gpio_list->num_in);
432     return gpio_list->in[n];
433 }
434 
435 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
436 {
437     return qdev_get_gpio_in_named(dev, NULL, n);
438 }
439 
440 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
441                                  qemu_irq pin)
442 {
443     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
444 
445     assert(n >= 0 && n < gpio_list->num_out);
446     gpio_list->out[n] = pin;
447 }
448 
449 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
450 {
451     qdev_connect_gpio_out_named(dev, NULL, n, pin);
452 }
453 
454 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
455 {
456     BusState *bus;
457 
458     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
459         if (strcmp(name, bus->name) == 0) {
460             return bus;
461         }
462     }
463     return NULL;
464 }
465 
466 int qbus_walk_children(BusState *bus,
467                        qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
468                        qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
469                        void *opaque)
470 {
471     BusChild *kid;
472     int err;
473 
474     if (pre_busfn) {
475         err = pre_busfn(bus, opaque);
476         if (err) {
477             return err;
478         }
479     }
480 
481     QTAILQ_FOREACH(kid, &bus->children, sibling) {
482         err = qdev_walk_children(kid->child,
483                                  pre_devfn, pre_busfn,
484                                  post_devfn, post_busfn, opaque);
485         if (err < 0) {
486             return err;
487         }
488     }
489 
490     if (post_busfn) {
491         err = post_busfn(bus, opaque);
492         if (err) {
493             return err;
494         }
495     }
496 
497     return 0;
498 }
499 
500 int qdev_walk_children(DeviceState *dev,
501                        qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
502                        qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
503                        void *opaque)
504 {
505     BusState *bus;
506     int err;
507 
508     if (pre_devfn) {
509         err = pre_devfn(dev, opaque);
510         if (err) {
511             return err;
512         }
513     }
514 
515     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
516         err = qbus_walk_children(bus, pre_devfn, pre_busfn,
517                                  post_devfn, post_busfn, opaque);
518         if (err < 0) {
519             return err;
520         }
521     }
522 
523     if (post_devfn) {
524         err = post_devfn(dev, opaque);
525         if (err) {
526             return err;
527         }
528     }
529 
530     return 0;
531 }
532 
533 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
534 {
535     BusChild *kid;
536     DeviceState *ret;
537     BusState *child;
538 
539     QTAILQ_FOREACH(kid, &bus->children, sibling) {
540         DeviceState *dev = kid->child;
541 
542         if (dev->id && strcmp(dev->id, id) == 0) {
543             return dev;
544         }
545 
546         QLIST_FOREACH(child, &dev->child_bus, sibling) {
547             ret = qdev_find_recursive(child, id);
548             if (ret) {
549                 return ret;
550             }
551         }
552     }
553     return NULL;
554 }
555 
556 static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
557 {
558     const char *typename = object_get_typename(OBJECT(bus));
559     BusClass *bc;
560     char *buf;
561     int i, len, bus_id;
562 
563     bus->parent = parent;
564 
565     if (name) {
566         bus->name = g_strdup(name);
567     } else if (bus->parent && bus->parent->id) {
568         /* parent device has id -> use it plus parent-bus-id for bus name */
569         bus_id = bus->parent->num_child_bus;
570 
571         len = strlen(bus->parent->id) + 16;
572         buf = g_malloc(len);
573         snprintf(buf, len, "%s.%d", bus->parent->id, bus_id);
574         bus->name = buf;
575     } else {
576         /* no id -> use lowercase bus type plus global bus-id for bus name */
577         bc = BUS_GET_CLASS(bus);
578         bus_id = bc->automatic_ids++;
579 
580         len = strlen(typename) + 16;
581         buf = g_malloc(len);
582         len = snprintf(buf, len, "%s.%d", typename, bus_id);
583         for (i = 0; i < len; i++) {
584             buf[i] = qemu_tolower(buf[i]);
585         }
586         bus->name = buf;
587     }
588 
589     if (bus->parent) {
590         QLIST_INSERT_HEAD(&bus->parent->child_bus, bus, sibling);
591         bus->parent->num_child_bus++;
592         object_property_add_child(OBJECT(bus->parent), bus->name, OBJECT(bus), NULL);
593         object_unref(OBJECT(bus));
594     } else if (bus != sysbus_get_default()) {
595         /* TODO: once all bus devices are qdevified,
596            only reset handler for main_system_bus should be registered here. */
597         qemu_register_reset(qbus_reset_all_fn, bus);
598     }
599 }
600 
601 static void bus_unparent(Object *obj)
602 {
603     BusState *bus = BUS(obj);
604     BusChild *kid;
605 
606     while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) {
607         DeviceState *dev = kid->child;
608         object_unparent(OBJECT(dev));
609     }
610     if (bus->parent) {
611         QLIST_REMOVE(bus, sibling);
612         bus->parent->num_child_bus--;
613         bus->parent = NULL;
614     } else {
615         assert(bus != sysbus_get_default()); /* main_system_bus is never freed */
616         qemu_unregister_reset(qbus_reset_all_fn, bus);
617     }
618 }
619 
620 static bool bus_get_realized(Object *obj, Error **errp)
621 {
622     BusState *bus = BUS(obj);
623 
624     return bus->realized;
625 }
626 
627 static void bus_set_realized(Object *obj, bool value, Error **errp)
628 {
629     BusState *bus = BUS(obj);
630     BusClass *bc = BUS_GET_CLASS(bus);
631     BusChild *kid;
632     Error *local_err = NULL;
633 
634     if (value && !bus->realized) {
635         if (bc->realize) {
636             bc->realize(bus, &local_err);
637         }
638 
639         /* TODO: recursive realization */
640     } else if (!value && bus->realized) {
641         QTAILQ_FOREACH(kid, &bus->children, sibling) {
642             DeviceState *dev = kid->child;
643             object_property_set_bool(OBJECT(dev), false, "realized",
644                                      &local_err);
645             if (local_err != NULL) {
646                 break;
647             }
648         }
649         if (bc->unrealize && local_err == NULL) {
650             bc->unrealize(bus, &local_err);
651         }
652     }
653 
654     if (local_err != NULL) {
655         error_propagate(errp, local_err);
656         return;
657     }
658 
659     bus->realized = value;
660 }
661 
662 void qbus_create_inplace(void *bus, size_t size, const char *typename,
663                          DeviceState *parent, const char *name)
664 {
665     object_initialize(bus, size, typename);
666     qbus_realize(bus, parent, name);
667 }
668 
669 BusState *qbus_create(const char *typename, DeviceState *parent, const char *name)
670 {
671     BusState *bus;
672 
673     bus = BUS(object_new(typename));
674     qbus_realize(bus, parent, name);
675 
676     return bus;
677 }
678 
679 static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
680 {
681     BusClass *bc = BUS_GET_CLASS(bus);
682 
683     if (bc->get_fw_dev_path) {
684         return bc->get_fw_dev_path(dev);
685     }
686 
687     return NULL;
688 }
689 
690 static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
691 {
692     Object *obj = OBJECT(dev);
693     char *d = NULL;
694 
695     while (!d && obj->parent) {
696         obj = obj->parent;
697         d = fw_path_provider_try_get_dev_path(obj, bus, dev);
698     }
699     return d;
700 }
701 
702 static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
703 {
704     int l = 0;
705 
706     if (dev && dev->parent_bus) {
707         char *d;
708         l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
709         d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
710         if (!d) {
711             d = bus_get_fw_dev_path(dev->parent_bus, dev);
712         }
713         if (d) {
714             l += snprintf(p + l, size - l, "%s", d);
715             g_free(d);
716         } else {
717             return l;
718         }
719     }
720     l += snprintf(p + l , size - l, "/");
721 
722     return l;
723 }
724 
725 char* qdev_get_fw_dev_path(DeviceState *dev)
726 {
727     char path[128];
728     int l;
729 
730     l = qdev_get_fw_dev_path_helper(dev, path, 128);
731 
732     path[l-1] = '\0';
733 
734     return g_strdup(path);
735 }
736 
737 char *qdev_get_dev_path(DeviceState *dev)
738 {
739     BusClass *bc;
740 
741     if (!dev || !dev->parent_bus) {
742         return NULL;
743     }
744 
745     bc = BUS_GET_CLASS(dev->parent_bus);
746     if (bc->get_dev_path) {
747         return bc->get_dev_path(dev);
748     }
749 
750     return NULL;
751 }
752 
753 /**
754  * Legacy property handling
755  */
756 
757 static void qdev_get_legacy_property(Object *obj, Visitor *v, void *opaque,
758                                      const char *name, Error **errp)
759 {
760     DeviceState *dev = DEVICE(obj);
761     Property *prop = opaque;
762 
763     char buffer[1024];
764     char *ptr = buffer;
765 
766     prop->info->print(dev, prop, buffer, sizeof(buffer));
767     visit_type_str(v, &ptr, name, errp);
768 }
769 
770 /**
771  * @qdev_add_legacy_property - adds a legacy property
772  *
773  * Do not use this is new code!  Properties added through this interface will
774  * be given names and types in the "legacy" namespace.
775  *
776  * Legacy properties are string versions of other OOM properties.  The format
777  * of the string depends on the property type.
778  */
779 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
780                                      Error **errp)
781 {
782     gchar *name;
783 
784     /* Register pointer properties as legacy properties */
785     if (!prop->info->print && prop->info->get) {
786         return;
787     }
788 
789     name = g_strdup_printf("legacy-%s", prop->name);
790     object_property_add(OBJECT(dev), name, "str",
791                         prop->info->print ? qdev_get_legacy_property : prop->info->get,
792                         NULL,
793                         NULL,
794                         prop, errp);
795 
796     g_free(name);
797 }
798 
799 /**
800  * @qdev_property_add_static - add a @Property to a device.
801  *
802  * Static properties access data in a struct.  The actual type of the
803  * property and the field depends on the property type.
804  */
805 void qdev_property_add_static(DeviceState *dev, Property *prop,
806                               Error **errp)
807 {
808     Error *local_err = NULL;
809     Object *obj = OBJECT(dev);
810 
811     /*
812      * TODO qdev_prop_ptr does not have getters or setters.  It must
813      * go now that it can be replaced with links.  The test should be
814      * removed along with it: all static properties are read/write.
815      */
816     if (!prop->info->get && !prop->info->set) {
817         return;
818     }
819 
820     object_property_add(obj, prop->name, prop->info->name,
821                         prop->info->get, prop->info->set,
822                         prop->info->release,
823                         prop, &local_err);
824 
825     if (local_err) {
826         error_propagate(errp, local_err);
827         return;
828     }
829 
830     object_property_set_description(obj, prop->name,
831                                     prop->info->description,
832                                     &error_abort);
833 
834     if (prop->qtype == QTYPE_NONE) {
835         return;
836     }
837 
838     if (prop->qtype == QTYPE_QBOOL) {
839         object_property_set_bool(obj, prop->defval, prop->name, &error_abort);
840     } else if (prop->info->enum_table) {
841         object_property_set_str(obj, prop->info->enum_table[prop->defval],
842                                 prop->name, &error_abort);
843     } else if (prop->qtype == QTYPE_QINT) {
844         object_property_set_int(obj, prop->defval, prop->name, &error_abort);
845     }
846 }
847 
848 /* @qdev_alias_all_properties - Add alias properties to the source object for
849  * all qdev properties on the target DeviceState.
850  */
851 void qdev_alias_all_properties(DeviceState *target, Object *source)
852 {
853     ObjectClass *class;
854     Property *prop;
855 
856     class = object_get_class(OBJECT(target));
857     do {
858         DeviceClass *dc = DEVICE_CLASS(class);
859 
860         for (prop = dc->props; prop && prop->name; prop++) {
861             object_property_add_alias(source, prop->name,
862                                       OBJECT(target), prop->name,
863                                       &error_abort);
864         }
865         class = object_class_get_parent(class);
866     } while (class != object_class_by_name(TYPE_DEVICE));
867 }
868 
869 int qdev_build_hotpluggable_device_list(Object *obj, void *opaque)
870 {
871     GSList **list = opaque;
872     DeviceState *dev = DEVICE(obj);
873 
874     if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
875         *list = g_slist_append(*list, dev);
876     }
877 
878     object_child_foreach(obj, qdev_build_hotpluggable_device_list, opaque);
879     return 0;
880 }
881 
882 static bool device_get_realized(Object *obj, Error **errp)
883 {
884     DeviceState *dev = DEVICE(obj);
885     return dev->realized;
886 }
887 
888 static void device_set_realized(Object *obj, bool value, Error **errp)
889 {
890     DeviceState *dev = DEVICE(obj);
891     DeviceClass *dc = DEVICE_GET_CLASS(dev);
892     HotplugHandler *hotplug_ctrl;
893     BusState *bus;
894     Error *local_err = NULL;
895 
896     if (dev->hotplugged && !dc->hotpluggable) {
897         error_set(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
898         return;
899     }
900 
901     if (value && !dev->realized) {
902         if (!obj->parent) {
903             static int unattached_count;
904             gchar *name = g_strdup_printf("device[%d]", unattached_count++);
905 
906             object_property_add_child(container_get(qdev_get_machine(),
907                                                     "/unattached"),
908                                       name, obj, &error_abort);
909             g_free(name);
910         }
911 
912         if (dc->realize) {
913             dc->realize(dev, &local_err);
914         }
915 
916         if (local_err != NULL) {
917             goto fail;
918         }
919 
920         hotplug_ctrl = qdev_get_hotplug_handler(dev);
921         if (hotplug_ctrl) {
922             hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
923         }
924 
925         if (local_err != NULL) {
926             goto post_realize_fail;
927         }
928 
929         if (qdev_get_vmsd(dev)) {
930             vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
931                                            dev->instance_id_alias,
932                                            dev->alias_required_for_version);
933         }
934 
935         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
936             object_property_set_bool(OBJECT(bus), true, "realized",
937                                          &local_err);
938             if (local_err != NULL) {
939                 goto child_realize_fail;
940             }
941         }
942         if (dev->hotplugged) {
943             device_reset(dev);
944         }
945         dev->pending_deleted_event = false;
946     } else if (!value && dev->realized) {
947         Error **local_errp = NULL;
948         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
949             local_errp = local_err ? NULL : &local_err;
950             object_property_set_bool(OBJECT(bus), false, "realized",
951                                      local_errp);
952         }
953         if (qdev_get_vmsd(dev)) {
954             vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
955         }
956         if (dc->unrealize) {
957             local_errp = local_err ? NULL : &local_err;
958             dc->unrealize(dev, local_errp);
959         }
960         dev->pending_deleted_event = true;
961     }
962 
963     if (local_err != NULL) {
964         goto fail;
965     }
966 
967     dev->realized = value;
968     return;
969 
970 child_realize_fail:
971     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
972         object_property_set_bool(OBJECT(bus), false, "realized",
973                                  NULL);
974     }
975 
976     if (qdev_get_vmsd(dev)) {
977         vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
978     }
979 
980 post_realize_fail:
981     if (dc->unrealize) {
982         dc->unrealize(dev, NULL);
983     }
984 
985 fail:
986     error_propagate(errp, local_err);
987     return;
988 }
989 
990 static bool device_get_hotpluggable(Object *obj, Error **errp)
991 {
992     DeviceClass *dc = DEVICE_GET_CLASS(obj);
993     DeviceState *dev = DEVICE(obj);
994 
995     return dc->hotpluggable && (dev->parent_bus == NULL ||
996                                 qbus_is_hotpluggable(dev->parent_bus));
997 }
998 
999 static bool device_get_hotplugged(Object *obj, Error **err)
1000 {
1001     DeviceState *dev = DEVICE(obj);
1002 
1003     return dev->hotplugged;
1004 }
1005 
1006 static void device_set_hotplugged(Object *obj, bool value, Error **err)
1007 {
1008     DeviceState *dev = DEVICE(obj);
1009 
1010     dev->hotplugged = value;
1011 }
1012 
1013 static void device_initfn(Object *obj)
1014 {
1015     DeviceState *dev = DEVICE(obj);
1016     ObjectClass *class;
1017     Property *prop;
1018 
1019     if (qdev_hotplug) {
1020         dev->hotplugged = 1;
1021         qdev_hot_added = true;
1022     }
1023 
1024     dev->instance_id_alias = -1;
1025     dev->realized = false;
1026 
1027     object_property_add_bool(obj, "realized",
1028                              device_get_realized, device_set_realized, NULL);
1029     object_property_add_bool(obj, "hotpluggable",
1030                              device_get_hotpluggable, NULL, NULL);
1031     object_property_add_bool(obj, "hotplugged",
1032                              device_get_hotplugged, device_set_hotplugged,
1033                              &error_abort);
1034 
1035     class = object_get_class(OBJECT(dev));
1036     do {
1037         for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
1038             qdev_property_add_legacy(dev, prop, &error_abort);
1039             qdev_property_add_static(dev, prop, &error_abort);
1040         }
1041         class = object_class_get_parent(class);
1042     } while (class != object_class_by_name(TYPE_DEVICE));
1043 
1044     object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
1045                              (Object **)&dev->parent_bus, NULL, 0,
1046                              &error_abort);
1047     QLIST_INIT(&dev->gpios);
1048 }
1049 
1050 static void device_post_init(Object *obj)
1051 {
1052     Error *err = NULL;
1053     qdev_prop_set_globals(DEVICE(obj), &err);
1054     if (err) {
1055         qerror_report_err(err);
1056         error_free(err);
1057         exit(EXIT_FAILURE);
1058     }
1059 }
1060 
1061 /* Unlink device from bus and free the structure.  */
1062 static void device_finalize(Object *obj)
1063 {
1064     NamedGPIOList *ngl, *next;
1065 
1066     DeviceState *dev = DEVICE(obj);
1067     if (dev->opts) {
1068         qemu_opts_del(dev->opts);
1069     }
1070 
1071     QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1072         QLIST_REMOVE(ngl, node);
1073         qemu_free_irqs(ngl->in, ngl->num_in);
1074         g_free(ngl->name);
1075         g_free(ngl);
1076         /* ngl->out irqs are owned by the other end and should not be freed
1077          * here
1078          */
1079     }
1080 }
1081 
1082 static void device_class_base_init(ObjectClass *class, void *data)
1083 {
1084     DeviceClass *klass = DEVICE_CLASS(class);
1085 
1086     /* We explicitly look up properties in the superclasses,
1087      * so do not propagate them to the subclasses.
1088      */
1089     klass->props = NULL;
1090 }
1091 
1092 static void device_unparent(Object *obj)
1093 {
1094     DeviceState *dev = DEVICE(obj);
1095     BusState *bus;
1096 
1097     if (dev->realized) {
1098         object_property_set_bool(obj, false, "realized", NULL);
1099     }
1100     while (dev->num_child_bus) {
1101         bus = QLIST_FIRST(&dev->child_bus);
1102         object_unparent(OBJECT(bus));
1103     }
1104     if (dev->parent_bus) {
1105         bus_remove_child(dev->parent_bus, dev);
1106         object_unref(OBJECT(dev->parent_bus));
1107         dev->parent_bus = NULL;
1108     }
1109 
1110     /* Only send event if the device had been completely realized */
1111     if (dev->pending_deleted_event) {
1112         gchar *path = object_get_canonical_path(OBJECT(dev));
1113 
1114         qapi_event_send_device_deleted(!!dev->id, dev->id, path, &error_abort);
1115         g_free(path);
1116     }
1117 }
1118 
1119 static void device_class_init(ObjectClass *class, void *data)
1120 {
1121     DeviceClass *dc = DEVICE_CLASS(class);
1122 
1123     class->unparent = device_unparent;
1124     dc->realize = device_realize;
1125     dc->unrealize = device_unrealize;
1126 
1127     /* by default all devices were considered as hotpluggable,
1128      * so with intent to check it in generic qdev_unplug() /
1129      * device_set_realized() functions make every device
1130      * hotpluggable. Devices that shouldn't be hotpluggable,
1131      * should override it in their class_init()
1132      */
1133     dc->hotpluggable = true;
1134 }
1135 
1136 void device_reset(DeviceState *dev)
1137 {
1138     DeviceClass *klass = DEVICE_GET_CLASS(dev);
1139 
1140     if (klass->reset) {
1141         klass->reset(dev);
1142     }
1143 }
1144 
1145 Object *qdev_get_machine(void)
1146 {
1147     static Object *dev;
1148 
1149     if (dev == NULL) {
1150         dev = container_get(object_get_root(), "/machine");
1151     }
1152 
1153     return dev;
1154 }
1155 
1156 static const TypeInfo device_type_info = {
1157     .name = TYPE_DEVICE,
1158     .parent = TYPE_OBJECT,
1159     .instance_size = sizeof(DeviceState),
1160     .instance_init = device_initfn,
1161     .instance_post_init = device_post_init,
1162     .instance_finalize = device_finalize,
1163     .class_base_init = device_class_base_init,
1164     .class_init = device_class_init,
1165     .abstract = true,
1166     .class_size = sizeof(DeviceClass),
1167 };
1168 
1169 static void qbus_initfn(Object *obj)
1170 {
1171     BusState *bus = BUS(obj);
1172 
1173     QTAILQ_INIT(&bus->children);
1174     object_property_add_link(obj, QDEV_HOTPLUG_HANDLER_PROPERTY,
1175                              TYPE_HOTPLUG_HANDLER,
1176                              (Object **)&bus->hotplug_handler,
1177                              object_property_allow_set_link,
1178                              OBJ_PROP_LINK_UNREF_ON_RELEASE,
1179                              NULL);
1180     object_property_add_bool(obj, "realized",
1181                              bus_get_realized, bus_set_realized, NULL);
1182 }
1183 
1184 static char *default_bus_get_fw_dev_path(DeviceState *dev)
1185 {
1186     return g_strdup(object_get_typename(OBJECT(dev)));
1187 }
1188 
1189 static void bus_class_init(ObjectClass *class, void *data)
1190 {
1191     BusClass *bc = BUS_CLASS(class);
1192 
1193     class->unparent = bus_unparent;
1194     bc->get_fw_dev_path = default_bus_get_fw_dev_path;
1195 }
1196 
1197 static void qbus_finalize(Object *obj)
1198 {
1199     BusState *bus = BUS(obj);
1200 
1201     g_free((char *)bus->name);
1202 }
1203 
1204 static const TypeInfo bus_info = {
1205     .name = TYPE_BUS,
1206     .parent = TYPE_OBJECT,
1207     .instance_size = sizeof(BusState),
1208     .abstract = true,
1209     .class_size = sizeof(BusClass),
1210     .instance_init = qbus_initfn,
1211     .instance_finalize = qbus_finalize,
1212     .class_init = bus_class_init,
1213 };
1214 
1215 static void qdev_register_types(void)
1216 {
1217     type_register_static(&bus_info);
1218     type_register_static(&device_type_info);
1219 }
1220 
1221 type_init(qdev_register_types)
1222