Commit 3ed605bc authored by Gustavo Padovan's avatar Gustavo Padovan Committed by Greg Kroah-Hartman

kernel.h: add u64_to_user_ptr()

This function had copies in 3 different files. Unify them in kernel.h.

Cc: Joe Perches <joe@perches.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel.vetter@intel.com>
Cc: Rob Clark <robdclark@gmail.com>
Signed-off-by: default avatarGustavo Padovan <gustavo.padovan@collabora.co.uk>
Acked-by: Daniel Vetter <daniel.vetter@intel.com>	[drm/i915/]
Acked-by: Rob Clark <robdclark@gmail.com>		[drm/msm/]
Acked-by: Lucas Stach <l.stach@pengutronix.de>		[drm/etinav/]
Acked-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b5b7fe86
...@@ -28,11 +28,6 @@ ...@@ -28,11 +28,6 @@
#define BO_LOCKED 0x4000 #define BO_LOCKED 0x4000
#define BO_PINNED 0x2000 #define BO_PINNED 0x2000
static inline void __user *to_user_ptr(u64 address)
{
return (void __user *)(uintptr_t)address;
}
static struct etnaviv_gem_submit *submit_create(struct drm_device *dev, static struct etnaviv_gem_submit *submit_create(struct drm_device *dev,
struct etnaviv_gpu *gpu, size_t nr) struct etnaviv_gpu *gpu, size_t nr)
{ {
...@@ -347,21 +342,21 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, ...@@ -347,21 +342,21 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
cmdbuf->exec_state = args->exec_state; cmdbuf->exec_state = args->exec_state;
cmdbuf->ctx = file->driver_priv; cmdbuf->ctx = file->driver_priv;
ret = copy_from_user(bos, to_user_ptr(args->bos), ret = copy_from_user(bos, u64_to_user_ptr(args->bos),
args->nr_bos * sizeof(*bos)); args->nr_bos * sizeof(*bos));
if (ret) { if (ret) {
ret = -EFAULT; ret = -EFAULT;
goto err_submit_cmds; goto err_submit_cmds;
} }
ret = copy_from_user(relocs, to_user_ptr(args->relocs), ret = copy_from_user(relocs, u64_to_user_ptr(args->relocs),
args->nr_relocs * sizeof(*relocs)); args->nr_relocs * sizeof(*relocs));
if (ret) { if (ret) {
ret = -EFAULT; ret = -EFAULT;
goto err_submit_cmds; goto err_submit_cmds;
} }
ret = copy_from_user(stream, to_user_ptr(args->stream), ret = copy_from_user(stream, u64_to_user_ptr(args->stream),
args->stream_size); args->stream_size);
if (ret) { if (ret) {
ret = -EFAULT; ret = -EFAULT;
......
...@@ -3576,11 +3576,6 @@ static inline i915_reg_t i915_vgacntrl_reg(struct drm_device *dev) ...@@ -3576,11 +3576,6 @@ static inline i915_reg_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;
}
static inline unsigned long msecs_to_jiffies_timeout(const unsigned int m) static inline unsigned long msecs_to_jiffies_timeout(const unsigned int m)
{ {
unsigned long j = msecs_to_jiffies(m); unsigned long j = msecs_to_jiffies(m);
......
...@@ -324,7 +324,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj, ...@@ -324,7 +324,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
{ {
struct drm_device *dev = obj->base.dev; struct drm_device *dev = obj->base.dev;
void *vaddr = obj->phys_handle->vaddr + args->offset; void *vaddr = obj->phys_handle->vaddr + args->offset;
char __user *user_data = to_user_ptr(args->data_ptr); char __user *user_data = u64_to_user_ptr(args->data_ptr);
int ret = 0; int ret = 0;
/* We manually control the domain here and pretend that it /* We manually control the domain here and pretend that it
...@@ -605,7 +605,7 @@ i915_gem_shmem_pread(struct drm_device *dev, ...@@ -605,7 +605,7 @@ i915_gem_shmem_pread(struct drm_device *dev,
int needs_clflush = 0; int needs_clflush = 0;
struct sg_page_iter sg_iter; struct sg_page_iter sg_iter;
user_data = to_user_ptr(args->data_ptr); user_data = u64_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);
...@@ -692,7 +692,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data, ...@@ -692,7 +692,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,
to_user_ptr(args->data_ptr), u64_to_user_ptr(args->data_ptr),
args->size)) args->size))
return -EFAULT; return -EFAULT;
...@@ -783,7 +783,7 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev, ...@@ -783,7 +783,7 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
if (ret) if (ret)
goto out_unpin; goto out_unpin;
user_data = to_user_ptr(args->data_ptr); user_data = u64_to_user_ptr(args->data_ptr);
remain = args->size; remain = args->size;
offset = i915_gem_obj_ggtt_offset(obj) + args->offset; offset = i915_gem_obj_ggtt_offset(obj) + args->offset;
...@@ -907,7 +907,7 @@ i915_gem_shmem_pwrite(struct drm_device *dev, ...@@ -907,7 +907,7 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
int needs_clflush_before = 0; int needs_clflush_before = 0;
struct sg_page_iter sg_iter; struct sg_page_iter sg_iter;
user_data = to_user_ptr(args->data_ptr); user_data = u64_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);
...@@ -1036,12 +1036,12 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, ...@@ -1036,12 +1036,12 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
return 0; return 0;
if (!access_ok(VERIFY_READ, if (!access_ok(VERIFY_READ,
to_user_ptr(args->data_ptr), u64_to_user_ptr(args->data_ptr),
args->size)) args->size))
return -EFAULT; return -EFAULT;
if (likely(!i915.prefault_disable)) { if (likely(!i915.prefault_disable)) {
ret = fault_in_multipages_readable(to_user_ptr(args->data_ptr), ret = fault_in_multipages_readable(u64_to_user_ptr(args->data_ptr),
args->size); args->size);
if (ret) if (ret)
return -EFAULT; return -EFAULT;
......
...@@ -514,7 +514,7 @@ i915_gem_execbuffer_relocate_vma(struct i915_vma *vma, ...@@ -514,7 +514,7 @@ i915_gem_execbuffer_relocate_vma(struct i915_vma *vma,
struct drm_i915_gem_exec_object2 *entry = vma->exec_entry; struct drm_i915_gem_exec_object2 *entry = vma->exec_entry;
int remain, ret; int remain, ret;
user_relocs = to_user_ptr(entry->relocs_ptr); user_relocs = u64_to_user_ptr(entry->relocs_ptr);
remain = entry->relocation_count; remain = entry->relocation_count;
while (remain) { while (remain) {
...@@ -865,7 +865,7 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev, ...@@ -865,7 +865,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 = to_user_ptr(exec[i].relocs_ptr); user_relocs = u64_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))) {
...@@ -1009,7 +1009,7 @@ validate_exec_list(struct drm_device *dev, ...@@ -1009,7 +1009,7 @@ validate_exec_list(struct drm_device *dev,
invalid_flags |= EXEC_OBJECT_NEEDS_GTT; invalid_flags |= EXEC_OBJECT_NEEDS_GTT;
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
char __user *ptr = to_user_ptr(exec[i].relocs_ptr); char __user *ptr = u64_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 & invalid_flags) if (exec[i].flags & invalid_flags)
...@@ -1696,7 +1696,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, ...@@ -1696,7 +1696,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,
to_user_ptr(args->buffers_ptr), u64_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",
...@@ -1732,7 +1732,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, ...@@ -1732,7 +1732,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
ret = i915_gem_do_execbuffer(dev, data, file, &exec2, exec2_list); ret = i915_gem_do_execbuffer(dev, data, file, &exec2, exec2_list);
if (!ret) { if (!ret) {
struct drm_i915_gem_exec_object __user *user_exec_list = struct drm_i915_gem_exec_object __user *user_exec_list =
to_user_ptr(args->buffers_ptr); u64_to_user_ptr(args->buffers_ptr);
/* Copy the new buffer offsets back to the user's exec list. */ /* Copy the new buffer offsets back to the user's exec list. */
for (i = 0; i < args->buffer_count; i++) { for (i = 0; i < args->buffer_count; i++) {
...@@ -1786,7 +1786,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data, ...@@ -1786,7 +1786,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,
to_user_ptr(args->buffers_ptr), u64_to_user_ptr(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",
...@@ -1799,7 +1799,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data, ...@@ -1799,7 +1799,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,
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. */
struct drm_i915_gem_exec_object2 __user *user_exec_list = struct drm_i915_gem_exec_object2 __user *user_exec_list =
to_user_ptr(args->buffers_ptr); u64_to_user_ptr(args->buffers_ptr);
int i; int i;
for (i = 0; i < args->buffer_count; i++) { for (i = 0; i < args->buffer_count; i++) {
......
...@@ -28,11 +28,6 @@ ...@@ -28,11 +28,6 @@
#define BO_LOCKED 0x4000 #define BO_LOCKED 0x4000
#define BO_PINNED 0x2000 #define BO_PINNED 0x2000
static inline void __user *to_user_ptr(u64 address)
{
return (void __user *)(uintptr_t)address;
}
static struct msm_gem_submit *submit_create(struct drm_device *dev, static struct msm_gem_submit *submit_create(struct drm_device *dev,
struct msm_gpu *gpu, int nr) struct msm_gpu *gpu, int nr)
{ {
...@@ -68,7 +63,7 @@ static int submit_lookup_objects(struct msm_gem_submit *submit, ...@@ -68,7 +63,7 @@ static int submit_lookup_objects(struct msm_gem_submit *submit,
struct drm_gem_object *obj; struct drm_gem_object *obj;
struct msm_gem_object *msm_obj; struct msm_gem_object *msm_obj;
void __user *userptr = void __user *userptr =
to_user_ptr(args->bos + (i * sizeof(submit_bo))); u64_to_user_ptr(args->bos + (i * sizeof(submit_bo)));
ret = copy_from_user(&submit_bo, userptr, sizeof(submit_bo)); ret = copy_from_user(&submit_bo, userptr, sizeof(submit_bo));
if (ret) { if (ret) {
...@@ -257,7 +252,7 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob ...@@ -257,7 +252,7 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
for (i = 0; i < nr_relocs; i++) { for (i = 0; i < nr_relocs; i++) {
struct drm_msm_gem_submit_reloc submit_reloc; struct drm_msm_gem_submit_reloc submit_reloc;
void __user *userptr = void __user *userptr =
to_user_ptr(relocs + (i * sizeof(submit_reloc))); u64_to_user_ptr(relocs + (i * sizeof(submit_reloc)));
uint32_t iova, off; uint32_t iova, off;
bool valid; bool valid;
...@@ -356,7 +351,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, ...@@ -356,7 +351,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
for (i = 0; i < args->nr_cmds; i++) { for (i = 0; i < args->nr_cmds; i++) {
struct drm_msm_gem_submit_cmd submit_cmd; struct drm_msm_gem_submit_cmd submit_cmd;
void __user *userptr = void __user *userptr =
to_user_ptr(args->cmds + (i * sizeof(submit_cmd))); u64_to_user_ptr(args->cmds + (i * sizeof(submit_cmd)));
struct msm_gem_object *msm_obj; struct msm_gem_object *msm_obj;
uint32_t iova; uint32_t iova;
......
...@@ -53,6 +53,13 @@ ...@@ -53,6 +53,13 @@
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
#define u64_to_user_ptr(x) ( \
{ \
typecheck(u64, x); \
(void __user *)(uintptr_t)x; \
} \
)
/* /*
* This looks more complex than it should be. But we need to * This looks more complex than it should be. But we need to
* get the type for the ~ right in round_down (it needs to be * get the type for the ~ right in round_down (it needs to be
......
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