Update copyright notices with scripts/update-copyrights
[glibc.git] / nptl / sysdeps / unix / sysv / linux / sh / sem_timedwait.S
blob4803d033d686dfa94ec3fc4c57197e38e2a2b20f
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 <shlib-compat.h>
20 #include <pthread-errnos.h>
21 #include <tcb-offsets.h>
22 #include <structsem.h>
23 #include <lowlevellock.h>
24 #include "lowlevel-atomic.h"
27 #if VALUE != 0
28 # error "code needs to be rewritten for VALUE != 0"
29 #endif
31         .text
33         .globl  sem_timedwait
34         .type   sem_timedwait,@function
35         .align  5
36         cfi_startproc
37 sem_timedwait:
38 .LSTARTCODE:
39 #ifdef SHARED
40         cfi_personality(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect,
41                         DW.ref.__gcc_personality_v0)
42         cfi_lsda(DW_EH_PE_pcrel | DW_EH_PE_sdata4, .LexceptSTART)
43 #else
44         cfi_personality(DW_EH_PE_absptr, __gcc_personality_v0)
45         cfi_lsda(DW_EH_PE_absptr, .LexceptSTART)
46 #endif
47         mov.l   @r4, r0
49         tst     r0, r0
50         bt      1f
51         mov     r0, r3
52         mov     r0, r6
53         add     #-1, r3
54         CMPXCHG (r6, @r4, r3, r2)
55         bf/s    2b
56          mov    r2, r0
57         rts
58          mov    #0, r0
61         /* Check whether the timeout value is valid.  */
62         mov.l   r8, @-r15
63         cfi_adjust_cfa_offset (4)
64         cfi_rel_offset (r8, 0)
65         mov.l   r9, @-r15
66         cfi_adjust_cfa_offset (4)
67         cfi_rel_offset (r9, 0)
68         mov.l   r10, @-r15
69         cfi_adjust_cfa_offset (4)
70         cfi_rel_offset (r10, 0)
71         mov.l   r12, @-r15
72         cfi_adjust_cfa_offset (4)
73         cfi_rel_offset (r12, 0)
74         sts.l   pr, @-r15
75         cfi_adjust_cfa_offset (4)
76         cfi_rel_offset (pr, 0)
77         add     #-8, r15
78         cfi_adjust_cfa_offset (8)
80         mov     r4, r8
81         mov     r5, r9
83         /* Check for invalid nanosecond field.  */
84         mov.l   @(4,r9), r0
85         mov.l   .L1g, r1
86         cmp/hs  r1, r0
87         bt/s    .Lerrno_exit
88          mov    #EINVAL, r10
89         INC (@(NWAITERS,r8),r2)
92         /* Compute relative timeout.  */
93         mov     r15, r4
94         mov     #0, r5
95         mov     #__NR_gettimeofday, r3
96         trapa   #0x12
97         SYSCALL_INST_PAD
99         mov.l   @(4,r15), r0
100         mov.w   .L1k, r1
101         dmulu.l r0, r1          /* Milli seconds to nano seconds.  */
102         mov.l   @r9, r2
103         mov.l   @(4,r9), r3
104         mov.l   @r15, r0
105         sts     macl, r1
106         sub     r0, r2
107         clrt
108         subc    r1, r3
109         bf      5f
110         mov.l   .L1g, r1
111         add     r1, r3
112         add     #-1, r2
114         cmp/pz  r2
115         bf/s    6f              /* Time is already up.  */
116          mov    #ETIMEDOUT, r0
118         /* Store relative timeout.  */
119         mov.l   r2, @r15
120         mov.l   r3, @(4,r15)
122 .LcleanupSTART:
123         mov.l   .Lenable0, r1
124         bsrf    r1
125          nop
126 .Lenable0b:
127         mov     r0, r10
129         mov     r8, r4
130 #if FUTEX_WAIT == 0
131         mov.l   @(PRIVATE,r8), r5
132 #else
133         mov.l   @(PRIVATE,r8), r5
134         mov     #FUTEX_WAIT, r0
135         or      r0, r5
136 #endif
137         mov     #0, r6
138         mov     r15, r7
139         mov     #SYS_futex, r3
140         extu.b  r3, r3
141         trapa   #0x14
142         SYSCALL_INST_PAD
144         mov.l   .Ldisable0, r1
145         mov     r10, r4
146         bsrf    r1
147          mov    r0, r10
148 .Ldisable0b:
149         mov     r10, r0
150 .LcleanupEND:
152         tst     r0, r0
153         bt      9f
154         cmp/eq  #-EWOULDBLOCK, r0
155         bf      3f
157         mov.l   @r8, r0
159         tst     r0, r0
160         bt      7b
162         mov     r0, r3
163         mov     r0, r4
164         add     #-1, r3
165         CMPXCHG (r4, @r8, r3, r2)
166         bf/s    8b
167          mov    r2, r0
169         DEC (@(NWAITERS,r8), r2)
170         mov     #0, r0
173         cfi_remember_state
174         add     #8, r15
175         cfi_adjust_cfa_offset (-8)
176         lds.l   @r15+, pr
177         cfi_adjust_cfa_offset (-4)
178         cfi_restore (pr)
179         mov.l   @r15+, r12
180         cfi_adjust_cfa_offset (-4)
181         cfi_restore (r12)
182         mov.l   @r15+, r10
183         cfi_adjust_cfa_offset (-4)
184         cfi_restore (r10)
185         mov.l   @r15+, r9
186         cfi_adjust_cfa_offset (-4)
187         cfi_restore (r9)
188         mov.l   @r15+, r8
189         cfi_adjust_cfa_offset (-4)
190         cfi_restore (r8)
191         rts
192          nop
193         cfi_restore_state
196         neg     r0, r0
198         mov     r0, r10
199         DEC (@(NWAITERS,r8), r2)
200 .Lerrno_exit:
201         mova    .Lgot2, r0
202         mov.l   .Lgot2, r12
203         add     r0, r12
205         mov.l   .Lerrno2, r0
206         stc     gbr, r1
207         mov.l   @(r0, r12), r0
208         bra     .Lexit
209          add    r1, r0
210         .align  2
211 .Lerrno2:
212         .long   errno@GOTTPOFF
213 .Lexit:
214         mov.l   r10, @r0
215         bra     10b
216          mov    #-1, r0
218 .L1k:
219         .word   1000
220         .align  2
221 .L1g:
222         .long   1000000000
223 .Lgot2:
224         .long   _GLOBAL_OFFSET_TABLE_
225 .Lenable0:
226         .long   __pthread_enable_asynccancel-.Lenable0b
227 .Ldisable0:
228         .long   __pthread_disable_asynccancel-.Ldisable0b
229         .size   sem_timedwait,.-sem_timedwait
231         .type   sem_wait_cleanup,@function
232 sem_wait_cleanup:
233         DEC (@(NWAITERS,r8), r2)
234 .LcallUR:
235         mov.l   .Lresume, r1
236 #ifdef PIC
237         add     r12, r1
238 #endif
239         jsr     @r1
240          nop
241         sleep
243         .align  2
244 .Lresume:
245 #ifdef PIC
246         .long   _Unwind_Resume@GOTOFF
247 #else
248         .long   _Unwind_Resume
249 #endif
250 .LENDCODE:
251         cfi_endproc
252         .size   sem_wait_cleanup,.-sem_wait_cleanup
255         .section .gcc_except_table,"a",@progbits
256 .LexceptSTART:
257         .byte   DW_EH_PE_omit                   ! @LPStart format (omit)
258         .byte   DW_EH_PE_omit                   ! @TType format (omit)
259         .byte   DW_EH_PE_uleb128                ! call-site format
260         .uleb128 .Lcstend-.Lcstbegin
261 .Lcstbegin:
262         .uleb128 .LcleanupSTART-.LSTARTCODE
263         .uleb128 .LcleanupEND-.LcleanupSTART
264         .uleb128 sem_wait_cleanup-.LSTARTCODE
265         .uleb128  0
266         .uleb128 .LcallUR-.LSTARTCODE
267         .uleb128 .LENDCODE-.LcallUR
268         .uleb128 0
269         .uleb128  0
270 .Lcstend:
272 #ifdef SHARED
273         .hidden DW.ref.__gcc_personality_v0
274         .weak   DW.ref.__gcc_personality_v0
275         .section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits
276         .align  4
277         .type   DW.ref.__gcc_personality_v0, @object
278         .size   DW.ref.__gcc_personality_v0, 4
279 DW.ref.__gcc_personality_v0:
280         .long   __gcc_personality_v0
281 #endif