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