xref: /openbmc/qemu/hw/core/qdev.c (revision 354908ce)
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 "qapi/error.h"
30 #include "qapi/qapi-events-qdev.h"
31 #include "qapi/qmp/qerror.h"
32 #include "qapi/visitor.h"
33 #include "qemu/error-report.h"
34 #include "qemu/option.h"
35 #include "hw/hotplug.h"
36 #include "hw/irq.h"
37 #include "hw/qdev-properties.h"
38 #include "hw/boards.h"
39 #include "hw/sysbus.h"
40 #include "hw/qdev-clock.h"
41 #include "migration/vmstate.h"
42 #include "trace.h"
43 
44 bool qdev_hotplug = false;
45 static bool qdev_hot_added = false;
46 bool qdev_hot_removed = false;
47 
48 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
49 {
50     DeviceClass *dc = DEVICE_GET_CLASS(dev);
51     return dc->vmsd;
52 }
53 
54 static void bus_remove_child(BusState *bus, DeviceState *child)
55 {
56     BusChild *kid;
57 
58     QTAILQ_FOREACH(kid, &bus->children, sibling) {
59         if (kid->child == child) {
60             char name[32];
61 
62             snprintf(name, sizeof(name), "child[%d]", kid->index);
63             QTAILQ_REMOVE(&bus->children, kid, sibling);
64 
65             bus->num_children--;
66 
67             /* This gives back ownership of kid->child back to us.  */
68             object_property_del(OBJECT(bus), name);
69             object_unref(OBJECT(kid->child));
70             g_free(kid);
71             return;
72         }
73     }
74 }
75 
76 static void bus_add_child(BusState *bus, DeviceState *child)
77 {
78     char name[32];
79     BusChild *kid = g_malloc0(sizeof(*kid));
80 
81     bus->num_children++;
82     kid->index = bus->max_index++;
83     kid->child = child;
84     object_ref(OBJECT(kid->child));
85 
86     QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
87 
88     /* This transfers ownership of kid->child to the property.  */
89     snprintf(name, sizeof(name), "child[%d]", kid->index);
90     object_property_add_link(OBJECT(bus), name,
91                              object_get_typename(OBJECT(child)),
92                              (Object **)&kid->child,
93                              NULL, /* read-only property */
94                              0);
95 }
96 
97 void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
98 {
99     BusState *old_parent_bus = dev->parent_bus;
100     DeviceClass *dc = DEVICE_GET_CLASS(dev);
101 
102     assert(dc->bus_type && object_dynamic_cast(OBJECT(bus), dc->bus_type));
103 
104     if (old_parent_bus) {
105         trace_qdev_update_parent_bus(dev, object_get_typename(OBJECT(dev)),
106             old_parent_bus, object_get_typename(OBJECT(old_parent_bus)),
107             OBJECT(bus), object_get_typename(OBJECT(bus)));
108         /*
109          * Keep a reference to the device while it's not plugged into
110          * any bus, to avoid it potentially evaporating when it is
111          * dereffed in bus_remove_child().
112          * Also keep the ref of the parent bus until the end, so that
113          * we can safely call resettable_change_parent() below.
114          */
115         object_ref(OBJECT(dev));
116         bus_remove_child(dev->parent_bus, dev);
117     }
118     dev->parent_bus = bus;
119     object_ref(OBJECT(bus));
120     bus_add_child(bus, dev);
121     if (dev->realized) {
122         resettable_change_parent(OBJECT(dev), OBJECT(bus),
123                                  OBJECT(old_parent_bus));
124     }
125     if (old_parent_bus) {
126         object_unref(OBJECT(old_parent_bus));
127         object_unref(OBJECT(dev));
128     }
129 }
130 
131 /*
132  * Create a device on the heap.
133  * A type @name must exist.
134  * This only initializes the device state structure and allows
135  * properties to be set.  The device still needs to be realized.  See
136  * qdev-core.h.
137  */
138 DeviceState *qdev_new(const char *name)
139 {
140     return DEVICE(object_new(name));
141 }
142 
143 /*
144  * Try to create a device on the heap.
145  * This is like qdev_new(), except it returns %NULL when type @name
146  * does not exist.
147  */
148 DeviceState *qdev_try_new(const char *name)
149 {
150     if (!object_class_by_name(name)) {
151         return NULL;
152     }
153 
154     return DEVICE(object_new(name));
155 }
156 
157 static QTAILQ_HEAD(, DeviceListener) device_listeners
158     = QTAILQ_HEAD_INITIALIZER(device_listeners);
159 
160 enum ListenerDirection { Forward, Reverse };
161 
162 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...)     \
163     do {                                                          \
164         DeviceListener *_listener;                                \
165                                                                   \
166         switch (_direction) {                                     \
167         case Forward:                                             \
168             QTAILQ_FOREACH(_listener, &device_listeners, link) {  \
169                 if (_listener->_callback) {                       \
170                     _listener->_callback(_listener, ##_args);     \
171                 }                                                 \
172             }                                                     \
173             break;                                                \
174         case Reverse:                                             \
175             QTAILQ_FOREACH_REVERSE(_listener, &device_listeners,  \
176                                    link) {                        \
177                 if (_listener->_callback) {                       \
178                     _listener->_callback(_listener, ##_args);     \
179                 }                                                 \
180             }                                                     \
181             break;                                                \
182         default:                                                  \
183             abort();                                              \
184         }                                                         \
185     } while (0)
186 
187 static int device_listener_add(DeviceState *dev, void *opaque)
188 {
189     DEVICE_LISTENER_CALL(realize, Forward, dev);
190 
191     return 0;
192 }
193 
194 void device_listener_register(DeviceListener *listener)
195 {
196     QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
197 
198     qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
199                        NULL, NULL);
200 }
201 
202 void device_listener_unregister(DeviceListener *listener)
203 {
204     QTAILQ_REMOVE(&device_listeners, listener, link);
205 }
206 
207 bool qdev_should_hide_device(QemuOpts *opts)
208 {
209     int rc = -1;
210     DeviceListener *listener;
211 
212     QTAILQ_FOREACH(listener, &device_listeners, link) {
213        if (listener->should_be_hidden) {
214             /*
215              * should_be_hidden_will return
216              *  1 if device matches opts and it should be hidden
217              *  0 if device matches opts and should not be hidden
218              *  -1 if device doesn't match ops
219              */
220             rc = listener->should_be_hidden(listener, opts);
221         }
222 
223         if (rc > 0) {
224             break;
225         }
226     }
227 
228     return rc > 0;
229 }
230 
231 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
232                                  int required_for_version)
233 {
234     assert(!dev->realized);
235     dev->instance_id_alias = alias_id;
236     dev->alias_required_for_version = required_for_version;
237 }
238 
239 HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev)
240 {
241     MachineState *machine;
242     MachineClass *mc;
243     Object *m_obj = qdev_get_machine();
244 
245     if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
246         machine = MACHINE(m_obj);
247         mc = MACHINE_GET_CLASS(machine);
248         if (mc->get_hotplug_handler) {
249             return mc->get_hotplug_handler(machine, dev);
250         }
251     }
252 
253     return NULL;
254 }
255 
256 bool qdev_hotplug_allowed(DeviceState *dev, Error **errp)
257 {
258     MachineState *machine;
259     MachineClass *mc;
260     Object *m_obj = qdev_get_machine();
261 
262     if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
263         machine = MACHINE(m_obj);
264         mc = MACHINE_GET_CLASS(machine);
265         if (mc->hotplug_allowed) {
266             return mc->hotplug_allowed(machine, dev, errp);
267         }
268     }
269 
270     return true;
271 }
272 
273 HotplugHandler *qdev_get_bus_hotplug_handler(DeviceState *dev)
274 {
275     if (dev->parent_bus) {
276         return dev->parent_bus->hotplug_handler;
277     }
278     return NULL;
279 }
280 
281 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
282 {
283     HotplugHandler *hotplug_ctrl = qdev_get_machine_hotplug_handler(dev);
284 
285     if (hotplug_ctrl == NULL && dev->parent_bus) {
286         hotplug_ctrl = qdev_get_bus_hotplug_handler(dev);
287     }
288     return hotplug_ctrl;
289 }
290 
291 static int qdev_prereset(DeviceState *dev, void *opaque)
292 {
293     trace_qdev_reset_tree(dev, object_get_typename(OBJECT(dev)));
294     return 0;
295 }
296 
297 static int qbus_prereset(BusState *bus, void *opaque)
298 {
299     trace_qbus_reset_tree(bus, object_get_typename(OBJECT(bus)));
300     return 0;
301 }
302 
303 static int qdev_reset_one(DeviceState *dev, void *opaque)
304 {
305     device_legacy_reset(dev);
306 
307     return 0;
308 }
309 
310 static int qbus_reset_one(BusState *bus, void *opaque)
311 {
312     BusClass *bc = BUS_GET_CLASS(bus);
313     trace_qbus_reset(bus, object_get_typename(OBJECT(bus)));
314     if (bc->reset) {
315         bc->reset(bus);
316     }
317     return 0;
318 }
319 
320 void qdev_reset_all(DeviceState *dev)
321 {
322     trace_qdev_reset_all(dev, object_get_typename(OBJECT(dev)));
323     qdev_walk_children(dev, qdev_prereset, qbus_prereset,
324                        qdev_reset_one, qbus_reset_one, NULL);
325 }
326 
327 void qdev_reset_all_fn(void *opaque)
328 {
329     qdev_reset_all(DEVICE(opaque));
330 }
331 
332 void qbus_reset_all(BusState *bus)
333 {
334     trace_qbus_reset_all(bus, object_get_typename(OBJECT(bus)));
335     qbus_walk_children(bus, qdev_prereset, qbus_prereset,
336                        qdev_reset_one, qbus_reset_one, NULL);
337 }
338 
339 void qbus_reset_all_fn(void *opaque)
340 {
341     BusState *bus = opaque;
342     qbus_reset_all(bus);
343 }
344 
345 void device_cold_reset(DeviceState *dev)
346 {
347     resettable_reset(OBJECT(dev), RESET_TYPE_COLD);
348 }
349 
350 bool device_is_in_reset(DeviceState *dev)
351 {
352     return resettable_is_in_reset(OBJECT(dev));
353 }
354 
355 static ResettableState *device_get_reset_state(Object *obj)
356 {
357     DeviceState *dev = DEVICE(obj);
358     return &dev->reset;
359 }
360 
361 static void device_reset_child_foreach(Object *obj, ResettableChildCallback cb,
362                                        void *opaque, ResetType type)
363 {
364     DeviceState *dev = DEVICE(obj);
365     BusState *bus;
366 
367     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
368         cb(OBJECT(bus), opaque, type);
369     }
370 }
371 
372 /* can be used as ->unplug() callback for the simple cases */
373 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
374                                   DeviceState *dev, Error **errp)
375 {
376     qdev_unrealize(dev);
377 }
378 
379 /*
380  * Realize @dev.
381  * @dev must not be plugged into a bus.
382  * If @bus, plug @dev into @bus.  This takes a reference to @dev.
383  * If @dev has no QOM parent, make one up, taking another reference.
384  * On success, return true.
385  * On failure, store an error through @errp and return false.
386  */
387 bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp)
388 {
389     Error *err = NULL;
390 
391     assert(!dev->realized && !dev->parent_bus);
392 
393     if (bus) {
394         qdev_set_parent_bus(dev, bus);
395     } else {
396         assert(!DEVICE_GET_CLASS(dev)->bus_type);
397     }
398 
399     object_property_set_bool(OBJECT(dev), true, "realized", &err);
400     if (err) {
401         error_propagate(errp, err);
402     }
403     return !err;
404 }
405 
406 /*
407  * Realize @dev and drop a reference.
408  * This is like qdev_realize(), except the caller must hold a
409  * (private) reference, which is dropped on return regardless of
410  * success or failure.  Intended use:
411  *     dev = qdev_new();
412  *     [...]
413  *     qdev_realize_and_unref(dev, bus, errp);
414  * Now @dev can go away without further ado.
415  */
416 bool qdev_realize_and_unref(DeviceState *dev, BusState *bus, Error **errp)
417 {
418     bool ret;
419 
420     ret = qdev_realize(dev, bus, errp);
421     object_unref(OBJECT(dev));
422     return ret;
423 }
424 
425 void qdev_unrealize(DeviceState *dev)
426 {
427     object_property_set_bool(OBJECT(dev), false, "realized", &error_abort);
428 }
429 
430 static int qdev_assert_realized_properly(Object *obj, void *opaque)
431 {
432     DeviceState *dev = DEVICE(object_dynamic_cast(obj, TYPE_DEVICE));
433     DeviceClass *dc;
434 
435     if (dev) {
436         dc = DEVICE_GET_CLASS(dev);
437         assert(dev->realized);
438         assert(dev->parent_bus || !dc->bus_type);
439     }
440     return 0;
441 }
442 
443 void qdev_machine_creation_done(void)
444 {
445     /*
446      * ok, initial machine setup is done, starting from now we can
447      * only create hotpluggable devices
448      */
449     qdev_hotplug = true;
450 
451     object_child_foreach_recursive(object_get_root(),
452                                    qdev_assert_realized_properly, NULL);
453 }
454 
455 bool qdev_machine_modified(void)
456 {
457     return qdev_hot_added || qdev_hot_removed;
458 }
459 
460 BusState *qdev_get_parent_bus(DeviceState *dev)
461 {
462     return dev->parent_bus;
463 }
464 
465 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
466                                                const char *name)
467 {
468     NamedGPIOList *ngl;
469 
470     QLIST_FOREACH(ngl, &dev->gpios, node) {
471         /* NULL is a valid and matchable name. */
472         if (g_strcmp0(name, ngl->name) == 0) {
473             return ngl;
474         }
475     }
476 
477     ngl = g_malloc0(sizeof(*ngl));
478     ngl->name = g_strdup(name);
479     QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
480     return ngl;
481 }
482 
483 void qdev_init_gpio_in_named_with_opaque(DeviceState *dev,
484                                          qemu_irq_handler handler,
485                                          void *opaque,
486                                          const char *name, int n)
487 {
488     int i;
489     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
490 
491     assert(gpio_list->num_out == 0 || !name);
492     gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
493                                      opaque, n);
494 
495     if (!name) {
496         name = "unnamed-gpio-in";
497     }
498     for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
499         gchar *propname = g_strdup_printf("%s[%u]", name, i);
500 
501         object_property_add_child(OBJECT(dev), propname,
502                                   OBJECT(gpio_list->in[i]));
503         g_free(propname);
504     }
505 
506     gpio_list->num_in += n;
507 }
508 
509 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
510 {
511     qdev_init_gpio_in_named(dev, handler, NULL, n);
512 }
513 
514 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
515                               const char *name, int n)
516 {
517     int i;
518     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
519 
520     assert(gpio_list->num_in == 0 || !name);
521 
522     if (!name) {
523         name = "unnamed-gpio-out";
524     }
525     memset(pins, 0, sizeof(*pins) * n);
526     for (i = 0; i < n; ++i) {
527         gchar *propname = g_strdup_printf("%s[%u]", name,
528                                           gpio_list->num_out + i);
529 
530         object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
531                                  (Object **)&pins[i],
532                                  object_property_allow_set_link,
533                                  OBJ_PROP_LINK_STRONG);
534         g_free(propname);
535     }
536     gpio_list->num_out += n;
537 }
538 
539 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
540 {
541     qdev_init_gpio_out_named(dev, pins, NULL, n);
542 }
543 
544 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
545 {
546     NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
547 
548     assert(n >= 0 && n < gpio_list->num_in);
549     return gpio_list->in[n];
550 }
551 
552 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
553 {
554     return qdev_get_gpio_in_named(dev, NULL, n);
555 }
556 
557 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
558                                  qemu_irq pin)
559 {
560     char *propname = g_strdup_printf("%s[%d]",
561                                      name ? name : "unnamed-gpio-out", n);
562     if (pin && !OBJECT(pin)->parent) {
563         /* We need a name for object_property_set_link to work */
564         object_property_add_child(container_get(qdev_get_machine(),
565                                                 "/unattached"),
566                                   "non-qdev-gpio[*]", OBJECT(pin));
567     }
568     object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
569     g_free(propname);
570 }
571 
572 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
573 {
574     g_autofree char *propname = g_strdup_printf("%s[%d]",
575                                      name ? name : "unnamed-gpio-out", n);
576 
577     qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
578                                                       NULL);
579 
580     return ret;
581 }
582 
583 /* disconnect a GPIO output, returning the disconnected input (if any) */
584 
585 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
586                                                const char *name, int n)
587 {
588     char *propname = g_strdup_printf("%s[%d]",
589                                      name ? name : "unnamed-gpio-out", n);
590 
591     qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
592                                                       NULL);
593     if (ret) {
594         object_property_set_link(OBJECT(dev), NULL, propname, NULL);
595     }
596     g_free(propname);
597     return ret;
598 }
599 
600 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
601                                  const char *name, int n)
602 {
603     qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
604     qdev_connect_gpio_out_named(dev, name, n, icpt);
605     return disconnected;
606 }
607 
608 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
609 {
610     qdev_connect_gpio_out_named(dev, NULL, n, pin);
611 }
612 
613 void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
614                      const char *name)
615 {
616     int i;
617     NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
618 
619     for (i = 0; i < ngl->num_in; i++) {
620         const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
621         char *propname = g_strdup_printf("%s[%d]", nm, i);
622 
623         object_property_add_alias(OBJECT(container), propname,
624                                   OBJECT(dev), propname);
625         g_free(propname);
626     }
627     for (i = 0; i < ngl->num_out; i++) {
628         const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
629         char *propname = g_strdup_printf("%s[%d]", nm, i);
630 
631         object_property_add_alias(OBJECT(container), propname,
632                                   OBJECT(dev), propname);
633         g_free(propname);
634     }
635     QLIST_REMOVE(ngl, node);
636     QLIST_INSERT_HEAD(&container->gpios, ngl, node);
637 }
638 
639 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
640 {
641     BusState *bus;
642     Object *child = object_resolve_path_component(OBJECT(dev), name);
643 
644     bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
645     if (bus) {
646         return bus;
647     }
648 
649     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
650         if (strcmp(name, bus->name) == 0) {
651             return bus;
652         }
653     }
654     return NULL;
655 }
656 
657 int qdev_walk_children(DeviceState *dev,
658                        qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
659                        qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
660                        void *opaque)
661 {
662     BusState *bus;
663     int err;
664 
665     if (pre_devfn) {
666         err = pre_devfn(dev, opaque);
667         if (err) {
668             return err;
669         }
670     }
671 
672     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
673         err = qbus_walk_children(bus, pre_devfn, pre_busfn,
674                                  post_devfn, post_busfn, opaque);
675         if (err < 0) {
676             return err;
677         }
678     }
679 
680     if (post_devfn) {
681         err = post_devfn(dev, opaque);
682         if (err) {
683             return err;
684         }
685     }
686 
687     return 0;
688 }
689 
690 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
691 {
692     BusChild *kid;
693     DeviceState *ret;
694     BusState *child;
695 
696     QTAILQ_FOREACH(kid, &bus->children, sibling) {
697         DeviceState *dev = kid->child;
698 
699         if (dev->id && strcmp(dev->id, id) == 0) {
700             return dev;
701         }
702 
703         QLIST_FOREACH(child, &dev->child_bus, sibling) {
704             ret = qdev_find_recursive(child, id);
705             if (ret) {
706                 return ret;
707             }
708         }
709     }
710     return NULL;
711 }
712 
713 char *qdev_get_dev_path(DeviceState *dev)
714 {
715     BusClass *bc;
716 
717     if (!dev || !dev->parent_bus) {
718         return NULL;
719     }
720 
721     bc = BUS_GET_CLASS(dev->parent_bus);
722     if (bc->get_dev_path) {
723         return bc->get_dev_path(dev);
724     }
725 
726     return NULL;
727 }
728 
729 /**
730  * Legacy property handling
731  */
732 
733 static void qdev_get_legacy_property(Object *obj, Visitor *v,
734                                      const char *name, void *opaque,
735                                      Error **errp)
736 {
737     DeviceState *dev = DEVICE(obj);
738     Property *prop = opaque;
739 
740     char buffer[1024];
741     char *ptr = buffer;
742 
743     prop->info->print(dev, prop, buffer, sizeof(buffer));
744     visit_type_str(v, name, &ptr, errp);
745 }
746 
747 /**
748  * qdev_class_add_legacy_property:
749  * @dev: Device to add the property to.
750  * @prop: The qdev property definition.
751  *
752  * Add a legacy QOM property to @dev for qdev property @prop.
753  *
754  * Legacy properties are string versions of QOM properties.  The format of
755  * the string depends on the property type.  Legacy properties are only
756  * needed for "info qtree".
757  *
758  * Do not use this in new code!  QOM Properties added through this interface
759  * will be given names in the "legacy" namespace.
760  */
761 static void qdev_class_add_legacy_property(DeviceClass *dc, Property *prop)
762 {
763     g_autofree char *name = NULL;
764 
765     /* Register pointer properties as legacy properties */
766     if (!prop->info->print && prop->info->get) {
767         return;
768     }
769 
770     name = g_strdup_printf("legacy-%s", prop->name);
771     object_class_property_add(OBJECT_CLASS(dc), name, "str",
772         prop->info->print ? qdev_get_legacy_property : prop->info->get,
773         NULL, NULL, prop);
774 }
775 
776 void qdev_property_add_static(DeviceState *dev, Property *prop)
777 {
778     Object *obj = OBJECT(dev);
779     ObjectProperty *op;
780 
781     assert(!prop->info->create);
782 
783     op = object_property_add(obj, prop->name, prop->info->name,
784                              prop->info->get, prop->info->set,
785                              prop->info->release,
786                              prop);
787 
788     object_property_set_description(obj, prop->name,
789                                     prop->info->description);
790 
791     if (prop->set_default) {
792         prop->info->set_default_value(op, prop);
793         if (op->init) {
794             op->init(obj, op);
795         }
796     }
797 }
798 
799 static void qdev_class_add_property(DeviceClass *klass, Property *prop)
800 {
801     ObjectClass *oc = OBJECT_CLASS(klass);
802 
803     if (prop->info->create) {
804         prop->info->create(oc, prop);
805     } else {
806         ObjectProperty *op;
807 
808         op = object_class_property_add(oc,
809                                        prop->name, prop->info->name,
810                                        prop->info->get, prop->info->set,
811                                        prop->info->release,
812                                        prop);
813         if (prop->set_default) {
814             prop->info->set_default_value(op, prop);
815         }
816     }
817     object_class_property_set_description(oc, prop->name,
818                                           prop->info->description);
819 }
820 
821 /* @qdev_alias_all_properties - Add alias properties to the source object for
822  * all qdev properties on the target DeviceState.
823  */
824 void qdev_alias_all_properties(DeviceState *target, Object *source)
825 {
826     ObjectClass *class;
827     Property *prop;
828 
829     class = object_get_class(OBJECT(target));
830     do {
831         DeviceClass *dc = DEVICE_CLASS(class);
832 
833         for (prop = dc->props_; prop && prop->name; prop++) {
834             object_property_add_alias(source, prop->name,
835                                       OBJECT(target), prop->name);
836         }
837         class = object_class_get_parent(class);
838     } while (class != object_class_by_name(TYPE_DEVICE));
839 }
840 
841 static bool device_get_realized(Object *obj, Error **errp)
842 {
843     DeviceState *dev = DEVICE(obj);
844     return dev->realized;
845 }
846 
847 static bool check_only_migratable(Object *obj, Error **errp)
848 {
849     DeviceClass *dc = DEVICE_GET_CLASS(obj);
850 
851     if (!vmstate_check_only_migratable(dc->vmsd)) {
852         error_setg(errp, "Device %s is not migratable, but "
853                    "--only-migratable was specified",
854                    object_get_typename(obj));
855         return false;
856     }
857 
858     return true;
859 }
860 
861 static void device_set_realized(Object *obj, bool value, Error **errp)
862 {
863     DeviceState *dev = DEVICE(obj);
864     DeviceClass *dc = DEVICE_GET_CLASS(dev);
865     HotplugHandler *hotplug_ctrl;
866     BusState *bus;
867     NamedClockList *ncl;
868     Error *local_err = NULL;
869     bool unattached_parent = false;
870     static int unattached_count;
871 
872     if (dev->hotplugged && !dc->hotpluggable) {
873         error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
874         return;
875     }
876 
877     if (value && !dev->realized) {
878         if (!check_only_migratable(obj, &local_err)) {
879             goto fail;
880         }
881 
882         if (!obj->parent) {
883             gchar *name = g_strdup_printf("device[%d]", unattached_count++);
884 
885             object_property_add_child(container_get(qdev_get_machine(),
886                                                     "/unattached"),
887                                       name, obj);
888             unattached_parent = true;
889             g_free(name);
890         }
891 
892         hotplug_ctrl = qdev_get_hotplug_handler(dev);
893         if (hotplug_ctrl) {
894             hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
895             if (local_err != NULL) {
896                 goto fail;
897             }
898         }
899 
900         if (dc->realize) {
901             dc->realize(dev, &local_err);
902             if (local_err != NULL) {
903                 goto fail;
904             }
905         }
906 
907         DEVICE_LISTENER_CALL(realize, Forward, dev);
908 
909         /*
910          * always free/re-initialize here since the value cannot be cleaned up
911          * in device_unrealize due to its usage later on in the unplug path
912          */
913         g_free(dev->canonical_path);
914         dev->canonical_path = object_get_canonical_path(OBJECT(dev));
915         QLIST_FOREACH(ncl, &dev->clocks, node) {
916             if (ncl->alias) {
917                 continue;
918             } else {
919                 clock_setup_canonical_path(ncl->clock);
920             }
921         }
922 
923         if (qdev_get_vmsd(dev)) {
924             if (vmstate_register_with_alias_id(VMSTATE_IF(dev),
925                                                VMSTATE_INSTANCE_ID_ANY,
926                                                qdev_get_vmsd(dev), dev,
927                                                dev->instance_id_alias,
928                                                dev->alias_required_for_version,
929                                                &local_err) < 0) {
930                 goto post_realize_fail;
931             }
932         }
933 
934         /*
935          * Clear the reset state, in case the object was previously unrealized
936          * with a dirty state.
937          */
938         resettable_state_clear(&dev->reset);
939 
940         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
941             if (!qbus_realize(bus, errp)) {
942                 goto child_realize_fail;
943             }
944         }
945         if (dev->hotplugged) {
946             /*
947              * Reset the device, as well as its subtree which, at this point,
948              * should be realized too.
949              */
950             resettable_assert_reset(OBJECT(dev), RESET_TYPE_COLD);
951             resettable_change_parent(OBJECT(dev), OBJECT(dev->parent_bus),
952                                      NULL);
953             resettable_release_reset(OBJECT(dev), RESET_TYPE_COLD);
954         }
955         dev->pending_deleted_event = false;
956 
957         if (hotplug_ctrl) {
958             hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
959             if (local_err != NULL) {
960                 goto child_realize_fail;
961             }
962        }
963 
964     } else if (!value && dev->realized) {
965         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
966             qbus_unrealize(bus);
967         }
968         if (qdev_get_vmsd(dev)) {
969             vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
970         }
971         if (dc->unrealize) {
972             dc->unrealize(dev);
973         }
974         dev->pending_deleted_event = true;
975         DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
976     }
977 
978     assert(local_err == NULL);
979     dev->realized = value;
980     return;
981 
982 child_realize_fail:
983     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
984         qbus_unrealize(bus);
985     }
986 
987     if (qdev_get_vmsd(dev)) {
988         vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
989     }
990 
991 post_realize_fail:
992     g_free(dev->canonical_path);
993     dev->canonical_path = NULL;
994     if (dc->unrealize) {
995         dc->unrealize(dev);
996     }
997 
998 fail:
999     error_propagate(errp, local_err);
1000     if (unattached_parent) {
1001         /*
1002          * Beware, this doesn't just revert
1003          * object_property_add_child(), it also runs bus_remove()!
1004          */
1005         object_unparent(OBJECT(dev));
1006         unattached_count--;
1007     }
1008 }
1009 
1010 static bool device_get_hotpluggable(Object *obj, Error **errp)
1011 {
1012     DeviceClass *dc = DEVICE_GET_CLASS(obj);
1013     DeviceState *dev = DEVICE(obj);
1014 
1015     return dc->hotpluggable && (dev->parent_bus == NULL ||
1016                                 qbus_is_hotpluggable(dev->parent_bus));
1017 }
1018 
1019 static bool device_get_hotplugged(Object *obj, Error **errp)
1020 {
1021     DeviceState *dev = DEVICE(obj);
1022 
1023     return dev->hotplugged;
1024 }
1025 
1026 static void device_initfn(Object *obj)
1027 {
1028     DeviceState *dev = DEVICE(obj);
1029 
1030     if (qdev_hotplug) {
1031         dev->hotplugged = 1;
1032         qdev_hot_added = true;
1033     }
1034 
1035     dev->instance_id_alias = -1;
1036     dev->realized = false;
1037     dev->allow_unplug_during_migration = false;
1038 
1039     QLIST_INIT(&dev->gpios);
1040     QLIST_INIT(&dev->clocks);
1041 }
1042 
1043 static void device_post_init(Object *obj)
1044 {
1045     /*
1046      * Note: ordered so that the user's global properties take
1047      * precedence.
1048      */
1049     object_apply_compat_props(obj);
1050     qdev_prop_set_globals(DEVICE(obj));
1051 }
1052 
1053 /* Unlink device from bus and free the structure.  */
1054 static void device_finalize(Object *obj)
1055 {
1056     NamedGPIOList *ngl, *next;
1057 
1058     DeviceState *dev = DEVICE(obj);
1059 
1060     QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1061         QLIST_REMOVE(ngl, node);
1062         qemu_free_irqs(ngl->in, ngl->num_in);
1063         g_free(ngl->name);
1064         g_free(ngl);
1065         /* ngl->out irqs are owned by the other end and should not be freed
1066          * here
1067          */
1068     }
1069 
1070     qdev_finalize_clocklist(dev);
1071 
1072     /* Only send event if the device had been completely realized */
1073     if (dev->pending_deleted_event) {
1074         g_assert(dev->canonical_path);
1075 
1076         qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path);
1077         g_free(dev->canonical_path);
1078         dev->canonical_path = NULL;
1079     }
1080 
1081     qemu_opts_del(dev->opts);
1082 }
1083 
1084 static void device_class_base_init(ObjectClass *class, void *data)
1085 {
1086     DeviceClass *klass = DEVICE_CLASS(class);
1087 
1088     /* We explicitly look up properties in the superclasses,
1089      * so do not propagate them to the subclasses.
1090      */
1091     klass->props_ = NULL;
1092 }
1093 
1094 static void device_unparent(Object *obj)
1095 {
1096     DeviceState *dev = DEVICE(obj);
1097     BusState *bus;
1098 
1099     if (dev->realized) {
1100         qdev_unrealize(dev);
1101     }
1102     while (dev->num_child_bus) {
1103         bus = QLIST_FIRST(&dev->child_bus);
1104         object_unparent(OBJECT(bus));
1105     }
1106     if (dev->parent_bus) {
1107         bus_remove_child(dev->parent_bus, dev);
1108         object_unref(OBJECT(dev->parent_bus));
1109         dev->parent_bus = NULL;
1110     }
1111 }
1112 
1113 static char *
1114 device_vmstate_if_get_id(VMStateIf *obj)
1115 {
1116     DeviceState *dev = DEVICE(obj);
1117 
1118     return qdev_get_dev_path(dev);
1119 }
1120 
1121 /**
1122  * device_phases_reset:
1123  * Transition reset method for devices to allow moving
1124  * smoothly from legacy reset method to multi-phases
1125  */
1126 static void device_phases_reset(DeviceState *dev)
1127 {
1128     ResettableClass *rc = RESETTABLE_GET_CLASS(dev);
1129 
1130     if (rc->phases.enter) {
1131         rc->phases.enter(OBJECT(dev), RESET_TYPE_COLD);
1132     }
1133     if (rc->phases.hold) {
1134         rc->phases.hold(OBJECT(dev));
1135     }
1136     if (rc->phases.exit) {
1137         rc->phases.exit(OBJECT(dev));
1138     }
1139 }
1140 
1141 static void device_transitional_reset(Object *obj)
1142 {
1143     DeviceClass *dc = DEVICE_GET_CLASS(obj);
1144 
1145     /*
1146      * This will call either @device_phases_reset (for multi-phases transitioned
1147      * devices) or a device's specific method for not-yet transitioned devices.
1148      * In both case, it does not reset children.
1149      */
1150     if (dc->reset) {
1151         dc->reset(DEVICE(obj));
1152     }
1153 }
1154 
1155 /**
1156  * device_get_transitional_reset:
1157  * check if the device's class is ready for multi-phase
1158  */
1159 static ResettableTrFunction device_get_transitional_reset(Object *obj)
1160 {
1161     DeviceClass *dc = DEVICE_GET_CLASS(obj);
1162     if (dc->reset != device_phases_reset) {
1163         /*
1164          * dc->reset has been overridden by a subclass,
1165          * the device is not ready for multi phase yet.
1166          */
1167         return device_transitional_reset;
1168     }
1169     return NULL;
1170 }
1171 
1172 static void device_class_init(ObjectClass *class, void *data)
1173 {
1174     DeviceClass *dc = DEVICE_CLASS(class);
1175     VMStateIfClass *vc = VMSTATE_IF_CLASS(class);
1176     ResettableClass *rc = RESETTABLE_CLASS(class);
1177 
1178     class->unparent = device_unparent;
1179 
1180     /* by default all devices were considered as hotpluggable,
1181      * so with intent to check it in generic qdev_unplug() /
1182      * device_set_realized() functions make every device
1183      * hotpluggable. Devices that shouldn't be hotpluggable,
1184      * should override it in their class_init()
1185      */
1186     dc->hotpluggable = true;
1187     dc->user_creatable = true;
1188     vc->get_id = device_vmstate_if_get_id;
1189     rc->get_state = device_get_reset_state;
1190     rc->child_foreach = device_reset_child_foreach;
1191 
1192     /*
1193      * @device_phases_reset is put as the default reset method below, allowing
1194      * to do the multi-phase transition from base classes to leaf classes. It
1195      * allows a legacy-reset Device class to extend a multi-phases-reset
1196      * Device class for the following reason:
1197      * + If a base class B has been moved to multi-phase, then it does not
1198      *   override this default reset method and may have defined phase methods.
1199      * + A child class C (extending class B) which uses
1200      *   device_class_set_parent_reset() (or similar means) to override the
1201      *   reset method will still work as expected. @device_phases_reset function
1202      *   will be registered as the parent reset method and effectively call
1203      *   parent reset phases.
1204      */
1205     dc->reset = device_phases_reset;
1206     rc->get_transitional_function = device_get_transitional_reset;
1207 
1208     object_class_property_add_bool(class, "realized",
1209                                    device_get_realized, device_set_realized);
1210     object_class_property_add_bool(class, "hotpluggable",
1211                                    device_get_hotpluggable, NULL);
1212     object_class_property_add_bool(class, "hotplugged",
1213                                    device_get_hotplugged, NULL);
1214     object_class_property_add_link(class, "parent_bus", TYPE_BUS,
1215                                    offsetof(DeviceState, parent_bus), NULL, 0);
1216 }
1217 
1218 void device_class_set_props(DeviceClass *dc, Property *props)
1219 {
1220     Property *prop;
1221 
1222     dc->props_ = props;
1223     for (prop = props; prop && prop->name; prop++) {
1224         qdev_class_add_legacy_property(dc, prop);
1225         qdev_class_add_property(dc, prop);
1226     }
1227 }
1228 
1229 void device_class_set_parent_reset(DeviceClass *dc,
1230                                    DeviceReset dev_reset,
1231                                    DeviceReset *parent_reset)
1232 {
1233     *parent_reset = dc->reset;
1234     dc->reset = dev_reset;
1235 }
1236 
1237 void device_class_set_parent_realize(DeviceClass *dc,
1238                                      DeviceRealize dev_realize,
1239                                      DeviceRealize *parent_realize)
1240 {
1241     *parent_realize = dc->realize;
1242     dc->realize = dev_realize;
1243 }
1244 
1245 void device_class_set_parent_unrealize(DeviceClass *dc,
1246                                        DeviceUnrealize dev_unrealize,
1247                                        DeviceUnrealize *parent_unrealize)
1248 {
1249     *parent_unrealize = dc->unrealize;
1250     dc->unrealize = dev_unrealize;
1251 }
1252 
1253 void device_legacy_reset(DeviceState *dev)
1254 {
1255     DeviceClass *klass = DEVICE_GET_CLASS(dev);
1256 
1257     trace_qdev_reset(dev, object_get_typename(OBJECT(dev)));
1258     if (klass->reset) {
1259         klass->reset(dev);
1260     }
1261 }
1262 
1263 Object *qdev_get_machine(void)
1264 {
1265     static Object *dev;
1266 
1267     if (dev == NULL) {
1268         dev = container_get(object_get_root(), "/machine");
1269     }
1270 
1271     return dev;
1272 }
1273 
1274 static const TypeInfo device_type_info = {
1275     .name = TYPE_DEVICE,
1276     .parent = TYPE_OBJECT,
1277     .instance_size = sizeof(DeviceState),
1278     .instance_init = device_initfn,
1279     .instance_post_init = device_post_init,
1280     .instance_finalize = device_finalize,
1281     .class_base_init = device_class_base_init,
1282     .class_init = device_class_init,
1283     .abstract = true,
1284     .class_size = sizeof(DeviceClass),
1285     .interfaces = (InterfaceInfo[]) {
1286         { TYPE_VMSTATE_IF },
1287         { TYPE_RESETTABLE_INTERFACE },
1288         { }
1289     }
1290 };
1291 
1292 static void qdev_register_types(void)
1293 {
1294     type_register_static(&device_type_info);
1295 }
1296 
1297 type_init(qdev_register_types)
1298