]> git.proxmox.com Git - mirror_qemu.git/blob - hw/core/qdev.c
2eacac0787af6e6d042f566d3a3ed87fec52c6c4
[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 "hw/qdev.h"
29 #include "hw/fw-path-provider.h"
30 #include "sysemu/sysemu.h"
31 #include "qapi/error.h"
32 #include "qapi/qmp/qerror.h"
33 #include "qapi/visitor.h"
34 #include "qapi/qmp/qjson.h"
35 #include "hw/hotplug.h"
36 #include "hw/boards.h"
37 #include "qapi-event.h"
38
39 int qdev_hotplug = 0;
40 static bool qdev_hot_added = false;
41 static bool qdev_hot_removed = false;
42
43 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
44 {
45 DeviceClass *dc = DEVICE_GET_CLASS(dev);
46 return dc->vmsd;
47 }
48
49 const char *qdev_fw_name(DeviceState *dev)
50 {
51 DeviceClass *dc = DEVICE_GET_CLASS(dev);
52
53 if (dc->fw_name) {
54 return dc->fw_name;
55 }
56
57 return object_get_typename(OBJECT(dev));
58 }
59
60 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
61 Error **errp);
62
63 static void bus_remove_child(BusState *bus, DeviceState *child)
64 {
65 BusChild *kid;
66
67 QTAILQ_FOREACH(kid, &bus->children, sibling) {
68 if (kid->child == child) {
69 char name[32];
70
71 snprintf(name, sizeof(name), "child[%d]", kid->index);
72 QTAILQ_REMOVE(&bus->children, kid, sibling);
73
74 /* This gives back ownership of kid->child back to us. */
75 object_property_del(OBJECT(bus), name, NULL);
76 object_unref(OBJECT(kid->child));
77 g_free(kid);
78 return;
79 }
80 }
81 }
82
83 static void bus_add_child(BusState *bus, DeviceState *child)
84 {
85 char name[32];
86 BusChild *kid = g_malloc0(sizeof(*kid));
87
88 kid->index = bus->max_index++;
89 kid->child = child;
90 object_ref(OBJECT(kid->child));
91
92 QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
93
94 /* This transfers ownership of kid->child to the property. */
95 snprintf(name, sizeof(name), "child[%d]", kid->index);
96 object_property_add_link(OBJECT(bus), name,
97 object_get_typename(OBJECT(child)),
98 (Object **)&kid->child,
99 NULL, /* read-only property */
100 0, /* return ownership on prop deletion */
101 NULL);
102 }
103
104 void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
105 {
106 dev->parent_bus = bus;
107 object_ref(OBJECT(bus));
108 bus_add_child(bus, dev);
109 }
110
111 static void qbus_set_hotplug_handler_internal(BusState *bus, Object *handler,
112 Error **errp)
113 {
114
115 object_property_set_link(OBJECT(bus), OBJECT(handler),
116 QDEV_HOTPLUG_HANDLER_PROPERTY, errp);
117 }
118
119 void qbus_set_hotplug_handler(BusState *bus, DeviceState *handler, Error **errp)
120 {
121 qbus_set_hotplug_handler_internal(bus, OBJECT(handler), errp);
122 }
123
124 void qbus_set_bus_hotplug_handler(BusState *bus, Error **errp)
125 {
126 qbus_set_hotplug_handler_internal(bus, OBJECT(bus), errp);
127 }
128
129 /* Create a new device. This only initializes the device state structure
130 and allows properties to be set. qdev_init should be called to
131 initialize the actual device emulation. */
132 DeviceState *qdev_create(BusState *bus, const char *name)
133 {
134 DeviceState *dev;
135
136 dev = qdev_try_create(bus, name);
137 if (!dev) {
138 if (bus) {
139 error_report("Unknown device '%s' for bus '%s'", name,
140 object_get_typename(OBJECT(bus)));
141 } else {
142 error_report("Unknown device '%s' for default sysbus", name);
143 }
144 abort();
145 }
146
147 return dev;
148 }
149
150 DeviceState *qdev_try_create(BusState *bus, const char *type)
151 {
152 DeviceState *dev;
153
154 if (object_class_by_name(type) == NULL) {
155 return NULL;
156 }
157 dev = DEVICE(object_new(type));
158 if (!dev) {
159 return NULL;
160 }
161
162 if (!bus) {
163 bus = sysbus_get_default();
164 }
165
166 qdev_set_parent_bus(dev, bus);
167 object_unref(OBJECT(dev));
168 return dev;
169 }
170
171 /* Initialize a device. Device properties should be set before calling
172 this function. IRQs and MMIO regions should be connected/mapped after
173 calling this function.
174 On failure, destroy the device and return negative value.
175 Return 0 on success. */
176 int qdev_init(DeviceState *dev)
177 {
178 Error *local_err = NULL;
179
180 assert(!dev->realized);
181
182 object_property_set_bool(OBJECT(dev), true, "realized", &local_err);
183 if (local_err != NULL) {
184 qerror_report_err(local_err);
185 error_free(local_err);
186 object_unparent(OBJECT(dev));
187 return -1;
188 }
189 return 0;
190 }
191
192 static QTAILQ_HEAD(device_listeners, DeviceListener) device_listeners
193 = QTAILQ_HEAD_INITIALIZER(device_listeners);
194
195 enum ListenerDirection { Forward, Reverse };
196
197 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \
198 do { \
199 DeviceListener *_listener; \
200 \
201 switch (_direction) { \
202 case Forward: \
203 QTAILQ_FOREACH(_listener, &device_listeners, link) { \
204 if (_listener->_callback) { \
205 _listener->_callback(_listener, ##_args); \
206 } \
207 } \
208 break; \
209 case Reverse: \
210 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \
211 device_listeners, link) { \
212 if (_listener->_callback) { \
213 _listener->_callback(_listener, ##_args); \
214 } \
215 } \
216 break; \
217 default: \
218 abort(); \
219 } \
220 } while (0)
221
222 static int device_listener_add(DeviceState *dev, void *opaque)
223 {
224 DEVICE_LISTENER_CALL(realize, Forward, dev);
225
226 return 0;
227 }
228
229 void device_listener_register(DeviceListener *listener)
230 {
231 QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
232
233 qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
234 NULL, NULL);
235 }
236
237 void device_listener_unregister(DeviceListener *listener)
238 {
239 QTAILQ_REMOVE(&device_listeners, listener, link);
240 }
241
242 static void device_realize(DeviceState *dev, Error **errp)
243 {
244 DeviceClass *dc = DEVICE_GET_CLASS(dev);
245
246 if (dc->init) {
247 int rc = dc->init(dev);
248 if (rc < 0) {
249 error_setg(errp, "Device initialization failed.");
250 return;
251 }
252 }
253 }
254
255 static void device_unrealize(DeviceState *dev, Error **errp)
256 {
257 DeviceClass *dc = DEVICE_GET_CLASS(dev);
258
259 if (dc->exit) {
260 int rc = dc->exit(dev);
261 if (rc < 0) {
262 error_setg(errp, "Device exit failed.");
263 return;
264 }
265 }
266 }
267
268 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
269 int required_for_version)
270 {
271 assert(!dev->realized);
272 dev->instance_id_alias = alias_id;
273 dev->alias_required_for_version = required_for_version;
274 }
275
276 static HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
277 {
278 HotplugHandler *hotplug_ctrl = NULL;
279
280 if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
281 hotplug_ctrl = dev->parent_bus->hotplug_handler;
282 } else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) {
283 MachineState *machine = MACHINE(qdev_get_machine());
284 MachineClass *mc = MACHINE_GET_CLASS(machine);
285
286 if (mc->get_hotplug_handler) {
287 hotplug_ctrl = mc->get_hotplug_handler(machine, dev);
288 }
289 }
290 return hotplug_ctrl;
291 }
292
293 void qdev_unplug(DeviceState *dev, Error **errp)
294 {
295 DeviceClass *dc = DEVICE_GET_CLASS(dev);
296 HotplugHandler *hotplug_ctrl;
297 HotplugHandlerClass *hdc;
298
299 if (dev->parent_bus && !qbus_is_hotpluggable(dev->parent_bus)) {
300 error_set(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
301 return;
302 }
303
304 if (!dc->hotpluggable) {
305 error_set(errp, QERR_DEVICE_NO_HOTPLUG,
306 object_get_typename(OBJECT(dev)));
307 return;
308 }
309
310 qdev_hot_removed = true;
311
312 hotplug_ctrl = qdev_get_hotplug_handler(dev);
313 /* hotpluggable device MUST have HotplugHandler, if it doesn't
314 * then something is very wrong with it */
315 g_assert(hotplug_ctrl);
316
317 /* If device supports async unplug just request it to be done,
318 * otherwise just remove it synchronously */
319 hdc = HOTPLUG_HANDLER_GET_CLASS(hotplug_ctrl);
320 if (hdc->unplug_request) {
321 hotplug_handler_unplug_request(hotplug_ctrl, dev, errp);
322 } else {
323 hotplug_handler_unplug(hotplug_ctrl, dev, errp);
324 }
325 }
326
327 static int qdev_reset_one(DeviceState *dev, void *opaque)
328 {
329 device_reset(dev);
330
331 return 0;
332 }
333
334 static int qbus_reset_one(BusState *bus, void *opaque)
335 {
336 BusClass *bc = BUS_GET_CLASS(bus);
337 if (bc->reset) {
338 bc->reset(bus);
339 }
340 return 0;
341 }
342
343 void qdev_reset_all(DeviceState *dev)
344 {
345 qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
346 }
347
348 void qbus_reset_all(BusState *bus)
349 {
350 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
351 }
352
353 void qbus_reset_all_fn(void *opaque)
354 {
355 BusState *bus = opaque;
356 qbus_reset_all(bus);
357 }
358
359 /* can be used as ->unplug() callback for the simple cases */
360 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
361 DeviceState *dev, Error **errp)
362 {
363 /* just zap it */
364 object_unparent(OBJECT(dev));
365 }
366
367 /* Like qdev_init(), but terminate program via error_report() instead of
368 returning an error value. This is okay during machine creation.
369 Don't use for hotplug, because there callers need to recover from
370 failure. Exception: if you know the device's init() callback can't
371 fail, then qdev_init_nofail() can't fail either, and is therefore
372 usable even then. But relying on the device implementation that
373 way is somewhat unclean, and best avoided. */
374 void qdev_init_nofail(DeviceState *dev)
375 {
376 const char *typename = object_get_typename(OBJECT(dev));
377
378 if (qdev_init(dev) < 0) {
379 error_report("Initialization of device %s failed", typename);
380 exit(1);
381 }
382 }
383
384 void qdev_machine_creation_done(void)
385 {
386 /*
387 * ok, initial machine setup is done, starting from now we can
388 * only create hotpluggable devices
389 */
390 qdev_hotplug = 1;
391 }
392
393 bool qdev_machine_modified(void)
394 {
395 return qdev_hot_added || qdev_hot_removed;
396 }
397
398 BusState *qdev_get_parent_bus(DeviceState *dev)
399 {
400 return dev->parent_bus;
401 }
402
403 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
404 const char *name)
405 {
406 NamedGPIOList *ngl;
407
408 QLIST_FOREACH(ngl, &dev->gpios, node) {
409 /* NULL is a valid and matchable name, otherwise do a normal
410 * strcmp match.
411 */
412 if ((!ngl->name && !name) ||
413 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
414 return ngl;
415 }
416 }
417
418 ngl = g_malloc0(sizeof(*ngl));
419 ngl->name = g_strdup(name);
420 QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
421 return ngl;
422 }
423
424 void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
425 const char *name, int n)
426 {
427 int i;
428 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
429 char *propname = g_strdup_printf("%s[*]", name ? name : "unnamed-gpio-in");
430
431 assert(gpio_list->num_out == 0 || !name);
432 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
433 dev, n);
434
435 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
436 object_property_add_child(OBJECT(dev), propname,
437 OBJECT(gpio_list->in[i]), &error_abort);
438 }
439 g_free(propname);
440
441 gpio_list->num_in += n;
442 }
443
444 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
445 {
446 qdev_init_gpio_in_named(dev, handler, NULL, n);
447 }
448
449 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
450 const char *name, int n)
451 {
452 int i;
453 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
454 char *propname = g_strdup_printf("%s[*]", name ? name : "unnamed-gpio-out");
455
456 assert(gpio_list->num_in == 0 || !name);
457 gpio_list->num_out += n;
458
459 for (i = 0; i < n; ++i) {
460 memset(&pins[i], 0, sizeof(*pins));
461 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
462 (Object **)&pins[i],
463 object_property_allow_set_link,
464 OBJ_PROP_LINK_UNREF_ON_RELEASE,
465 &error_abort);
466 }
467 g_free(propname);
468 }
469
470 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
471 {
472 qdev_init_gpio_out_named(dev, pins, NULL, n);
473 }
474
475 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
476 {
477 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
478
479 assert(n >= 0 && n < gpio_list->num_in);
480 return gpio_list->in[n];
481 }
482
483 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
484 {
485 return qdev_get_gpio_in_named(dev, NULL, n);
486 }
487
488 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
489 qemu_irq pin)
490 {
491 char *propname = g_strdup_printf("%s[%d]",
492 name ? name : "unnamed-gpio-out", n);
493 if (pin) {
494 /* We need a name for object_property_set_link to work. If the
495 * object has a parent, object_property_add_child will come back
496 * with an error without doing anything. If it has none, it will
497 * never fail. So we can just call it with a NULL Error pointer.
498 */
499 object_property_add_child(qdev_get_machine(), "non-qdev-gpio[*]",
500 OBJECT(pin), NULL);
501 }
502 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
503 g_free(propname);
504 }
505
506 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
507 {
508 char *propname = g_strdup_printf("%s[%d]",
509 name ? name : "unnamed-gpio-out", n);
510
511 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
512 NULL);
513
514 return ret;
515 }
516
517 /* disconnect a GPIO ouput, returning the disconnected input (if any) */
518
519 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
520 const char *name, int n)
521 {
522 char *propname = g_strdup_printf("%s[%d]",
523 name ? name : "unnamed-gpio-out", n);
524
525 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
526 NULL);
527 if (ret) {
528 object_property_set_link(OBJECT(dev), NULL, propname, NULL);
529 }
530 g_free(propname);
531 return ret;
532 }
533
534 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
535 const char *name, int n)
536 {
537 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
538 qdev_connect_gpio_out_named(dev, name, n, icpt);
539 return disconnected;
540 }
541
542 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
543 {
544 qdev_connect_gpio_out_named(dev, NULL, n, pin);
545 }
546
547 void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
548 const char *name)
549 {
550 int i;
551 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
552
553 for (i = 0; i < ngl->num_in; i++) {
554 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
555 char *propname = g_strdup_printf("%s[%d]", nm, i);
556
557 object_property_add_alias(OBJECT(container), propname,
558 OBJECT(dev), propname,
559 &error_abort);
560 }
561 for (i = 0; i < ngl->num_out; i++) {
562 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
563 char *propname = g_strdup_printf("%s[%d]", nm, i);
564
565 object_property_add_alias(OBJECT(container), propname,
566 OBJECT(dev), propname,
567 &error_abort);
568 }
569 QLIST_REMOVE(ngl, node);
570 QLIST_INSERT_HEAD(&container->gpios, ngl, node);
571 }
572
573 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
574 {
575 BusState *bus;
576
577 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
578 if (strcmp(name, bus->name) == 0) {
579 return bus;
580 }
581 }
582 return NULL;
583 }
584
585 int qbus_walk_children(BusState *bus,
586 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
587 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
588 void *opaque)
589 {
590 BusChild *kid;
591 int err;
592
593 if (pre_busfn) {
594 err = pre_busfn(bus, opaque);
595 if (err) {
596 return err;
597 }
598 }
599
600 QTAILQ_FOREACH(kid, &bus->children, sibling) {
601 err = qdev_walk_children(kid->child,
602 pre_devfn, pre_busfn,
603 post_devfn, post_busfn, opaque);
604 if (err < 0) {
605 return err;
606 }
607 }
608
609 if (post_busfn) {
610 err = post_busfn(bus, opaque);
611 if (err) {
612 return err;
613 }
614 }
615
616 return 0;
617 }
618
619 int qdev_walk_children(DeviceState *dev,
620 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
621 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
622 void *opaque)
623 {
624 BusState *bus;
625 int err;
626
627 if (pre_devfn) {
628 err = pre_devfn(dev, opaque);
629 if (err) {
630 return err;
631 }
632 }
633
634 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
635 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
636 post_devfn, post_busfn, opaque);
637 if (err < 0) {
638 return err;
639 }
640 }
641
642 if (post_devfn) {
643 err = post_devfn(dev, opaque);
644 if (err) {
645 return err;
646 }
647 }
648
649 return 0;
650 }
651
652 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
653 {
654 BusChild *kid;
655 DeviceState *ret;
656 BusState *child;
657
658 QTAILQ_FOREACH(kid, &bus->children, sibling) {
659 DeviceState *dev = kid->child;
660
661 if (dev->id && strcmp(dev->id, id) == 0) {
662 return dev;
663 }
664
665 QLIST_FOREACH(child, &dev->child_bus, sibling) {
666 ret = qdev_find_recursive(child, id);
667 if (ret) {
668 return ret;
669 }
670 }
671 }
672 return NULL;
673 }
674
675 static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
676 {
677 const char *typename = object_get_typename(OBJECT(bus));
678 BusClass *bc;
679 char *buf;
680 int i, len, bus_id;
681
682 bus->parent = parent;
683
684 if (name) {
685 bus->name = g_strdup(name);
686 } else if (bus->parent && bus->parent->id) {
687 /* parent device has id -> use it plus parent-bus-id for bus name */
688 bus_id = bus->parent->num_child_bus;
689
690 len = strlen(bus->parent->id) + 16;
691 buf = g_malloc(len);
692 snprintf(buf, len, "%s.%d", bus->parent->id, bus_id);
693 bus->name = buf;
694 } else {
695 /* no id -> use lowercase bus type plus global bus-id for bus name */
696 bc = BUS_GET_CLASS(bus);
697 bus_id = bc->automatic_ids++;
698
699 len = strlen(typename) + 16;
700 buf = g_malloc(len);
701 len = snprintf(buf, len, "%s.%d", typename, bus_id);
702 for (i = 0; i < len; i++) {
703 buf[i] = qemu_tolower(buf[i]);
704 }
705 bus->name = buf;
706 }
707
708 if (bus->parent) {
709 QLIST_INSERT_HEAD(&bus->parent->child_bus, bus, sibling);
710 bus->parent->num_child_bus++;
711 object_property_add_child(OBJECT(bus->parent), bus->name, OBJECT(bus), NULL);
712 object_unref(OBJECT(bus));
713 } else if (bus != sysbus_get_default()) {
714 /* TODO: once all bus devices are qdevified,
715 only reset handler for main_system_bus should be registered here. */
716 qemu_register_reset(qbus_reset_all_fn, bus);
717 }
718 }
719
720 static void bus_unparent(Object *obj)
721 {
722 BusState *bus = BUS(obj);
723 BusChild *kid;
724
725 while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) {
726 DeviceState *dev = kid->child;
727 object_unparent(OBJECT(dev));
728 }
729 if (bus->parent) {
730 QLIST_REMOVE(bus, sibling);
731 bus->parent->num_child_bus--;
732 bus->parent = NULL;
733 } else {
734 assert(bus != sysbus_get_default()); /* main_system_bus is never freed */
735 qemu_unregister_reset(qbus_reset_all_fn, bus);
736 }
737 }
738
739 static bool bus_get_realized(Object *obj, Error **errp)
740 {
741 BusState *bus = BUS(obj);
742
743 return bus->realized;
744 }
745
746 static void bus_set_realized(Object *obj, bool value, Error **errp)
747 {
748 BusState *bus = BUS(obj);
749 BusClass *bc = BUS_GET_CLASS(bus);
750 BusChild *kid;
751 Error *local_err = NULL;
752
753 if (value && !bus->realized) {
754 if (bc->realize) {
755 bc->realize(bus, &local_err);
756 }
757
758 /* TODO: recursive realization */
759 } else if (!value && bus->realized) {
760 QTAILQ_FOREACH(kid, &bus->children, sibling) {
761 DeviceState *dev = kid->child;
762 object_property_set_bool(OBJECT(dev), false, "realized",
763 &local_err);
764 if (local_err != NULL) {
765 break;
766 }
767 }
768 if (bc->unrealize && local_err == NULL) {
769 bc->unrealize(bus, &local_err);
770 }
771 }
772
773 if (local_err != NULL) {
774 error_propagate(errp, local_err);
775 return;
776 }
777
778 bus->realized = value;
779 }
780
781 void qbus_create_inplace(void *bus, size_t size, const char *typename,
782 DeviceState *parent, const char *name)
783 {
784 object_initialize(bus, size, typename);
785 qbus_realize(bus, parent, name);
786 }
787
788 BusState *qbus_create(const char *typename, DeviceState *parent, const char *name)
789 {
790 BusState *bus;
791
792 bus = BUS(object_new(typename));
793 qbus_realize(bus, parent, name);
794
795 return bus;
796 }
797
798 static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
799 {
800 BusClass *bc = BUS_GET_CLASS(bus);
801
802 if (bc->get_fw_dev_path) {
803 return bc->get_fw_dev_path(dev);
804 }
805
806 return NULL;
807 }
808
809 static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
810 {
811 Object *obj = OBJECT(dev);
812 char *d = NULL;
813
814 while (!d && obj->parent) {
815 obj = obj->parent;
816 d = fw_path_provider_try_get_dev_path(obj, bus, dev);
817 }
818 return d;
819 }
820
821 static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
822 {
823 int l = 0;
824
825 if (dev && dev->parent_bus) {
826 char *d;
827 l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
828 d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
829 if (!d) {
830 d = bus_get_fw_dev_path(dev->parent_bus, dev);
831 }
832 if (d) {
833 l += snprintf(p + l, size - l, "%s", d);
834 g_free(d);
835 } else {
836 return l;
837 }
838 }
839 l += snprintf(p + l , size - l, "/");
840
841 return l;
842 }
843
844 char* qdev_get_fw_dev_path(DeviceState *dev)
845 {
846 char path[128];
847 int l;
848
849 l = qdev_get_fw_dev_path_helper(dev, path, 128);
850
851 path[l-1] = '\0';
852
853 return g_strdup(path);
854 }
855
856 char *qdev_get_dev_path(DeviceState *dev)
857 {
858 BusClass *bc;
859
860 if (!dev || !dev->parent_bus) {
861 return NULL;
862 }
863
864 bc = BUS_GET_CLASS(dev->parent_bus);
865 if (bc->get_dev_path) {
866 return bc->get_dev_path(dev);
867 }
868
869 return NULL;
870 }
871
872 /**
873 * Legacy property handling
874 */
875
876 static void qdev_get_legacy_property(Object *obj, Visitor *v, void *opaque,
877 const char *name, Error **errp)
878 {
879 DeviceState *dev = DEVICE(obj);
880 Property *prop = opaque;
881
882 char buffer[1024];
883 char *ptr = buffer;
884
885 prop->info->print(dev, prop, buffer, sizeof(buffer));
886 visit_type_str(v, &ptr, name, errp);
887 }
888
889 /**
890 * @qdev_add_legacy_property - adds a legacy property
891 *
892 * Do not use this is new code! Properties added through this interface will
893 * be given names and types in the "legacy" namespace.
894 *
895 * Legacy properties are string versions of other OOM properties. The format
896 * of the string depends on the property type.
897 */
898 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
899 Error **errp)
900 {
901 gchar *name;
902
903 /* Register pointer properties as legacy properties */
904 if (!prop->info->print && prop->info->get) {
905 return;
906 }
907
908 name = g_strdup_printf("legacy-%s", prop->name);
909 object_property_add(OBJECT(dev), name, "str",
910 prop->info->print ? qdev_get_legacy_property : prop->info->get,
911 NULL,
912 NULL,
913 prop, errp);
914
915 g_free(name);
916 }
917
918 /**
919 * @qdev_property_add_static - add a @Property to a device.
920 *
921 * Static properties access data in a struct. The actual type of the
922 * property and the field depends on the property type.
923 */
924 void qdev_property_add_static(DeviceState *dev, Property *prop,
925 Error **errp)
926 {
927 Error *local_err = NULL;
928 Object *obj = OBJECT(dev);
929
930 /*
931 * TODO qdev_prop_ptr does not have getters or setters. It must
932 * go now that it can be replaced with links. The test should be
933 * removed along with it: all static properties are read/write.
934 */
935 if (!prop->info->get && !prop->info->set) {
936 return;
937 }
938
939 object_property_add(obj, prop->name, prop->info->name,
940 prop->info->get, prop->info->set,
941 prop->info->release,
942 prop, &local_err);
943
944 if (local_err) {
945 error_propagate(errp, local_err);
946 return;
947 }
948
949 object_property_set_description(obj, prop->name,
950 prop->info->description,
951 &error_abort);
952
953 if (prop->qtype == QTYPE_NONE) {
954 return;
955 }
956
957 if (prop->qtype == QTYPE_QBOOL) {
958 object_property_set_bool(obj, prop->defval, prop->name, &error_abort);
959 } else if (prop->info->enum_table) {
960 object_property_set_str(obj, prop->info->enum_table[prop->defval],
961 prop->name, &error_abort);
962 } else if (prop->qtype == QTYPE_QINT) {
963 object_property_set_int(obj, prop->defval, prop->name, &error_abort);
964 }
965 }
966
967 /* @qdev_alias_all_properties - Add alias properties to the source object for
968 * all qdev properties on the target DeviceState.
969 */
970 void qdev_alias_all_properties(DeviceState *target, Object *source)
971 {
972 ObjectClass *class;
973 Property *prop;
974
975 class = object_get_class(OBJECT(target));
976 do {
977 DeviceClass *dc = DEVICE_CLASS(class);
978
979 for (prop = dc->props; prop && prop->name; prop++) {
980 object_property_add_alias(source, prop->name,
981 OBJECT(target), prop->name,
982 &error_abort);
983 }
984 class = object_class_get_parent(class);
985 } while (class != object_class_by_name(TYPE_DEVICE));
986 }
987
988 static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
989 {
990 GSList **list = opaque;
991 DeviceState *dev = DEVICE(obj);
992
993 if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
994 *list = g_slist_append(*list, dev);
995 }
996
997 return 0;
998 }
999
1000 GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
1001 {
1002 GSList *list = NULL;
1003
1004 object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
1005
1006 return list;
1007 }
1008
1009 static bool device_get_realized(Object *obj, Error **errp)
1010 {
1011 DeviceState *dev = DEVICE(obj);
1012 return dev->realized;
1013 }
1014
1015 static void device_set_realized(Object *obj, bool value, Error **errp)
1016 {
1017 DeviceState *dev = DEVICE(obj);
1018 DeviceClass *dc = DEVICE_GET_CLASS(dev);
1019 HotplugHandler *hotplug_ctrl;
1020 BusState *bus;
1021 Error *local_err = NULL;
1022
1023 if (dev->hotplugged && !dc->hotpluggable) {
1024 error_set(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
1025 return;
1026 }
1027
1028 if (value && !dev->realized) {
1029 if (!obj->parent) {
1030 static int unattached_count;
1031 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
1032
1033 object_property_add_child(container_get(qdev_get_machine(),
1034 "/unattached"),
1035 name, obj, &error_abort);
1036 g_free(name);
1037 }
1038
1039 if (dc->realize) {
1040 dc->realize(dev, &local_err);
1041 }
1042
1043 if (local_err != NULL) {
1044 goto fail;
1045 }
1046
1047 DEVICE_LISTENER_CALL(realize, Forward, dev);
1048
1049 hotplug_ctrl = qdev_get_hotplug_handler(dev);
1050 if (hotplug_ctrl) {
1051 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
1052 }
1053
1054 if (local_err != NULL) {
1055 goto post_realize_fail;
1056 }
1057
1058 if (qdev_get_vmsd(dev)) {
1059 vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
1060 dev->instance_id_alias,
1061 dev->alias_required_for_version);
1062 }
1063
1064 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1065 object_property_set_bool(OBJECT(bus), true, "realized",
1066 &local_err);
1067 if (local_err != NULL) {
1068 goto child_realize_fail;
1069 }
1070 }
1071 if (dev->hotplugged) {
1072 device_reset(dev);
1073 }
1074 dev->pending_deleted_event = false;
1075 } else if (!value && dev->realized) {
1076 Error **local_errp = NULL;
1077 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1078 local_errp = local_err ? NULL : &local_err;
1079 object_property_set_bool(OBJECT(bus), false, "realized",
1080 local_errp);
1081 }
1082 if (qdev_get_vmsd(dev)) {
1083 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
1084 }
1085 if (dc->unrealize) {
1086 local_errp = local_err ? NULL : &local_err;
1087 dc->unrealize(dev, local_errp);
1088 }
1089 dev->pending_deleted_event = true;
1090 DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
1091 }
1092
1093 if (local_err != NULL) {
1094 goto fail;
1095 }
1096
1097 dev->realized = value;
1098 return;
1099
1100 child_realize_fail:
1101 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
1102 object_property_set_bool(OBJECT(bus), false, "realized",
1103 NULL);
1104 }
1105
1106 if (qdev_get_vmsd(dev)) {
1107 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
1108 }
1109
1110 post_realize_fail:
1111 if (dc->unrealize) {
1112 dc->unrealize(dev, NULL);
1113 }
1114
1115 fail:
1116 error_propagate(errp, local_err);
1117 return;
1118 }
1119
1120 static bool device_get_hotpluggable(Object *obj, Error **errp)
1121 {
1122 DeviceClass *dc = DEVICE_GET_CLASS(obj);
1123 DeviceState *dev = DEVICE(obj);
1124
1125 return dc->hotpluggable && (dev->parent_bus == NULL ||
1126 qbus_is_hotpluggable(dev->parent_bus));
1127 }
1128
1129 static bool device_get_hotplugged(Object *obj, Error **err)
1130 {
1131 DeviceState *dev = DEVICE(obj);
1132
1133 return dev->hotplugged;
1134 }
1135
1136 static void device_set_hotplugged(Object *obj, bool value, Error **err)
1137 {
1138 DeviceState *dev = DEVICE(obj);
1139
1140 dev->hotplugged = value;
1141 }
1142
1143 static void device_initfn(Object *obj)
1144 {
1145 DeviceState *dev = DEVICE(obj);
1146 ObjectClass *class;
1147 Property *prop;
1148
1149 if (qdev_hotplug) {
1150 dev->hotplugged = 1;
1151 qdev_hot_added = true;
1152 }
1153
1154 dev->instance_id_alias = -1;
1155 dev->realized = false;
1156
1157 object_property_add_bool(obj, "realized",
1158 device_get_realized, device_set_realized, NULL);
1159 object_property_add_bool(obj, "hotpluggable",
1160 device_get_hotpluggable, NULL, NULL);
1161 object_property_add_bool(obj, "hotplugged",
1162 device_get_hotplugged, device_set_hotplugged,
1163 &error_abort);
1164
1165 class = object_get_class(OBJECT(dev));
1166 do {
1167 for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
1168 qdev_property_add_legacy(dev, prop, &error_abort);
1169 qdev_property_add_static(dev, prop, &error_abort);
1170 }
1171 class = object_class_get_parent(class);
1172 } while (class != object_class_by_name(TYPE_DEVICE));
1173
1174 object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
1175 (Object **)&dev->parent_bus, NULL, 0,
1176 &error_abort);
1177 QLIST_INIT(&dev->gpios);
1178 }
1179
1180 static void device_post_init(Object *obj)
1181 {
1182 Error *err = NULL;
1183 qdev_prop_set_globals(DEVICE(obj), &err);
1184 if (err) {
1185 qerror_report_err(err);
1186 error_free(err);
1187 exit(EXIT_FAILURE);
1188 }
1189 }
1190
1191 /* Unlink device from bus and free the structure. */
1192 static void device_finalize(Object *obj)
1193 {
1194 NamedGPIOList *ngl, *next;
1195
1196 DeviceState *dev = DEVICE(obj);
1197 qemu_opts_del(dev->opts);
1198
1199 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1200 QLIST_REMOVE(ngl, node);
1201 qemu_free_irqs(ngl->in, ngl->num_in);
1202 g_free(ngl->name);
1203 g_free(ngl);
1204 /* ngl->out irqs are owned by the other end and should not be freed
1205 * here
1206 */
1207 }
1208 }
1209
1210 static void device_class_base_init(ObjectClass *class, void *data)
1211 {
1212 DeviceClass *klass = DEVICE_CLASS(class);
1213
1214 /* We explicitly look up properties in the superclasses,
1215 * so do not propagate them to the subclasses.
1216 */
1217 klass->props = NULL;
1218 }
1219
1220 static void device_unparent(Object *obj)
1221 {
1222 DeviceState *dev = DEVICE(obj);
1223 BusState *bus;
1224
1225 if (dev->realized) {
1226 object_property_set_bool(obj, false, "realized", NULL);
1227 }
1228 while (dev->num_child_bus) {
1229 bus = QLIST_FIRST(&dev->child_bus);
1230 object_unparent(OBJECT(bus));
1231 }
1232 if (dev->parent_bus) {
1233 bus_remove_child(dev->parent_bus, dev);
1234 object_unref(OBJECT(dev->parent_bus));
1235 dev->parent_bus = NULL;
1236 }
1237
1238 /* Only send event if the device had been completely realized */
1239 if (dev->pending_deleted_event) {
1240 gchar *path = object_get_canonical_path(OBJECT(dev));
1241
1242 qapi_event_send_device_deleted(!!dev->id, dev->id, path, &error_abort);
1243 g_free(path);
1244 }
1245 }
1246
1247 static void device_class_init(ObjectClass *class, void *data)
1248 {
1249 DeviceClass *dc = DEVICE_CLASS(class);
1250
1251 class->unparent = device_unparent;
1252 dc->realize = device_realize;
1253 dc->unrealize = device_unrealize;
1254
1255 /* by default all devices were considered as hotpluggable,
1256 * so with intent to check it in generic qdev_unplug() /
1257 * device_set_realized() functions make every device
1258 * hotpluggable. Devices that shouldn't be hotpluggable,
1259 * should override it in their class_init()
1260 */
1261 dc->hotpluggable = true;
1262 }
1263
1264 void device_reset(DeviceState *dev)
1265 {
1266 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1267
1268 if (klass->reset) {
1269 klass->reset(dev);
1270 }
1271 }
1272
1273 Object *qdev_get_machine(void)
1274 {
1275 static Object *dev;
1276
1277 if (dev == NULL) {
1278 dev = container_get(object_get_root(), "/machine");
1279 }
1280
1281 return dev;
1282 }
1283
1284 static const TypeInfo device_type_info = {
1285 .name = TYPE_DEVICE,
1286 .parent = TYPE_OBJECT,
1287 .instance_size = sizeof(DeviceState),
1288 .instance_init = device_initfn,
1289 .instance_post_init = device_post_init,
1290 .instance_finalize = device_finalize,
1291 .class_base_init = device_class_base_init,
1292 .class_init = device_class_init,
1293 .abstract = true,
1294 .class_size = sizeof(DeviceClass),
1295 };
1296
1297 static void qbus_initfn(Object *obj)
1298 {
1299 BusState *bus = BUS(obj);
1300
1301 QTAILQ_INIT(&bus->children);
1302 object_property_add_link(obj, QDEV_HOTPLUG_HANDLER_PROPERTY,
1303 TYPE_HOTPLUG_HANDLER,
1304 (Object **)&bus->hotplug_handler,
1305 object_property_allow_set_link,
1306 OBJ_PROP_LINK_UNREF_ON_RELEASE,
1307 NULL);
1308 object_property_add_bool(obj, "realized",
1309 bus_get_realized, bus_set_realized, NULL);
1310 }
1311
1312 static char *default_bus_get_fw_dev_path(DeviceState *dev)
1313 {
1314 return g_strdup(object_get_typename(OBJECT(dev)));
1315 }
1316
1317 static void bus_class_init(ObjectClass *class, void *data)
1318 {
1319 BusClass *bc = BUS_CLASS(class);
1320
1321 class->unparent = bus_unparent;
1322 bc->get_fw_dev_path = default_bus_get_fw_dev_path;
1323 }
1324
1325 static void qbus_finalize(Object *obj)
1326 {
1327 BusState *bus = BUS(obj);
1328
1329 g_free((char *)bus->name);
1330 }
1331
1332 static const TypeInfo bus_info = {
1333 .name = TYPE_BUS,
1334 .parent = TYPE_OBJECT,
1335 .instance_size = sizeof(BusState),
1336 .abstract = true,
1337 .class_size = sizeof(BusClass),
1338 .instance_init = qbus_initfn,
1339 .instance_finalize = qbus_finalize,
1340 .class_init = bus_class_init,
1341 };
1342
1343 static void qdev_register_types(void)
1344 {
1345 type_register_static(&bus_info);
1346 type_register_static(&device_type_info);
1347 }
1348
1349 type_init(qdev_register_types)