mirror of
https://github.com/torvalds/linux.git
synced 2024-11-30 16:11:38 +00:00
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: Gustavo 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: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
b5b7fe8666
commit
3ed605bc8a
@ -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,
|
|||||||
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)
|
|||||||
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,
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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 @@
|
|||||||
#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,
|
|||||||
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
|
|||||||
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,
|
|||||||
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 @@
|
|||||||
|
|
||||||
#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
|
||||||
|
Loading…
Reference in New Issue
Block a user