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