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