i915: i915_execbuffer ioctl32 routine, fix #13732
parent
da3601e43a
commit
5d8d64ad38
|
@ -34,6 +34,7 @@
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "drm.h"
|
#include "drm.h"
|
||||||
#include "i915_drm.h"
|
#include "i915_drm.h"
|
||||||
|
#include "i915_drv.h"
|
||||||
|
|
||||||
typedef struct _drm_i915_batchbuffer32 {
|
typedef struct _drm_i915_batchbuffer32 {
|
||||||
int start; /* agp offset */
|
int start; /* agp offset */
|
||||||
|
@ -182,13 +183,55 @@ static int compat_i915_alloc(struct file *file, unsigned int cmd,
|
||||||
DRM_IOCTL_I915_ALLOC, (unsigned long) request);
|
DRM_IOCTL_I915_ALLOC, (unsigned long) request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct drm_i915_execbuffer32 {
|
||||||
|
uint64_t ops_list;
|
||||||
|
uint32_t num_buffers;
|
||||||
|
struct _drm_i915_batchbuffer32 batch;
|
||||||
|
drm_context_t context;
|
||||||
|
struct drm_fence_arg fence_arg;
|
||||||
|
} drm_i915_execbuffer32_t;
|
||||||
|
|
||||||
|
static int compat_i915_execbuffer(struct file *file, unsigned int cmd,
|
||||||
|
unsigned long arg)
|
||||||
|
{
|
||||||
|
drm_i915_execbuffer32_t req32;
|
||||||
|
struct drm_i915_execbuffer __user *request;
|
||||||
|
|
||||||
|
if (copy_from_user(&req32, (void __user *) arg, sizeof(req32)))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
request = compat_alloc_user_space(sizeof(*request));
|
||||||
|
|
||||||
|
if (!access_ok(VERIFY_WRITE, request, sizeof(*request))
|
||||||
|
|| __put_user(req32.ops_list, &request->ops_list)
|
||||||
|
|| __put_user(req32.num_buffers, &request->num_buffers)
|
||||||
|
|| __put_user(req32.context, &request->context)
|
||||||
|
|| __copy_to_user(&request->fence_arg, &req32.fence_arg,
|
||||||
|
sizeof(req32.fence_arg))
|
||||||
|
|| __put_user(req32.batch.start, &request->batch.start)
|
||||||
|
|| __put_user(req32.batch.used, &request->batch.used)
|
||||||
|
|| __put_user(req32.batch.DR1, &request->batch.DR1)
|
||||||
|
|| __put_user(req32.batch.DR4, &request->batch.DR4)
|
||||||
|
|| __put_user(req32.batch.num_cliprects,
|
||||||
|
&request->batch.num_cliprects)
|
||||||
|
|| __put_user((int __user *)(unsigned long)req32.batch.cliprects,
|
||||||
|
&request->batch.cliprects))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
return drm_ioctl(file->f_dentry->d_inode, file,
|
||||||
|
DRM_IOCTL_I915_EXECBUFFER, (unsigned long)request);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
drm_ioctl_compat_t *i915_compat_ioctls[] = {
|
drm_ioctl_compat_t *i915_compat_ioctls[] = {
|
||||||
[DRM_I915_BATCHBUFFER] = compat_i915_batchbuffer,
|
[DRM_I915_BATCHBUFFER] = compat_i915_batchbuffer,
|
||||||
[DRM_I915_CMDBUFFER] = compat_i915_cmdbuffer,
|
[DRM_I915_CMDBUFFER] = compat_i915_cmdbuffer,
|
||||||
[DRM_I915_GETPARAM] = compat_i915_getparam,
|
[DRM_I915_GETPARAM] = compat_i915_getparam,
|
||||||
[DRM_I915_IRQ_EMIT] = compat_i915_irq_emit,
|
[DRM_I915_IRQ_EMIT] = compat_i915_irq_emit,
|
||||||
[DRM_I915_ALLOC] = compat_i915_alloc
|
[DRM_I915_ALLOC] = compat_i915_alloc,
|
||||||
|
#ifdef I915_HAVE_BUFFER
|
||||||
|
[DRM_I915_EXECBUFFER] = compat_i915_execbuffer,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue