diff options
Diffstat (limited to 'libpthread')
60 files changed, 1578 insertions, 1651 deletions
diff --git a/libpthread/linuxthreads.old/sysdeps/arm/pt-machine.h b/libpthread/linuxthreads.old/sysdeps/arm/pt-machine.h index 438c12ab9..2b877f980 100644 --- a/libpthread/linuxthreads.old/sysdeps/arm/pt-machine.h +++ b/libpthread/linuxthreads.old/sysdeps/arm/pt-machine.h @@ -21,12 +21,50 @@ #ifndef _PT_MACHINE_H #define _PT_MACHINE_H 1 -#include <features.h> +#include <sys/syscall.h> +#include <unistd.h> #ifndef PT_EI # define PT_EI __extern_always_inline #endif +#if defined(__thumb__) +#if defined(__USE_LDREXSTREX__) +PT_EI long int ldrex(int *spinlock) +{ + long int ret; + __asm__ __volatile__( + "ldrex %0, [%1]\n" + : "=r"(ret) + : "r"(spinlock) : "memory"); + return ret; +} + +PT_EI long int strex(int val, int *spinlock) +{ + long int ret; + __asm__ __volatile__( + "strex %0, %1, [%2]\n" + : "=r"(ret) + : "r" (val), "r"(spinlock) : "memory"); + return ret; +} + +/* Spinlock implementation; required. */ +PT_EI long int +testandset (int *spinlock) +{ + register unsigned int ret; + + do { + ret = ldrex(spinlock); + } while (strex(1, spinlock)); + + return ret; +} + +#else /* __USE_LDREXSTREX__ */ + /* This will not work on ARM1 or ARM2 because SWP is lacking on those machines. Unfortunately we have no way to detect this at compile time; let's hope nobody tries to use one. */ @@ -36,8 +74,6 @@ PT_EI long int testandset (int *spinlock); PT_EI long int testandset (int *spinlock) { register unsigned int ret; - -#if defined(__thumb__) void *pc; __asm__ __volatile__( ".align 0\n" @@ -50,15 +86,21 @@ PT_EI long int testandset (int *spinlock) "\t.force_thumb" : "=r"(ret), "=r"(pc) : "0"(1), "r"(spinlock)); -#else + return ret; +} +#endif +#else /* __thumb__ */ + +PT_EI long int testandset (int *spinlock); +PT_EI long int testandset (int *spinlock) +{ + register unsigned int ret; __asm__ __volatile__("swp %0, %1, [%2]" : "=r"(ret) : "0"(1), "r"(spinlock)); -#endif - return ret; } - +#endif /* Get some notion of the current stack. Need not be exactly the top of the stack, just something somewhere in the current frame. */ diff --git a/libpthread/linuxthreads/Makefile.in b/libpthread/linuxthreads/Makefile.in index 4a499f78e..c1ec1c9c7 100644 --- a/libpthread/linuxthreads/Makefile.in +++ b/libpthread/linuxthreads/Makefile.in @@ -65,7 +65,7 @@ CFLAGS-OMIT-libc_pthread_init.c := $(CFLAGS-dir_linuxthreads) libpthread_libc_CSRC := \ forward.c libc-cancellation.c libc_pthread_init.c # alloca_cutoff.c libpthread_libc_OBJ := $(patsubst %.c, $(libpthread_OUT)/%.o,$(libpthread_libc_CSRC)) -libc-static-y += $(libpthread_OUT)/libc_pthread_init.o +libc-static-y += $(libpthread_OUT)/libc_pthread_init.o $(libpthread_OUT)/libc-cancellation.o libc-shared-y += $(libpthread_libc_OBJ:.o=.oS) libpthread-static-y += $(patsubst %,$(libpthread_OUT)/%.o,$(libpthread_static_SRC)) diff --git a/libpthread/linuxthreads/sysdeps/m68k/pspinlock.c b/libpthread/linuxthreads/sysdeps/m68k/pspinlock.c index c26a2786f..af77c2a9d 100644 --- a/libpthread/linuxthreads/sysdeps/m68k/pspinlock.c +++ b/libpthread/linuxthreads/sysdeps/m68k/pspinlock.c @@ -27,10 +27,15 @@ __pthread_spin_lock (pthread_spinlock_t *lock) unsigned int val; do - __asm__ __volatile__ ("tas %1; sne %0" - : "=dm" (val), "=m" (*lock) - : "m" (*lock) - : "cc"); + __asm__ __volatile__ ( +#if !defined(__mcoldfire__) && !defined(__mcf5200__) && !defined(__m68000) + "tas %1; sne %0" +#else + "bset #7,%1; sne %0" +#endif + : "=dm" (val), "=m" (*lock) + : "m" (*lock) + : "cc"); while (val); return 0; @@ -43,7 +48,12 @@ __pthread_spin_trylock (pthread_spinlock_t *lock) { unsigned int val; - __asm__ __volatile__ ("tas %1; sne %0" + __asm__ __volatile__ ( +#if !defined(__mcoldfire__) && !defined(__mcf5200__) && !defined(__m68000) + "tas %1; sne %0" +#else + "bset #7,%1; sne %0" +#endif : "=dm" (val), "=m" (*lock) : "m" (*lock) : "cc"); diff --git a/libpthread/linuxthreads/sysdeps/m68k/pt-machine.h b/libpthread/linuxthreads/sysdeps/m68k/pt-machine.h index e2d7bdc81..1eb9fd57b 100644 --- a/libpthread/linuxthreads/sysdeps/m68k/pt-machine.h +++ b/libpthread/linuxthreads/sysdeps/m68k/pt-machine.h @@ -28,12 +28,18 @@ #endif /* Spinlock implementation; required. */ +PT_EI long int testandset (int *spinlock); PT_EI long int testandset (int *spinlock) { char ret; - __asm__ __volatile__("tas %1; sne %0" + __asm__ __volatile__( +#if !defined(__mcoldfire__) && !defined(__mcf5200__) && !defined(__m68000) + "tas %1; sne %0" +#else + "bset #7,%1; sne %0" +#endif : "=dm"(ret), "=m"(*spinlock) : "m"(*spinlock) : "cc"); @@ -50,6 +56,7 @@ register char * stack_pointer __asm__ ("%sp"); /* Compare-and-swap for semaphores. */ +#if !defined(__mcoldfire__) && !defined(__mcf5200__) && !defined(__mc68000) #define HAS_COMPARE_AND_SWAP PT_EI int __compare_and_swap (long int *p, long int oldval, long int newval) @@ -63,5 +70,5 @@ __compare_and_swap (long int *p, long int oldval, long int newval) return ret; } - +#endif #endif /* pt-machine.h */ diff --git a/libpthread/linuxthreads/sysdeps/pthread/herrno-loc.c b/libpthread/linuxthreads/sysdeps/pthread/herrno-loc.c index 706faeff3..634c75245 100644 --- a/libpthread/linuxthreads/sysdeps/pthread/herrno-loc.c +++ b/libpthread/linuxthreads/sysdeps/pthread/herrno-loc.c @@ -16,7 +16,9 @@ <http://www.gnu.org/licenses/>. */ #include <netdb.h> +#ifdef __UCLIBC_HAS_TLS__ #include <tls.h> +#endif #include <linuxthreads/internals.h> #include <sysdep-cancel.h> diff --git a/libpthread/linuxthreads/sysdeps/s390/pspinlock.c b/libpthread/linuxthreads/sysdeps/s390/pspinlock.c deleted file mode 100644 index be7578642..000000000 --- a/libpthread/linuxthreads/sysdeps/s390/pspinlock.c +++ /dev/null @@ -1,90 +0,0 @@ -/* POSIX spinlock implementation. S/390 version. - Copyright (C) 2000, 2004 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). - 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; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include "internals.h" - -/* This implementation is similar to the one used in the Linux kernel. - But the kernel is byte instructions for the memory access. This is - faster but unusable here. The problem is that only 128 - threads/processes could use the spinlock at the same time. If (by - a design error in the program) a thread/process would hold the - spinlock for a time long enough to accumulate 128 waiting - processes, the next one will find a positive value in the spinlock - and assume it is unlocked. We cannot accept that. */ - -int -__pthread_spin_lock (pthread_spinlock_t *lock) -{ - __asm__ __volatile__(" basr 1,0\n" - "0: slr 0,0\n" - " cs 0,1,%1\n" - " jl 0b\n" - : "=m" (*lock) - : "m" (*lock) : "0", "1", "cc" ); - return 0; -} -weak_alias (__pthread_spin_lock, pthread_spin_lock) - -int -__pthread_spin_trylock (pthread_spinlock_t *lock) -{ - int oldval; - - __asm__ __volatile__(" slr %1,%1\n" - " basr 1,0\n" - "0: cs %1,1,%0" - : "=m" (*lock), "=&d" (oldval) - : "m" (*lock) : "1", "cc" ); - return oldval == 0 ? 0 : EBUSY; -} -weak_alias (__pthread_spin_trylock, pthread_spin_trylock) - - -int -__pthread_spin_unlock (pthread_spinlock_t *lock) -{ - __asm__ __volatile__(" xc 0(4,%0),0(%0)\n" - " bcr 15,0" - : : "a" (lock) : "memory" ); - return 0; -} -weak_alias (__pthread_spin_unlock, pthread_spin_unlock) - - -int -__pthread_spin_init (pthread_spinlock_t *lock, int pshared) -{ - /* We can ignore the `pshared' parameter. Since we are busy-waiting - all processes which can access the memory location `lock' points - to can use the spinlock. */ - *lock = 0; - return 0; -} -weak_alias (__pthread_spin_init, pthread_spin_init) - - -int -__pthread_spin_destroy (pthread_spinlock_t *lock) -{ - /* Nothing to do. */ - return 0; -} -weak_alias (__pthread_spin_destroy, pthread_spin_destroy) diff --git a/libpthread/linuxthreads/sysdeps/s390/s390-32/pt-machine.h b/libpthread/linuxthreads/sysdeps/s390/s390-32/pt-machine.h deleted file mode 100644 index 51505a97d..000000000 --- a/libpthread/linuxthreads/sysdeps/s390/s390-32/pt-machine.h +++ /dev/null @@ -1,119 +0,0 @@ -/* Machine-dependent pthreads configuration and inline functions. - S390 version. - Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). - 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; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#ifndef _PT_MACHINE_H -#define _PT_MACHINE_H 1 - -#ifndef PT_EI -# define PT_EI __extern_always_inline -#endif - -extern long int testandset (int *spinlock); -extern int __compare_and_swap (long int *p, long int oldval, long int newval); - -/* For multiprocessor systems, we want to ensure all memory accesses - are completed before we reset a lock. On other systems, we still - need to make sure that the compiler has flushed everything to memory. */ -#define MEMORY_BARRIER() __asm__ __volatile__ ("bcr 15,0" : : : "memory") - -/* Spinlock implementation; required. */ -PT_EI long int -testandset (int *spinlock) -{ - int ret; - - __asm__ __volatile__( - " la 1,%1\n" - " lhi 0,1\n" - " l %0,%1\n" - "0: cs %0,0,0(1)\n" - " jl 0b" - : "=&d" (ret), "+m" (*spinlock) - : : "0", "1", "cc"); - - return ret; -} - - -/* Get some notion of the current stack. Need not be exactly the top - of the stack, just something somewhere in the current frame. */ -#define CURRENT_STACK_FRAME stack_pointer -register char * stack_pointer __asm__ ("15"); - -#ifdef __UCLIBC_HAS_TLS__ -/* Return the thread descriptor for the current thread. */ -# define THREAD_SELF ((pthread_descr) __builtin_thread_pointer ()) - -/* Initialize the thread-unique value. */ -#define INIT_THREAD_SELF(descr, nr) __builtin_set_thread_pointer (descr) -#else -/* Return the thread descriptor for the current thread. - S/390 registers uses access register 0 as "thread register". */ -#define THREAD_SELF ({ \ - register pthread_descr __self; \ - __asm__ ("ear %0,%%a0" : "=d" (__self) ); \ - __self; \ -}) - -/* Initialize the thread-unique value. */ -#define INIT_THREAD_SELF(descr, nr) ({ \ - __asm__ ("sar %%a0,%0" : : "d" (descr) ); \ -}) -#endif - -/* Access to data in the thread descriptor is easy. */ -#define THREAD_GETMEM(descr, member) \ - ((void) sizeof (descr), THREAD_SELF->member) -#define THREAD_GETMEM_NC(descr, member) \ - ((void) sizeof (descr), THREAD_SELF->member) -#define THREAD_SETMEM(descr, member, value) \ - ((void) sizeof (descr), THREAD_SELF->member = (value)) -#define THREAD_SETMEM_NC(descr, member, value) \ - ((void) sizeof (descr), THREAD_SELF->member = (value)) - -/* We want the OS to assign stack addresses. */ -#define FLOATING_STACKS 1 - -/* Maximum size of the stack if the rlimit is unlimited. */ -#define ARCH_STACK_MAX_SIZE 8*1024*1024 - -/* Compare-and-swap for semaphores. */ - -#define HAS_COMPARE_AND_SWAP - -PT_EI int -__compare_and_swap(long int *p, long int oldval, long int newval) -{ - int retval; - - __asm__ __volatile__( - " la 1,%1\n" - " lr 0,%2\n" - " cs 0,%3,0(1)\n" - " ipm %0\n" - " srl %0,28\n" - "0:" - : "=&d" (retval), "+m" (*p) - : "d" (oldval) , "d" (newval) - : "cc", "0", "1" ); - return retval == 0; -} - -#endif /* pt-machine.h */ diff --git a/libpthread/linuxthreads/sysdeps/s390/s390-64/pt-machine.h b/libpthread/linuxthreads/sysdeps/s390/s390-64/pt-machine.h deleted file mode 100644 index 4bff85aec..000000000 --- a/libpthread/linuxthreads/sysdeps/s390/s390-64/pt-machine.h +++ /dev/null @@ -1,124 +0,0 @@ -/* Machine-dependent pthreads configuration and inline functions. - 64 bit S/390 version. - Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). - 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; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#ifndef _PT_MACHINE_H -#define _PT_MACHINE_H 1 - -#ifndef PT_EI -# define PT_EI __extern_always_inline -#endif - -extern long int testandset (int *spinlock); -extern int __compare_and_swap (long int *p, long int oldval, long int newval); - -/* For multiprocessor systems, we want to ensure all memory accesses - are completed before we reset a lock. On other systems, we still - need to make sure that the compiler has flushed everything to memory. */ -#define MEMORY_BARRIER() __asm__ __volatile__ ("bcr 15,0" : : : "memory") - -/* Spinlock implementation; required. */ -PT_EI long int -testandset (int *spinlock) -{ - int ret; - - __asm__ __volatile__( - " la 1,%1\n" - " lhi 0,1\n" - " l %0,%1\n" - "0: cs %0,0,0(1)\n" - " jl 0b" - : "=&d" (ret), "+m" (*spinlock) - : : "0", "1", "cc"); - - return ret; -} - - -/* Get some notion of the current stack. Need not be exactly the top - of the stack, just something somewhere in the current frame. */ -#define CURRENT_STACK_FRAME stack_pointer -register char * stack_pointer __asm__ ("15"); - -#ifdef __UCLIBC_HAS_TLS__ -/* Return the thread descriptor for the current thread. */ -# define THREAD_SELF ((pthread_descr) __builtin_thread_pointer ()) - -/* Initialize the thread-unique val |