Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 12 Mar 2003 20:03:07 +0000 (20:03 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 12 Mar 2003 20:03:07 +0000 (20:03 +0000)
2003-03-12  Ulrich Drepper  <drepper@redhat.com>

* sysdeps/x86_64/tls.h [__ASSEMBLER__]: Include tcb-offsets.h.
* sysdeps/x86_64/tcb-offsets.sym: New file.
* sysdeps/x86_64/Makefile: New file.

* sysdeps/i386/tcb-offsets.sym: Add SELF.
* sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Use SELF
to access own pthread_t in TCB.
* sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S:
Likewise.
* sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S:
Likewise.
* sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise.

* sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S: New
file.
* sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S: New
file.

* sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h
(pthread_cond_t): Add padding.

13 files changed:
nptl/ChangeLog
nptl/sysdeps/i386/tcb-offsets.sym
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S
nptl/sysdeps/x86_64/Makefile [new file with mode: 0644]
nptl/sysdeps/x86_64/tcb-offsets.sym [new file with mode: 0644]
nptl/sysdeps/x86_64/tls.h

index 952f273..4313df0 100644 (file)
@@ -1,3 +1,18 @@
+2003-03-12  Ulrich Drepper  <drepper@redhat.com>
+
+       * sysdeps/x86_64/tls.h [__ASSEMBLER__]: Include tcb-offsets.h.
+       * sysdeps/x86_64/tcb-offsets.sym: New file.
+       * sysdeps/x86_64/Makefile: New file.
+
+       * sysdeps/i386/tcb-offsets.sym: Add SELF.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Use SELF
+       to access own pthread_t in TCB.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S:
+       Likewise.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S:
+       Likewise.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise.
+
 2003-03-12  Roland McGrath  <roland@redhat.com>
 
        * pthread-errnos.sym: New file.
 
 2003-03-12  Ulrich Drepper  <drepper@redhat.com>
 
+       * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S: New
+       file.
+       * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S: New
+       file.
+
+       * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h
+       (pthread_cond_t): Add padding.
+
        * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S: New file.
        * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S: New file.
        * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S: New file.
index 5395235..6a5c16c 100644 (file)
@@ -1,6 +1,7 @@
 #include <sysdep.h>
 #include <tls.h>
 
+SELF                   offsetof (tcbhead_t, self)
 MULTIPLE_THREADS_OFFSET        offsetof (tcbhead_t, multiple_threads)
 SYSINFO_OFFSET         offsetof (tcbhead_t, sysinfo)
 CLEANUP                        offsetof (struct pthread, cleanup)
index 064d30d..30a2e2c 100644 (file)
@@ -124,7 +124,7 @@ __pthread_rwlock_rdlock:
        call    __lll_mutex_lock_wait
        jmp     2b
 
-14:    cmpl    %gs:8, %eax
+14:    cmpl    %gs:SELF, %eax
        jne     3b
        /* Deadlock detected.  */
        movl    $EDEADLK, %ecx
index 1fd04f8..3ebe2a5 100644 (file)
@@ -165,7 +165,7 @@ pthread_rwlock_timedrdlock:
        call    __lll_mutex_lock_wait
        jmp     2b
 
-14:    cmpl    %gs:8, %eax
+14:    cmpl    %gs:SELF, %eax
        jne     3b
        movl    $EDEADLK, %ecx
        jmp     9b
index ee9e6fa..9614f24 100644 (file)
@@ -135,7 +135,7 @@ pthread_rwlock_timedwrlock:
 
 
 5:     xorl    %ecx, %ecx
-       movl    %gs:8, %eax
+       movl    %gs:SELF, %eax
        movl    %eax, WRITER(%ebp)
 9:     LOCK
 #if MUTEX == 0
@@ -163,7 +163,7 @@ pthread_rwlock_timedwrlock:
        call    __lll_mutex_lock_wait
        jmp     2b
 
-14:    cmpl    %gs:8, %eax
+14:    cmpl    %gs:SELF, %eax
        jne     3b
 20:    movl    $EDEADLK, %ecx
        jmp     9b
index 6c8b9e6..10b176e 100644 (file)
@@ -97,7 +97,7 @@ __pthread_rwlock_wrlock:
        jmp     2b
 
 5:     xorl    %ecx, %ecx
-       movl    %gs:8, %eax
+       movl    %gs:SELF, %eax
        movl    %eax, WRITER(%ebx)
 9:     LOCK
 #if MUTEX == 0
@@ -122,7 +122,7 @@ __pthread_rwlock_wrlock:
        call    __lll_mutex_lock_wait
        jmp     2b
 
-14:    cmpl    %gs:8, %eax
+14:    cmpl    %gs:SELF, %eax
        jne     3b
        movl    $EDEADLK, %ecx
        jmp     9b
index 2e8e297..03897e3 100644 (file)
@@ -119,7 +119,7 @@ __pthread_rwlock_rdlock:
 #endif
        jmp     2b
 
-14:    cmpq    %gs:16, %rax
+14:    cmpq    %fs:SELF, %rax
        jne     3b
        /* Deadlock detected.  */
        movq    $EDEADLK, %rcx
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S
new file mode 100644 (file)
index 0000000..4df136f
--- /dev/null
@@ -0,0 +1,206 @@
+/* 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 <lowlevelrwlock.h>
+#include <pthread-errnos.h>
+
+
+#define SYS_gettimeofday       __NR_gettimeofday
+#define SYS_futex              202
+#define FUTEX_WAIT             0
+#define FUTEX_WAKE             1
+
+#ifndef UP
+# define LOCK lock
+#else
+# define LOCK
+#endif
+
+
+       .text
+
+       .globl  pthread_rwlock_timedrdlock
+       .type   pthread_rwlock_timedrdlock,@function
+       .align  16
+pthread_rwlock_timedrdlock:
+       subq    $16, %rsp
+
+       movq    %rdi, %r8
+       movq    %rsi, %r9
+       xorq    %r10, %r10
+
+       /* Get the lock.  */
+       movl    $1, %esi
+       LOCK
+#if MUTEX == 0
+       xaddl   %esi, (%rdi)
+#else
+       xaddl   %esi, MUTEX(%rdi)
+#endif
+       testl   %esi, %esi
+       jne     1f
+
+2:     movq    WRITER(%r8), %rax
+       testq   %rax, %rax
+       jne     14f
+       cmpl    $0, WRITERS_QUEUED(%r8)
+       je      5f
+       cmpl    $0, FLAGS(%r8)
+       je      5f
+
+       /* Check the value of the timeout parameter.  */
+3:     cmpl    $1000000000, 8(%r9)
+       jae     19f
+
+       incl    READERS_QUEUED(%r8)
+       je      4f
+
+       movl    READERS_WAKEUP(%r8), %edx
+
+       /* Unlock.  */
+       LOCK
+#if MUTEX == 0
+       subl    $1, (%r8)
+#else
+       subl    $1, MUTEX(%r8)
+#endif
+       jne     10f
+
+       /* Get current time.  */
+11:    movq    %rsp, %rdi
+       xorq    %rsi, %rsi
+       movq    $SYS_gettimeofday, %rax
+       syscall
+
+       /* Compute relative timeout.  */
+       movq    8(%rsp), %rax
+       movq    $1000, %rdi
+       mul     %rdi            /* Milli seconds to nano seconds.  */
+       movq    (%r9), %rcx
+       movq    8(%r9), %rdi
+       subq    (%rsp), %rcx
+       subq    %rax, %rdi
+       jns     15f
+       addq    $1000000000, %rdi
+       decq    %rcx
+15:    testq   %rcx, %rcx
+       js      16f             /* Time is already up.  */
+
+       /* Futex call.  */
+       movq    %rcx, (%rsp)    /* Store relative timeout.  */
+       movq    %rdi, 8(%rsp)
+
+       xorq    %rsi, %rsi      /* movq $FUTEX_WAIT, %rsi */
+       leaq    READERS_WAKEUP(%r8), %rdi
+       movq    $SYS_futex, %rax
+       syscall
+       movq    %rax, %rdx
+17:
+
+       /* Reget the lock.  */
+       movl    $1, %esi
+       LOCK
+#if MUTEX == 0
+       xaddl   %esi, (%r8)
+#else
+       xaddl   %esi, MUTEX(%r8)
+#endif
+       testl   %esi, %esi
+       jne     12f
+
+13:    decl    READERS_QUEUED(%r8)
+       cmpq    $-ETIMEDOUT, %rdx
+       jne     2b
+
+18:    movq    $ETIMEDOUT, %rcx
+       jmp     9f
+
+
+5:     xorq    %rcx, %rcx
+       incl    NR_READERS(%r8)
+       je      8f
+9:     LOCK
+#if MUTEX == 0
+       decl    (%r8)
+#else
+       decl    MUTEX(%r8)
+#endif
+       jne     6f
+
+7:     movq    %rcx, %rax
+
+       addq    $16, %rsp
+       retq
+
+1:
+#if MUTEX != 0
+       addq    $MUTEX, %rdi
+#endif
+       callq   __lll_mutex_lock_wait
+       jmp     2b
+
+14:    cmpq    %fs:SELF, %rax
+       jne     3b
+       movq    $EDEADLK, %rcx
+       jmp     9b
+
+6:
+#if MUTEX == 0
+       movq    %r8, %rdi
+#else
+       leal    MUTEX(%r8), %rdi
+#endif
+       callq   __lll_mutex_unlock_wake
+       jmp     7b
+
+       /* Overflow.  */
+8:     decl    NR_READERS(%r8)
+       movq    $EAGAIN, %rcx
+       jmp     9b
+
+       /* Overflow.  */
+4:     decl    READERS_QUEUED(%r8)
+       movq    $EAGAIN, %rcx
+       jmp     9b
+
+10:
+#if MUTEX == 0
+       movq    %r8, %rdi
+#else
+       leaq    MUTEX(%r8), %rdi
+#endif
+       callq   __lll_mutex_unlock_wake
+       jmp     11b
+
+12:
+#if MUTEX == 0
+       movq    %r8, %rdi
+#else
+       leaq    MUTEX(%r8), %rdi
+#endif
+       call    __lll_mutex_lock_wait
+       jmp     13b
+
+16:    movq    $-ETIMEDOUT, %rdx
+       jmp     17b
+
+19:    movq    $EINVAL, %rcx
+       jmp     9b
+       .size   pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S
new file mode 100644 (file)
index 0000000..a6a02a9
--- /dev/null
@@ -0,0 +1,198 @@
+/* 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 <lowlevelrwlock.h>
+#include <pthread-errnos.h>
+
+
+#define SYS_gettimeofday       __NR_gettimeofday
+#define SYS_futex              202
+#define FUTEX_WAIT             0
+#define FUTEX_WAKE             1
+
+#ifndef UP
+# define LOCK lock
+#else
+# define LOCK
+#endif
+
+
+       .text
+
+       .globl  pthread_rwlock_timedwrlock
+       .type   pthread_rwlock_timedwrlock,@function
+       .align  16
+pthread_rwlock_timedwrlock:
+       subq    $16, %rsp
+
+       movq    %rdi, %r8
+       movq    %rsi, %r9
+
+       /* Get the lock.  */
+       movl    $1, %esi
+       LOCK
+#if MUTEX == 0
+       xaddl   %esi, (%rdi)
+#else
+       xaddl   %esi, MUTEX(%rdi)
+#endif
+       testl   %esi, %esi
+       jne     1f
+
+2:     movq    WRITER(%r8), %rax
+       testq   %rax, %rax
+       jne     14f
+       cmpl    $0, NR_READERS(%r8)
+       je      5f
+
+       /* Check the value of the timeout parameter.  */
+3:     cmpq    $1000000000, 8(%r9)
+       jae     19f
+
+       incl    WRITERS_QUEUED(%r8)
+       je      4f
+
+       movl    WRITERS_WAKEUP(%r8), %edx
+
+       LOCK
+#if MUTEX == 0
+       decl    (%r8)
+#else
+       decl    MUTEX(%r8)
+#endif
+       jne     10f
+
+       /* Get current time.  */
+11:    movq    %rsp, %rdi
+       xorq    %rsi, %rsi
+       movq    $SYS_gettimeofday, %rax
+       syscall
+
+       /* Compute relative timeout.  */
+       movq    8(%rsp), %rax
+       movq    $1000, %rdi
+       mul     %rdi            /* Milli seconds to nano seconds.  */
+       movq    (%r9), %rcx
+       movq    8(%r9), %rdi
+       subq    (%rsp), %rcx
+       subq    %rax, %rdi
+       jns     15f
+       addq    $1000000000, %rdi
+       decq    %rcx
+15:    testq   %rcx, %rcx
+       js      16f             /* Time is already up.  */
+
+       /* Futex call.  */
+       movq    %rcx, (%rsp)    /* Store relative timeout.  */
+       movq    %rdi, 8(%rsp)
+
+       xorq    %rsi, %rsi      /* movq $FUTEX_WAIT, %rsi */
+       movq    %rsp, %r10
+       leaq    WRITERS_WAKEUP(%r8), %rdi
+       movq    $SYS_futex, %rax
+       syscall
+       movq    %rax, %rdx
+17:
+
+       /* Reget the lock.  */
+       movl    $1, %esi
+       LOCK
+#if MUTEX == 0
+       xaddl   %esi, (%r8)
+#else
+       xaddl   %esi, MUTEX(%r8)
+#endif
+       testl   %esi, %esi
+       jne     12f
+
+13:    decl    WRITERS_QUEUED(%r8)
+       cmpq    $-ETIMEDOUT, %rdx
+       jne     2b
+
+18:    movq    $ETIMEDOUT, %rcx
+       jmp     9f
+
+
+5:     xorq    %rcx, %rcx
+       movq    %fs:SELF, %rax
+       movq    %rax, WRITER(%r8)
+9:     LOCK
+#if MUTEX == 0
+       decl    (%r8)
+#else
+       decl    MUTEX(%r8)
+#endif
+       jne     6f
+
+7:     movq    %rcx, %rax
+
+       addq    $16, %rsp
+       retq
+
+1:
+#if MUTEX != 0
+       addq    $MUTEX, %rdi
+#endif
+       callq   __lll_mutex_lock_wait
+       jmp     2b
+
+14:    cmpq    %fs:SELF, %rax
+       jne     3b
+20:    movq    $EDEADLK, %rcx
+       jmp     9b
+
+6:
+#if MUTEX == 0
+       movq    %r8, %rdi
+#else
+       leal    MUTEX(%r8), %rdi
+#endif
+       callq   __lll_mutex_unlock_wake
+       jmp     7b
+
+       /* Overflow.  */
+4:     decl    WRITERS_QUEUED(%r8)
+       movq    $EAGAIN, %rcx
+       jmp     9b
+
+10:
+#if MUTEX == 0
+       movq    %r8, %rdi
+#else
+       leaq    MUTEX(%r8), %rdi
+#endif
+       callq   __lll_mutex_unlock_wake
+       jmp     11b
+
+12:
+#if MUTEX == 0
+       movq    %r8, %rdi
+#else
+       leaq    MUTEX(%r8), %rdi
+#endif
+       callq   __lll_mutex_lock_wait
+       jmp     13b
+
+16:    movq    $-ETIMEDOUT, %rdx
+       jmp     17b
+
+19:    movq    $EINVAL, %rcx
+       jmp     9b
+       .size   pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock
index 585c186..5d63df8 100644 (file)
@@ -93,7 +93,7 @@ __pthread_rwlock_wrlock:
        jmp     2b
 
 5:     xorq    %rcx, %rcx
-       movq    %gs:16, %rax
+       movq    %fs:SELF, %rax
        movq    %rax, WRITER(%rdi)
 9:     LOCK
 #if MUTEX == 0
@@ -117,7 +117,7 @@ __pthread_rwlock_wrlock:
 #endif
        jmp     2b
 
-14:    cmpq    %gs:16, %rax
+14:    cmpq    %fs:SELF, %rax
        jne     3b
        movq    $EDEADLK, %rcx
        jmp     9b
diff --git a/nptl/sysdeps/x86_64/Makefile b/nptl/sysdeps/x86_64/Makefile
new file mode 100644 (file)
index 0000000..24990a2
--- /dev/null
@@ -0,0 +1,21 @@
+# Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+
+# 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.
+
+ifeq ($(subdir),csu)
+gen-as-const-headers += tcb-offsets.sym
+endif
diff --git a/nptl/sysdeps/x86_64/tcb-offsets.sym b/nptl/sysdeps/x86_64/tcb-offsets.sym
new file mode 100644 (file)
index 0000000..046ad5b
--- /dev/null
@@ -0,0 +1,6 @@
+#include <sysdep.h>
+#include <tls.h>
+
+SELF                   offsetof (tcbhead_t, self)
+CLEANUP                        offsetof (struct pthread, cleanup)
+CLEANUP_PREV           offsetof (struct _pthread_cleanup_buffer, __prev)
index 66ae0f3..69c8bc5 100644 (file)
@@ -42,6 +42,8 @@ typedef struct
   dtv_t *dtv;
   void *self;          /* Pointer to the thread descriptor.  */
 } tcbhead_t;
+#else /* __ASSEMBLER__ */
+# include <tcb-offsets.h>
 #endif