This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch, master, updated. glibc-2.10-279-g15efafd
- From: drepper at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 22 Aug 2009 09:02:33 -0000
- Subject: GNU C Library master sources branch, master, updated. glibc-2.10-279-g15efafd
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, master has been updated
via 15efafdf07789322219cc8f938ac758f932fe208 (commit)
from 464dc022eb0be4950e2f3a90fe4de6a17dc3d7d7 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=15efafdf07789322219cc8f938ac758f932fe208
commit 15efafdf07789322219cc8f938ac758f932fe208
Author: Andreas Schwab <schwab@redhat.com>
Date: Sat Aug 22 02:01:51 2009 -0700
Add sigstack handling to Linux ____longjmp_chk on powerpc.
diff --git a/ChangeLog b/ChangeLog
index 6ace54b..7e88049 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2009-08-21 Andreas Schwab <schwab@redhat.com>
+
+ * sysdeps/powerpc/powerpc32/____longjmp_chk.S: Removed.
+ * sysdeps/powerpc/powerpc64/____longjmp_chk.S: Removed.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/____longjmp_chk.S: New file.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc64/____longjmp_chk.S: New file.
+ * sysdeps/powerpc/powerpc32/__longjmp-common.S: Move CHECK_SP earlier.
+ * sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S: Likewise.
+
2009-08-20 Roland McGrath <roland@redhat.com>
* sysdeps/generic/elf/backtracesyms.c (__backtrace_symbols):
diff --git a/nptl/pthread_rwlock_init.c b/nptl/pthread_rwlock_init.c
index 27f25ac..95d9da4 100644
--- a/nptl/pthread_rwlock_init.c
+++ b/nptl/pthread_rwlock_init.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2007 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2007, 2009 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -37,13 +37,7 @@ __pthread_rwlock_init (rwlock, attr)
iattr = ((const struct pthread_rwlockattr *) attr) ?: &default_attr;
- rwlock->__data.__lock = 0;
- rwlock->__data.__nr_readers = 0;
- rwlock->__data.__readers_wakeup = 0;
- rwlock->__data.__writer_wakeup = 0;
- rwlock->__data.__nr_readers_queued = 0;
- rwlock->__data.__nr_writers_queued = 0;
- rwlock->__data.__writer = 0;
+ memset (rwlock, '\0', sizeof (*rwlock));
rwlock->__data.__flags
= iattr->lockkind == PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP;
@@ -74,9 +68,6 @@ __pthread_rwlock_init (rwlock, attr)
header.private_futex));
#endif
- rwlock->__data.__pad1 = 0;
- rwlock->__data.__pad2 = 0;
-
return 0;
}
strong_alias (__pthread_rwlock_init, pthread_rwlock_init)
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 35eb09c..54a47e1 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
@@ -31,6 +31,127 @@
.align 16
__pthread_rwlock_rdlock:
cfi_startproc
+ movq $NRW_RC, %rax
+ LOCK
+ xaddq %rax, NRW_WORD(%rdi)
+ js .Lundo
+
+.Lagain1:
+ movq $(NRW_WL|NRW_WP), %rcx
+ movq $(NRW_WL|NRW_WW_MASK), %rdx
+ testq %rax, %rcx
+ setnz %cl
+ testq %rax, %rdx
+ setnz %dl
+ orb %cl, %dl
+ jnz .Lwait
+
+ xorl %eax, %eax
+ ret
+
+.Lwait: movq $NRW_WL, %rcx
+ testq %rcx, %rax
+ jz 4f
+
+ movl %fs:TID, %ecx
+ cmpl %ecx, WRITER(%rdi)
+ je .Ldeadlk
+
+4: xorq %r8, %r8
+ movq $NRW_RC, %rdx
+ addq %rdx, %rax
+ movq $(NRW_WL|NRW_AR), %rcx
+ movq $(NRW_WP|NRW_WW_MASK), %rdx
+ testq %rax, %rcx
+ setz %cl
+ testq %rax, %rdx
+ setnz %dl
+ testb %dl, %cl
+ jz 1f
+
+ movq $NRW_RW-NRW_RC, %rdx
+ addq %rax, %rdx
+ LOCK
+ cmpxchgq %rdx, NRW_WORD(%rdi)
+ jnz .Lagain1
+
+ movq $NRW_RC_MASK, %rax
+ testq %rdx, %rax
+ movl $1, %r8d
+ jz .Lwake_waiter
+
+1: xorq %r10, %r10
+ movl $NRW_R_WAKEUP, %r9d
+ movl $(FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG), %esi
+ xorl PSHARED(%rdi), %esi
+ leaq NRW_WORD+4(%rdi), %rdi
+2: shldq $32, %rax, %rdx
+ movl $__NR_futex, %eax
+ syscall
+ movq -4(%rdi), %rax
+
+5: movq $(NRW_WL|NRW_WP), %rcx
+ movq $(NRW_WL|NRW_WW_MASK), %rdx
+ testq %rax, %rcx
+ setnz %cl
+ testq %rax, %rdx
+ setnz %dl
+ orb %cl, %dl
+ jnz 2b
+
+ testl %r8d, %r8d
+ jz 3f
+
+ movq $NRW_RC-NRW_RW, %rcx
+ addq %rcx, %rdx
+ LOCK
+ cmpxchgq %rdx, -4(%rdi)
+ jnz 5b
+
+3: xorl %eax, %eax
+ ret
+
+.Lwake_waiter:
+ movq %rdx, %r10
+ movl $__NR_futex, %eax
+ movl $(FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG), %esi
+ xorl PSHARED(%rdi), %esi
+ leaq NRW_WORD(%rdi), %rdi
+ movl $1, %edx
+ movl $NRW_W_WAKEUP, %r9d
+ syscall
+ leaq -NRW_WORD(%rdi), %rdi
+ movq %r10, %rdx
+ jmp 1b
+
+.Lundo: movq $-NRW_RC, %rcx
+ movq %rax, %rdx
+ subq %rcx, %rax
+ LOCK
+ cmpxchgq %rdx, NRW_WORD(%rdi)
+ jz .Lret
+
+ movq $NRW_RC_OVFL, %r8
+.Lagain2:
+ testq %r8, %rax
+ jz .Lagain1
+ leaq (%rax,%rcx), %rdx
+ LOCK
+ cmpxchgq %rdx, NRW_WORD(%rdi)
+ jnz .Lagain2
+
+.Lret: movl $EAGAIN, %eax
+ ret
+
+.Ldeadlk:
+ movq $NRW_RC, %rdx
+ LOCK
+ subq %rdx, NRW_WORD(%rdi)
+
+ movl $EDEADLK, %eax
+ ret
+
+#if 0
xorq %r10, %r10
/* Get the lock. */
@@ -168,6 +289,7 @@ __pthread_rwlock_rdlock:
subq $MUTEX, %rdi
#endif
jmp 13b
+#endif
cfi_endproc
.size __pthread_rwlock_rdlock,.-__pthread_rwlock_rdlock
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 23b218a..0fb925c 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
@@ -34,6 +34,143 @@
.align 16
pthread_rwlock_timedrdlock:
cfi_startproc
+ movq %rsi, %r10
+ movq $NRW_RC, %rax
+ LOCK
+ xaddq %rax, NRW_WORD(%rdi)
+ js .Lundo
+
+.Lagain1:
+ movq $(NRW_WL|NRW_WP), %rcx
+ movq $(NRW_WL|NRW_WW_MASK), %rdx
+ testq %rax, %rcx
+ setnz %cl
+ testq %rax, %rdx
+ setnz %dl
+ orb %cl, %dl
+ jnz .Lwait
+
+ xorl %eax, %eax
+ ret
+
+.Lwait: movq $NRW_WL, %rcx
+ testq %rcx, %rax
+ jz 4f
+
+ movl %fs:TID, %ecx
+ cmpl %ecx, WRITER(%rdi)
+ je .Ldeadlk
+
+4: xorq %r8, %r8
+ movq $NRW_RC, %rdx
+ addq %rdx, %rax
+ movq $(NRW_WL|NRW_AR), %rcx
+ movq $(NRW_WP|NRW_WW_MASK), %rdx
+ testq %rax, %rcx
+ setz %cl
+ testq %rax, %rdx
+ setnz %dl
+ testb %dl, %cl
+ jz 1f
+
+ movq $NRW_RW-NRW_RC, %rdx
+ addq %rax, %rdx
+ LOCK
+ cmpxchgq %rdx, NRW_WORD(%rdi)
+ jnz .Lagain1
+
+ movq $NRW_RC_MASK, %rax
+ testq %rdx, %rax
+ movq $NRW_RW-NRW_RC, %r8
+ jz .Lwake_waiter
+
+1: movl $NRW_R_WAKEUP, %r9d
+ leaq NRW_WORD+4(%rdi), %rdi
+2: movl $(FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME), %esi
+ xorl PSHARED-(NRW_WORD+4)(%rdi), %esi
+ shldq $32, %rax, %rdx
+ movl $__NR_futex, %eax
+ syscall
+ movl %eax, %esi
+ movq -4(%rdi), %rax
+
+6: movq $(NRW_WL|NRW_WP), %rcx
+ movq $(NRW_WL|NRW_WW_MASK), %rdx
+ testq %rax, %rcx
+ setnz %cl
+ testq %rax, %rdx
+ setnz %dl
+ orb %cl, %dl
+ jz 5f
+
+ cmpl $-EWOULDBLOCK, %esi
+ je 2b
+
+ movq $-NRW_RC, %rdx
+ subq %r8, %rdx
+ addq %rax, %rdx
+ LOCK
+ cmpxchgq %rdx, -4(%rdi)
+ jnz 6b
+
+ negl %esi
+ movl %esi, %eax
+ ret
+
+5: testl %r8d, %r8d
+ jz 3f
+
+ movq $NRW_RC-NRW_RW, %rcx
+ addq %rcx, %rdx
+ LOCK
+ cmpxchgq %rdx, -4(%rdi)
+ jnz 6b
+
+3: xorl %eax, %eax
+ ret
+
+.Lwake_waiter:
+ movq %rdx, %r10
+ movl $__NR_futex, %eax
+ movl $(FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG), %esi
+ xorl PSHARED(%rdi), %esi
+ leaq NRW_WORD(%rdi), %rdi
+ movl $1, %edx
+ movl $NRW_W_WAKEUP, %r9d
+ syscall
+ leaq -NRW_WORD(%rdi), %rdi
+ movq %r10, %rdx
+ jmp 1b
+
+.Lundo: movq $-NRW_RC, %rcx
+ movq %rax, %rdx
+ subq %rcx, %rax
+ LOCK
+ cmpxchgq %rdx, NRW_WORD(%rdi)
+ jz .Lret
+
+ movq $NRW_RC_OVFL, %r8
+.Lagain2:
+ testq %r8, %rax
+ jz .Lagain1
+ leaq (%rax,%rcx), %rdx
+ LOCK
+ cmpxchgq %rdx, NRW_WORD(%rdi)
+ jnz .Lagain2
+
+.Lret: movl $EAGAIN, %eax
+ ret
+
+.Ldeadlk:
+ movq $NRW_RC, %rdx
+ LOCK
+ subq %rdx, NRW_WORD(%rdi)
+
+ movl $EDEADLK, %eax
+ ret
+
+
+#if 0
pushq %r12
cfi_adjust_cfa_offset(8)
cfi_rel_offset(%r12, 0)
@@ -271,5 +408,6 @@ pthread_rwlock_timedrdlock:
19: movl $EINVAL, %edx
jmp 9b
+#endif
cfi_endproc
.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 cd867b6..14d7637 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
@@ -34,6 +34,109 @@
.align 16
pthread_rwlock_timedwrlock:
cfi_startproc
+ movq %rsi, %r10
+ movq NRW_WORD(%rdi), %rax
+.Lagain:
+ movq $(NRW_WW_MASK|NRW_WL|NRW_RC_MASK), %rdx
+ testq %rdx, %rax
+ jnz .Lwait
+
+ // XXX Probably make AR a don't-care for !WP. Unconditionally set it
+ movq $(NRW_AR|NRW_WL), %rdx
+ movq $NRW_WL, %rcx
+ testq $NRW_WP, %rax
+ cmovz %rcx, %rdx
+ orq %rax, %rdx
+ LOCK
+ cmpxchgq %rdx, NRW_WORD(%rdi)
+ jnz .Lagain
+
+ movl %fs:TID, %eax
+ movl %eax, WRITER(%rdi)
+
+ xorl %eax, %eax
+ ret
+
+.Lwait: movq $NRW_WL, %rcx
+ testq %rcx, %rax
+ jz 1f
+
+ movl %fs:TID, %eax
+ cmpl %eax, WRITER(%rdi)
+ je .Ldeadlk
+
+1: leaq NRW_WORD+4(%rdi), %rdi
+
+ movq $NRW_WW, %rdx
+ movq $NRW_WW_MASK, %rcx
+ addq %rax, %rdx
+ testq %rcx, %rdx
+ jz .Lovfl
+
+ LOCK
+ cmpxchgq %rdx, -4(%rdi)
+ jnz .Lagain
+
+ movl $NRW_W_WAKEUP, %r9d
+.Lwait2:
+ movl $(FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME), %esi
+ movl $__NR_futex, %eax
+ xorl PSHARED-(NRW_WORD+4)(%rdi), %esi
+ syscall
+ movl %eax, %esi
+ movq -4(%rdi), %rax
+
+.Lagain2:
+ movq $(NRW_WL|NRW_RC_MASK), %rdx
+ movq $(NRW_WL|NRW_AR), %rcx
+ testq %rdx, %rax
+ movq $NRW_AR, %rsi
+ setz %cl
+ andq %rax, %rcx
+ cmpq %rsi, %rcx
+ sete %cl
+ orb %dl, %cl
+ jnz 2f
+
+ cmpl $-EWOULDBLOCK, %esi
+ jne .Lwait2
+
+ movq $-NRW_WW, %rdx
+ addq %rax, %rdx
+ LOCK
+ cmpxchgq %rdx, -4(%rdi)
+ jnz .Lagain2
+
+ negl %esi
+ movl %esi, %eax
+ ret
+
+2: movq $-NRW_WW, %rdx
+ addq %rax, %rdx
+ xorl %ecx, %ecx
+ testq $NRW_WP, %rax
+ cmovz %rcx, %rsi
+ orq %rsi, %rdx
+
+ LOCK
+ cmpxchgq %rdx, -4(%rdi)
+ jnz .Lagain2
+
+ movl %fs:TID, %eax
+ movl %eax, WRITER(%rdi)
+
+ xorl %eax, %eax
+ ret
+
+.Lovfl: movl $EAGAIN, %eax
+ ret
+
+.Ldeadlk:
+ movl $EDEADLK, %eax
+ ret
+
+
+#if 0
pushq %r12
cfi_adjust_cfa_offset(8)
cfi_rel_offset(%r12, 0)
@@ -263,5 +366,6 @@ pthread_rwlock_timedwrlock:
19: movl $EINVAL, %edx
jmp 9b
+#endif
cfi_endproc
.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 03391d0..1953637 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
@@ -30,6 +30,97 @@
.align 16
__pthread_rwlock_unlock:
cfi_startproc
+ movq NRW_WORD(%rdi), %rax
+ movq $NRW_WL, %rdx
+ testq %rdx, %rax
+ jnz .Lunlock_writer
+
+.Lagain:
+ movq $-NRW_RC, %rdx
+ addq %rax, %rdx
+ movq $NRW_RC_MASK, %rcx
+ testq %rcx, %rdx
+ jz .Llast_reader
+
+1: LOCK
+ cmpxchgq %rdx, NRW_WORD(%rdi)
+ jnz .Lagain
+
+ xorl %eax, %eax
+ ret
+
+.Llast_reader:
+ movq $NRW_WW_MASK, %rcx
+ testq %rax, %rcx
+ jz 1b
+
+ movq $NRW_AR, %rcx
+ xorl %esi, %esi
+ testq $NRW_WP, %rax
+ cmovz %esi, %ecx
+ orq %rcx, %rdx
+ LOCK
+ cmpxchgq %rdx, NRW_WORD(%rdi)
+ jnz .Lagain
+
+.Lwake_writer:
+ movl $1, %edx
+ movl $NRW_W_WAKEUP, %r9d
+.Lwake: movl $(FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG), %esi
+ xorl PSHARED(%rdi), %esi
+ leaq NRW_WORD(%rdi), %rdi
+ movl $__NR_futex, %eax
+ syscall
+
+.Lout: xorl %eax, %eax
+ ret
+
+.Lunlock_writer:
+ movq %rax, %rdx
+ movq $NRW_WW_MASK, %rcx
+ testq %rcx, %rax
+ jz .Lno_writers
+ movq $NRW_RC_MASK, %rcx
+ testq %rcx, %rax
+ jz 2f
+ testq $NRW_WP, %rax
+ jz .Lwake_readers
+
+2: movq $~NRW_WL, %rcx
+ andq %rcx, %rdx
+ LOCK
+ cmpxchgq %rdx, NRW_WORD(%rdi)
+ jnz .Lunlock_writer
+ jmp .Lwake_writer
+
+.Lno_writers:
+ movq $~(NRW_WL|NRW_AR), %rcx
+ andq %rcx, %rdx
+ LOCK
+ cmpxchgq %rdx, NRW_WORD(%rdi)
+ jnz .Lunlock_writer
+
+ movq $(NRW_RW_MASK|NRW_RC_MASK), %rcx
+ testq %rcx, %rax
+ jz .Lout
+
+ movl $0x7fffffff, %edx
+ movl $NRW_R_WAKEUP, %r9d
+ jmp .Lwake
+
+.Lwake_readers:
+ movq $~NRW_WL, %rcx
+ andq %rcx, %rdx
+ LOCK
+ cmpxchgq %rdx, NRW_WORD(%rdi)
+ jnz .Lunlock_writer
+
+ movl $0x7fffffff, %edx
+ movl $NRW_R_WAKEUP, %r9d
+ jmp .Lwake
+
+
+#if 0
/* Get the lock. */
movl $1, %esi
xorl %eax, %eax
@@ -120,6 +211,7 @@ __pthread_rwlock_unlock:
#endif
callq __lll_unlock_wake
jmp 8b
+#endif
cfi_endproc
.size __pthread_rwlock_unlock,.-__pthread_rwlock_unlock
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 be6b8d8..63fc2df 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
@@ -31,6 +31,94 @@
.align 16
__pthread_rwlock_wrlock:
cfi_startproc
+ movq NRW_WORD(%rdi), %rax
+.Lagain:
+ movq $(NRW_WW_MASK|NRW_WL|NRW_RC_MASK), %rdx
+ testq %rdx, %rax
+ jnz .Lwait
+
+ // XXX Probably make AR a don't-care for !WP. Unconditionally set it
+ movq $(NRW_AR|NRW_WL), %rdx
+ movq $NRW_WL, %rcx
+ testq $NRW_WP, %rax
+ cmovz %rcx, %rdx
+ orq %rax, %rdx
+ LOCK
+ cmpxchgq %rdx, NRW_WORD(%rdi)
+ jnz .Lagain
+
+ movl %fs:TID, %eax
+ movl %eax, WRITER(%rdi)
+
+ xorl %eax, %eax
+ ret
+
+.Lwait: movq $NRW_WL, %rcx
+ testq %rcx, %rax
+ jz 1f
+
+ movl %fs:TID, %eax
+ cmpl %eax, WRITER(%rdi)
+ je .Ldeadlk
+
+1: leaq NRW_WORD+4(%rdi), %rdi
+
+ movq $NRW_WW, %rdx
+ movq $NRW_WW_MASK, %rcx
+ addq %rax, %rdx
+ testq %rcx, %rdx
+ jz .Lovfl
+
+ LOCK
+ cmpxchgq %rdx, -4(%rdi)
+ jnz .Lagain
+
+ xorq %r10, %r10
+ movl $NRW_W_WAKEUP, %r9d
+.Lwait2:
+ movl $(FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG), %esi
+ movl $__NR_futex, %eax
+ xorl PSHARED-(NRW_WORD+4)(%rdi), %esi
+ syscall
+ movq -4(%rdi), %rax
+
+.Lagain2:
+ movq $(NRW_WL|NRW_RC_MASK), %rdx
+ movq $(NRW_WL|NRW_AR), %rcx
+ testq %rdx, %rax
+ movq $NRW_AR, %rsi
+ setz %cl
+ andq %rax, %rcx
+ cmpq %rsi, %rcx
+ sete %cl
+ orb %dl, %cl
+ jz .Lwait2
+
+ movq $-NRW_WW, %rdx
+ addq %rax, %rdx
+ xorl %ecx, %ecx
+ testq $NRW_WP, %rax
+ cmovz %rcx, %rsi
+ orq %rsi, %rdx
+
+ LOCK
+ cmpxchgq %rdx, -4(%rdi)
+ jnz .Lagain2
+
+ movl %fs:TID, %eax
+ movl %eax, WRITER(%rdi)
+
+ xorl %eax, %eax
+ ret
+
+.Lovfl: movl $EAGAIN, %eax
+ ret
+
+.Ldeadlk:
+ movl $EDEADLK, %eax
+ ret
+
+#if 0
xorq %r10, %r10
/* Get the lock. */
@@ -156,6 +244,7 @@ __pthread_rwlock_wrlock:
subq $MUTEX, %rdi
#endif
jmp 13b
+#endif
cfi_endproc
.size __pthread_rwlock_wrlock,.-__pthread_rwlock_wrlock
diff --git a/sysdeps/powerpc/powerpc32/__longjmp-common.S b/sysdeps/powerpc/powerpc32/__longjmp-common.S
index 7b1c017..955161e 100644
--- a/sysdeps/powerpc/powerpc32/__longjmp-common.S
+++ b/sysdeps/powerpc/powerpc32/__longjmp-common.S
@@ -33,6 +33,13 @@ ENTRY (BP_SYM (__longjmp))
#if defined PTR_DEMANGLE || defined CHECK_SP
lwz r24,(JB_GPR1*4)(r3)
+# ifdef CHECK_SP
+# ifdef PTR_DEMANGLE
+ PTR_DEMANGLE3 (r24, r24, r25)
+# endif
+ CHECK_SP (r24)
+ mr r1,r24
+# endif
#else
lwz r1,(JB_GPR1*4)(r3)
#endif
@@ -45,17 +52,11 @@ ENTRY (BP_SYM (__longjmp))
lwz r19,((JB_GPRS+5)*4)(r3)
lwz r20,((JB_GPRS+6)*4)(r3)
#ifdef PTR_DEMANGLE
-# ifdef CHECK_SP
- PTR_DEMANGLE3 (r24, r24, r25)
-# else
+# ifndef CHECK_SP
PTR_DEMANGLE3 (r1, r24, r25)
# endif
PTR_DEMANGLE2 (r0, r25)
#endif
-#ifdef CHECK_SP
- CHECK_SP (r24)
- mr r1,r24
-#endif
mtlr r0
lwz r21,((JB_GPRS+7)*4)(r3)
lwz r22,((JB_GPRS+8)*4)(r3)
diff --git a/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S b/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S
index f105815..04ed6da 100644
--- a/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S
+++ b/sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S
@@ -116,6 +116,13 @@ L(no_vmx):
#endif
#if defined PTR_DEMANGLE || defined CHECK_SP
lwz r24,(JB_GPR1*4)(r3)
+# ifdef CHECK_SP
+# ifdef PTR_DEMANGLE
+ PTR_DEMANGLE3 (r24, r24, r25)
+# endif
+ CHECK_SP (r24)
+ mr r1,r24
+# endif
#else
lwz r1,(JB_GPR1*4)(r3)
#endif
@@ -135,17 +142,11 @@ L(no_vmx):
lwz r20,((JB_GPRS+6)*4)(r3)
lfd fp20,((JB_FPRS+6*2)*4)(r3)
#ifdef PTR_DEMANGLE
-# ifdef CHECK_SP
- PTR_DEMANGLE3 (r24, r24, r25)
-# else
+# ifndef CHECK_SP
PTR_DEMANGLE3 (r1, r24, r25)
# endif
PTR_DEMANGLE2 (r0, r25)
#endif
-#ifdef CHECK_SP
- CHECK_SP (r24)
- mr r1,r24
-#endif
mtlr r0
lwz r21,((JB_GPRS+7)*4)(r3)
lfd fp21,((JB_FPRS+7*2)*4)(r3)
diff --git a/sysdeps/powerpc/powerpc64/____longjmp_chk.S b/sysdeps/powerpc/powerpc64/____longjmp_chk.S
deleted file mode 100644
index 5654902..0000000
--- a/sysdeps/powerpc/powerpc64/____longjmp_chk.S
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Copyright (C) 2009 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. */
-
-#include <sysdep.h>
-#include <rtld-global-offsets.h>
-
- .section .rodata.str1.1,"aMS",@progbits,1
-.LC0:
- .string "longjmp causes uninitialized stack frame"
- .section .toc,"aw"
-.LC1:
- .tc .LC0[TC],.LC0
- .text
-
-#define __longjmp ____longjmp_chk
-
-#define CHECK_SP(reg) \
- cmpld reg, r1; \
- bge+ .Lok; \
- ld r3,.LC1@toc(2); \
- bl HIDDEN_JUMPTARGET (__fortify_fail); \
-.Lok:
-
-#include <__longjmp-common.S>
diff --git a/sysdeps/powerpc/powerpc32/____longjmp_chk.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/____longjmp_chk.S
similarity index 69%
copy from sysdeps/powerpc/powerpc32/____longjmp_chk.S
copy to sysdeps/unix/sysv/linux/powerpc/powerpc32/____longjmp_chk.S
index 510ce52..4cb9685 100644
--- a/sysdeps/powerpc/powerpc32/____longjmp_chk.S
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/____longjmp_chk.S
@@ -19,7 +19,8 @@
#include <sysdep.h>
#include <rtld-global-offsets.h>
- .section .rodata.str1.1,"aMS",@progbits,1
+ .section .rodata.str1.4,"aMS",@progbits,1
+ .align 2
.LC0:
.string "longjmp causes uninitialized stack frame"
.text
@@ -49,8 +50,36 @@
#define CHECK_SP(reg) \
cmplw reg, r1; \
bge+ .Lok; \
+ mflr r0; \
+ stwu r1,-32(r1); \
+ cfi_remember_state; \
+ cfi_adjust_cfa_offset (32); \
+ stw r0,36(r1); \
+ cfi_offset (lr, 4); \
+ mr r31,r3; \
+ mr r30,r4; \
+ li r3,0; \
+ addi r4,r1,8; \
+ li r0,__NR_sigaltstack; \
+ sc; \
+ /* Without working sigaltstack we cannot perform the test. */ \
+ bso .Lok2; \
+ lwz r0,12(r1); \
+ andi. r3,r0,1; \
+ beq .Lfail; \
+ lwz r0,16(r1); \
+ lwz r3,8(r1); \
+ add r3,r3,r0; \
+ sub r3,r3,reg; \
+ cmplw r3,r0; \
+ bge+ .Lok2; \
+.Lfail: \
LOAD_ARG; \
bl HIDDEN_JUMPTARGET (__fortify_fail); \
+.Lok2: \
+ mr r3,r31; \
+ mr r4,r30; \
+ cfi_restore_state; \
.Lok:
#include <__longjmp-common.S>
diff --git a/sysdeps/powerpc/powerpc32/____longjmp_chk.S b/sysdeps/unix/sysv/linux/powerpc/powerpc64/____longjmp_chk.S
similarity index 58%
rename from sysdeps/powerpc/powerpc32/____longjmp_chk.S
rename to sysdeps/unix/sysv/linux/powerpc/powerpc64/____longjmp_chk.S
index 510ce52..936ace5 100644
--- a/sysdeps/powerpc/powerpc32/____longjmp_chk.S
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/____longjmp_chk.S
@@ -19,38 +19,51 @@
#include <sysdep.h>
#include <rtld-global-offsets.h>
- .section .rodata.str1.1,"aMS",@progbits,1
+ .section .rodata.str1.8,"aMS",@progbits,1
+ .align 3
.LC0:
.string "longjmp causes uninitialized stack frame"
+ .section .toc,"aw"
+.LC1:
+ .tc .LC0[TC],.LC0
.text
#define __longjmp ____longjmp_chk
-#ifdef PIC
-# ifdef HAVE_ASM_PPC_REL16
-# define LOAD_ARG \
- bcl 20,31,1f; \
-1: mflr r3; \
- addis r3,r3,_GLOBAL_OFFSET_TABLE_-1b@ha; \
- addi r3,r3,_GLOBAL_OFFSET_TABLE_-1b@l; \
- lwz r3,.LC0@got(r3)
-# else
-# define LOAD_ARG \
- bl _GLOBAL_OFFSET_TABLE_-4@local; \
- mflr r3; \
- lwz r3,.LC0@got(r3)
-# endif
-#else
-# define LOAD_ARG \
- lis r3,.LC0@ha; \
- la r3,.LC0@l(r3)
-#endif
-
#define CHECK_SP(reg) \
- cmplw reg, r1; \
+ cmpld reg, r1; \
bge+ .Lok; \
- LOAD_ARG; \
+ mflr r0; \
+ std r0,16(r1); \
+ mr r31,r3; \
+ mr r30,r4; \
+ stdu r1,-144(r1); \
+ cfi_remember_state; \
+ cfi_adjust_cfa_offset (144); \
+ cfi_offset (lr, 16); \
+ li r3,0; \
+ addi r4,r1,112; \
+ li r0,__NR_sigaltstack; \
+ sc; \
+ /* Without working sigaltstack we cannot perform the test. */ \
+ bso .Lok2; \
+ lwz r0,112+8(r1); \
+ andi. r4,r0,1; \
+ beq .Lfail; \
+ ld r0,112+16(r1); \
+ ld r4,112(r1); \
+ add r4,r4,r0; \
+ sub r3,r3,reg; \
+ cmpld r3,r0; \
+ bge+ .Lok2; \
+.Lfail: \
+ ld r3,.LC1@toc(2); \
bl HIDDEN_JUMPTARGET (__fortify_fail); \
+ nop; \
+.Lok2: \
+ mr r3,r31; \
+ mr r4,r30; \
+ cfi_restore_state; \
.Lok:
#include <__longjmp-common.S>
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 9 ++
nptl/pthread_rwlock_init.c | 13 +--
.../unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S | 122 +++++++++++++++++
.../sysv/linux/x86_64/pthread_rwlock_timedrdlock.S | 138 ++++++++++++++++++++
.../sysv/linux/x86_64/pthread_rwlock_timedwrlock.S | 104 +++++++++++++++
.../unix/sysv/linux/x86_64/pthread_rwlock_unlock.S | 92 +++++++++++++
.../unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S | 89 +++++++++++++
sysdeps/powerpc/powerpc32/__longjmp-common.S | 15 +-
sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S | 15 +-
sysdeps/powerpc/powerpc64/____longjmp_chk.S | 39 ------
.../linux}/powerpc/powerpc32/____longjmp_chk.S | 31 +++++-
.../linux/powerpc/powerpc64}/____longjmp_chk.S | 59 +++++----
12 files changed, 638 insertions(+), 88 deletions(-)
delete mode 100644 sysdeps/powerpc/powerpc64/____longjmp_chk.S
copy sysdeps/{ => unix/sysv/linux}/powerpc/powerpc32/____longjmp_chk.S (69%)
rename sysdeps/{powerpc/powerpc32 => unix/sysv/linux/powerpc/powerpc64}/____longjmp_chk.S (58%)
hooks/post-receive
--
GNU C Library master sources