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