diff options
author | Alexey Kardashevskiy | 2014-06-10 07:39:22 +0200 |
---|---|---|
committer | Alexander Graf | 2014-06-27 13:48:23 +0200 |
commit | 6d8be4c3434783a59ae29f7ea6a792b56c812349 (patch) | |
tree | a836f89a33c6e8427449e2cb51eb43c16cecdcd2 /hw/misc | |
parent | spapr_iommu: Make in-kernel TCE table optional (diff) | |
download | qemu-6d8be4c3434783a59ae29f7ea6a792b56c812349.tar.gz qemu-6d8be4c3434783a59ae29f7ea6a792b56c812349.tar.xz qemu-6d8be4c3434783a59ae29f7ea6a792b56c812349.zip |
vfio: Add vfio_container_ioctl()
While most operations with VFIO IOMMU driver are generic and used inside
vfio.c, there are still some operations which only specific VFIO IOMMU
drivers implement. The first example of it will be reading a DMA window
start from the host.
This adds a helper which passes an ioctl request to the container's fd.
The helper will check if @req is known. For this, stub is added. This return
-1 on any requests for now.
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Acked-by: Alex Williamson <alex.williamson@redhat.com>
Acked-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'hw/misc')
-rw-r--r-- | hw/misc/vfio.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c index 7437c2e3c3..bdd6e3386e 100644 --- a/hw/misc/vfio.c +++ b/hw/misc/vfio.c @@ -39,6 +39,7 @@ #include "qemu/range.h" #include "sysemu/kvm.h" #include "sysemu/sysemu.h" +#include "hw/misc/vfio.h" /* #define DEBUG_VFIO */ #ifdef DEBUG_VFIO @@ -4318,3 +4319,44 @@ static void register_vfio_pci_dev_type(void) } type_init(register_vfio_pci_dev_type) + +static int vfio_container_do_ioctl(AddressSpace *as, int32_t groupid, + int req, void *param) +{ + VFIOGroup *group; + VFIOContainer *container; + int ret = -1; + + group = vfio_get_group(groupid, as); + if (!group) { + error_report("vfio: group %d not registered", groupid); + return ret; + } + + container = group->container; + if (group->container) { + ret = ioctl(container->fd, req, param); + if (ret < 0) { + error_report("vfio: failed to ioctl container: ret=%d, %s", + ret, strerror(errno)); + } + } + + vfio_put_group(group); + + return ret; +} + +int vfio_container_ioctl(AddressSpace *as, int32_t groupid, + int req, void *param) +{ + /* We allow only certain ioctls to the container */ + switch (req) { + default: + /* Return an error on unknown requests */ + error_report("vfio: unsupported ioctl %X", req); + return -1; + } + + return vfio_container_do_ioctl(as, groupid, req, param); +} |