diff options
author | Ulrich Drepper <drepper@redhat.com> | 2002-12-18 10:56:40 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2002-12-18 10:56:40 +0000 |
commit | d7913e0e256e842a3ff43b1a0854b351f585645d (patch) | |
tree | 12410015ce1a133eb10783ed89d6cd85b30c6272 /nptl/sysdeps/unix/sysv/linux | |
parent | 6ed5da8f484ccafb6e1b131514d8c01efc5affbc (diff) | |
download | glibc-d7913e0e256e842a3ff43b1a0854b351f585645d.tar.gz glibc-d7913e0e256e842a3ff43b1a0854b351f585645d.tar.xz glibc-d7913e0e256e842a3ff43b1a0854b351f585645d.zip |
Update.
2002-12-18 Ulrich Drepper <drepper@redhat.com> * sysdeps/pthread/bits/stdio-lock.h: New file. * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S: New file. * sysdeps/unix/sysv/linux/i386/i586/libc-lowlevelmutex.S: New file. * sysdeps/unix/sysv/linux/i386/i686/libc-lowlevelmutex.S: New file. * Makefile (routines): Add libc-lowlevelmutex. * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S: Remove __i686.get_pc_thunk.dx.
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux')
4 files changed, 182 insertions, 10 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S index 27275e3158..334866db6b 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S @@ -183,13 +183,3 @@ __lll_timedwait_tid: 6: movl $ETIMEDOUT, %eax jmp 3b .size __lll_timedwait_tid,.-__lll_timedwait_tid - - - .section .gnu.linkonce.t.__i686.get_pc_thunk.dx,"ax",@progbits - .globl __i686.get_pc_thunk.dx - .hidden __i686.get_pc_thunk.dx - .type __i686.get_pc_thunk.dx,@function -__i686.get_pc_thunk.dx: - movl (%esp), %edx - ret - .size __i686.get_pc_thunk.dx,.-__i686.get_pc_thunk.dx diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S new file mode 100644 index 0000000000..dac8f4a884 --- /dev/null +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S @@ -0,0 +1,180 @@ +/* Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> + + .text + +#define SYS_gettimeofday __NR_gettimeofday +#define SYS_futex 240 +#define FUTEX_WAIT 0 +#define FUTEX_WAKE 1 + +#define EWOULDBLOCK 11 +#define EINVAL 22 +#define ETIMEDOUT 110 + + + .globl __lll_mutex_lock_wait + .type __lll_mutex_lock_wait,@function + .hidden __lll_mutex_lock_wait + .align 16 +__lll_mutex_lock_wait: + pushl %esi + pushl %ebx + pushl %edx + + movl %ecx, %ebx + xorl %esi, %esi /* No timeout. */ + xorl %ecx, %ecx /* movl $FUTEX_WAIT, %ecx */ +1: + leal 1(%eax), %edx /* account for the preceeded xadd. */ + movl $SYS_futex, %eax + int $0x80 + + movl $1, %eax +#ifndef UP + cmpl $0, %gs:MULTIPLE_THREADS_OFFSET + je,pt 0f + lock +0: +#endif + xaddl %eax, (%ebx) + testl %eax, %eax + jne 1b + + movl $2, (%ebx) + + popl %edx + popl %ebx + popl %esi + ret + .size __lll_mutex_lock_wait,.-__lll_mutex_lock_wait + + + .globl __lll_mutex_timedlock_wait + .type __lll_mutex_timedlock_wait,@function + .hidden __lll_mutex_timedlock_wait + .align 16 +__lll_mutex_timedlock_wait: + /* Check for a valid timeout value. */ + cmpl $1000000000, 4(%edx) + jae 3f + + pushl %edi + pushl %esi + pushl %ebx + pushl %ebp + + /* Stack frame for the timespec and timeval structs. */ + subl $8, %esp + + movl %ecx, %ebp + movl %edx, %edi + leal 1(%eax), %esi + + /* Get current time. */ +1: + movl %esp, %ebx + xorl %ecx, %ecx + movl $SYS_gettimeofday, %eax + int $0x80 + + /* Compute relative timeout. */ + movl 4(%esp), %eax + movl $1000, %edx + mul %edx /* Milli seconds to nano seconds. */ + movl (%edi), %ecx + movl 4(%edi), %edx + subl (%esp), %ecx + subl %eax, %edx + jns 4f + addl $1000000000, %edx + decl %ecx +4: testl %ecx, %ecx + js 5f /* Time is already up. */ + + /* Futex call. */ + movl %ecx, (%esp) /* Store relative timeout. */ + movl %edx, 4(%esp) + movl %esi, %edx + movl %esp, %esi + xorl %ecx, %ecx /* movl $FUTEX_WAIT, %ecx */ + movl %ebp, %ebx + movl $SYS_futex, %eax + int $0x80 + + movl $1, %esi +#ifndef UP + cmpl $0, %gs:MULTIPLE_THREADS_OFFSET + je,pt 0f + lock +0: +#endif + xaddl %esi, (%ebx) + testl %esi, %esi + jne 7f + + movl $2, (%ebx) + xorl %eax, %eax + +6: addl $8, %esp + popl %ebp + popl %ebx + popl %esi + popl %edi + ret + + /* Check whether the time expired. */ +7: cmpl $-ETIMEDOUT, %eax + je 5f + jmp 1b + +3: movl $EINVAL, %eax + ret + +5: movl $ETIMEDOUT, %eax + jmp 6b + .size __lll_mutex_timedlock_wait,.-__lll_mutex_timedlock_wait + + + .globl __lll_mutex_unlock_wake + .type __lll_mutex_unlock_wake,@function + .hidden __lll_mutex_unlock_wake + .align 16 +__lll_mutex_unlock_wake: + pushl %esi + pushl %ebx + pushl %ecx + pushl %edx + + movl $FUTEX_WAKE, %ecx + movl %eax, %ebx + xorl %esi, %esi + movl $0, (%ebx) + movl $1, %edx /* Wake one thread. */ + movl $SYS_futex, %eax + int $0x80 + + popl %edx + popl %ecx + popl %ebx + popl %esi + ret + .size __lll_mutex_unlock_wake,.-__lll_mutex_unlock_wake diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i586/libc-lowlevelmutex.S b/nptl/sysdeps/unix/sysv/linux/i386/i586/libc-lowlevelmutex.S new file mode 100644 index 0000000000..7c24ed1d3c --- /dev/null +++ b/nptl/sysdeps/unix/sysv/linux/i386/i586/libc-lowlevelmutex.S @@ -0,0 +1 @@ +#include "../i486/libc-lowlevelmutex.S" diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/libc-lowlevelmutex.S b/nptl/sysdeps/unix/sysv/linux/i386/i686/libc-lowlevelmutex.S new file mode 100644 index 0000000000..7c24ed1d3c --- /dev/null +++ b/nptl/sysdeps/unix/sysv/linux/i386/i686/libc-lowlevelmutex.S @@ -0,0 +1 @@ +#include "../i486/libc-lowlevelmutex.S" |