1/* rwsem.S: RW semaphore assembler.
2 *
3 * Written by David S. Miller (davem@redhat.com), 2001.
4 * Derived from asm-i386/rwsem.h
5 */
6
7#include <asm/rwsem-const.h>
8
9	.section	.sched.text
10
11	.globl		__down_read
12__down_read:
131:	lduw		[%o0], %g1
14	add		%g1, 1, %g7
15	cas		[%o0], %g1, %g7
16	cmp		%g1, %g7
17	bne,pn		%icc, 1b
18	 add		%g7, 1, %g7
19	cmp		%g7, 0
20	membar		#StoreLoad | #StoreStore
21	bl,pn		%icc, 3f
22	 nop
232:
24	retl
25	 nop
263:
27	save		%sp, -192, %sp
28	call		rwsem_down_read_failed
29	 mov		%i0, %o0
30	ret
31	 restore
32	.size		__down_read, .-__down_read
33
34	.globl		__down_read_trylock
35__down_read_trylock:
361:	lduw		[%o0], %g1
37	add		%g1, 1, %g7
38	cmp		%g7, 0
39	bl,pn		%icc, 2f
40	 mov		0, %o1
41	cas		[%o0], %g1, %g7
42	cmp		%g1, %g7
43	bne,pn		%icc, 1b
44	 mov		1, %o1
45	membar		#StoreLoad | #StoreStore
462:	retl
47	 mov		%o1, %o0
48	.size		__down_read_trylock, .-__down_read_trylock
49
50	.globl		__down_write
51__down_write:
52	sethi		%hi(RWSEM_ACTIVE_WRITE_BIAS), %g1
53	or		%g1, %lo(RWSEM_ACTIVE_WRITE_BIAS), %g1
541:
55	lduw		[%o0], %g3
56	add		%g3, %g1, %g7
57	cas		[%o0], %g3, %g7
58	cmp		%g3, %g7
59	bne,pn		%icc, 1b
60	 cmp		%g7, 0
61	membar		#StoreLoad | #StoreStore
62	bne,pn		%icc, 3f
63	 nop
642:	retl
65	 nop
663:
67	save		%sp, -192, %sp
68	call		rwsem_down_write_failed
69	 mov		%i0, %o0
70	ret
71	 restore
72	.size		__down_write, .-__down_write
73
74	.globl		__down_write_trylock
75__down_write_trylock:
76	sethi		%hi(RWSEM_ACTIVE_WRITE_BIAS), %g1
77	or		%g1, %lo(RWSEM_ACTIVE_WRITE_BIAS), %g1
781:
79	lduw		[%o0], %g3
80	cmp		%g3, 0
81	bne,pn		%icc, 2f
82	 mov		0, %o1
83	add		%g3, %g1, %g7
84	cas		[%o0], %g3, %g7
85	cmp		%g3, %g7
86	bne,pn		%icc, 1b
87	 mov		1, %o1
88	membar		#StoreLoad | #StoreStore
892:	retl
90	 mov		%o1, %o0
91	.size		__down_write_trylock, .-__down_write_trylock
92
93	.globl		__up_read
94__up_read:
951:
96	lduw		[%o0], %g1
97	sub		%g1, 1, %g7
98	cas		[%o0], %g1, %g7
99	cmp		%g1, %g7
100	bne,pn		%icc, 1b
101	 cmp		%g7, 0
102	membar		#StoreLoad | #StoreStore
103	bl,pn		%icc, 3f
104	 nop
1052:	retl
106	 nop
1073:	sethi		%hi(RWSEM_ACTIVE_MASK), %g1
108	sub		%g7, 1, %g7
109	or		%g1, %lo(RWSEM_ACTIVE_MASK), %g1
110	andcc		%g7, %g1, %g0
111	bne,pn		%icc, 2b
112	 nop
113	save		%sp, -192, %sp
114	call		rwsem_wake
115	 mov		%i0, %o0
116	ret
117	 restore
118	.size		__up_read, .-__up_read
119
120	.globl		__up_write
121__up_write:
122	sethi		%hi(RWSEM_ACTIVE_WRITE_BIAS), %g1
123	or		%g1, %lo(RWSEM_ACTIVE_WRITE_BIAS), %g1
1241:
125	lduw		[%o0], %g3
126	sub		%g3, %g1, %g7
127	cas		[%o0], %g3, %g7
128	cmp		%g3, %g7
129	bne,pn		%icc, 1b
130	 sub		%g7, %g1, %g7
131	cmp		%g7, 0
132	membar		#StoreLoad | #StoreStore
133	bl,pn		%icc, 3f
134	 nop
1352:
136	retl
137	 nop
1383:
139	save		%sp, -192, %sp
140	call		rwsem_wake
141	 mov		%i0, %o0
142	ret
143	 restore
144	.size		__up_write, .-__up_write
145
146	.globl		__downgrade_write
147__downgrade_write:
148	sethi		%hi(RWSEM_WAITING_BIAS), %g1
149	or		%g1, %lo(RWSEM_WAITING_BIAS), %g1
1501:
151	lduw		[%o0], %g3
152	sub		%g3, %g1, %g7
153	cas		[%o0], %g3, %g7
154	cmp		%g3, %g7
155	bne,pn		%icc, 1b
156	 sub		%g7, %g1, %g7
157	cmp		%g7, 0
158	membar		#StoreLoad | #StoreStore
159	bl,pn		%icc, 3f
160	 nop
1612:
162	retl
163	 nop
1643:
165	save		%sp, -192, %sp
166	call		rwsem_downgrade_wake
167	 mov		%i0, %o0
168	ret
169	 restore
170	.size		__downgrade_write, .-__downgrade_write
171