]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
powerpc/uaccess: Refactor user_{read/write/}_access_begin()
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Wed, 24 Dec 2025 11:20:52 +0000 (12:20 +0100)
committerMadhavan Srinivasan <maddy@linux.ibm.com>
Wed, 7 Jan 2026 04:01:04 +0000 (09:31 +0530)
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
arch/powerpc/include/asm/barrier.h
arch/powerpc/include/asm/uaccess.h

index 9e9833faa4af87f48f430f368bc112eab384d4f7..9d2f612cfb1d777d6176e939bb0f99136f9d24fd 100644 (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 */
 
 /*
index 7846ee59e3747298cef8cf79150a4dbfd149e9ad..721d65dbbb2e560d54bb68b3ae72463419023771 100644 (file)
@@ -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();
 
-       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_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;
+#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();
-
-       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
+#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)
 
-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 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;                             \