| .. | .. |
|---|
| 9 | 9 | #ifndef __ASM_LLSC_H |
|---|
| 10 | 10 | #define __ASM_LLSC_H |
|---|
| 11 | 11 | |
|---|
| 12 | +#include <asm/isa-rev.h> |
|---|
| 13 | + |
|---|
| 12 | 14 | #if _MIPS_SZLONG == 32 |
|---|
| 13 | | -#define SZLONG_LOG 5 |
|---|
| 14 | | -#define SZLONG_MASK 31UL |
|---|
| 15 | 15 | #define __LL "ll " |
|---|
| 16 | 16 | #define __SC "sc " |
|---|
| 17 | 17 | #define __INS "ins " |
|---|
| 18 | 18 | #define __EXT "ext " |
|---|
| 19 | 19 | #elif _MIPS_SZLONG == 64 |
|---|
| 20 | | -#define SZLONG_LOG 6 |
|---|
| 21 | | -#define SZLONG_MASK 63UL |
|---|
| 22 | 20 | #define __LL "lld " |
|---|
| 23 | 21 | #define __SC "scd " |
|---|
| 24 | 22 | #define __INS "dins " |
|---|
| 25 | 23 | #define __EXT "dext " |
|---|
| 26 | 24 | #endif |
|---|
| 27 | 25 | |
|---|
| 26 | +/* |
|---|
| 27 | + * Using a branch-likely instruction to check the result of an sc instruction |
|---|
| 28 | + * works around a bug present in R10000 CPUs prior to revision 3.0 that could |
|---|
| 29 | + * cause ll-sc sequences to execute non-atomically. |
|---|
| 30 | + */ |
|---|
| 31 | +#ifdef CONFIG_WAR_R10000_LLSC |
|---|
| 32 | +# define __SC_BEQZ "beqzl " |
|---|
| 33 | +#elif MIPS_ISA_REV >= 6 |
|---|
| 34 | +# define __SC_BEQZ "beqzc " |
|---|
| 35 | +#else |
|---|
| 36 | +# define __SC_BEQZ "beqz " |
|---|
| 37 | +#endif |
|---|
| 38 | + |
|---|
| 28 | 39 | #endif /* __ASM_LLSC_H */ |
|---|