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