spinlock.h (fb3a6bbc912b12347614e5742c7c61416cdb0ca0) | spinlock.h (e5931943d02bf751b1ec849c0d2ade23d76a8d41) |
---|---|
1/* 2 * include/asm-sh/spinlock.h 3 * 4 * Copyright (C) 2002, 2003 Paul Mundt 5 * Copyright (C) 2006, 2007 Akio Idehara 6 * 7 * This file is subject to the terms and conditions of the GNU General Public 8 * License. See the file "COPYING" in the main directory of this archive --- 86 unchanged lines hidden (view full) --- 95 * needs to get a irq-safe write-lock, but readers can get non-irqsafe 96 * read-locks. 97 */ 98 99/** 100 * read_can_lock - would read_trylock() succeed? 101 * @lock: the rwlock in question. 102 */ | 1/* 2 * include/asm-sh/spinlock.h 3 * 4 * Copyright (C) 2002, 2003 Paul Mundt 5 * Copyright (C) 2006, 2007 Akio Idehara 6 * 7 * This file is subject to the terms and conditions of the GNU General Public 8 * License. See the file "COPYING" in the main directory of this archive --- 86 unchanged lines hidden (view full) --- 95 * needs to get a irq-safe write-lock, but readers can get non-irqsafe 96 * read-locks. 97 */ 98 99/** 100 * read_can_lock - would read_trylock() succeed? 101 * @lock: the rwlock in question. 102 */ |
103#define __raw_read_can_lock(x) ((x)->lock > 0) | 103#define arch_read_can_lock(x) ((x)->lock > 0) |
104 105/** 106 * write_can_lock - would write_trylock() succeed? 107 * @lock: the rwlock in question. 108 */ | 104 105/** 106 * write_can_lock - would write_trylock() succeed? 107 * @lock: the rwlock in question. 108 */ |
109#define __raw_write_can_lock(x) ((x)->lock == RW_LOCK_BIAS) | 109#define arch_write_can_lock(x) ((x)->lock == RW_LOCK_BIAS) |
110 | 110 |
111static inline void __raw_read_lock(arch_rwlock_t *rw) | 111static inline void arch_read_lock(arch_rwlock_t *rw) |
112{ 113 unsigned long tmp; 114 115 __asm__ __volatile__ ( 116 "1: \n\t" | 112{ 113 unsigned long tmp; 114 115 __asm__ __volatile__ ( 116 "1: \n\t" |
117 "movli.l @%1, %0 ! __raw_read_lock \n\t" | 117 "movli.l @%1, %0 ! arch_read_lock \n\t" |
118 "cmp/pl %0 \n\t" 119 "bf 1b \n\t" 120 "add #-1, %0 \n\t" 121 "movco.l %0, @%1 \n\t" 122 "bf 1b \n\t" 123 : "=&z" (tmp) 124 : "r" (&rw->lock) 125 : "t", "memory" 126 ); 127} 128 | 118 "cmp/pl %0 \n\t" 119 "bf 1b \n\t" 120 "add #-1, %0 \n\t" 121 "movco.l %0, @%1 \n\t" 122 "bf 1b \n\t" 123 : "=&z" (tmp) 124 : "r" (&rw->lock) 125 : "t", "memory" 126 ); 127} 128 |
129static inline void __raw_read_unlock(arch_rwlock_t *rw) | 129static inline void arch_read_unlock(arch_rwlock_t *rw) |
130{ 131 unsigned long tmp; 132 133 __asm__ __volatile__ ( 134 "1: \n\t" | 130{ 131 unsigned long tmp; 132 133 __asm__ __volatile__ ( 134 "1: \n\t" |
135 "movli.l @%1, %0 ! __raw_read_unlock \n\t" | 135 "movli.l @%1, %0 ! arch_read_unlock \n\t" |
136 "add #1, %0 \n\t" 137 "movco.l %0, @%1 \n\t" 138 "bf 1b \n\t" 139 : "=&z" (tmp) 140 : "r" (&rw->lock) 141 : "t", "memory" 142 ); 143} 144 | 136 "add #1, %0 \n\t" 137 "movco.l %0, @%1 \n\t" 138 "bf 1b \n\t" 139 : "=&z" (tmp) 140 : "r" (&rw->lock) 141 : "t", "memory" 142 ); 143} 144 |
145static inline void __raw_write_lock(arch_rwlock_t *rw) | 145static inline void arch_write_lock(arch_rwlock_t *rw) |
146{ 147 unsigned long tmp; 148 149 __asm__ __volatile__ ( 150 "1: \n\t" | 146{ 147 unsigned long tmp; 148 149 __asm__ __volatile__ ( 150 "1: \n\t" |
151 "movli.l @%1, %0 ! __raw_write_lock \n\t" | 151 "movli.l @%1, %0 ! arch_write_lock \n\t" |
152 "cmp/hs %2, %0 \n\t" 153 "bf 1b \n\t" 154 "sub %2, %0 \n\t" 155 "movco.l %0, @%1 \n\t" 156 "bf 1b \n\t" 157 : "=&z" (tmp) 158 : "r" (&rw->lock), "r" (RW_LOCK_BIAS) 159 : "t", "memory" 160 ); 161} 162 | 152 "cmp/hs %2, %0 \n\t" 153 "bf 1b \n\t" 154 "sub %2, %0 \n\t" 155 "movco.l %0, @%1 \n\t" 156 "bf 1b \n\t" 157 : "=&z" (tmp) 158 : "r" (&rw->lock), "r" (RW_LOCK_BIAS) 159 : "t", "memory" 160 ); 161} 162 |
163static inline void __raw_write_unlock(arch_rwlock_t *rw) | 163static inline void arch_write_unlock(arch_rwlock_t *rw) |
164{ 165 __asm__ __volatile__ ( | 164{ 165 __asm__ __volatile__ ( |
166 "mov.l %1, @%0 ! __raw_write_unlock \n\t" | 166 "mov.l %1, @%0 ! arch_write_unlock \n\t" |
167 : 168 : "r" (&rw->lock), "r" (RW_LOCK_BIAS) 169 : "t", "memory" 170 ); 171} 172 | 167 : 168 : "r" (&rw->lock), "r" (RW_LOCK_BIAS) 169 : "t", "memory" 170 ); 171} 172 |
173static inline int __raw_read_trylock(arch_rwlock_t *rw) | 173static inline int arch_read_trylock(arch_rwlock_t *rw) |
174{ 175 unsigned long tmp, oldval; 176 177 __asm__ __volatile__ ( 178 "1: \n\t" | 174{ 175 unsigned long tmp, oldval; 176 177 __asm__ __volatile__ ( 178 "1: \n\t" |
179 "movli.l @%2, %0 ! __raw_read_trylock \n\t" | 179 "movli.l @%2, %0 ! arch_read_trylock \n\t" |
180 "mov %0, %1 \n\t" 181 "cmp/pl %0 \n\t" 182 "bf 2f \n\t" 183 "add #-1, %0 \n\t" 184 "movco.l %0, @%2 \n\t" 185 "bf 1b \n\t" 186 "2: \n\t" 187 "synco \n\t" 188 : "=&z" (tmp), "=&r" (oldval) 189 : "r" (&rw->lock) 190 : "t", "memory" 191 ); 192 193 return (oldval > 0); 194} 195 | 180 "mov %0, %1 \n\t" 181 "cmp/pl %0 \n\t" 182 "bf 2f \n\t" 183 "add #-1, %0 \n\t" 184 "movco.l %0, @%2 \n\t" 185 "bf 1b \n\t" 186 "2: \n\t" 187 "synco \n\t" 188 : "=&z" (tmp), "=&r" (oldval) 189 : "r" (&rw->lock) 190 : "t", "memory" 191 ); 192 193 return (oldval > 0); 194} 195 |
196static inline int __raw_write_trylock(arch_rwlock_t *rw) | 196static inline int arch_write_trylock(arch_rwlock_t *rw) |
197{ 198 unsigned long tmp, oldval; 199 200 __asm__ __volatile__ ( 201 "1: \n\t" | 197{ 198 unsigned long tmp, oldval; 199 200 __asm__ __volatile__ ( 201 "1: \n\t" |
202 "movli.l @%2, %0 ! __raw_write_trylock \n\t" | 202 "movli.l @%2, %0 ! arch_write_trylock \n\t" |
203 "mov %0, %1 \n\t" 204 "cmp/hs %3, %0 \n\t" 205 "bf 2f \n\t" 206 "sub %3, %0 \n\t" 207 "2: \n\t" 208 "movco.l %0, @%2 \n\t" 209 "bf 1b \n\t" 210 "synco \n\t" 211 : "=&z" (tmp), "=&r" (oldval) 212 : "r" (&rw->lock), "r" (RW_LOCK_BIAS) 213 : "t", "memory" 214 ); 215 216 return (oldval > (RW_LOCK_BIAS - 1)); 217} 218 | 203 "mov %0, %1 \n\t" 204 "cmp/hs %3, %0 \n\t" 205 "bf 2f \n\t" 206 "sub %3, %0 \n\t" 207 "2: \n\t" 208 "movco.l %0, @%2 \n\t" 209 "bf 1b \n\t" 210 "synco \n\t" 211 : "=&z" (tmp), "=&r" (oldval) 212 : "r" (&rw->lock), "r" (RW_LOCK_BIAS) 213 : "t", "memory" 214 ); 215 216 return (oldval > (RW_LOCK_BIAS - 1)); 217} 218 |
219#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) 220#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) | 219#define arch_read_lock_flags(lock, flags) arch_read_lock(lock) 220#define arch_write_lock_flags(lock, flags) arch_write_lock(lock) |
221 222#define arch_spin_relax(lock) cpu_relax() 223#define arch_read_relax(lock) cpu_relax() 224#define arch_write_relax(lock) cpu_relax() 225 226#endif /* __ASM_SH_SPINLOCK_H */ | 221 222#define arch_spin_relax(lock) cpu_relax() 223#define arch_read_relax(lock) cpu_relax() 224#define arch_write_relax(lock) cpu_relax() 225 226#endif /* __ASM_SH_SPINLOCK_H */ |