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: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/2b4f9d4e521e0b56bf5cb239916b4a178c4d2007.1766574657.git.chleroy@kernel.org
This commit is contained in:
Christophe Leroy
2025-12-24 12:20:52 +01:00
committed by Madhavan Srinivasan
parent 5458989a0e
commit 704f430031
2 changed files with 15 additions and 35 deletions

View File

@@ -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 */
/*

View File

@@ -410,51 +410,31 @@ 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();
barrier_nospec();
allow_read_write_user((void __user *)ptr, ptr, len);
if (dir & KUAP_READ)
barrier_nospec();
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_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)
#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)
#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;
might_fault();
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 arch_unsafe_get_user(x, p, e) do { \
__long_type(*(p)) __gu_val; \
__typeof__(*(p)) __user *__gu_addr = (p); \