|
@@ -18,6 +18,7 @@
|
|
|
#include <linux/mutex.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/types.h>
|
|
|
+#include <linux/uaccess.h>
|
|
|
#include <linux/vfio.h>
|
|
|
|
|
|
#include "vfio_platform_private.h"
|
|
@@ -38,10 +39,27 @@ static int vfio_platform_open(void *device_data)
|
|
|
static long vfio_platform_ioctl(void *device_data,
|
|
|
unsigned int cmd, unsigned long arg)
|
|
|
{
|
|
|
- if (cmd == VFIO_DEVICE_GET_INFO)
|
|
|
- return -EINVAL;
|
|
|
+ struct vfio_platform_device *vdev = device_data;
|
|
|
+ unsigned long minsz;
|
|
|
+
|
|
|
+ if (cmd == VFIO_DEVICE_GET_INFO) {
|
|
|
+ struct vfio_device_info info;
|
|
|
+
|
|
|
+ minsz = offsetofend(struct vfio_device_info, num_irqs);
|
|
|
+
|
|
|
+ if (copy_from_user(&info, (void __user *)arg, minsz))
|
|
|
+ return -EFAULT;
|
|
|
+
|
|
|
+ if (info.argsz < minsz)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ info.flags = vdev->flags;
|
|
|
+ info.num_regions = 0;
|
|
|
+ info.num_irqs = 0;
|
|
|
+
|
|
|
+ return copy_to_user((void __user *)arg, &info, minsz);
|
|
|
|
|
|
- else if (cmd == VFIO_DEVICE_GET_REGION_INFO)
|
|
|
+ } else if (cmd == VFIO_DEVICE_GET_REGION_INFO)
|
|
|
return -EINVAL;
|
|
|
|
|
|
else if (cmd == VFIO_DEVICE_GET_IRQ_INFO)
|