1*39d6af07SAsias He #ifndef KVM__VIRTIO_H 2*39d6af07SAsias He #define KVM__VIRTIO_H 3*39d6af07SAsias He 4*39d6af07SAsias He #include <linux/virtio_ring.h> 5*39d6af07SAsias He 6*39d6af07SAsias He #include <stdint.h> 7*39d6af07SAsias He #include <sys/uio.h> 8*39d6af07SAsias He 9*39d6af07SAsias He #include "kvm/kvm.h" 10*39d6af07SAsias He 11*39d6af07SAsias He struct virt_queue { 12*39d6af07SAsias He struct vring vring; 13*39d6af07SAsias He uint32_t pfn; 14*39d6af07SAsias He /* The last_avail_idx field is an index to ->ring of struct vring_avail. 15*39d6af07SAsias He It's where we assume the next request index is at. */ 16*39d6af07SAsias He uint16_t last_avail_idx; 17*39d6af07SAsias He }; 18*39d6af07SAsias He 19*39d6af07SAsias He static inline uint16_t virt_queue__pop(struct virt_queue *queue) 20*39d6af07SAsias He { 21*39d6af07SAsias He return queue->vring.avail->ring[queue->last_avail_idx++ % queue->vring.num]; 22*39d6af07SAsias He } 23*39d6af07SAsias He 24*39d6af07SAsias He static inline struct vring_desc *virt_queue__get_desc(struct virt_queue *queue, uint16_t desc_ndx) 25*39d6af07SAsias He { 26*39d6af07SAsias He return &queue->vring.desc[desc_ndx]; 27*39d6af07SAsias He } 28*39d6af07SAsias He 29*39d6af07SAsias He static inline struct vring_used_elem *virt_queue__get_used_elem(struct virt_queue *queue) 30*39d6af07SAsias He { 31*39d6af07SAsias He return &queue->vring.used->ring[queue->vring.used->idx++ % queue->vring.num]; 32*39d6af07SAsias He } 33*39d6af07SAsias He 34*39d6af07SAsias He 35*39d6af07SAsias He static inline bool virt_queue__available(struct virt_queue *vq) 36*39d6af07SAsias He { 37*39d6af07SAsias He return vq->vring.avail->idx != vq->last_avail_idx; 38*39d6af07SAsias He } 39*39d6af07SAsias He 40*39d6af07SAsias He struct vring_used_elem *virt_queue__set_used_elem(struct virt_queue *queue, uint32_t head, uint32_t len); 41*39d6af07SAsias He 42*39d6af07SAsias He uint16_t virt_queue__get_iov(struct virt_queue *queue, struct iovec iov[], uint16_t *out, uint16_t *in, struct kvm *kvm); 43*39d6af07SAsias He 44*39d6af07SAsias He #endif /* KVM__VIRTIO_H */ 45