diff options
author | Thanos Makatos <thanos.makatos@nutanix.com> | 2020-03-24 12:06:26 -0400 |
---|---|---|
committer | Thanos Makatos <thanos.makatos@nutanix.com> | 2020-03-25 10:36:29 -0400 |
commit | 8435c007567fdd0a92ed1f4e8dd7b60bb09ae116 (patch) | |
tree | 67fcfe389226d546bbe67bac7bf32f3cadfdd922 /kmod | |
parent | 9a8dddb7ed5c5d4ac0bc1ff89af795e5fe312c86 (diff) | |
download | libvfio-user-8435c007567fdd0a92ed1f4e8dd7b60bb09ae116.zip libvfio-user-8435c007567fdd0a92ed1f4e8dd7b60bb09ae116.tar.gz libvfio-user-8435c007567fdd0a92ed1f4e8dd7b60bb09ae116.tar.bz2 |
introduce vfio-over-socket transport
Signed-off-by: Thanos Makatos <thanos.makatos@nutanix.com>
Diffstat (limited to 'kmod')
-rw-r--r-- | kmod/muser.c | 33 | ||||
-rw-r--r-- | kmod/muser.h | 94 |
2 files changed, 95 insertions, 32 deletions
diff --git a/kmod/muser.c b/kmod/muser.c index 9e5a2c8..53cc3d8 100644 --- a/kmod/muser.c +++ b/kmod/muser.c @@ -1046,37 +1046,6 @@ err: return ret; } -static ssize_t get_minsz(unsigned int cmd) -{ - switch (cmd) { - case VFIO_DEVICE_GET_INFO: - return offsetofend(struct vfio_device_info, num_irqs); - case VFIO_DEVICE_GET_REGION_INFO: - return offsetofend(struct vfio_region_info, offset); - case VFIO_DEVICE_GET_IRQ_INFO: - return offsetofend(struct vfio_irq_info, count); - case VFIO_DEVICE_SET_IRQS: - return offsetofend(struct vfio_irq_set, count); - } - return -EOPNOTSUPP; -} - -static ssize_t get_argsz(unsigned int cmd, struct mudev_cmd *mucmd) -{ - switch (cmd) { - case VFIO_DEVICE_GET_INFO: - return mucmd->muser_cmd.ioctl.data.dev_info.argsz; - case VFIO_DEVICE_GET_REGION_INFO: - return mucmd->muser_cmd.ioctl.data.reg_info.argsz; - case VFIO_DEVICE_GET_IRQ_INFO: - return mucmd->muser_cmd.ioctl.data.irq_info.argsz; - case VFIO_DEVICE_SET_IRQS: - return mucmd->muser_cmd.ioctl.data.irq_set.argsz; - } - - return -EOPNOTSUPP; -} - static int muser_ioctl_setup_cmd(struct mudev_cmd *mucmd, unsigned int cmd, unsigned long arg) { @@ -1095,7 +1064,7 @@ static int muser_ioctl_setup_cmd(struct mudev_cmd *mucmd, unsigned int cmd, return err; /* Fetch argsz provided by caller. */ - argsz = get_argsz(cmd, mucmd); + argsz = get_argsz(cmd, &mucmd->muser_cmd); if (argsz < 0) return argsz; diff --git a/kmod/muser.h b/kmod/muser.h index 65841a4..9791736 100644 --- a/kmod/muser.h +++ b/kmod/muser.h @@ -13,6 +13,14 @@ #ifndef __KERNEL__ #include <sys/types.h> +#include <stddef.h> +#include <errno.h> + +/* FIXME copied from include/linux/stddef.h, is this OK license-wise? */ +#define sizeof_field(TYPE, MEMBER) sizeof((((TYPE *)0)->MEMBER)) +#define offsetofend(TYPE, MEMBER) \ + (offsetof(TYPE, MEMBER) + sizeof_field(TYPE, MEMBER)) + #endif #include <linux/ioctl.h> @@ -41,6 +49,15 @@ struct muser_cmd_ioctl { struct vfio_region_info reg_info; struct vfio_irq_info irq_info; struct vfio_irq_set irq_set; + struct vfio_group_status group_status; + int vfio_api_version; + int vfio_extension; + int container_fd; + int device_fd; + int iommu_type; + struct vfio_iommu_type1_info iommu_type1_info; + struct vfio_iommu_type1_dma_map dma_map; + struct vfio_iommu_type1_dma_unmap dma_unmap; } data; }; @@ -70,4 +87,81 @@ struct muser_cmd { #define MUSER_DEV_CMD_WAIT _IOR('M', 1, struct muser_cmd) #define MUSER_DEV_CMD_DONE _IOW('M', 2, struct muser_cmd) +static inline ssize_t get_minsz(unsigned int cmd) +{ + switch (cmd) { + case VFIO_DEVICE_GET_INFO: + return offsetofend(struct vfio_device_info, num_irqs); + case VFIO_DEVICE_GET_REGION_INFO: + return offsetofend(struct vfio_region_info, offset); + case VFIO_DEVICE_GET_IRQ_INFO: + return offsetofend(struct vfio_irq_info, count); + case VFIO_DEVICE_SET_IRQS: + return offsetofend(struct vfio_irq_set, count); + case VFIO_GROUP_GET_STATUS: + return offsetofend(struct vfio_group_status, flags); + case VFIO_GET_API_VERSION: + return 0; + case VFIO_CHECK_EXTENSION: + case VFIO_GROUP_SET_CONTAINER: + case VFIO_GROUP_UNSET_CONTAINER: + case VFIO_SET_IOMMU: + return sizeof(int); + case VFIO_IOMMU_GET_INFO: + return offsetofend(struct vfio_iommu_type1_info, iova_pgsizes); + case VFIO_IOMMU_MAP_DMA: + return offsetofend(struct vfio_iommu_type1_dma_map, size); + case VFIO_IOMMU_UNMAP_DMA: + return offsetofend(struct vfio_iommu_type1_dma_unmap, size); + case VFIO_GROUP_GET_DEVICE_FD: + case VFIO_DEVICE_RESET: + return 0; + } + return -EOPNOTSUPP; +} + +static inline ssize_t get_argsz(unsigned int cmd, struct muser_cmd *muser_cmd) +{ + switch (cmd) { + case VFIO_DEVICE_GET_INFO: + return muser_cmd->ioctl.data.dev_info.argsz; + case VFIO_DEVICE_GET_REGION_INFO: + return muser_cmd->ioctl.data.reg_info.argsz; + case VFIO_DEVICE_GET_IRQ_INFO: + return muser_cmd->ioctl.data.irq_info.argsz; + case VFIO_DEVICE_SET_IRQS: + return muser_cmd->ioctl.data.irq_set.argsz; + } + + return -EOPNOTSUPP; +} + +static inline const char* vfio_cmd_to_str(int cmd) { + switch (cmd) { + case VFIO_GET_API_VERSION: return "VFIO_GET_API_VERSION"; + case VFIO_CHECK_EXTENSION: return "VFIO_CHECK_EXTENSION"; + case VFIO_SET_IOMMU: return "VFIO_SET_IOMMU"; + case VFIO_GROUP_GET_STATUS: return "VFIO_GROUP_GET_STATUS"; + case VFIO_GROUP_SET_CONTAINER: return "VFIO_GROUP_SET_CONTAINER"; + case VFIO_GROUP_UNSET_CONTAINER: return "VFIO_GROUP_UNSET_CONTAINER"; + case VFIO_GROUP_GET_DEVICE_FD: return "VFIO_GROUP_GET_DEVICE_FD"; + case VFIO_DEVICE_GET_INFO: return "VFIO_DEVICE_GET_INFO"; + case VFIO_DEVICE_GET_REGION_INFO: return "VFIO_DEVICE_GET_REGION_INFO"; + case VFIO_DEVICE_GET_IRQ_INFO: return "VFIO_DEVICE_GET_IRQ_INFO"; + case VFIO_DEVICE_SET_IRQS: return "VFIO_DEVICE_SET_IRQS"; + case VFIO_DEVICE_RESET: return "VFIO_DEVICE_RESET"; + case VFIO_IOMMU_GET_INFO: return "VFIO_IOMMU_GET_INFO/VFIO_DEVICE_GET_PCI_HOT_RESET_INFO/VFIO_IOMMU_SPAPR_TCE_GET_INFO"; + case VFIO_IOMMU_MAP_DMA: return "VFIO_IOMMU_MAP_DMA/VFIO_DEVICE_PCI_HOT_RESET"; + case VFIO_IOMMU_UNMAP_DMA: return "VFIO_IOMMU_UNMAP_DMA"; + case VFIO_IOMMU_ENABLE: return "VFIO_IOMMU_ENABLE"; + case VFIO_IOMMU_DISABLE: return "VFIO_IOMMU_DISABLE"; + case VFIO_EEH_PE_OP: return "VFIO_EEH_PE_OP"; + case VFIO_IOMMU_SPAPR_REGISTER_MEMORY: return "VFIO_IOMMU_SPAPR_REGISTER_MEMORY"; + case VFIO_IOMMU_SPAPR_UNREGISTER_MEMORY: return "VFIO_IOMMU_SPAPR_UNREGISTER_MEMORY"; + case VFIO_IOMMU_SPAPR_TCE_CREATE: return "VFIO_IOMMU_SPAPR_TCE_CREATE"; + case VFIO_IOMMU_SPAPR_TCE_REMOVE: return "VFIO_IOMMU_SPAPR_TCE_REMOVE"; + } + return NULL; +} + #endif /* _UAPI_LINUX_MUSER_H */ |