Update.
authorUlrich Drepper <drepper@redhat.com>
Tue, 11 Mar 2003 06:52:08 +0000 (06:52 +0000)
committerUlrich Drepper <drepper@redhat.com>
Tue, 11 Mar 2003 06:52:08 +0000 (06:52 +0000)
* sysdeps/unix/sysv/linux/x86_64/sem_post.S: New file.
* sysdeps/unix/sysv/linux/x86_64/sem_trywait.S: New file.
* sysdeps/unix/sysv/linux/x86_64/sem_wait.S: New file.
* sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: New file.

* sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Fix error value in
unused code.

nptl/ChangeLog
nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S
nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S [new file with mode: 0644]

index 95f0af0..8d28e89 100644 (file)
@@ -1,5 +1,13 @@
 2003-03-10  Ulrich Drepper  <drepper@redhat.com>
 
+       * sysdeps/unix/sysv/linux/x86_64/sem_post.S: New file.
+       * sysdeps/unix/sysv/linux/x86_64/sem_trywait.S: New file.
+       * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: New file.
+       * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: New file.
+
+       * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Fix error value in
+       unused code.
+
        * sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S: New file
 
        * sysdeps/unix/sysv/linux/Makefile (gen-as-const-headers): Add
index 0747fb1..984cb72 100644 (file)
@@ -29,7 +29,6 @@
 #define SYS_futex              240
 #define FUTEX_WAKE             1
 
-#define EAGAIN                 11
 #define EINVAL                 22
 
 
@@ -72,7 +71,7 @@ __new_sem_post:
        movl    $EINVAL, (%edx)
 #else
        call    __errno_location@plt
-       movl    $EAGAIN, (%eax)
+       movl    $EINVAL, (%eax)
 #endif
 
        orl     $-1, %eax
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S
new file mode 100644 (file)
index 0000000..647aee8
--- /dev/null
@@ -0,0 +1,73 @@
+/* Copyright (C) 2002, 2003 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>
+#include <shlib-compat.h>
+
+#ifndef UP
+# define LOCK lock
+#else
+# define
+#endif
+
+#define SYS_futex              202
+#define FUTEX_WAKE             1
+
+#define EINVAL                 22
+
+
+       .text
+
+       .globl  __new_sem_post
+       .type   __new_sem_post,@function
+       .align  16
+__new_sem_post:
+       movl    $1, %edx
+       LOCK
+       xaddl   %edx, (%ebx)
+
+       movq    $SYS_futex, %rax
+       movq    $FUTEX_WAKE, %rsi
+       incl    %edx
+       syscall
+
+       testq   %rax, %rax
+       js      1f
+
+       xorl    %eax, %eax
+       retq
+
+1:
+#if USE___THREAD
+       movq    errno@gottpoff(%rip), %rdx
+       movl    $EINVAL, %fs:(%rdx)
+#else
+       call    __errno_location@plt
+       movl    $EINVAL, (%rax)
+#endif
+
+       orl     $-1, %eax
+       retq
+       .size   __new_sem_post,.-__new_sem_post
+       .symver __new_sem_post, sem_post@@GLIBC_2.1
+#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
+       .global __old_sem_post
+__old_sem_post = __new_sem_post
+       .symver __old_sem_post, sem_post@GLIBC_2.0
+#endif
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S
new file mode 100644 (file)
index 0000000..76d9fee
--- /dev/null
@@ -0,0 +1,128 @@
+/* Copyright (C) 2002, 2003 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>
+#include <shlib-compat.h>
+
+#ifndef UP
+# define LOCK lock
+#else
+# define
+#endif
+
+#define SYS_gettimeofday       __NR_gettimeofday
+#define SYS_futex              202
+
+#define EWOULDBLOCK            11
+#define EINVAL                 22
+#define ETIMEDOUT              110
+
+
+       .text
+
+       .globl  sem_timedwait
+       .type   sem_timedwait,@function
+       .align  16
+sem_timedwait:
+       movl    (%rdi), %eax
+2:     testl   %eax, %eax
+       je      1f
+
+       leal    -1(%eax), %edx
+       LOCK
+       cmpxchgl %edx, (%rdi)
+       jne     2b
+
+       xorl    %eax, %eax
+       ret
+
+       /* Check whether the timeout value is valid.  */
+1:     subq    $16, %rsp
+
+       movq    %rsp, %r10
+       movq    %rdi, %r8
+       movq    %rsi, %r9
+
+       /* Check for invalid nanosecond field.  */
+       cmpq    $1000000000, 4(%r9)
+       movl    $EINVAL, %eax
+       jae     6f
+
+7:     xorl    %rsi, %rsi
+       movq    %rsp, %rdi
+       movq    $SYS_gettimeofday, %rax
+       syscall
+
+       /* Compute relative timeout.  */
+       movq    8(%rsp), %eax
+       movq    $1000, %rdi
+       mul     %rdi            /* Milli seconds to nano seconds.  */
+       movq    (%r9), %rdi
+       movq    8(%r9), %rdi
+       subq    (%rsp), %rdi
+       subq    %rax, %rdi
+       jns     5f
+       addq    $1000000000, %rsi
+       decq    %rdi
+5:     testq   %rdi, %rdi
+       movl    $ETIMEDOUT, %eax
+       js      6f              /* Time is already up.  */
+
+       movl    %rdi, (%rsp)    /* Store relative timeout.  */
+       movl    %rsi, 8(%rsp)
+
+       movq    %r8, %rdi
+       xorq    %rsi, %rsi
+       movq    $SYS_futex, %rax
+       xorl    %edx, %edx
+       syscall
+
+       testq   %rax, %rax
+       je      9f
+       cmpq    $-EWOULDBLOCK, %rax
+       jne     3f
+
+9:     movl    (%rdi), %eax
+8:     testl   %eax, %eax
+       je      7b
+
+       leal    -1(%eax), %ecx
+       LOCK
+       cmpxchgl %ecx, (%rdi)
+       jne     8b
+
+       addq    $16, %rsp
+       xorl    %eax, %eax
+       retq
+
+3:     negq    %eax
+6:
+#if USE___THREAD
+       movq    errno@gottpoff(%rip), %rdx
+       movl    %eax, %fs:(%rdx)
+#else
+       movl    %eax, %edx
+       call    __errno_location@plt
+       movl    %edx, (%rax)
+#endif
+
+       addq    $16, %rsp
+       orl     $-1, %eax
+       retq
+       .size   sem_timedwait,.-sem_timedwait
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S
new file mode 100644 (file)
index 0000000..001d68d
--- /dev/null
@@ -0,0 +1,69 @@
+/* Copyright (C) 2002, 2003 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>
+#include <shlib-compat.h>
+
+#ifndef UP
+# define LOCK lock
+#else
+# define
+#endif
+
+#define SYS_futex              202
+#define FUTEX_WAKE             1
+
+#define EAGAIN                 11
+
+
+       .text
+
+       .globl  __new_sem_trywait
+       .type   __new_sem_trywait,@function
+       .align  16
+__new_sem_trywait:
+       movl    (%rdi), %eax
+2:     testl   %eax, %eax
+       jz      1f
+
+       leal    -1(%eax), %edx
+       LOCK
+       cmpxchgl %edx, (%rdi)
+       jne     2b
+
+       xorl    %eax, %eax
+       retq
+
+1:
+#if USE___THREAD
+       movq    errno@gottpoff(%rip), %rdx
+       movl    $EAGAIN, %fs:(%rdx)
+#else
+       call    __errno_location@plt
+       movl    $EAGAIN, (%rax)
+#endif
+       orl     $-1, %eax
+       retq
+       .size   __new_sem_trywait,.-__new_sem_trywait
+       .symver __new_sem_trywait, sem_trywait@@GLIBC_2.1
+#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
+       .global __old_sem_trywait
+__old_sem_trywait = __new_sem_trywait
+       .symver __old_sem_trywait, sem_trywait@GLIBC_2.0
+#endif
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S
new file mode 100644 (file)
index 0000000..82e63c0
--- /dev/null
@@ -0,0 +1,79 @@
+/* Copyright (C) 2002, 2003 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>
+#include <shlib-compat.h>
+
+#ifndef UP
+# define LOCK lock
+#else
+# define
+#endif
+
+#define SYS_futex              202
+
+#define EWOULDBLOCK            11
+
+
+       .text
+
+       .globl  __new_sem_wait
+       .type   __new_sem_wait,@function
+       .align  16
+__new_sem_wait:
+3:     movl    (%rdi), %eax
+2:     testl   %eax, %eax
+       je      1f
+
+       leal    -1(%eax), %edx
+       LOCK
+       cmpxchgl %edx, (%rdi)
+       jne     2b
+       xorl    %eax, %eax
+
+       retq
+
+1:     xorq    %r10, %r10
+       movq    $SYS_futex, %rax
+       movq    %r10, %rsi
+       movq    %r10, %rdx
+       syscall
+
+       testq   %rax, %rax
+       je      3b
+       cmpq    $-EWOULDBLOCK, %rax
+       je      3b
+       negq    %rax
+#if USE___THREAD
+       movq    errno@gottpoff(%rip), %rdx
+       movl    %eax, %fs:(%rdx)
+#else
+       movl    %eax, %edx
+       call    __errno_location@plt
+       movl    %edx, (%rax)
+#endif
+       orl     $-1, %eax
+       retq
+       .size   __new_sem_wait,.-__new_sem_wait
+       .symver __new_sem_wait, sem_wait@@GLIBC_2.1
+#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
+       .global __old_sem_wait
+__old_sem_wait = __new_sem_wait
+       .symver __old_sem_wait, sem_wait@GLIBC_2.0
+#endif