]> git.proxmox.com Git - mirror_qemu.git/blame - hw/core/qdev.c
migration: allow unplug during migration for failover devices
[mirror_qemu.git] / hw / core / qdev.c
CommitLineData
aae9460e
PB
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
8167ee88 17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
aae9460e
PB
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
18c86e2b 28#include "qemu/osdep.h"
e688df6b 29#include "qapi/error.h"
c577ff62 30#include "qapi/qapi-events-qdev.h"
b4a42f81 31#include "qapi/qmp/qerror.h"
7b1b5d19 32#include "qapi/visitor.h"
d49b6836 33#include "qemu/error-report.h"
922a01a0 34#include "qemu/option.h"
0ee4de6c 35#include "hw/hotplug.h"
64552b6b 36#include "hw/irq.h"
a27bd6c7 37#include "hw/qdev-properties.h"
b7454548 38#include "hw/boards.h"
7474f1be 39#include "hw/sysbus.h"
d6454270 40#include "migration/vmstate.h"
aae9460e 41
9bed84c1 42bool qdev_hotplug = false;
0ac8ef71 43static bool qdev_hot_added = false;
21def24a 44bool qdev_hot_removed = false;
3418bd25 45
4be9f0d1
AL
46const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
47{
6e008585
AL
48 DeviceClass *dc = DEVICE_GET_CLASS(dev);
49 return dc->vmsd;
4be9f0d1
AL
50}
51
0866aca1 52static void bus_remove_child(BusState *bus, DeviceState *child)
0c17542d 53{
0866aca1
AL
54 BusChild *kid;
55
56 QTAILQ_FOREACH(kid, &bus->children, sibling) {
57 if (kid->child == child) {
58 char name[32];
59
60 snprintf(name, sizeof(name), "child[%d]", kid->index);
61 QTAILQ_REMOVE(&bus->children, kid, sibling);
9d127820 62
12b2e9f3
TK
63 bus->num_children--;
64
9d127820 65 /* This gives back ownership of kid->child back to us. */
0866aca1 66 object_property_del(OBJECT(bus), name, NULL);
9d127820 67 object_unref(OBJECT(kid->child));
0866aca1
AL
68 g_free(kid);
69 return;
70 }
71 }
72}
73
74static void bus_add_child(BusState *bus, DeviceState *child)
75{
76 char name[32];
77 BusChild *kid = g_malloc0(sizeof(*kid));
0c17542d 78
12b2e9f3 79 bus->num_children++;
0866aca1
AL
80 kid->index = bus->max_index++;
81 kid->child = child;
9d127820 82 object_ref(OBJECT(kid->child));
a5296ca9 83
0866aca1
AL
84 QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);
85
9d127820 86 /* This transfers ownership of kid->child to the property. */
0866aca1
AL
87 snprintf(name, sizeof(name), "child[%d]", kid->index);
88 object_property_add_link(OBJECT(bus), name,
89 object_get_typename(OBJECT(child)),
39f72ef9
SH
90 (Object **)&kid->child,
91 NULL, /* read-only property */
92 0, /* return ownership on prop deletion */
93 NULL);
0866aca1
AL
94}
95
96void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
97{
91c968ac
PM
98 bool replugging = dev->parent_bus != NULL;
99
100 if (replugging) {
101 /* Keep a reference to the device while it's not plugged into
102 * any bus, to avoid it potentially evaporating when it is
103 * dereffed in bus_remove_child().
104 */
105 object_ref(OBJECT(dev));
106 bus_remove_child(dev->parent_bus, dev);
107 object_unref(OBJECT(dev->parent_bus));
108 }
9fbe6127 109 dev->parent_bus = bus;
62d7ba66 110 object_ref(OBJECT(bus));
0866aca1 111 bus_add_child(bus, dev);
91c968ac
PM
112 if (replugging) {
113 object_unref(OBJECT(dev));
114 }
0c17542d
MA
115}
116
0210afe6
MA
117/* Create a new device. This only initializes the device state
118 structure and allows properties to be set. The device still needs
119 to be realized. See qdev-core.h. */
02e2da45 120DeviceState *qdev_create(BusState *bus, const char *name)
0bcdeda7
BS
121{
122 DeviceState *dev;
123
124 dev = qdev_try_create(bus, name);
125 if (!dev) {
e92714c7 126 if (bus) {
312fd5f2 127 error_report("Unknown device '%s' for bus '%s'", name,
23e3fbec 128 object_get_typename(OBJECT(bus)));
e92714c7 129 } else {
312fd5f2 130 error_report("Unknown device '%s' for default sysbus", name);
e92714c7 131 }
01ed1d52 132 abort();
0bcdeda7
BS
133 }
134
135 return dev;
136}
137
da57febf 138DeviceState *qdev_try_create(BusState *bus, const char *type)
aae9460e 139{
9fbe6127
AL
140 DeviceState *dev;
141
da57febf 142 if (object_class_by_name(type) == NULL) {
4ed658ca
AF
143 return NULL;
144 }
da57febf 145 dev = DEVICE(object_new(type));
9fbe6127
AL
146 if (!dev) {
147 return NULL;
148 }
149
10c4c98a 150 if (!bus) {
7474f1be
PM
151 /* Assert that the device really is a SysBusDevice before
152 * we put it onto the sysbus. Non-sysbus devices which aren't
153 * being put onto a bus should be created with object_new(TYPE_FOO),
154 * not qdev_create(NULL, TYPE_FOO).
155 */
156 g_assert(object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE));
68694897 157 bus = sysbus_get_default();
10c4c98a
GH
158 }
159
9fbe6127 160 qdev_set_parent_bus(dev, bus);
b09995ae 161 object_unref(OBJECT(dev));
9fbe6127 162 return dev;
aae9460e
PB
163}
164
eae3eb3e 165static QTAILQ_HEAD(, DeviceListener) device_listeners
707ff800
PD
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, \
eae3eb3e 184 link) { \
707ff800
PD
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
f3a85056
JF
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 * should_be_hidden_will return
224 * 1 if device matches opts and it should be hidden
225 * 0 if device matches opts and should not be hidden
226 * -1 if device doesn't match ops
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
4d2ffa08
JK
239void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
240 int required_for_version)
241{
7983c8a3 242 assert(!dev->realized);
4d2ffa08
JK
243 dev->instance_id_alias = alias_id;
244 dev->alias_required_for_version = required_for_version;
245}
246
03fcbd9d
TH
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
d2321d31
PX
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
14405c27
DH
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
c06b2ffb 289HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
7716b8ca 290{
17cc0128 291 HotplugHandler *hotplug_ctrl = qdev_get_machine_hotplug_handler(dev);
7716b8ca 292
17cc0128 293 if (hotplug_ctrl == NULL && dev->parent_bus) {
14405c27 294 hotplug_ctrl = qdev_get_bus_hotplug_handler(dev);
7716b8ca
IM
295 }
296 return hotplug_ctrl;
297}
298
ec990eb6
AL
299static int qdev_reset_one(DeviceState *dev, void *opaque)
300{
94afdadc 301 device_reset(dev);
ec990eb6
AL
302
303 return 0;
304}
305
b4694b7c
IY
306static int qbus_reset_one(BusState *bus, void *opaque)
307{
0d936928
AL
308 BusClass *bc = BUS_GET_CLASS(bus);
309 if (bc->reset) {
dcc20931 310 bc->reset(bus);
b4694b7c
IY
311 }
312 return 0;
313}
314
5af0a04b
IY
315void qdev_reset_all(DeviceState *dev)
316{
dcc20931 317 qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
5af0a04b
IY
318}
319
ff8de075
DH
320void qdev_reset_all_fn(void *opaque)
321{
322 qdev_reset_all(DEVICE(opaque));
323}
324
d0508c36
PB
325void qbus_reset_all(BusState *bus)
326{
dcc20931 327 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
d0508c36
PB
328}
329
80376c3f
IY
330void qbus_reset_all_fn(void *opaque)
331{
332 BusState *bus = opaque;
d0508c36 333 qbus_reset_all(bus);
80376c3f
IY
334}
335
3418bd25 336/* can be used as ->unplug() callback for the simple cases */
014176f9
IM
337void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
338 DeviceState *dev, Error **errp)
339{
07578b0a 340 object_property_set_bool(OBJECT(dev), false, "realized", NULL);
014176f9 341}
3b29a101 342
0210afe6
MA
343/*
344 * Realize @dev.
345 * Device properties should be set before calling this function. IRQs
346 * and MMIO regions should be connected/mapped after calling this
347 * function.
348 * On failure, report an error with error_report() and terminate the
349 * program. This is okay during machine creation. Don't use for
350 * hotplug, because there callers need to recover from failure.
351 * Exception: if you know the device's init() callback can't fail,
352 * then qdev_init_nofail() can't fail either, and is therefore usable
353 * even then. But relying on the device implementation that way is
354 * somewhat unclean, and best avoided.
355 */
e23a1b33
MA
356void qdev_init_nofail(DeviceState *dev)
357{
c4bacafb 358 Error *err = NULL;
7de3abe5 359
c4bacafb
MA
360 assert(!dev->realized);
361
0d4104e5 362 object_ref(OBJECT(dev));
c4bacafb
MA
363 object_property_set_bool(OBJECT(dev), true, "realized", &err);
364 if (err) {
c29b77f9
MA
365 error_reportf_err(err, "Initialization of device %s failed: ",
366 object_get_typename(OBJECT(dev)));
bd6c9a61
MA
367 exit(1);
368 }
0d4104e5 369 object_unref(OBJECT(dev));
e23a1b33
MA
370}
371
3418bd25
GH
372void qdev_machine_creation_done(void)
373{
374 /*
375 * ok, initial machine setup is done, starting from now we can
376 * only create hotpluggable devices
377 */
9bed84c1 378 qdev_hotplug = true;
3418bd25
GH
379}
380
0ac8ef71
AW
381bool qdev_machine_modified(void)
382{
383 return qdev_hot_added || qdev_hot_removed;
384}
385
02e2da45 386BusState *qdev_get_parent_bus(DeviceState *dev)
aae9460e 387{
02e2da45 388 return dev->parent_bus;
aae9460e
PB
389}
390
a5f54290
PC
391static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
392 const char *name)
393{
394 NamedGPIOList *ngl;
395
396 QLIST_FOREACH(ngl, &dev->gpios, node) {
397 /* NULL is a valid and matchable name, otherwise do a normal
398 * strcmp match.
399 */
400 if ((!ngl->name && !name) ||
401 (name && ngl->name && strcmp(name, ngl->name) == 0)) {
402 return ngl;
403 }
404 }
405
406 ngl = g_malloc0(sizeof(*ngl));
407 ngl->name = g_strdup(name);
408 QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
409 return ngl;
410}
411
4a151677
PM
412void qdev_init_gpio_in_named_with_opaque(DeviceState *dev,
413 qemu_irq_handler handler,
414 void *opaque,
415 const char *name, int n)
a5f54290 416{
a69bef1c 417 int i;
a5f54290
PC
418 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
419
b235a71f 420 assert(gpio_list->num_out == 0 || !name);
a5f54290 421 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
4a151677 422 opaque, n);
a69bef1c 423
6c76b377
PF
424 if (!name) {
425 name = "unnamed-gpio-in";
426 }
a69bef1c 427 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
6c76b377
PF
428 gchar *propname = g_strdup_printf("%s[%u]", name, i);
429
a69bef1c
PC
430 object_property_add_child(OBJECT(dev), propname,
431 OBJECT(gpio_list->in[i]), &error_abort);
6c76b377 432 g_free(propname);
a69bef1c 433 }
a69bef1c 434
a5f54290
PC
435 gpio_list->num_in += n;
436}
437
aae9460e
PB
438void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
439{
a5f54290
PC
440 qdev_init_gpio_in_named(dev, handler, NULL, n);
441}
442
443void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
444 const char *name, int n)
445{
688b057a 446 int i;
a5f54290
PC
447 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
448
b235a71f 449 assert(gpio_list->num_in == 0 || !name);
688b057a 450
6c76b377
PF
451 if (!name) {
452 name = "unnamed-gpio-out";
453 }
454 memset(pins, 0, sizeof(*pins) * n);
688b057a 455 for (i = 0; i < n; ++i) {
6c76b377
PF
456 gchar *propname = g_strdup_printf("%s[%u]", name,
457 gpio_list->num_out + i);
458
688b057a
PC
459 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
460 (Object **)&pins[i],
461 object_property_allow_set_link,
265b578c 462 OBJ_PROP_LINK_STRONG,
688b057a 463 &error_abort);
6c76b377 464 g_free(propname);
688b057a 465 }
6c76b377 466 gpio_list->num_out += n;
aae9460e
PB
467}
468
469void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
470{
a5f54290
PC
471 qdev_init_gpio_out_named(dev, pins, NULL, n);
472}
473
474qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
475{
476 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
477
478 assert(n >= 0 && n < gpio_list->num_in);
479 return gpio_list->in[n];
aae9460e
PB
480}
481
482qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
483{
a5f54290
PC
484 return qdev_get_gpio_in_named(dev, NULL, n);
485}
486
487void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
488 qemu_irq pin)
489{
02757df2
PC
490 char *propname = g_strdup_printf("%s[%d]",
491 name ? name : "unnamed-gpio-out", n);
492 if (pin) {
493 /* We need a name for object_property_set_link to work. If the
494 * object has a parent, object_property_add_child will come back
495 * with an error without doing anything. If it has none, it will
496 * never fail. So we can just call it with a NULL Error pointer.
497 */
88950eef
AF
498 object_property_add_child(container_get(qdev_get_machine(),
499 "/unattached"),
500 "non-qdev-gpio[*]", OBJECT(pin), NULL);
02757df2
PC
501 }
502 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
503 g_free(propname);
aae9460e
PB
504}
505
b7973186
AG
506qemu_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
67cc32eb 517/* disconnect a GPIO output, returning the disconnected input (if any) */
0c24db2b
PC
518
519static 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}
a5f54290 533
0c24db2b
PC
534qemu_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;
aae9460e
PB
540}
541
542void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
543{
a5f54290 544 qdev_connect_gpio_out_named(dev, NULL, n, pin);
aae9460e
PB
545}
546
17a96a14
PC
547void 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);
6bc5cf92 560 g_free(propname);
17a96a14
PC
561 }
562 for (i = 0; i < ngl->num_out; i++) {
563 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
564 char *propname = g_strdup_printf("%s[%d]", nm, i);
565
566 object_property_add_alias(OBJECT(container), propname,
567 OBJECT(dev), propname,
568 &error_abort);
6bc5cf92 569 g_free(propname);
17a96a14
PC
570 }
571 QLIST_REMOVE(ngl, node);
572 QLIST_INSERT_HEAD(&container->gpios, ngl, node);
573}
574
02e2da45 575BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
4d6ae674 576{
02e2da45 577 BusState *bus;
f698c8ba
PC
578 Object *child = object_resolve_path_component(OBJECT(dev), name);
579
580 bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
581 if (bus) {
582 return bus;
583 }
4d6ae674 584
72cf2d4f 585 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
4d6ae674 586 if (strcmp(name, bus->name) == 0) {
02e2da45 587 return bus;
4d6ae674
PB
588 }
589 }
590 return NULL;
591}
592
0293214b
PB
593int qdev_walk_children(DeviceState *dev,
594 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
595 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
596 void *opaque)
81699d8a
AL
597{
598 BusState *bus;
599 int err;
600
0293214b
PB
601 if (pre_devfn) {
602 err = pre_devfn(dev, opaque);
81699d8a
AL
603 if (err) {
604 return err;
605 }
606 }
607
608 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
0293214b
PB
609 err = qbus_walk_children(bus, pre_devfn, pre_busfn,
610 post_devfn, post_busfn, opaque);
81699d8a
AL
611 if (err < 0) {
612 return err;
613 }
614 }
615
0293214b
PB
616 if (post_devfn) {
617 err = post_devfn(dev, opaque);
618 if (err) {
619 return err;
620 }
621 }
622
81699d8a
AL
623 return 0;
624}
625
a2ee6b4f 626DeviceState *qdev_find_recursive(BusState *bus, const char *id)
3418bd25 627{
0866aca1
AL
628 BusChild *kid;
629 DeviceState *ret;
3418bd25
GH
630 BusState *child;
631
0866aca1
AL
632 QTAILQ_FOREACH(kid, &bus->children, sibling) {
633 DeviceState *dev = kid->child;
634
635 if (dev->id && strcmp(dev->id, id) == 0) {
3418bd25 636 return dev;
0866aca1
AL
637 }
638
3418bd25
GH
639 QLIST_FOREACH(child, &dev->child_bus, sibling) {
640 ret = qdev_find_recursive(child, id);
641 if (ret) {
642 return ret;
643 }
644 }
645 }
646 return NULL;
647}
648
09e5ab63 649char *qdev_get_dev_path(DeviceState *dev)
85ed303b 650{
0d936928 651 BusClass *bc;
09e5ab63
AL
652
653 if (!dev || !dev->parent_bus) {
654 return NULL;
655 }
656
0d936928
AL
657 bc = BUS_GET_CLASS(dev->parent_bus);
658 if (bc->get_dev_path) {
659 return bc->get_dev_path(dev);
09e5ab63
AL
660 }
661
662 return NULL;
44677ded 663}
a5296ca9
AL
664
665/**
666 * Legacy property handling
667 */
668
d7bce999
EB
669static void qdev_get_legacy_property(Object *obj, Visitor *v,
670 const char *name, void *opaque,
671 Error **errp)
a5296ca9 672{
57c9fafe 673 DeviceState *dev = DEVICE(obj);
a5296ca9
AL
674 Property *prop = opaque;
675
e3cb6ba6
PB
676 char buffer[1024];
677 char *ptr = buffer;
a5296ca9 678
e3cb6ba6 679 prop->info->print(dev, prop, buffer, sizeof(buffer));
51e72bc1 680 visit_type_str(v, name, &ptr, errp);
a5296ca9
AL
681}
682
a5296ca9 683/**
d9d8d452
C
684 * qdev_property_add_legacy:
685 * @dev: Device to add the property to.
686 * @prop: The qdev property definition.
687 * @errp: location to store error information.
688 *
689 * Add a legacy QOM property to @dev for qdev property @prop.
690 * On error, store error in @errp.
a5296ca9 691 *
d9d8d452
C
692 * Legacy properties are string versions of QOM properties. The format of
693 * the string depends on the property type. Legacy properties are only
694 * needed for "info qtree".
a5296ca9 695 *
6871a0d0 696 * Do not use this in new code! QOM Properties added through this interface
d9d8d452 697 * will be given names in the "legacy" namespace.
a5296ca9 698 */
f5a014d2
SW
699static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
700 Error **errp)
a5296ca9 701{
7ce7ffe0 702 gchar *name;
a5296ca9 703
f3be016d 704 /* Register pointer properties as legacy properties */
03ff7770 705 if (!prop->info->print && prop->info->get) {
68ee3569
PB
706 return;
707 }
f3be016d 708
faabdbb7
FZ
709 if (prop->info->create) {
710 return;
711 }
712
ca2cc788 713 name = g_strdup_printf("legacy-%s", prop->name);
7ce7ffe0 714 object_property_add(OBJECT(dev), name, "str",
68ee3569 715 prop->info->print ? qdev_get_legacy_property : prop->info->get,
03ff7770 716 NULL,
57c9fafe
AL
717 NULL,
718 prop, errp);
a5296ca9 719
ca2cc788
PB
720 g_free(name);
721}
722
723/**
d9d8d452
C
724 * qdev_property_add_static:
725 * @dev: Device to add the property to.
726 * @prop: The qdev property definition.
727 * @errp: location to store error information.
ca2cc788 728 *
d9d8d452
C
729 * Add a static QOM property to @dev for qdev property @prop.
730 * On error, store error in @errp. Static properties access data in a struct.
731 * The type of the QOM property is derived from prop->info.
ca2cc788
PB
732 */
733void qdev_property_add_static(DeviceState *dev, Property *prop,
734 Error **errp)
735{
fdae245f
PB
736 Error *local_err = NULL;
737 Object *obj = OBJECT(dev);
738
faabdbb7
FZ
739 if (prop->info->create) {
740 prop->info->create(obj, prop, &local_err);
741 } else {
742 /*
743 * TODO qdev_prop_ptr does not have getters or setters. It must
744 * go now that it can be replaced with links. The test should be
745 * removed along with it: all static properties are read/write.
746 */
747 if (!prop->info->get && !prop->info->set) {
748 return;
749 }
750 object_property_add(obj, prop->name, prop->info->name,
751 prop->info->get, prop->info->set,
752 prop->info->release,
753 prop, &local_err);
d822979b
PB
754 }
755
fdae245f
PB
756 if (local_err) {
757 error_propagate(errp, local_err);
758 return;
759 }
b8c9cd5c
GA
760
761 object_property_set_description(obj, prop->name,
762 prop->info->description,
763 &error_abort);
764
5cc56cc6 765 if (prop->set_default) {
a2740ad5 766 prop->info->set_default_value(obj, prop);
fdae245f 767 }
6a146eba 768}
1de81d28 769
67cc7e0a
SH
770/* @qdev_alias_all_properties - Add alias properties to the source object for
771 * all qdev properties on the target DeviceState.
772 */
773void qdev_alias_all_properties(DeviceState *target, Object *source)
774{
775 ObjectClass *class;
776 Property *prop;
777
778 class = object_get_class(OBJECT(target));
779 do {
780 DeviceClass *dc = DEVICE_CLASS(class);
781
782 for (prop = dc->props; prop && prop->name; prop++) {
783 object_property_add_alias(source, prop->name,
784 OBJECT(target), prop->name,
785 &error_abort);
786 }
787 class = object_class_get_parent(class);
788 } while (class != object_class_by_name(TYPE_DEVICE));
789}
790
4cae4d5a 791static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
66e56b13
ZG
792{
793 GSList **list = opaque;
09d56017
JL
794 DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
795 TYPE_DEVICE);
796
797 if (dev == NULL) {
798 return 0;
799 }
66e56b13
ZG
800
801 if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
802 *list = g_slist_append(*list, dev);
803 }
804
66e56b13
ZG
805 return 0;
806}
807
4cae4d5a
MA
808GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
809{
810 GSList *list = NULL;
811
812 object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
813
814 return list;
815}
816
a7737e44 817static bool device_get_realized(Object *obj, Error **errp)
249d4172
AF
818{
819 DeviceState *dev = DEVICE(obj);
820 return dev->realized;
821}
822
1bfe5f05
JQ
823static bool check_only_migratable(Object *obj, Error **err)
824{
825 DeviceClass *dc = DEVICE_GET_CLASS(obj);
826
827 if (!vmstate_check_only_migratable(dc->vmsd)) {
828 error_setg(err, "Device %s is not migratable, but "
829 "--only-migratable was specified",
830 object_get_typename(obj));
831 return false;
832 }
833
834 return true;
835}
836
a7737e44 837static void device_set_realized(Object *obj, bool value, Error **errp)
249d4172
AF
838{
839 DeviceState *dev = DEVICE(obj);
840 DeviceClass *dc = DEVICE_GET_CLASS(dev);
7716b8ca 841 HotplugHandler *hotplug_ctrl;
5c21ce77 842 BusState *bus;
249d4172 843 Error *local_err = NULL;
69382d8b
IM
844 bool unattached_parent = false;
845 static int unattached_count;
249d4172 846
1a37eca1 847 if (dev->hotplugged && !dc->hotpluggable) {
c6bd8c70 848 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
1a37eca1
IM
849 return;
850 }
851
249d4172 852 if (value && !dev->realized) {
1bfe5f05 853 if (!check_only_migratable(obj, &local_err)) {
7562f907
AA
854 goto fail;
855 }
856
d578029e 857 if (!obj->parent) {
249d4172
AF
858 gchar *name = g_strdup_printf("device[%d]", unattached_count++);
859
860 object_property_add_child(container_get(qdev_get_machine(),
861 "/unattached"),
d578029e 862 name, obj, &error_abort);
69382d8b 863 unattached_parent = true;
249d4172
AF
864 g_free(name);
865 }
866
41346263
IM
867 hotplug_ctrl = qdev_get_hotplug_handler(dev);
868 if (hotplug_ctrl) {
869 hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
870 if (local_err != NULL) {
871 goto fail;
872 }
873 }
874
a7ddba52
IM
875 if (dc->realize) {
876 dc->realize(dev, &local_err);
877 }
878
1d45a705
GA
879 if (local_err != NULL) {
880 goto fail;
881 }
882
707ff800
PD
883 DEVICE_LISTENER_CALL(realize, Forward, dev);
884
04162f8f
MR
885 /*
886 * always free/re-initialize here since the value cannot be cleaned up
887 * in device_unrealize due to its usage later on in the unplug path
888 */
889 g_free(dev->canonical_path);
890 dev->canonical_path = object_get_canonical_path(OBJECT(dev));
891
1d45a705 892 if (qdev_get_vmsd(dev)) {
67980031
DDAG
893 if (vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
894 dev->instance_id_alias,
895 dev->alias_required_for_version,
896 &local_err) < 0) {
897 goto post_realize_fail;
898 }
249d4172 899 }
1d45a705
GA
900
901 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
902 object_property_set_bool(OBJECT(bus), true, "realized",
5c21ce77 903 &local_err);
1d45a705
GA
904 if (local_err != NULL) {
905 goto child_realize_fail;
5c21ce77
BD
906 }
907 }
1d45a705 908 if (dev->hotplugged) {
249d4172
AF
909 device_reset(dev);
910 }
352e8da7 911 dev->pending_deleted_event = false;
25e89788
SH
912
913 if (hotplug_ctrl) {
8b5e6caf
IM
914 hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
915 if (local_err != NULL) {
916 goto child_realize_fail;
917 }
918 }
919
249d4172 920 } else if (!value && dev->realized) {
cd4520ad 921 Error **local_errp = NULL;
5c21ce77 922 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
cd4520ad 923 local_errp = local_err ? NULL : &local_err;
5c21ce77 924 object_property_set_bool(OBJECT(bus), false, "realized",
cd4520ad 925 local_errp);
5c21ce77 926 }
cd4520ad 927 if (qdev_get_vmsd(dev)) {
fe6c2117
AF
928 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
929 }
cd4520ad
GA
930 if (dc->unrealize) {
931 local_errp = local_err ? NULL : &local_err;
932 dc->unrealize(dev, local_errp);
249d4172 933 }
352e8da7 934 dev->pending_deleted_event = true;
707ff800 935 DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
c7f8d0f3 936 }
249d4172 937
c7f8d0f3
XG
938 if (local_err != NULL) {
939 goto fail;
249d4172
AF
940 }
941
c7f8d0f3 942 dev->realized = value;
1d45a705
GA
943 return;
944
945child_realize_fail:
946 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
947 object_property_set_bool(OBJECT(bus), false, "realized",
948 NULL);
949 }
950
951 if (qdev_get_vmsd(dev)) {
952 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
953 }
954
955post_realize_fail:
04162f8f
MR
956 g_free(dev->canonical_path);
957 dev->canonical_path = NULL;
1d45a705
GA
958 if (dc->unrealize) {
959 dc->unrealize(dev, NULL);
960 }
961
962fail:
963 error_propagate(errp, local_err);
69382d8b
IM
964 if (unattached_parent) {
965 object_unparent(OBJECT(dev));
966 unattached_count--;
967 }
249d4172
AF
968}
969
a7737e44 970static bool device_get_hotpluggable(Object *obj, Error **errp)
1a37eca1
IM
971{
972 DeviceClass *dc = DEVICE_GET_CLASS(obj);
973 DeviceState *dev = DEVICE(obj);
974
2b81b35f 975 return dc->hotpluggable && (dev->parent_bus == NULL ||
39b888bd 976 qbus_is_hotpluggable(dev->parent_bus));
1a37eca1
IM
977}
978
d012ffc1
IM
979static bool device_get_hotplugged(Object *obj, Error **err)
980{
981 DeviceState *dev = DEVICE(obj);
982
983 return dev->hotplugged;
984}
985
9674bfe4
AL
986static void device_initfn(Object *obj)
987{
988 DeviceState *dev = DEVICE(obj);
bce54474 989 ObjectClass *class;
9674bfe4
AL
990 Property *prop;
991
992 if (qdev_hotplug) {
993 dev->hotplugged = 1;
994 qdev_hot_added = true;
995 }
996
997 dev->instance_id_alias = -1;
7983c8a3 998 dev->realized = false;
a1190ab6 999 dev->allow_unplug_during_migration = false;
9674bfe4 1000
249d4172
AF
1001 object_property_add_bool(obj, "realized",
1002 device_get_realized, device_set_realized, NULL);
1a37eca1
IM
1003 object_property_add_bool(obj, "hotpluggable",
1004 device_get_hotpluggable, NULL, NULL);
d012ffc1 1005 object_property_add_bool(obj, "hotplugged",
36cccb8c 1006 device_get_hotplugged, NULL,
d012ffc1 1007 &error_abort);
249d4172 1008
bce54474
PB
1009 class = object_get_class(OBJECT(dev));
1010 do {
1011 for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
5433a0a8
PC
1012 qdev_property_add_legacy(dev, prop, &error_abort);
1013 qdev_property_add_static(dev, prop, &error_abort);
bce54474 1014 }
bce54474
PB
1015 class = object_class_get_parent(class);
1016 } while (class != object_class_by_name(TYPE_DEVICE));
9674bfe4 1017
f968fc68 1018 object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
39f72ef9 1019 (Object **)&dev->parent_bus, NULL, 0,
9561fda8 1020 &error_abort);
a5f54290 1021 QLIST_INIT(&dev->gpios);
9674bfe4
AL
1022}
1023
1c3994f6
MAL
1024static void device_post_init(Object *obj)
1025{
1a3ec8c1
MA
1026 /*
1027 * Note: ordered so that the user's global properties take
1028 * precedence.
1029 */
1c3994f6 1030 object_apply_compat_props(obj);
25f8dd96 1031 qdev_prop_set_globals(DEVICE(obj));
99a0b036
EH
1032}
1033
60adba37
AL
1034/* Unlink device from bus and free the structure. */
1035static void device_finalize(Object *obj)
1036{
a5f54290
PC
1037 NamedGPIOList *ngl, *next;
1038
60adba37 1039 DeviceState *dev = DEVICE(obj);
a5f54290
PC
1040
1041 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
1042 QLIST_REMOVE(ngl, node);
f173d57a 1043 qemu_free_irqs(ngl->in, ngl->num_in);
a5f54290
PC
1044 g_free(ngl->name);
1045 g_free(ngl);
1046 /* ngl->out irqs are owned by the other end and should not be freed
1047 * here
1048 */
1049 }
f7b879e0
MR
1050
1051 /* Only send event if the device had been completely realized */
1052 if (dev->pending_deleted_event) {
1053 g_assert(dev->canonical_path);
1054
3ab72385 1055 qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path);
f7b879e0
MR
1056 g_free(dev->canonical_path);
1057 dev->canonical_path = NULL;
1058 }
1059
1060 qemu_opts_del(dev->opts);
60adba37
AL
1061}
1062
bce54474
PB
1063static void device_class_base_init(ObjectClass *class, void *data)
1064{
1065 DeviceClass *klass = DEVICE_CLASS(class);
1066
1067 /* We explicitly look up properties in the superclasses,
1068 * so do not propagate them to the subclasses.
1069 */
1070 klass->props = NULL;
60adba37
AL
1071}
1072
5d5b24d0 1073static void device_unparent(Object *obj)
667d22d1
PB
1074{
1075 DeviceState *dev = DEVICE(obj);
06f7f2bb 1076 BusState *bus;
667d22d1 1077
5c21ce77
BD
1078 if (dev->realized) {
1079 object_property_set_bool(obj, false, "realized", NULL);
1080 }
06f7f2bb
PB
1081 while (dev->num_child_bus) {
1082 bus = QLIST_FIRST(&dev->child_bus);
6780a22c 1083 object_unparent(OBJECT(bus));
06f7f2bb 1084 }
06f7f2bb 1085 if (dev->parent_bus) {
5d5b24d0 1086 bus_remove_child(dev->parent_bus, dev);
62d7ba66
PB
1087 object_unref(OBJECT(dev->parent_bus));
1088 dev->parent_bus = NULL;
5d5b24d0 1089 }
667d22d1
PB
1090}
1091
1092static void device_class_init(ObjectClass *class, void *data)
1093{
249d4172
AF
1094 DeviceClass *dc = DEVICE_CLASS(class);
1095
5d5b24d0 1096 class->unparent = device_unparent;
267a3264
IM
1097
1098 /* by default all devices were considered as hotpluggable,
1099 * so with intent to check it in generic qdev_unplug() /
1100 * device_set_realized() functions make every device
1101 * hotpluggable. Devices that shouldn't be hotpluggable,
1102 * should override it in their class_init()
1103 */
1104 dc->hotpluggable = true;
e90f2a8c 1105 dc->user_creatable = true;
667d22d1
PB
1106}
1107
46795cf2
PMD
1108void device_class_set_parent_reset(DeviceClass *dc,
1109 DeviceReset dev_reset,
1110 DeviceReset *parent_reset)
1111{
1112 *parent_reset = dc->reset;
1113 dc->reset = dev_reset;
1114}
1115
1116void device_class_set_parent_realize(DeviceClass *dc,
1117 DeviceRealize dev_realize,
1118 DeviceRealize *parent_realize)
1119{
1120 *parent_realize = dc->realize;
1121 dc->realize = dev_realize;
1122}
1123
1124void device_class_set_parent_unrealize(DeviceClass *dc,
1125 DeviceUnrealize dev_unrealize,
1126 DeviceUnrealize *parent_unrealize)
1127{
1128 *parent_unrealize = dc->unrealize;
1129 dc->unrealize = dev_unrealize;
1130}
1131
94afdadc
AL
1132void device_reset(DeviceState *dev)
1133{
1134 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1135
1136 if (klass->reset) {
1137 klass->reset(dev);
1138 }
1139}
1140
f05f6b4a
PB
1141Object *qdev_get_machine(void)
1142{
1143 static Object *dev;
1144
1145 if (dev == NULL) {
dfe47e70 1146 dev = container_get(object_get_root(), "/machine");
f05f6b4a
PB
1147 }
1148
1149 return dev;
1150}
1151
8c43a6f0 1152static const TypeInfo device_type_info = {
32fea402
AL
1153 .name = TYPE_DEVICE,
1154 .parent = TYPE_OBJECT,
1155 .instance_size = sizeof(DeviceState),
9674bfe4 1156 .instance_init = device_initfn,
99a0b036 1157 .instance_post_init = device_post_init,
60adba37 1158 .instance_finalize = device_finalize,
bce54474 1159 .class_base_init = device_class_base_init,
667d22d1 1160 .class_init = device_class_init,
32fea402
AL
1161 .abstract = true,
1162 .class_size = sizeof(DeviceClass),
1163};
1164
83f7d43a 1165static void qdev_register_types(void)
32fea402
AL
1166{
1167 type_register_static(&device_type_info);
1168}
1169
83f7d43a 1170type_init(qdev_register_types)