• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <asm/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\
17 1:	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\
25 2:	br	$29, 3f				\n\
26 3:	ldgp	$29, 0($29)			\n\
27 	br	$atomic_dec_and_lock_1..ng	\n\
28 	.subsection 2				\n\
29 4:	br	1b				\n\
30 	.previous				\n\
31 	.end _atomic_dec_and_lock");
32 
atomic_dec_and_lock_1(atomic_t * atomic,spinlock_t * lock)33 static 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