summaryrefslogtreecommitdiff
path: root/nptl/sysdeps/unix/sysv/linux/x86_64
diff options
context:
space:
mode:
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/x86_64')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h35
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/clone.S11
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S97
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h352
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S229
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S15
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S19
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S33
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S30
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S34
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S45
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S18
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S26
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S24
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S10
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S14
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S6
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S16
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S4
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h10
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/vfork.S16
22 files changed, 189 insertions, 858 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h b/nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h
index 693387a266..92fb08c951 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -57,25 +57,11 @@ typedef union
} pthread_attr_t;
-#if __WORDSIZE == 64
-typedef struct __pthread_internal_list
-{
- struct __pthread_internal_list *__prev;
- struct __pthread_internal_list *__next;
-} __pthread_list_t;
-#else
-typedef struct __pthread_internal_slist
-{
- struct __pthread_internal_slist *__next;
-} __pthread_slist_t;
-#endif
-
-
/* Data structures for mutex handling. The structure of the attribute
type is not exposed on purpose. */
typedef union
{
- struct __pthread_mutex_s
+ struct
{
int __lock;
unsigned int __count;
@@ -86,18 +72,10 @@ typedef union
/* KIND must stay at this position in the structure to maintain
binary compatibility. */
int __kind;
-#if __WORDSIZE == 64
- int __spins;
- __pthread_list_t __list;
-# define __PTHREAD_MUTEX_HAVE_PREV 1
-#else
+#if __WORDSIZE != 64
unsigned int __nusers;
- __extension__ union
- {
- int __spins;
- __pthread_slist_t __list;
- };
#endif
+ int __spins;
} __data;
char __size[__SIZEOF_PTHREAD_MUTEX_T];
long int __align;
@@ -214,9 +192,4 @@ typedef union
#endif
-#if __WORDSIZE == 32
-/* Extra attributes for the cleanup functions. */
-# define __cleanup_fct_attribute __attribute__ ((__regparm__ (1)))
-#endif
-
#endif /* bits/pthreadtypes.h */
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/clone.S b/nptl/sysdeps/unix/sysv/linux/x86_64/clone.S
index 675a997e97..dfa6adb3e2 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/clone.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/clone.S
@@ -1,9 +1,2 @@
-/* We want an #include_next, but we are the main source file.
- So, #include ourselves and in that incarnation we can use #include_next. */
-#ifndef INCLUDED_SELF
-# define INCLUDED_SELF
-# include <clone.S>
-#else
-# define RESET_PID
-# include_next <clone.S>
-#endif
+#define RESET_PID
+#include <sysdeps/unix/sysv/linux/x86_64/clone.S>
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S
index 394dec8d82..d5c9345558 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002-2006, 2007 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -43,25 +43,17 @@
.hidden __lll_mutex_lock_wait
.align 16
__lll_mutex_lock_wait:
- cfi_startproc
pushq %r10
- cfi_adjust_cfa_offset(8)
pushq %rdx
- cfi_adjust_cfa_offset(8)
- cfi_offset(%r10, -16)
- cfi_offset(%rdx, -24)
+
xorq %r10, %r10 /* No timeout. */
movl $2, %edx
-#if FUTEX_WAIT == 0
- xorl %esi, %esi
-#else
- movl $FUTEX_WAIT, %esi
-#endif
+ movq %r10, %rsi /* movq $FUTEX_WAIT, %rsi */
cmpl %edx, %eax /* NB: %edx == 2 */
jne 2f
-1: movl $SYS_futex, %eax
+1: movq $SYS_futex, %rax
syscall
2: movl %edx, %eax
@@ -71,13 +63,8 @@ __lll_mutex_lock_wait:
jnz 1b
popq %rdx
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%rdx)
popq %r10
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r10)
retq
- cfi_endproc
.size __lll_mutex_lock_wait,.-__lll_mutex_lock_wait
@@ -87,30 +74,18 @@ __lll_mutex_lock_wait:
.hidden __lll_mutex_timedlock_wait
.align 16
__lll_mutex_timedlock_wait:
- cfi_startproc
/* Check for a valid timeout value. */
cmpq $1000000000, 8(%rdx)
jae 3f
pushq %r8
- cfi_adjust_cfa_offset(8)
pushq %r9
- cfi_adjust_cfa_offset(8)
pushq %r12
- cfi_adjust_cfa_offset(8)
pushq %r13
- cfi_adjust_cfa_offset(8)
pushq %r14
- cfi_adjust_cfa_offset(8)
- cfi_offset(%r8, -16)
- cfi_offset(%r9, -24)
- cfi_offset(%r12, -32)
- cfi_offset(%r13, -40)
- cfi_offset(%r14, -48)
/* Stack frame for the timespec and timeval structs. */
subq $16, %rsp
- cfi_adjust_cfa_offset(16)
movq %rdi, %r12
movq %rdx, %r13
@@ -118,7 +93,7 @@ __lll_mutex_timedlock_wait:
1:
/* Get current time. */
movq %rsp, %rdi
- xorl %esi, %esi
+ xorq %rsi, %rsi
movq $VSYSCALL_ADDR_vgettimeofday, %rax
/* This is a regular function call, all caller-save registers
might be clobbered. */
@@ -126,7 +101,7 @@ __lll_mutex_timedlock_wait:
/* Compute relative timeout. */
movq 8(%rsp), %rax
- movl $1000, %edi
+ movq $1000, %rdi
mul %rdi /* Milli seconds to nano seconds. */
movq (%r13), %rdi
movq 8(%r13), %rsi
@@ -151,50 +126,26 @@ __lll_mutex_timedlock_wait:
je 8f
movq %rsp, %r10
-#if FUTEX_WAIT == 0
- xorl %esi, %esi
-#else
- movl $FUTEX_WAIT, %esi
-#endif
+ xorq %rsi, %rsi /* movq $FUTEX_WAIT, %rsi */
movq %r12, %rdi
- movl $SYS_futex, %eax
+ movq $SYS_futex, %rax
syscall
movq %rax, %rcx
8: /* NB: %edx == 2 */
xorl %eax, %eax
LOCK
- cmpxchgl %edx, (%r12)
+ cmpxchgl %edx, (%rdi)
jnz 7f
6: addq $16, %rsp
- cfi_adjust_cfa_offset(-16)
popq %r14
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r14)
popq %r13
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r13)
popq %r12
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r12)
popq %r9
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r9)
popq %r8
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r8)
retq
-3: movl $EINVAL, %eax
- retq
-
- cfi_adjust_cfa_offset(56)
- cfi_offset(%r8, -16)
- cfi_offset(%r9, -24)
- cfi_offset(%r12, -32)
- cfi_offset(%r13, -40)
- cfi_offset(%r14, -48)
/* Check whether the time expired. */
7: cmpq $-ETIMEDOUT, %rcx
je 5f
@@ -206,9 +157,11 @@ __lll_mutex_timedlock_wait:
jz 6b
jmp 1b
+3: movl $EINVAL, %eax
+ retq
+
5: movl $ETIMEDOUT, %eax
jmp 6b
- cfi_endproc
.size __lll_mutex_timedlock_wait,.-__lll_mutex_timedlock_wait
#endif
@@ -238,28 +191,18 @@ lll_unlock_wake_cb:
.hidden __lll_mutex_unlock_wake
.align 16
__lll_mutex_unlock_wake:
- cfi_startproc
pushq %rsi
- cfi_adjust_cfa_offset(8)
pushq %rdx
- cfi_adjust_cfa_offset(8)
- cfi_offset(%rsi, -16)
- cfi_offset(%rdx, -24)
movl $0, (%rdi)
- movl $FUTEX_WAKE, %esi
+ movq $FUTEX_WAKE, %rsi
movl $1, %edx /* Wake one thread. */
- movl $SYS_futex, %eax
+ movq $SYS_futex, %rax
syscall
popq %rdx
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%rdx)
popq %rsi
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%rsi)
retq
- cfi_endproc
.size __lll_mutex_unlock_wake,.-__lll_mutex_unlock_wake
@@ -279,13 +222,13 @@ __lll_timedwait_tid:
/* Get current time. */
2: movq %rsp, %rdi
- xorl %esi, %esi
+ xorq %rsi, %rsi
movq $VSYSCALL_ADDR_vgettimeofday, %rax
callq *%rax
/* Compute relative timeout. */
movq 8(%rsp), %rax
- movl $1000, %edi
+ movq $1000, %rdi
mul %rdi /* Milli seconds to nano seconds. */
movq (%r13), %rdi
movq 8(%r13), %rsi
@@ -305,13 +248,9 @@ __lll_timedwait_tid:
jz 4f
movq %rsp, %r10
-#if FUTEX_WAIT == 0
- xorl %esi, %esi
-#else
- movl $FUTEX_WAIT, %esi
-#endif
+ xorq %rsi, %rsi /* movq $FUTEX_WAIT, %rsi */
movq %r12, %rdi
- movl $SYS_futex, %eax
+ movq $SYS_futex, %rax
syscall
cmpl $0, (%rdi)
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
index 97085bf018..40c2518af6 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -35,9 +35,6 @@
#define SYS_futex 202
#define FUTEX_WAIT 0
#define FUTEX_WAKE 1
-#define FUTEX_LOCK_PI 6
-#define FUTEX_UNLOCK_PI 7
-#define FUTEX_TRYLOCK_PI 8
/* Initializer for compatibility lock. */
@@ -49,130 +46,17 @@
#define BUSY_WAIT_NOP asm ("rep; nop")
-#define LLL_STUB_UNWIND_INFO_START \
- ".section .eh_frame,\"a\",@progbits\n" \
-"7:\t" ".long 9f-8f # Length of Common Information Entry\n" \
-"8:\t" ".long 0x0 # CIE Identifier Tag\n\t" \
- ".byte 0x1 # CIE Version\n\t" \
- ".ascii \"zR\\0\" # CIE Augmentation\n\t" \
- ".uleb128 0x1 # CIE Code Alignment Factor\n\t" \
- ".sleb128 -8 # CIE Data Alignment Factor\n\t" \
- ".byte 0x10 # CIE RA Column\n\t" \
- ".uleb128 0x1 # Augmentation size\n\t" \
- ".byte 0x1b # FDE Encoding (pcrel sdata4)\n\t" \
- ".byte 0x12 # DW_CFA_def_cfa_sf\n\t" \
- ".uleb128 0x7\n\t" \
- ".sleb128 16\n\t" \
- ".align 8\n" \
-"9:\t" ".long 23f-10f # FDE Length\n" \
-"10:\t" ".long 10b-7b # FDE CIE offset\n\t" \
- ".long 1b-. # FDE initial location\n\t" \
- ".long 6b-1b # FDE address range\n\t" \
- ".uleb128 0x0 # Augmentation size\n\t" \
- ".byte 0x16 # DW_CFA_val_expression\n\t" \
- ".uleb128 0x10\n\t" \
- ".uleb128 12f-11f\n" \
-"11:\t" ".byte 0x80 # DW_OP_breg16\n\t" \
- ".sleb128 4b-1b\n"
-#define LLL_STUB_UNWIND_INFO_END \
- ".byte 0x16 # DW_CFA_val_expression\n\t" \
- ".uleb128 0x10\n\t" \
- ".uleb128 14f-13f\n" \
-"13:\t" ".byte 0x80 # DW_OP_breg16\n\t" \
- ".sleb128 4b-2b\n" \
-"14:\t" ".byte 0x40 + (3b-2b) # DW_CFA_advance_loc\n\t" \
- ".byte 0x0e # DW_CFA_def_cfa_offset\n\t" \
- ".uleb128 0\n\t" \
- ".byte 0x16 # DW_CFA_val_expression\n\t" \
- ".uleb128 0x10\n\t" \
- ".uleb128 16f-15f\n" \
-"15:\t" ".byte 0x80 # DW_OP_breg16\n\t" \
- ".sleb128 4b-3b\n" \
-"16:\t" ".byte 0x40 + (4b-3b-1) # DW_CFA_advance_loc\n\t" \
- ".byte 0x0e # DW_CFA_def_cfa_offset\n\t" \
- ".uleb128 128\n\t" \
- ".byte 0x16 # DW_CFA_val_expression\n\t" \
- ".uleb128 0x10\n\t" \
- ".uleb128 20f-17f\n" \
-"17:\t" ".byte 0x80 # DW_OP_breg16\n\t" \
- ".sleb128 19f-18f\n\t" \
- ".byte 0x0d # DW_OP_const4s\n" \
-"18:\t" ".4byte 4b-.\n\t" \
- ".byte 0x1c # DW_OP_minus\n\t" \
- ".byte 0x0d # DW_OP_const4s\n" \
-"19:\t" ".4byte 24f-.\n\t" \
- ".byte 0x22 # DW_OP_plus\n" \
-"20:\t" ".byte 0x40 + (5b-4b+1) # DW_CFA_advance_loc\n\t" \
- ".byte 0x13 # DW_CFA_def_cfa_offset_sf\n\t" \
- ".sleb128 16\n\t" \
- ".byte 0x16 # DW_CFA_val_expression\n\t" \
- ".uleb128 0x10\n\t" \
- ".uleb128 22f-21f\n" \
-"21:\t" ".byte 0x80 # DW_OP_breg16\n\t" \
- ".sleb128 4b-5b\n" \
-"22:\t" ".align 8\n" \
-"23:\t" ".previous\n"
-
-/* Unwind info for
- 1: leaq ..., %rdi
- 2: subq $128, %rsp
- 3: callq ...
- 4: addq $128, %rsp
- 5: jmp 24f
- 6:
- snippet. */
-#define LLL_STUB_UNWIND_INFO_5 \
-LLL_STUB_UNWIND_INFO_START \
-"12:\t" ".byte 0x40 + (2b-1b) # DW_CFA_advance_loc\n\t" \
-LLL_STUB_UNWIND_INFO_END
-
-/* Unwind info for
- 1: leaq ..., %rdi
- 0: movq ..., %rdx
- 2: subq $128, %rsp
- 3: callq ...
- 4: addq $128, %rsp
- 5: jmp 24f
- 6:
- snippet. */
-#define LLL_STUB_UNWIND_INFO_6 \
-LLL_STUB_UNWIND_INFO_START \
-"12:\t" ".byte 0x40 + (0b-1b) # DW_CFA_advance_loc\n\t" \
- ".byte 0x16 # DW_CFA_val_expression\n\t" \
- ".uleb128 0x10\n\t" \
- ".uleb128 26f-25f\n" \
-"25:\t" ".byte 0x80 # DW_OP_breg16\n\t" \
- ".sleb128 4b-0b\n" \
-"26:\t" ".byte 0x40 + (2b-0b) # DW_CFA_advance_loc\n\t" \
-LLL_STUB_UNWIND_INFO_END
-
-
#define lll_futex_wait(futex, val) \
- ({ \
- int __status; \
+ do { \
+ int __ignore; \
register __typeof (val) _val asm ("edx") = (val); \
__asm __volatile ("xorq %%r10, %%r10\n\t" \
"syscall" \
- : "=a" (__status) \
+ : "=a" (__ignore) \
: "0" (SYS_futex), "D" (futex), "S" (FUTEX_WAIT), \
"d" (_val) \
: "memory", "cc", "r10", "r11", "cx"); \
- __status; \
- })
-
-
-#define lll_futex_timed_wait(futex, val, timeout) \
- ({ \
- register const struct timespec *__to __asm__ ("r10") = timeout; \
- int __status; \
- register __typeof (val) _val asm ("edx") = (val); \
- __asm __volatile ("syscall" \
- : "=a" (__status) \
- : "0" (SYS_futex), "D" (futex), "S" (FUTEX_WAIT), \
- "d" (_val), "r" (__to) \
- : "memory", "cc", "r11", "cx"); \
- __status; \
- })
+ } while (0)
#define lll_futex_wake(futex, nr) \
@@ -212,16 +96,6 @@ extern int __lll_mutex_unlock_wait (int *__futex) attribute_hidden;
ret; })
-#define lll_robust_mutex_trylock(futex, id) \
- ({ int ret; \
- __asm __volatile (LOCK_INSTR "cmpxchgl %2, %1" \
- : "=a" (ret), "=m" (futex) \
- : "r" (id), "m" (futex), \
- "0" (LLL_MUTEX_LOCK_INITIALIZER) \
- : "memory"); \
- ret; })
-
-
#define lll_mutex_cond_trylock(futex) \
({ int ret; \
__asm __volatile (LOCK_INSTR "cmpxchgl %2, %1" \
@@ -236,109 +110,51 @@ extern int __lll_mutex_unlock_wait (int *__futex) attribute_hidden;
(void) ({ int ignore1, ignore2, ignore3; \
__asm __volatile (LOCK_INSTR "cmpxchgl %0, %2\n\t" \
"jnz 1f\n\t" \
- ".subsection 1\n\t" \
- ".type _L_mutex_lock_%=, @function\n" \
- "_L_mutex_lock_%=:\n" \
- "1:\tleaq %2, %%rdi\n" \
- "2:\tsubq $128, %%rsp\n" \
- "3:\tcallq __lll_mutex_lock_wait\n" \
- "4:\taddq $128, %%rsp\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_mutex_lock_%=, 6b-1b\n\t" \
+ ".subsection 1\n" \
+ "1:\tleaq %2, %%rdi\n\t" \
+ "subq $128, %%rsp\n\t" \
+ "callq __lll_mutex_lock_wait\n\t" \
+ "addq $128, %%rsp\n\t" \
+ "jmp 2f\n\t" \
".previous\n" \
- LLL_STUB_UNWIND_INFO_5 \
- "24:" \
+ "2:" \
: "=S" (ignore1), "=&D" (ignore2), "=m" (futex),\
"=a" (ignore3) \
: "0" (1), "m" (futex), "3" (0) \
: "cx", "r11", "cc", "memory"); })
-#define lll_robust_mutex_lock(futex, id) \
- ({ int result, ignore1, ignore2; \
- __asm __volatile (LOCK_INSTR "cmpxchgl %0, %2\n\t" \
- "jnz 1f\n\t" \
- ".subsection 1\n\t" \
- ".type _L_robust_mutex_lock_%=, @function\n" \
- "_L_robust_mutex_lock_%=:\n" \
- "1:\tleaq %2, %%rdi\n" \
- "2:\tsubq $128, %%rsp\n" \
- "3:\tcallq __lll_robust_mutex_lock_wait\n" \
- "4:\taddq $128, %%rsp\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_robust_mutex_lock_%=, 6b-1b\n\t" \
- ".previous\n" \
- LLL_STUB_UNWIND_INFO_5 \
- "24:" \
- : "=S" (ignore1), "=&D" (ignore2), "=m" (futex), \
- "=a" (result) \
- : "0" (id), "m" (futex), "3" (0) \
- : "cx", "r11", "cc", "memory"); \
- result; })
-
-
#define lll_mutex_cond_lock(futex) \
(void) ({ int ignore1, ignore2, ignore3; \
__asm __volatile (LOCK_INSTR "cmpxchgl %0, %2\n\t" \
"jnz 1f\n\t" \
- ".subsection 1\n\t" \
- ".type _L_mutex_cond_lock_%=, @function\n" \
- "_L_mutex_cond_lock_%=:\n" \
- "1:\tleaq %2, %%rdi\n" \
- "2:\tsubq $128, %%rsp\n" \
- "3:\tcallq __lll_mutex_lock_wait\n" \
- "4:\taddq $128, %%rsp\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_mutex_cond_lock_%=, 6b-1b\n\t" \
+ ".subsection 1\n" \
+ "1:\tleaq %2, %%rdi\n\t" \
+ "subq $128, %%rsp\n\t" \
+ "callq __lll_mutex_lock_wait\n\t" \
+ "addq $128, %%rsp\n\t" \
+ "jmp 2f\n\t" \
".previous\n" \
- LLL_STUB_UNWIND_INFO_5 \
- "24:" \
+ "2:" \
: "=S" (ignore1), "=&D" (ignore2), "=m" (futex),\
"=a" (ignore3) \
: "0" (2), "m" (futex), "3" (0) \
: "cx", "r11", "cc", "memory"); })
-#define lll_robust_mutex_cond_lock(futex, id) \
- ({ int result, ignore1, ignore2; \
- __asm __volatile (LOCK_INSTR "cmpxchgl %0, %2\n\t" \
- "jnz 1f\n\t" \
- ".subsection 1\n\t" \
- ".type _L_robust_mutex_cond_lock_%=, @function\n" \
- "_L_robust_mutex_cond_lock_%=:\n" \
- "1:\tleaq %2, %%rdi\n" \
- "2:\tsubq $128, %%rsp\n" \
- "3:\tcallq __lll_robust_mutex_lock_wait\n" \
- "4:\taddq $128, %%rsp\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_robust_mutex_cond_lock_%=, 6b-1b\n\t" \
- ".previous\n" \
- LLL_STUB_UNWIND_INFO_5 \
- "24:" \
- : "=S" (ignore1), "=&D" (ignore2), "=m" (futex), \
- "=a" (result) \
- : "0" (id | FUTEX_WAITERS), "m" (futex), "3" (0) \
- : "cx", "r11", "cc", "memory"); \
- result; })
-
-
#define lll_mutex_timedlock(futex, timeout) \
({ int result, ignore1, ignore2, ignore3; \
__asm __volatile (LOCK_INSTR "cmpxchgl %2, %4\n\t" \
"jnz 1f\n\t" \
- ".subsection 1\n\t" \
- ".type _L_mutex_timedlock_%=, @function\n" \
- "_L_mutex_timedlock_%=:\n" \
- "1:\tleaq %4, %%rdi\n" \
- "0:\tmovq %8, %%rdx\n" \
- "2:\tsubq $128, %%rsp\n" \
- "3:\tcallq __lll_mutex_timedlock_wait\n" \
- "4:\taddq $128, %%rsp\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_mutex_timedlock_%=, 6b-1b\n\t" \
+ ".subsection 1\n" \
+ "1:\tleaq %4, %%rdi\n\t" \
+ "movq %8, %%rdx\n\t" \
+ "subq $128, %%rsp\n\t" \
+ "callq __lll_mutex_timedlock_wait\n\t" \
+ "addq $128, %%rsp\n\t" \
+ "jmp 2f\n\t" \
".previous\n" \
- LLL_STUB_UNWIND_INFO_6 \
- "24:" \
+ "2:" \
: "=a" (result), "=&D" (ignore1), "=S" (ignore2), \
"=&d" (ignore3), "=m" (futex) \
: "0" (0), "2" (1), "m" (futex), "m" (timeout) \
@@ -346,83 +162,23 @@ extern int __lll_mutex_unlock_wait (int *__futex) attribute_hidden;
result; })
-#define lll_robust_mutex_timedlock(futex, timeout, id) \
- ({ int result, ignore1, ignore2, ignore3; \
- __asm __volatile (LOCK_INSTR "cmpxchgl %2, %4\n\t" \
- "jnz 1f\n\t" \
- ".subsection 1\n\t" \
- ".type _L_robust_mutex_timedlock_%=, @function\n" \
- "_L_robust_mutex_timedlock_%=:\n" \
- "1:\tleaq %4, %%rdi\n" \
- "0:\tmovq %8, %%rdx\n" \
- "2:\tsubq $128, %%rsp\n" \
- "3:\tcallq __lll_robust_mutex_timedlock_wait\n" \
- "4:\taddq $128, %%rsp\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_robust_mutex_timedlock_%=, 6b-1b\n\t" \
- ".previous\n" \
- LLL_STUB_UNWIND_INFO_6 \
- "24:" \
- : "=a" (result), "=&D" (ignore1), "=S" (ignore2), \
- "=&d" (ignore3), "=m" (futex) \
- : "0" (0), "2" (id), "m" (futex), "m" (timeout) \
- : "memory", "cx", "cc", "r10", "r11"); \
- result; })
-
-
#define lll_mutex_unlock(futex) \
(void) ({ int ignore; \
__asm __volatile (LOCK_INSTR "decl %0\n\t" \
"jne 1f\n\t" \
- ".subsection 1\n\t" \
- ".type _L_mutex_unlock_%=, @function\n" \
- "_L_mutex_unlock_%=:\n" \
- "1:\tleaq %0, %%rdi\n" \
- "2:\tsubq $128, %%rsp\n" \
- "3:\tcallq __lll_mutex_unlock_wake\n" \
- "4:\taddq $128, %%rsp\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_mutex_unlock_%=, 6b-1b\n\t" \
+ ".subsection 1\n" \
+ "1:\tleaq %0, %%rdi\n\t" \
+ "subq $128, %%rsp\n\t" \
+ "callq __lll_mutex_unlock_wake\n\t" \
+ "addq $128, %%rsp\n\t" \
+ "jmp 2f\n\t" \
".previous\n" \
- LLL_STUB_UNWIND_INFO_5 \
- "24:" \
+ "2:" \
: "=m" (futex), "=&D" (ignore) \
: "m" (futex) \
: "ax", "cx", "r11", "cc", "memory"); })
-#define lll_robust_mutex_unlock(futex) \
- (void) ({ int ignore; \
- __asm __volatile (LOCK_INSTR "andl %2, %0\n\t" \
- "jne 1f\n\t" \
- ".subsection 1\n\t" \
- ".type _L_robust_mutex_unlock_%=, @function\n" \
- "_L_robust_mutex_unlock_%=:\n" \
- "1:\tleaq %0, %%rdi\n" \
- "2:\tsubq $128, %%rsp\n" \
- "3:\tcallq __lll_mutex_unlock_wake\n" \
- "4:\taddq $128, %%rsp\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_robust_mutex_unlock_%=, 6b-1b\n\t"\
- ".previous\n" \
- LLL_STUB_UNWIND_INFO_5 \
- "24:" \
- : "=m" (futex), "=&D" (ignore) \
- : "i" (FUTEX_WAITERS), "m" (futex) \
- : "ax", "cx", "r11", "cc", "memory"); })
-
-
-#define lll_robust_mutex_dead(futex) \
- (void) ({ int ignore; \
- __asm __volatile (LOCK_INSTR "orl %3, (%2)\n\t" \
- "syscall" \
- : "=m" (futex), "=a" (ignore) \
- : "D" (&(futex)), "i" (FUTEX_OWNER_DIED), \
- "S" (FUTEX_WAKE), "1" (__NR_futex), \
- "d" (1) \
- : "cx", "r11", "cc", "memory"); })
-
-
#define lll_mutex_islocked(futex) \
(futex != LLL_MUTEX_LOCK_INITIALIZER)
@@ -481,21 +237,17 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden;
"je 0f\n\t" \
"lock; cmpxchgl %0, %2\n\t" \
"jnz 1f\n\t" \
- "jmp 24f\n" \
+ "jmp 2f\n" \
"0:\tcmpxchgl %0, %2\n\t" \
"jnz 1f\n\t" \
- ".subsection 1\n\t" \
- ".type _L_lock_%=, @function\n" \
- "_L_lock_%=:\n" \
- "1:\tleaq %2, %%rdi\n" \
- "2:\tsubq $128, %%rsp\n" \
- "3:\tcallq __lll_mutex_lock_wait\n" \
- "4:\taddq $128, %%rsp\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_lock_%=, 6b-1b\n\t" \
+ ".subsection 1\n" \
+ "1:\tleaq %2, %%rdi\n\t" \
+ "subq $128, %%rsp\n\t" \
+ "callq __lll_mutex_lock_wait\n\t" \
+ "addq $128, %%rsp\n\t" \
+ "jmp 2f\n\t" \
".previous\n" \
- LLL_STUB_UNWIND_INFO_5 \
- "24:" \
+ "2:" \
: "=S" (ignore1), "=&D" (ignore2), "=m" (futex),\
"=a" (ignore3) \
: "0" (1), "m" (futex), "3" (0) \
@@ -508,21 +260,17 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden;
"je 0f\n\t" \
"lock; decl %0\n\t" \
"jne 1f\n\t" \
- "jmp 24f\n" \
+ "jmp 2f\n" \
"0:\tdecl %0\n\t" \
"jne 1f\n\t" \
- ".subsection 1\n\t" \
- ".type _L_unlock_%=, @function\n" \
- "_L_unlock_%=:\n" \
- "1:\tleaq %0, %%rdi\n" \
- "2:\tsubq $128, %%rsp\n" \
- "3:\tcallq __lll_mutex_unlock_wake\n" \
- "4:\taddq $128, %%rsp\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_unlock_%=, 6b-1b\n\t" \
+ ".subsection 1\n" \
+ "1:\tleaq %0, %%rdi\n\t" \
+ "subq $128, %%rsp\n\t" \
+ "callq __lll_mutex_unlock_wake\n\t" \
+ "addq $128, %%rsp\n\t" \
+ "jmp 2f\n\t" \
".previous\n" \
- LLL_STUB_UNWIND_INFO_5 \
- "24:" \
+ "2:" \
: "=m" (futex), "=&D" (ignore) \
: "m" (futex) \
: "ax", "cx", "r11", "cc", "memory"); })
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S
deleted file mode 100644
index 69243950d7..0000000000
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S
+++ /dev/null
@@ -1,229 +0,0 @@
-/* Copyright (C) 2002, 2003, 2004, 2005, 2006 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 <pthread-errnos.h>
-#include <lowlevelrobustlock.h>
-
- .text
-
-#ifndef LOCK
-# ifdef UP
-# define LOCK
-# else
-# define LOCK lock
-# endif
-#endif
-
-#define SYS_futex 202
-#define FUTEX_WAIT 0
-#define FUTEX_WAKE 1
-#define FUTEX_WAITERS 0x80000000
-#define FUTEX_OWNER_DIED 0x40000000
-
-/* For the calculation see asm/vsyscall.h. */
-#define VSYSCALL_ADDR_vgettimeofday 0xffffffffff600000
-
-
- .globl __lll_robust_mutex_lock_wait
- .type __lll_robust_mutex_lock_wait,@function
- .hidden __lll_robust_mutex_lock_wait
- .align 16
-__lll_robust_mutex_lock_wait:
- cfi_startproc
- pushq %r10
- cfi_adjust_cfa_offset(8)
- pushq %rdx
- cfi_adjust_cfa_offset(8)
- cfi_offset(%r10, -16)
- cfi_offset(%rdx, -24)
-
- xorq %r10, %r10 /* No timeout. */
-#if FUTEX_WAIT == 0
- xorl %esi, %esi
-#else
- movl $FUTEX_WAIT, %esi
-#endif
-
-4: movl %eax, %edx
- orl $FUTEX_WAITERS, %edx
-
- testl $FUTEX_OWNER_DIED, %eax
- jnz 3f
-
- cmpl %edx, %eax
- je 1f
-
- LOCK
- cmpxchgl %edx, (%rdi)
- jnz 2f
-
-1: movl $SYS_futex, %eax
- syscall
-
- movl (%rdi), %eax
-
-2: testl %eax, %eax
- jne 4b
-
- movl %fs:TID, %edx
- orl $FUTEX_WAITERS, %edx
- LOCK
- cmpxchgl %edx, (%rdi)
- jnz 4b
- /* NB: %rax == 0 */
-
-3: popq %rdx
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%rdx)
- popq %r10
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r10)
- retq
- cfi_endproc
- .size __lll_robust_mutex_lock_wait,.-__lll_robust_mutex_lock_wait
-
-
- .globl __lll_robust_mutex_timedlock_wait
- .type __lll_robust_mutex_timedlock_wait,@function
- .hidden __lll_robust_mutex_timedlock_wait
- .align 16
-__lll_robust_mutex_timedlock_wait:
- cfi_startproc
- /* Check for a valid timeout value. */
- cmpq $1000000000, 8(%rdx)
- jae 3f
-
- pushq %r8
- cfi_adjust_cfa_offset(8)
- pushq %r9
- cfi_adjust_cfa_offset(8)
- pushq %r12
- cfi_adjust_cfa_offset(8)
- pushq %r13
- cfi_adjust_cfa_offset(8)
- cfi_offset(%r8, -16)
- cfi_offset(%r9, -24)
- cfi_offset(%r12, -32)
- cfi_offset(%r13, -40)
-
- /* Stack frame for the timespec and timeval structs. */
- subq $24, %rsp
- cfi_adjust_cfa_offset(24)
-
- movq %rdi, %r12
- movq %rdx, %r13
-
-1: movq %rax, 16(%rsp)
-
- /* Get current time. */
- movq %rsp, %rdi
- xorl %esi, %esi
- movq $VSYSCALL_ADDR_vgettimeofday, %rax
- /* This is a regular function call, all caller-save registers
- might be clobbered. */
- callq *%rax
-
- /* Compute relative timeout. */
- movq 8(%rsp), %rax
- movl $1000, %edi
- mul %rdi /* Milli seconds to nano seconds. */
- movq (%r13), %rdi
- movq 8(%r13), %rsi
- subq (%rsp), %rdi
- subq %rax, %rsi
- jns 4f
- addq $1000000000, %rsi
- decq %rdi
-4: testq %rdi, %rdi
- js 8f /* Time is already up. */
-
- /* Futex call. */
- movq %rdi, (%rsp) /* Store relative timeout. */
- movq %rsi, 8(%rsp)
-
- movq 16(%rsp), %rdx
- movl %edx, %eax
- orl $FUTEX_WAITERS, %edx
-
- testl $FUTEX_OWNER_DIED, %eax
- jnz 6f
-
- cmpl %eax, %edx
- je 2f
-
- LOCK
- cmpxchgl %edx, (%r12)
- movq $0, %rcx /* Must use mov to avoid changing cc. */
- jnz 5f
-
-2: movq %rsp, %r10
-#if FUTEX_WAIT == 0
- xorl %esi, %esi
-#else
- movl $FUTEX_WAIT, %esi
-#endif
- movq %r12, %rdi
- movl $SYS_futex, %eax
- syscall
- movq %rax, %rcx
-
- movl (%r12), %eax
-
-5: testl %eax, %eax
- jne 7f
-
- movl %fs:TID, %edx
- orl $FUTEX_WAITERS, %edx
- LOCK
- cmpxchgl %edx, (%r12)
- jnz 7f
-
-6: addq $24, %rsp
- cfi_adjust_cfa_offset(-24)
- popq %r13
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r13)
- popq %r12
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r12)
- popq %r9
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r9)
- popq %r8
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r8)
- retq
-
-3: movl $EINVAL, %eax
- retq
-
- cfi_adjust_cfa_offset(56)
- cfi_offset(%r8, -16)
- cfi_offset(%r9, -24)
- cfi_offset(%r12, -32)
- cfi_offset(%r13, -40)
- /* Check whether the time expired. */
-7: cmpq $-ETIMEDOUT, %rcx
- jne 1b
-
-8: movl $ETIMEDOUT, %eax
- jmp 6b
- cfi_endproc
- .size __lll_robust_mutex_timedlock_wait,.-__lll_robust_mutex_timedlock_wait
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S
index fa8125dd87..e1593f32ff 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -63,14 +63,9 @@ pthread_barrier_wait:
/* Wait for the remaining threads. The call will return immediately
if the CURR_EVENT memory has meanwhile been changed. */
-7:
-#if FUTEX_WAIT == 0
- xorl %esi, %esi
-#else
- movl $FUTEX_WAIT, %esi
-#endif
+7: xorq %rsi, %rsi /* movq $FUTEX_WAIT, %rsi */
xorq %r10, %r10
-8: movl $SYS_futex, %eax
+8: movq $SYS_futex, %rax
syscall
/* Don't return on spurious wakeups. The syscall does not change
@@ -115,8 +110,8 @@ pthread_barrier_wait:
/* Wake up all waiters. The count is a signed number in the kernel
so 0x7fffffff is the highest value. */
movl $0x7fffffff, %edx
- movl $FUTEX_WAKE, %esi
- movl $SYS_futex, %eax
+ movq $FUTEX_WAKE, %rsi
+ movq $SYS_futex, %rax
syscall
/* Increment LEFT. If this brings the count back to the
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S
index 006de2696e..e8d7bd9bb6 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -21,7 +21,6 @@
#include <shlib-compat.h>
#include <lowlevelcond.h>
#include <kernel-features.h>
-#include <pthread-pi-defines.h>
#ifdef UP
# define LOCK
@@ -81,15 +80,11 @@ __pthread_cond_broadcast:
8: cmpq $-1, %r8
je 9f
- /* XXX: The kernel so far doesn't support requeue to PI futex. */
- testl $PI_BIT, MUTEX_KIND(%r8)
- jne 9f
-
/* Wake up all threads. */
- movl $FUTEX_CMP_REQUEUE, %esi
- movl $SYS_futex, %eax
+ movq $FUTEX_CMP_REQUEUE, %rsi
+ movq $SYS_futex, %rax
movl $1, %edx
- movl $0x7fffffff, %r10d
+ movq $0x7fffffff, %r10
syscall
/* For any kind of error, which mainly is EAGAIN, we try again
@@ -133,9 +128,9 @@ __pthread_cond_broadcast:
jmp 8b
9: /* The futex requeue functionality is not available. */
- movl $0x7fffffff, %edx
- movl $FUTEX_WAKE, %esi
- movl $SYS_futex, %eax
+ movq $0x7fffffff, %rdx
+ movq $FUTEX_WAKE, %rsi
+ movq $SYS_futex, %rax
syscall
jmp 10b
.size __pthread_cond_broadcast, .-__pthread_cond_broadcast
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S
index 3dbb9e81e3..62bb74cc1a 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -31,9 +31,7 @@
#define SYS_futex 202
#define FUTEX_WAIT 0
#define FUTEX_WAKE 1
-#define FUTEX_WAKE_OP 5
-
-#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE ((4 << 24) | 1)
+#define FUTEX_REQUEUE 3
#define EINVAL 22
@@ -68,30 +66,9 @@ __pthread_cond_signal:
addl $1, (%rdi)
/* Wake up one thread. */
- movl $FUTEX_WAKE_OP, %esi
- movl $SYS_futex, %eax
- movl $1, %edx
- movl $1, %r10d
-#if cond_lock != 0
- addq $cond_lock, %r8
-#endif
- movl $FUTEX_OP_CLEAR_WAKE_IF_GT_ONE, %r9d
- syscall
-#if cond_lock != 0
- subq $cond_lock, %r8
-#endif
- /* For any kind of error, we try again with WAKE.
- The general test also covers running on old kernels. */
- cmpq $-4095, %rax
- jae 7f
-
- xorl %eax, %eax
- retq
-
-7: movl $FUTEX_WAKE, %esi
- movl $SYS_futex, %eax
- /* %rdx should be 1 already from $FUTEX_WAKE_OP syscall.
- movl $1, %edx */
+ movq $FUTEX_WAKE, %rsi
+ movq $SYS_futex, %rax
+ movq $1, %rdx
syscall
/* Unlock. */
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
index ad3ae1e76e..67bec6caa7 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -56,7 +56,7 @@ __pthread_cond_timedwait:
.Lsubq:
cmpq $1000000000, 8(%rdx)
- movl $EINVAL, %eax
+ movq $EINVAL, %rax
jae 18f
/* Stack frame:
@@ -102,7 +102,7 @@ __pthread_cond_timedwait:
/* Unlock the mutex. */
2: movq 16(%rsp), %rdi
- xorl %esi, %esi
+ xorq %rsi, %rsi
callq __pthread_mutex_unlock_usercnt
testl %eax, %eax
@@ -141,7 +141,7 @@ __pthread_cond_timedwait:
/* Only clocks 0 and 1 are allowed so far. Both are handled in the
kernel. */
leaq 24(%rsp), %rsi
- movl $__NR_clock_gettime, %eax
+ movq $__NR_clock_gettime, %rax
syscall
# ifndef __ASSUME_POSIX_TIMERS
cmpq $-ENOSYS, %rax
@@ -155,13 +155,13 @@ __pthread_cond_timedwait:
subq 32(%rsp), %rdx
#else
leaq 24(%rsp), %rdi
- xorl %esi, %esi
+ xorq %rsi, %rsi
movq $VSYSCALL_ADDR_vgettimeofday, %rax
callq *%rax
/* Compute relative timeout. */
movq 32(%rsp), %rax
- movl $1000, %edx
+ movq $1000, %rdx
mul %rdx /* Milli seconds to nano seconds. */
movq (%r13), %rcx
movq 8(%r13), %rdx
@@ -195,14 +195,10 @@ __pthread_cond_timedwait:
movl %eax, (%rsp)
leaq 24(%rsp), %r10
-#if FUTEX_WAIT == 0
- xorl %esi, %esi
-#else
- movl $FUTEX_WAIT, %esi
-#endif
+ xorq %rsi, %rsi /* movq $FUTEX_WAIT, %rsi */
movq %r12, %rdx
addq $cond_futex, %rdi
- movl $SYS_futex, %eax
+ movq $SYS_futex, %rax
syscall
movq %rax, %r14
@@ -241,7 +237,7 @@ __pthread_cond_timedwait:
13: incq wakeup_seq(%rdi)
incl cond_futex(%rdi)
- movl $ETIMEDOUT, %r14d
+ movq $ETIMEDOUT, %r14
jmp 14f
23: xorq %r14, %r14
@@ -260,8 +256,8 @@ __pthread_cond_timedwait:
jne 25f
addq $cond_nwaiters, %rdi
- movl $SYS_futex, %eax
- movl $FUTEX_WAKE, %esi
+ movq $SYS_futex, %rax
+ movq $FUTEX_WAKE, %rsi
movl $1, %edx
syscall
subq $cond_nwaiters, %rdi
@@ -353,13 +349,13 @@ __pthread_cond_timedwait:
#if defined __NR_clock_gettime && !defined __ASSUME_POSIX_TIMERS
/* clock_gettime not available. */
19: leaq 24(%rsp), %rdi
- xorl %esi, %esi
+ xorq %rsi, %rsi
movq $VSYSCALL_ADDR_vgettimeofday, %rax
callq *%rax
/* Compute relative timeout. */
movq 32(%rsp), %rax
- movl $1000, %edx
+ movq $1000, %rdx
mul %rdx /* Milli seconds to nano seconds. */
movq (%r13), %rcx
movq 8(%r13), %rdx
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
index 969e80da2a..f5de0a280c 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -67,15 +67,9 @@ __condvar_cleanup:
cmpl 4(%r8), %edx
jne 3f
- /* We increment the wakeup_seq counter only if it is lower than
- total_seq. If this is not the case the thread was woken and
- then canceled. In this case we ignore the signal. */
- movq total_seq(%rdi), %rax
- cmpq wakeup_seq(%rdi), %rax
- jbe 6f
incq wakeup_seq(%rdi)
+ incq woken_seq(%rdi)
incl cond_futex(%rdi)
-6: incq woken_seq(%rdi)
3: subl $(1 << clock_bits), cond_nwaiters(%rdi)
@@ -88,12 +82,12 @@ __condvar_cleanup:
jne 4f
addq $cond_nwaiters, %rdi
- movl $SYS_futex, %eax
- movl $FUTEX_WAKE, %esi
+ movq $SYS_futex, %rax
+ movq $FUTEX_WAKE, %rsi
movl $1, %edx
syscall
subq $cond_nwaiters, %rdi
- movl $1, %r12d
+ movq $1, %r12
4: LOCK
#if cond_lock == 0
@@ -111,9 +105,9 @@ __condvar_cleanup:
2: testq %r12, %r12
jnz 5f
addq $cond_futex, %rdi
- movl $FUTEX_WAKE, %esi
+ movq $FUTEX_WAKE, %rsi
movl $0x7fffffff, %edx
- movl $SYS_futex, %eax
+ movq $SYS_futex, %rax
syscall
5: movq 16(%r8), %rdi
@@ -176,7 +170,7 @@ __pthread_cond_wait:
/* Unlock the mutex. */
2: movq 16(%rsp), %rdi
- xorl %esi, %esi
+ xorq %rsi, %rsi
callq __pthread_mutex_unlock_usercnt
testl %eax, %eax
@@ -221,12 +215,8 @@ __pthread_cond_wait:
xorq %r10, %r10
movq %r12, %rdx
addq $cond_futex-cond_lock, %rdi
- movl $SYS_futex, %eax
-#if FUTEX_WAIT == 0
- xorl %esi, %esi
-#else
- movl $FUTEX_WAIT, %esi
-#endif
+ movq $SYS_futex, %rax
+ movq %r10, %rsi /* movq $FUTEX_WAIT, %rsi */
syscall
movl (%rsp), %edi
@@ -272,8 +262,8 @@ __pthread_cond_wait:
jne 17f
addq $cond_nwaiters, %rdi
- movl $SYS_futex, %eax
- movl $FUTEX_WAKE, %esi
+ movq $SYS_futex, %rax
+ movq $FUTEX_WAKE, %rsi
movl $1, %edx
syscall
subq $cond_nwaiters, %rdi
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S
index 9db5516913..3fec0f4205 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+/* 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.
@@ -74,23 +74,17 @@ __pthread_once:
jnz 3f /* Different for generation -> run initializer. */
/* Somebody else got here first. Wait. */
-#if FUTEX_WAIT == 0
- xorl %esi, %esi
-#else
- movl $FUTEX_WAIT, %esi
-#endif
- movl $SYS_futex, %eax
+ movq %r10, %rsi /* movq $FUTEX_WAIT, %rsi */
+ movq $SYS_futex, %rax
syscall
jmp 6b
/* Preserve the pointer to the control variable. */
3: pushq %rdi
.Lpush_rdi:
- pushq %rdi
-.Lpush_rdi2:
.LcleanupSTART:
- callq *16(%rsp)
+ callq *8(%rsp)
.LcleanupEND:
/* Get the control variable address back. */
@@ -101,18 +95,15 @@ __pthread_once:
LOCK
incl (%rdi)
- addq $8, %rsp
-.Ladd1:
-
/* Wake up all other threads. */
movl $0x7fffffff, %edx
movl $FUTEX_WAKE, %esi
- movl $SYS_futex, %eax
+ movq $SYS_futex, %rax
syscall
4: addq $8, %rsp
-.Ladd2:
- xorl %eax, %eax
+.Ladd:
+ xorq %rax, %rax
retq
.size __pthread_once,.-__pthread_once
@@ -133,8 +124,8 @@ clear_once_control:
movl $0, (%rdi)
movl $0x7fffffff, %edx
- movl $FUTEX_WAKE, %esi
- movl $SYS_futex, %eax
+ movq $FUTEX_WAKE, %rsi
+ movq $SYS_futex, %rax
syscall
movq %r8, %rdi
@@ -229,28 +220,20 @@ clear_once_control:
.byte 14 # DW_CFA_def_cfa_offset
.uleb128 24
.byte 4 # DW_CFA_advance_loc4
- .long .Lpush_rdi2-.Lpush_rdi
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 32
- .byte 4 # DW_CFA_advance_loc4
- .long .Lpop_rdi-.Lpush_rdi2
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 24
- .byte 4 # DW_CFA_advance_loc4
- .long .Ladd1-.Lpop_rdi
+ .long .Lpop_rdi-.Lpush_rdi
.byte 14 # DW_CFA_def_cfa_offset
.uleb128 16
.byte 4 # DW_CFA_advance_loc4
- .long .Ladd2-.Ladd1
+ .long .Ladd-.Lpop_rdi
.byte 14 # DW_CFA_def_cfa_offset
.uleb128 8
.byte 4 # DW_CFA_advance_loc4
- .long clear_once_control-.Ladd2
+ .long clear_once_control-.Ladd
.byte 14 # DW_CFA_def_cfa_offset
- .uleb128 32
+ .uleb128 24
#if 0
.byte 4 # DW_CFA_advance_loc4
- .long .Lpop_rdi3-clear_once_control
+ .long .Lpop_rdi2-clear_once_control
.byte 14 # DW_CFA_def_cfa_offset
.uleb128 16
#endif
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S
index 5e9d8fb1d6..43c8cae34c 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+/* 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.
@@ -74,12 +74,8 @@ __pthread_rwlock_rdlock:
jne 10f
11: addq $READERS_WAKEUP, %rdi
-#if FUTEX_WAIT == 0
- xorl %esi, %esi
-#else
- movl $FUTEX_WAIT, %esi
-#endif
- movl $SYS_futex, %eax
+ movq %r10, %rsi /* movq $FUTEX_WAIT, %rsi */
+ movq $SYS_futex, %rax
syscall
subq $READERS_WAKEUP, %rdi
@@ -98,7 +94,7 @@ __pthread_rwlock_rdlock:
13: decl READERS_QUEUED(%rdi)
jmp 2b
-5: xorl %edx, %edx
+5: xorq %rdx, %rdx
incl NR_READERS(%rdi)
je 8f
9: LOCK
@@ -126,7 +122,7 @@ __pthread_rwlock_rdlock:
14: cmpl %fs:TID, %eax
jne 3b
/* Deadlock detected. */
- movl $EDEADLK, %edx
+ movq $EDEADLK, %rdx
jmp 9b
6:
@@ -141,12 +137,12 @@ __pthread_rwlock_rdlock:
/* Overflow. */
8: decl NR_READERS(%rdi)
- movl $EAGAIN, %edx
+ movq $EAGAIN, %rdx
jmp 9b
/* Overflow. */
4: decl READERS_QUEUED(%rdi)
- movl $EAGAIN, %edx
+ movq $EAGAIN, %rdx
jmp 9b
10:
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
index b44660418a..aadc90c974 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -90,13 +90,13 @@ pthread_rwlock_timedrdlock:
/* Get current time. */
11: movq %rsp, %rdi
- xorl %esi, %esi
+ xorq %rsi, %rsi
movq $VSYSCALL_ADDR_vgettimeofday, %rax
callq *%rax
/* Compute relative timeout. */
movq 8(%rsp), %rax
- movl $1000, %edi
+ movq $1000, %rdi
mul %rdi /* Milli seconds to nano seconds. */
movq (%r13), %rcx
movq 8(%r13), %rdi
@@ -112,15 +112,11 @@ pthread_rwlock_timedrdlock:
movq %rcx, (%rsp) /* Store relative timeout. */
movq %rdi, 8(%rsp)
-#if FUTEX_WAIT == 0
- xorl %esi, %esi
-#else
- movl $FUTEX_WAIT, %esi
-#endif
+ xorq %rsi, %rsi /* movq $FUTEX_WAIT, %rsi */
movq %rsp, %r10
movl %r14d, %edx
leaq READERS_WAKEUP(%r12), %rdi
- movl $SYS_futex, %eax
+ movq $SYS_futex, %rax
syscall
movq %rax, %rdx
17:
@@ -140,11 +136,11 @@ pthread_rwlock_timedrdlock:
cmpq $-ETIMEDOUT, %rdx
jne 2b
-18: movl $ETIMEDOUT, %edx
+18: movq $ETIMEDOUT, %rdx
jmp 9f
-5: xorl %edx, %edx
+5: xorq %rdx, %rdx
incl NR_READERS(%r12)
je 8f
9: LOCK
@@ -172,7 +168,7 @@ pthread_rwlock_timedrdlock:
14: cmpl %fs:TID, %eax
jne 3b
- movl $EDEADLK, %edx
+ movq $EDEADLK, %rdx
jmp 9b
6:
@@ -186,12 +182,12 @@ pthread_rwlock_timedrdlock:
/* Overflow. */
8: decl NR_READERS(%r12)
- movl $EAGAIN, %edx
+ movq $EAGAIN, %rdx
jmp 9b
/* Overflow. */
4: decl READERS_QUEUED(%r12)
- movl $EAGAIN, %edx
+ movq $EAGAIN, %rdx
jmp 9b
10:
@@ -215,6 +211,6 @@ pthread_rwlock_timedrdlock:
16: movq $-ETIMEDOUT, %rdx
jmp 17b
-19: movl $EINVAL, %edx
+19: movq $EINVAL, %rdx
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
index 525e5b6b93..ccaef47070 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+/* 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.
@@ -86,13 +86,13 @@ pthread_rwlock_timedwrlock:
/* Get current time. */
11: movq %rsp, %rdi
- xorl %esi, %esi
+ xorq %rsi, %rsi
movq $VSYSCALL_ADDR_vgettimeofday, %rax
callq *%rax
/* Compute relative timeout. */
movq 8(%rsp), %rax
- movl $1000, %edi
+ movq $1000, %rdi
mul %rdi /* Milli seconds to nano seconds. */
movq (%r13), %rcx
movq 8(%r13), %rdi
@@ -108,15 +108,11 @@ pthread_rwlock_timedwrlock:
movq %rcx, (%rsp) /* Store relative timeout. */
movq %rdi, 8(%rsp)
-#if FUTEX_WAIT == 0
- xorl %esi, %esi
-#else
- movl $FUTEX_WAIT, %esi
-#endif
+ xorq %rsi, %rsi /* movq $FUTEX_WAIT, %rsi */
movq %rsp, %r10
movl %r14d, %edx
leaq WRITERS_WAKEUP(%r12), %rdi
- movl $SYS_futex, %eax
+ movq $SYS_futex, %rax
syscall
movq %rax, %rdx
17:
@@ -136,11 +132,11 @@ pthread_rwlock_timedwrlock:
cmpq $-ETIMEDOUT, %rdx
jne 2b
-18: movl $ETIMEDOUT, %edx
+18: movq $ETIMEDOUT, %rdx
jmp 9f
-5: xorl %edx, %edx
+5: xorq %rdx, %rdx
movl %fs:TID, %eax
movl %eax, WRITER(%r12)
9: LOCK
@@ -168,7 +164,7 @@ pthread_rwlock_timedwrlock:
14: cmpl %fs:TID, %eax
jne 3b
-20: movl $EDEADLK, %edx
+20: movq $EDEADLK, %rdx
jmp 9b
6:
@@ -182,7 +178,7 @@ pthread_rwlock_timedwrlock:
/* Overflow. */
4: decl WRITERS_QUEUED(%r12)
- movl $EAGAIN, %edx
+ movq $EAGAIN, %rdx
jmp 9b
10:
@@ -206,6 +202,6 @@ pthread_rwlock_timedwrlock:
16: movq $-ETIMEDOUT, %rdx
jmp 17b
-19: movl $EINVAL, %edx
+19: movq $EINVAL, %rdx
jmp 9b
.size pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S
index 3a6b9f0bad..ac69fc0eae 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+/* 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.
@@ -56,7 +56,7 @@ __pthread_rwlock_unlock:
5: movl $0, WRITER(%rdi)
- movl $1, %esi
+ movq $1, %rsi
leaq WRITERS_WAKEUP(%rdi), %r10
movq %rsi, %rdx
cmpl $0, WRITERS_QUEUED(%rdi)
@@ -78,11 +78,11 @@ __pthread_rwlock_unlock:
#endif
jne 7f
-8: movl $SYS_futex, %eax
+8: movq $SYS_futex, %rax
movq %r10, %rdi
syscall
- xorl %eax, %eax
+ xorq %rax, %rax
retq
.align 16
@@ -94,7 +94,7 @@ __pthread_rwlock_unlock:
#endif
jne 3f
-4: xorl %eax, %eax
+4: xorq %rax, %rax
retq
1:
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S
index 0e82f890aa..1fcb07eaef 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+/* 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.
@@ -72,12 +72,8 @@ __pthread_rwlock_wrlock:
jne 10f
11: addq $WRITERS_WAKEUP, %rdi
-#if FUTEX_WAIT == 0
- xorl %esi, %esi
-#else
- movl $FUTEX_WAIT, %esi
-#endif
- movl $SYS_futex, %eax
+ movq %r10, %rsi /* movq $FUTEX_WAIT, %rsi */
+ movq $SYS_futex, %rax
syscall
subq $WRITERS_WAKEUP, %rdi
@@ -96,7 +92,7 @@ __pthread_rwlock_wrlock:
13: decl WRITERS_QUEUED(%rdi)
jmp 2b
-5: xorl %edx, %edx
+5: xorq %rdx, %rdx
movl %fs:TID, %eax
movl %eax, WRITER(%rdi)
9: LOCK
@@ -123,7 +119,7 @@ __pthread_rwlock_wrlock:
14: cmpl %fs:TID, %eax
jne 3b
- movl $EDEADLK, %edx
+ movq $EDEADLK, %rdx
jmp 9b
6:
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S
index 7f608a5974..21ec6fd226 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+/* 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.
@@ -41,8 +41,8 @@ sem_post:
LOCK
xaddl %edx, (%rdi)
- movl $SYS_futex, %eax
- movl $FUTEX_WAKE, %esi
+ movq $SYS_futex, %rax
+ movq $FUTEX_WAKE, %rsi
incl %edx
syscall
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S
index 51136cf2dc..d90e03b55b 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
+/* 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.
@@ -79,14 +79,17 @@ sem_timedwait:
cfi_offset(14, -24) /* %r14 */
jae 6f
-7: xorl %esi, %esi
+7: call __pthread_enable_asynccancel
+ movl %eax, 16(%rsp)
+
+ xorq %rsi, %rsi
movq %rsp, %rdi
movq $VSYSCALL_ADDR_vgettimeofday, %rax
callq *%rax
/* Compute relative timeout. */
movq 8(%rsp), %rax
- movl $1000, %edi
+ movq $1000, %rdi
mul %rdi /* Milli seconds to nano seconds. */
movq (%r13), %rdi
movq 8(%r13), %rsi
@@ -102,13 +105,10 @@ sem_timedwait:
movq %rdi, (%rsp) /* Store relative timeout. */
movq %rsi, 8(%rsp)
- call __pthread_enable_asynccancel
- movl %eax, 16(%rsp)
-
movq %rsp, %r10
movq %r12, %rdi
- xorl %esi, %esi
- movl $SYS_futex, %eax
+ xorq %rsi, %rsi
+ movq $SYS_futex, %rax
xorl %edx, %edx
syscall
movq %rax, %r14
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S
index 6b77dfc0d8..31271bb94c 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+/* 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.
@@ -56,3 +56,4 @@ sem_trywait:
orl $-1, %eax
retq
.size sem_trywait,.-sem_trywait
+ versioned_symbol(libpthread, __new_sem_trywait, sem_trywait, GLIBC_2_1)
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S
index 63ecd063ab..76957bc139 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+/* 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.
@@ -77,7 +77,7 @@ sem_wait:
movl %eax, %r8d
xorq %r10, %r10
- movl $SYS_futex, %eax
+ movq $SYS_futex, %rax
movq %r13, %rdi
movq %r10, %rsi
movq %r10, %rdx
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
index 3e741da794..d47c1b80dc 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
@@ -48,7 +48,7 @@
POPARGS_##args \
/* The return value from CENABLE is argument for CDISABLE. */ \
movq %rax, (%rsp); \
- movl $SYS_ify (syscall_name), %eax; \
+ movq $SYS_ify (syscall_name), %rax; \
syscall; \
movq (%rsp), %rdi; \
/* Save %rax since it's the error code from the syscall. */ \
@@ -136,9 +136,3 @@ extern int __local_multiple_threads attribute_hidden;
# define NO_CANCELLATION 1
#endif
-
-#ifndef __ASSEMBLER__
-# define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-#endif
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/vfork.S b/nptl/sysdeps/unix/sysv/linux/x86_64/vfork.S
index 9a9912ca85..f68d40439e 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/vfork.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/vfork.S
@@ -16,16 +16,9 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-/* We want an #include_next, but we are the main source file.
- So, #include ourselves and in that incarnation we can use #include_next. */
-#ifndef INCLUDED_SELF
-# define INCLUDED_SELF
-# include <vfork.S>
-#else
+#include <tcb-offsets.h>
-# include <tcb-offsets.h>
-
-# define SAVE_PID \
+#define SAVE_PID \
movl %fs:PID, %esi; \
movl $0x80000000, %ecx; \
movl %esi, %edx; \
@@ -33,11 +26,10 @@
cmove %ecx, %edx; \
movl %edx, %fs:PID
-# define RESTORE_PID \
+#define RESTORE_PID \
testq %rax, %rax; \
je 1f; \
movl %esi, %fs:PID; \
1:
-# include_next <vfork.S>
-#endif
+#include <sysdeps/unix/sysv/linux/x86_64/vfork.S>