Commit 2bb4629a authored by Ville Syrjälä's avatar Ville Syrjälä Committed by Daniel Vetter

drm/i915: Add to_user_ptr()

to_user_ptr() simply casts a pointer passed as u64 from user space
to void __user * correctly. Using this lets us get rid of all the
tiresome casts.

The idea came from Chris Wilson <chris@chris-wilson.co.uk>.
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 83f377ab
...@@ -1899,4 +1899,9 @@ static inline uint32_t i915_vgacntrl_reg(struct drm_device *dev) ...@@ -1899,4 +1899,9 @@ static inline uint32_t i915_vgacntrl_reg(struct drm_device *dev)
return VGACNTRL; return VGACNTRL;
} }
static inline void __user *to_user_ptr(u64 address)
{
return (void __user *)(uintptr_t)address;
}
#endif #endif
...@@ -414,7 +414,7 @@ i915_gem_shmem_pread(struct drm_device *dev, ...@@ -414,7 +414,7 @@ i915_gem_shmem_pread(struct drm_device *dev,
struct scatterlist *sg; struct scatterlist *sg;
int i; int i;
user_data = (char __user *) (uintptr_t) args->data_ptr; user_data = to_user_ptr(args->data_ptr);
remain = args->size; remain = args->size;
obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj); obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
...@@ -522,7 +522,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data, ...@@ -522,7 +522,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
return 0; return 0;
if (!access_ok(VERIFY_WRITE, if (!access_ok(VERIFY_WRITE,
(char __user *)(uintptr_t)args->data_ptr, to_user_ptr(args->data_ptr),
args->size)) args->size))
return -EFAULT; return -EFAULT;
...@@ -613,7 +613,7 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev, ...@@ -613,7 +613,7 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
if (ret) if (ret)
goto out_unpin; goto out_unpin;
user_data = (char __user *) (uintptr_t) args->data_ptr; user_data = to_user_ptr(args->data_ptr);
remain = args->size; remain = args->size;
offset = obj->gtt_offset + args->offset; offset = obj->gtt_offset + args->offset;
...@@ -735,7 +735,7 @@ i915_gem_shmem_pwrite(struct drm_device *dev, ...@@ -735,7 +735,7 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
int i; int i;
struct scatterlist *sg; struct scatterlist *sg;
user_data = (char __user *) (uintptr_t) args->data_ptr; user_data = to_user_ptr(args->data_ptr);
remain = args->size; remain = args->size;
obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj); obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
...@@ -867,11 +867,11 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, ...@@ -867,11 +867,11 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
return 0; return 0;
if (!access_ok(VERIFY_READ, if (!access_ok(VERIFY_READ,
(char __user *)(uintptr_t)args->data_ptr, to_user_ptr(args->data_ptr),
args->size)) args->size))
return -EFAULT; return -EFAULT;
ret = fault_in_multipages_readable((char __user *)(uintptr_t)args->data_ptr, ret = fault_in_multipages_readable(to_user_ptr(args->data_ptr),
args->size); args->size);
if (ret) if (ret)
return -EFAULT; return -EFAULT;
...@@ -4327,7 +4327,7 @@ i915_gem_phys_pwrite(struct drm_device *dev, ...@@ -4327,7 +4327,7 @@ i915_gem_phys_pwrite(struct drm_device *dev,
struct drm_file *file_priv) struct drm_file *file_priv)
{ {
void *vaddr = obj->phys_obj->handle->vaddr + args->offset; void *vaddr = obj->phys_obj->handle->vaddr + args->offset;
char __user *user_data = (char __user *) (uintptr_t) args->data_ptr; char __user *user_data = to_user_ptr(args->data_ptr);
if (__copy_from_user_inatomic_nocache(vaddr, user_data, args->size)) { if (__copy_from_user_inatomic_nocache(vaddr, user_data, args->size)) {
unsigned long unwritten; unsigned long unwritten;
......
...@@ -305,7 +305,7 @@ i915_gem_execbuffer_relocate_object(struct drm_i915_gem_object *obj, ...@@ -305,7 +305,7 @@ i915_gem_execbuffer_relocate_object(struct drm_i915_gem_object *obj,
struct drm_i915_gem_exec_object2 *entry = obj->exec_entry; struct drm_i915_gem_exec_object2 *entry = obj->exec_entry;
int remain, ret; int remain, ret;
user_relocs = (void __user *)(uintptr_t)entry->relocs_ptr; user_relocs = to_user_ptr(entry->relocs_ptr);
remain = entry->relocation_count; remain = entry->relocation_count;
while (remain) { while (remain) {
...@@ -618,7 +618,7 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev, ...@@ -618,7 +618,7 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,
u64 invalid_offset = (u64)-1; u64 invalid_offset = (u64)-1;
int j; int j;
user_relocs = (void __user *)(uintptr_t)exec[i].relocs_ptr; user_relocs = to_user_ptr(exec[i].relocs_ptr);
if (copy_from_user(reloc+total, user_relocs, if (copy_from_user(reloc+total, user_relocs,
exec[i].relocation_count * sizeof(*reloc))) { exec[i].relocation_count * sizeof(*reloc))) {
...@@ -734,7 +734,7 @@ validate_exec_list(struct drm_i915_gem_exec_object2 *exec, ...@@ -734,7 +734,7 @@ validate_exec_list(struct drm_i915_gem_exec_object2 *exec,
int i; int i;
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
char __user *ptr = (char __user *)(uintptr_t)exec[i].relocs_ptr; char __user *ptr = to_user_ptr(exec[i].relocs_ptr);
int length; /* limited by fault_in_pages_readable() */ int length; /* limited by fault_in_pages_readable() */
if (exec[i].flags & __EXEC_OBJECT_UNKNOWN_FLAGS) if (exec[i].flags & __EXEC_OBJECT_UNKNOWN_FLAGS)
...@@ -944,9 +944,8 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, ...@@ -944,9 +944,8 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
} }
if (copy_from_user(cliprects, if (copy_from_user(cliprects,
(struct drm_clip_rect __user *)(uintptr_t) to_user_ptr(args->cliprects_ptr),
args->cliprects_ptr, sizeof(*cliprects)*args->num_cliprects)) {
sizeof(*cliprects)*args->num_cliprects)) {
ret = -EFAULT; ret = -EFAULT;
goto pre_mutex_err; goto pre_mutex_err;
} }
...@@ -1110,7 +1109,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, ...@@ -1110,7 +1109,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
return -ENOMEM; return -ENOMEM;
} }
ret = copy_from_user(exec_list, ret = copy_from_user(exec_list,
(void __user *)(uintptr_t)args->buffers_ptr, to_user_ptr(args->buffers_ptr),
sizeof(*exec_list) * args->buffer_count); sizeof(*exec_list) * args->buffer_count);
if (ret != 0) { if (ret != 0) {
DRM_DEBUG("copy %d exec entries failed %d\n", DRM_DEBUG("copy %d exec entries failed %d\n",
...@@ -1149,7 +1148,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, ...@@ -1149,7 +1148,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
for (i = 0; i < args->buffer_count; i++) for (i = 0; i < args->buffer_count; i++)
exec_list[i].offset = exec2_list[i].offset; exec_list[i].offset = exec2_list[i].offset;
/* ... and back out to userspace */ /* ... and back out to userspace */
ret = copy_to_user((void __user *)(uintptr_t)args->buffers_ptr, ret = copy_to_user(to_user_ptr(args->buffers_ptr),
exec_list, exec_list,
sizeof(*exec_list) * args->buffer_count); sizeof(*exec_list) * args->buffer_count);
if (ret) { if (ret) {
...@@ -1190,8 +1189,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data, ...@@ -1190,8 +1189,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,
return -ENOMEM; return -ENOMEM;
} }
ret = copy_from_user(exec2_list, ret = copy_from_user(exec2_list,
(struct drm_i915_relocation_entry __user *) to_user_ptr(args->buffers_ptr),
(uintptr_t) args->buffers_ptr,
sizeof(*exec2_list) * args->buffer_count); sizeof(*exec2_list) * args->buffer_count);
if (ret != 0) { if (ret != 0) {
DRM_DEBUG("copy %d exec entries failed %d\n", DRM_DEBUG("copy %d exec entries failed %d\n",
...@@ -1203,7 +1201,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data, ...@@ -1203,7 +1201,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,
ret = i915_gem_do_execbuffer(dev, data, file, args, exec2_list); ret = i915_gem_do_execbuffer(dev, data, file, args, exec2_list);
if (!ret) { if (!ret) {
/* Copy the new buffer offsets back to the user's exec list. */ /* Copy the new buffer offsets back to the user's exec list. */
ret = copy_to_user((void __user *)(uintptr_t)args->buffers_ptr, ret = copy_to_user(to_user_ptr(args->buffers_ptr),
exec2_list, exec2_list,
sizeof(*exec2_list) * args->buffer_count); sizeof(*exec2_list) * args->buffer_count);
if (ret) { if (ret) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment