@@ -, +, @@ MIPS: Use `.set mips2' to emulate LL/SC for the R5900 too GAS treats the R5900 as MIPS III, with some modifications. The MIPS III designation means that the GNU C Library will try to assemble the LL and SC instructions, even though they are not implemented in the R5900. GAS will therefore produce the following errors: Error: opcode not supported on this processor: r5900 (mips3) `ll $3,0($5)' Error: opcode not supported on this processor: r5900 (mips3) `sc $3,0($5)' The MIPS II ISA override as used here enables the kernel to trap and emulate the LL and SC instructions, as required. --- a/arch/mips/atomic_arch.h +++ a/arch/mips/atomic_arch.h @@ -8,7 +8,8 @@ static inline int a_ll(volatile int *p) { int v; -#if __mips < 2 + /* The R5900 reports itself as MIPS III but it does not have LL/SC. */ +#if __mips < 2 || defined(_MIPS_ARCH_R5900) __asm__ __volatile__ ( ".set push ; .set mips2\n\t" "ll %0, %1" @@ -26,7 +27,8 @@ static inline int a_ll(volatile int *p) static inline int a_sc(volatile int *p, int v) { int r; -#if __mips < 2 + /* The R5900 reports itself as MIPS III but it does not have LL/SC. */ +#if __mips < 2 || defined(_MIPS_ARCH_R5900) __asm__ __volatile__ ( ".set push ; .set mips2\n\t" "sc %0, %1"