[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[commits] r10002 - in /fsf/trunk/libc: ./ nptl/ nptl/sysdeps/pthread/ sysdeps/sparc/sparc32/ sysdeps/sparc/sparc32/sparcv9/ sysdeps/sp...
- To: commits@xxxxxxxxxx
- Subject: [commits] r10002 - in /fsf/trunk/libc: ./ nptl/ nptl/sysdeps/pthread/ sysdeps/sparc/sparc32/ sysdeps/sparc/sparc32/sparcv9/ sysdeps/sp...
- From: eglibc@xxxxxxxxxx
- Date: Wed, 10 Mar 2010 08:03:13 -0000
Author: eglibc
Date: Wed Mar 10 00:03:12 2010
New Revision: 10002
Log:
Import glibc-mainline for 2010-03-10
Modified:
fsf/trunk/libc/ChangeLog
fsf/trunk/libc/nptl/ChangeLog
fsf/trunk/libc/nptl/pthread_create.c
fsf/trunk/libc/nptl/sysdeps/pthread/createthread.c
fsf/trunk/libc/sysdeps/sparc/sparc32/memcpy.S
fsf/trunk/libc/sysdeps/sparc/sparc32/sparcv9/strlen.S
fsf/trunk/libc/sysdeps/sparc/sparc32/strlen.S
fsf/trunk/libc/sysdeps/sparc/sparc64/dl-machine.h
fsf/trunk/libc/sysdeps/sparc/sparc64/strlen.S
Modified: fsf/trunk/libc/ChangeLog
==============================================================================
--- fsf/trunk/libc/ChangeLog (original)
+++ fsf/trunk/libc/ChangeLog Wed Mar 10 00:03:12 2010
@@ -1,3 +1,16 @@
+2010-03-09 David S. Miller <davem@xxxxxxxxxxxxx>
+
+ * sysdeps/sparc/sparc64/dl-machine.h (elf_machine_rela): Handling
+ of R_SPARC_TLS_LE_* needs to use 32-bit loads and stores, not
+ 64-bit ones.
+
+ * sysdeps/sparc/sparc32/memcpy.S: Fix build.
+
+ * sysdeps/sparc/sparc32/strlen.S: Optimize.
+ * sysdeps/sparc/sparc64/strlen.S: Likewise.
+ * sysdeps/sparc/sparc32/sparcv9/strlen.S (ASI_PNF, ASI_BLK_P,
+ XCC): Delete definitions, not needed.
+
2010-03-07 Ulrich Drepper <drepper@xxxxxxxxxx>
* sysdeps/unix/sysv/linux/internal_statvfs.c (__statvfs_getflags):
Modified: fsf/trunk/libc/nptl/ChangeLog
==============================================================================
--- fsf/trunk/libc/nptl/ChangeLog (original)
+++ fsf/trunk/libc/nptl/ChangeLog Wed Mar 10 00:03:12 2010
@@ -1,3 +1,11 @@
+2010-03-09 Ulrich Drepper <drepper@xxxxxxxxxx>
+
+ * pthread_create.c (__pthread_create_2_1): If priorities are incorrect
+ and the call fails wake eventually waiting setxid threads. Don't free
+ stack here if we try starting a thread.
+ * sysdeps/pthread/createthread.c (do_clone): Only wake setxid waiter
+ if the clone call failed.
+
2010-03-08 Andreas Schwab <schwab@xxxxxxxxxx>
* pthread_create.c (__pthread_create_2_1): Don't set setxid_futex.
Modified: fsf/trunk/libc/nptl/pthread_create.c
==============================================================================
--- fsf/trunk/libc/nptl/pthread_create.c (original)
+++ fsf/trunk/libc/nptl/pthread_create.c Wed Mar 10 00:03:12 2010
@@ -537,33 +537,23 @@
if (pd->schedparam.sched_priority < minprio
|| pd->schedparam.sched_priority > maxprio)
{
- err = EINVAL;
- goto errout;
+ /* Perhaps a thread wants to change the IDs and if waiting
+ for this stillborn thread. */
+ if (__builtin_expect (atomic_exchange_acq (&pd->setxid_futex, 0)
+ == -2, 0))
+ lll_futex_wake (&pd->setxid_futex, 1, LLL_PRIVATE);
+
+ __deallocate_stack (pd);
+
+ return EINVAL;
}
}
/* Pass the descriptor to the caller. */
*newthread = (pthread_t) pd;
- /* Remember whether the thread is detached or not. In case of an
- error we have to free the stacks of non-detached stillborn
- threads. */
- bool is_detached = IS_DETACHED (pd);
-
/* Start the thread. */
- err = create_thread (pd, iattr, STACK_VARIABLES_ARGS);
- if (err != 0)
- {
- /* Something went wrong. Free the resources. */
- if (!is_detached)
- {
- errout:
- __deallocate_stack (pd);
- }
- return err;
- }
-
- return 0;
+ return create_thread (pd, iattr, STACK_VARIABLES_ARGS);
}
versioned_symbol (libpthread, __pthread_create_2_1, pthread_create, GLIBC_2_1);
Modified: fsf/trunk/libc/nptl/sysdeps/pthread/createthread.c
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/pthread/createthread.c (original)
+++ fsf/trunk/libc/nptl/sysdeps/pthread/createthread.c Wed Mar 10 00:03:12 2010
@@ -75,19 +75,17 @@
int rc = ARCH_CLONE (fct, STACK_VARIABLES_ARGS, clone_flags,
pd, &pd->tid, TLS_VALUE, &pd->tid);
- /* Allow setxid from now onwards. */
- if (__builtin_expect (atomic_exchange_acq (&pd->setxid_futex, 0) == -2, 0))
- lll_futex_wake (&pd->setxid_futex, 1, LLL_PRIVATE);
-
if (__builtin_expect (rc == -1, 0))
{
atomic_decrement (&__nptl_nthreads); /* Oops, we lied for a second. */
- /* Failed. If the thread is detached, remove the TCB here since
- the caller cannot do this. The caller remembered the thread
- as detached and cannot reverify that it is not since it must
- not access the thread descriptor again. */
- if (IS_DETACHED (pd))
+ /* Perhaps a thread wants to change the IDs and if waiting
+ for this stillborn thread. */
+ if (__builtin_expect (atomic_exchange_acq (&pd->setxid_futex, 0)
+ == -2, 0))
+ lll_futex_wake (&pd->setxid_futex, 1, LLL_PRIVATE);
+
+ /* Free the resources. */
__deallocate_stack (pd);
/* We have to translate error codes. */
@@ -120,6 +118,9 @@
(void) INTERNAL_SYSCALL (tkill, err2, 2, pd->tid, SIGCANCEL);
#endif
+ /* We do not free the stack here because the canceled thread
+ itself will do this. */
+
return (INTERNAL_SYSCALL_ERROR_P (res, err)
? INTERNAL_SYSCALL_ERRNO (res, err)
: 0);
Modified: fsf/trunk/libc/sysdeps/sparc/sparc32/memcpy.S
==============================================================================
--- fsf/trunk/libc/sysdeps/sparc/sparc32/memcpy.S (original)
+++ fsf/trunk/libc/sysdeps/sparc/sparc32/memcpy.S Wed Mar 10 00:03:12 2010
@@ -117,10 +117,27 @@
bleu 90f
andcc %o1, 3, %g0
- bne 78b
-3: andcc %o1, 4, %g0
-
- be 2f
+ be 78f
+ andcc %o1, 4, %g0
+
+ andcc %o1, 1, %g0
+ be 4f
+ andcc %o1, 2, %g0
+
+ ldub [%o1], %g2
+ add %o1, 1, %o1
+ stb %g2, [%o0]
+ sub %o2, 1, %o2
+ bne 77f
+ add %o0, 1, %o0
+4: lduh [%o1], %g2
+ add %o1, 2, %o1
+ sth %g2, [%o0]
+ sub %o2, 2, %o2
+ add %o0, 2, %o0
+
+77: andcc %o1, 4, %g0
+78: be 2f
mov %o2, %g1
ld [%o1], %o4
Modified: fsf/trunk/libc/sysdeps/sparc/sparc32/sparcv9/strlen.S
==============================================================================
--- fsf/trunk/libc/sysdeps/sparc/sparc32/sparcv9/strlen.S (original)
+++ fsf/trunk/libc/sysdeps/sparc/sparc32/sparcv9/strlen.S Wed Mar 10 00:03:12 2010
@@ -1,4 +1,1 @@
-#define ASI_PNF 0x82
-#define ASI_BLK_P 0xf0
-#define XCC icc
#include <sparc64/strlen.S>
Modified: fsf/trunk/libc/sysdeps/sparc/sparc32/strlen.S
==============================================================================
--- fsf/trunk/libc/sysdeps/sparc/sparc32/strlen.S (original)
+++ fsf/trunk/libc/sysdeps/sparc/sparc32/strlen.S Wed Mar 10 00:03:12 2010
@@ -1,8 +1,9 @@
/* Determine the length of a string.
For SPARC v7.
- Copyright (C) 1996, 1999, 2003 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1999, 2003, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Jakub Jelinek <jj@xxxxxxxxxxxxxx>.
+ Contributed by Jakub Jelinek <jj@xxxxxxxxxxxxxx> and
+ David S. Miller <davem@xxxxxxxxxxxxx>.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -21,86 +22,55 @@
#include <sysdep.h>
- /* Normally, this uses ((xword - 0x01010101) & 0x80808080) test
- to find out if any byte in xword could be zero. This is fast, but
- also gives false alarm for any byte in range 0x81-0xff. It does
- not matter for correctness, as if this test tells us there could
- be some zero byte, we check it byte by byte, but if bytes with
- high bits set are common in the strings, then this will give poor
- performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
- will use one tick slower, but more precise test
- ((xword - 0x01010101) & (~xword) & 0x80808080),
- which does not give any false alarms (but if some bits are set,
- one cannot assume from it which bytes are zero and which are not).
- It is yet to be measured, what is the correct default for glibc
- in these days for an average user.
- */
-
.text
.align 4
ENTRY(strlen)
- mov %o0, %o1
- andcc %o0, 3, %g0
- be 20f
- sethi %hi(0x80808080), %o4
+ mov %o0, %o1
+ andn %o0, 0x3, %o0
- ldub [%o0], %o5
- cmp %o5, 0
- be 21f
- add %o0, 1, %o0
- andcc %o0, 3, %g0
- be 4f
- or %o4, %lo(0x80808080), %o3
- ldub [%o0], %o5
- cmp %o5, 0
- be 22f
- add %o0, 1, %o0
- andcc %o0, 3, %g0
- be 5f
- sethi %hi(0x01010101), %o4
- ldub [%o0], %o5
- cmp %o5, 0
- be 23f
- add %o0, 1, %o0
- b 11f
- or %o4, %lo(0x01010101), %o2
-21: retl
- mov 0, %o0
-22: retl
- mov 1, %o0
-23: retl
- mov 2, %o0
+ ld [%o0], %o5
+ and %o1, 0x3, %g1
+ mov -1, %g5
-20: or %o4, %lo(0x80808080), %o3
-4: sethi %hi(0x01010101), %o4
-5: or %o4, %lo(0x01010101), %o2
-11: ld [%o0], %o5
-12: sub %o5, %o2, %o4
-#ifdef EIGHTBIT_NOT_RARE
- andn %o4, %o5, %o4
-#endif
- andcc %o4, %o3, %g0
- be 11b
- add %o0, 4, %o0
+ sethi %hi(0x01010101), %o2
+ sll %g1, 3, %g1
- srl %o5, 24, %g5
- andcc %g5, 0xff, %g0
- be 13f
- add %o0, -4, %o4
- srl %o5, 16, %g5
- andcc %g5, 0xff, %g0
- be 13f
- add %o4, 1, %o4
- srl %o5, 8, %g5
- andcc %g5, 0xff, %g0
- be 13f
- add %o4, 1, %o4
- andcc %o5, 0xff, %g0
- bne,a 12b
- ld [%o0], %o5
- add %o4, 1, %o4
-13: retl
- sub %o4, %o1, %o0
+ or %o2, %lo(0x01010101), %o2
+ srl %g5, %g1, %g2
+
+ orn %o5, %g2, %o5
+ sll %o2, 7, %o3
+10: add %o0, 4, %o0
+
+ andn %o3, %o5, %g1
+ sub %o5, %o2, %g2
+
+ andcc %g1, %g2, %g0
+ be,a 10b
+ ld [%o0], %o5
+
+ srl %o5, 24, %g1
+
+ andcc %g1, 0xff, %g0
+ be 90f
+ sub %o0, 4, %o0
+
+ srl %o5, 16, %g2
+
+ andcc %g2, 0xff, %g0
+ be 90f
+ add %o0, 1, %o0
+
+ srl %o5, 8, %g1
+
+ andcc %g1, 0xff, %g0
+ be 90f
+ add %o0, 1, %o0
+
+ add %o0, 1, %o0
+
+90: retl
+ sub %o0, %o1, %o0
END(strlen)
libc_hidden_builtin_def (strlen)
Modified: fsf/trunk/libc/sysdeps/sparc/sparc64/dl-machine.h
==============================================================================
--- fsf/trunk/libc/sysdeps/sparc/sparc64/dl-machine.h (original)
+++ fsf/trunk/libc/sysdeps/sparc/sparc64/dl-machine.h Wed Mar 10 00:03:12 2010
@@ -513,11 +513,13 @@
value = sym->st_value - sym_map->l_tls_offset
+ reloc->r_addend;
if (r_type == R_SPARC_TLS_LE_HIX22)
- *reloc_addr = (*reloc_addr & 0xffc00000)
- | (((~value) >> 10) & 0x3fffff);
+ *(unsigned int *)reloc_addr =
+ ((*(unsigned int *)reloc_addr & 0xffc00000)
+ | (((~value) >> 10) & 0x3fffff));
else
- *reloc_addr = (*reloc_addr & 0xffffe000) | (value & 0x3ff)
- | 0x1c00;
+ *(unsigned int *)reloc_addr =
+ ((*(unsigned int *)reloc_addr & 0xffffe000) | (value & 0x3ff)
+ | 0x1c00);
}
break;
# endif
Modified: fsf/trunk/libc/sysdeps/sparc/sparc64/strlen.S
==============================================================================
--- fsf/trunk/libc/sysdeps/sparc/sparc64/strlen.S (original)
+++ fsf/trunk/libc/sysdeps/sparc/sparc64/strlen.S Wed Mar 10 00:03:12 2010
@@ -1,8 +1,9 @@
/* Determine the length of a string. For SPARC v9.
- Copyright (C) 1998, 1999, 2003 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2003, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Jan Vondrak <jvon4518@xxxxxxxxxxxxxxxxxxxxx> and
- Jakub Jelinek <jj@xxxxxxxxxxxxxx>.
+ Contributed by Jan Vondrak <jvon4518@xxxxxxxxxxxxxxxxxxxxx>,
+ Jakub Jelinek <jj@xxxxxxxxxxxxxx>, and
+ David S. Miller <davem@xxxxxxxxxxxxx>.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -20,155 +21,66 @@
02111-1307 USA. */
#include <sysdep.h>
-#include <asm/asi.h>
- /* Normally, this uses
- ((xword - 0x0101010101010101) & 0x8080808080808080) test
- to find out if any byte in xword could be zero. This is fast, but
- also gives false alarm for any byte in range 0x81-0xff. It does
- not matter for correctness, as if this test tells us there could
- be some zero byte, we check it byte by byte, but if bytes with
- high bits set are common in the strings, then this will give poor
- performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
- will use one tick slower, but more precise test
- ((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
- which does not give any false alarms (but if some bits are set,
- one cannot assume from it which bytes are zero and which are not).
- It is yet to be measured, what is the correct default for glibc
- in these days for an average user.
- */
+ .register %g2, #scratch
+ .register %g3, #scratch
.text
.align 32
ENTRY(strlen)
- sethi %hi(0x01010101), %g1 /* IEU0 Group */
- ldub [%o0], %o3 /* Load */
- or %g1, %lo(0x01010101), %g1 /* IEU0 Group */
- mov %o0, %o1 /* IEU1 */
+ mov %o0, %o1
+ andn %o0, 0x7, %o0
- sllx %g1, 32, %g4 /* IEU0 Group */
- andcc %o0, 7, %g0 /* IEU1 */
- or %g1, %g4, %g1 /* IEU0 Group */
- brz,pn %o3, 13f /* CTI+IEU1 */
+ ldx [%o0], %o5
+ and %o1, 0x7, %g1
+ mov -1, %g5
- sllx %g1, 7, %g4 /* IEU0 Group */
- bne,a,pn %icc, 15f /* CTI */
- add %o0, 1, %o0 /* IEU1 */
- /* %g1 = 0x0101010101010101 *
- * %g4 = 0x8080808080808080 *
- * %o0 = string pointer *
- * %o1 = start of string */
-1: ldx [%o0], %o3 /* Load Group */
+ sethi %hi(0x01010101), %o2
+ sll %g1, 3, %g1
- add %o0, 8, %o0 /* IEU1 */
-2: sub %o3, %g1, %o2 /* IEU0 Group */
-#ifdef EIGHTBIT_NOT_RARE
- andn %o2, %o3, %o5 /* IEU0 Group */
- ldxa [%o0] ASI_PNF, %o3 /* Load */
- andcc %o5, %g4, %g0 /* IEU1 Group */
-#else
- ldxa [%o0] ASI_PNF, %o3 /* Load */
- andcc %o2, %g4, %g0 /* IEU1 Group */
-#endif
+ or %o2, %lo(0x01010101), %o2
+ srlx %g5, %g1, %o3
- be,pt %xcc, 2b /* CTI */
- add %o0, 8, %o0 /* IEU0 */
- addcc %o2, %g1, %g5 /* IEU1 Group */
-#ifdef EIGHTBIT_NOT_RARE
- srlx %o5, 32, %o5 /* IEU0 */
+ sllx %o2, 32, %g1
+ sethi %hi(0x0000ff00), %g5
-3: andcc %o5, %g4, %g0 /* IEU1 Group */
-#else
- srlx %o2, 32, %o2 /* IEU0 */
+ orn %o5, %o3, %o5
+ or %o2, %g1, %o2
-3: andcc %o2, %g4, %g0 /* IEU1 Group */
-#endif
- be,pn %xcc, 4f /* CTI */
- srlx %g5, 56, %o2 /* IEU0 */
- andcc %o2, 0xff, %g0 /* IEU1 Group */
+ sllx %o2, 7, %o3
+10: add %o0, 8, %o0
- be,pn %icc, 12f /* CTI */
- srlx %g5, 48, %o2 /* IEU0 */
- andcc %o2, 0xff, %g0 /* IEU1 Group */
- be,pn %icc, 11f /* CTI */
+ andn %o3, %o5, %g1
+ sub %o5, %o2, %g2
- srlx %g5, 40, %o2 /* IEU0 */
- andcc %o2, 0xff, %g0 /* IEU1 Group */
- be,pn %icc, 10f /* CTI */
- srlx %g5, 32, %o2 /* IEU0 */
+ andcc %g1, %g2, %g0
+ be,a,pt %xcc, 10b
+ ldx [%o0], %o5
+ srlx %o5, 32, %g1
- andcc %o2, 0xff, %g0 /* IEU1 Group */
- be,pn %icc, 9f /* CTI */
-4: srlx %g5, 24, %o2 /* IEU0 */
- andcc %o2, 0xff, %g0 /* IEU1 Group */
+ andn %o3, %g1, %o4
+ sub %g1, %o2, %g2
- be,pn %icc, 8f /* CTI */
- srlx %g5, 16, %o2 /* IEU0 */
- andcc %o2, 0xff, %g0 /* IEU1 Group */
- be,pn %icc, 7f /* CTI */
+ add %o0, 4, %g3
+ andcc %o4, %g2, %g0
+ movne %icc, %g1, %o5
- srlx %g5, 8, %o2 /* IEU0 */
- andcc %o2, 0xff, %g0 /* IEU1 Group */
- be,pn %icc, 6f /* CTI */
- sub %o3, %g1, %o2 /* IEU0 */
+ move %icc, %g3, %o0
+ or %g5, %lo(0x0000ff00), %g5
+ mov 3 - 8, %g2
- andcc %g5, 0xff, %g0 /* IEU1 Group */
- be,pn %icc, 5f /* CTI */
- ldxa [%o0] ASI_PNF, %o3 /* Load */
- andcc %o2, %g4, %g0 /* IEU1 Group */
+ andcc %o5, %g5, %g0
+ srlx %o5, 16, %g1
+ move %icc, 2 - 8, %g2
- be,pt %xcc, 2b /* CTI */
- add %o0, 8, %o0 /* IEU0 */
- addcc %o2, %g1, %g5 /* IEU1 Group */
- ba,pt %xcc, 3b /* CTI */
+ andcc %g1, 0xff, %g0
+ srl %o5, 24, %o5
+ move %icc, 1 - 8, %g2
- srlx %o2, 32, %o2 /* IEU0 */
-5: add %o0, -9, %o0 /* IEU0 Group */
- retl /* CTI+IEU1 Group */
- sub %o0, %o1, %o0 /* IEU0 */
+ movrz %o5, 0 - 8, %g2
+ sub %o0, %o1, %o0
-6: add %o0, -10, %o0 /* IEU0 Group */
- retl /* CTI+IEU1 Group */
- sub %o0, %o1, %o0 /* IEU0 */
-7: add %o0, -11, %o0 /* IEU0 Group */
-
- retl /* CTI+IEU1 Group */
- sub %o0, %o1, %o0 /* IEU0 */
-8: add %o0, -12, %o0 /* IEU0 Group */
- retl /* CTI+IEU1 Group */
-
- sub %o0, %o1, %o0 /* IEU0 */
-9: add %o0, -13, %o0 /* IEU0 Group */
- retl /* CTI+IEU1 Group */
- sub %o0, %o1, %o0 /* IEU0 */
-
-10: add %o0, -14, %o0 /* IEU0 Group */
- retl /* CTI+IEU1 Group */
- sub %o0, %o1, %o0 /* IEU0 */
-11: add %o0, -15, %o0 /* IEU0 Group */
-
- retl /* CTI+IEU1 Group */
- sub %o0, %o1, %o0 /* IEU0 */
-12: add %o0, -16, %o0 /* IEU0 Group */
- retl /* CTI+IEU1 Group */
-
- sub %o0, %o1, %o0 /* IEU0 */
-13: retl /* CTI+IEU1 Group */
- mov 0, %o0 /* IEU0 */
- nop
-
-15: ldub [%o0], %o3 /* Load Group */
-16: andcc %o0, 7, %g0 /* IEU1 */
- be,pn %icc, 1b /* CTI */
- nop /* IEU0 Group */
-
- add %o0, 1, %o0 /* IEU1 */
- andcc %o3, 0xff, %g0 /* IEU1 Group */
- bne,a,pt %icc, 16b /* CTI */
- lduba [%o0] ASI_PNF, %o3 /* Load */
-
- add %o0, -1, %o0 /* IEU0 Group */
- retl /* CTI+IEU1 Group */
- sub %o0, %o1, %o0 /* IEU0 */
+ retl
+ add %o0, %g2, %o0
END(strlen)
libc_hidden_builtin_def (strlen)