riscv: uaccess: use input constraints for ptr of __put_user()
authorJisheng Zhang <jszhang@kernel.org>
Thu, 10 Apr 2025 07:05:24 +0000 (07:05 +0000)
committerPalmer Dabbelt <palmer@rivosinc.com>
Thu, 8 May 2025 17:01:00 +0000 (10:01 -0700)
Putting ptr in the inputs as opposed to output may seem incorrect but
this is done for a few reasons:
- Not having it in the output permits the use of asm goto in a
  subsequent patch. There are bugs in gcc [1] which would otherwise
  prevent it.
- Since the output memory is userspace there isn't any real benefit from
  telling the compiler about the memory clobber.
- x86, arm and powerpc all use this technique.

Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113921
Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
[Cyril Bur: Rewritten commit message]
Signed-off-by: Cyril Bur <cyrilbur@tenstorrent.com>
Reviewed-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Link: https://lore.kernel.org/r/20250410070526.3160847-4-cyrilbur@tenstorrent.com
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/include/asm/uaccess.h

index c9a461467bf47aa9913cb64fb99e8475adc65b40..da36057847f08bce10470dbd785eaf13858c1bbf 100644 (file)
@@ -219,11 +219,11 @@ do {                                                              \
        __typeof__(*(ptr)) __x = x;                             \
        __asm__ __volatile__ (                                  \
                "1:\n"                                          \
-               "       " insn " %z2, %1\n"                     \
+               "       " insn " %z1, %2\n"                     \
                "2:\n"                                          \
                _ASM_EXTABLE_UACCESS_ERR(1b, 2b, %0)            \
-               : "+r" (err), "=m" (*(ptr))                     \
-               : "rJ" (__x));                                  \
+               : "+r" (err)                                    \
+               : "rJ" (__x), "m"(*(ptr)));                     \
 } while (0)
 
 #ifdef CONFIG_64BIT
@@ -236,16 +236,16 @@ do {                                                              \
        u64 __x = (__typeof__((x)-(x)))(x);                     \
        __asm__ __volatile__ (                                  \
                "1:\n"                                          \
-               "       sw %z3, %1\n"                           \
+               "       sw %z1, %3\n"                           \
                "2:\n"                                          \
-               "       sw %z4, %2\n"                           \
+               "       sw %z2, %4\n"                           \
                "3:\n"                                          \
                _ASM_EXTABLE_UACCESS_ERR(1b, 3b, %0)            \
                _ASM_EXTABLE_UACCESS_ERR(2b, 3b, %0)            \
-               : "+r" (err),                                   \
-                       "=m" (__ptr[__LSW]),                    \
-                       "=m" (__ptr[__MSW])                     \
-               : "rJ" (__x), "rJ" (__x >> 32));                \
+               : "+r" (err)                                    \
+               : "rJ" (__x), "rJ" (__x >> 32),                 \
+                       "m" (__ptr[__LSW]),                     \
+                       "m" (__ptr[__MSW]));                    \
 } while (0)
 #endif /* CONFIG_64BIT */