• Paul Burton's avatar
    MIPS: Avoid move psuedo-instruction whilst using MIPS_ISA_LEVEL · cfd54de3
    Paul Burton authored
    MIPS_ISA_LEVEL is always defined as the 64 bit ISA that is a compatible
    superset of the ISA that the kernel build is targeting, and is used to
    allow us to emit instructions that we may detect support for at runtime.
    
    When we use a .set MIPS_ISA_LEVEL directive & are building a 32-bit
    kernel, we therefore are temporarily allowing the assembler to generate
    MIPS64 instructions. Using the move pseudo-instruction whilst this is
    the case is problematic because the assembler is likely to emit a daddu
    instruction which will generate a reserved instruction exception when
    executed on a MIPS32 machine.
    
    Unfortunately the combination of commit a0a5ac3c ("MIPS: Fix delay
    slot bug in `atomic*_sub_if_positive' for R10000_LLSC_WAR") and commit
    4936084c ("MIPS: Cleanup R10000_LLSC_WAR logic in atomic.h") causes
    us to do exactly this in atomic_sub_if_positive(), and the result is
    MIPS64 daddu instructions in 32-bit kernels.
    
    Fix this by using .set mips0 to restore the default ISA after the ll
    instruction, and use .set MIPS_ISA_LEVEL again prior to the sc. This
    ensures everything but the ll & sc are assembled using the default ISA
    for the kernel build & the move pseudo-instruction is emitted as a
    MIPS32 addu instruction.
    
    We appear to have another pre-existing instance of the same issue in our
    atomic_fetch_*_relaxed() functions, and fix that up too by moving our
    .set move0 such that it occurs prior to use of the move
    pseudo-instruction.
    Signed-off-by: default avatarPaul Burton <paul.burton@mips.com>
    Fixes: a0a5ac3c ("MIPS: Fix delay slot bug in `atomic*_sub_if_positive' for R10000_LLSC_WAR")
    Fixes: 4936084c ("MIPS: Cleanup R10000_LLSC_WAR logic in atomic.h")
    Patchwork: https://patchwork.linux-mips.org/patch/20253/
    Cc: James Hogan <jhogan@kernel.org>
    Cc: Joshua Kinard <kumba@gentoo.org>
    Cc: Ralf Baechle <ralf@linux-mips.org>
    Cc: linux-mips@linux-mips.org
    cfd54de3
atomic.h 15.9 KB