mirror of https://gitee.com/openkylin/qemu.git
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>
This commit is contained in:
parent
9bb62a0702
commit
6d8be4c343
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
#ifndef VFIO_API_H
|
||||
#define VFIO_API_H
|
||||
|
||||
#include "qemu/typedefs.h"
|
||||
|
||||
extern int vfio_container_ioctl(AddressSpace *as, int32_t groupid,
|
||||
int req, void *param);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue