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