or1k: syscall: Pass arguments on the stack
[uclibc-ng.git] / libpthread / nptl / sysdeps / unix / sysv / linux / sh / pthread_rwlock_timedrdlock.S
blob122e6199da141c495447d317d09be7bfcb998c13
1 /* Copyright (C) 2003, 2007, 2008 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <http://www.gnu.org/licenses/>.  */
18 #include <sysdep.h>
19 #include <lowlevellock.h>
20 #include <lowlevelrwlock.h>
21 #include <pthread-errnos.h>
22 #include <tcb-offsets.h>
23 #include <bits/kernel-features.h>
24 #include "lowlevel-atomic.h"
27         .text
29         .globl  pthread_rwlock_timedrdlock
30         .type   pthread_rwlock_timedrdlock,@function
31         .align  5
32 pthread_rwlock_timedrdlock:
33         mov.l   r12, @-r15
34         mov.l   r10, @-r15
35         mov.l   r9, @-r15
36         mov.l   r8, @-r15
37         sts.l   pr, @-r15
38         add     #-8, r15
39         mov     r4, r8
40         mov     r5, r9
42         /* Get the lock.  */
43         mov     #0, r3
44         mov     #1, r4
45 #if MUTEX == 0
46         CMPXCHG (r3, @r8, r4, r2)
47 #else
48         CMPXCHG (r3, @(MUTEX,r8), r4, r2)
49 #endif
50         bf      1f
52         mov.l   @(WRITER,r8), r0
53         tst     r0, r0
54         bf      14f
55         mov.l   @(WRITERS_QUEUED,r8), r0
56         tst     r0, r0
57         bt      5f
58         mov     #FLAGS, r0
59         mov.b   @(r0,r8), r0
60         tst     r0, r0
61         bt      5f
63         /* Check the value of the timeout parameter.  */
64         mov.l   .L1g0, r1
65         mov.l   @(4,r9), r0
66         cmp/hs  r1, r0
67         bt      19f
69         mov.l   @(READERS_QUEUED,r8), r0
70         add     #1, r0
71         mov.l   r0, @(READERS_QUEUED,r8)
72         tst     r0, r0
73         bt      4f
75         mov.l   @(READERS_WAKEUP,r8), r10
77 #if MUTEX == 0
78         DEC (@r8, r2)
79 #else
80         DEC (@(MUTEX,r8), r2)
81 #endif
82         tst     r2, r2
83         bf      10f
85 11:
86         /* Get current time.  */
87         mov     r15, r4
88         mov     #0, r5
89         mov     #__NR_gettimeofday, r3
90         trapa   #0x12
91         SYSCALL_INST_PAD
93         mov.l   @(4,r15), r0
94         mov.w   .L1k0, r1
95         dmulu.l r0, r1          /* Milli seconds to nano seconds.  */
96         mov.l   @r9, r2
97         mov.l   @(4,r9), r3
98         mov.l   @r15, r0
99         sts     macl, r1
100         sub     r0, r2
101         clrt
102         subc    r1, r3
103         bf      15f
104         mov.l   .L1g0, r1
105         add     r1, r3
106         add     #-1, r2
108         cmp/pz  r2
109         bf      16f             /* Time is already up.  */
111         /* Store relative timeout.  */
112         mov.l   r2, @r15
113         mov.l   r3, @(4,r15)
115         /* Futex call.  */
116         mov     r15, r7
117 #ifdef __ASSUME_PRIVATE_FUTEX
118         mov     #PSHARED, r0
119         mov.b   @(r0,r8), r5
120         mov     #(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0
121         xor     r0, r5
122         extu.b  r5, r5
123 #else
124         mov     #PSHARED, r0
125         mov.b   @(r0,r8), r5
126         extu.b  r5, r5
127 # if FUTEX_WAIT != 0
128         mov     #FUTEX_WAIT, r0
129         or      r0, r5
130 # endif
131         stc     gbr, r1
132         mov.w   .Lpfoff, r2
133         add     r2, r1
134         mov.l   @r1, r0
135         xor     r0, r5
136 #endif
137         mov     r10, r6
138         mov     r8, r4
139         add     #READERS_WAKEUP, r4
140         mov     #SYS_futex, r3
141         extu.b  r3, r3
142         trapa   #0x14
143         SYSCALL_INST_PAD
144         mov     r0, r3
147         /* Reget the lock.  */
148         mov     #0, r5
149         mov     #1, r4
150 #if MUTEX == 0
151         CMPXCHG (r5, @r8, r4, r2)
152 #else
153         CMPXCHG (r5, @(MUTEX,r8), r4, r2)
154 #endif
155         bf      12f
158         mov.l   @(READERS_QUEUED,r8), r0
159         add     #-1, r0
160         mov.l   r0, @(READERS_QUEUED,r8)
161         mov     #-ETIMEDOUT, r0
162         cmp/eq  r0, r3
163         bf      2b
166         bra     9f
167          mov    #ETIMEDOUT, r3
170         mov     #0, r3
171         mov.l   @(NR_READERS,r8), r0
172         add     #1, r0
173         mov.l   r0, @(NR_READERS,r8)
174         tst     r0, r0
175         bt      8f
178 #if MUTEX == 0
179         DEC (@r8, r2)
180 #else
181         DEC (@(MUTEX,r8), r2)
182 #endif
183         tst     r2, r2
184         bf      6f
186         add     #8,r15
187         lds.l   @r15+, pr
188         mov.l   @r15+, r8
189         mov.l   @r15+, r9
190         mov.l   @r15+, r10
191         mov.l   @r15+, r12
192         rts
193          mov    r3, r0
195 #ifndef __ASSUME_PRIVATE_FUTEX
196 .Lpfoff:
197         .word   PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
198 #endif
199         .align  2
200 .L1k0:
201         .long   1000
202 .L1g0:
203         .long   1000000000
206         mov     r8, r5
207 #if MUTEX != 0
208         add     #MUTEX, r5
209 #endif
210         mov     #PSHARED, r0
211         mov.b   @(r0,r8), r6
212         extu.b  r6, r6
213         mov.l   .Lwait2, r1
214         bsrf    r1
215          mov    r2, r4
216 .Lwait2b:
217         bra     2b
218          nop
220         stc     gbr, r1
221         mov.w   .Ltidoff, r2
222         add     r2, r1
223         mov.l   @r1, r1
224         cmp/eq  r1, r0
225         bf      3b
226         /* Deadlock detected.  */
227         bra     9b
228          mov    #EDEADLK, r3
230 .Ltidoff:
231         .word   TID - TLS_PRE_TCB_SIZE
234         mov     r3, r10
235         mov     r8, r4
236 #if MUTEX != 0
237         add     #MUTEX, r4
238 #endif
239         mov     #PSHARED, r0
240         mov.b   @(r0,r8), r5
241         extu.b  r5, r5
242         mov.l   .Lwake2, r1
243         bsrf    r1
244          nop
245 .Lwake2b:
246         bra     7b
247          mov    r10, r3
250         /* Overflow.  */
251         mov.l   @(NR_READERS,r8), r1
252         add     #-1, r1
253         mov.l   r1, @(NR_READERS,r8)
254         bra     9b
255          mov    #EAGAIN, r3
258         /* Overflow.  */
259         mov.l   @(READERS_QUEUED,r8), r1
260         add     #-1, r1
261         mov.l   r1, @(READERS_QUEUED,r8)
262         bra     9b
263          mov    #EAGAIN, r3
266         mov     r8, r4
267 #if MUTEX != 0
268         add     #MUTEX, r4
269 #endif
270         mov     #PSHARED, r0
271         mov.b   @(r0,r8), r5
272         extu.b  r5, r5
273         mov.l   .Lwake3, r1
274         bsrf    r1
275          nop
276 .Lwake3b:
277         bra     11b
278          nop
281         mov     r3, r10
282         mov     r8, r5
283 #if MUTEX != 0
284         add     #MUTEX, r5
285 #endif
286         mov     #PSHARED, r0
287         mov.b   @(r0,r8), r6
288         extu.b  r6, r6
289         mov.l   .Lwait3, r1
290         bsrf    r1
291          mov    r2, r4
292 .Lwait3b:
293         bra     13b
294          mov    r10, r3
297         bra     17b
298          mov    #-ETIMEDOUT, r3
301         bra     9b
302          mov    #EINVAL, r3
304         .align  2
305 .Lwait2:
306         .long   __lll_lock_wait-.Lwait2b
307 .Lwake2:
308         .long   __lll_unlock_wake-.Lwake2b
309 .Lwait3:
310         .long   __lll_lock_wait-.Lwait3b
311 .Lwake3:
312         .long   __lll_unlock_wake-.Lwake3b
313         .size   pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock