1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include "qemu/osdep.h"
29#include "qapi/error.h"
30#include "qapi/qapi-events-qdev.h"
31#include "qapi/qmp/qerror.h"
32#include "qapi/visitor.h"
33#include "qemu/error-report.h"
34#include "qemu/option.h"
35#include "hw/hotplug.h"
36#include "hw/irq.h"
37#include "hw/qdev-properties.h"
38#include "hw/boards.h"
39#include "hw/sysbus.h"
40#include "hw/qdev-clock.h"
41#include "migration/vmstate.h"
42#include "trace.h"
43
44bool qdev_hotplug = false;
45static bool qdev_hot_added = false;
46bool qdev_hot_removed = false;
47
48const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
49{
50 DeviceClass *dc = DEVICE_GET_CLASS(dev);
51 return dc->vmsd;
52}
53
54static void bus_free_bus_child(BusChild *kid)
55{
56 object_unref(OBJECT(kid->child));
57 g_free(kid);
58}
59
60static void bus_remove_child(BusState *bus, DeviceState *child)
61{
62 BusChild *kid;
63
64 QTAILQ_FOREACH(kid, &bus->children, sibling) {
65 if (kid->child == child) {
66 char name[32];
67
68 snprintf(name, sizeof(name), "child[%d]", kid->index);
69 QTAILQ_REMOVE_RCU(&bus->children, kid, sibling);
70
71 bus->num_children--;
72
73
74 object_property_del(OBJECT(bus), name);
75
76
77 call_rcu(kid, bus_free_bus_child, rcu);
78 break;
79 }
80 }
81}
82
83static void bus_add_child(BusState *bus, DeviceState *child)
84{
85 char name[32];
86 BusChild *kid = g_malloc0(sizeof(*kid));
87
88 bus->num_children++;
89 kid->index = bus->max_index++;
90 kid->child = child;
91 object_ref(OBJECT(kid->child));
92
93 QTAILQ_INSERT_HEAD_RCU(&bus->children, kid, sibling);
94
95
96 snprintf(name, sizeof(name), "child[%d]", kid->index);
97 object_property_add_link(OBJECT(bus), name,
98 object_get_typename(OBJECT(child)),
99 (Object **)&kid->child,
100 NULL,
101 0);
102}
103
104static bool bus_check_address(BusState *bus, DeviceState *child, Error **errp)
105{
106 BusClass *bc = BUS_GET_CLASS(bus);
107 return !bc->check_address || bc->check_address(bus, child, errp);
108}
109
110bool qdev_set_parent_bus(DeviceState *dev, BusState *bus, Error **errp)
111{
112 BusState *old_parent_bus = dev->parent_bus;
113 DeviceClass *dc = DEVICE_GET_CLASS(dev);
114
115 assert(dc->bus_type && object_dynamic_cast(OBJECT(bus), dc->bus_type));
116
117 if (!bus_check_address(bus, dev, errp)) {
118 return false;
119 }
120
121 if (old_parent_bus) {
122 trace_qdev_update_parent_bus(dev, object_get_typename(OBJECT(dev)),
123 old_parent_bus, object_get_typename(OBJECT(old_parent_bus)),
124 OBJECT(bus), object_get_typename(OBJECT(bus)));
125
126
127
128
129
130
131
132 object_ref(OBJECT(dev));
133 bus_remove_child(dev->parent_bus, dev);
134 }
135 dev->parent_bus = bus;
136 object_ref(OBJECT(bus));
137 bus_add_child(bus, dev);
138 if (dev->realized) {
139 resettable_change_parent(OBJECT(dev), OBJECT(bus),
140 OBJECT(old_parent_bus));
141 }
142 if (old_parent_bus) {
143 object_unref(OBJECT(old_parent_bus));
144 object_unref(OBJECT(dev));
145 }
146 return true;
147}
148
149DeviceState *qdev_new(const char *name)
150{
151 if (!object_class_by_name(name)) {
152 module_load_qom_one(name);
153 }
154 return DEVICE(object_new(name));
155}
156
157DeviceState *qdev_try_new(const char *name)
158{
159 if (!module_object_class_by_name(name)) {
160 return NULL;
161 }
162 return DEVICE(object_new(name));
163}
164
165static QTAILQ_HEAD(, DeviceListener) device_listeners
166 = QTAILQ_HEAD_INITIALIZER(device_listeners);
167
168enum 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
195static int device_listener_add(DeviceState *dev, void *opaque)
196{
197 DEVICE_LISTENER_CALL(realize, Forward, dev);
198
199 return 0;
200}
201
202void 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
210void device_listener_unregister(DeviceListener *listener)
211{
212 QTAILQ_REMOVE(&device_listeners, listener, link);
213}
214
215bool 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
224
225
226
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
239void 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
247HotplugHandler *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
264bool 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
281HotplugHandler *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
289HotplugHandler *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
299static int qdev_prereset(DeviceState *dev, void *opaque)
300{
301 trace_qdev_reset_tree(dev, object_get_typename(OBJECT(dev)));
302 return 0;
303}
304
305static int qbus_prereset(BusState *bus, void *opaque)
306{
307 trace_qbus_reset_tree(bus, object_get_typename(OBJECT(bus)));
308 return 0;
309}
310
311static int qdev_reset_one(DeviceState *dev, void *opaque)
312{
313 device_legacy_reset(dev);
314
315 return 0;
316}
317
318static int qbus_reset_one(BusState *bus, void *opaque)
319{
320 BusClass *bc = BUS_GET_CLASS(bus);
321 trace_qbus_reset(bus, object_get_typename(OBJECT(bus)));
322 if (bc->reset) {
323 bc->reset(bus);
324 }
325 return 0;
326}
327
328void qdev_reset_all(DeviceState *dev)
329{
330 trace_qdev_reset_all(dev, object_get_typename(OBJECT(dev)));
331 qdev_walk_children(dev, qdev_prereset, qbus_prereset,
332 qdev_reset_one, qbus_reset_one, NULL);
333}
334
335void qdev_reset_all_fn(void *opaque)
336{
337 qdev_reset_all(DEVICE(opaque));
338}
339
340void qbus_reset_all(BusState *bus)
341{
342 trace_qbus_reset_all(bus, object_get_typename(OBJECT(bus)));
343 qbus_walk_children(bus, qdev_prereset, qbus_prereset,
344 qdev_reset_one, qbus_reset_one, NULL);
345}
346
347void qbus_reset_all_fn(void *opaque)
348{
349 BusState *bus = opaque;
350 qbus_reset_all(bus);
351}
352
353void device_cold_reset(DeviceState *dev)
354{
355 resettable_reset(OBJECT(dev), RESET_TYPE_COLD);
356}
357
358bool device_is_in_reset(DeviceState *dev)
359{
360 return resettable_is_in_reset(OBJECT(dev));
361}
362
363static ResettableState *device_get_reset_state(Object *obj)
364{
365 DeviceState *dev = DEVICE(obj);
366 return &dev->reset;
367}
368
369static void device_reset_child_foreach(Object *obj, ResettableChildCallback cb,
370 void *opaque, ResetType type)
371{
372 DeviceState *dev = DEVICE(obj);
373 BusState *bus;
374
375 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
376 cb(OBJECT(bus), opaque, type);
377 }
378}
379
380
381void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
382 DeviceState *dev, Error **errp)
383{
384 qdev_unrealize(dev);
385}
386
387bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp)
388{
389 assert(!dev->realized && !dev->parent_bus);
390
391 if (bus) {
392 if (!qdev_set_parent_bus(dev, bus, errp)) {
393 return false;
394 }
395 } else {
396 assert(!DEVICE_GET_CLASS(dev)->bus_type);
397 }
398
399 return object_property_set_bool(OBJECT(dev), "realized", true, errp);
400}
401
402bool qdev_realize_and_unref(DeviceState *dev, BusState *bus, Error **errp)
403{
404 bool ret;
405
406 ret = qdev_realize(dev, bus, errp);
407 object_unref(OBJECT(dev));
408 return ret;
409}
410
411void qdev_unrealize(DeviceState *dev)
412{
413 object_property_set_bool(OBJECT(dev), "realized", false, &error_abort);
414}
415
416static int qdev_assert_realized_properly(Object *obj, void *opaque)
417{
418 DeviceState *dev = DEVICE(object_dynamic_cast(obj, TYPE_DEVICE));
419 DeviceClass *dc;
420
421 if (dev) {
422 dc = DEVICE_GET_CLASS(dev);
423 assert(dev->realized);
424 assert(dev->parent_bus || !dc->bus_type);
425 }
426 return 0;
427}
428
429void qdev_machine_creation_done(void)
430{
431
432
433
434
435 qdev_hotplug = true;
436
437 object_child_foreach_recursive(object_get_root(),
438 qdev_assert_realized_properly, NULL);
439}
440
441bool qdev_machine_modified(void)
442{
443 return qdev_hot_added || qdev_hot_removed;
444}
445
446BusState *qdev_get_parent_bus(DeviceState *dev)
447{
448 return dev->parent_bus;
449}
450
451static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
452 const char *name)
453{
454 NamedGPIOList *ngl;
455
456 QLIST_FOREACH(ngl, &dev->gpios, node) {
457
458 if (g_strcmp0(name, ngl->name) == 0) {
459 return ngl;
460 }
461 }
462
463 ngl = g_malloc0(sizeof(*ngl));
464 ngl->name = g_strdup(name);
465 QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
466 return ngl;
467}
468
469void qdev_init_gpio_in_named_with_opaque(DeviceState *dev,
470 qemu_irq_handler handler,
471 void *opaque,
472 const char *name, int n)
473{
474 int i;
475 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
476
477 assert(gpio_list->num_out == 0 || !name);
478 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
479 opaque, n);
480
481 if (!name) {
482 name = "unnamed-gpio-in";
483 }
484 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
485 gchar *propname = g_strdup_printf("%s[%u]", name, i);
486
487 object_property_add_child(OBJECT(dev), propname,
488 OBJECT(gpio_list->in[i]));
489 g_free(propname);
490 }
491
492 gpio_list->num_in += n;
493}
494
495void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
496{
497 qdev_init_gpio_in_named(dev, handler, NULL, n);
498}
499
500void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
501 const char *name, int n)
502{
503 int i;
504 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
505
506 assert(gpio_list->num_in == 0 || !name);
507
508 if (!name) {
509 name = "unnamed-gpio-out";
510 }
511 memset(pins, 0, sizeof(*pins) * n);
512 for (i = 0; i < n; ++i) {
513 gchar *propname = g_strdup_printf("%s[%u]", name,
514 gpio_list->num_out + i);
515
516 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
517 (Object **)&pins[i],
518 object_property_allow_set_link,
519 OBJ_PROP_LINK_STRONG);
520 g_free(propname);
521 }
522 gpio_list->num_out += n;
523}
524
525void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
526{
527 qdev_init_gpio_out_named(dev, pins, NULL, n);
528}
529
530qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
531{
532 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
533
534 assert(n >= 0 && n < gpio_list->num_in);
535 return gpio_list->in[n];
536}
537
538qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
539{
540 return qdev_get_gpio_in_named(dev, NULL, n);
541}
542
543void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
544 qemu_irq pin)
545{
546 char *propname = g_strdup_printf("%s[%d]",
547 name ? name : "unnamed-gpio-out", n);
548 if (pin && !OBJECT(pin)->parent) {
549
550 object_property_add_child(container_get(qdev_get_machine(),
551 "/unattached"),
552 "non-qdev-gpio[*]", OBJECT(pin));
553 }
554 object_property_set_link(OBJECT(dev), propname, OBJECT(pin), &error_abort);
555 g_free(propname);
556}
557
558qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
559{
560 g_autofree char *propname = g_strdup_printf("%s[%d]",
561 name ? name : "unnamed-gpio-out", n);
562
563 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
564 NULL);
565
566 return ret;
567}
568
569
570
571static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
572 const char *name, int n)
573{
574 char *propname = g_strdup_printf("%s[%d]",
575 name ? name : "unnamed-gpio-out", n);
576
577 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
578 NULL);
579 if (ret) {
580 object_property_set_link(OBJECT(dev), propname, NULL, NULL);
581 }
582 g_free(propname);
583 return ret;
584}
585
586qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
587 const char *name, int n)
588{
589 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
590 qdev_connect_gpio_out_named(dev, name, n, icpt);
591 return disconnected;
592}
593
594void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
595{
596 qdev_connect_gpio_out_named(dev, NULL, n, pin);
597}
598
599void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
600 const char *name)
601{
602 int i;
603 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
604
605 for (i = 0; i < ngl->num_in; i++) {
606 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
607 char *propname = g_strdup_printf("%s[%d]", nm, i);
608
609 object_property_add_alias(OBJECT(container), propname,
610 OBJECT(dev), propname);
611 g_free(propname);
612 }
613 for (i = 0; i < ngl->num_out; i++) {
614 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
615 char *propname = g_strdup_printf("%s[%d]", nm, i);
616
617 object_property_add_alias(OBJECT(container), propname,
618 OBJECT(dev), propname);
619 g_free(propname);
620 }
621 QLIST_REMOVE(ngl, node);
622 QLIST_INSERT_HEAD(&container->gpios, ngl, node);
623}
624
625BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
626{
627 BusState *bus;
628 Object *child = object_resolve_path_component(OBJECT(dev), name);
629
630 bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
631 if (bus) {
632 return bus;
633 }
634
635 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
636 if (strcmp(name, bus->name) == 0) {
637 return bus;
638 }
639 }
640 return NULL;
641}
642
643int qdev_walk_children(DeviceState *dev,
644 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
645 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
646 void *opaque)
647{
648 BusState *bus;
649 int err;
650
651 if (pre_devfn) {
652 err = pre_devfn(dev, opaque);
653 if (err) {
654 return err;
655 }
656 }
657
658 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
659 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
660 post_devfn, post_busfn, opaque);
661 if (err < 0) {
662 return err;
663 }
664 }
665
666 if (post_devfn) {
667 err = post_devfn(dev, opaque);
668 if (err) {
669 return err;
670 }
671 }
672
673 return 0;
674}
675
676DeviceState *qdev_find_recursive(BusState *bus, const char *id)
677{
678 BusChild *kid;
679 DeviceState *ret;
680 BusState *child;
681
682 WITH_RCU_READ_LOCK_GUARD() {
683 QTAILQ_FOREACH_RCU(kid, &bus->children, sibling) {
684 DeviceState *dev = kid->child;
685
686 if (dev->id && strcmp(dev->id, id) == 0) {
687 return dev;
688 }
689
690 QLIST_FOREACH(child, &dev->child_bus, sibling) {
691 ret = qdev_find_recursive(child, id);
692 if (ret) {
693 return ret;
694 }
695 }
696 }
697 }
698 return NULL;
699}
700
701char *qdev_get_dev_path(DeviceState *dev)
702{
703 BusClass *bc;
704
705 if (!dev || !dev->parent_bus) {
706 return NULL;
707 }
708
709 bc = BUS_GET_CLASS(dev->parent_bus);
710 if (bc->get_dev_path) {
711 return bc->get_dev_path(dev);
712 }
713
714 return NULL;
715}
716
717
718
719
720
721static void qdev_get_legacy_property(Object *obj, Visitor *v,
722 const char *name, void *opaque,
723 Error **errp)
724{
725 DeviceState *dev = DEVICE(obj);
726 Property *prop = opaque;
727
728 char buffer[1024];
729 char *ptr = buffer;
730
731 prop->info->print(dev, prop, buffer, sizeof(buffer));
732 visit_type_str(v, name, &ptr, errp);
733}
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749static void qdev_class_add_legacy_property(DeviceClass *dc, Property *prop)
750{
751 g_autofree char *name = NULL;
752
753
754 if (!prop->info->print && prop->info->get) {
755 return;
756 }
757
758 name = g_strdup_printf("legacy-%s", prop->name);
759 object_class_property_add(OBJECT_CLASS(dc), name, "str",
760 prop->info->print ? qdev_get_legacy_property : prop->info->get,
761 NULL, NULL, prop);
762}
763
764void qdev_property_add_static(DeviceState *dev, Property *prop)
765{
766 Object *obj = OBJECT(dev);
767 ObjectProperty *op;
768
769 assert(!prop->info->create);
770
771 op = object_property_add(obj, prop->name, prop->info->name,
772 prop->info->get, prop->info->set,
773 prop->info->release,
774 prop);
775
776 object_property_set_description(obj, prop->name,
777 prop->info->description);
778
779 if (prop->set_default) {
780 prop->info->set_default_value(op, prop);
781 if (op->init) {
782 op->init(obj, op);
783 }
784 }
785}
786
787static void qdev_class_add_property(DeviceClass *klass, Property *prop)
788{
789 ObjectClass *oc = OBJECT_CLASS(klass);
790
791 if (prop->info->create) {
792 prop->info->create(oc, prop);
793 } else {
794 ObjectProperty *op;
795
796 op = object_class_property_add(oc,
797 prop->name, prop->info->name,
798 prop->info->get, prop->info->set,
799 prop->info->release,
800 prop);
801 if (prop->set_default) {
802 prop->info->set_default_value(op, prop);
803 }
804 }
805 object_class_property_set_description(oc, prop->name,
806 prop->info->description);
807}
808
809void qdev_alias_all_properties(DeviceState *target, Object *source)
810{
811 ObjectClass *class;
812 Property *prop;
813
814 class = object_get_class(OBJECT(target));
815 do {
816 DeviceClass *dc = DEVICE_CLASS(class);
817
818 for (prop = dc->props_; prop && prop->name; prop++) {
819 object_property_add_alias(source, prop->name,
820 OBJECT(target), prop->name);
821 }
822 class = object_class_get_parent(class);
823 } while (class != object_class_by_name(TYPE_DEVICE));
824}
825
826static bool device_get_realized(Object *obj, Error **errp)
827{
828 DeviceState *dev = DEVICE(obj);
829 return dev->realized;
830}
831
832static bool check_only_migratable(Object *obj, Error **errp)
833{
834 DeviceClass *dc = DEVICE_GET_CLASS(obj);
835
836 if (!vmstate_check_only_migratable(dc->vmsd)) {
837 error_setg(errp, "Device %s is not migratable, but "
838 "--only-migratable was specified",
839 object_get_typename(obj));
840 return false;
841 }
842
843 return true;
844}
845
846static void device_set_realized(Object *obj, bool value, Error **errp)
847{
848 DeviceState *dev = DEVICE(obj);
849 DeviceClass *dc = DEVICE_GET_CLASS(dev);
850 HotplugHandler *hotplug_ctrl;
851 BusState *bus;
852 NamedClockList *ncl;
853 Error *local_err = NULL;
854 bool unattached_parent = false;
855 static int unattached_count;
856
857 if (dev->hotplugged && !dc->hotpluggable) {
858 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
859 return;
860 }
861
862 if (value && !dev->realized) {
863 if (!check_only_migratable(obj, errp)) {
864 goto fail;
865 }
866
867 if (!obj->parent) {
868 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
869
870 object_property_add_child(container_get(qdev_get_machine(),
871 "/unattached"),
872 name, obj);
873 unattached_parent = true;
874 g_free(name);
875 }
876
877 hotplug_ctrl = qdev_get_hotplug_handler(dev);
878 if (hotplug_ctrl) {
879 hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
880 if (local_err != NULL) {
881 goto fail;
882 }
883 }
884
885 if (dc->realize) {
886 dc->realize(dev, &local_err);
887 if (local_err != NULL) {
888 goto fail;
889 }
890 }
891
892 DEVICE_LISTENER_CALL(realize, Forward, dev);
893
894
895
896
897
898 g_free(dev->canonical_path);
899 dev->canonical_path = object_get_canonical_path(OBJECT(dev));
900 QLIST_FOREACH(ncl, &dev->clocks, node) {
901 if (ncl->alias) {
902 continue;
903 } else {
904 clock_setup_canonical_path(ncl->clock);
905 }
906 }
907
908 if (qdev_get_vmsd(dev)) {
909 if (vmstate_register_with_alias_id(VMSTATE_IF(dev),
910 VMSTATE_INSTANCE_ID_ANY,
911 qdev_get_vmsd(dev), dev,
912 dev->instance_id_alias,
913 dev->alias_required_for_version,
914 &local_err) < 0) {
915 goto post_realize_fail;
916 }
917 }
918
919
920
921
922
923 resettable_state_clear(&dev->reset);
924
925 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
926 if (!qbus_realize(bus, errp)) {
927 goto child_realize_fail;
928 }
929 }
930 if (dev->hotplugged) {
931
932
933
934
935 resettable_assert_reset(OBJECT(dev), RESET_TYPE_COLD);
936 resettable_change_parent(OBJECT(dev), OBJECT(dev->parent_bus),
937 NULL);
938 resettable_release_reset(OBJECT(dev), RESET_TYPE_COLD);
939 }
940 dev->pending_deleted_event = false;
941
942 if (hotplug_ctrl) {
943 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
944 if (local_err != NULL) {
945 goto child_realize_fail;
946 }
947 }
948
949 qatomic_store_release(&dev->realized, value);
950
951 } else if (!value && dev->realized) {
952
953
954
955
956
957
958
959
960
961 qatomic_set(&dev->realized, value);
962
963
964
965
966 smp_wmb();
967
968 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
969 qbus_unrealize(bus);
970 }
971 if (qdev_get_vmsd(dev)) {
972 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
973 }
974 if (dc->unrealize) {
975 dc->unrealize(dev);
976 }
977 dev->pending_deleted_event = true;
978 DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
979 }
980
981 assert(local_err == NULL);
982 return;
983
984child_realize_fail:
985 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
986 qbus_unrealize(bus);
987 }
988
989 if (qdev_get_vmsd(dev)) {
990 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
991 }
992
993post_realize_fail:
994 g_free(dev->canonical_path);
995 dev->canonical_path = NULL;
996 if (dc->unrealize) {
997 dc->unrealize(dev);
998 }
999
1000fail:
1001 error_propagate(errp, local_err);
1002 if (unattached_parent) {
1003
1004
1005
1006
1007 object_unparent(OBJECT(dev));
1008 unattached_count--;
1009 }
1010}
1011
1012static bool device_get_hotpluggable(Object *obj, Error **errp)
1013{
1014 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1015 DeviceState *dev = DEVICE(obj);
1016
1017 return dc->hotpluggable && (dev->parent_bus == NULL ||
1018 qbus_is_hotpluggable(dev->parent_bus));
1019}
1020
1021static bool device_get_hotplugged(Object *obj, Error **errp)
1022{
1023 DeviceState *dev = DEVICE(obj);
1024
1025 return dev->hotplugged;
1026}
1027
1028static void device_initfn(Object *obj)
1029{
1030 DeviceState *dev = DEVICE(obj);
1031
1032 if (qdev_hotplug) {
1033 dev->hotplugged = 1;
1034 qdev_hot_added = true;
1035 }
1036
1037 dev->instance_id_alias = -1;
1038 dev->realized = false;
1039 dev->allow_unplug_during_migration = false;
1040
1041 QLIST_INIT(&dev->gpios);
1042 QLIST_INIT(&dev->clocks);
1043}
1044
1045static void device_post_init(Object *obj)
1046{
1047
1048
1049
1050
1051 object_apply_compat_props(obj);
1052 qdev_prop_set_globals(DEVICE(obj));
1053}
1054
1055
1056static void device_finalize(Object *obj)
1057{
1058 NamedGPIOList *ngl, *next;
1059
1060 DeviceState *dev = DEVICE(obj);
1061
1062 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1063 QLIST_REMOVE(ngl, node);
1064 qemu_free_irqs(ngl->in, ngl->num_in);
1065 g_free(ngl->name);
1066 g_free(ngl);
1067
1068
1069
1070 }
1071
1072 qdev_finalize_clocklist(dev);
1073
1074
1075 if (dev->pending_deleted_event) {
1076 g_assert(dev->canonical_path);
1077
1078 qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path);
1079 g_free(dev->canonical_path);
1080 dev->canonical_path = NULL;
1081 }
1082
1083 qemu_opts_del(dev->opts);
1084}
1085
1086static void device_class_base_init(ObjectClass *class, void *data)
1087{
1088 DeviceClass *klass = DEVICE_CLASS(class);
1089
1090
1091
1092
1093 klass->props_ = NULL;
1094}
1095
1096static void device_unparent(Object *obj)
1097{
1098 DeviceState *dev = DEVICE(obj);
1099 BusState *bus;
1100
1101 if (dev->realized) {
1102 qdev_unrealize(dev);
1103 }
1104 while (dev->num_child_bus) {
1105 bus = QLIST_FIRST(&dev->child_bus);
1106 object_unparent(OBJECT(bus));
1107 }
1108 if (dev->parent_bus) {
1109 bus_remove_child(dev->parent_bus, dev);
1110 object_unref(OBJECT(dev->parent_bus));
1111 dev->parent_bus = NULL;
1112 }
1113}
1114
1115static char *
1116device_vmstate_if_get_id(VMStateIf *obj)
1117{
1118 DeviceState *dev = DEVICE(obj);
1119
1120 return qdev_get_dev_path(dev);
1121}
1122
1123
1124
1125
1126
1127
1128static void device_phases_reset(DeviceState *dev)
1129{
1130 ResettableClass *rc = RESETTABLE_GET_CLASS(dev);
1131
1132 if (rc->phases.enter) {
1133 rc->phases.enter(OBJECT(dev), RESET_TYPE_COLD);
1134 }
1135 if (rc->phases.hold) {
1136 rc->phases.hold(OBJECT(dev));
1137 }
1138 if (rc->phases.exit) {
1139 rc->phases.exit(OBJECT(dev));
1140 }
1141}
1142
1143static void device_transitional_reset(Object *obj)
1144{
1145 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1146
1147
1148
1149
1150
1151
1152 if (dc->reset) {
1153 dc->reset(DEVICE(obj));
1154 }
1155}
1156
1157
1158
1159
1160
1161static ResettableTrFunction device_get_transitional_reset(Object *obj)
1162{
1163 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1164 if (dc->reset != device_phases_reset) {
1165
1166
1167
1168
1169 return device_transitional_reset;
1170 }
1171 return NULL;
1172}
1173
1174static void device_class_init(ObjectClass *class, void *data)
1175{
1176 DeviceClass *dc = DEVICE_CLASS(class);
1177 VMStateIfClass *vc = VMSTATE_IF_CLASS(class);
1178 ResettableClass *rc = RESETTABLE_CLASS(class);
1179
1180 class->unparent = device_unparent;
1181
1182
1183
1184
1185
1186
1187
1188 dc->hotpluggable = true;
1189 dc->user_creatable = true;
1190 vc->get_id = device_vmstate_if_get_id;
1191 rc->get_state = device_get_reset_state;
1192 rc->child_foreach = device_reset_child_foreach;
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207 dc->reset = device_phases_reset;
1208 rc->get_transitional_function = device_get_transitional_reset;
1209
1210 object_class_property_add_bool(class, "realized",
1211 device_get_realized, device_set_realized);
1212 object_class_property_add_bool(class, "hotpluggable",
1213 device_get_hotpluggable, NULL);
1214 object_class_property_add_bool(class, "hotplugged",
1215 device_get_hotplugged, NULL);
1216 object_class_property_add_link(class, "parent_bus", TYPE_BUS,
1217 offsetof(DeviceState, parent_bus), NULL, 0);
1218}
1219
1220void device_class_set_props(DeviceClass *dc, Property *props)
1221{
1222 Property *prop;
1223
1224 dc->props_ = props;
1225 for (prop = props; prop && prop->name; prop++) {
1226 qdev_class_add_legacy_property(dc, prop);
1227 qdev_class_add_property(dc, prop);
1228 }
1229}
1230
1231void device_class_set_parent_reset(DeviceClass *dc,
1232 DeviceReset dev_reset,
1233 DeviceReset *parent_reset)
1234{
1235 *parent_reset = dc->reset;
1236 dc->reset = dev_reset;
1237}
1238
1239void device_class_set_parent_realize(DeviceClass *dc,
1240 DeviceRealize dev_realize,
1241 DeviceRealize *parent_realize)
1242{
1243 *parent_realize = dc->realize;
1244 dc->realize = dev_realize;
1245}
1246
1247void device_class_set_parent_unrealize(DeviceClass *dc,
1248 DeviceUnrealize dev_unrealize,
1249 DeviceUnrealize *parent_unrealize)
1250{
1251 *parent_unrealize = dc->unrealize;
1252 dc->unrealize = dev_unrealize;
1253}
1254
1255void device_legacy_reset(DeviceState *dev)
1256{
1257 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1258
1259 trace_qdev_reset(dev, object_get_typename(OBJECT(dev)));
1260 if (klass->reset) {
1261 klass->reset(dev);
1262 }
1263}
1264
1265Object *qdev_get_machine(void)
1266{
1267 static Object *dev;
1268
1269 if (dev == NULL) {
1270 dev = container_get(object_get_root(), "/machine");
1271 }
1272
1273 return dev;
1274}
1275
1276static const TypeInfo device_type_info = {
1277 .name = TYPE_DEVICE,
1278 .parent = TYPE_OBJECT,
1279 .instance_size = sizeof(DeviceState),
1280 .instance_init = device_initfn,
1281 .instance_post_init = device_post_init,
1282 .instance_finalize = device_finalize,
1283 .class_base_init = device_class_base_init,
1284 .class_init = device_class_init,
1285 .abstract = true,
1286 .class_size = sizeof(DeviceClass),
1287 .interfaces = (InterfaceInfo[]) {
1288 { TYPE_VMSTATE_IF },
1289 { TYPE_RESETTABLE_INTERFACE },
1290 { }
1291 }
1292};
1293
1294static void qdev_register_types(void)
1295{
1296 type_register_static(&device_type_info);
1297}
1298
1299type_init(qdev_register_types)
1300