Update copyright notices with scripts/update-copyrights
[glibc.git] / nptl / sysdeps / unix / sysv / linux / sh / pthread_rwlock_timedwrlock.S
blobdd25e95b96e022f7a51e5c5467940e90e83fb937
1 /* Copyright (C) 2003-2014 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 <kernel-features.h>
24 #include "lowlevel-atomic.h"
27         .text
29         .globl  pthread_rwlock_timedwrlock
30         .type   pthread_rwlock_timedwrlock,@function
31         .align  5
32         cfi_startproc
33 pthread_rwlock_timedwrlock:
34         mov.l   r12, @-r15
35         cfi_adjust_cfa_offset (4)
36         cfi_rel_offset (r12, 0)
37         mov.l   r10, @-r15
38         cfi_adjust_cfa_offset (4)
39         cfi_rel_offset (r10, 0)
40         mov.l   r9, @-r15
41         cfi_adjust_cfa_offset (4)
42         cfi_rel_offset (r9, 0)
43         mov.l   r8, @-r15
44         cfi_adjust_cfa_offset (4)
45         cfi_rel_offset (r8, 0)
46         sts.l   pr, @-r15
47         cfi_adjust_cfa_offset (4)
48         cfi_rel_offset (pr, 0)
49         add     #-8, r15
50         cfi_adjust_cfa_offset (8)
51         mov     r4, r8
52         mov     r5, r9
54         /* Get the lock.  */
55         mov     #0, r3
56         mov     #1, r4
57 #if MUTEX == 0
58         CMPXCHG (r3, @r8, r4, r2)
59 #else
60         CMPXCHG (r3, @(MUTEX,r8), r4, r2)
61 #endif
62         bf      1f
64         mov.l   @(WRITER,r8), r0
65         tst     r0, r0
66         bf      14f
67         mov.l   @(NR_READERS,r8), r0
68         tst     r0, r0
69         bt      5f
71         /* Check the value of the timeout parameter.  */
72         mov.l   .L1g1, r1
73         mov.l   @(4,r9), r0
74         cmp/hs  r1, r0
75         bt      19f
77         mov.l   @(WRITERS_QUEUED,r8), r0
78         add     #1, r0
79         mov.l   r0, @(WRITERS_QUEUED,r8)
80         tst     r0, r0
81         bt      4f
83         mov.l   @(WRITERS_WAKEUP,r8), r10
85 #if MUTEX == 0
86         DEC (@r8, r2)
87 #else
88         DEC (@(MUTEX,r8), r2)
89 #endif
90         tst     r2, r2
91         bf      10f
93 11:
94         /* Get current time.  */
95         mov     r15, r4
96         mov     #0, r5
97         mov     #__NR_gettimeofday, r3
98         trapa   #0x12
99         SYSCALL_INST_PAD
101         mov.l   @(4,r15), r0
102         mov.w   .L1k1, r1
103         dmulu.l r0, r1          /* Milli seconds to nano seconds.  */
104         mov.l   @r9, r2
105         mov.l   @(4,r9), r3
106         mov.l   @r15, r0
107         sts     macl, r1
108         sub     r0, r2
109         clrt
110         subc    r1, r3
111         bf      15f
112         mov.l   .L1g1, r1
113         add     r1, r3
114         add     #-1, r2
116         cmp/pz  r2
117         bf      16f             /* Time is already up.  */
119         /* Store relative timeout.  */
120         mov.l   r2, @r15
121         mov.l   r3, @(4,r15)
123         /* Futex call.  */
124         mov     r15, r7
125 #ifdef __ASSUME_PRIVATE_FUTEX
126         mov     #PSHARED, r0
127         mov.b   @(r0,r8), r5
128         mov     #(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0
129         xor     r0, r5
130         extu.b  r5, r5
131 #else
132         mov     #PSHARED, r0
133         mov.b   @(r0,r8), r5
134         extu.b  r5, r5
135 # if FUTEX_WAIT != 0
136         mov     #FUTEX_WAIT, r0
137         or      r0, r5
138 # endif
139         stc     gbr, r1
140         mov.w   .Lpfoff, r2
141         add     r2, r1
142         mov.l   @r1, r0
143         xor     r0, r5
144 #endif
145         mov     r10, r6
146         mov     r8, r4
147         add     #WRITERS_WAKEUP, r4
148         mov     #SYS_futex, r3
149         extu.b  r3, r3
150         trapa   #0x14
151         SYSCALL_INST_PAD
152         mov     r0, r3
155         /* Reget the lock.  */
156         mov     #0, r5
157         mov     #1, r4
158 #if MUTEX == 0
159         CMPXCHG (r5, @r8, r4, r2)
160 #else
161         CMPXCHG (r5, @(MUTEX,r8), r4, r2)
162 #endif
163         bf      12f
166         mov.l   @(WRITERS_QUEUED,r8), r0
167         add     #-1, r0
168         mov.l   r0, @(WRITERS_QUEUED,r8)
169         mov     #-ETIMEDOUT, r0
170         cmp/eq  r0, r3
171         bf      2b
174         bra     9f
175          mov    #ETIMEDOUT, r3
178         bra     9f
179          mov    #EINVAL, r3
182         mov     #0, r3
183         stc     gbr, r0
184         mov.w   .Ltidoff, r1
185         mov.l   @(r0,r1), r0
186         mov.l   r0, @(WRITER,r8)
188 #if MUTEX == 0
189         DEC (@r8, r2)
190 #else
191         DEC (@(MUTEX,r8), r2)
192 #endif
193         tst     r2, r2
194         bf      6f
196         cfi_remember_state
197         add     #8,r15
198         cfi_adjust_cfa_offset (-8)
199         lds.l   @r15+, pr
200         cfi_adjust_cfa_offset (-4)
201         cfi_restore (pr)
202         mov.l   @r15+, r8
203         cfi_adjust_cfa_offset (-4)
204         cfi_restore (r8)
205         mov.l   @r15+, r9
206         cfi_adjust_cfa_offset (-4)
207         cfi_restore (r9)
208         mov.l   @r15+, r10
209         cfi_adjust_cfa_offset (-4)
210         cfi_restore (r10)
211         mov.l   @r15+, r12
212         cfi_adjust_cfa_offset (-4)
213         cfi_restore (r12)
214         rts
215          mov    r3, r0
216         cfi_restore_state
218 #ifndef __ASSUME_PRIVATE_FUTEX
219 .Lpfoff:
220         .word   PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
221 #endif
222 .L1k1:
223         .word   1000
224         .align  2
225 .L1g1:
226         .long   1000000000
229         mov     r8, r5
230 #if MUTEX != 0
231         add     #MUTEX, r5
232 #endif
233         mov     #PSHARED, r0
234         mov.b   @(r0,r8), r6
235         extu.b  r6, r6
236         mov.l   .Lwait6, r1
237         bsrf    r1
238          mov    r2, r4
239 .Lwait6b:
240         bra     2b
241          nop
243         stc     gbr, r1
244         mov.w   .Ltidoff, r2
245         add     r2, r1
246         mov.l   @r1, r1
247         cmp/eq  r1, r0
248         bf      3b
249         bra     9b
250          mov    #EDEADLK, r3
252         mov     r3, r10
253         mov     r8, r4
254 #if MUTEX != 0
255         add     #MUTEX, r4
256 #endif
257         mov     #PSHARED, r0
258         mov.b   @(r0,r8), r5
259         extu.b  r5, r5
260         mov.l   .Lwake6, r1
261         bsrf    r1
262          nop
263 .Lwake6b:
264         bra     7b
265          mov    r10, r3
267 .Ltidoff:
268         .word   TID - TLS_PRE_TCB_SIZE
271         /* Overflow.  */
272         mov.l   @(WRITERS_QUEUED,r8), r1
273         add     #-1, r1
274         mov.l   r1, @(WRITERS_QUEUED,r8)
275         bra     9b
276          mov    #EAGAIN, r3
279         mov     r8, r4
280 #if MUTEX != 0
281         add     #MUTEX, r4
282 #endif
283         mov     #PSHARED, r0
284         mov.b   @(r0,r8), r5
285         extu.b  r5, r5
286         mov.l   .Lwake7, r1
287         bsrf    r1
288          nop
289 .Lwake7b:
290         bra     11b
291          nop
294         mov     r3, r10
295         mov     r8, r5
296 #if MUTEX != 0
297         add     #MUTEX, r5
298 #endif
299         mov     #PSHARED, r0
300         mov.b   @(r0,r8), r6
301         extu.b  r6, r6
302         mov.l   .Lwait7, r1
303         bsrf    r1
304          mov    r2, r4
305 .Lwait7b:
306         bra     13b
307          mov    r10, r3
310         bra     17b
311          mov    #-ETIMEDOUT, r3
312         cfi_endproc
314         .align  2
315 .Lwait6:
316         .long   __lll_lock_wait-.Lwait6b
317 .Lwake6:
318         .long   __lll_unlock_wake-.Lwake6b
319 .Lwait7:
320         .long   __lll_lock_wait-.Lwait7b
321 .Lwake7:
322         .long   __lll_unlock_wake-.Lwake7b
323         .size   pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock