Commit 704f4300 authored by Christophe Leroy's avatar Christophe Leroy Committed by Madhavan Srinivasan
Browse files

powerpc/uaccess: Refactor user_{read/write/}_access_begin()



user_read_access_begin() and user_write_access_begin() and
user_access_begin() are now very similar. Create a common
__user_access_begin() that takes direction as parameter.

In order to avoid a warning with the conditional call of
barrier_nospec() which is sometimes an empty macro, change it to a
do {} while (0).

Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMadhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/2b4f9d4e521e0b56bf5cb239916b4a178c4d2007.1766574657.git.chleroy@kernel.org
parent 5458989a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -102,7 +102,7 @@ do { \

#else /* !CONFIG_PPC_BARRIER_NOSPEC */
#define barrier_nospec_asm
#define barrier_nospec()
#define barrier_nospec()	do {} while (0)
#endif /* CONFIG_PPC_BARRIER_NOSPEC */

/*
+13 −33
Original line number Diff line number Diff line
@@ -410,50 +410,30 @@ copy_mc_to_user(void __user *to, const void *from, unsigned long n)
extern long __copy_from_user_flushcache(void *dst, const void __user *src,
		unsigned size);

static __must_check __always_inline bool user_access_begin(const void __user *ptr, size_t len)
static __must_check __always_inline bool __user_access_begin(const void __user *ptr, size_t len,
							     unsigned long dir)
{
	if (unlikely(!access_ok(ptr, len)))
		return false;

	might_fault();

	if (dir & KUAP_READ)
		barrier_nospec();
	allow_read_write_user((void __user *)ptr, ptr, len);
	allow_user_access((void __user *)ptr, dir);
	return true;
}
#define user_access_begin	user_access_begin
#define user_access_end		prevent_current_access_user
#define user_access_save	prevent_user_access_return
#define user_access_restore	restore_user_access

static __must_check __always_inline bool
user_read_access_begin(const void __user *ptr, size_t len)
{
	if (unlikely(!access_ok(ptr, len)))
		return false;

	might_fault();

	barrier_nospec();
	allow_read_from_user(ptr, len);
	return true;
}
#define user_read_access_begin	user_read_access_begin
#define user_read_access_end		prevent_current_read_from_user

static __must_check __always_inline bool
user_write_access_begin(const void __user *ptr, size_t len)
{
	if (unlikely(!access_ok(ptr, len)))
		return false;
#define user_access_begin(p, l)		__user_access_begin(p, l, KUAP_READ_WRITE)
#define user_read_access_begin(p, l)	__user_access_begin(p, l, KUAP_READ)
#define user_write_access_begin(p, l)	__user_access_begin(p, l, KUAP_WRITE)

	might_fault();
#define user_access_end()		prevent_user_access(KUAP_READ_WRITE)
#define user_read_access_end()		prevent_user_access(KUAP_READ)
#define user_write_access_end()		prevent_user_access(KUAP_WRITE)

	allow_write_to_user((void __user *)ptr, len);
	return true;
}
#define user_write_access_begin	user_write_access_begin
#define user_write_access_end		prevent_current_write_to_user
#define user_access_save	prevent_user_access_return
#define user_access_restore	restore_user_access

#define arch_unsafe_get_user(x, p, e) do {			\
	__long_type(*(p)) __gu_val;				\