powerpc/uaccess: Split out __get_user_nocheck()
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Wed, 10 Mar 2021 17:46:50 +0000 (17:46 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Sat, 3 Apr 2021 10:22:05 +0000 (21:22 +1100)
One part of __get_user_nocheck() is used for __get_user(),
the other part for unsafe_get_user().

Move the part dedicated to unsafe_get_user() in it.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/618fe2e0626b308a5a063d5baac827b968e85c32.1615398265.git.christophe.leroy@csgroup.eu
arch/powerpc/include/asm/uaccess.h

index 47a454d19351df967a5d7293bb092ad50ad8e404..2395bdc991bdf4d875c0d4d9380a5edf122cc7f4 100644 (file)
@@ -49,7 +49,7 @@ static inline bool __access_ok(unsigned long addr, unsigned long size)
        __put_user_check((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr)))
 
 #define __get_user(x, ptr) \
-       __get_user_nocheck((x), (ptr), sizeof(*(ptr)), true)
+       __get_user_nocheck((x), (ptr), sizeof(*(ptr)))
 #define __put_user(x, ptr) \
        __put_user_nocheck((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr)))
 
@@ -216,19 +216,15 @@ do {                                                              \
 #define __long_type(x) \
        __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL))
 
-#define __get_user_nocheck(x, ptr, size, do_allow)                     \
+#define __get_user_nocheck(x, ptr, size)                       \
 ({                                                             \
        long __gu_err;                                          \
        __long_type(*(ptr)) __gu_val;                           \
        __typeof__(*(ptr)) __user *__gu_addr = (ptr);   \
        __typeof__(size) __gu_size = (size);                    \
                                                                \
-       if (do_allow) {                                                         \
-               might_fault();                                  \
-               __get_user_size(__gu_val, __gu_addr, __gu_size, __gu_err);      \
-       } else {                                                                        \
-               __get_user_size_allowed(__gu_val, __gu_addr, __gu_size, __gu_err); \
-       }                                                                       \
+       might_fault();                                  \
+       __get_user_size(__gu_val, __gu_addr, __gu_size, __gu_err);      \
        (x) = (__typeof__(*(ptr)))__gu_val;                     \
                                                                \
        __gu_err;                                               \
@@ -385,8 +381,14 @@ user_write_access_begin(const void __user *ptr, size_t len)
 #define user_write_access_end          prevent_current_write_to_user
 
 #define unsafe_get_user(x, p, e) do {                                  \
-       if (unlikely(__get_user_nocheck((x), (p), sizeof(*(p)), false)))\
-               goto e;                                                 \
+       long __gu_err;                                          \
+       __long_type(*(p)) __gu_val;                             \
+       __typeof__(*(p)) __user *__gu_addr = (p);               \
+                                                               \
+       __get_user_size_allowed(__gu_val, __gu_addr, sizeof(*(p)), __gu_err); \
+       if (__gu_err)                                           \
+               goto e;                                         \
+       (x) = (__typeof__(*(p)))__gu_val;                       \
 } while (0)
 
 #define unsafe_put_user(x, p, e) \