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 bool 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 239 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id, 240 int required_for_version) 241 { 242 assert(!dev->realized); 243 dev->instance_id_alias = alias_id; 244 dev->alias_required_for_version = required_for_version; 245 } 246 247 HotplugHandler *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 264 bool 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 281 HotplugHandler *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 289 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev) 290 { 291 HotplugHandler *hotplug_ctrl = qdev_get_machine_hotplug_handler(dev); 292 293 if (hotplug_ctrl == NULL && dev->parent_bus) { 294 hotplug_ctrl = qdev_get_bus_hotplug_handler(dev); 295 } 296 return hotplug_ctrl; 297 } 298 299 static int qdev_reset_one(DeviceState *dev, void *opaque) 300 { 301 device_reset(dev); 302 303 return 0; 304 } 305 306 static int qbus_reset_one(BusState *bus, void *opaque) 307 { 308 BusClass *bc = BUS_GET_CLASS(bus); 309 if (bc->reset) { 310 bc->reset(bus); 311 } 312 return 0; 313 } 314 315 void qdev_reset_all(DeviceState *dev) 316 { 317 qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL); 318 } 319 320 void qdev_reset_all_fn(void *opaque) 321 { 322 qdev_reset_all(DEVICE(opaque)); 323 } 324 325 void qbus_reset_all(BusState *bus) 326 { 327 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL); 328 } 329 330 void qbus_reset_all_fn(void *opaque) 331 { 332 BusState *bus = opaque; 333 qbus_reset_all(bus); 334 } 335 336 /* can be used as ->unplug() callback for the simple cases */ 337 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev, 338 DeviceState *dev, Error **errp) 339 { 340 object_property_set_bool(OBJECT(dev), false, "realized", NULL); 341 } 342 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 */ 356 void qdev_init_nofail(DeviceState *dev) 357 { 358 Error *err = NULL; 359 360 assert(!dev->realized); 361 362 object_ref(OBJECT(dev)); 363 object_property_set_bool(OBJECT(dev), true, "realized", &err); 364 if (err) { 365 error_reportf_err(err, "Initialization of device %s failed: ", 366 object_get_typename(OBJECT(dev))); 367 exit(1); 368 } 369 object_unref(OBJECT(dev)); 370 } 371 372 void 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 */ 378 qdev_hotplug = true; 379 } 380 381 bool qdev_machine_modified(void) 382 { 383 return qdev_hot_added || qdev_hot_removed; 384 } 385 386 BusState *qdev_get_parent_bus(DeviceState *dev) 387 { 388 return dev->parent_bus; 389 } 390 391 static 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. */ 398 if (g_strcmp0(name, ngl->name) == 0) { 399 return ngl; 400 } 401 } 402 403 ngl = g_malloc0(sizeof(*ngl)); 404 ngl->name = g_strdup(name); 405 QLIST_INSERT_HEAD(&dev->gpios, ngl, node); 406 return ngl; 407 } 408 409 void qdev_init_gpio_in_named_with_opaque(DeviceState *dev, 410 qemu_irq_handler handler, 411 void *opaque, 412 const char *name, int n) 413 { 414 int i; 415 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name); 416 417 assert(gpio_list->num_out == 0 || !name); 418 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler, 419 opaque, n); 420 421 if (!name) { 422 name = "unnamed-gpio-in"; 423 } 424 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) { 425 gchar *propname = g_strdup_printf("%s[%u]", name, i); 426 427 object_property_add_child(OBJECT(dev), propname, 428 OBJECT(gpio_list->in[i]), &error_abort); 429 g_free(propname); 430 } 431 432 gpio_list->num_in += n; 433 } 434 435 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n) 436 { 437 qdev_init_gpio_in_named(dev, handler, NULL, n); 438 } 439 440 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins, 441 const char *name, int n) 442 { 443 int i; 444 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name); 445 446 assert(gpio_list->num_in == 0 || !name); 447 448 if (!name) { 449 name = "unnamed-gpio-out"; 450 } 451 memset(pins, 0, sizeof(*pins) * n); 452 for (i = 0; i < n; ++i) { 453 gchar *propname = g_strdup_printf("%s[%u]", name, 454 gpio_list->num_out + i); 455 456 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ, 457 (Object **)&pins[i], 458 object_property_allow_set_link, 459 OBJ_PROP_LINK_STRONG, 460 &error_abort); 461 g_free(propname); 462 } 463 gpio_list->num_out += n; 464 } 465 466 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n) 467 { 468 qdev_init_gpio_out_named(dev, pins, NULL, n); 469 } 470 471 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n) 472 { 473 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name); 474 475 assert(n >= 0 && n < gpio_list->num_in); 476 return gpio_list->in[n]; 477 } 478 479 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n) 480 { 481 return qdev_get_gpio_in_named(dev, NULL, n); 482 } 483 484 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n, 485 qemu_irq pin) 486 { 487 char *propname = g_strdup_printf("%s[%d]", 488 name ? name : "unnamed-gpio-out", n); 489 if (pin) { 490 /* We need a name for object_property_set_link to work. If the 491 * object has a parent, object_property_add_child will come back 492 * with an error without doing anything. If it has none, it will 493 * never fail. So we can just call it with a NULL Error pointer. 494 */ 495 object_property_add_child(container_get(qdev_get_machine(), 496 "/unattached"), 497 "non-qdev-gpio[*]", OBJECT(pin), NULL); 498 } 499 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort); 500 g_free(propname); 501 } 502 503 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n) 504 { 505 char *propname = g_strdup_printf("%s[%d]", 506 name ? name : "unnamed-gpio-out", n); 507 508 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname, 509 NULL); 510 511 return ret; 512 } 513 514 /* disconnect a GPIO output, returning the disconnected input (if any) */ 515 516 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev, 517 const char *name, int n) 518 { 519 char *propname = g_strdup_printf("%s[%d]", 520 name ? name : "unnamed-gpio-out", n); 521 522 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname, 523 NULL); 524 if (ret) { 525 object_property_set_link(OBJECT(dev), NULL, propname, NULL); 526 } 527 g_free(propname); 528 return ret; 529 } 530 531 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt, 532 const char *name, int n) 533 { 534 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n); 535 qdev_connect_gpio_out_named(dev, name, n, icpt); 536 return disconnected; 537 } 538 539 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin) 540 { 541 qdev_connect_gpio_out_named(dev, NULL, n, pin); 542 } 543 544 void qdev_pass_gpios(DeviceState *dev, DeviceState *container, 545 const char *name) 546 { 547 int i; 548 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name); 549 550 for (i = 0; i < ngl->num_in; i++) { 551 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in"; 552 char *propname = g_strdup_printf("%s[%d]", nm, i); 553 554 object_property_add_alias(OBJECT(container), propname, 555 OBJECT(dev), propname, 556 &error_abort); 557 g_free(propname); 558 } 559 for (i = 0; i < ngl->num_out; i++) { 560 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out"; 561 char *propname = g_strdup_printf("%s[%d]", nm, i); 562 563 object_property_add_alias(OBJECT(container), propname, 564 OBJECT(dev), propname, 565 &error_abort); 566 g_free(propname); 567 } 568 QLIST_REMOVE(ngl, node); 569 QLIST_INSERT_HEAD(&container->gpios, ngl, node); 570 } 571 572 BusState *qdev_get_child_bus(DeviceState *dev, const char *name) 573 { 574 BusState *bus; 575 Object *child = object_resolve_path_component(OBJECT(dev), name); 576 577 bus = (BusState *)object_dynamic_cast(child, TYPE_BUS); 578 if (bus) { 579 return bus; 580 } 581 582 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 583 if (strcmp(name, bus->name) == 0) { 584 return bus; 585 } 586 } 587 return NULL; 588 } 589 590 int qdev_walk_children(DeviceState *dev, 591 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn, 592 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn, 593 void *opaque) 594 { 595 BusState *bus; 596 int err; 597 598 if (pre_devfn) { 599 err = pre_devfn(dev, opaque); 600 if (err) { 601 return err; 602 } 603 } 604 605 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 606 err = qbus_walk_children(bus, pre_devfn, pre_busfn, 607 post_devfn, post_busfn, opaque); 608 if (err < 0) { 609 return err; 610 } 611 } 612 613 if (post_devfn) { 614 err = post_devfn(dev, opaque); 615 if (err) { 616 return err; 617 } 618 } 619 620 return 0; 621 } 622 623 DeviceState *qdev_find_recursive(BusState *bus, const char *id) 624 { 625 BusChild *kid; 626 DeviceState *ret; 627 BusState *child; 628 629 QTAILQ_FOREACH(kid, &bus->children, sibling) { 630 DeviceState *dev = kid->child; 631 632 if (dev->id && strcmp(dev->id, id) == 0) { 633 return dev; 634 } 635 636 QLIST_FOREACH(child, &dev->child_bus, sibling) { 637 ret = qdev_find_recursive(child, id); 638 if (ret) { 639 return ret; 640 } 641 } 642 } 643 return NULL; 644 } 645 646 char *qdev_get_dev_path(DeviceState *dev) 647 { 648 BusClass *bc; 649 650 if (!dev || !dev->parent_bus) { 651 return NULL; 652 } 653 654 bc = BUS_GET_CLASS(dev->parent_bus); 655 if (bc->get_dev_path) { 656 return bc->get_dev_path(dev); 657 } 658 659 return NULL; 660 } 661 662 /** 663 * Legacy property handling 664 */ 665 666 static void qdev_get_legacy_property(Object *obj, Visitor *v, 667 const char *name, void *opaque, 668 Error **errp) 669 { 670 DeviceState *dev = DEVICE(obj); 671 Property *prop = opaque; 672 673 char buffer[1024]; 674 char *ptr = buffer; 675 676 prop->info->print(dev, prop, buffer, sizeof(buffer)); 677 visit_type_str(v, name, &ptr, errp); 678 } 679 680 /** 681 * qdev_property_add_legacy: 682 * @dev: Device to add the property to. 683 * @prop: The qdev property definition. 684 * @errp: location to store error information. 685 * 686 * Add a legacy QOM property to @dev for qdev property @prop. 687 * On error, store error in @errp. 688 * 689 * Legacy properties are string versions of QOM properties. The format of 690 * the string depends on the property type. Legacy properties are only 691 * needed for "info qtree". 692 * 693 * Do not use this in new code! QOM Properties added through this interface 694 * will be given names in the "legacy" namespace. 695 */ 696 static void qdev_property_add_legacy(DeviceState *dev, Property *prop, 697 Error **errp) 698 { 699 gchar *name; 700 701 /* Register pointer properties as legacy properties */ 702 if (!prop->info->print && prop->info->get) { 703 return; 704 } 705 706 if (prop->info->create) { 707 return; 708 } 709 710 name = g_strdup_printf("legacy-%s", prop->name); 711 object_property_add(OBJECT(dev), name, "str", 712 prop->info->print ? qdev_get_legacy_property : prop->info->get, 713 NULL, 714 NULL, 715 prop, errp); 716 717 g_free(name); 718 } 719 720 /** 721 * qdev_property_add_static: 722 * @dev: Device to add the property to. 723 * @prop: The qdev property definition. 724 * @errp: location to store error information. 725 * 726 * Add a static QOM property to @dev for qdev property @prop. 727 * On error, store error in @errp. Static properties access data in a struct. 728 * The type of the QOM property is derived from prop->info. 729 */ 730 void qdev_property_add_static(DeviceState *dev, Property *prop, 731 Error **errp) 732 { 733 Error *local_err = NULL; 734 Object *obj = OBJECT(dev); 735 736 if (prop->info->create) { 737 prop->info->create(obj, prop, &local_err); 738 } else { 739 /* 740 * TODO qdev_prop_ptr does not have getters or setters. It must 741 * go now that it can be replaced with links. The test should be 742 * removed along with it: all static properties are read/write. 743 */ 744 if (!prop->info->get && !prop->info->set) { 745 return; 746 } 747 object_property_add(obj, prop->name, prop->info->name, 748 prop->info->get, prop->info->set, 749 prop->info->release, 750 prop, &local_err); 751 } 752 753 if (local_err) { 754 error_propagate(errp, local_err); 755 return; 756 } 757 758 object_property_set_description(obj, prop->name, 759 prop->info->description, 760 &error_abort); 761 762 if (prop->set_default) { 763 prop->info->set_default_value(obj, prop); 764 } 765 } 766 767 /* @qdev_alias_all_properties - Add alias properties to the source object for 768 * all qdev properties on the target DeviceState. 769 */ 770 void qdev_alias_all_properties(DeviceState *target, Object *source) 771 { 772 ObjectClass *class; 773 Property *prop; 774 775 class = object_get_class(OBJECT(target)); 776 do { 777 DeviceClass *dc = DEVICE_CLASS(class); 778 779 for (prop = dc->props; prop && prop->name; prop++) { 780 object_property_add_alias(source, prop->name, 781 OBJECT(target), prop->name, 782 &error_abort); 783 } 784 class = object_class_get_parent(class); 785 } while (class != object_class_by_name(TYPE_DEVICE)); 786 } 787 788 static int qdev_add_hotpluggable_device(Object *obj, void *opaque) 789 { 790 GSList **list = opaque; 791 DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj), 792 TYPE_DEVICE); 793 794 if (dev == NULL) { 795 return 0; 796 } 797 798 if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) { 799 *list = g_slist_append(*list, dev); 800 } 801 802 return 0; 803 } 804 805 GSList *qdev_build_hotpluggable_device_list(Object *peripheral) 806 { 807 GSList *list = NULL; 808 809 object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list); 810 811 return list; 812 } 813 814 static bool device_get_realized(Object *obj, Error **errp) 815 { 816 DeviceState *dev = DEVICE(obj); 817 return dev->realized; 818 } 819 820 static bool check_only_migratable(Object *obj, Error **errp) 821 { 822 DeviceClass *dc = DEVICE_GET_CLASS(obj); 823 824 if (!vmstate_check_only_migratable(dc->vmsd)) { 825 error_setg(errp, "Device %s is not migratable, but " 826 "--only-migratable was specified", 827 object_get_typename(obj)); 828 return false; 829 } 830 831 return true; 832 } 833 834 static void device_set_realized(Object *obj, bool value, Error **errp) 835 { 836 DeviceState *dev = DEVICE(obj); 837 DeviceClass *dc = DEVICE_GET_CLASS(dev); 838 HotplugHandler *hotplug_ctrl; 839 BusState *bus; 840 Error *local_err = NULL; 841 bool unattached_parent = false; 842 static int unattached_count; 843 844 if (dev->hotplugged && !dc->hotpluggable) { 845 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj)); 846 return; 847 } 848 849 if (value && !dev->realized) { 850 if (!check_only_migratable(obj, &local_err)) { 851 goto fail; 852 } 853 854 if (!obj->parent) { 855 gchar *name = g_strdup_printf("device[%d]", unattached_count++); 856 857 object_property_add_child(container_get(qdev_get_machine(), 858 "/unattached"), 859 name, obj, &error_abort); 860 unattached_parent = true; 861 g_free(name); 862 } 863 864 hotplug_ctrl = qdev_get_hotplug_handler(dev); 865 if (hotplug_ctrl) { 866 hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err); 867 if (local_err != NULL) { 868 goto fail; 869 } 870 } 871 872 if (dc->realize) { 873 dc->realize(dev, &local_err); 874 if (local_err != NULL) { 875 goto fail; 876 } 877 } 878 879 DEVICE_LISTENER_CALL(realize, Forward, dev); 880 881 /* 882 * always free/re-initialize here since the value cannot be cleaned up 883 * in device_unrealize due to its usage later on in the unplug path 884 */ 885 g_free(dev->canonical_path); 886 dev->canonical_path = object_get_canonical_path(OBJECT(dev)); 887 888 if (qdev_get_vmsd(dev)) { 889 if (vmstate_register_with_alias_id(VMSTATE_IF(dev), 890 -1, qdev_get_vmsd(dev), dev, 891 dev->instance_id_alias, 892 dev->alias_required_for_version, 893 &local_err) < 0) { 894 goto post_realize_fail; 895 } 896 } 897 898 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 899 object_property_set_bool(OBJECT(bus), true, "realized", 900 &local_err); 901 if (local_err != NULL) { 902 goto child_realize_fail; 903 } 904 } 905 if (dev->hotplugged) { 906 device_reset(dev); 907 } 908 dev->pending_deleted_event = false; 909 910 if (hotplug_ctrl) { 911 hotplug_handler_plug(hotplug_ctrl, dev, &local_err); 912 if (local_err != NULL) { 913 goto child_realize_fail; 914 } 915 } 916 917 } else if (!value && dev->realized) { 918 /* We want local_err to track only the first error */ 919 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 920 object_property_set_bool(OBJECT(bus), false, "realized", 921 local_err ? NULL : &local_err); 922 } 923 if (qdev_get_vmsd(dev)) { 924 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev); 925 } 926 if (dc->unrealize) { 927 dc->unrealize(dev, local_err ? NULL : &local_err); 928 } 929 dev->pending_deleted_event = true; 930 DEVICE_LISTENER_CALL(unrealize, Reverse, dev); 931 932 if (local_err != NULL) { 933 goto fail; 934 } 935 } 936 937 assert(local_err == NULL); 938 dev->realized = value; 939 return; 940 941 child_realize_fail: 942 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 943 object_property_set_bool(OBJECT(bus), false, "realized", 944 NULL); 945 } 946 947 if (qdev_get_vmsd(dev)) { 948 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev); 949 } 950 951 post_realize_fail: 952 g_free(dev->canonical_path); 953 dev->canonical_path = NULL; 954 if (dc->unrealize) { 955 dc->unrealize(dev, NULL); 956 } 957 958 fail: 959 error_propagate(errp, local_err); 960 if (unattached_parent) { 961 object_unparent(OBJECT(dev)); 962 unattached_count--; 963 } 964 } 965 966 static bool device_get_hotpluggable(Object *obj, Error **errp) 967 { 968 DeviceClass *dc = DEVICE_GET_CLASS(obj); 969 DeviceState *dev = DEVICE(obj); 970 971 return dc->hotpluggable && (dev->parent_bus == NULL || 972 qbus_is_hotpluggable(dev->parent_bus)); 973 } 974 975 static bool device_get_hotplugged(Object *obj, Error **errp) 976 { 977 DeviceState *dev = DEVICE(obj); 978 979 return dev->hotplugged; 980 } 981 982 static void device_initfn(Object *obj) 983 { 984 DeviceState *dev = DEVICE(obj); 985 ObjectClass *class; 986 Property *prop; 987 988 if (qdev_hotplug) { 989 dev->hotplugged = 1; 990 qdev_hot_added = true; 991 } 992 993 dev->instance_id_alias = -1; 994 dev->realized = false; 995 dev->allow_unplug_during_migration = false; 996 997 object_property_add_bool(obj, "realized", 998 device_get_realized, device_set_realized, NULL); 999 object_property_add_bool(obj, "hotpluggable", 1000 device_get_hotpluggable, NULL, NULL); 1001 object_property_add_bool(obj, "hotplugged", 1002 device_get_hotplugged, NULL, 1003 &error_abort); 1004 1005 class = object_get_class(OBJECT(dev)); 1006 do { 1007 for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) { 1008 qdev_property_add_legacy(dev, prop, &error_abort); 1009 qdev_property_add_static(dev, prop, &error_abort); 1010 } 1011 class = object_class_get_parent(class); 1012 } while (class != object_class_by_name(TYPE_DEVICE)); 1013 1014 object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS, 1015 (Object **)&dev->parent_bus, NULL, 0, 1016 &error_abort); 1017 QLIST_INIT(&dev->gpios); 1018 } 1019 1020 static void device_post_init(Object *obj) 1021 { 1022 /* 1023 * Note: ordered so that the user's global properties take 1024 * precedence. 1025 */ 1026 object_apply_compat_props(obj); 1027 qdev_prop_set_globals(DEVICE(obj)); 1028 } 1029 1030 /* Unlink device from bus and free the structure. */ 1031 static void device_finalize(Object *obj) 1032 { 1033 NamedGPIOList *ngl, *next; 1034 1035 DeviceState *dev = DEVICE(obj); 1036 1037 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) { 1038 QLIST_REMOVE(ngl, node); 1039 qemu_free_irqs(ngl->in, ngl->num_in); 1040 g_free(ngl->name); 1041 g_free(ngl); 1042 /* ngl->out irqs are owned by the other end and should not be freed 1043 * here 1044 */ 1045 } 1046 1047 /* Only send event if the device had been completely realized */ 1048 if (dev->pending_deleted_event) { 1049 g_assert(dev->canonical_path); 1050 1051 qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path); 1052 g_free(dev->canonical_path); 1053 dev->canonical_path = NULL; 1054 } 1055 1056 qemu_opts_del(dev->opts); 1057 } 1058 1059 static void device_class_base_init(ObjectClass *class, void *data) 1060 { 1061 DeviceClass *klass = DEVICE_CLASS(class); 1062 1063 /* We explicitly look up properties in the superclasses, 1064 * so do not propagate them to the subclasses. 1065 */ 1066 klass->props = NULL; 1067 } 1068 1069 static void device_unparent(Object *obj) 1070 { 1071 DeviceState *dev = DEVICE(obj); 1072 BusState *bus; 1073 1074 if (dev->realized) { 1075 object_property_set_bool(obj, false, "realized", NULL); 1076 } 1077 while (dev->num_child_bus) { 1078 bus = QLIST_FIRST(&dev->child_bus); 1079 object_unparent(OBJECT(bus)); 1080 } 1081 if (dev->parent_bus) { 1082 bus_remove_child(dev->parent_bus, dev); 1083 object_unref(OBJECT(dev->parent_bus)); 1084 dev->parent_bus = NULL; 1085 } 1086 } 1087 1088 static char * 1089 device_vmstate_if_get_id(VMStateIf *obj) 1090 { 1091 DeviceState *dev = DEVICE(obj); 1092 1093 return qdev_get_dev_path(dev); 1094 } 1095 1096 static void device_class_init(ObjectClass *class, void *data) 1097 { 1098 DeviceClass *dc = DEVICE_CLASS(class); 1099 VMStateIfClass *vc = VMSTATE_IF_CLASS(class); 1100 1101 class->unparent = device_unparent; 1102 1103 /* by default all devices were considered as hotpluggable, 1104 * so with intent to check it in generic qdev_unplug() / 1105 * device_set_realized() functions make every device 1106 * hotpluggable. Devices that shouldn't be hotpluggable, 1107 * should override it in their class_init() 1108 */ 1109 dc->hotpluggable = true; 1110 dc->user_creatable = true; 1111 vc->get_id = device_vmstate_if_get_id; 1112 } 1113 1114 void device_class_set_parent_reset(DeviceClass *dc, 1115 DeviceReset dev_reset, 1116 DeviceReset *parent_reset) 1117 { 1118 *parent_reset = dc->reset; 1119 dc->reset = dev_reset; 1120 } 1121 1122 void device_class_set_parent_realize(DeviceClass *dc, 1123 DeviceRealize dev_realize, 1124 DeviceRealize *parent_realize) 1125 { 1126 *parent_realize = dc->realize; 1127 dc->realize = dev_realize; 1128 } 1129 1130 void device_class_set_parent_unrealize(DeviceClass *dc, 1131 DeviceUnrealize dev_unrealize, 1132 DeviceUnrealize *parent_unrealize) 1133 { 1134 *parent_unrealize = dc->unrealize; 1135 dc->unrealize = dev_unrealize; 1136 } 1137 1138 void device_reset(DeviceState *dev) 1139 { 1140 DeviceClass *klass = DEVICE_GET_CLASS(dev); 1141 1142 if (klass->reset) { 1143 klass->reset(dev); 1144 } 1145 } 1146 1147 Object *qdev_get_machine(void) 1148 { 1149 static Object *dev; 1150 1151 if (dev == NULL) { 1152 dev = container_get(object_get_root(), "/machine"); 1153 } 1154 1155 return dev; 1156 } 1157 1158 static const TypeInfo device_type_info = { 1159 .name = TYPE_DEVICE, 1160 .parent = TYPE_OBJECT, 1161 .instance_size = sizeof(DeviceState), 1162 .instance_init = device_initfn, 1163 .instance_post_init = device_post_init, 1164 .instance_finalize = device_finalize, 1165 .class_base_init = device_class_base_init, 1166 .class_init = device_class_init, 1167 .abstract = true, 1168 .class_size = sizeof(DeviceClass), 1169 .interfaces = (InterfaceInfo[]) { 1170 { TYPE_VMSTATE_IF }, 1171 { } 1172 } 1173 }; 1174 1175 static void qdev_register_types(void) 1176 { 1177 type_register_static(&device_type_info); 1178 } 1179 1180 type_init(qdev_register_types) 1181