#ifndef KVM__VIRTIO_9P_H #define KVM__VIRTIO_9P_H #include "kvm/virtio.h" #include "kvm/pci.h" #include "kvm/threadpool.h" #include "kvm/parse-options.h" #include #include #include #define NUM_VIRT_QUEUES 1 #define VIRTQUEUE_NUM 128 #define VIRTIO_9P_DEFAULT_TAG "kvm_9p" #define VIRTIO_9P_HDR_LEN (sizeof(u32)+sizeof(u8)+sizeof(u16)) #define VIRTIO_9P_VERSION_DOTL "9P2000.L" #define MAX_TAG_LEN 32 struct p9_msg { u32 size; u8 cmd; u16 tag; u8 msg[0]; } __attribute__((packed)); struct p9_fid { u32 fid; u32 uid; char abs_path[PATH_MAX]; char *path; DIR *dir; int fd; struct rb_node node; }; struct p9_dev_job { struct virt_queue *vq; struct p9_dev *p9dev; struct thread_pool__job job_id; }; struct p9_dev { struct list_head list; struct virtio_device vdev; struct rb_root fids; size_t config_size; struct virtio_9p_config *config; u16 tag_len; /* virtio queue */ struct virt_queue vqs[NUM_VIRT_QUEUES]; struct p9_dev_job jobs[NUM_VIRT_QUEUES]; char root_dir[PATH_MAX]; }; struct p9_pdu { u32 queue_head; size_t read_offset; size_t write_offset; u16 out_iov_cnt; u16 in_iov_cnt; struct iovec in_iov[VIRTQUEUE_NUM]; struct iovec out_iov[VIRTQUEUE_NUM]; }; struct kvm; int virtio_9p_rootdir_parser(const struct option *opt, const char *arg, int unset); int virtio_9p_img_name_parser(const struct option *opt, const char *arg, int unset); int virtio_9p__register(struct kvm *kvm, const char *root, const char *tag_name); int virtio_9p__init(struct kvm *kvm); int virtio_9p__exit(struct kvm *kvm); int virtio_p9_pdu_readf(struct p9_pdu *pdu, const char *fmt, ...); int virtio_p9_pdu_writef(struct p9_pdu *pdu, const char *fmt, ...); #endif