mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-20 02:34:23 +08:00
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: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
83f377abed
commit
2bb4629add
@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user