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