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