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