spinlock_64.h revision 64f2dde3f743c8a1ad8c0a1aa74166c1034afd92
1f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg/* spinlock.h: 64-bit Sparc spinlock support.
2f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg *
3f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
4f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg */
5f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
6f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#ifndef __SPARC64_SPINLOCK_H
7f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __SPARC64_SPINLOCK_H
8f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
9f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#ifndef __ASSEMBLY__
10f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
11f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg/* To get debugging spinlocks which detect and catch
12f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg * deadlock situations, set CONFIG_DEBUG_SPINLOCK
13f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg * and rebuild your kernel.
14f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg */
15f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
1664f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller/* Because we play games to save cycles in the non-contention case, we
1764f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller * need to be extra careful about branch targets into the "spinning"
1864f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller * code.  They live in their own section, but the newer V9 branches
1964f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller * have a shorter range than the traditional 32-bit sparc branch
2064f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller * variants.  The rule is that the branches that go into and out of
2164f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller * the spinner sections must be pre-V9 branches.
22f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg */
23f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
24f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_spin_is_locked(lp)	((lp)->lock != 0)
25f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
26f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_spin_unlock_wait(lp)	\
27f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	do {	rmb();			\
28f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	} while((lp)->lock)
29f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
30f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic inline void __raw_spin_lock(raw_spinlock_t *lock)
31f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
32f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	unsigned long tmp;
33f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
34f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__(
35f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1:	ldstub		[%1], %0\n"
36f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	membar		#StoreLoad | #StoreStore\n"
37f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brnz,pn		%0, 2f\n"
38f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
39f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	.subsection	2\n"
40f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2:	ldub		[%1], %0\n"
41f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	membar		#LoadLoad\n"
42f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brnz,pt		%0, 2b\n"
43f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
44f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	ba,a,pt		%%xcc, 1b\n"
45f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	.previous"
46f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "=&r" (tmp)
47f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock)
48f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
49f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
50f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
51f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic inline int __raw_spin_trylock(raw_spinlock_t *lock)
52f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
53f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	unsigned long result;
54f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
55f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__(
56f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	ldstub		[%1], %0\n"
57f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	membar		#StoreLoad | #StoreStore"
58f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "=r" (result)
59f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock)
60f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
61f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
62f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	return (result == 0UL);
63f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
64f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
65f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic inline void __raw_spin_unlock(raw_spinlock_t *lock)
66f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
67f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__(
68f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	membar		#StoreStore | #LoadStore\n"
69f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	stb		%%g0, [%0]"
70f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: /* No outputs */
71f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock)
72f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
73f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
74f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
75f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic inline void __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags)
76f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
77f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	unsigned long tmp1, tmp2;
78f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
79f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__(
80f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1:	ldstub		[%2], %0\n"
81f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	membar		#StoreLoad | #StoreStore\n"
82f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brnz,pn		%0, 2f\n"
83f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
84f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	.subsection	2\n"
85f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2:	rdpr		%%pil, %1\n"
86f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	wrpr		%3, %%pil\n"
87f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"3:	ldub		[%2], %0\n"
88f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	membar		#LoadLoad\n"
89f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brnz,pt		%0, 3b\n"
90f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
91f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	ba,pt		%%xcc, 1b\n"
92f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 wrpr		%1, %%pil\n"
93f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	.previous"
94f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "=&r" (tmp1), "=&r" (tmp2)
95f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r"(lock), "r"(flags)
96f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
97f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
98f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
99f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg/* Multi-reader locks, these are much saner than the 32-bit Sparc ones... */
100f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
101f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic void inline __read_lock(raw_rwlock_t *lock)
102f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
103f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	unsigned long tmp1, tmp2;
104f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
105f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__ (
106f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1:	ldsw		[%2], %0\n"
107f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brlz,pn		%0, 2f\n"
108f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"4:	 add		%0, 1, %1\n"
109f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cas		[%2], %0, %1\n"
110f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cmp		%0, %1\n"
111f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	membar		#StoreLoad | #StoreStore\n"
112f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	bne,pn		%%icc, 1b\n"
113f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
114f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	.subsection	2\n"
115f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2:	ldsw		[%2], %0\n"
116f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	membar		#LoadLoad\n"
117f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brlz,pt		%0, 2b\n"
118f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
119f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	ba,a,pt		%%xcc, 4b\n"
120f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	.previous"
121f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "=&r" (tmp1), "=&r" (tmp2)
122f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock)
123f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
124f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
125f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
126f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic int inline __read_trylock(raw_rwlock_t *lock)
127f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
128f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	int tmp1, tmp2;
129f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
130f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__ (
131f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1:	ldsw		[%2], %0\n"
132f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brlz,a,pn	%0, 2f\n"
133f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 mov		0, %0\n"
134f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	add		%0, 1, %1\n"
135f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cas		[%2], %0, %1\n"
136f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cmp		%0, %1\n"
137f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	membar		#StoreLoad | #StoreStore\n"
138f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	bne,pn		%%icc, 1b\n"
139f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 mov		1, %0\n"
140f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2:"
141f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "=&r" (tmp1), "=&r" (tmp2)
142f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock)
143f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
144f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
145f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	return tmp1;
146f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
147f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
148f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic void inline __read_unlock(raw_rwlock_t *lock)
149f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
150f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	unsigned long tmp1, tmp2;
151f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
152f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__(
153f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	membar	#StoreLoad | #LoadLoad\n"
154f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1:	lduw	[%2], %0\n"
155f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	sub	%0, 1, %1\n"
156f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cas	[%2], %0, %1\n"
157f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cmp	%0, %1\n"
158f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	bne,pn	%%xcc, 1b\n"
159f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop"
160f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "=&r" (tmp1), "=&r" (tmp2)
161f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock)
162f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
163f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
164f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
165f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic void inline __write_lock(raw_rwlock_t *lock)
166f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
167f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	unsigned long mask, tmp1, tmp2;
168f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
169f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	mask = 0x80000000UL;
170f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
171f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__(
172f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1:	lduw		[%2], %0\n"
173f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brnz,pn		%0, 2f\n"
174f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"4:	 or		%0, %3, %1\n"
175f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cas		[%2], %0, %1\n"
176f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cmp		%0, %1\n"
177f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	membar		#StoreLoad | #StoreStore\n"
178f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	bne,pn		%%icc, 1b\n"
179f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
180f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	.subsection	2\n"
181f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2:	lduw		[%2], %0\n"
182f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	membar		#LoadLoad\n"
183f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brnz,pt		%0, 2b\n"
184f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
185f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	ba,a,pt		%%xcc, 4b\n"
186f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	.previous"
187f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "=&r" (tmp1), "=&r" (tmp2)
188f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock), "r" (mask)
189f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
190f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
191f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
192f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic void inline __write_unlock(raw_rwlock_t *lock)
193f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
194f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__(
195f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	membar		#LoadStore | #StoreStore\n"
196f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	stw		%%g0, [%0]"
197f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: /* no outputs */
198f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock)
199f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
200f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
201f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
202f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborgstatic int inline __write_trylock(raw_rwlock_t *lock)
203f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
204f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	unsigned long mask, tmp1, tmp2, result;
205f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
206f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	mask = 0x80000000UL;
207f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
208f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__(
209f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	mov		0, %2\n"
210f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1:	lduw		[%3], %0\n"
211f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brnz,pn		%0, 2f\n"
212f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 or		%0, %4, %1\n"
213f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cas		[%3], %0, %1\n"
214f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cmp		%0, %1\n"
215f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	membar		#StoreLoad | #StoreStore\n"
216f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	bne,pn		%%icc, 1b\n"
217f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
218f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	mov		1, %2\n"
219f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2:"
220f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "=&r" (tmp1), "=&r" (tmp2), "=&r" (result)
221f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock), "r" (mask)
222f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
223f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
224f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	return result;
225f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
226f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
227f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_read_lock(p)	__read_lock(p)
228f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_read_trylock(p)	__read_trylock(p)
229f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_read_unlock(p)	__read_unlock(p)
230f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_write_lock(p)	__write_lock(p)
231f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_write_unlock(p)	__write_unlock(p)
232f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_write_trylock(p)	__write_trylock(p)
233f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
234f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_read_can_lock(rw)		(!((rw)->lock & 0x80000000UL))
235f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __raw_write_can_lock(rw)	(!(rw)->lock)
236f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
237f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define _raw_spin_relax(lock)	cpu_relax()
238f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define _raw_read_relax(lock)	cpu_relax()
239f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define _raw_write_relax(lock)	cpu_relax()
240f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
241f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#endif /* !(__ASSEMBLY__) */
242f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
243f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#endif /* !(__SPARC64_SPINLOCK_H) */
244