Don't export ll_unlock_wake_cb.
[kopensolaris-gnu/glibc.git] / nptl / sysdeps / unix / sysv / linux / i386 / i486 / libc-lowlevellock.S
1 /* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <sysdep.h>
21 #include <tls.h>
22
23         .text
24
25 #define SYS_gettimeofday        __NR_gettimeofday
26 #define SYS_futex               240
27 #define FUTEX_WAIT              0
28 #define FUTEX_WAKE              1
29
30 #define ETIMEDOUT               110
31
32
33         .globl  __lll_lock_wait
34         .type   __lll_lock_wait,@function
35         .hidden __lll_lock_wait
36         .align  16
37 __lll_lock_wait:
38         pushl   %esi
39         pushl   %ebx
40         pushl   %edx
41
42         movl    %ecx, %ebx
43         xorl    %esi, %esi      /* No timeout.  */
44         xorl    %ecx, %ecx      /* movl $FUTEX_WAIT, %ecx */
45 1:
46         leal    -1(%eax), %edx  /* account for the preceeded xadd.  */
47         movl    $SYS_futex, %eax
48         ENTER_KERNEL
49
50         orl     $-1, %eax       /* Load -1.  */
51 #ifndef UP
52         cmpl    $0, %gs:MULTIPLE_THREADS_OFFSET
53         je,pt   0f
54         lock
55 0:
56 #endif
57         xaddl   %eax, (%ebx)
58         jne     1b
59
60         movl    $-1, (%ebx)
61
62         popl    %edx
63         popl    %ebx
64         popl    %esi
65         ret
66         .size   __lll_lock_wait,.-__lll_lock_wait
67
68
69         .type   lll_unlock_wake_cb,@function
70         .align  16
71 lll_unlock_wake_cb:
72         pushl   %esi
73         pushl   %ebx
74         pushl   %ecx
75         pushl   %edx
76
77         movl    20(%esp), %ebx
78 #ifndef UP
79         cmpl    $0, %gs:MULTIPLE_THREADS_OFFSET
80         je,pt   0f
81         lock
82 0:
83 #endif
84         incl    (%ebx)
85         jng     1f
86
87         popl    %edx
88         popl    %ecx
89         popl    %ebx
90         popl    %esi
91         ret
92         .size   lll_unlock_wake_cb,.-lll_unlock_wake_cb
93
94
95         .globl  __lll_unlock_wake
96         .type   __lll_unlock_wake,@function
97         .hidden __lll_unlock_wake
98 __lll_unlock_wake:
99         pushl   %esi
100         pushl   %ebx
101         pushl   %ecx
102         pushl   %edx
103
104         movl    %eax, %ebx
105 1:      movl    $FUTEX_WAKE, %ecx
106         movl    $1, %edx        /* Wake one thread.  */
107         xorl    %esi, %esi
108         movl    %edx, (%ebx)    /* Stores '$1'.  */
109         movl    $SYS_futex, %eax
110         ENTER_KERNEL
111
112         popl    %edx
113         popl    %ecx
114         popl    %ebx
115         popl    %esi
116         ret
117         .size   __lll_unlock_wake,.-__lll_unlock_wake
118
119
120         .globl  __lll_timedwait_tid
121         .type   __lll_timedwait_tid,@function
122         .hidden __lll_timedwait_tid
123 __lll_timedwait_tid:
124         pushl   %edi
125         pushl   %esi
126         pushl   %ebx
127         pushl   %ebp
128
129         movl    %eax, %ebp
130         movl    %edx, %edi
131         subl    $8, %esp
132
133         /* Get current time.  */
134 2:      movl    %esp, %ebx
135         xorl    %ecx, %ecx
136         movl    $SYS_gettimeofday, %eax
137         ENTER_KERNEL
138
139         /* Compute relative timeout.  */
140         movl    4(%esp), %eax
141         movl    $1000, %edx
142         mul     %edx            /* Milli seconds to nano seconds.  */
143         movl    (%edi), %ecx
144         movl    4(%edi), %edx
145         subl    (%esp), %ecx
146         subl    %eax, %edx
147         jns     5f
148         addl    $1000000000, %edx
149         decl    %ecx
150 5:      testl   %ecx, %ecx
151         js      6f              /* Time is already up.  */
152
153         movl    %ecx, (%esp)    /* Store relative timeout.  */
154         movl    %edx, 4(%esp)
155
156         movl    (%ebp), %edx
157         testl   %edx, %edx
158         jz      4f
159
160         movl    %esp, %esi
161         xorl    %ecx, %ecx      /* movl $FUTEX_WAIT, %ecx */
162         movl    %ebp, %ebx
163         movl    $SYS_futex, %eax
164         ENTER_KERNEL
165
166         movl    %eax, %edx
167
168         cmpl    $0, (%ebx)
169         jne     1f
170 4:      xorl    %eax, %eax
171
172 3:      addl    $8, %esp
173         popl    %ebp
174         popl    %ebx
175         popl    %esi
176         popl    %edi
177         ret
178
179 1:      cmpl    $-ETIMEDOUT, %edx
180         jne     2b
181 6:      movl    $ETIMEDOUT, %eax
182         jmp     3b
183         .size   __lll_timedwait_tid,.-__lll_timedwait_tid