diff options
author | Paul Burton <paul.burton@mips.com> | 2018-08-15 15:38:29 -0700 |
---|---|---|
committer | Paul Burton <paul.burton@mips.com> | 2018-08-17 14:37:49 -0700 |
commit | 5cdb5434c6bfcd24d39bfea3a3e3cbe92e2f3ae0 (patch) | |
tree | bc1fefddbee586c14b6d1ba2e81da4dd8dcf3806 | |
parent | f1383aa8d7fcb29ee8222af51ab9ffa6be3847aa (diff) | |
download | linux-wip-mips-lib.tar.gz |
MIPS: uaccess: Implement {get,put}_user() using __{get,put}_user()wip-mips-lib
Signed-off-by: Paul Burton <paul.burton@mips.com>
-rw-r--r-- | arch/mips/include/asm/uaccess.h | 54 |
1 files changed, 16 insertions, 38 deletions
diff --git a/arch/mips/include/asm/uaccess.h b/arch/mips/include/asm/uaccess.h index 05f7d873bffcc..2f65f70361e23 100644 --- a/arch/mips/include/asm/uaccess.h +++ b/arch/mips/include/asm/uaccess.h @@ -150,8 +150,14 @@ static inline int __access_ok(const void __user *p, unsigned long size) * * Returns zero on success, or -EFAULT on error. */ -#define put_user(x,ptr) \ - __put_user_check((x), (ptr), sizeof(*(ptr))) +#define put_user(x, ptr) \ +({ \ + void __user *__p = (ptr); \ + might_fault(); \ + access_ok(VERIFY_WRITE, __p, sizeof(*ptr)) ? \ + __put_user((x), ((__typeof__(*(ptr)) __user *)__p)) : \ + -EFAULT; \ +}) /* * get_user: - Get a simple variable from user space. @@ -171,8 +177,14 @@ static inline int __access_ok(const void __user *p, unsigned long size) * Returns zero on success, or -EFAULT on error. * On error, the variable @x is set to zero. */ -#define get_user(x,ptr) \ - __get_user_check((x), (ptr), sizeof(*(ptr))) +#define get_user(x, ptr) \ +({ \ + const void __user *__p = (ptr); \ + might_fault(); \ + access_ok(VERIFY_READ, __p, sizeof(*ptr)) ? \ + __get_user((x), (__typeof__(*(ptr)) __user *)__p) :\ + ((x) = (__typeof__(*(ptr)))0,-EFAULT); \ +}) /* * __put_user: - Write a simple value into user space, with less checking. @@ -276,23 +288,6 @@ do { \ __gu_err; \ }) -#define __get_user_check(x, ptr, size) \ -({ \ - int __gu_err = -EFAULT; \ - const __typeof__(*(ptr)) __user * __gu_ptr = (ptr); \ - \ - might_fault(); \ - if (likely(access_ok(VERIFY_READ, __gu_ptr, size))) { \ - if (eva_kernel_access()) \ - __get_kernel_common((x), size, __gu_ptr); \ - else \ - __get_user_common((x), size, __gu_ptr); \ - } else \ - (x) = 0; \ - \ - __gu_err; \ -}) - #define __get_data_asm(val, insn, addr) \ { \ long __gu_tmp; \ @@ -398,23 +393,6 @@ do { \ __pu_err; \ }) -#define __put_user_check(x, ptr, size) \ -({ \ - __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ - __typeof__(*(ptr)) __pu_val = (x); \ - int __pu_err = -EFAULT; \ - \ - might_fault(); \ - if (likely(access_ok(VERIFY_WRITE, __pu_addr, size))) { \ - if (eva_kernel_access()) \ - __put_kernel_common(__pu_addr, size); \ - else \ - __put_user_common(__pu_addr, size); \ - } \ - \ - __pu_err; \ -}) - #define __put_data_asm(insn, ptr) \ { \ __asm__ __volatile__( \ |