lkml.org 
[lkml]   [2020]   [Jun]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 04/24] riscv/atomic: Fix sign extension for RV64I
    Date
    From: Nathan Huckleberry <nhuck@google.com>

    [ Upstream commit 6c58f25e6938c073198af8b1e1832f83f8f0df33 ]

    The argument passed to cmpxchg is not guaranteed to be sign
    extended, but lr.w sign extends on RV64I. This makes cmpxchg
    fail on clang built kernels when __old is negative.

    To fix this, we just cast __old to long which sign extends on
    RV64I. With this fix, clang built RISC-V kernels now boot.

    Link: https://github.com/ClangBuiltLinux/linux/issues/867
    Signed-off-by: Nathan Huckleberry <nhuck@google.com>
    Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/riscv/include/asm/cmpxchg.h | 8 ++++----
    1 file changed, 4 insertions(+), 4 deletions(-)

    diff --git a/arch/riscv/include/asm/cmpxchg.h b/arch/riscv/include/asm/cmpxchg.h
    index d969bab4a26b5..262e5bbb27760 100644
    --- a/arch/riscv/include/asm/cmpxchg.h
    +++ b/arch/riscv/include/asm/cmpxchg.h
    @@ -179,7 +179,7 @@
    " bnez %1, 0b\n" \
    "1:\n" \
    : "=&r" (__ret), "=&r" (__rc), "+A" (*__ptr) \
    - : "rJ" (__old), "rJ" (__new) \
    + : "rJ" ((long)__old), "rJ" (__new) \
    : "memory"); \
    break; \
    case 8: \
    @@ -224,7 +224,7 @@
    RISCV_ACQUIRE_BARRIER \
    "1:\n" \
    : "=&r" (__ret), "=&r" (__rc), "+A" (*__ptr) \
    - : "rJ" (__old), "rJ" (__new) \
    + : "rJ" ((long)__old), "rJ" (__new) \
    : "memory"); \
    break; \
    case 8: \
    @@ -270,7 +270,7 @@
    " bnez %1, 0b\n" \
    "1:\n" \
    : "=&r" (__ret), "=&r" (__rc), "+A" (*__ptr) \
    - : "rJ" (__old), "rJ" (__new) \
    + : "rJ" ((long)__old), "rJ" (__new) \
    : "memory"); \
    break; \
    case 8: \
    @@ -316,7 +316,7 @@
    " fence rw, rw\n" \
    "1:\n" \
    : "=&r" (__ret), "=&r" (__rc), "+A" (*__ptr) \
    - : "rJ" (__old), "rJ" (__new) \
    + : "rJ" ((long)__old), "rJ" (__new) \
    : "memory"); \
    break; \
    case 8: \
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-23 19:41    [W:4.254 / U:0.328 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site