aboutsummaryrefslogtreecommitdiff
path: root/kmod
diff options
context:
space:
mode:
authorThanos Makatos <thanos.makatos@nutanix.com>2020-03-24 12:06:26 -0400
committerThanos Makatos <thanos.makatos@nutanix.com>2020-03-25 10:36:29 -0400
commit8435c007567fdd0a92ed1f4e8dd7b60bb09ae116 (patch)
tree67fcfe389226d546bbe67bac7bf32f3cadfdd922 /kmod
parent9a8dddb7ed5c5d4ac0bc1ff89af795e5fe312c86 (diff)
downloadlibvfio-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.c33
-rw-r--r--kmod/muser.h94
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 */