• Andrew Murray's avatar
    arm64: Use correct ll/sc atomic constraints · 580fa1b8
    Andrew Murray authored
    The A64 ISA accepts distinct (but overlapping) ranges of immediates for:
    
     * add arithmetic instructions ('I' machine constraint)
     * sub arithmetic instructions ('J' machine constraint)
     * 32-bit logical instructions ('K' machine constraint)
     * 64-bit logical instructions ('L' machine constraint)
    
    ... but we currently use the 'I' constraint for many atomic operations
    using sub or logical instructions, which is not always valid.
    
    When CONFIG_ARM64_LSE_ATOMICS is not set, this allows invalid immediates
    to be passed to instructions, potentially resulting in a build failure.
    When CONFIG_ARM64_LSE_ATOMICS is selected the out-of-line ll/sc atomics
    always use a register as they have no visibility of the value passed by
    the caller.
    
    This patch adds a constraint parameter to the ATOMIC_xx and
    __CMPXCHG_CASE macros so that we can pass appropriate constraints for
    each case, with uses updated accordingly.
    
    Unfortunately prior to GCC 8.1.0 the 'K' constraint erroneously accepted
    '4294967295', so we must instead force the use of a register.
    Signed-off-by: default avatarAndrew Murray <andrew.murray@arm.com>
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    580fa1b8
atomic_ll_sc.h 10.4 KB