xref: /openbmc/qemu/hw/core/qdev.c (revision 385d8f222a30687f17ffff7a1a697be18de1cbe8)
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 void qdev_property_add_static(DeviceState *dev, Property *prop)
721 {
722     Object *obj = OBJECT(dev);
723 
724     if (prop->info->create) {
725         prop->info->create(obj, prop, &error_abort);
726     } else {
727         object_property_add(obj, prop->name, prop->info->name,
728                             prop->info->get, prop->info->set,
729                             prop->info->release,
730                             prop, &error_abort);
731     }
732 
733     object_property_set_description(obj, prop->name,
734                                     prop->info->description,
735                                     &error_abort);
736 
737     if (prop->set_default) {
738         prop->info->set_default_value(obj, prop);
739     }
740 }
741 
742 /* @qdev_alias_all_properties - Add alias properties to the source object for
743  * all qdev properties on the target DeviceState.
744  */
745 void qdev_alias_all_properties(DeviceState *target, Object *source)
746 {
747     ObjectClass *class;
748     Property *prop;
749 
750     class = object_get_class(OBJECT(target));
751     do {
752         DeviceClass *dc = DEVICE_CLASS(class);
753 
754         for (prop = dc->props_; prop && prop->name; prop++) {
755             object_property_add_alias(source, prop->name,
756                                       OBJECT(target), prop->name,
757                                       &error_abort);
758         }
759         class = object_class_get_parent(class);
760     } while (class != object_class_by_name(TYPE_DEVICE));
761 }
762 
763 static bool device_get_realized(Object *obj, Error **errp)
764 {
765     DeviceState *dev = DEVICE(obj);
766     return dev->realized;
767 }
768 
769 static bool check_only_migratable(Object *obj, Error **errp)
770 {
771     DeviceClass *dc = DEVICE_GET_CLASS(obj);
772 
773     if (!vmstate_check_only_migratable(dc->vmsd)) {
774         error_setg(errp, "Device %s is not migratable, but "
775                    "--only-migratable was specified",
776                    object_get_typename(obj));
777         return false;
778     }
779 
780     return true;
781 }
782 
783 static void device_set_realized(Object *obj, bool value, Error **errp)
784 {
785     DeviceState *dev = DEVICE(obj);
786     DeviceClass *dc = DEVICE_GET_CLASS(dev);
787     HotplugHandler *hotplug_ctrl;
788     BusState *bus;
789     Error *local_err = NULL;
790     bool unattached_parent = false;
791     static int unattached_count;
792 
793     if (dev->hotplugged && !dc->hotpluggable) {
794         error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
795         return;
796     }
797 
798     if (value && !dev->realized) {
799         if (!check_only_migratable(obj, &local_err)) {
800             goto fail;
801         }
802 
803         if (!obj->parent) {
804             gchar *name = g_strdup_printf("device[%d]", unattached_count++);
805 
806             object_property_add_child(container_get(qdev_get_machine(),
807                                                     "/unattached"),
808                                       name, obj, &error_abort);
809             unattached_parent = true;
810             g_free(name);
811         }
812 
813         hotplug_ctrl = qdev_get_hotplug_handler(dev);
814         if (hotplug_ctrl) {
815             hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
816             if (local_err != NULL) {
817                 goto fail;
818             }
819         }
820 
821         if (dc->realize) {
822             dc->realize(dev, &local_err);
823             if (local_err != NULL) {
824                 goto fail;
825             }
826         }
827 
828         DEVICE_LISTENER_CALL(realize, Forward, dev);
829 
830         /*
831          * always free/re-initialize here since the value cannot be cleaned up
832          * in device_unrealize due to its usage later on in the unplug path
833          */
834         g_free(dev->canonical_path);
835         dev->canonical_path = object_get_canonical_path(OBJECT(dev));
836 
837         if (qdev_get_vmsd(dev)) {
838             if (vmstate_register_with_alias_id(VMSTATE_IF(dev),
839                                                VMSTATE_INSTANCE_ID_ANY,
840                                                qdev_get_vmsd(dev), dev,
841                                                dev->instance_id_alias,
842                                                dev->alias_required_for_version,
843                                                &local_err) < 0) {
844                 goto post_realize_fail;
845             }
846         }
847 
848         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
849             object_property_set_bool(OBJECT(bus), true, "realized",
850                                          &local_err);
851             if (local_err != NULL) {
852                 goto child_realize_fail;
853             }
854         }
855         if (dev->hotplugged) {
856             device_reset(dev);
857         }
858         dev->pending_deleted_event = false;
859 
860         if (hotplug_ctrl) {
861             hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
862             if (local_err != NULL) {
863                 goto child_realize_fail;
864             }
865        }
866 
867     } else if (!value && dev->realized) {
868         /* We want local_err to track only the first error */
869         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
870             object_property_set_bool(OBJECT(bus), false, "realized",
871                                      local_err ? NULL : &local_err);
872         }
873         if (qdev_get_vmsd(dev)) {
874             vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
875         }
876         if (dc->unrealize) {
877             dc->unrealize(dev, local_err ? NULL : &local_err);
878         }
879         dev->pending_deleted_event = true;
880         DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
881 
882         if (local_err != NULL) {
883             goto fail;
884         }
885     }
886 
887     assert(local_err == NULL);
888     dev->realized = value;
889     return;
890 
891 child_realize_fail:
892     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
893         object_property_set_bool(OBJECT(bus), false, "realized",
894                                  NULL);
895     }
896 
897     if (qdev_get_vmsd(dev)) {
898         vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
899     }
900 
901 post_realize_fail:
902     g_free(dev->canonical_path);
903     dev->canonical_path = NULL;
904     if (dc->unrealize) {
905         dc->unrealize(dev, NULL);
906     }
907 
908 fail:
909     error_propagate(errp, local_err);
910     if (unattached_parent) {
911         object_unparent(OBJECT(dev));
912         unattached_count--;
913     }
914 }
915 
916 static bool device_get_hotpluggable(Object *obj, Error **errp)
917 {
918     DeviceClass *dc = DEVICE_GET_CLASS(obj);
919     DeviceState *dev = DEVICE(obj);
920 
921     return dc->hotpluggable && (dev->parent_bus == NULL ||
922                                 qbus_is_hotpluggable(dev->parent_bus));
923 }
924 
925 static bool device_get_hotplugged(Object *obj, Error **errp)
926 {
927     DeviceState *dev = DEVICE(obj);
928 
929     return dev->hotplugged;
930 }
931 
932 static void device_initfn(Object *obj)
933 {
934     DeviceState *dev = DEVICE(obj);
935     ObjectClass *class;
936     Property *prop;
937 
938     if (qdev_hotplug) {
939         dev->hotplugged = 1;
940         qdev_hot_added = true;
941     }
942 
943     dev->instance_id_alias = -1;
944     dev->realized = false;
945     dev->allow_unplug_during_migration = false;
946 
947     object_property_add_bool(obj, "realized",
948                              device_get_realized, device_set_realized, NULL);
949     object_property_add_bool(obj, "hotpluggable",
950                              device_get_hotpluggable, NULL, NULL);
951     object_property_add_bool(obj, "hotplugged",
952                              device_get_hotplugged, NULL,
953                              &error_abort);
954 
955     class = object_get_class(OBJECT(dev));
956     do {
957         for (prop = DEVICE_CLASS(class)->props_; prop && prop->name; prop++) {
958             qdev_property_add_legacy(dev, prop, &error_abort);
959             qdev_property_add_static(dev, prop);
960         }
961         class = object_class_get_parent(class);
962     } while (class != object_class_by_name(TYPE_DEVICE));
963 
964     object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
965                              (Object **)&dev->parent_bus, NULL, 0,
966                              &error_abort);
967     QLIST_INIT(&dev->gpios);
968 }
969 
970 static void device_post_init(Object *obj)
971 {
972     /*
973      * Note: ordered so that the user's global properties take
974      * precedence.
975      */
976     object_apply_compat_props(obj);
977     qdev_prop_set_globals(DEVICE(obj));
978 }
979 
980 /* Unlink device from bus and free the structure.  */
981 static void device_finalize(Object *obj)
982 {
983     NamedGPIOList *ngl, *next;
984 
985     DeviceState *dev = DEVICE(obj);
986 
987     QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
988         QLIST_REMOVE(ngl, node);
989         qemu_free_irqs(ngl->in, ngl->num_in);
990         g_free(ngl->name);
991         g_free(ngl);
992         /* ngl->out irqs are owned by the other end and should not be freed
993          * here
994          */
995     }
996 
997     /* Only send event if the device had been completely realized */
998     if (dev->pending_deleted_event) {
999         g_assert(dev->canonical_path);
1000 
1001         qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path);
1002         g_free(dev->canonical_path);
1003         dev->canonical_path = NULL;
1004     }
1005 
1006     qemu_opts_del(dev->opts);
1007 }
1008 
1009 static void device_class_base_init(ObjectClass *class, void *data)
1010 {
1011     DeviceClass *klass = DEVICE_CLASS(class);
1012 
1013     /* We explicitly look up properties in the superclasses,
1014      * so do not propagate them to the subclasses.
1015      */
1016     klass->props_ = NULL;
1017 }
1018 
1019 static void device_unparent(Object *obj)
1020 {
1021     DeviceState *dev = DEVICE(obj);
1022     BusState *bus;
1023 
1024     if (dev->realized) {
1025         object_property_set_bool(obj, false, "realized", NULL);
1026     }
1027     while (dev->num_child_bus) {
1028         bus = QLIST_FIRST(&dev->child_bus);
1029         object_unparent(OBJECT(bus));
1030     }
1031     if (dev->parent_bus) {
1032         bus_remove_child(dev->parent_bus, dev);
1033         object_unref(OBJECT(dev->parent_bus));
1034         dev->parent_bus = NULL;
1035     }
1036 }
1037 
1038 static char *
1039 device_vmstate_if_get_id(VMStateIf *obj)
1040 {
1041     DeviceState *dev = DEVICE(obj);
1042 
1043     return qdev_get_dev_path(dev);
1044 }
1045 
1046 static void device_class_init(ObjectClass *class, void *data)
1047 {
1048     DeviceClass *dc = DEVICE_CLASS(class);
1049     VMStateIfClass *vc = VMSTATE_IF_CLASS(class);
1050 
1051     class->unparent = device_unparent;
1052 
1053     /* by default all devices were considered as hotpluggable,
1054      * so with intent to check it in generic qdev_unplug() /
1055      * device_set_realized() functions make every device
1056      * hotpluggable. Devices that shouldn't be hotpluggable,
1057      * should override it in their class_init()
1058      */
1059     dc->hotpluggable = true;
1060     dc->user_creatable = true;
1061     vc->get_id = device_vmstate_if_get_id;
1062 }
1063 
1064 void device_class_set_props(DeviceClass *dc, Property *props)
1065 {
1066     dc->props_ = props;
1067 }
1068 
1069 void device_class_set_parent_reset(DeviceClass *dc,
1070                                    DeviceReset dev_reset,
1071                                    DeviceReset *parent_reset)
1072 {
1073     *parent_reset = dc->reset;
1074     dc->reset = dev_reset;
1075 }
1076 
1077 void device_class_set_parent_realize(DeviceClass *dc,
1078                                      DeviceRealize dev_realize,
1079                                      DeviceRealize *parent_realize)
1080 {
1081     *parent_realize = dc->realize;
1082     dc->realize = dev_realize;
1083 }
1084 
1085 void device_class_set_parent_unrealize(DeviceClass *dc,
1086                                        DeviceUnrealize dev_unrealize,
1087                                        DeviceUnrealize *parent_unrealize)
1088 {
1089     *parent_unrealize = dc->unrealize;
1090     dc->unrealize = dev_unrealize;
1091 }
1092 
1093 void device_reset(DeviceState *dev)
1094 {
1095     DeviceClass *klass = DEVICE_GET_CLASS(dev);
1096 
1097     if (klass->reset) {
1098         klass->reset(dev);
1099     }
1100 }
1101 
1102 Object *qdev_get_machine(void)
1103 {
1104     static Object *dev;
1105 
1106     if (dev == NULL) {
1107         dev = container_get(object_get_root(), "/machine");
1108     }
1109 
1110     return dev;
1111 }
1112 
1113 static const TypeInfo device_type_info = {
1114     .name = TYPE_DEVICE,
1115     .parent = TYPE_OBJECT,
1116     .instance_size = sizeof(DeviceState),
1117     .instance_init = device_initfn,
1118     .instance_post_init = device_post_init,
1119     .instance_finalize = device_finalize,
1120     .class_base_init = device_class_base_init,
1121     .class_init = device_class_init,
1122     .abstract = true,
1123     .class_size = sizeof(DeviceClass),
1124     .interfaces = (InterfaceInfo[]) {
1125         { TYPE_VMSTATE_IF },
1126         { }
1127     }
1128 };
1129 
1130 static void qdev_register_types(void)
1131 {
1132     type_register_static(&device_type_info);
1133 }
1134 
1135 type_init(qdev_register_types)
1136