1/* 2 * arch/alpha/lib/dec_and_lock.c 3 * 4 * ll/sc version of atomic_dec_and_lock() 5 * 6 */ 7 8#include <linux/spinlock.h> 9#include <linux/atomic.h> 10 11 asm (".text \n\ 12 .global _atomic_dec_and_lock \n\ 13 .ent _atomic_dec_and_lock \n\ 14 .align 4 \n\ 15_atomic_dec_and_lock: \n\ 16 .prologue 0 \n\ 171: ldl_l $1, 0($16) \n\ 18 subl $1, 1, $1 \n\ 19 beq $1, 2f \n\ 20 stl_c $1, 0($16) \n\ 21 beq $1, 4f \n\ 22 mb \n\ 23 clr $0 \n\ 24 ret \n\ 252: br $29, 3f \n\ 263: ldgp $29, 0($29) \n\ 27 br $atomic_dec_and_lock_1..ng \n\ 28 .subsection 2 \n\ 294: br 1b \n\ 30 .previous \n\ 31 .end _atomic_dec_and_lock"); 32 33static int __used atomic_dec_and_lock_1(atomic_t *atomic, spinlock_t *lock) 34{ 35 /* Slow path */ 36 spin_lock(lock); 37 if (atomic_dec_and_test(atomic)) 38 return 1; 39 spin_unlock(lock); 40 return 0; 41} 42