1*39d6af07SAsias He #include <linux/virtio_ring.h> 2*39d6af07SAsias He #include <stdint.h> 3*39d6af07SAsias He #include <sys/uio.h> 4*39d6af07SAsias He #include "kvm/kvm.h" 5*39d6af07SAsias He #include "kvm/virtio.h" 6*39d6af07SAsias He 7*39d6af07SAsias He struct vring_used_elem *virt_queue__set_used_elem(struct virt_queue *queue, uint32_t head, uint32_t len) 8*39d6af07SAsias He { 9*39d6af07SAsias He struct vring_used_elem *used_elem; 10*39d6af07SAsias He used_elem = &queue->vring.used->ring[queue->vring.used->idx++ % queue->vring.num]; 11*39d6af07SAsias He used_elem->id = head; 12*39d6af07SAsias He used_elem->len = len; 13*39d6af07SAsias He return used_elem; 14*39d6af07SAsias He } 15*39d6af07SAsias He 16*39d6af07SAsias He uint16_t virt_queue__get_iov(struct virt_queue *queue, struct iovec iov[], uint16_t *out, uint16_t *in, struct kvm *kvm) 17*39d6af07SAsias He { 18*39d6af07SAsias He struct vring_desc *desc; 19*39d6af07SAsias He uint16_t head, idx; 20*39d6af07SAsias He 21*39d6af07SAsias He idx = head = virt_queue__pop(queue); 22*39d6af07SAsias He *out = *in = 0; 23*39d6af07SAsias He 24*39d6af07SAsias He do { 25*39d6af07SAsias He desc = virt_queue__get_desc(queue, idx); 26*39d6af07SAsias He iov[*out + *in].iov_base = guest_flat_to_host(kvm, desc->addr); 27*39d6af07SAsias He iov[*out + *in].iov_len = desc->len; 28*39d6af07SAsias He if (desc->flags & VRING_DESC_F_WRITE) 29*39d6af07SAsias He (*in)++; 30*39d6af07SAsias He else 31*39d6af07SAsias He (*out)++; 32*39d6af07SAsias He if (desc->flags & VRING_DESC_F_NEXT) 33*39d6af07SAsias He idx = desc->next; 34*39d6af07SAsias He else 35*39d6af07SAsias He break; 36*39d6af07SAsias He } while (1); 37*39d6af07SAsias He 38*39d6af07SAsias He return head; 39*39d6af07SAsias He } 40