mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 02:24:24 +02:00
riscv: uaccess: use input constraints for ptr of __put_user()
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 # 1 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>
This commit is contained in:
parent
19500c6dbc
commit
62135bf660
|
|
@ -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 */
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user