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

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
Loading
Loading
Loading
Loading
+12 −10
Original line number Diff line number Diff line
@@ -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); \
	}									\
	(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)))\
	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) \