1 /* 2 * Dynamic device configuration and creation. 3 * 4 * Copyright (c) 2009 CodeSourcery 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 /* The theory here is that it should be possible to create a machine without 21 knowledge of specific devices. Historically board init routines have 22 passed a bunch of arguments to each device, requiring the board know 23 exactly which device it is dealing with. This file provides an abstract 24 API for device configuration and initialization. Devices will generally 25 inherit from a particular bus (e.g. PCI or I2C) rather than 26 this API directly. */ 27 28 #include "qemu/osdep.h" 29 #include "hw/qdev.h" 30 #include "sysemu/sysemu.h" 31 #include "qapi/error.h" 32 #include "qapi/qapi-events-misc.h" 33 #include "qapi/qmp/qerror.h" 34 #include "qapi/visitor.h" 35 #include "qemu/error-report.h" 36 #include "qemu/option.h" 37 #include "hw/hotplug.h" 38 #include "hw/boards.h" 39 #include "hw/sysbus.h" 40 41 bool qdev_hotplug = false; 42 static bool qdev_hot_added = false; 43 bool qdev_hot_removed = false; 44 45 const VMStateDescription *qdev_get_vmsd(DeviceState *dev) 46 { 47 DeviceClass *dc = DEVICE_GET_CLASS(dev); 48 return dc->vmsd; 49 } 50 51 static void bus_remove_child(BusState *bus, DeviceState *child) 52 { 53 BusChild *kid; 54 55 QTAILQ_FOREACH(kid, &bus->children, sibling) { 56 if (kid->child == child) { 57 char name[32]; 58 59 snprintf(name, sizeof(name), "child[%d]", kid->index); 60 QTAILQ_REMOVE(&bus->children, kid, sibling); 61 62 /* This gives back ownership of kid->child back to us. */ 63 object_property_del(OBJECT(bus), name, NULL); 64 object_unref(OBJECT(kid->child)); 65 g_free(kid); 66 return; 67 } 68 } 69 } 70 71 static void bus_add_child(BusState *bus, DeviceState *child) 72 { 73 char name[32]; 74 BusChild *kid = g_malloc0(sizeof(*kid)); 75 76 kid->index = bus->max_index++; 77 kid->child = child; 78 object_ref(OBJECT(kid->child)); 79 80 QTAILQ_INSERT_HEAD(&bus->children, kid, sibling); 81 82 /* This transfers ownership of kid->child to the property. */ 83 snprintf(name, sizeof(name), "child[%d]", kid->index); 84 object_property_add_link(OBJECT(bus), name, 85 object_get_typename(OBJECT(child)), 86 (Object **)&kid->child, 87 NULL, /* read-only property */ 88 0, /* return ownership on prop deletion */ 89 NULL); 90 } 91 92 void qdev_set_parent_bus(DeviceState *dev, BusState *bus) 93 { 94 bool replugging = dev->parent_bus != NULL; 95 96 if (replugging) { 97 /* Keep a reference to the device while it's not plugged into 98 * any bus, to avoid it potentially evaporating when it is 99 * dereffed in bus_remove_child(). 100 */ 101 object_ref(OBJECT(dev)); 102 bus_remove_child(dev->parent_bus, dev); 103 object_unref(OBJECT(dev->parent_bus)); 104 } 105 dev->parent_bus = bus; 106 object_ref(OBJECT(bus)); 107 bus_add_child(bus, dev); 108 if (replugging) { 109 object_unref(OBJECT(dev)); 110 } 111 } 112 113 /* Create a new device. This only initializes the device state 114 structure and allows properties to be set. The device still needs 115 to be realized. See qdev-core.h. */ 116 DeviceState *qdev_create(BusState *bus, const char *name) 117 { 118 DeviceState *dev; 119 120 dev = qdev_try_create(bus, name); 121 if (!dev) { 122 if (bus) { 123 error_report("Unknown device '%s' for bus '%s'", name, 124 object_get_typename(OBJECT(bus))); 125 } else { 126 error_report("Unknown device '%s' for default sysbus", name); 127 } 128 abort(); 129 } 130 131 return dev; 132 } 133 134 DeviceState *qdev_try_create(BusState *bus, const char *type) 135 { 136 DeviceState *dev; 137 138 if (object_class_by_name(type) == NULL) { 139 return NULL; 140 } 141 dev = DEVICE(object_new(type)); 142 if (!dev) { 143 return NULL; 144 } 145 146 if (!bus) { 147 /* Assert that the device really is a SysBusDevice before 148 * we put it onto the sysbus. Non-sysbus devices which aren't 149 * being put onto a bus should be created with object_new(TYPE_FOO), 150 * not qdev_create(NULL, TYPE_FOO). 151 */ 152 g_assert(object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE)); 153 bus = sysbus_get_default(); 154 } 155 156 qdev_set_parent_bus(dev, bus); 157 object_unref(OBJECT(dev)); 158 return dev; 159 } 160 161 static QTAILQ_HEAD(device_listeners, DeviceListener) device_listeners 162 = QTAILQ_HEAD_INITIALIZER(device_listeners); 163 164 enum ListenerDirection { Forward, Reverse }; 165 166 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \ 167 do { \ 168 DeviceListener *_listener; \ 169 \ 170 switch (_direction) { \ 171 case Forward: \ 172 QTAILQ_FOREACH(_listener, &device_listeners, link) { \ 173 if (_listener->_callback) { \ 174 _listener->_callback(_listener, ##_args); \ 175 } \ 176 } \ 177 break; \ 178 case Reverse: \ 179 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \ 180 device_listeners, link) { \ 181 if (_listener->_callback) { \ 182 _listener->_callback(_listener, ##_args); \ 183 } \ 184 } \ 185 break; \ 186 default: \ 187 abort(); \ 188 } \ 189 } while (0) 190 191 static int device_listener_add(DeviceState *dev, void *opaque) 192 { 193 DEVICE_LISTENER_CALL(realize, Forward, dev); 194 195 return 0; 196 } 197 198 void device_listener_register(DeviceListener *listener) 199 { 200 QTAILQ_INSERT_TAIL(&device_listeners, listener, link); 201 202 qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add, 203 NULL, NULL); 204 } 205 206 void device_listener_unregister(DeviceListener *listener) 207 { 208 QTAILQ_REMOVE(&device_listeners, listener, link); 209 } 210 211 static void device_realize(DeviceState *dev, Error **errp) 212 { 213 DeviceClass *dc = DEVICE_GET_CLASS(dev); 214 215 if (dc->init) { 216 int rc = dc->init(dev); 217 if (rc < 0) { 218 error_setg(errp, "Device initialization failed."); 219 return; 220 } 221 } 222 } 223 224 static void device_unrealize(DeviceState *dev, Error **errp) 225 { 226 DeviceClass *dc = DEVICE_GET_CLASS(dev); 227 228 if (dc->exit) { 229 int rc = dc->exit(dev); 230 if (rc < 0) { 231 error_setg(errp, "Device exit failed."); 232 return; 233 } 234 } 235 } 236 237 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id, 238 int required_for_version) 239 { 240 assert(!dev->realized); 241 dev->instance_id_alias = alias_id; 242 dev->alias_required_for_version = required_for_version; 243 } 244 245 HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev) 246 { 247 MachineState *machine; 248 MachineClass *mc; 249 Object *m_obj = qdev_get_machine(); 250 251 if (object_dynamic_cast(m_obj, TYPE_MACHINE)) { 252 machine = MACHINE(m_obj); 253 mc = MACHINE_GET_CLASS(machine); 254 if (mc->get_hotplug_handler) { 255 return mc->get_hotplug_handler(machine, dev); 256 } 257 } 258 259 return NULL; 260 } 261 262 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev) 263 { 264 HotplugHandler *hotplug_ctrl; 265 266 if (dev->parent_bus && dev->parent_bus->hotplug_handler) { 267 hotplug_ctrl = dev->parent_bus->hotplug_handler; 268 } else { 269 hotplug_ctrl = qdev_get_machine_hotplug_handler(dev); 270 } 271 return hotplug_ctrl; 272 } 273 274 static int qdev_reset_one(DeviceState *dev, void *opaque) 275 { 276 device_reset(dev); 277 278 return 0; 279 } 280 281 static int qbus_reset_one(BusState *bus, void *opaque) 282 { 283 BusClass *bc = BUS_GET_CLASS(bus); 284 if (bc->reset) { 285 bc->reset(bus); 286 } 287 return 0; 288 } 289 290 void qdev_reset_all(DeviceState *dev) 291 { 292 qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL); 293 } 294 295 void qdev_reset_all_fn(void *opaque) 296 { 297 qdev_reset_all(DEVICE(opaque)); 298 } 299 300 void qbus_reset_all(BusState *bus) 301 { 302 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL); 303 } 304 305 void qbus_reset_all_fn(void *opaque) 306 { 307 BusState *bus = opaque; 308 qbus_reset_all(bus); 309 } 310 311 /* can be used as ->unplug() callback for the simple cases */ 312 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev, 313 DeviceState *dev, Error **errp) 314 { 315 /* just zap it */ 316 object_unparent(OBJECT(dev)); 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_UNREF_ON_RELEASE, 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 is 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 if (hotplug_ctrl) { 862 hotplug_handler_plug(hotplug_ctrl, dev, &local_err); 863 } 864 865 if (local_err != NULL) { 866 goto post_realize_fail; 867 } 868 869 /* 870 * always free/re-initialize here since the value cannot be cleaned up 871 * in device_unrealize due to its usage later on in the unplug path 872 */ 873 g_free(dev->canonical_path); 874 dev->canonical_path = object_get_canonical_path(OBJECT(dev)); 875 876 if (qdev_get_vmsd(dev)) { 877 if (vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev, 878 dev->instance_id_alias, 879 dev->alias_required_for_version, 880 &local_err) < 0) { 881 goto post_realize_fail; 882 } 883 } 884 885 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 886 object_property_set_bool(OBJECT(bus), true, "realized", 887 &local_err); 888 if (local_err != NULL) { 889 goto child_realize_fail; 890 } 891 } 892 if (dev->hotplugged) { 893 device_reset(dev); 894 } 895 dev->pending_deleted_event = false; 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 qdev_prop_set_globals(DEVICE(obj)); 1002 } 1003 1004 /* Unlink device from bus and free the structure. */ 1005 static void device_finalize(Object *obj) 1006 { 1007 NamedGPIOList *ngl, *next; 1008 1009 DeviceState *dev = DEVICE(obj); 1010 1011 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) { 1012 QLIST_REMOVE(ngl, node); 1013 qemu_free_irqs(ngl->in, ngl->num_in); 1014 g_free(ngl->name); 1015 g_free(ngl); 1016 /* ngl->out irqs are owned by the other end and should not be freed 1017 * here 1018 */ 1019 } 1020 1021 /* Only send event if the device had been completely realized */ 1022 if (dev->pending_deleted_event) { 1023 g_assert(dev->canonical_path); 1024 1025 qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path, 1026 &error_abort); 1027 g_free(dev->canonical_path); 1028 dev->canonical_path = NULL; 1029 } 1030 1031 qemu_opts_del(dev->opts); 1032 } 1033 1034 static void device_class_base_init(ObjectClass *class, void *data) 1035 { 1036 DeviceClass *klass = DEVICE_CLASS(class); 1037 1038 /* We explicitly look up properties in the superclasses, 1039 * so do not propagate them to the subclasses. 1040 */ 1041 klass->props = NULL; 1042 } 1043 1044 static void device_unparent(Object *obj) 1045 { 1046 DeviceState *dev = DEVICE(obj); 1047 BusState *bus; 1048 1049 if (dev->realized) { 1050 object_property_set_bool(obj, false, "realized", NULL); 1051 } 1052 while (dev->num_child_bus) { 1053 bus = QLIST_FIRST(&dev->child_bus); 1054 object_unparent(OBJECT(bus)); 1055 } 1056 if (dev->parent_bus) { 1057 bus_remove_child(dev->parent_bus, dev); 1058 object_unref(OBJECT(dev->parent_bus)); 1059 dev->parent_bus = NULL; 1060 } 1061 } 1062 1063 static void device_class_init(ObjectClass *class, void *data) 1064 { 1065 DeviceClass *dc = DEVICE_CLASS(class); 1066 1067 class->unparent = device_unparent; 1068 dc->realize = device_realize; 1069 dc->unrealize = device_unrealize; 1070 1071 /* by default all devices were considered as hotpluggable, 1072 * so with intent to check it in generic qdev_unplug() / 1073 * device_set_realized() functions make every device 1074 * hotpluggable. Devices that shouldn't be hotpluggable, 1075 * should override it in their class_init() 1076 */ 1077 dc->hotpluggable = true; 1078 dc->user_creatable = true; 1079 } 1080 1081 void device_class_set_parent_reset(DeviceClass *dc, 1082 DeviceReset dev_reset, 1083 DeviceReset *parent_reset) 1084 { 1085 *parent_reset = dc->reset; 1086 dc->reset = dev_reset; 1087 } 1088 1089 void device_class_set_parent_realize(DeviceClass *dc, 1090 DeviceRealize dev_realize, 1091 DeviceRealize *parent_realize) 1092 { 1093 *parent_realize = dc->realize; 1094 dc->realize = dev_realize; 1095 } 1096 1097 void device_class_set_parent_unrealize(DeviceClass *dc, 1098 DeviceUnrealize dev_unrealize, 1099 DeviceUnrealize *parent_unrealize) 1100 { 1101 *parent_unrealize = dc->unrealize; 1102 dc->unrealize = dev_unrealize; 1103 } 1104 1105 void device_reset(DeviceState *dev) 1106 { 1107 DeviceClass *klass = DEVICE_GET_CLASS(dev); 1108 1109 if (klass->reset) { 1110 klass->reset(dev); 1111 } 1112 } 1113 1114 Object *qdev_get_machine(void) 1115 { 1116 static Object *dev; 1117 1118 if (dev == NULL) { 1119 dev = container_get(object_get_root(), "/machine"); 1120 } 1121 1122 return dev; 1123 } 1124 1125 static const TypeInfo device_type_info = { 1126 .name = TYPE_DEVICE, 1127 .parent = TYPE_OBJECT, 1128 .instance_size = sizeof(DeviceState), 1129 .instance_init = device_initfn, 1130 .instance_post_init = device_post_init, 1131 .instance_finalize = device_finalize, 1132 .class_base_init = device_class_base_init, 1133 .class_init = device_class_init, 1134 .abstract = true, 1135 .class_size = sizeof(DeviceClass), 1136 }; 1137 1138 static void qdev_register_types(void) 1139 { 1140 type_register_static(&device_type_info); 1141 } 1142 1143 type_init(qdev_register_types) 1144