1 /* 2 * QEMU Hyper-V VMBus 3 * 4 * Copyright (c) 2017-2018 Virtuozzo International GmbH. 5 * 6 * This work is licensed under the terms of the GNU GPL, version 2 or later. 7 * See the COPYING file in the top-level directory. 8 */ 9 10 #include "qemu/osdep.h" 11 #include "qemu/error-report.h" 12 #include "qemu/main-loop.h" 13 #include "qapi/error.h" 14 #include "migration/vmstate.h" 15 #include "hw/qdev-properties.h" 16 #include "hw/hyperv/hyperv.h" 17 #include "hw/hyperv/vmbus.h" 18 #include "hw/hyperv/vmbus-bridge.h" 19 #include "hw/sysbus.h" 20 #include "cpu.h" 21 #include "trace.h" 22 23 #define TYPE_VMBUS "vmbus" 24 #define VMBUS(obj) OBJECT_CHECK(VMBus, (obj), TYPE_VMBUS) 25 26 enum { 27 VMGPADL_INIT, 28 VMGPADL_ALIVE, 29 VMGPADL_TEARINGDOWN, 30 VMGPADL_TORNDOWN, 31 }; 32 33 struct VMBusGpadl { 34 /* GPADL id */ 35 uint32_t id; 36 /* associated channel id (rudimentary?) */ 37 uint32_t child_relid; 38 39 /* number of pages in the GPADL as declared in GPADL_HEADER message */ 40 uint32_t num_gfns; 41 /* 42 * Due to limited message size, GPADL may not fit fully in a single 43 * GPADL_HEADER message, and is further popluated using GPADL_BODY 44 * messages. @seen_gfns is the number of pages seen so far; once it 45 * reaches @num_gfns, the GPADL is ready to use. 46 */ 47 uint32_t seen_gfns; 48 /* array of GFNs (of size @num_gfns once allocated) */ 49 uint64_t *gfns; 50 51 uint8_t state; 52 53 QTAILQ_ENTRY(VMBusGpadl) link; 54 VMBus *vmbus; 55 unsigned refcount; 56 }; 57 58 /* 59 * Wrap sequential read from / write to GPADL. 60 */ 61 typedef struct GpadlIter { 62 VMBusGpadl *gpadl; 63 AddressSpace *as; 64 DMADirection dir; 65 /* offset into GPADL where the next i/o will be performed */ 66 uint32_t off; 67 /* 68 * Cached mapping of the currently accessed page, up to page boundary. 69 * Updated lazily on i/o. 70 * Note: MemoryRegionCache can not be used here because pages in the GPADL 71 * are non-contiguous and may belong to different memory regions. 72 */ 73 void *map; 74 /* offset after last i/o (i.e. not affected by seek) */ 75 uint32_t last_off; 76 /* 77 * Indicator that the iterator is active and may have a cached mapping. 78 * Allows to enforce bracketing of all i/o (which may create cached 79 * mappings) and thus exclude mapping leaks. 80 */ 81 bool active; 82 } GpadlIter; 83 84 /* 85 * Ring buffer. There are two of them, sitting in the same GPADL, for each 86 * channel. 87 * Each ring buffer consists of a set of pages, with the first page containing 88 * the ring buffer header, and the remaining pages being for data packets. 89 */ 90 typedef struct VMBusRingBufCommon { 91 AddressSpace *as; 92 /* GPA of the ring buffer header */ 93 dma_addr_t rb_addr; 94 /* start and length of the ring buffer data area within GPADL */ 95 uint32_t base; 96 uint32_t len; 97 98 GpadlIter iter; 99 } VMBusRingBufCommon; 100 101 typedef struct VMBusSendRingBuf { 102 VMBusRingBufCommon common; 103 /* current write index, to be committed at the end of send */ 104 uint32_t wr_idx; 105 /* write index at the start of send */ 106 uint32_t last_wr_idx; 107 /* space to be requested from the guest */ 108 uint32_t wanted; 109 /* space reserved for planned sends */ 110 uint32_t reserved; 111 /* last seen read index */ 112 uint32_t last_seen_rd_idx; 113 } VMBusSendRingBuf; 114 115 typedef struct VMBusRecvRingBuf { 116 VMBusRingBufCommon common; 117 /* current read index, to be committed at the end of receive */ 118 uint32_t rd_idx; 119 /* read index at the start of receive */ 120 uint32_t last_rd_idx; 121 /* last seen write index */ 122 uint32_t last_seen_wr_idx; 123 } VMBusRecvRingBuf; 124 125 126 enum { 127 VMOFFER_INIT, 128 VMOFFER_SENDING, 129 VMOFFER_SENT, 130 }; 131 132 enum { 133 VMCHAN_INIT, 134 VMCHAN_OPENING, 135 VMCHAN_OPEN, 136 }; 137 138 struct VMBusChannel { 139 VMBusDevice *dev; 140 141 /* channel id */ 142 uint32_t id; 143 /* 144 * subchannel index within the device; subchannel #0 is "primary" and 145 * always exists 146 */ 147 uint16_t subchan_idx; 148 uint32_t open_id; 149 /* VP_INDEX of the vCPU to notify with (synthetic) interrupts */ 150 uint32_t target_vp; 151 /* GPADL id to use for the ring buffers */ 152 uint32_t ringbuf_gpadl; 153 /* start (in pages) of the send ring buffer within @ringbuf_gpadl */ 154 uint32_t ringbuf_send_offset; 155 156 uint8_t offer_state; 157 uint8_t state; 158 bool is_open; 159 160 /* main device worker; copied from the device class */ 161 VMBusChannelNotifyCb notify_cb; 162 /* 163 * guest->host notifications, either sent directly or dispatched via 164 * interrupt page (older VMBus) 165 */ 166 EventNotifier notifier; 167 168 VMBus *vmbus; 169 /* 170 * SINT route to signal with host->guest notifications; may be shared with 171 * the main VMBus SINT route 172 */ 173 HvSintRoute *notify_route; 174 VMBusGpadl *gpadl; 175 176 VMBusSendRingBuf send_ringbuf; 177 VMBusRecvRingBuf recv_ringbuf; 178 179 QTAILQ_ENTRY(VMBusChannel) link; 180 }; 181 182 /* 183 * Hyper-V spec mandates that every message port has 16 buffers, which means 184 * that the guest can post up to this many messages without blocking. 185 * Therefore a queue for incoming messages has to be provided. 186 * For outgoing (i.e. host->guest) messages there's no queue; the VMBus just 187 * doesn't transition to a new state until the message is known to have been 188 * successfully delivered to the respective SynIC message slot. 189 */ 190 #define HV_MSG_QUEUE_LEN 16 191 192 /* Hyper-V devices never use channel #0. Must be something special. */ 193 #define VMBUS_FIRST_CHANID 1 194 /* Each channel occupies one bit within a single event page sint slot. */ 195 #define VMBUS_CHANID_COUNT (HV_EVENT_FLAGS_COUNT - VMBUS_FIRST_CHANID) 196 /* Leave a few connection numbers for other purposes. */ 197 #define VMBUS_CHAN_CONNECTION_OFFSET 16 198 199 /* 200 * Since the success or failure of sending a message is reported 201 * asynchronously, the VMBus state machine has effectively two entry points: 202 * vmbus_run and vmbus_msg_cb (the latter is called when the host->guest 203 * message delivery status becomes known). Both are run as oneshot BHs on the 204 * main aio context, ensuring serialization. 205 */ 206 enum { 207 VMBUS_LISTEN, 208 VMBUS_HANDSHAKE, 209 VMBUS_OFFER, 210 VMBUS_CREATE_GPADL, 211 VMBUS_TEARDOWN_GPADL, 212 VMBUS_OPEN_CHANNEL, 213 VMBUS_UNLOAD, 214 VMBUS_STATE_MAX 215 }; 216 217 struct VMBus { 218 BusState parent; 219 220 uint8_t state; 221 /* protection against recursive aio_poll (see vmbus_run) */ 222 bool in_progress; 223 /* whether there's a message being delivered to the guest */ 224 bool msg_in_progress; 225 uint32_t version; 226 /* VP_INDEX of the vCPU to send messages and interrupts to */ 227 uint32_t target_vp; 228 HvSintRoute *sint_route; 229 /* 230 * interrupt page for older protocol versions; newer ones use SynIC event 231 * flags directly 232 */ 233 hwaddr int_page_gpa; 234 235 DECLARE_BITMAP(chanid_bitmap, VMBUS_CHANID_COUNT); 236 237 /* incoming message queue */ 238 struct hyperv_post_message_input rx_queue[HV_MSG_QUEUE_LEN]; 239 uint8_t rx_queue_head; 240 uint8_t rx_queue_size; 241 QemuMutex rx_queue_lock; 242 243 QTAILQ_HEAD(, VMBusGpadl) gpadl_list; 244 QTAILQ_HEAD(, VMBusChannel) channel_list; 245 246 /* 247 * guest->host notifications for older VMBus, to be dispatched via 248 * interrupt page 249 */ 250 EventNotifier notifier; 251 }; 252 253 static bool gpadl_full(VMBusGpadl *gpadl) 254 { 255 return gpadl->seen_gfns == gpadl->num_gfns; 256 } 257 258 static VMBusGpadl *create_gpadl(VMBus *vmbus, uint32_t id, 259 uint32_t child_relid, uint32_t num_gfns) 260 { 261 VMBusGpadl *gpadl = g_new0(VMBusGpadl, 1); 262 263 gpadl->id = id; 264 gpadl->child_relid = child_relid; 265 gpadl->num_gfns = num_gfns; 266 gpadl->gfns = g_new(uint64_t, num_gfns); 267 QTAILQ_INSERT_HEAD(&vmbus->gpadl_list, gpadl, link); 268 gpadl->vmbus = vmbus; 269 gpadl->refcount = 1; 270 return gpadl; 271 } 272 273 static void free_gpadl(VMBusGpadl *gpadl) 274 { 275 QTAILQ_REMOVE(&gpadl->vmbus->gpadl_list, gpadl, link); 276 g_free(gpadl->gfns); 277 g_free(gpadl); 278 } 279 280 static VMBusGpadl *find_gpadl(VMBus *vmbus, uint32_t gpadl_id) 281 { 282 VMBusGpadl *gpadl; 283 QTAILQ_FOREACH(gpadl, &vmbus->gpadl_list, link) { 284 if (gpadl->id == gpadl_id) { 285 return gpadl; 286 } 287 } 288 return NULL; 289 } 290 291 VMBusGpadl *vmbus_get_gpadl(VMBusChannel *chan, uint32_t gpadl_id) 292 { 293 VMBusGpadl *gpadl = find_gpadl(chan->vmbus, gpadl_id); 294 if (!gpadl || !gpadl_full(gpadl)) { 295 return NULL; 296 } 297 gpadl->refcount++; 298 return gpadl; 299 } 300 301 void vmbus_put_gpadl(VMBusGpadl *gpadl) 302 { 303 if (!gpadl) { 304 return; 305 } 306 if (--gpadl->refcount) { 307 return; 308 } 309 free_gpadl(gpadl); 310 } 311 312 uint32_t vmbus_gpadl_len(VMBusGpadl *gpadl) 313 { 314 return gpadl->num_gfns * TARGET_PAGE_SIZE; 315 } 316 317 static void gpadl_iter_init(GpadlIter *iter, VMBusGpadl *gpadl, 318 AddressSpace *as, DMADirection dir) 319 { 320 iter->gpadl = gpadl; 321 iter->as = as; 322 iter->dir = dir; 323 iter->active = false; 324 } 325 326 static inline void gpadl_iter_cache_unmap(GpadlIter *iter) 327 { 328 uint32_t map_start_in_page = (uintptr_t)iter->map & ~TARGET_PAGE_MASK; 329 uint32_t io_end_in_page = ((iter->last_off - 1) & ~TARGET_PAGE_MASK) + 1; 330 331 /* mapping is only done to do non-zero amount of i/o */ 332 assert(iter->last_off > 0); 333 assert(map_start_in_page < io_end_in_page); 334 335 dma_memory_unmap(iter->as, iter->map, TARGET_PAGE_SIZE - map_start_in_page, 336 iter->dir, io_end_in_page - map_start_in_page); 337 } 338 339 /* 340 * Copy exactly @len bytes between the GPADL pointed to by @iter and @buf. 341 * The direction of the copy is determined by @iter->dir. 342 * The caller must ensure the operation overflows neither @buf nor the GPADL 343 * (there's an assert for the latter). 344 * Reuse the currently mapped page in the GPADL if possible. 345 */ 346 static ssize_t gpadl_iter_io(GpadlIter *iter, void *buf, uint32_t len) 347 { 348 ssize_t ret = len; 349 350 assert(iter->active); 351 352 while (len) { 353 uint32_t off_in_page = iter->off & ~TARGET_PAGE_MASK; 354 uint32_t pgleft = TARGET_PAGE_SIZE - off_in_page; 355 uint32_t cplen = MIN(pgleft, len); 356 void *p; 357 358 /* try to reuse the cached mapping */ 359 if (iter->map) { 360 uint32_t map_start_in_page = 361 (uintptr_t)iter->map & ~TARGET_PAGE_MASK; 362 uint32_t off_base = iter->off & ~TARGET_PAGE_MASK; 363 uint32_t mapped_base = (iter->last_off - 1) & ~TARGET_PAGE_MASK; 364 if (off_base != mapped_base || off_in_page < map_start_in_page) { 365 gpadl_iter_cache_unmap(iter); 366 iter->map = NULL; 367 } 368 } 369 370 if (!iter->map) { 371 dma_addr_t maddr; 372 dma_addr_t mlen = pgleft; 373 uint32_t idx = iter->off >> TARGET_PAGE_BITS; 374 assert(idx < iter->gpadl->num_gfns); 375 376 maddr = (iter->gpadl->gfns[idx] << TARGET_PAGE_BITS) | off_in_page; 377 378 iter->map = dma_memory_map(iter->as, maddr, &mlen, iter->dir); 379 if (mlen != pgleft) { 380 dma_memory_unmap(iter->as, iter->map, mlen, iter->dir, 0); 381 iter->map = NULL; 382 return -EFAULT; 383 } 384 } 385 386 p = (void *)(((uintptr_t)iter->map & TARGET_PAGE_MASK) | off_in_page); 387 if (iter->dir == DMA_DIRECTION_FROM_DEVICE) { 388 memcpy(p, buf, cplen); 389 } else { 390 memcpy(buf, p, cplen); 391 } 392 393 buf += cplen; 394 len -= cplen; 395 iter->off += cplen; 396 iter->last_off = iter->off; 397 } 398 399 return ret; 400 } 401 402 /* 403 * Position the iterator @iter at new offset @new_off. 404 * If this results in the cached mapping being unusable with the new offset, 405 * unmap it. 406 */ 407 static inline void gpadl_iter_seek(GpadlIter *iter, uint32_t new_off) 408 { 409 assert(iter->active); 410 iter->off = new_off; 411 } 412 413 /* 414 * Start a series of i/o on the GPADL. 415 * After this i/o and seek operations on @iter become legal. 416 */ 417 static inline void gpadl_iter_start_io(GpadlIter *iter) 418 { 419 assert(!iter->active); 420 /* mapping is cached lazily on i/o */ 421 iter->map = NULL; 422 iter->active = true; 423 } 424 425 /* 426 * End the eariler started series of i/o on the GPADL and release the cached 427 * mapping if any. 428 */ 429 static inline void gpadl_iter_end_io(GpadlIter *iter) 430 { 431 assert(iter->active); 432 433 if (iter->map) { 434 gpadl_iter_cache_unmap(iter); 435 } 436 437 iter->active = false; 438 } 439 440 static void vmbus_resched(VMBus *vmbus); 441 static void vmbus_msg_cb(void *data, int status); 442 443 ssize_t vmbus_iov_to_gpadl(VMBusChannel *chan, VMBusGpadl *gpadl, uint32_t off, 444 const struct iovec *iov, size_t iov_cnt) 445 { 446 GpadlIter iter; 447 size_t i; 448 ssize_t ret = 0; 449 450 gpadl_iter_init(&iter, gpadl, chan->dev->dma_as, 451 DMA_DIRECTION_FROM_DEVICE); 452 gpadl_iter_start_io(&iter); 453 gpadl_iter_seek(&iter, off); 454 for (i = 0; i < iov_cnt; i++) { 455 ret = gpadl_iter_io(&iter, iov[i].iov_base, iov[i].iov_len); 456 if (ret < 0) { 457 goto out; 458 } 459 } 460 out: 461 gpadl_iter_end_io(&iter); 462 return ret; 463 } 464 465 int vmbus_map_sgl(VMBusChanReq *req, DMADirection dir, struct iovec *iov, 466 unsigned iov_cnt, size_t len, size_t off) 467 { 468 int ret_cnt = 0, ret; 469 unsigned i; 470 QEMUSGList *sgl = &req->sgl; 471 ScatterGatherEntry *sg = sgl->sg; 472 473 for (i = 0; i < sgl->nsg; i++) { 474 if (sg[i].len > off) { 475 break; 476 } 477 off -= sg[i].len; 478 } 479 for (; len && i < sgl->nsg; i++) { 480 dma_addr_t mlen = MIN(sg[i].len - off, len); 481 dma_addr_t addr = sg[i].base + off; 482 len -= mlen; 483 off = 0; 484 485 for (; mlen; ret_cnt++) { 486 dma_addr_t l = mlen; 487 dma_addr_t a = addr; 488 489 if (ret_cnt == iov_cnt) { 490 ret = -ENOBUFS; 491 goto err; 492 } 493 494 iov[ret_cnt].iov_base = dma_memory_map(sgl->as, a, &l, dir); 495 if (!l) { 496 ret = -EFAULT; 497 goto err; 498 } 499 iov[ret_cnt].iov_len = l; 500 addr += l; 501 mlen -= l; 502 } 503 } 504 505 return ret_cnt; 506 err: 507 vmbus_unmap_sgl(req, dir, iov, ret_cnt, 0); 508 return ret; 509 } 510 511 void vmbus_unmap_sgl(VMBusChanReq *req, DMADirection dir, struct iovec *iov, 512 unsigned iov_cnt, size_t accessed) 513 { 514 QEMUSGList *sgl = &req->sgl; 515 unsigned i; 516 517 for (i = 0; i < iov_cnt; i++) { 518 size_t acsd = MIN(accessed, iov[i].iov_len); 519 dma_memory_unmap(sgl->as, iov[i].iov_base, iov[i].iov_len, dir, acsd); 520 accessed -= acsd; 521 } 522 } 523 524 static const VMStateDescription vmstate_gpadl = { 525 .name = "vmbus/gpadl", 526 .version_id = 0, 527 .minimum_version_id = 0, 528 .fields = (VMStateField[]) { 529 VMSTATE_UINT32(id, VMBusGpadl), 530 VMSTATE_UINT32(child_relid, VMBusGpadl), 531 VMSTATE_UINT32(num_gfns, VMBusGpadl), 532 VMSTATE_UINT32(seen_gfns, VMBusGpadl), 533 VMSTATE_VARRAY_UINT32_ALLOC(gfns, VMBusGpadl, num_gfns, 0, 534 vmstate_info_uint64, uint64_t), 535 VMSTATE_UINT8(state, VMBusGpadl), 536 VMSTATE_END_OF_LIST() 537 } 538 }; 539 540 /* 541 * Wrap the index into a ring buffer of @len bytes. 542 * @idx is assumed not to exceed twice the size of the ringbuffer, so only 543 * single wraparound is considered. 544 */ 545 static inline uint32_t rb_idx_wrap(uint32_t idx, uint32_t len) 546 { 547 if (idx >= len) { 548 idx -= len; 549 } 550 return idx; 551 } 552 553 /* 554 * Circular difference between two indices into a ring buffer of @len bytes. 555 * @allow_catchup - whether @idx1 may catch up @idx2; e.g. read index may catch 556 * up write index but not vice versa. 557 */ 558 static inline uint32_t rb_idx_delta(uint32_t idx1, uint32_t idx2, uint32_t len, 559 bool allow_catchup) 560 { 561 return rb_idx_wrap(idx2 + len - idx1 - !allow_catchup, len); 562 } 563 564 static vmbus_ring_buffer *ringbuf_map_hdr(VMBusRingBufCommon *ringbuf) 565 { 566 vmbus_ring_buffer *rb; 567 dma_addr_t mlen = sizeof(*rb); 568 569 rb = dma_memory_map(ringbuf->as, ringbuf->rb_addr, &mlen, 570 DMA_DIRECTION_FROM_DEVICE); 571 if (mlen != sizeof(*rb)) { 572 dma_memory_unmap(ringbuf->as, rb, mlen, 573 DMA_DIRECTION_FROM_DEVICE, 0); 574 return NULL; 575 } 576 return rb; 577 } 578 579 static void ringbuf_unmap_hdr(VMBusRingBufCommon *ringbuf, 580 vmbus_ring_buffer *rb, bool dirty) 581 { 582 assert(rb); 583 584 dma_memory_unmap(ringbuf->as, rb, sizeof(*rb), DMA_DIRECTION_FROM_DEVICE, 585 dirty ? sizeof(*rb) : 0); 586 } 587 588 static void ringbuf_init_common(VMBusRingBufCommon *ringbuf, VMBusGpadl *gpadl, 589 AddressSpace *as, DMADirection dir, 590 uint32_t begin, uint32_t end) 591 { 592 ringbuf->as = as; 593 ringbuf->rb_addr = gpadl->gfns[begin] << TARGET_PAGE_BITS; 594 ringbuf->base = (begin + 1) << TARGET_PAGE_BITS; 595 ringbuf->len = (end - begin - 1) << TARGET_PAGE_BITS; 596 gpadl_iter_init(&ringbuf->iter, gpadl, as, dir); 597 } 598 599 static int ringbufs_init(VMBusChannel *chan) 600 { 601 vmbus_ring_buffer *rb; 602 VMBusSendRingBuf *send_ringbuf = &chan->send_ringbuf; 603 VMBusRecvRingBuf *recv_ringbuf = &chan->recv_ringbuf; 604 605 if (chan->ringbuf_send_offset <= 1 || 606 chan->gpadl->num_gfns <= chan->ringbuf_send_offset + 1) { 607 return -EINVAL; 608 } 609 610 ringbuf_init_common(&recv_ringbuf->common, chan->gpadl, chan->dev->dma_as, 611 DMA_DIRECTION_TO_DEVICE, 0, chan->ringbuf_send_offset); 612 ringbuf_init_common(&send_ringbuf->common, chan->gpadl, chan->dev->dma_as, 613 DMA_DIRECTION_FROM_DEVICE, chan->ringbuf_send_offset, 614 chan->gpadl->num_gfns); 615 send_ringbuf->wanted = 0; 616 send_ringbuf->reserved = 0; 617 618 rb = ringbuf_map_hdr(&recv_ringbuf->common); 619 if (!rb) { 620 return -EFAULT; 621 } 622 recv_ringbuf->rd_idx = recv_ringbuf->last_rd_idx = rb->read_index; 623 ringbuf_unmap_hdr(&recv_ringbuf->common, rb, false); 624 625 rb = ringbuf_map_hdr(&send_ringbuf->common); 626 if (!rb) { 627 return -EFAULT; 628 } 629 send_ringbuf->wr_idx = send_ringbuf->last_wr_idx = rb->write_index; 630 send_ringbuf->last_seen_rd_idx = rb->read_index; 631 rb->feature_bits |= VMBUS_RING_BUFFER_FEAT_PENDING_SZ; 632 ringbuf_unmap_hdr(&send_ringbuf->common, rb, true); 633 634 if (recv_ringbuf->rd_idx >= recv_ringbuf->common.len || 635 send_ringbuf->wr_idx >= send_ringbuf->common.len) { 636 return -EOVERFLOW; 637 } 638 639 return 0; 640 } 641 642 /* 643 * Perform io between the GPADL-backed ringbuffer @ringbuf and @buf, wrapping 644 * around if needed. 645 * @len is assumed not to exceed the size of the ringbuffer, so only single 646 * wraparound is considered. 647 */ 648 static ssize_t ringbuf_io(VMBusRingBufCommon *ringbuf, void *buf, uint32_t len) 649 { 650 ssize_t ret1 = 0, ret2 = 0; 651 uint32_t remain = ringbuf->len + ringbuf->base - ringbuf->iter.off; 652 653 if (len >= remain) { 654 ret1 = gpadl_iter_io(&ringbuf->iter, buf, remain); 655 if (ret1 < 0) { 656 return ret1; 657 } 658 gpadl_iter_seek(&ringbuf->iter, ringbuf->base); 659 buf += remain; 660 len -= remain; 661 } 662 ret2 = gpadl_iter_io(&ringbuf->iter, buf, len); 663 if (ret2 < 0) { 664 return ret2; 665 } 666 return ret1 + ret2; 667 } 668 669 /* 670 * Position the circular iterator within @ringbuf to offset @new_off, wrapping 671 * around if needed. 672 * @new_off is assumed not to exceed twice the size of the ringbuffer, so only 673 * single wraparound is considered. 674 */ 675 static inline void ringbuf_seek(VMBusRingBufCommon *ringbuf, uint32_t new_off) 676 { 677 gpadl_iter_seek(&ringbuf->iter, 678 ringbuf->base + rb_idx_wrap(new_off, ringbuf->len)); 679 } 680 681 static inline uint32_t ringbuf_tell(VMBusRingBufCommon *ringbuf) 682 { 683 return ringbuf->iter.off - ringbuf->base; 684 } 685 686 static inline void ringbuf_start_io(VMBusRingBufCommon *ringbuf) 687 { 688 gpadl_iter_start_io(&ringbuf->iter); 689 } 690 691 static inline void ringbuf_end_io(VMBusRingBufCommon *ringbuf) 692 { 693 gpadl_iter_end_io(&ringbuf->iter); 694 } 695 696 VMBusDevice *vmbus_channel_device(VMBusChannel *chan) 697 { 698 return chan->dev; 699 } 700 701 VMBusChannel *vmbus_device_channel(VMBusDevice *dev, uint32_t chan_idx) 702 { 703 if (chan_idx >= dev->num_channels) { 704 return NULL; 705 } 706 return &dev->channels[chan_idx]; 707 } 708 709 uint32_t vmbus_channel_idx(VMBusChannel *chan) 710 { 711 return chan - chan->dev->channels; 712 } 713 714 void vmbus_channel_notify_host(VMBusChannel *chan) 715 { 716 event_notifier_set(&chan->notifier); 717 } 718 719 bool vmbus_channel_is_open(VMBusChannel *chan) 720 { 721 return chan->is_open; 722 } 723 724 /* 725 * Notify the guest side about the data to work on in the channel ring buffer. 726 * The notification is done by signaling a dedicated per-channel SynIC event 727 * flag (more recent guests) or setting a bit in the interrupt page and firing 728 * the VMBus SINT (older guests). 729 */ 730 static int vmbus_channel_notify_guest(VMBusChannel *chan) 731 { 732 int res = 0; 733 unsigned long *int_map, mask; 734 unsigned idx; 735 hwaddr addr = chan->vmbus->int_page_gpa; 736 hwaddr len = TARGET_PAGE_SIZE / 2, dirty = 0; 737 738 trace_vmbus_channel_notify_guest(chan->id); 739 740 if (!addr) { 741 return hyperv_set_event_flag(chan->notify_route, chan->id); 742 } 743 744 int_map = cpu_physical_memory_map(addr, &len, 1); 745 if (len != TARGET_PAGE_SIZE / 2) { 746 res = -ENXIO; 747 goto unmap; 748 } 749 750 idx = BIT_WORD(chan->id); 751 mask = BIT_MASK(chan->id); 752 if ((atomic_fetch_or(&int_map[idx], mask) & mask) != mask) { 753 res = hyperv_sint_route_set_sint(chan->notify_route); 754 dirty = len; 755 } 756 757 unmap: 758 cpu_physical_memory_unmap(int_map, len, 1, dirty); 759 return res; 760 } 761 762 #define VMBUS_PKT_TRAILER sizeof(uint64_t) 763 764 static uint32_t vmbus_pkt_hdr_set_offsets(vmbus_packet_hdr *hdr, 765 uint32_t desclen, uint32_t msglen) 766 { 767 hdr->offset_qwords = sizeof(*hdr) / sizeof(uint64_t) + 768 DIV_ROUND_UP(desclen, sizeof(uint64_t)); 769 hdr->len_qwords = hdr->offset_qwords + 770 DIV_ROUND_UP(msglen, sizeof(uint64_t)); 771 return hdr->len_qwords * sizeof(uint64_t) + VMBUS_PKT_TRAILER; 772 } 773 774 /* 775 * Simplified ring buffer operation with paired barriers annotations in the 776 * producer and consumer loops: 777 * 778 * producer * consumer 779 * ~~~~~~~~ * ~~~~~~~~ 780 * write pending_send_sz * read write_index 781 * smp_mb [A] * smp_mb [C] 782 * read read_index * read packet 783 * smp_mb [B] * read/write out-of-band data 784 * read/write out-of-band data * smp_mb [B] 785 * write packet * write read_index 786 * smp_mb [C] * smp_mb [A] 787 * write write_index * read pending_send_sz 788 * smp_wmb [D] * smp_rmb [D] 789 * write pending_send_sz * read write_index 790 * ... * ... 791 */ 792 793 static inline uint32_t ringbuf_send_avail(VMBusSendRingBuf *ringbuf) 794 { 795 /* don't trust guest data */ 796 if (ringbuf->last_seen_rd_idx >= ringbuf->common.len) { 797 return 0; 798 } 799 return rb_idx_delta(ringbuf->wr_idx, ringbuf->last_seen_rd_idx, 800 ringbuf->common.len, false); 801 } 802 803 static ssize_t ringbuf_send_update_idx(VMBusChannel *chan) 804 { 805 VMBusSendRingBuf *ringbuf = &chan->send_ringbuf; 806 vmbus_ring_buffer *rb; 807 uint32_t written; 808 809 written = rb_idx_delta(ringbuf->last_wr_idx, ringbuf->wr_idx, 810 ringbuf->common.len, true); 811 if (!written) { 812 return 0; 813 } 814 815 rb = ringbuf_map_hdr(&ringbuf->common); 816 if (!rb) { 817 return -EFAULT; 818 } 819 820 ringbuf->reserved -= written; 821 822 /* prevent reorder with the data operation and packet write */ 823 smp_mb(); /* barrier pair [C] */ 824 rb->write_index = ringbuf->wr_idx; 825 826 /* 827 * If the producer earlier indicated that it wants to be notified when the 828 * consumer frees certain amount of space in the ring buffer, that amount 829 * is reduced by the size of the completed write. 830 */ 831 if (ringbuf->wanted) { 832 /* otherwise reservation would fail */ 833 assert(ringbuf->wanted < written); 834 ringbuf->wanted -= written; 835 /* prevent reorder with write_index write */ 836 smp_wmb(); /* barrier pair [D] */ 837 rb->pending_send_sz = ringbuf->wanted; 838 } 839 840 /* prevent reorder with write_index or pending_send_sz write */ 841 smp_mb(); /* barrier pair [A] */ 842 ringbuf->last_seen_rd_idx = rb->read_index; 843 844 /* 845 * The consumer may have missed the reduction of pending_send_sz and skip 846 * notification, so re-check the blocking condition, and, if it's no longer 847 * true, ensure processing another iteration by simulating consumer's 848 * notification. 849 */ 850 if (ringbuf_send_avail(ringbuf) >= ringbuf->wanted) { 851 vmbus_channel_notify_host(chan); 852 } 853 854 /* skip notification by consumer's request */ 855 if (rb->interrupt_mask) { 856 goto out; 857 } 858 859 /* 860 * The consumer hasn't caught up with the producer's previous state so it's 861 * not blocked. 862 * (last_seen_rd_idx comes from the guest but it's safe to use w/o 863 * validation here as it only affects notification.) 864 */ 865 if (rb_idx_delta(ringbuf->last_seen_rd_idx, ringbuf->wr_idx, 866 ringbuf->common.len, true) > written) { 867 goto out; 868 } 869 870 vmbus_channel_notify_guest(chan); 871 out: 872 ringbuf_unmap_hdr(&ringbuf->common, rb, true); 873 ringbuf->last_wr_idx = ringbuf->wr_idx; 874 return written; 875 } 876 877 int vmbus_channel_reserve(VMBusChannel *chan, 878 uint32_t desclen, uint32_t msglen) 879 { 880 VMBusSendRingBuf *ringbuf = &chan->send_ringbuf; 881 vmbus_ring_buffer *rb = NULL; 882 vmbus_packet_hdr hdr; 883 uint32_t needed = ringbuf->reserved + 884 vmbus_pkt_hdr_set_offsets(&hdr, desclen, msglen); 885 886 /* avoid touching the guest memory if possible */ 887 if (likely(needed <= ringbuf_send_avail(ringbuf))) { 888 goto success; 889 } 890 891 rb = ringbuf_map_hdr(&ringbuf->common); 892 if (!rb) { 893 return -EFAULT; 894 } 895 896 /* fetch read index from guest memory and try again */ 897 ringbuf->last_seen_rd_idx = rb->read_index; 898 899 if (likely(needed <= ringbuf_send_avail(ringbuf))) { 900 goto success; 901 } 902 903 rb->pending_send_sz = needed; 904 905 /* 906 * The consumer may have made progress and freed up some space before 907 * seeing updated pending_send_sz, so re-read read_index (preventing 908 * reorder with the pending_send_sz write) and try again. 909 */ 910 smp_mb(); /* barrier pair [A] */ 911 ringbuf->last_seen_rd_idx = rb->read_index; 912 913 if (needed > ringbuf_send_avail(ringbuf)) { 914 goto out; 915 } 916 917 success: 918 ringbuf->reserved = needed; 919 needed = 0; 920 921 /* clear pending_send_sz if it was set */ 922 if (ringbuf->wanted) { 923 if (!rb) { 924 rb = ringbuf_map_hdr(&ringbuf->common); 925 if (!rb) { 926 /* failure to clear pending_send_sz is non-fatal */ 927 goto out; 928 } 929 } 930 931 rb->pending_send_sz = 0; 932 } 933 934 /* prevent reorder of the following data operation with read_index read */ 935 smp_mb(); /* barrier pair [B] */ 936 937 out: 938 if (rb) { 939 ringbuf_unmap_hdr(&ringbuf->common, rb, ringbuf->wanted == needed); 940 } 941 ringbuf->wanted = needed; 942 return needed ? -ENOSPC : 0; 943 } 944 945 ssize_t vmbus_channel_send(VMBusChannel *chan, uint16_t pkt_type, 946 void *desc, uint32_t desclen, 947 void *msg, uint32_t msglen, 948 bool need_comp, uint64_t transaction_id) 949 { 950 ssize_t ret = 0; 951 vmbus_packet_hdr hdr; 952 uint32_t totlen; 953 VMBusSendRingBuf *ringbuf = &chan->send_ringbuf; 954 955 if (!vmbus_channel_is_open(chan)) { 956 return -EINVAL; 957 } 958 959 totlen = vmbus_pkt_hdr_set_offsets(&hdr, desclen, msglen); 960 hdr.type = pkt_type; 961 hdr.flags = need_comp ? VMBUS_PACKET_FLAG_REQUEST_COMPLETION : 0; 962 hdr.transaction_id = transaction_id; 963 964 assert(totlen <= ringbuf->reserved); 965 966 ringbuf_start_io(&ringbuf->common); 967 ringbuf_seek(&ringbuf->common, ringbuf->wr_idx); 968 ret = ringbuf_io(&ringbuf->common, &hdr, sizeof(hdr)); 969 if (ret < 0) { 970 goto out; 971 } 972 if (desclen) { 973 assert(desc); 974 ret = ringbuf_io(&ringbuf->common, desc, desclen); 975 if (ret < 0) { 976 goto out; 977 } 978 ringbuf_seek(&ringbuf->common, 979 ringbuf->wr_idx + hdr.offset_qwords * sizeof(uint64_t)); 980 } 981 ret = ringbuf_io(&ringbuf->common, msg, msglen); 982 if (ret < 0) { 983 goto out; 984 } 985 ringbuf_seek(&ringbuf->common, ringbuf->wr_idx + totlen); 986 ringbuf->wr_idx = ringbuf_tell(&ringbuf->common); 987 ret = 0; 988 out: 989 ringbuf_end_io(&ringbuf->common); 990 if (ret) { 991 return ret; 992 } 993 return ringbuf_send_update_idx(chan); 994 } 995 996 ssize_t vmbus_channel_send_completion(VMBusChanReq *req, 997 void *msg, uint32_t msglen) 998 { 999 assert(req->need_comp); 1000 return vmbus_channel_send(req->chan, VMBUS_PACKET_COMP, NULL, 0, 1001 msg, msglen, false, req->transaction_id); 1002 } 1003 1004 static int sgl_from_gpa_ranges(QEMUSGList *sgl, VMBusDevice *dev, 1005 VMBusRingBufCommon *ringbuf, uint32_t len) 1006 { 1007 int ret; 1008 vmbus_pkt_gpa_direct hdr; 1009 hwaddr curaddr = 0; 1010 hwaddr curlen = 0; 1011 int num; 1012 1013 if (len < sizeof(hdr)) { 1014 return -EIO; 1015 } 1016 ret = ringbuf_io(ringbuf, &hdr, sizeof(hdr)); 1017 if (ret < 0) { 1018 return ret; 1019 } 1020 len -= sizeof(hdr); 1021 1022 num = (len - hdr.rangecount * sizeof(vmbus_gpa_range)) / sizeof(uint64_t); 1023 if (num < 0) { 1024 return -EIO; 1025 } 1026 qemu_sglist_init(sgl, DEVICE(dev), num, ringbuf->as); 1027 1028 for (; hdr.rangecount; hdr.rangecount--) { 1029 vmbus_gpa_range range; 1030 1031 if (len < sizeof(range)) { 1032 goto eio; 1033 } 1034 ret = ringbuf_io(ringbuf, &range, sizeof(range)); 1035 if (ret < 0) { 1036 goto err; 1037 } 1038 len -= sizeof(range); 1039 1040 if (range.byte_offset & TARGET_PAGE_MASK) { 1041 goto eio; 1042 } 1043 1044 for (; range.byte_count; range.byte_offset = 0) { 1045 uint64_t paddr; 1046 uint32_t plen = MIN(range.byte_count, 1047 TARGET_PAGE_SIZE - range.byte_offset); 1048 1049 if (len < sizeof(uint64_t)) { 1050 goto eio; 1051 } 1052 ret = ringbuf_io(ringbuf, &paddr, sizeof(paddr)); 1053 if (ret < 0) { 1054 goto err; 1055 } 1056 len -= sizeof(uint64_t); 1057 paddr <<= TARGET_PAGE_BITS; 1058 paddr |= range.byte_offset; 1059 range.byte_count -= plen; 1060 1061 if (curaddr + curlen == paddr) { 1062 /* consecutive fragments - join */ 1063 curlen += plen; 1064 } else { 1065 if (curlen) { 1066 qemu_sglist_add(sgl, curaddr, curlen); 1067 } 1068 1069 curaddr = paddr; 1070 curlen = plen; 1071 } 1072 } 1073 } 1074 1075 if (curlen) { 1076 qemu_sglist_add(sgl, curaddr, curlen); 1077 } 1078 1079 return 0; 1080 eio: 1081 ret = -EIO; 1082 err: 1083 qemu_sglist_destroy(sgl); 1084 return ret; 1085 } 1086 1087 static VMBusChanReq *vmbus_alloc_req(VMBusChannel *chan, 1088 uint32_t size, uint16_t pkt_type, 1089 uint32_t msglen, uint64_t transaction_id, 1090 bool need_comp) 1091 { 1092 VMBusChanReq *req; 1093 uint32_t msgoff = QEMU_ALIGN_UP(size, __alignof__(*req->msg)); 1094 uint32_t totlen = msgoff + msglen; 1095 1096 req = g_malloc0(totlen); 1097 req->chan = chan; 1098 req->pkt_type = pkt_type; 1099 req->msg = (void *)req + msgoff; 1100 req->msglen = msglen; 1101 req->transaction_id = transaction_id; 1102 req->need_comp = need_comp; 1103 return req; 1104 } 1105 1106 int vmbus_channel_recv_start(VMBusChannel *chan) 1107 { 1108 VMBusRecvRingBuf *ringbuf = &chan->recv_ringbuf; 1109 vmbus_ring_buffer *rb; 1110 1111 rb = ringbuf_map_hdr(&ringbuf->common); 1112 if (!rb) { 1113 return -EFAULT; 1114 } 1115 ringbuf->last_seen_wr_idx = rb->write_index; 1116 ringbuf_unmap_hdr(&ringbuf->common, rb, false); 1117 1118 if (ringbuf->last_seen_wr_idx >= ringbuf->common.len) { 1119 return -EOVERFLOW; 1120 } 1121 1122 /* prevent reorder of the following data operation with write_index read */ 1123 smp_mb(); /* barrier pair [C] */ 1124 return 0; 1125 } 1126 1127 void *vmbus_channel_recv_peek(VMBusChannel *chan, uint32_t size) 1128 { 1129 VMBusRecvRingBuf *ringbuf = &chan->recv_ringbuf; 1130 vmbus_packet_hdr hdr = {}; 1131 VMBusChanReq *req; 1132 uint32_t avail; 1133 uint32_t totlen, pktlen, msglen, msgoff, desclen; 1134 1135 assert(size >= sizeof(*req)); 1136 1137 /* safe as last_seen_wr_idx is validated in vmbus_channel_recv_start */ 1138 avail = rb_idx_delta(ringbuf->rd_idx, ringbuf->last_seen_wr_idx, 1139 ringbuf->common.len, true); 1140 if (avail < sizeof(hdr)) { 1141 return NULL; 1142 } 1143 1144 ringbuf_seek(&ringbuf->common, ringbuf->rd_idx); 1145 if (ringbuf_io(&ringbuf->common, &hdr, sizeof(hdr)) < 0) { 1146 return NULL; 1147 } 1148 1149 pktlen = hdr.len_qwords * sizeof(uint64_t); 1150 totlen = pktlen + VMBUS_PKT_TRAILER; 1151 if (totlen > avail) { 1152 return NULL; 1153 } 1154 1155 msgoff = hdr.offset_qwords * sizeof(uint64_t); 1156 if (msgoff > pktlen || msgoff < sizeof(hdr)) { 1157 error_report("%s: malformed packet: %u %u", __func__, msgoff, pktlen); 1158 return NULL; 1159 } 1160 1161 msglen = pktlen - msgoff; 1162 1163 req = vmbus_alloc_req(chan, size, hdr.type, msglen, hdr.transaction_id, 1164 hdr.flags & VMBUS_PACKET_FLAG_REQUEST_COMPLETION); 1165 1166 switch (hdr.type) { 1167 case VMBUS_PACKET_DATA_USING_GPA_DIRECT: 1168 desclen = msgoff - sizeof(hdr); 1169 if (sgl_from_gpa_ranges(&req->sgl, chan->dev, &ringbuf->common, 1170 desclen) < 0) { 1171 error_report("%s: failed to convert GPA ranges to SGL", __func__); 1172 goto free_req; 1173 } 1174 break; 1175 case VMBUS_PACKET_DATA_INBAND: 1176 case VMBUS_PACKET_COMP: 1177 break; 1178 default: 1179 error_report("%s: unexpected msg type: %x", __func__, hdr.type); 1180 goto free_req; 1181 } 1182 1183 ringbuf_seek(&ringbuf->common, ringbuf->rd_idx + msgoff); 1184 if (ringbuf_io(&ringbuf->common, req->msg, msglen) < 0) { 1185 goto free_req; 1186 } 1187 ringbuf_seek(&ringbuf->common, ringbuf->rd_idx + totlen); 1188 1189 return req; 1190 free_req: 1191 vmbus_free_req(req); 1192 return NULL; 1193 } 1194 1195 void vmbus_channel_recv_pop(VMBusChannel *chan) 1196 { 1197 VMBusRecvRingBuf *ringbuf = &chan->recv_ringbuf; 1198 ringbuf->rd_idx = ringbuf_tell(&ringbuf->common); 1199 } 1200 1201 ssize_t vmbus_channel_recv_done(VMBusChannel *chan) 1202 { 1203 VMBusRecvRingBuf *ringbuf = &chan->recv_ringbuf; 1204 vmbus_ring_buffer *rb; 1205 uint32_t read; 1206 1207 read = rb_idx_delta(ringbuf->last_rd_idx, ringbuf->rd_idx, 1208 ringbuf->common.len, true); 1209 if (!read) { 1210 return 0; 1211 } 1212 1213 rb = ringbuf_map_hdr(&ringbuf->common); 1214 if (!rb) { 1215 return -EFAULT; 1216 } 1217 1218 /* prevent reorder with the data operation and packet read */ 1219 smp_mb(); /* barrier pair [B] */ 1220 rb->read_index = ringbuf->rd_idx; 1221 1222 /* prevent reorder of the following pending_send_sz read */ 1223 smp_mb(); /* barrier pair [A] */ 1224 1225 if (rb->interrupt_mask) { 1226 goto out; 1227 } 1228 1229 if (rb->feature_bits & VMBUS_RING_BUFFER_FEAT_PENDING_SZ) { 1230 uint32_t wr_idx, wr_avail; 1231 uint32_t wanted = rb->pending_send_sz; 1232 1233 if (!wanted) { 1234 goto out; 1235 } 1236 1237 /* prevent reorder with pending_send_sz read */ 1238 smp_rmb(); /* barrier pair [D] */ 1239 wr_idx = rb->write_index; 1240 1241 wr_avail = rb_idx_delta(wr_idx, ringbuf->rd_idx, ringbuf->common.len, 1242 true); 1243 1244 /* the producer wasn't blocked on the consumer state */ 1245 if (wr_avail >= read + wanted) { 1246 goto out; 1247 } 1248 /* there's not enough space for the producer to make progress */ 1249 if (wr_avail < wanted) { 1250 goto out; 1251 } 1252 } 1253 1254 vmbus_channel_notify_guest(chan); 1255 out: 1256 ringbuf_unmap_hdr(&ringbuf->common, rb, true); 1257 ringbuf->last_rd_idx = ringbuf->rd_idx; 1258 return read; 1259 } 1260 1261 void vmbus_free_req(void *req) 1262 { 1263 VMBusChanReq *r = req; 1264 1265 if (!req) { 1266 return; 1267 } 1268 1269 if (r->sgl.dev) { 1270 qemu_sglist_destroy(&r->sgl); 1271 } 1272 g_free(req); 1273 } 1274 1275 static const VMStateDescription vmstate_sgent = { 1276 .name = "vmbus/sgentry", 1277 .version_id = 0, 1278 .minimum_version_id = 0, 1279 .fields = (VMStateField[]) { 1280 VMSTATE_UINT64(base, ScatterGatherEntry), 1281 VMSTATE_UINT64(len, ScatterGatherEntry), 1282 VMSTATE_END_OF_LIST() 1283 } 1284 }; 1285 1286 typedef struct VMBusChanReqSave { 1287 uint16_t chan_idx; 1288 uint16_t pkt_type; 1289 uint32_t msglen; 1290 void *msg; 1291 uint64_t transaction_id; 1292 bool need_comp; 1293 uint32_t num; 1294 ScatterGatherEntry *sgl; 1295 } VMBusChanReqSave; 1296 1297 static const VMStateDescription vmstate_vmbus_chan_req = { 1298 .name = "vmbus/vmbus_chan_req", 1299 .version_id = 0, 1300 .minimum_version_id = 0, 1301 .fields = (VMStateField[]) { 1302 VMSTATE_UINT16(chan_idx, VMBusChanReqSave), 1303 VMSTATE_UINT16(pkt_type, VMBusChanReqSave), 1304 VMSTATE_UINT32(msglen, VMBusChanReqSave), 1305 VMSTATE_VBUFFER_ALLOC_UINT32(msg, VMBusChanReqSave, 0, NULL, msglen), 1306 VMSTATE_UINT64(transaction_id, VMBusChanReqSave), 1307 VMSTATE_BOOL(need_comp, VMBusChanReqSave), 1308 VMSTATE_UINT32(num, VMBusChanReqSave), 1309 VMSTATE_STRUCT_VARRAY_POINTER_UINT32(sgl, VMBusChanReqSave, num, 1310 vmstate_sgent, ScatterGatherEntry), 1311 VMSTATE_END_OF_LIST() 1312 } 1313 }; 1314 1315 void vmbus_save_req(QEMUFile *f, VMBusChanReq *req) 1316 { 1317 VMBusChanReqSave req_save; 1318 1319 req_save.chan_idx = req->chan->subchan_idx; 1320 req_save.pkt_type = req->pkt_type; 1321 req_save.msglen = req->msglen; 1322 req_save.msg = req->msg; 1323 req_save.transaction_id = req->transaction_id; 1324 req_save.need_comp = req->need_comp; 1325 req_save.num = req->sgl.nsg; 1326 req_save.sgl = g_memdup(req->sgl.sg, 1327 req_save.num * sizeof(ScatterGatherEntry)); 1328 1329 vmstate_save_state(f, &vmstate_vmbus_chan_req, &req_save, NULL); 1330 1331 g_free(req_save.sgl); 1332 } 1333 1334 void *vmbus_load_req(QEMUFile *f, VMBusDevice *dev, uint32_t size) 1335 { 1336 VMBusChanReqSave req_save; 1337 VMBusChanReq *req = NULL; 1338 VMBusChannel *chan = NULL; 1339 uint32_t i; 1340 1341 vmstate_load_state(f, &vmstate_vmbus_chan_req, &req_save, 0); 1342 1343 if (req_save.chan_idx >= dev->num_channels) { 1344 error_report("%s: %u(chan_idx) > %u(num_channels)", __func__, 1345 req_save.chan_idx, dev->num_channels); 1346 goto out; 1347 } 1348 chan = &dev->channels[req_save.chan_idx]; 1349 1350 if (vmbus_channel_reserve(chan, 0, req_save.msglen)) { 1351 goto out; 1352 } 1353 1354 req = vmbus_alloc_req(chan, size, req_save.pkt_type, req_save.msglen, 1355 req_save.transaction_id, req_save.need_comp); 1356 if (req_save.msglen) { 1357 memcpy(req->msg, req_save.msg, req_save.msglen); 1358 } 1359 1360 for (i = 0; i < req_save.num; i++) { 1361 qemu_sglist_add(&req->sgl, req_save.sgl[i].base, req_save.sgl[i].len); 1362 } 1363 1364 out: 1365 if (req_save.msglen) { 1366 g_free(req_save.msg); 1367 } 1368 if (req_save.num) { 1369 g_free(req_save.sgl); 1370 } 1371 return req; 1372 } 1373 1374 static void channel_event_cb(EventNotifier *e) 1375 { 1376 VMBusChannel *chan = container_of(e, VMBusChannel, notifier); 1377 if (event_notifier_test_and_clear(e)) { 1378 /* 1379 * All receives are supposed to happen within the device worker, so 1380 * bracket it with ringbuf_start/end_io on the receive ringbuffer, and 1381 * potentially reuse the cached mapping throughout the worker. 1382 * Can't do this for sends as they may happen outside the device 1383 * worker. 1384 */ 1385 VMBusRecvRingBuf *ringbuf = &chan->recv_ringbuf; 1386 ringbuf_start_io(&ringbuf->common); 1387 chan->notify_cb(chan); 1388 ringbuf_end_io(&ringbuf->common); 1389 1390 } 1391 } 1392 1393 static int alloc_chan_id(VMBus *vmbus) 1394 { 1395 int ret; 1396 1397 ret = find_next_zero_bit(vmbus->chanid_bitmap, VMBUS_CHANID_COUNT, 0); 1398 if (ret == VMBUS_CHANID_COUNT) { 1399 return -ENOMEM; 1400 } 1401 return ret + VMBUS_FIRST_CHANID; 1402 } 1403 1404 static int register_chan_id(VMBusChannel *chan) 1405 { 1406 return test_and_set_bit(chan->id - VMBUS_FIRST_CHANID, 1407 chan->vmbus->chanid_bitmap) ? -EEXIST : 0; 1408 } 1409 1410 static void unregister_chan_id(VMBusChannel *chan) 1411 { 1412 clear_bit(chan->id - VMBUS_FIRST_CHANID, chan->vmbus->chanid_bitmap); 1413 } 1414 1415 static uint32_t chan_connection_id(VMBusChannel *chan) 1416 { 1417 return VMBUS_CHAN_CONNECTION_OFFSET + chan->id; 1418 } 1419 1420 static void init_channel(VMBus *vmbus, VMBusDevice *dev, VMBusDeviceClass *vdc, 1421 VMBusChannel *chan, uint16_t idx, Error **errp) 1422 { 1423 int res; 1424 1425 chan->dev = dev; 1426 chan->notify_cb = vdc->chan_notify_cb; 1427 chan->subchan_idx = idx; 1428 chan->vmbus = vmbus; 1429 1430 res = alloc_chan_id(vmbus); 1431 if (res < 0) { 1432 error_setg(errp, "no spare channel id"); 1433 return; 1434 } 1435 chan->id = res; 1436 register_chan_id(chan); 1437 1438 /* 1439 * The guest drivers depend on the device subchannels (idx #1+) to be 1440 * offered after the primary channel (idx #0) of that device. To ensure 1441 * that, record the channels on the channel list in the order they appear 1442 * within the device. 1443 */ 1444 QTAILQ_INSERT_TAIL(&vmbus->channel_list, chan, link); 1445 } 1446 1447 static void deinit_channel(VMBusChannel *chan) 1448 { 1449 assert(chan->state == VMCHAN_INIT); 1450 QTAILQ_REMOVE(&chan->vmbus->channel_list, chan, link); 1451 unregister_chan_id(chan); 1452 } 1453 1454 static void create_channels(VMBus *vmbus, VMBusDevice *dev, Error **errp) 1455 { 1456 uint16_t i; 1457 VMBusDeviceClass *vdc = VMBUS_DEVICE_GET_CLASS(dev); 1458 Error *err = NULL; 1459 1460 dev->num_channels = vdc->num_channels ? vdc->num_channels(dev) : 1; 1461 if (dev->num_channels < 1) { 1462 error_setg(&err, "invalid #channels: %u", dev->num_channels); 1463 goto error_out; 1464 } 1465 1466 dev->channels = g_new0(VMBusChannel, dev->num_channels); 1467 for (i = 0; i < dev->num_channels; i++) { 1468 init_channel(vmbus, dev, vdc, &dev->channels[i], i, &err); 1469 if (err) { 1470 goto err_init; 1471 } 1472 } 1473 1474 return; 1475 1476 err_init: 1477 while (i--) { 1478 deinit_channel(&dev->channels[i]); 1479 } 1480 error_out: 1481 error_propagate(errp, err); 1482 } 1483 1484 static void free_channels(VMBusDevice *dev) 1485 { 1486 uint16_t i; 1487 for (i = 0; i < dev->num_channels; i++) { 1488 deinit_channel(&dev->channels[i]); 1489 } 1490 g_free(dev->channels); 1491 } 1492 1493 static HvSintRoute *make_sint_route(VMBus *vmbus, uint32_t vp_index) 1494 { 1495 VMBusChannel *chan; 1496 1497 if (vp_index == vmbus->target_vp) { 1498 hyperv_sint_route_ref(vmbus->sint_route); 1499 return vmbus->sint_route; 1500 } 1501 1502 QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { 1503 if (chan->target_vp == vp_index && vmbus_channel_is_open(chan)) { 1504 hyperv_sint_route_ref(chan->notify_route); 1505 return chan->notify_route; 1506 } 1507 } 1508 1509 return hyperv_sint_route_new(vp_index, VMBUS_SINT, NULL, NULL); 1510 } 1511 1512 static void open_channel(VMBusChannel *chan) 1513 { 1514 VMBusDeviceClass *vdc = VMBUS_DEVICE_GET_CLASS(chan->dev); 1515 1516 chan->gpadl = vmbus_get_gpadl(chan, chan->ringbuf_gpadl); 1517 if (!chan->gpadl) { 1518 return; 1519 } 1520 1521 if (ringbufs_init(chan)) { 1522 goto put_gpadl; 1523 } 1524 1525 if (event_notifier_init(&chan->notifier, 0)) { 1526 goto put_gpadl; 1527 } 1528 1529 event_notifier_set_handler(&chan->notifier, channel_event_cb); 1530 1531 if (hyperv_set_event_flag_handler(chan_connection_id(chan), 1532 &chan->notifier)) { 1533 goto cleanup_notifier; 1534 } 1535 1536 chan->notify_route = make_sint_route(chan->vmbus, chan->target_vp); 1537 if (!chan->notify_route) { 1538 goto clear_event_flag_handler; 1539 } 1540 1541 if (vdc->open_channel && vdc->open_channel(chan)) { 1542 goto unref_sint_route; 1543 } 1544 1545 chan->is_open = true; 1546 return; 1547 1548 unref_sint_route: 1549 hyperv_sint_route_unref(chan->notify_route); 1550 clear_event_flag_handler: 1551 hyperv_set_event_flag_handler(chan_connection_id(chan), NULL); 1552 cleanup_notifier: 1553 event_notifier_set_handler(&chan->notifier, NULL); 1554 event_notifier_cleanup(&chan->notifier); 1555 put_gpadl: 1556 vmbus_put_gpadl(chan->gpadl); 1557 } 1558 1559 static void close_channel(VMBusChannel *chan) 1560 { 1561 VMBusDeviceClass *vdc = VMBUS_DEVICE_GET_CLASS(chan->dev); 1562 1563 if (!chan->is_open) { 1564 return; 1565 } 1566 1567 if (vdc->close_channel) { 1568 vdc->close_channel(chan); 1569 } 1570 1571 hyperv_sint_route_unref(chan->notify_route); 1572 hyperv_set_event_flag_handler(chan_connection_id(chan), NULL); 1573 event_notifier_set_handler(&chan->notifier, NULL); 1574 event_notifier_cleanup(&chan->notifier); 1575 vmbus_put_gpadl(chan->gpadl); 1576 chan->is_open = false; 1577 } 1578 1579 static int channel_post_load(void *opaque, int version_id) 1580 { 1581 VMBusChannel *chan = opaque; 1582 1583 return register_chan_id(chan); 1584 } 1585 1586 static const VMStateDescription vmstate_channel = { 1587 .name = "vmbus/channel", 1588 .version_id = 0, 1589 .minimum_version_id = 0, 1590 .post_load = channel_post_load, 1591 .fields = (VMStateField[]) { 1592 VMSTATE_UINT32(id, VMBusChannel), 1593 VMSTATE_UINT16(subchan_idx, VMBusChannel), 1594 VMSTATE_UINT32(open_id, VMBusChannel), 1595 VMSTATE_UINT32(target_vp, VMBusChannel), 1596 VMSTATE_UINT32(ringbuf_gpadl, VMBusChannel), 1597 VMSTATE_UINT32(ringbuf_send_offset, VMBusChannel), 1598 VMSTATE_UINT8(offer_state, VMBusChannel), 1599 VMSTATE_UINT8(state, VMBusChannel), 1600 VMSTATE_END_OF_LIST() 1601 } 1602 }; 1603 1604 static VMBusChannel *find_channel(VMBus *vmbus, uint32_t id) 1605 { 1606 VMBusChannel *chan; 1607 QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { 1608 if (chan->id == id) { 1609 return chan; 1610 } 1611 } 1612 return NULL; 1613 } 1614 1615 static int enqueue_incoming_message(VMBus *vmbus, 1616 const struct hyperv_post_message_input *msg) 1617 { 1618 int ret = 0; 1619 uint8_t idx, prev_size; 1620 1621 qemu_mutex_lock(&vmbus->rx_queue_lock); 1622 1623 if (vmbus->rx_queue_size == HV_MSG_QUEUE_LEN) { 1624 ret = -ENOBUFS; 1625 goto out; 1626 } 1627 1628 prev_size = vmbus->rx_queue_size; 1629 idx = (vmbus->rx_queue_head + vmbus->rx_queue_size) % HV_MSG_QUEUE_LEN; 1630 memcpy(&vmbus->rx_queue[idx], msg, sizeof(*msg)); 1631 vmbus->rx_queue_size++; 1632 1633 /* only need to resched if the queue was empty before */ 1634 if (!prev_size) { 1635 vmbus_resched(vmbus); 1636 } 1637 out: 1638 qemu_mutex_unlock(&vmbus->rx_queue_lock); 1639 return ret; 1640 } 1641 1642 static uint16_t vmbus_recv_message(const struct hyperv_post_message_input *msg, 1643 void *data) 1644 { 1645 VMBus *vmbus = data; 1646 struct vmbus_message_header *vmbus_msg; 1647 1648 if (msg->message_type != HV_MESSAGE_VMBUS) { 1649 return HV_STATUS_INVALID_HYPERCALL_INPUT; 1650 } 1651 1652 if (msg->payload_size < sizeof(struct vmbus_message_header)) { 1653 return HV_STATUS_INVALID_HYPERCALL_INPUT; 1654 } 1655 1656 vmbus_msg = (struct vmbus_message_header *)msg->payload; 1657 1658 trace_vmbus_recv_message(vmbus_msg->message_type, msg->payload_size); 1659 1660 if (vmbus_msg->message_type == VMBUS_MSG_INVALID || 1661 vmbus_msg->message_type >= VMBUS_MSG_COUNT) { 1662 error_report("vmbus: unknown message type %#x", 1663 vmbus_msg->message_type); 1664 return HV_STATUS_INVALID_HYPERCALL_INPUT; 1665 } 1666 1667 if (enqueue_incoming_message(vmbus, msg)) { 1668 return HV_STATUS_INSUFFICIENT_BUFFERS; 1669 } 1670 return HV_STATUS_SUCCESS; 1671 } 1672 1673 static bool vmbus_initialized(VMBus *vmbus) 1674 { 1675 return vmbus->version > 0 && vmbus->version <= VMBUS_VERSION_CURRENT; 1676 } 1677 1678 static void vmbus_reset_all(VMBus *vmbus) 1679 { 1680 qbus_reset_all(BUS(vmbus)); 1681 } 1682 1683 static void post_msg(VMBus *vmbus, void *msgdata, uint32_t msglen) 1684 { 1685 int ret; 1686 struct hyperv_message msg = { 1687 .header.message_type = HV_MESSAGE_VMBUS, 1688 }; 1689 1690 assert(!vmbus->msg_in_progress); 1691 assert(msglen <= sizeof(msg.payload)); 1692 assert(msglen >= sizeof(struct vmbus_message_header)); 1693 1694 vmbus->msg_in_progress = true; 1695 1696 trace_vmbus_post_msg(((struct vmbus_message_header *)msgdata)->message_type, 1697 msglen); 1698 1699 memcpy(msg.payload, msgdata, msglen); 1700 msg.header.payload_size = ROUND_UP(msglen, VMBUS_MESSAGE_SIZE_ALIGN); 1701 1702 ret = hyperv_post_msg(vmbus->sint_route, &msg); 1703 if (ret == 0 || ret == -EAGAIN) { 1704 return; 1705 } 1706 1707 error_report("message delivery fatal failure: %d; aborting vmbus", ret); 1708 vmbus_reset_all(vmbus); 1709 } 1710 1711 static int vmbus_init(VMBus *vmbus) 1712 { 1713 if (vmbus->target_vp != (uint32_t)-1) { 1714 vmbus->sint_route = hyperv_sint_route_new(vmbus->target_vp, VMBUS_SINT, 1715 vmbus_msg_cb, vmbus); 1716 if (!vmbus->sint_route) { 1717 error_report("failed to set up SINT route"); 1718 return -ENOMEM; 1719 } 1720 } 1721 return 0; 1722 } 1723 1724 static void vmbus_deinit(VMBus *vmbus) 1725 { 1726 VMBusGpadl *gpadl, *tmp_gpadl; 1727 VMBusChannel *chan; 1728 1729 QTAILQ_FOREACH_SAFE(gpadl, &vmbus->gpadl_list, link, tmp_gpadl) { 1730 if (gpadl->state == VMGPADL_TORNDOWN) { 1731 continue; 1732 } 1733 vmbus_put_gpadl(gpadl); 1734 } 1735 1736 QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { 1737 chan->offer_state = VMOFFER_INIT; 1738 } 1739 1740 hyperv_sint_route_unref(vmbus->sint_route); 1741 vmbus->sint_route = NULL; 1742 vmbus->int_page_gpa = 0; 1743 vmbus->target_vp = (uint32_t)-1; 1744 vmbus->version = 0; 1745 vmbus->state = VMBUS_LISTEN; 1746 vmbus->msg_in_progress = false; 1747 } 1748 1749 static void handle_initiate_contact(VMBus *vmbus, 1750 vmbus_message_initiate_contact *msg, 1751 uint32_t msglen) 1752 { 1753 if (msglen < sizeof(*msg)) { 1754 return; 1755 } 1756 1757 trace_vmbus_initiate_contact(msg->version_requested >> 16, 1758 msg->version_requested & 0xffff, 1759 msg->target_vcpu, msg->monitor_page1, 1760 msg->monitor_page2, msg->interrupt_page); 1761 1762 /* 1763 * Reset vmbus on INITIATE_CONTACT regardless of its previous state. 1764 * Useful, in particular, with vmbus-aware BIOS which can't shut vmbus down 1765 * before handing over to OS loader. 1766 */ 1767 vmbus_reset_all(vmbus); 1768 1769 vmbus->target_vp = msg->target_vcpu; 1770 vmbus->version = msg->version_requested; 1771 if (vmbus->version < VMBUS_VERSION_WIN8) { 1772 /* linux passes interrupt page even when it doesn't need it */ 1773 vmbus->int_page_gpa = msg->interrupt_page; 1774 } 1775 vmbus->state = VMBUS_HANDSHAKE; 1776 1777 if (vmbus_init(vmbus)) { 1778 error_report("failed to init vmbus; aborting"); 1779 vmbus_deinit(vmbus); 1780 return; 1781 } 1782 } 1783 1784 static void send_handshake(VMBus *vmbus) 1785 { 1786 struct vmbus_message_version_response msg = { 1787 .header.message_type = VMBUS_MSG_VERSION_RESPONSE, 1788 .version_supported = vmbus_initialized(vmbus), 1789 }; 1790 1791 post_msg(vmbus, &msg, sizeof(msg)); 1792 } 1793 1794 static void handle_request_offers(VMBus *vmbus, void *msgdata, uint32_t msglen) 1795 { 1796 VMBusChannel *chan; 1797 1798 if (!vmbus_initialized(vmbus)) { 1799 return; 1800 } 1801 1802 QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { 1803 if (chan->offer_state == VMOFFER_INIT) { 1804 chan->offer_state = VMOFFER_SENDING; 1805 break; 1806 } 1807 } 1808 1809 vmbus->state = VMBUS_OFFER; 1810 } 1811 1812 static void send_offer(VMBus *vmbus) 1813 { 1814 VMBusChannel *chan; 1815 struct vmbus_message_header alloffers_msg = { 1816 .message_type = VMBUS_MSG_ALLOFFERS_DELIVERED, 1817 }; 1818 1819 QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { 1820 if (chan->offer_state == VMOFFER_SENDING) { 1821 VMBusDeviceClass *vdc = VMBUS_DEVICE_GET_CLASS(chan->dev); 1822 /* Hyper-V wants LE GUIDs */ 1823 QemuUUID classid = qemu_uuid_bswap(vdc->classid); 1824 QemuUUID instanceid = qemu_uuid_bswap(chan->dev->instanceid); 1825 struct vmbus_message_offer_channel msg = { 1826 .header.message_type = VMBUS_MSG_OFFERCHANNEL, 1827 .child_relid = chan->id, 1828 .connection_id = chan_connection_id(chan), 1829 .channel_flags = vdc->channel_flags, 1830 .mmio_size_mb = vdc->mmio_size_mb, 1831 .sub_channel_index = vmbus_channel_idx(chan), 1832 .interrupt_flags = VMBUS_OFFER_INTERRUPT_DEDICATED, 1833 }; 1834 1835 memcpy(msg.type_uuid, &classid, sizeof(classid)); 1836 memcpy(msg.instance_uuid, &instanceid, sizeof(instanceid)); 1837 1838 trace_vmbus_send_offer(chan->id, chan->dev); 1839 1840 post_msg(vmbus, &msg, sizeof(msg)); 1841 return; 1842 } 1843 } 1844 1845 /* no more offers, send terminator message */ 1846 trace_vmbus_terminate_offers(); 1847 post_msg(vmbus, &alloffers_msg, sizeof(alloffers_msg)); 1848 } 1849 1850 static bool complete_offer(VMBus *vmbus) 1851 { 1852 VMBusChannel *chan; 1853 1854 QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { 1855 if (chan->offer_state == VMOFFER_SENDING) { 1856 chan->offer_state = VMOFFER_SENT; 1857 goto next_offer; 1858 } 1859 } 1860 /* 1861 * no transitioning channels found so this is completing the terminator 1862 * message, and vmbus can move to the next state 1863 */ 1864 return true; 1865 1866 next_offer: 1867 /* try to mark another channel for offering */ 1868 QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { 1869 if (chan->offer_state == VMOFFER_INIT) { 1870 chan->offer_state = VMOFFER_SENDING; 1871 break; 1872 } 1873 } 1874 /* 1875 * if an offer has been sent there are more offers or the terminator yet to 1876 * send, so no state transition for vmbus 1877 */ 1878 return false; 1879 } 1880 1881 1882 static void handle_gpadl_header(VMBus *vmbus, vmbus_message_gpadl_header *msg, 1883 uint32_t msglen) 1884 { 1885 VMBusGpadl *gpadl; 1886 uint32_t num_gfns, i; 1887 1888 /* must include at least one gpa range */ 1889 if (msglen < sizeof(*msg) + sizeof(msg->range[0]) || 1890 !vmbus_initialized(vmbus)) { 1891 return; 1892 } 1893 1894 num_gfns = (msg->range_buflen - msg->rangecount * sizeof(msg->range[0])) / 1895 sizeof(msg->range[0].pfn_array[0]); 1896 1897 trace_vmbus_gpadl_header(msg->gpadl_id, num_gfns); 1898 1899 /* 1900 * In theory the GPADL_HEADER message can define a GPADL with multiple GPA 1901 * ranges each with arbitrary size and alignment. However in practice only 1902 * single-range page-aligned GPADLs have been observed so just ignore 1903 * anything else and simplify things greatly. 1904 */ 1905 if (msg->rangecount != 1 || msg->range[0].byte_offset || 1906 (msg->range[0].byte_count != (num_gfns << TARGET_PAGE_BITS))) { 1907 return; 1908 } 1909 1910 /* ignore requests to create already existing GPADLs */ 1911 if (find_gpadl(vmbus, msg->gpadl_id)) { 1912 return; 1913 } 1914 1915 gpadl = create_gpadl(vmbus, msg->gpadl_id, msg->child_relid, num_gfns); 1916 1917 for (i = 0; i < num_gfns && 1918 (void *)&msg->range[0].pfn_array[i + 1] <= (void *)msg + msglen; 1919 i++) { 1920 gpadl->gfns[gpadl->seen_gfns++] = msg->range[0].pfn_array[i]; 1921 } 1922 1923 if (gpadl_full(gpadl)) { 1924 vmbus->state = VMBUS_CREATE_GPADL; 1925 } 1926 } 1927 1928 static void handle_gpadl_body(VMBus *vmbus, vmbus_message_gpadl_body *msg, 1929 uint32_t msglen) 1930 { 1931 VMBusGpadl *gpadl; 1932 uint32_t num_gfns_left, i; 1933 1934 if (msglen < sizeof(*msg) || !vmbus_initialized(vmbus)) { 1935 return; 1936 } 1937 1938 trace_vmbus_gpadl_body(msg->gpadl_id); 1939 1940 gpadl = find_gpadl(vmbus, msg->gpadl_id); 1941 if (!gpadl) { 1942 return; 1943 } 1944 1945 num_gfns_left = gpadl->num_gfns - gpadl->seen_gfns; 1946 assert(num_gfns_left); 1947 1948 for (i = 0; i < num_gfns_left && 1949 (void *)&msg->pfn_array[i + 1] <= (void *)msg + msglen; i++) { 1950 gpadl->gfns[gpadl->seen_gfns++] = msg->pfn_array[i]; 1951 } 1952 1953 if (gpadl_full(gpadl)) { 1954 vmbus->state = VMBUS_CREATE_GPADL; 1955 } 1956 } 1957 1958 static void send_create_gpadl(VMBus *vmbus) 1959 { 1960 VMBusGpadl *gpadl; 1961 1962 QTAILQ_FOREACH(gpadl, &vmbus->gpadl_list, link) { 1963 if (gpadl_full(gpadl) && gpadl->state == VMGPADL_INIT) { 1964 struct vmbus_message_gpadl_created msg = { 1965 .header.message_type = VMBUS_MSG_GPADL_CREATED, 1966 .gpadl_id = gpadl->id, 1967 .child_relid = gpadl->child_relid, 1968 }; 1969 1970 trace_vmbus_gpadl_created(gpadl->id); 1971 post_msg(vmbus, &msg, sizeof(msg)); 1972 return; 1973 } 1974 } 1975 1976 assert(false); 1977 } 1978 1979 static bool complete_create_gpadl(VMBus *vmbus) 1980 { 1981 VMBusGpadl *gpadl; 1982 1983 QTAILQ_FOREACH(gpadl, &vmbus->gpadl_list, link) { 1984 if (gpadl_full(gpadl) && gpadl->state == VMGPADL_INIT) { 1985 gpadl->state = VMGPADL_ALIVE; 1986 1987 return true; 1988 } 1989 } 1990 1991 assert(false); 1992 return false; 1993 } 1994 1995 static void handle_gpadl_teardown(VMBus *vmbus, 1996 vmbus_message_gpadl_teardown *msg, 1997 uint32_t msglen) 1998 { 1999 VMBusGpadl *gpadl; 2000 2001 if (msglen < sizeof(*msg) || !vmbus_initialized(vmbus)) { 2002 return; 2003 } 2004 2005 trace_vmbus_gpadl_teardown(msg->gpadl_id); 2006 2007 gpadl = find_gpadl(vmbus, msg->gpadl_id); 2008 if (!gpadl || gpadl->state == VMGPADL_TORNDOWN) { 2009 return; 2010 } 2011 2012 gpadl->state = VMGPADL_TEARINGDOWN; 2013 vmbus->state = VMBUS_TEARDOWN_GPADL; 2014 } 2015 2016 static void send_teardown_gpadl(VMBus *vmbus) 2017 { 2018 VMBusGpadl *gpadl; 2019 2020 QTAILQ_FOREACH(gpadl, &vmbus->gpadl_list, link) { 2021 if (gpadl->state == VMGPADL_TEARINGDOWN) { 2022 struct vmbus_message_gpadl_torndown msg = { 2023 .header.message_type = VMBUS_MSG_GPADL_TORNDOWN, 2024 .gpadl_id = gpadl->id, 2025 }; 2026 2027 trace_vmbus_gpadl_torndown(gpadl->id); 2028 post_msg(vmbus, &msg, sizeof(msg)); 2029 return; 2030 } 2031 } 2032 2033 assert(false); 2034 } 2035 2036 static bool complete_teardown_gpadl(VMBus *vmbus) 2037 { 2038 VMBusGpadl *gpadl; 2039 2040 QTAILQ_FOREACH(gpadl, &vmbus->gpadl_list, link) { 2041 if (gpadl->state == VMGPADL_TEARINGDOWN) { 2042 gpadl->state = VMGPADL_TORNDOWN; 2043 vmbus_put_gpadl(gpadl); 2044 return true; 2045 } 2046 } 2047 2048 assert(false); 2049 return false; 2050 } 2051 2052 static void handle_open_channel(VMBus *vmbus, vmbus_message_open_channel *msg, 2053 uint32_t msglen) 2054 { 2055 VMBusChannel *chan; 2056 2057 if (msglen < sizeof(*msg) || !vmbus_initialized(vmbus)) { 2058 return; 2059 } 2060 2061 trace_vmbus_open_channel(msg->child_relid, msg->ring_buffer_gpadl_id, 2062 msg->target_vp); 2063 chan = find_channel(vmbus, msg->child_relid); 2064 if (!chan || chan->state != VMCHAN_INIT) { 2065 return; 2066 } 2067 2068 chan->ringbuf_gpadl = msg->ring_buffer_gpadl_id; 2069 chan->ringbuf_send_offset = msg->ring_buffer_offset; 2070 chan->target_vp = msg->target_vp; 2071 chan->open_id = msg->open_id; 2072 2073 open_channel(chan); 2074 2075 chan->state = VMCHAN_OPENING; 2076 vmbus->state = VMBUS_OPEN_CHANNEL; 2077 } 2078 2079 static void send_open_channel(VMBus *vmbus) 2080 { 2081 VMBusChannel *chan; 2082 2083 QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { 2084 if (chan->state == VMCHAN_OPENING) { 2085 struct vmbus_message_open_result msg = { 2086 .header.message_type = VMBUS_MSG_OPENCHANNEL_RESULT, 2087 .child_relid = chan->id, 2088 .open_id = chan->open_id, 2089 .status = !vmbus_channel_is_open(chan), 2090 }; 2091 2092 trace_vmbus_channel_open(chan->id, msg.status); 2093 post_msg(vmbus, &msg, sizeof(msg)); 2094 return; 2095 } 2096 } 2097 2098 assert(false); 2099 } 2100 2101 static bool complete_open_channel(VMBus *vmbus) 2102 { 2103 VMBusChannel *chan; 2104 2105 QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { 2106 if (chan->state == VMCHAN_OPENING) { 2107 if (vmbus_channel_is_open(chan)) { 2108 chan->state = VMCHAN_OPEN; 2109 /* 2110 * simulate guest notification of ringbuffer space made 2111 * available, for the channel protocols where the host 2112 * initiates the communication 2113 */ 2114 vmbus_channel_notify_host(chan); 2115 } else { 2116 chan->state = VMCHAN_INIT; 2117 } 2118 return true; 2119 } 2120 } 2121 2122 assert(false); 2123 return false; 2124 } 2125 2126 static void vdev_reset_on_close(VMBusDevice *vdev) 2127 { 2128 uint16_t i; 2129 2130 for (i = 0; i < vdev->num_channels; i++) { 2131 if (vmbus_channel_is_open(&vdev->channels[i])) { 2132 return; 2133 } 2134 } 2135 2136 /* all channels closed -- reset device */ 2137 qdev_reset_all(DEVICE(vdev)); 2138 } 2139 2140 static void handle_close_channel(VMBus *vmbus, vmbus_message_close_channel *msg, 2141 uint32_t msglen) 2142 { 2143 VMBusChannel *chan; 2144 2145 if (msglen < sizeof(*msg) || !vmbus_initialized(vmbus)) { 2146 return; 2147 } 2148 2149 trace_vmbus_close_channel(msg->child_relid); 2150 2151 chan = find_channel(vmbus, msg->child_relid); 2152 if (!chan) { 2153 return; 2154 } 2155 2156 close_channel(chan); 2157 chan->state = VMCHAN_INIT; 2158 2159 vdev_reset_on_close(chan->dev); 2160 } 2161 2162 static void handle_unload(VMBus *vmbus, void *msg, uint32_t msglen) 2163 { 2164 vmbus->state = VMBUS_UNLOAD; 2165 } 2166 2167 static void send_unload(VMBus *vmbus) 2168 { 2169 vmbus_message_header msg = { 2170 .message_type = VMBUS_MSG_UNLOAD_RESPONSE, 2171 }; 2172 2173 qemu_mutex_lock(&vmbus->rx_queue_lock); 2174 vmbus->rx_queue_size = 0; 2175 qemu_mutex_unlock(&vmbus->rx_queue_lock); 2176 2177 post_msg(vmbus, &msg, sizeof(msg)); 2178 return; 2179 } 2180 2181 static bool complete_unload(VMBus *vmbus) 2182 { 2183 vmbus_reset_all(vmbus); 2184 return true; 2185 } 2186 2187 static void process_message(VMBus *vmbus) 2188 { 2189 struct hyperv_post_message_input *hv_msg; 2190 struct vmbus_message_header *msg; 2191 void *msgdata; 2192 uint32_t msglen; 2193 2194 qemu_mutex_lock(&vmbus->rx_queue_lock); 2195 2196 if (!vmbus->rx_queue_size) { 2197 goto unlock; 2198 } 2199 2200 hv_msg = &vmbus->rx_queue[vmbus->rx_queue_head]; 2201 msglen = hv_msg->payload_size; 2202 if (msglen < sizeof(*msg)) { 2203 goto out; 2204 } 2205 msgdata = hv_msg->payload; 2206 msg = (struct vmbus_message_header *)msgdata; 2207 2208 trace_vmbus_process_incoming_message(msg->message_type); 2209 2210 switch (msg->message_type) { 2211 case VMBUS_MSG_INITIATE_CONTACT: 2212 handle_initiate_contact(vmbus, msgdata, msglen); 2213 break; 2214 case VMBUS_MSG_REQUESTOFFERS: 2215 handle_request_offers(vmbus, msgdata, msglen); 2216 break; 2217 case VMBUS_MSG_GPADL_HEADER: 2218 handle_gpadl_header(vmbus, msgdata, msglen); 2219 break; 2220 case VMBUS_MSG_GPADL_BODY: 2221 handle_gpadl_body(vmbus, msgdata, msglen); 2222 break; 2223 case VMBUS_MSG_GPADL_TEARDOWN: 2224 handle_gpadl_teardown(vmbus, msgdata, msglen); 2225 break; 2226 case VMBUS_MSG_OPENCHANNEL: 2227 handle_open_channel(vmbus, msgdata, msglen); 2228 break; 2229 case VMBUS_MSG_CLOSECHANNEL: 2230 handle_close_channel(vmbus, msgdata, msglen); 2231 break; 2232 case VMBUS_MSG_UNLOAD: 2233 handle_unload(vmbus, msgdata, msglen); 2234 break; 2235 default: 2236 error_report("unknown message type %#x", msg->message_type); 2237 break; 2238 } 2239 2240 out: 2241 vmbus->rx_queue_size--; 2242 vmbus->rx_queue_head++; 2243 vmbus->rx_queue_head %= HV_MSG_QUEUE_LEN; 2244 2245 vmbus_resched(vmbus); 2246 unlock: 2247 qemu_mutex_unlock(&vmbus->rx_queue_lock); 2248 } 2249 2250 static const struct { 2251 void (*run)(VMBus *vmbus); 2252 bool (*complete)(VMBus *vmbus); 2253 } state_runner[] = { 2254 [VMBUS_LISTEN] = {process_message, NULL}, 2255 [VMBUS_HANDSHAKE] = {send_handshake, NULL}, 2256 [VMBUS_OFFER] = {send_offer, complete_offer}, 2257 [VMBUS_CREATE_GPADL] = {send_create_gpadl, complete_create_gpadl}, 2258 [VMBUS_TEARDOWN_GPADL] = {send_teardown_gpadl, complete_teardown_gpadl}, 2259 [VMBUS_OPEN_CHANNEL] = {send_open_channel, complete_open_channel}, 2260 [VMBUS_UNLOAD] = {send_unload, complete_unload}, 2261 }; 2262 2263 static void vmbus_do_run(VMBus *vmbus) 2264 { 2265 if (vmbus->msg_in_progress) { 2266 return; 2267 } 2268 2269 assert(vmbus->state < VMBUS_STATE_MAX); 2270 assert(state_runner[vmbus->state].run); 2271 state_runner[vmbus->state].run(vmbus); 2272 } 2273 2274 static void vmbus_run(void *opaque) 2275 { 2276 VMBus *vmbus = opaque; 2277 2278 /* make sure no recursion happens (e.g. due to recursive aio_poll()) */ 2279 if (vmbus->in_progress) { 2280 return; 2281 } 2282 2283 vmbus->in_progress = true; 2284 /* 2285 * FIXME: if vmbus_resched() is called from within vmbus_do_run(), it 2286 * should go *after* the code that can result in aio_poll; otherwise 2287 * reschedules can be missed. No idea how to enforce that. 2288 */ 2289 vmbus_do_run(vmbus); 2290 vmbus->in_progress = false; 2291 } 2292 2293 static void vmbus_msg_cb(void *data, int status) 2294 { 2295 VMBus *vmbus = data; 2296 bool (*complete)(VMBus *vmbus); 2297 2298 assert(vmbus->msg_in_progress); 2299 2300 trace_vmbus_msg_cb(status); 2301 2302 if (status == -EAGAIN) { 2303 goto out; 2304 } 2305 if (status) { 2306 error_report("message delivery fatal failure: %d; aborting vmbus", 2307 status); 2308 vmbus_reset_all(vmbus); 2309 return; 2310 } 2311 2312 assert(vmbus->state < VMBUS_STATE_MAX); 2313 complete = state_runner[vmbus->state].complete; 2314 if (!complete || complete(vmbus)) { 2315 vmbus->state = VMBUS_LISTEN; 2316 } 2317 out: 2318 vmbus->msg_in_progress = false; 2319 vmbus_resched(vmbus); 2320 } 2321 2322 static void vmbus_resched(VMBus *vmbus) 2323 { 2324 aio_bh_schedule_oneshot(qemu_get_aio_context(), vmbus_run, vmbus); 2325 } 2326 2327 static void vmbus_signal_event(EventNotifier *e) 2328 { 2329 VMBusChannel *chan; 2330 VMBus *vmbus = container_of(e, VMBus, notifier); 2331 unsigned long *int_map; 2332 hwaddr addr, len; 2333 bool is_dirty = false; 2334 2335 if (!event_notifier_test_and_clear(e)) { 2336 return; 2337 } 2338 2339 trace_vmbus_signal_event(); 2340 2341 if (!vmbus->int_page_gpa) { 2342 return; 2343 } 2344 2345 addr = vmbus->int_page_gpa + TARGET_PAGE_SIZE / 2; 2346 len = TARGET_PAGE_SIZE / 2; 2347 int_map = cpu_physical_memory_map(addr, &len, 1); 2348 if (len != TARGET_PAGE_SIZE / 2) { 2349 goto unmap; 2350 } 2351 2352 QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { 2353 if (bitmap_test_and_clear_atomic(int_map, chan->id, 1)) { 2354 if (!vmbus_channel_is_open(chan)) { 2355 continue; 2356 } 2357 vmbus_channel_notify_host(chan); 2358 is_dirty = true; 2359 } 2360 } 2361 2362 unmap: 2363 cpu_physical_memory_unmap(int_map, len, 1, is_dirty); 2364 } 2365 2366 static void vmbus_dev_realize(DeviceState *dev, Error **errp) 2367 { 2368 VMBusDevice *vdev = VMBUS_DEVICE(dev); 2369 VMBusDeviceClass *vdc = VMBUS_DEVICE_GET_CLASS(vdev); 2370 VMBus *vmbus = VMBUS(qdev_get_parent_bus(dev)); 2371 BusChild *child; 2372 Error *err = NULL; 2373 char idstr[UUID_FMT_LEN + 1]; 2374 2375 assert(!qemu_uuid_is_null(&vdev->instanceid)); 2376 2377 /* Check for instance id collision for this class id */ 2378 QTAILQ_FOREACH(child, &BUS(vmbus)->children, sibling) { 2379 VMBusDevice *child_dev = VMBUS_DEVICE(child->child); 2380 2381 if (child_dev == vdev) { 2382 continue; 2383 } 2384 2385 if (qemu_uuid_is_equal(&child_dev->instanceid, &vdev->instanceid)) { 2386 qemu_uuid_unparse(&vdev->instanceid, idstr); 2387 error_setg(&err, "duplicate vmbus device instance id %s", idstr); 2388 goto error_out; 2389 } 2390 } 2391 2392 vdev->dma_as = &address_space_memory; 2393 2394 create_channels(vmbus, vdev, &err); 2395 if (err) { 2396 goto error_out; 2397 } 2398 2399 if (vdc->vmdev_realize) { 2400 vdc->vmdev_realize(vdev, &err); 2401 if (err) { 2402 goto err_vdc_realize; 2403 } 2404 } 2405 return; 2406 2407 err_vdc_realize: 2408 free_channels(vdev); 2409 error_out: 2410 error_propagate(errp, err); 2411 } 2412 2413 static void vmbus_dev_reset(DeviceState *dev) 2414 { 2415 uint16_t i; 2416 VMBusDevice *vdev = VMBUS_DEVICE(dev); 2417 VMBusDeviceClass *vdc = VMBUS_DEVICE_GET_CLASS(vdev); 2418 2419 if (vdev->channels) { 2420 for (i = 0; i < vdev->num_channels; i++) { 2421 VMBusChannel *chan = &vdev->channels[i]; 2422 close_channel(chan); 2423 chan->state = VMCHAN_INIT; 2424 } 2425 } 2426 2427 if (vdc->vmdev_reset) { 2428 vdc->vmdev_reset(vdev); 2429 } 2430 } 2431 2432 static void vmbus_dev_unrealize(DeviceState *dev) 2433 { 2434 VMBusDevice *vdev = VMBUS_DEVICE(dev); 2435 VMBusDeviceClass *vdc = VMBUS_DEVICE_GET_CLASS(vdev); 2436 2437 if (vdc->vmdev_unrealize) { 2438 vdc->vmdev_unrealize(vdev); 2439 } 2440 free_channels(vdev); 2441 } 2442 2443 static void vmbus_dev_class_init(ObjectClass *klass, void *data) 2444 { 2445 DeviceClass *kdev = DEVICE_CLASS(klass); 2446 kdev->bus_type = TYPE_VMBUS; 2447 kdev->realize = vmbus_dev_realize; 2448 kdev->unrealize = vmbus_dev_unrealize; 2449 kdev->reset = vmbus_dev_reset; 2450 } 2451 2452 static Property vmbus_dev_instanceid = 2453 DEFINE_PROP_UUID("instanceid", VMBusDevice, instanceid); 2454 2455 static void vmbus_dev_instance_init(Object *obj) 2456 { 2457 VMBusDevice *vdev = VMBUS_DEVICE(obj); 2458 VMBusDeviceClass *vdc = VMBUS_DEVICE_GET_CLASS(vdev); 2459 2460 if (!qemu_uuid_is_null(&vdc->instanceid)) { 2461 /* Class wants to only have a single instance with a fixed UUID */ 2462 vdev->instanceid = vdc->instanceid; 2463 } else { 2464 qdev_property_add_static(DEVICE(vdev), &vmbus_dev_instanceid); 2465 } 2466 } 2467 2468 const VMStateDescription vmstate_vmbus_dev = { 2469 .name = TYPE_VMBUS_DEVICE, 2470 .version_id = 0, 2471 .minimum_version_id = 0, 2472 .fields = (VMStateField[]) { 2473 VMSTATE_UINT8_ARRAY(instanceid.data, VMBusDevice, 16), 2474 VMSTATE_UINT16(num_channels, VMBusDevice), 2475 VMSTATE_STRUCT_VARRAY_POINTER_UINT16(channels, VMBusDevice, 2476 num_channels, vmstate_channel, 2477 VMBusChannel), 2478 VMSTATE_END_OF_LIST() 2479 } 2480 }; 2481 2482 /* vmbus generic device base */ 2483 static const TypeInfo vmbus_dev_type_info = { 2484 .name = TYPE_VMBUS_DEVICE, 2485 .parent = TYPE_DEVICE, 2486 .abstract = true, 2487 .instance_size = sizeof(VMBusDevice), 2488 .class_size = sizeof(VMBusDeviceClass), 2489 .class_init = vmbus_dev_class_init, 2490 .instance_init = vmbus_dev_instance_init, 2491 }; 2492 2493 static void vmbus_realize(BusState *bus, Error **errp) 2494 { 2495 int ret = 0; 2496 Error *local_err = NULL; 2497 VMBus *vmbus = VMBUS(bus); 2498 2499 qemu_mutex_init(&vmbus->rx_queue_lock); 2500 2501 QTAILQ_INIT(&vmbus->gpadl_list); 2502 QTAILQ_INIT(&vmbus->channel_list); 2503 2504 ret = hyperv_set_msg_handler(VMBUS_MESSAGE_CONNECTION_ID, 2505 vmbus_recv_message, vmbus); 2506 if (ret != 0) { 2507 error_setg(&local_err, "hyperv set message handler failed: %d", ret); 2508 goto error_out; 2509 } 2510 2511 ret = event_notifier_init(&vmbus->notifier, 0); 2512 if (ret != 0) { 2513 error_setg(&local_err, "event notifier failed to init with %d", ret); 2514 goto remove_msg_handler; 2515 } 2516 2517 event_notifier_set_handler(&vmbus->notifier, vmbus_signal_event); 2518 ret = hyperv_set_event_flag_handler(VMBUS_EVENT_CONNECTION_ID, 2519 &vmbus->notifier); 2520 if (ret != 0) { 2521 error_setg(&local_err, "hyperv set event handler failed with %d", ret); 2522 goto clear_event_notifier; 2523 } 2524 2525 return; 2526 2527 clear_event_notifier: 2528 event_notifier_cleanup(&vmbus->notifier); 2529 remove_msg_handler: 2530 hyperv_set_msg_handler(VMBUS_MESSAGE_CONNECTION_ID, NULL, NULL); 2531 error_out: 2532 qemu_mutex_destroy(&vmbus->rx_queue_lock); 2533 error_propagate(errp, local_err); 2534 } 2535 2536 static void vmbus_unrealize(BusState *bus) 2537 { 2538 VMBus *vmbus = VMBUS(bus); 2539 2540 hyperv_set_msg_handler(VMBUS_MESSAGE_CONNECTION_ID, NULL, NULL); 2541 hyperv_set_event_flag_handler(VMBUS_EVENT_CONNECTION_ID, NULL); 2542 event_notifier_cleanup(&vmbus->notifier); 2543 2544 qemu_mutex_destroy(&vmbus->rx_queue_lock); 2545 } 2546 2547 static void vmbus_reset(BusState *bus) 2548 { 2549 vmbus_deinit(VMBUS(bus)); 2550 } 2551 2552 static char *vmbus_get_dev_path(DeviceState *dev) 2553 { 2554 BusState *bus = qdev_get_parent_bus(dev); 2555 return qdev_get_dev_path(bus->parent); 2556 } 2557 2558 static char *vmbus_get_fw_dev_path(DeviceState *dev) 2559 { 2560 VMBusDevice *vdev = VMBUS_DEVICE(dev); 2561 char uuid[UUID_FMT_LEN + 1]; 2562 2563 qemu_uuid_unparse(&vdev->instanceid, uuid); 2564 return g_strdup_printf("%s@%s", qdev_fw_name(dev), uuid); 2565 } 2566 2567 static void vmbus_class_init(ObjectClass *klass, void *data) 2568 { 2569 BusClass *k = BUS_CLASS(klass); 2570 2571 k->get_dev_path = vmbus_get_dev_path; 2572 k->get_fw_dev_path = vmbus_get_fw_dev_path; 2573 k->realize = vmbus_realize; 2574 k->unrealize = vmbus_unrealize; 2575 k->reset = vmbus_reset; 2576 } 2577 2578 static int vmbus_pre_load(void *opaque) 2579 { 2580 VMBusChannel *chan; 2581 VMBus *vmbus = VMBUS(opaque); 2582 2583 /* 2584 * channel IDs allocated by the source will come in the migration stream 2585 * for each channel, so clean up the ones allocated at realize 2586 */ 2587 QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { 2588 unregister_chan_id(chan); 2589 } 2590 2591 return 0; 2592 } 2593 static int vmbus_post_load(void *opaque, int version_id) 2594 { 2595 int ret; 2596 VMBus *vmbus = VMBUS(opaque); 2597 VMBusGpadl *gpadl; 2598 VMBusChannel *chan; 2599 2600 ret = vmbus_init(vmbus); 2601 if (ret) { 2602 return ret; 2603 } 2604 2605 QTAILQ_FOREACH(gpadl, &vmbus->gpadl_list, link) { 2606 gpadl->vmbus = vmbus; 2607 gpadl->refcount = 1; 2608 } 2609 2610 /* 2611 * reopening channels depends on initialized vmbus so it's done here 2612 * instead of channel_post_load() 2613 */ 2614 QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { 2615 2616 if (chan->state == VMCHAN_OPENING || chan->state == VMCHAN_OPEN) { 2617 open_channel(chan); 2618 } 2619 2620 if (chan->state != VMCHAN_OPEN) { 2621 continue; 2622 } 2623 2624 if (!vmbus_channel_is_open(chan)) { 2625 /* reopen failed, abort loading */ 2626 return -1; 2627 } 2628 2629 /* resume processing on the guest side if it missed the notification */ 2630 hyperv_sint_route_set_sint(chan->notify_route); 2631 /* ditto on the host side */ 2632 vmbus_channel_notify_host(chan); 2633 } 2634 2635 vmbus_resched(vmbus); 2636 return 0; 2637 } 2638 2639 static const VMStateDescription vmstate_post_message_input = { 2640 .name = "vmbus/hyperv_post_message_input", 2641 .version_id = 0, 2642 .minimum_version_id = 0, 2643 .fields = (VMStateField[]) { 2644 /* 2645 * skip connection_id and message_type as they are validated before 2646 * queueing and ignored on dequeueing 2647 */ 2648 VMSTATE_UINT32(payload_size, struct hyperv_post_message_input), 2649 VMSTATE_UINT8_ARRAY(payload, struct hyperv_post_message_input, 2650 HV_MESSAGE_PAYLOAD_SIZE), 2651 VMSTATE_END_OF_LIST() 2652 } 2653 }; 2654 2655 static bool vmbus_rx_queue_needed(void *opaque) 2656 { 2657 VMBus *vmbus = VMBUS(opaque); 2658 return vmbus->rx_queue_size; 2659 } 2660 2661 static const VMStateDescription vmstate_rx_queue = { 2662 .name = "vmbus/rx_queue", 2663 .version_id = 0, 2664 .minimum_version_id = 0, 2665 .needed = vmbus_rx_queue_needed, 2666 .fields = (VMStateField[]) { 2667 VMSTATE_UINT8(rx_queue_head, VMBus), 2668 VMSTATE_UINT8(rx_queue_size, VMBus), 2669 VMSTATE_STRUCT_ARRAY(rx_queue, VMBus, 2670 HV_MSG_QUEUE_LEN, 0, 2671 vmstate_post_message_input, 2672 struct hyperv_post_message_input), 2673 VMSTATE_END_OF_LIST() 2674 } 2675 }; 2676 2677 static const VMStateDescription vmstate_vmbus = { 2678 .name = TYPE_VMBUS, 2679 .version_id = 0, 2680 .minimum_version_id = 0, 2681 .pre_load = vmbus_pre_load, 2682 .post_load = vmbus_post_load, 2683 .fields = (VMStateField[]) { 2684 VMSTATE_UINT8(state, VMBus), 2685 VMSTATE_UINT32(version, VMBus), 2686 VMSTATE_UINT32(target_vp, VMBus), 2687 VMSTATE_UINT64(int_page_gpa, VMBus), 2688 VMSTATE_QTAILQ_V(gpadl_list, VMBus, 0, 2689 vmstate_gpadl, VMBusGpadl, link), 2690 VMSTATE_END_OF_LIST() 2691 }, 2692 .subsections = (const VMStateDescription * []) { 2693 &vmstate_rx_queue, 2694 NULL 2695 } 2696 }; 2697 2698 static const TypeInfo vmbus_type_info = { 2699 .name = TYPE_VMBUS, 2700 .parent = TYPE_BUS, 2701 .instance_size = sizeof(VMBus), 2702 .class_init = vmbus_class_init, 2703 }; 2704 2705 static void vmbus_bridge_realize(DeviceState *dev, Error **errp) 2706 { 2707 VMBusBridge *bridge = VMBUS_BRIDGE(dev); 2708 2709 /* 2710 * here there's at least one vmbus bridge that is being realized, so 2711 * vmbus_bridge_find can only return NULL if it's not unique 2712 */ 2713 if (!vmbus_bridge_find()) { 2714 error_setg(errp, "there can be at most one %s in the system", 2715 TYPE_VMBUS_BRIDGE); 2716 return; 2717 } 2718 2719 if (!hyperv_is_synic_enabled()) { 2720 error_report("VMBus requires usable Hyper-V SynIC and VP_INDEX"); 2721 return; 2722 } 2723 2724 bridge->bus = VMBUS(qbus_create(TYPE_VMBUS, dev, "vmbus")); 2725 } 2726 2727 static char *vmbus_bridge_ofw_unit_address(const SysBusDevice *dev) 2728 { 2729 /* there can be only one VMBus */ 2730 return g_strdup("0"); 2731 } 2732 2733 static const VMStateDescription vmstate_vmbus_bridge = { 2734 .name = TYPE_VMBUS_BRIDGE, 2735 .version_id = 0, 2736 .minimum_version_id = 0, 2737 .fields = (VMStateField[]) { 2738 VMSTATE_STRUCT_POINTER(bus, VMBusBridge, vmstate_vmbus, VMBus), 2739 VMSTATE_END_OF_LIST() 2740 }, 2741 }; 2742 2743 static Property vmbus_bridge_props[] = { 2744 DEFINE_PROP_UINT8("irq", VMBusBridge, irq, 7), 2745 DEFINE_PROP_END_OF_LIST() 2746 }; 2747 2748 static void vmbus_bridge_class_init(ObjectClass *klass, void *data) 2749 { 2750 DeviceClass *k = DEVICE_CLASS(klass); 2751 SysBusDeviceClass *sk = SYS_BUS_DEVICE_CLASS(klass); 2752 2753 k->realize = vmbus_bridge_realize; 2754 k->fw_name = "vmbus"; 2755 sk->explicit_ofw_unit_address = vmbus_bridge_ofw_unit_address; 2756 set_bit(DEVICE_CATEGORY_BRIDGE, k->categories); 2757 k->vmsd = &vmstate_vmbus_bridge; 2758 device_class_set_props(k, vmbus_bridge_props); 2759 /* override SysBusDevice's default */ 2760 k->user_creatable = true; 2761 } 2762 2763 static const TypeInfo vmbus_bridge_type_info = { 2764 .name = TYPE_VMBUS_BRIDGE, 2765 .parent = TYPE_SYS_BUS_DEVICE, 2766 .instance_size = sizeof(VMBusBridge), 2767 .class_init = vmbus_bridge_class_init, 2768 }; 2769 2770 static void vmbus_register_types(void) 2771 { 2772 type_register_static(&vmbus_bridge_type_info); 2773 type_register_static(&vmbus_dev_type_info); 2774 type_register_static(&vmbus_type_info); 2775 } 2776 2777 type_init(vmbus_register_types) 2778