diff options
Diffstat (limited to 'arch/mips/include/asm/system.h')
-rw-r--r-- | arch/mips/include/asm/system.h | 52 |
1 files changed, 24 insertions, 28 deletions
diff --git a/arch/mips/include/asm/system.h b/arch/mips/include/asm/system.h index bb937ccfba1e..6018c80ce37a 100644 --- a/arch/mips/include/asm/system.h +++ b/arch/mips/include/asm/system.h | |||
@@ -115,21 +115,19 @@ static inline unsigned long __xchg_u32(volatile int * m, unsigned int val) | |||
115 | } else if (kernel_uses_llsc) { | 115 | } else if (kernel_uses_llsc) { |
116 | unsigned long dummy; | 116 | unsigned long dummy; |
117 | 117 | ||
118 | __asm__ __volatile__( | 118 | do { |
119 | " .set mips3 \n" | 119 | __asm__ __volatile__( |
120 | "1: ll %0, %3 # xchg_u32 \n" | 120 | " .set mips3 \n" |
121 | " .set mips0 \n" | 121 | " ll %0, %3 # xchg_u32 \n" |
122 | " move %2, %z4 \n" | 122 | " .set mips0 \n" |
123 | " .set mips3 \n" | 123 | " move %2, %z4 \n" |
124 | " sc %2, %1 \n" | 124 | " .set mips3 \n" |
125 | " beqz %2, 2f \n" | 125 | " sc %2, %1 \n" |
126 | " .subsection 2 \n" | 126 | " .set mips0 \n" |
127 | "2: b 1b \n" | 127 | : "=&r" (retval), "=m" (*m), "=&r" (dummy) |
128 | " .previous \n" | 128 | : "R" (*m), "Jr" (val) |
129 | " .set mips0 \n" | 129 | : "memory"); |
130 | : "=&r" (retval), "=m" (*m), "=&r" (dummy) | 130 | } while (unlikely(!dummy)); |
131 | : "R" (*m), "Jr" (val) | ||
132 | : "memory"); | ||
133 | } else { | 131 | } else { |
134 | unsigned long flags; | 132 | unsigned long flags; |
135 | 133 | ||
@@ -167,19 +165,17 @@ static inline __u64 __xchg_u64(volatile __u64 * m, __u64 val) | |||
167 | } else if (kernel_uses_llsc) { | 165 | } else if (kernel_uses_llsc) { |
168 | unsigned long dummy; | 166 | unsigned long dummy; |
169 | 167 | ||
170 | __asm__ __volatile__( | 168 | do { |
171 | " .set mips3 \n" | 169 | __asm__ __volatile__( |
172 | "1: lld %0, %3 # xchg_u64 \n" | 170 | " .set mips3 \n" |
173 | " move %2, %z4 \n" | 171 | " lld %0, %3 # xchg_u64 \n" |
174 | " scd %2, %1 \n" | 172 | " move %2, %z4 \n" |
175 | " beqz %2, 2f \n" | 173 | " scd %2, %1 \n" |
176 | " .subsection 2 \n" | 174 | " .set mips0 \n" |
177 | "2: b 1b \n" | 175 | : "=&r" (retval), "=m" (*m), "=&r" (dummy) |
178 | " .previous \n" | 176 | : "R" (*m), "Jr" (val) |
179 | " .set mips0 \n" | 177 | : "memory"); |
180 | : "=&r" (retval), "=m" (*m), "=&r" (dummy) | 178 | } while (unlikely(!dummy)); |
181 | : "R" (*m), "Jr" (val) | ||
182 | : "memory"); | ||
183 | } else { | 179 | } else { |
184 | unsigned long flags; | 180 | unsigned long flags; |
185 | 181 | ||