Commit f904c22f authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman

powerpc/uaccess: Split out __get_user_nocheck()

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: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/618fe2e0626b308a5a063d5baac827b968e85c32.1615398265.git.christophe.leroy@csgroup.eu
parent 9975f852
...@@ -49,7 +49,7 @@ static inline bool __access_ok(unsigned long addr, unsigned long size) ...@@ -49,7 +49,7 @@ static inline bool __access_ok(unsigned long addr, unsigned long size)
__put_user_check((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) __put_user_check((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr)))
#define __get_user(x, 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) \ #define __put_user(x, ptr) \
__put_user_nocheck((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) __put_user_nocheck((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr)))
...@@ -216,19 +216,15 @@ do { \ ...@@ -216,19 +216,15 @@ do { \
#define __long_type(x) \ #define __long_type(x) \
__typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL)) __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 __gu_err; \
__long_type(*(ptr)) __gu_val; \ __long_type(*(ptr)) __gu_val; \
__typeof__(*(ptr)) __user *__gu_addr = (ptr); \ __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
__typeof__(size) __gu_size = (size); \ __typeof__(size) __gu_size = (size); \
\ \
if (do_allow) { \
might_fault(); \ might_fault(); \
__get_user_size(__gu_val, __gu_addr, __gu_size, __gu_err); \ __get_user_size(__gu_val, __gu_addr, __gu_size, __gu_err); \
} else { \
__get_user_size_allowed(__gu_val, __gu_addr, __gu_size, __gu_err); \
} \
(x) = (__typeof__(*(ptr)))__gu_val; \ (x) = (__typeof__(*(ptr)))__gu_val; \
\ \
__gu_err; \ __gu_err; \
...@@ -385,8 +381,14 @@ user_write_access_begin(const void __user *ptr, size_t len) ...@@ -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 user_write_access_end prevent_current_write_to_user
#define unsafe_get_user(x, p, e) do { \ #define unsafe_get_user(x, p, e) do { \
if (unlikely(__get_user_nocheck((x), (p), sizeof(*(p)), false)))\ 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; \ goto e; \
(x) = (__typeof__(*(p)))__gu_val; \
} while (0) } while (0)
#define unsafe_put_user(x, p, e) \ #define unsafe_put_user(x, p, e) \
......
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