• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, "ax"
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	bl,pn		%icc, 3f
21	 nop
222:
23	retl
24	 nop
253:
26	save		%sp, -192, %sp
27	call		rwsem_down_read_failed
28	 mov		%i0, %o0
29	ret
30	 restore
31	.size		__down_read, .-__down_read
32
33	.globl		__down_read_trylock
34__down_read_trylock:
351:	lduw		[%o0], %g1
36	add		%g1, 1, %g7
37	cmp		%g7, 0
38	bl,pn		%icc, 2f
39	 mov		0, %o1
40	cas		[%o0], %g1, %g7
41	cmp		%g1, %g7
42	bne,pn		%icc, 1b
43	 mov		1, %o1
442:	retl
45	 mov		%o1, %o0
46	.size		__down_read_trylock, .-__down_read_trylock
47
48	.globl		__down_write
49__down_write:
50	sethi		%hi(RWSEM_ACTIVE_WRITE_BIAS), %g1
51	or		%g1, %lo(RWSEM_ACTIVE_WRITE_BIAS), %g1
521:
53	lduw		[%o0], %g3
54	add		%g3, %g1, %g7
55	cas		[%o0], %g3, %g7
56	cmp		%g3, %g7
57	bne,pn		%icc, 1b
58	 cmp		%g7, 0
59	bne,pn		%icc, 3f
60	 nop
612:	retl
62	 nop
633:
64	save		%sp, -192, %sp
65	call		rwsem_down_write_failed
66	 mov		%i0, %o0
67	ret
68	 restore
69	.size		__down_write, .-__down_write
70
71	.globl		__down_write_trylock
72__down_write_trylock:
73	sethi		%hi(RWSEM_ACTIVE_WRITE_BIAS), %g1
74	or		%g1, %lo(RWSEM_ACTIVE_WRITE_BIAS), %g1
751:
76	lduw		[%o0], %g3
77	cmp		%g3, 0
78	bne,pn		%icc, 2f
79	 mov		0, %o1
80	add		%g3, %g1, %g7
81	cas		[%o0], %g3, %g7
82	cmp		%g3, %g7
83	bne,pn		%icc, 1b
84	 mov		1, %o1
852:	retl
86	 mov		%o1, %o0
87	.size		__down_write_trylock, .-__down_write_trylock
88
89	.globl		__up_read
90__up_read:
911:
92	lduw		[%o0], %g1
93	sub		%g1, 1, %g7
94	cas		[%o0], %g1, %g7
95	cmp		%g1, %g7
96	bne,pn		%icc, 1b
97	 cmp		%g7, 0
98	bl,pn		%icc, 3f
99	 nop
1002:	retl
101	 nop
1023:	sethi		%hi(RWSEM_ACTIVE_MASK), %g1
103	sub		%g7, 1, %g7
104	or		%g1, %lo(RWSEM_ACTIVE_MASK), %g1
105	andcc		%g7, %g1, %g0
106	bne,pn		%icc, 2b
107	 nop
108	save		%sp, -192, %sp
109	call		rwsem_wake
110	 mov		%i0, %o0
111	ret
112	 restore
113	.size		__up_read, .-__up_read
114
115	.globl		__up_write
116__up_write:
117	sethi		%hi(RWSEM_ACTIVE_WRITE_BIAS), %g1
118	or		%g1, %lo(RWSEM_ACTIVE_WRITE_BIAS), %g1
1191:
120	lduw		[%o0], %g3
121	sub		%g3, %g1, %g7
122	cas		[%o0], %g3, %g7
123	cmp		%g3, %g7
124	bne,pn		%icc, 1b
125	 sub		%g7, %g1, %g7
126	cmp		%g7, 0
127	bl,pn		%icc, 3f
128	 nop
1292:
130	retl
131	 nop
1323:
133	save		%sp, -192, %sp
134	call		rwsem_wake
135	 mov		%i0, %o0
136	ret
137	 restore
138	.size		__up_write, .-__up_write
139
140	.globl		__downgrade_write
141__downgrade_write:
142	sethi		%hi(RWSEM_WAITING_BIAS), %g1
143	or		%g1, %lo(RWSEM_WAITING_BIAS), %g1
1441:
145	lduw		[%o0], %g3
146	sub		%g3, %g1, %g7
147	cas		[%o0], %g3, %g7
148	cmp		%g3, %g7
149	bne,pn		%icc, 1b
150	 sub		%g7, %g1, %g7
151	cmp		%g7, 0
152	bl,pn		%icc, 3f
153	 nop
1542:
155	retl
156	 nop
1573:
158	save		%sp, -192, %sp
159	call		rwsem_downgrade_wake
160	 mov		%i0, %o0
161	ret
162	 restore
163	.size		__downgrade_write, .-__downgrade_write
164