1 /****************************************************************************** 2 * Copyright (C) 2010 Spectra Logic Corporation 3 * Copyright (C) 2008 Doug Rabson 4 * Copyright (C) 2005 Rusty Russell, IBM Corporation 5 * Copyright (C) 2005 Mike Wray, Hewlett-Packard 6 * Copyright (C) 2005 XenSource Ltd 7 * 8 * This file may be distributed separately from the Linux kernel, or 9 * incorporated into other software packages, subject to the following license: 10 * 11 * Permission is hereby granted, free of charge, to any person obtaining a copy 12 * of this source file (the "Software"), to deal in the Software without 13 * restriction, including without limitation the rights to use, copy, modify, 14 * merge, publish, distribute, sublicense, and/or sell copies of the Software, 15 * and to permit persons to whom the Software is furnished to do so, subject to 16 * the following conditions: 17 * 18 * The above copyright notice and this permission notice shall be included in 19 * all copies or substantial portions of the Software. 20 * 21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 26 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 27 * IN THE SOFTWARE. 28 */ 29 30 /** 31 * \file xenbusb.c 32 * 33 * \brief Shared support functions for managing the NewBus buses that contain 34 * Xen front and back end device instances. 35 * 36 * The NewBus implementation of XenBus attaches a xenbusb_front and xenbusb_back 37 * child bus to the xenstore device. This strategy allows the small differences 38 * in the handling of XenBus operations for front and back devices to be handled 39 * as overrides in xenbusb_front/back.c. Front and back specific device 40 * classes are also provided so device drivers can register for the devices they 41 * can handle without the need to filter within their probe routines. The 42 * net result is a device hierarchy that might look like this: 43 * 44 * xenstore0/ 45 * xenbusb_front0/ 46 * xn0 47 * xbd0 48 * xbd1 49 * xenbusb_back0/ 50 * xbbd0 51 * xnb0 52 * xnb1 53 */ 54 #include <sys/cdefs.h> 55 #include <sys/param.h> 56 #include <sys/bus.h> 57 #include <sys/kernel.h> 58 #include <sys/lock.h> 59 #include <sys/malloc.h> 60 #include <sys/module.h> 61 #include <sys/sbuf.h> 62 #include <sys/sysctl.h> 63 #include <sys/syslog.h> 64 #include <sys/systm.h> 65 #include <sys/sx.h> 66 #include <sys/taskqueue.h> 67 68 #include <machine/stdarg.h> 69 70 #include <xen/xen-os.h> 71 #include <xen/gnttab.h> 72 #include <xen/xenstore/xenstorevar.h> 73 #include <xen/xenbus/xenbusb.h> 74 #include <xen/xenbus/xenbusvar.h> 75 76 /*------------------------- Private Functions --------------------------------*/ 77 /** 78 * \brief Deallocate XenBus device instance variables. 79 * 80 * \param ivars The instance variable block to free. 81 */ 82 static void 83 xenbusb_free_child_ivars(struct xenbus_device_ivars *ivars) 84 { 85 if (ivars->xd_otherend_watch.node != NULL) { 86 xs_unregister_watch(&ivars->xd_otherend_watch); 87 free(ivars->xd_otherend_watch.node, M_XENBUS); 88 ivars->xd_otherend_watch.node = NULL; 89 } 90 91 if (ivars->xd_local_watch.node != NULL) { 92 xs_unregister_watch(&ivars->xd_local_watch); 93 ivars->xd_local_watch.node = NULL; 94 } 95 96 if (ivars->xd_node != NULL) { 97 free(ivars->xd_node, M_XENBUS); 98 ivars->xd_node = NULL; 99 } 100 ivars->xd_node_len = 0; 101 102 if (ivars->xd_type != NULL) { 103 free(ivars->xd_type, M_XENBUS); 104 ivars->xd_type = NULL; 105 } 106 107 if (ivars->xd_otherend_path != NULL) { 108 free(ivars->xd_otherend_path, M_XENBUS); 109 ivars->xd_otherend_path = NULL; 110 } 111 ivars->xd_otherend_path_len = 0; 112 113 free(ivars, M_XENBUS); 114 } 115 116 /** 117 * XenBus watch callback registered against the "state" XenStore 118 * node of the other-end of a split device connection. 119 * 120 * This callback is invoked whenever the state of a device instance's 121 * peer changes. 122 * 123 * \param watch The xs_watch object used to register this callback 124 * function. 125 * \param vec An array of pointers to NUL terminated strings containing 126 * watch event data. The vector should be indexed via the 127 * xs_watch_type enum in xs_wire.h. 128 * \param vec_size The number of elements in vec. 129 */ 130 static void 131 xenbusb_otherend_watch_cb(struct xs_watch *watch, const char **vec, 132 unsigned int vec_size __unused) 133 { 134 struct xenbus_device_ivars *ivars; 135 device_t child; 136 device_t bus; 137 const char *path; 138 enum xenbus_state newstate; 139 140 ivars = (struct xenbus_device_ivars *)watch->callback_data; 141 child = ivars->xd_dev; 142 bus = device_get_parent(child); 143 144 path = vec[XS_WATCH_PATH]; 145 if (ivars->xd_otherend_path == NULL 146 || strncmp(ivars->xd_otherend_path, path, ivars->xd_otherend_path_len)) 147 return; 148 149 newstate = xenbus_read_driver_state(ivars->xd_otherend_path); 150 XENBUSB_OTHEREND_CHANGED(bus, child, newstate); 151 } 152 153 /** 154 * XenBus watch callback registered against the XenStore sub-tree 155 * represnting the local half of a split device connection. 156 * 157 * This callback is invoked whenever any XenStore data in the subtree 158 * is modified, either by us or another privledged domain. 159 * 160 * \param watch The xs_watch object used to register this callback 161 * function. 162 * \param vec An array of pointers to NUL terminated strings containing 163 * watch event data. The vector should be indexed via the 164 * xs_watch_type enum in xs_wire.h. 165 * \param vec_size The number of elements in vec. 166 * 167 */ 168 static void 169 xenbusb_local_watch_cb(struct xs_watch *watch, const char **vec, 170 unsigned int vec_size __unused) 171 { 172 struct xenbus_device_ivars *ivars; 173 device_t child; 174 device_t bus; 175 const char *path; 176 177 ivars = (struct xenbus_device_ivars *)watch->callback_data; 178 child = ivars->xd_dev; 179 bus = device_get_parent(child); 180 181 path = vec[XS_WATCH_PATH]; 182 if (ivars->xd_node == NULL 183 || strncmp(ivars->xd_node, path, ivars->xd_node_len)) 184 return; 185 186 XENBUSB_LOCALEND_CHANGED(bus, child, &path[ivars->xd_node_len]); 187 } 188 189 /** 190 * Search our internal record of configured devices (not the XenStore) 191 * to determine if the XenBus device indicated by \a node is known to 192 * the system. 193 * 194 * \param dev The XenBus bus instance to search for device children. 195 * \param node The XenStore node path for the device to find. 196 * 197 * \return The device_t of the found device if any, or NULL. 198 * 199 * \note device_t is a pointer type, so it can be compared against 200 * NULL for validity. 201 */ 202 static device_t 203 xenbusb_device_exists(device_t dev, const char *node) 204 { 205 device_t *kids; 206 device_t result; 207 struct xenbus_device_ivars *ivars; 208 int i, count; 209 210 if (device_get_children(dev, &kids, &count)) 211 return (FALSE); 212 213 result = NULL; 214 for (i = 0; i < count; i++) { 215 ivars = device_get_ivars(kids[i]); 216 if (!strcmp(ivars->xd_node, node)) { 217 result = kids[i]; 218 break; 219 } 220 } 221 free(kids, M_TEMP); 222 223 return (result); 224 } 225 226 static void 227 xenbusb_delete_child(device_t dev, device_t child) 228 { 229 struct xenbus_device_ivars *ivars; 230 231 ivars = device_get_ivars(child); 232 233 /* 234 * We no longer care about the otherend of the 235 * connection. Cancel the watches now so that we 236 * don't try to handle an event for a partially 237 * detached child. 238 */ 239 if (ivars->xd_otherend_watch.node != NULL) 240 xs_unregister_watch(&ivars->xd_otherend_watch); 241 if (ivars->xd_local_watch.node != NULL) 242 xs_unregister_watch(&ivars->xd_local_watch); 243 244 device_delete_child(dev, child); 245 xenbusb_free_child_ivars(ivars); 246 } 247 248 /** 249 * \param dev The NewBus device representing this XenBus bus. 250 * \param child The NewBus device representing a child of dev%'s XenBus bus. 251 */ 252 static void 253 xenbusb_verify_device(device_t dev, device_t child) 254 { 255 if (xs_exists(XST_NIL, xenbus_get_node(child), "state") == 0) { 256 /* 257 * Device tree has been removed from Xenbus. 258 * Tear down the device. 259 */ 260 xenbusb_delete_child(dev, child); 261 } 262 } 263 264 /** 265 * \brief Enumerate the devices on a XenBus bus and register them with 266 * the NewBus device tree. 267 * 268 * xenbusb_enumerate_bus() will create entries (in state DS_NOTPRESENT) 269 * for nodes that appear in the XenStore, but will not invoke probe/attach 270 * operations on drivers. Probe/Attach processing must be separately 271 * performed via an invocation of xenbusb_probe_children(). This is usually 272 * done via the xbs_probe_children task. 273 * 274 * \param xbs XenBus Bus device softc of the owner of the bus to enumerate. 275 * 276 * \return On success, 0. Otherwise an errno value indicating the 277 * type of failure. 278 */ 279 static int 280 xenbusb_enumerate_bus(struct xenbusb_softc *xbs) 281 { 282 const char **types; 283 u_int type_idx; 284 u_int type_count; 285 int error; 286 287 error = xs_directory(XST_NIL, xbs->xbs_node, "", &type_count, &types); 288 if (error) 289 return (error); 290 291 for (type_idx = 0; type_idx < type_count; type_idx++) 292 XENBUSB_ENUMERATE_TYPE(xbs->xbs_dev, types[type_idx]); 293 294 free(types, M_XENSTORE); 295 296 return (0); 297 } 298 299 /** 300 * Handler for all generic XenBus device systcl nodes. 301 */ 302 static int 303 xenbusb_device_sysctl_handler(SYSCTL_HANDLER_ARGS) 304 { 305 device_t dev; 306 const char *value; 307 308 dev = (device_t)arg1; 309 switch (arg2) { 310 case XENBUS_IVAR_NODE: 311 value = xenbus_get_node(dev); 312 break; 313 case XENBUS_IVAR_TYPE: 314 value = xenbus_get_type(dev); 315 break; 316 case XENBUS_IVAR_STATE: 317 value = xenbus_strstate(xenbus_get_state(dev)); 318 break; 319 case XENBUS_IVAR_OTHEREND_ID: 320 return (sysctl_handle_int(oidp, NULL, 321 xenbus_get_otherend_id(dev), 322 req)); 323 /* NOTREACHED */ 324 case XENBUS_IVAR_OTHEREND_PATH: 325 value = xenbus_get_otherend_path(dev); 326 break; 327 default: 328 return (EINVAL); 329 } 330 return (SYSCTL_OUT_STR(req, value)); 331 } 332 333 /** 334 * Create read-only systcl nodes for xenbusb device ivar data. 335 * 336 * \param dev The XenBus device instance to register with sysctl. 337 */ 338 static void 339 xenbusb_device_sysctl_init(device_t dev) 340 { 341 struct sysctl_ctx_list *ctx; 342 struct sysctl_oid *tree; 343 344 ctx = device_get_sysctl_ctx(dev); 345 tree = device_get_sysctl_tree(dev); 346 347 SYSCTL_ADD_PROC(ctx, 348 SYSCTL_CHILDREN(tree), 349 OID_AUTO, 350 "xenstore_path", 351 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, 352 dev, 353 XENBUS_IVAR_NODE, 354 xenbusb_device_sysctl_handler, 355 "A", 356 "XenStore path to device"); 357 358 SYSCTL_ADD_PROC(ctx, 359 SYSCTL_CHILDREN(tree), 360 OID_AUTO, 361 "xenbus_dev_type", 362 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, 363 dev, 364 XENBUS_IVAR_TYPE, 365 xenbusb_device_sysctl_handler, 366 "A", 367 "XenBus device type"); 368 369 SYSCTL_ADD_PROC(ctx, 370 SYSCTL_CHILDREN(tree), 371 OID_AUTO, 372 "xenbus_connection_state", 373 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, 374 dev, 375 XENBUS_IVAR_STATE, 376 xenbusb_device_sysctl_handler, 377 "A", 378 "XenBus state of peer connection"); 379 380 SYSCTL_ADD_PROC(ctx, 381 SYSCTL_CHILDREN(tree), 382 OID_AUTO, 383 "xenbus_peer_domid", 384 CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, 385 dev, 386 XENBUS_IVAR_OTHEREND_ID, 387 xenbusb_device_sysctl_handler, 388 "I", 389 "Xen domain ID of peer"); 390 391 SYSCTL_ADD_PROC(ctx, 392 SYSCTL_CHILDREN(tree), 393 OID_AUTO, 394 "xenstore_peer_path", 395 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, 396 dev, 397 XENBUS_IVAR_OTHEREND_PATH, 398 xenbusb_device_sysctl_handler, 399 "A", 400 "XenStore path to peer device"); 401 } 402 403 /** 404 * \brief Decrement the number of XenBus child devices in the 405 * connecting state by one and release the xbs_attch_ch 406 * interrupt configuration hook if the connecting count 407 * drops to zero. 408 * 409 * \param xbs XenBus Bus device softc of the owner of the bus to enumerate. 410 */ 411 static void 412 xenbusb_release_confighook(struct xenbusb_softc *xbs) 413 { 414 mtx_lock(&xbs->xbs_lock); 415 KASSERT(xbs->xbs_connecting_children > 0, 416 ("Connecting device count error\n")); 417 xbs->xbs_connecting_children--; 418 if (xbs->xbs_connecting_children == 0 419 && (xbs->xbs_flags & XBS_ATTACH_CH_ACTIVE) != 0) { 420 xbs->xbs_flags &= ~XBS_ATTACH_CH_ACTIVE; 421 mtx_unlock(&xbs->xbs_lock); 422 config_intrhook_disestablish(&xbs->xbs_attach_ch); 423 } else { 424 mtx_unlock(&xbs->xbs_lock); 425 } 426 } 427 428 /** 429 * \brief Verify the existence of attached device instances and perform 430 * probe/attach processing for newly arrived devices. 431 * 432 * \param dev The NewBus device representing this XenBus bus. 433 * 434 * \return On success, 0. Otherwise an errno value indicating the 435 * type of failure. 436 */ 437 static int 438 xenbusb_probe_children(device_t dev) 439 { 440 device_t *kids; 441 struct xenbus_device_ivars *ivars; 442 int i, count, error; 443 444 if (device_get_children(dev, &kids, &count) == 0) { 445 for (i = 0; i < count; i++) { 446 if (device_get_state(kids[i]) != DS_NOTPRESENT) { 447 /* 448 * We already know about this one. 449 * Make sure it's still here. 450 */ 451 xenbusb_verify_device(dev, kids[i]); 452 continue; 453 } 454 455 error = device_probe_and_attach(kids[i]); 456 if (error == ENXIO) { 457 struct xenbusb_softc *xbs; 458 459 /* 460 * We don't have a PV driver for this device. 461 * However, an emulated device we do support 462 * may share this backend. Hide the node from 463 * XenBus until the next rescan, but leave it's 464 * state unchanged so we don't inadvertently 465 * prevent attachment of any emulated device. 466 */ 467 xenbusb_delete_child(dev, kids[i]); 468 469 /* 470 * Since the XenStore state of this device 471 * still indicates a pending attach, manually 472 * release it's hold on the boot process. 473 */ 474 xbs = device_get_softc(dev); 475 xenbusb_release_confighook(xbs); 476 477 continue; 478 } else if (error) { 479 /* 480 * Transition device to the closed state 481 * so the world knows that attachment will 482 * not occur. 483 */ 484 xenbus_set_state(kids[i], XenbusStateClosed); 485 486 /* 487 * Remove our record of this device. 488 * So long as it remains in the closed 489 * state in the XenStore, we will not find 490 * it again. The state will only change 491 * if the control domain actively reconfigures 492 * this device. 493 */ 494 xenbusb_delete_child(dev, kids[i]); 495 496 continue; 497 } 498 /* 499 * Augment default newbus provided dynamic sysctl 500 * variables with the standard ivar contents of 501 * XenBus devices. 502 */ 503 xenbusb_device_sysctl_init(kids[i]); 504 505 /* 506 * Now that we have a driver managing this device 507 * that can receive otherend state change events, 508 * hook up a watch for them. 509 */ 510 ivars = device_get_ivars(kids[i]); 511 xs_register_watch(&ivars->xd_otherend_watch); 512 xs_register_watch(&ivars->xd_local_watch); 513 } 514 free(kids, M_TEMP); 515 } 516 517 return (0); 518 } 519 520 /** 521 * \brief Task callback function to perform XenBus probe operations 522 * from a known safe context. 523 * 524 * \param arg The NewBus device_t representing the bus instance to 525 * on which to perform probe processing. 526 * \param pending The number of times this task was queued before it could 527 * be run. 528 */ 529 static void 530 xenbusb_probe_children_cb(void *arg, int pending __unused) 531 { 532 device_t dev = (device_t)arg; 533 534 bus_topo_lock(); 535 xenbusb_probe_children(dev); 536 bus_topo_unlock(); 537 } 538 539 /** 540 * \brief XenStore watch callback for the root node of the XenStore 541 * subtree representing a XenBus. 542 * 543 * This callback performs, or delegates to the xbs_probe_children task, 544 * all processing necessary to handle dynmaic device arrival and departure 545 * events from a XenBus. 546 * 547 * \param watch The XenStore watch object associated with this callback. 548 * \param vec The XenStore watch event data. 549 * \param len The number of fields in the event data stream. 550 */ 551 static void 552 xenbusb_devices_changed(struct xs_watch *watch, const char **vec, 553 unsigned int len) 554 { 555 struct xenbusb_softc *xbs; 556 device_t dev; 557 char *node; 558 char *type; 559 char *id; 560 char *p; 561 u_int component; 562 563 xbs = (struct xenbusb_softc *)watch->callback_data; 564 dev = xbs->xbs_dev; 565 566 if (len <= XS_WATCH_PATH) { 567 device_printf(dev, "xenbusb_devices_changed: " 568 "Short Event Data.\n"); 569 return; 570 } 571 572 node = strdup(vec[XS_WATCH_PATH], M_XENBUS); 573 p = strchr(node, '/'); 574 if (p == NULL) 575 goto out; 576 *p = 0; 577 type = p + 1; 578 579 p = strchr(type, '/'); 580 if (p == NULL) 581 goto out; 582 *p++ = 0; 583 584 /* 585 * Extract the device ID. A device ID has one or more path 586 * components separated by the '/' character. 587 * 588 * e.g. "<frontend vm id>/<frontend dev id>" for backend devices. 589 */ 590 id = p; 591 for (component = 0; component < xbs->xbs_id_components; component++) { 592 p = strchr(p, '/'); 593 if (p == NULL) 594 break; 595 p++; 596 } 597 if (p != NULL) 598 *p = 0; 599 600 if (*id != 0 && component >= xbs->xbs_id_components - 1) { 601 xenbusb_add_device(xbs->xbs_dev, type, id); 602 taskqueue_enqueue(taskqueue_thread, &xbs->xbs_probe_children); 603 } 604 out: 605 free(node, M_XENBUS); 606 } 607 608 /** 609 * \brief Interrupt configuration hook callback associated with xbs_attch_ch. 610 * 611 * Since interrupts are always functional at the time of XenBus configuration, 612 * there is nothing to be done when the callback occurs. This hook is only 613 * registered to hold up boot processing while XenBus devices come online. 614 * 615 * \param arg Unused configuration hook callback argument. 616 */ 617 static void 618 xenbusb_nop_confighook_cb(void *arg __unused) 619 { 620 } 621 622 /*--------------------------- Public Functions -------------------------------*/ 623 /*--------- API comments for these methods can be found in xenbusb.h ---------*/ 624 void 625 xenbusb_identify(driver_t *driver __unused, device_t parent) 626 { 627 /* 628 * A single instance of each bus type for which we have a driver 629 * is always present in a system operating under Xen. 630 */ 631 BUS_ADD_CHILD(parent, 0, driver->name, 0); 632 } 633 634 int 635 xenbusb_add_device(device_t dev, const char *type, const char *id) 636 { 637 struct xenbusb_softc *xbs; 638 struct sbuf *devpath_sbuf; 639 char *devpath; 640 struct xenbus_device_ivars *ivars; 641 int error; 642 643 xbs = device_get_softc(dev); 644 devpath_sbuf = sbuf_new_auto(); 645 sbuf_printf(devpath_sbuf, "%s/%s/%s", xbs->xbs_node, type, id); 646 sbuf_finish(devpath_sbuf); 647 devpath = sbuf_data(devpath_sbuf); 648 649 ivars = malloc(sizeof(*ivars), M_XENBUS, M_ZERO|M_WAITOK); 650 error = ENXIO; 651 652 if (xs_exists(XST_NIL, devpath, "") != 0) { 653 device_t child; 654 enum xenbus_state state; 655 char *statepath; 656 657 child = xenbusb_device_exists(dev, devpath); 658 if (child != NULL) { 659 /* 660 * We are already tracking this node 661 */ 662 error = 0; 663 goto out; 664 } 665 666 state = xenbus_read_driver_state(devpath); 667 if (state != XenbusStateInitialising) { 668 /* 669 * Device is not new, so ignore it. This can 670 * happen if a device is going away after 671 * switching to Closed. 672 */ 673 printf("xenbusb_add_device: Device %s ignored. " 674 "State %d\n", devpath, state); 675 error = 0; 676 goto out; 677 } 678 679 sx_init(&ivars->xd_lock, "xdlock"); 680 ivars->xd_flags = XDF_CONNECTING; 681 ivars->xd_node = strdup(devpath, M_XENBUS); 682 ivars->xd_node_len = strlen(devpath); 683 ivars->xd_type = strdup(type, M_XENBUS); 684 ivars->xd_state = XenbusStateInitialising; 685 686 error = XENBUSB_GET_OTHEREND_NODE(dev, ivars); 687 if (error) { 688 printf("xenbus_update_device: %s no otherend id\n", 689 devpath); 690 goto out; 691 } 692 693 statepath = malloc(ivars->xd_otherend_path_len 694 + strlen("/state") + 1, M_XENBUS, M_WAITOK); 695 sprintf(statepath, "%s/state", ivars->xd_otherend_path); 696 ivars->xd_otherend_watch.node = statepath; 697 ivars->xd_otherend_watch.callback = xenbusb_otherend_watch_cb; 698 ivars->xd_otherend_watch.callback_data = (uintptr_t)ivars; 699 /* 700 * Other end state node watch, limit to one pending event 701 * to prevent frontends from queuing too many events that 702 * could cause resource starvation. 703 */ 704 ivars->xd_otherend_watch.max_pending = 1; 705 706 ivars->xd_local_watch.node = ivars->xd_node; 707 ivars->xd_local_watch.callback = xenbusb_local_watch_cb; 708 ivars->xd_local_watch.callback_data = (uintptr_t)ivars; 709 /* 710 * Watch our local path, only writable by us or a privileged 711 * domain, no need to limit. 712 */ 713 ivars->xd_local_watch.max_pending = 0; 714 715 mtx_lock(&xbs->xbs_lock); 716 xbs->xbs_connecting_children++; 717 mtx_unlock(&xbs->xbs_lock); 718 719 child = device_add_child(dev, NULL, -1); 720 ivars->xd_dev = child; 721 device_set_ivars(child, ivars); 722 } 723 724 out: 725 sbuf_delete(devpath_sbuf); 726 if (error != 0) 727 xenbusb_free_child_ivars(ivars); 728 729 return (error); 730 } 731 732 int 733 xenbusb_attach(device_t dev, char *bus_node, u_int id_components) 734 { 735 struct xenbusb_softc *xbs; 736 737 xbs = device_get_softc(dev); 738 mtx_init(&xbs->xbs_lock, "xenbusb softc lock", NULL, MTX_DEF); 739 xbs->xbs_node = bus_node; 740 xbs->xbs_id_components = id_components; 741 xbs->xbs_dev = dev; 742 743 /* 744 * Since XenBus buses are attached to the XenStore, and 745 * the XenStore does not probe children until after interrupt 746 * services are available, this config hook is used solely 747 * to ensure that the remainder of the boot process (e.g. 748 * mount root) is deferred until child devices are adequately 749 * probed. We unblock the boot process as soon as the 750 * connecting child count in our softc goes to 0. 751 */ 752 xbs->xbs_attach_ch.ich_func = xenbusb_nop_confighook_cb; 753 xbs->xbs_attach_ch.ich_arg = dev; 754 config_intrhook_establish(&xbs->xbs_attach_ch); 755 xbs->xbs_flags |= XBS_ATTACH_CH_ACTIVE; 756 xbs->xbs_connecting_children = 1; 757 758 /* 759 * The subtree for this bus type may not yet exist 760 * causing initial enumeration to fail. We still 761 * want to return success from our attach though 762 * so that we are ready to handle devices for this 763 * bus when they are dynamically attached to us 764 * by a Xen management action. 765 */ 766 (void)xenbusb_enumerate_bus(xbs); 767 xenbusb_probe_children(dev); 768 769 xbs->xbs_device_watch.node = bus_node; 770 xbs->xbs_device_watch.callback = xenbusb_devices_changed; 771 xbs->xbs_device_watch.callback_data = (uintptr_t)xbs; 772 /* 773 * Allow for unlimited pending watches, as those are local paths 774 * either controlled by the guest or only writable by privileged 775 * domains. 776 */ 777 xbs->xbs_device_watch.max_pending = 0; 778 779 TASK_INIT(&xbs->xbs_probe_children, 0, xenbusb_probe_children_cb, dev); 780 781 xs_register_watch(&xbs->xbs_device_watch); 782 783 xenbusb_release_confighook(xbs); 784 785 return (0); 786 } 787 788 int 789 xenbusb_resume(device_t dev) 790 { 791 device_t *kids; 792 struct xenbus_device_ivars *ivars; 793 int i, count, error; 794 char *statepath; 795 796 /* 797 * We must re-examine each device and find the new path for 798 * its backend. 799 */ 800 if (device_get_children(dev, &kids, &count) == 0) { 801 for (i = 0; i < count; i++) { 802 if (device_get_state(kids[i]) == DS_NOTPRESENT) 803 continue; 804 805 if (xen_suspend_cancelled) { 806 DEVICE_RESUME(kids[i]); 807 continue; 808 } 809 810 ivars = device_get_ivars(kids[i]); 811 812 xs_unregister_watch(&ivars->xd_otherend_watch); 813 xenbus_set_state(kids[i], XenbusStateInitialising); 814 815 /* 816 * Find the new backend details and 817 * re-register our watch. 818 */ 819 error = XENBUSB_GET_OTHEREND_NODE(dev, ivars); 820 if (error) 821 return (error); 822 823 statepath = malloc(ivars->xd_otherend_path_len 824 + strlen("/state") + 1, M_XENBUS, M_WAITOK); 825 sprintf(statepath, "%s/state", ivars->xd_otherend_path); 826 827 free(ivars->xd_otherend_watch.node, M_XENBUS); 828 ivars->xd_otherend_watch.node = statepath; 829 830 DEVICE_RESUME(kids[i]); 831 832 xs_register_watch(&ivars->xd_otherend_watch); 833 #if 0 834 /* 835 * Can't do this yet since we are running in 836 * the xenwatch thread and if we sleep here, 837 * we will stop delivering watch notifications 838 * and the device will never come back online. 839 */ 840 sx_xlock(&ivars->xd_lock); 841 while (ivars->xd_state != XenbusStateClosed 842 && ivars->xd_state != XenbusStateConnected) 843 sx_sleep(&ivars->xd_state, &ivars->xd_lock, 844 0, "xdresume", 0); 845 sx_xunlock(&ivars->xd_lock); 846 #endif 847 } 848 free(kids, M_TEMP); 849 } 850 851 return (0); 852 } 853 854 int 855 xenbusb_print_child(device_t dev, device_t child) 856 { 857 struct xenbus_device_ivars *ivars = device_get_ivars(child); 858 int retval = 0; 859 860 retval += bus_print_child_header(dev, child); 861 retval += printf(" at %s", ivars->xd_node); 862 retval += bus_print_child_footer(dev, child); 863 864 return (retval); 865 } 866 867 int 868 xenbusb_read_ivar(device_t dev, device_t child, int index, uintptr_t *result) 869 { 870 struct xenbus_device_ivars *ivars = device_get_ivars(child); 871 872 switch (index) { 873 case XENBUS_IVAR_NODE: 874 *result = (uintptr_t) ivars->xd_node; 875 return (0); 876 877 case XENBUS_IVAR_TYPE: 878 *result = (uintptr_t) ivars->xd_type; 879 return (0); 880 881 case XENBUS_IVAR_STATE: 882 *result = (uintptr_t) ivars->xd_state; 883 return (0); 884 885 case XENBUS_IVAR_OTHEREND_ID: 886 *result = (uintptr_t) ivars->xd_otherend_id; 887 return (0); 888 889 case XENBUS_IVAR_OTHEREND_PATH: 890 *result = (uintptr_t) ivars->xd_otherend_path; 891 return (0); 892 } 893 894 return (ENOENT); 895 } 896 897 int 898 xenbusb_write_ivar(device_t dev, device_t child, int index, uintptr_t value) 899 { 900 struct xenbus_device_ivars *ivars = device_get_ivars(child); 901 enum xenbus_state newstate; 902 int currstate; 903 904 switch (index) { 905 case XENBUS_IVAR_STATE: 906 { 907 int error; 908 struct xs_transaction xst; 909 910 newstate = (enum xenbus_state)value; 911 sx_xlock(&ivars->xd_lock); 912 if (ivars->xd_state == newstate) { 913 error = 0; 914 goto out; 915 } 916 917 do { 918 error = xs_transaction_start(&xst); 919 if (error != 0) 920 goto out; 921 922 do { 923 error = xs_scanf(xst, ivars->xd_node, "state", 924 NULL, "%d", &currstate); 925 } while (error == EAGAIN); 926 if (error) 927 goto out; 928 929 do { 930 error = xs_printf(xst, ivars->xd_node, "state", 931 "%d", newstate); 932 } while (error == EAGAIN); 933 if (error) { 934 /* 935 * Avoid looping through xenbus_dev_fatal() 936 * which calls xenbus_write_ivar to set the 937 * state to closing. 938 */ 939 if (newstate != XenbusStateClosing) 940 xenbus_dev_fatal(dev, error, 941 "writing new state"); 942 goto out; 943 } 944 } while (xs_transaction_end(xst, 0)); 945 ivars->xd_state = newstate; 946 947 if ((ivars->xd_flags & XDF_CONNECTING) != 0 && 948 (newstate == XenbusStateClosed || 949 newstate == XenbusStateConnected)) { 950 struct xenbusb_softc *xbs; 951 952 ivars->xd_flags &= ~XDF_CONNECTING; 953 xbs = device_get_softc(dev); 954 xenbusb_release_confighook(xbs); 955 } 956 957 wakeup(&ivars->xd_state); 958 out: 959 if (error != 0) 960 xs_transaction_end(xst, 1); 961 sx_xunlock(&ivars->xd_lock); 962 /* 963 * Shallow ENOENT errors, as returning an error here will 964 * trigger a panic. ENOENT is fine to ignore, because it means 965 * the toolstack has removed the state node as part of 966 * destroying the device, and so we have to shut down the 967 * device without recreating it or else the node would be 968 * leaked. 969 */ 970 return (error == ENOENT ? 0 : error); 971 } 972 973 case XENBUS_IVAR_NODE: 974 case XENBUS_IVAR_TYPE: 975 case XENBUS_IVAR_OTHEREND_ID: 976 case XENBUS_IVAR_OTHEREND_PATH: 977 /* 978 * These variables are read-only. 979 */ 980 return (EINVAL); 981 } 982 983 return (ENOENT); 984 } 985 986 void 987 xenbusb_otherend_changed(device_t bus, device_t child, enum xenbus_state state) 988 { 989 XENBUS_OTHEREND_CHANGED(child, state); 990 } 991 992 void 993 xenbusb_localend_changed(device_t bus, device_t child, const char *path) 994 { 995 996 if (strcmp(path, "/state") != 0) { 997 struct xenbus_device_ivars *ivars; 998 999 ivars = device_get_ivars(child); 1000 sx_xlock(&ivars->xd_lock); 1001 ivars->xd_state = xenbus_read_driver_state(ivars->xd_node); 1002 sx_xunlock(&ivars->xd_lock); 1003 } 1004 XENBUS_LOCALEND_CHANGED(child, path); 1005 } 1006