diff options
Diffstat (limited to 'libpthread/nptl/sysdeps')
154 files changed, 2681 insertions, 5722 deletions
| diff --git a/libpthread/nptl/sysdeps/aarch64/pthreaddef.h b/libpthread/nptl/sysdeps/aarch64/pthreaddef.h index d9495f9cb..7172f406b 100644 --- a/libpthread/nptl/sysdeps/aarch64/pthreaddef.h +++ b/libpthread/nptl/sysdeps/aarch64/pthreaddef.h @@ -14,9 +14,6 @@     License along with the GNU C Library; if not, see     <http://www.gnu.org/licenses/>.  */ -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  */  #define STACK_ALIGN 16 diff --git a/libpthread/nptl/sysdeps/alpha/pthreaddef.h b/libpthread/nptl/sysdeps/alpha/pthreaddef.h index 72a311c33..6b99f3b4f 100644 --- a/libpthread/nptl/sysdeps/alpha/pthreaddef.h +++ b/libpthread/nptl/sysdeps/alpha/pthreaddef.h @@ -15,9 +15,6 @@     License along with the GNU C Library; if not, see     <http://www.gnu.org/licenses/>.  */ -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE	(4 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  The ABI requires 16.  */  #define STACK_ALIGN		16 diff --git a/libpthread/nptl/sysdeps/arc/dl-tls.h b/libpthread/nptl/sysdeps/arc/dl-tls.h index 34e54e4d3..e81c0c187 100644 --- a/libpthread/nptl/sysdeps/arc/dl-tls.h +++ b/libpthread/nptl/sysdeps/arc/dl-tls.h @@ -26,3 +26,6 @@ typedef struct  extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed.  */ +#define TLS_DTV_UNALLOCATED    ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/arc/pthreaddef.h b/libpthread/nptl/sysdeps/arc/pthreaddef.h index bf4f0f29a..0fb28dc48 100644 --- a/libpthread/nptl/sysdeps/arc/pthreaddef.h +++ b/libpthread/nptl/sysdeps/arc/pthreaddef.h @@ -17,9 +17,6 @@  #include <sysdep.h> -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  */  #define STACK_ALIGN		8 diff --git a/libpthread/nptl/sysdeps/arm/dl-tls.h b/libpthread/nptl/sysdeps/arm/dl-tls.h index a728455e4..a79ea7160 100644 --- a/libpthread/nptl/sysdeps/arm/dl-tls.h +++ b/libpthread/nptl/sysdeps/arm/dl-tls.h @@ -26,3 +26,6 @@ typedef struct  extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed.  */ +#define TLS_DTV_UNALLOCATED    ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/arm/pthreaddef.h b/libpthread/nptl/sysdeps/arm/pthreaddef.h index a05ac879d..f790a6dca 100644 --- a/libpthread/nptl/sysdeps/arm/pthreaddef.h +++ b/libpthread/nptl/sysdeps/arm/pthreaddef.h @@ -15,9 +15,6 @@     License along with the GNU C Library; if not, see     <http://www.gnu.org/licenses/>.  */ -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  SSE requires 16     bytes.  */  #define STACK_ALIGN		16 diff --git a/libpthread/nptl/sysdeps/csky/dl-tls.h b/libpthread/nptl/sysdeps/csky/dl-tls.h index ebf1a7dc3..7171d47ea 100644 --- a/libpthread/nptl/sysdeps/csky/dl-tls.h +++ b/libpthread/nptl/sysdeps/csky/dl-tls.h @@ -14,3 +14,5 @@ typedef struct  extern void *__tls_get_addr (tls_index *ti); +/* Value used for dtv entries for which the allocation is delayed.  */ +#define TLS_DTV_UNALLOCATED    ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/csky/pthreaddef.h b/libpthread/nptl/sysdeps/csky/pthreaddef.h index 992fced01..4aa97ee27 100644 --- a/libpthread/nptl/sysdeps/csky/pthreaddef.h +++ b/libpthread/nptl/sysdeps/csky/pthreaddef.h @@ -5,9 +5,6 @@   * in this tarball.   */ -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  SSE requires 16     bytes.  */  #define STACK_ALIGN		16 diff --git a/libpthread/nptl/sysdeps/generic/Makefile.in b/libpthread/nptl/sysdeps/generic/Makefile.in index eb656ee17..a5ba9bbe8 100644 --- a/libpthread/nptl/sysdeps/generic/Makefile.in +++ b/libpthread/nptl/sysdeps/generic/Makefile.in @@ -13,6 +13,10 @@ subdirs += libpthread/nptl/sysdeps/generic  libpthread_generic_DIR := $(top_srcdir)libpthread/nptl/sysdeps/generic  libpthread_generic_OUT := $(top_builddir)libpthread/nptl/sysdeps/generic +ifeq ($(STATIC_PIE),y) +CFLAGS-libc-tls.c := -DSTATIC_PIE +endif +  libpthread_generic_libc_a_CSRC = libc-tls.c  libpthread_generic_libc_a_COBJ = $(patsubst %.c,$(libpthread_generic_OUT)/%.o,$(libpthread_generic_libc_a_CSRC))  libpthread_generic_libc_a_OBJS = $(libpthread_generic_libc_a_COBJ) diff --git a/libpthread/nptl/sysdeps/generic/dl-tls.c b/libpthread/nptl/sysdeps/generic/dl-tls.c index 989e587a2..7b7991be8 100644 --- a/libpthread/nptl/sysdeps/generic/dl-tls.c +++ b/libpthread/nptl/sysdeps/generic/dl-tls.c @@ -45,9 +45,10 @@     to allow dynamic loading of modules defining IE-model TLS data.  */  # define TLS_STATIC_SURPLUS	64 + DL_NNS * 100 -/* Value used for dtv entries for which the allocation is delayed.  */ -# define TLS_DTV_UNALLOCATED	((void *) -1l) +#ifndef SHARED +extern dtv_t static_dtv; +#endif  /* Out-of-memory handler.  */  # ifdef SHARED @@ -584,6 +585,8 @@ _dl_deallocate_tls (void *tcb, bool dealloc_tcb)    /* The array starts with dtv[-1].  */  #ifdef SHARED    if (dtv != GL(dl_initial_dtv)) +#else +  if ((dtv - 1) != &static_dtv)  #endif      free (dtv - 1); diff --git a/libpthread/nptl/sysdeps/generic/libc-tls.c b/libpthread/nptl/sysdeps/generic/libc-tls.c index a6df4cdc4..7cfe9ac1a 100644 --- a/libpthread/nptl/sysdeps/generic/libc-tls.c +++ b/libpthread/nptl/sysdeps/generic/libc-tls.c @@ -42,7 +42,10 @@ extern size_t _dl_phnum;  extern int __tdata_start;  #endif -static dtv_t static_dtv[2 + TLS_SLOTINFO_SURPLUS]; +#ifdef SHARED +static +#endif +dtv_t static_dtv[2 + TLS_SLOTINFO_SURPLUS];  static struct @@ -114,6 +117,10 @@ init_static_tls (size_t memsz, size_t align)    GL(dl_tls_static_nelem) = GL(dl_tls_max_dtv_idx);  } +#if !defined(__FDPIC__) && !defined(SHARED) && defined(STATIC_PIE) +ElfW(Addr) _dl_load_base; +#endif +  void __libc_setup_tls (size_t tcbsize, size_t tcbalign);  void  __libc_setup_tls (size_t tcbsize, size_t tcbalign) @@ -139,6 +146,9 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign)  	  initimage = (void *) &__tdata_start;  #else  	  initimage = (void *) phdr->p_vaddr; +#if !defined(SHARED) && defined(STATIC_PIE) +	  initimage += _dl_load_base; +#endif  #endif  	  align = phdr->p_align;  	  if (phdr->p_align > max_align) @@ -159,10 +169,13 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign)       for FDPIC MMU-less platforms:       fs/binfmt_elf_fdpic.c: fix brk area overlap with stack on NOMMU       https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/fs/binfmt_elf_fdpic.c?id=4ac313111018cb44ecc250445de5ccb93026a980 +     Loading static PIE ELFs on noMMU is possible since the linux kernel commit +     1bde925d2354 ("fs/binfmt_elf_fdpic.c: provide NOMMU loader for regular ELF binaries") +     and it is subject to the same brk restriction.     */  # if defined(TLS_TCB_AT_TP)    tcb_offset = roundup (memsz + GL(dl_tls_static_size), tcbalign); -#  if defined(__FDPIC__) +#  if defined(__FDPIC__) || (!defined(__ARCH_USE_MMU__) && defined(STATIC_PIE))    tlsblock = mmap (NULL, tcb_offset + tcbsize + max_align,                     PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);  #  else @@ -170,7 +183,7 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign)  #  endif  # elif defined(TLS_DTV_AT_TP)    tcb_offset = roundup (tcbsize, align ?: 1); -#  if defined(__FDPIC__) +#  if defined(__FDPIC__) || (!defined(__ARCH_USE_MMU__) && defined(STATIC_PIE))    tlsblock = mmap (NULL, tcb_offset + memsz + max_align + TLS_PRE_TCB_SIZE + GL(dl_tls_static_size),                     PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);  #  else diff --git a/libpthread/nptl/sysdeps/i386/dl-tls.h b/libpthread/nptl/sysdeps/i386/dl-tls.h index 32495c1e0..004082407 100644 --- a/libpthread/nptl/sysdeps/i386/dl-tls.h +++ b/libpthread/nptl/sysdeps/i386/dl-tls.h @@ -59,3 +59,6 @@ strong_alias (___tls_get_addr, ___tls_get_addr_internal)  # endif  #endif + +/* Value used for dtv entries for which the allocation is delayed.  */ +#define TLS_DTV_UNALLOCATED    ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/i386/pthreaddef.h b/libpthread/nptl/sysdeps/i386/pthreaddef.h index a0659039d..2fd27113c 100644 --- a/libpthread/nptl/sysdeps/i386/pthreaddef.h +++ b/libpthread/nptl/sysdeps/i386/pthreaddef.h @@ -16,9 +16,6 @@     License along with the GNU C Library; if not, see     <http://www.gnu.org/licenses/>.  */ -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  SSE requires 16     bytes.  */  #define STACK_ALIGN		16 diff --git a/libpthread/nptl/sysdeps/i386/tls.h b/libpthread/nptl/sysdeps/i386/tls.h index 17c80e5fc..63c77c561 100644 --- a/libpthread/nptl/sysdeps/i386/tls.h +++ b/libpthread/nptl/sysdeps/i386/tls.h @@ -55,7 +55,7 @@ typedef struct  #ifndef __ASSUME_PRIVATE_FUTEX    int private_futex;  #else -  int __unused1; +  int __uclibc_unused1;  #endif    /* Reservation of some values for the TM ABI.  */    void *__private_tm[5]; diff --git a/libpthread/nptl/sysdeps/kvx/Makefile.arch b/libpthread/nptl/sysdeps/kvx/Makefile.arch new file mode 100644 index 000000000..b2ad58197 --- /dev/null +++ b/libpthread/nptl/sysdeps/kvx/Makefile.arch @@ -0,0 +1,9 @@ +# Makefile for uClibc NPTL +# +# Copyright (C) 2019 Kalray +# +# Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. +# + +libc_arch_a_CSRC = unwind-forcedunwind.c libc-tls.c +CFLAGS-unwind-forcedunwind.c = -fexceptions -fasynchronous-unwind-tables diff --git a/libpthread/nptl/sysdeps/kvx/dl-tls.h b/libpthread/nptl/sysdeps/kvx/dl-tls.h new file mode 100644 index 000000000..61b810db6 --- /dev/null +++ b/libpthread/nptl/sysdeps/kvx/dl-tls.h @@ -0,0 +1,47 @@ +/* + * This file is subject to the terms and conditions of the LGPL V2.1 + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2019 Kalray Inc. + */ + +#ifndef _KVX_DL_TLS_H +#define _KVX_DL_TLS_H 1 + +/* Type used to represent a TLS descriptor in the GOT.  */ +struct tlsdesc +{ +  ptrdiff_t (*entry) (struct tlsdesc *); +  void *arg; +}; + +typedef struct dl_tls_index +{ +  unsigned long int ti_module; +  unsigned long int ti_offset; +} tls_index; + +/* Type used as the argument in a TLS descriptor for a symbol that +   needs dynamic TLS offsets.  */ +struct tlsdesc_dynamic_arg +{ +  tls_index tlsinfo; +  size_t gen_count; +}; + +extern ptrdiff_t attribute_hidden +_dl_tlsdesc_return (struct tlsdesc *); + +# ifdef SHARED +extern void *_dl_make_tlsdesc_dynamic (struct link_map *, size_t); + +extern ptrdiff_t attribute_hidden +_dl_tlsdesc_dynamic (struct tlsdesc *); +# endif + +extern void *__tls_get_addr (tls_index *ti); + +#define TLS_DTV_UNALLOCATED ((void *) -1l) + +#endif diff --git a/libpthread/nptl/sysdeps/kvx/libc-tls.c b/libpthread/nptl/sysdeps/kvx/libc-tls.c new file mode 100644 index 000000000..5fd9e7e70 --- /dev/null +++ b/libpthread/nptl/sysdeps/kvx/libc-tls.c @@ -0,0 +1,26 @@ +/* + * This file is subject to the terms and conditions of the LGPL V2.1 + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2020 Kalray Inc. + */ + +#include <sysdeps/generic/libc-tls.c> +#include <dl-tls.h> + +#if defined(USE_TLS) && USE_TLS + +/* On kvx, linker optimizations are not required, so __tls_get_addr +   can be called even in statically linked binaries.  In this case module +   must be always 1 and PT_TLS segment exist in the binary, otherwise it +   would not link.  */ + +void * +__tls_get_addr (tls_index *ti) +{ +  dtv_t *dtv = THREAD_DTV (); +  return (char *) dtv[1].pointer.val + ti->ti_offset; +} + +#endif diff --git a/libpthread/nptl/sysdeps/kvx/pthread_spin_lock.c b/libpthread/nptl/sysdeps/kvx/pthread_spin_lock.c new file mode 100644 index 000000000..6f77c6250 --- /dev/null +++ b/libpthread/nptl/sysdeps/kvx/pthread_spin_lock.c @@ -0,0 +1,60 @@ +/* pthread_spin_lock -- lock a spin lock.  Generic version. +   Copyright (C) 2012-2016 Free Software Foundation, Inc. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +#include <atomic.h> +#include "pthreadP.h" + +/* A machine-specific version can define SPIN_LOCK_READS_BETWEEN_CMPXCHG +  to the number of plain reads that it's optimal to spin on between uses +  of atomic_compare_and_exchange_val_acq.  If spinning forever is optimal +  then use -1.  If no plain reads here would ever be optimal, use 0.  */ +#define SPIN_LOCK_READS_BETWEEN_CMPXCHG 1000 + +int +pthread_spin_lock (pthread_spinlock_t *lock) +{ +  /* atomic_exchange usually takes less instructions than +     atomic_compare_and_exchange.  On the other hand, +     atomic_compare_and_exchange potentially generates less bus traffic +     when the lock is locked. +     We assume that the first try mostly will be successful, and we use +     atomic_exchange.  For the subsequent tries we use +     atomic_compare_and_exchange.  */ +  if (atomic_exchange_acq (lock, 1) == 0) +    return 0; + +  do { +      /* The lock is contended and we need to wait.  Going straight back +	 to cmpxchg is not a good idea on many targets as that will force +	 expensive memory synchronizations among processors and penalize other +	 running threads. +	 On the other hand, we do want to update memory state on the local core +	 once in a while to avoid spinning indefinitely until some event that +	 will happen to update local memory as a side-effect.  */ +      if (SPIN_LOCK_READS_BETWEEN_CMPXCHG >= 0) { +	  int wait = SPIN_LOCK_READS_BETWEEN_CMPXCHG; + +	  while (*lock != 0 && wait > 0) +	    --wait; +      } else { +	  while (*lock != 0) +	    ; +      } +  } while (atomic_compare_and_exchange_val_acq (lock, 1, 0) != 0); + +  return 0; +} diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S b/libpthread/nptl/sysdeps/kvx/pthread_spin_trylock.c index 74dda472f..4e9aa64d3 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S +++ b/libpthread/nptl/sysdeps/kvx/pthread_spin_trylock.c @@ -1,6 +1,5 @@ -/* Copyright (C) 2002, 2003, 2007 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. +/* pthread_spin_trylock -- trylock a spin lock.  Generic version. +   Copyright (C) 2012-2016 Free Software Foundation, Inc.     The GNU C Library is free software; you can redistribute it and/or     modify it under the terms of the GNU Lesser General Public @@ -16,4 +15,12 @@     License along with the GNU C Library; if not, see     <http://www.gnu.org/licenses/>.  */ -#include "lowlevellock.S" +#include <errno.h> +#include <atomic.h> +#include "pthreadP.h" + +int +pthread_spin_trylock (pthread_spinlock_t *lock) +{ +  return atomic_exchange_acq (lock, 1) ? EBUSY : 0; +} diff --git a/libpthread/nptl/sysdeps/kvx/pthreaddef.h b/libpthread/nptl/sysdeps/kvx/pthreaddef.h new file mode 100644 index 000000000..03945bc5f --- /dev/null +++ b/libpthread/nptl/sysdeps/kvx/pthreaddef.h @@ -0,0 +1,23 @@ +/* + * This file is subject to the terms and conditions of the LGPL V2.1 + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2019 Kalray Inc. + */ + +/* Required stack pointer alignment at beginning.  */ +#define STACK_ALIGN 32 + +/* Minimal stack size after allocating thread descriptor and guard size.  */ +#define MINIMAL_REST_STACK 2048 + +/* Alignment requirement for TCB.  */ +#define TCB_ALIGNMENT 32 + +/* Location of current stack frame.  */ +#define CURRENT_STACK_FRAME	__builtin_frame_address (0) + +/* XXX Until we have a better place keep the definitions here.  */ +#define __exit_thread_inline(val) \ +  INLINE_SYSCALL (exit, 1, (val)) diff --git a/libpthread/nptl/sysdeps/kvx/tcb-offsets.sym b/libpthread/nptl/sysdeps/kvx/tcb-offsets.sym new file mode 100644 index 000000000..238647dd4 --- /dev/null +++ b/libpthread/nptl/sysdeps/kvx/tcb-offsets.sym @@ -0,0 +1,6 @@ +#include <sysdep.h> +#include <tls.h> + +PTHREAD_MULTIPLE_THREADS_OFFSET		offsetof (struct pthread, header.multiple_threads) +PTHREAD_TID_OFFSET			offsetof (struct pthread, tid) +PTHREAD_SIZEOF				sizeof (struct pthread) diff --git a/libpthread/nptl/sysdeps/kvx/tls.h b/libpthread/nptl/sysdeps/kvx/tls.h new file mode 100644 index 000000000..a3e7fa97b --- /dev/null +++ b/libpthread/nptl/sysdeps/kvx/tls.h @@ -0,0 +1,160 @@ +/* + * This file is subject to the terms and conditions of the LGPL V2.1 + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2019 Kalray Inc. + */ + +#ifndef _TLS_H +#define _TLS_H	1 + +#ifndef __ASSEMBLER__ +# include <stdbool.h> +# include <stddef.h> +# include <stdint.h> + +/* Type for the dtv.  */ +typedef union dtv +{ +  size_t counter; +  struct +  { +    void *val; +    bool is_static; +  } pointer; +} dtv_t; + +#else /* __ASSEMBLER__ */ +# include <tcb-offsets.h> +#endif /* __ASSEMBLER__ */ + +/* We require TLS support in the tools.  */ +#define HAVE_TLS_SUPPORT                1 +#define HAVE_TLS_MODEL_ATTRIBUTE        1 +#define HAVE___THREAD                   1 + +/* Signal that TLS support is available.  */ +#define USE_TLS	1 + +#ifndef __ASSEMBLER__ + +/* Get system call information.  */ +# include <sysdep.h> + +/* The TP points to the start of the thread blocks.  */ +# define TLS_DTV_AT_TP	1 + +/* Get the thread descriptor definition.  */ +# include <../../descr.h> + +typedef struct +{ +  dtv_t *dtv; +} tcbhead_t; + +/* Thread Pointer $tp is $r13 */ +register tcbhead_t *__thread_self __asm__("$r13"); + +/* This is the size of the initial TCB.  */ +# define TLS_INIT_TCB_SIZE	sizeof (tcbhead_t) + +/* Alignment requirements for the initial TCB.  */ +# define TLS_INIT_TCB_ALIGN	__alignof__ (tcbhead_t) + +/* This is the size of the TCB.  */ +# define TLS_TCB_SIZE		sizeof (tcbhead_t) + +/* This is the size we need before TCB.  */ +# define TLS_PRE_TCB_SIZE	sizeof (struct pthread) + +/* Alignment requirements for the TCB.  */ +# define TLS_TCB_ALIGN		__alignof__ (tcbhead_t) + +/* Install the dtv pointer.  The pointer passed is to the element with +   index -1 which contain the length.  */ +# define INSTALL_DTV(tcbp, dtvp) \ +  (((tcbhead_t *) (tcbp))->dtv = (dtvp) + 1) + +/* Install new dtv for current thread.  */ +# define INSTALL_NEW_DTV(dtv) \ +  (THREAD_DTV() = (dtv)) + +/* Return dtv of given thread descriptor.  */ +# define GET_DTV(tcbp) \ +  (((tcbhead_t *) (tcbp))->dtv) + +/* Code to initially initialize the thread pointer. + * + * Set TP to the address _after_ tcbhead_t. This will allow us + * to change the size of tcbhead_t without having to re-link everything. + * + * secondcall has something to do with USE__THREAD, + * seems to always be 0 so we don't care about it. + * + * This has to return NULL on success (or a string with the failure text). + * It's hard to fail this, so return NULL always. + */ +# define TLS_INIT_TP(tcbp, secondcall) \ +  ({__thread_self = ((tcbhead_t *)tcbp + 1); NULL;}) + +/* Return the address of the dtv for the current thread. + * + * Dereference TP, offset to dtv - really straightforward. + * Remember that we made TP point to after tcb, so we need to reverse that. + */ +#  define THREAD_DTV() \ +  ((((tcbhead_t *)__thread_self)-1)->dtv) + +/* Return the thread descriptor for the current thread. + * + * Return a pointer to the TLS_PRE area where we allocated space for + * a struct pthread. Again, TP points to after tcbhead_t, compensate with + * TLS_INIT_TCB_SIZE. + * + * I regard this is a seperate system from the "normal" TLS. + */ +# define THREAD_SELF \ +  ((struct pthread *) ((char *) __thread_self - TLS_INIT_TCB_SIZE \ +    - TLS_PRE_TCB_SIZE)) + +/* Magic for libthread_db to know how to do THREAD_SELF.  */ +# define DB_THREAD_SELF \ +  CONST_THREAD_AREA (64, sizeof (struct pthread)) + +/* Access to data in the thread descriptor is easy.  */ +# define THREAD_GETMEM(descr, member) \ +  descr->member +# define THREAD_GETMEM_NC(descr, member, idx) \ +  descr->member[idx] +# define THREAD_SETMEM(descr, member, value) \ +  descr->member = (value) +# define THREAD_SETMEM_NC(descr, member, idx, value) \ +  descr->member[idx] = (value) + +/* Get and set the global scope generation counter in struct pthread.  */ +# define THREAD_GSCOPE_FLAG_UNUSED 0 +# define THREAD_GSCOPE_FLAG_USED   1 +# define THREAD_GSCOPE_FLAG_WAIT   2 +# define THREAD_GSCOPE_RESET_FLAG() \ +  do									     \ +    { int __res								     \ +	= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag,	     \ +			       THREAD_GSCOPE_FLAG_UNUSED);		     \ +      if (__res == THREAD_GSCOPE_FLAG_WAIT)				     \ +	lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE);   \ +    }									     \ +  while (0) +# define THREAD_GSCOPE_SET_FLAG() \ +  do									     \ +    {									     \ +      THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED;	     \ +      atomic_write_barrier ();						     \ +    }									     \ +  while (0) +# define THREAD_GSCOPE_WAIT() \ +  GL(dl_wait_lookup_done) () + +# endif /* __ASSEMBLER__ */ + +#endif	/* tls.h */ diff --git a/libpthread/nptl/sysdeps/kvx/unwind-forcedunwind.c b/libpthread/nptl/sysdeps/kvx/unwind-forcedunwind.c new file mode 100644 index 000000000..b9618dead --- /dev/null +++ b/libpthread/nptl/sysdeps/kvx/unwind-forcedunwind.c @@ -0,0 +1,165 @@ +/* Copyright (C) 2003, 2005, 2006, 2009 Free Software Foundation, Inc. +   This file is part of the GNU C Library. +   Contributed by Jakub Jelinek <jakub@redhat.com>. + +   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 <dlfcn.h> +#include <stdio.h> +#include <unwind.h> +#include <pthreadP.h> +#include <sysdep.h> +#include <libgcc_s.h> +#include <unwind-resume.h> + +#define __libc_dlopen(x)        dlopen(x, (RTLD_LOCAL | RTLD_LAZY)) +#define __libc_dlsym            dlsym +#define __libc_dlclose		dlclose + +static void *libgcc_s_handle; +void (*__libgcc_s_resume) (struct _Unwind_Exception *exc) +  attribute_hidden __attribute__ ((noreturn)); +static _Unwind_Reason_Code (*libgcc_s_personality) PERSONALITY_PROTO; +static _Unwind_Reason_Code (*libgcc_s_forcedunwind) +  (struct _Unwind_Exception *, _Unwind_Stop_Fn, void *); +static _Unwind_Word (*libgcc_s_getcfa) (struct _Unwind_Context *); +static void (*libgcc_s_sjlj_register) (struct SjLj_Function_Context *); +static void (*libgcc_s_sjlj_unregister) (struct SjLj_Function_Context *); + +void +__attribute_noinline__ +pthread_cancel_init (void) +{ +  void *resume; +  void *personality; +  void *forcedunwind; +  void *getcfa; +  void *handle; +  void *sjlj_register, *sjlj_unregister; + +  if (__builtin_expect (libgcc_s_handle != NULL, 1)) +    { +      /* Force gcc to reload all values.  */ +      __asm__ __volatile__ ("" ::: "memory"); +      return; +    } + +  handle = __libc_dlopen (LIBGCC_S_SO); + +  resume = __libc_dlsym (handle, "_Unwind_SjLj_Resume"); +  personality = __libc_dlsym (handle, "__gcc_personality_sj0"); +  forcedunwind = __libc_dlsym (handle, "_Unwind_SjLj_ForcedUnwind"); +  getcfa = __libc_dlsym (handle, "_Unwind_GetCFA"); +  sjlj_register = __libc_dlsym (handle, "_Unwind_SjLj_Register"); +  sjlj_unregister = __libc_dlsym (handle, "_Unwind_SjLj_Unregister"); + +  if ((handle == NULL) +      || (resume == NULL) +      || (personality == NULL) +      || (forcedunwind == NULL) +      || (getcfa == NULL) +      || (sjlj_register == NULL) +      || (sjlj_unregister == NULL) +#ifdef ARCH_CANCEL_INIT +      || ARCH_CANCEL_INIT (handle) +#endif +      ) +  { +    fprintf (stderr, +	     LIBGCC_S_SO " must be installed for pthread_cancel to work\n"); +    abort(); +  } + +  __libgcc_s_resume = resume; +  libgcc_s_personality = personality; +  libgcc_s_forcedunwind = forcedunwind; +  libgcc_s_sjlj_register = sjlj_register; +  libgcc_s_sjlj_unregister = sjlj_unregister; +  libgcc_s_getcfa = getcfa; +  /* Make sure libgcc_s_handle is written last.  Otherwise, +     pthread_cancel_init might return early even when the pointer the +     caller is interested in is not initialized yet.  */ +  atomic_write_barrier (); +  libgcc_s_handle = handle; +} + +void +__libc_freeres_fn_section +__unwind_freeres (void) +{ +  void *handle = libgcc_s_handle; +  if (handle != NULL) +    { +      libgcc_s_handle = NULL; +      __libc_dlclose (handle); +    } +} + +#if !HAVE_ARCH_UNWIND_RESUME +void attribute_hidden +_Unwind_Resume (struct _Unwind_Exception *exc) +{ +  if (__builtin_expect (libgcc_s_handle == NULL, 0)) +    pthread_cancel_init (); + +  __libgcc_s_resume(exc); +} +#endif + +_Unwind_Reason_Code attribute_hidden +__gcc_personality_v0 PERSONALITY_PROTO +{ +  if (__builtin_expect (libgcc_s_handle == NULL, 0)) +    pthread_cancel_init (); + +  return libgcc_s_personality PERSONALITY_ARGS; +} + +_Unwind_Reason_Code attribute_hidden +_Unwind_ForcedUnwind (struct _Unwind_Exception *exc, _Unwind_Stop_Fn stop, +		      void *stop_argument) +{ +  if (__builtin_expect (libgcc_s_handle == NULL, 0)) +    pthread_cancel_init (); + +  return libgcc_s_forcedunwind (exc, stop, stop_argument); +} + +_Unwind_Word attribute_hidden +_Unwind_GetCFA (struct _Unwind_Context *context) +{ +  if (__builtin_expect (libgcc_s_handle == NULL, 0)) +    pthread_cancel_init (); + +  return libgcc_s_getcfa (context); +} + +void +_Unwind_SjLj_Register (struct SjLj_Function_Context *fc) +{ +  if (__builtin_expect (libgcc_s_sjlj_register == NULL, 0)) +    pthread_cancel_init (); + +  libgcc_s_sjlj_register (fc); +} + +void +_Unwind_SjLj_Unregister (struct SjLj_Function_Context *fc) +{ +  if (__builtin_expect (libgcc_s_sjlj_unregister == NULL, 0)) +    pthread_cancel_init (); + +  libgcc_s_sjlj_unregister (fc); +} diff --git a/libpthread/nptl/sysdeps/m68k/pthreaddef.h b/libpthread/nptl/sysdeps/m68k/pthreaddef.h index 1651b3d5f..04d565191 100644 --- a/libpthread/nptl/sysdeps/m68k/pthreaddef.h +++ b/libpthread/nptl/sysdeps/m68k/pthreaddef.h @@ -15,9 +15,6 @@     License along with the GNU C Library.  If not, see     <http://www.gnu.org/licenses/>.  */ -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  */  #define STACK_ALIGN		16 diff --git a/libpthread/nptl/sysdeps/metag/dl-tls.h b/libpthread/nptl/sysdeps/metag/dl-tls.h index 81632e057..811d6254f 100644 --- a/libpthread/nptl/sysdeps/metag/dl-tls.h +++ b/libpthread/nptl/sysdeps/metag/dl-tls.h @@ -26,3 +26,6 @@ typedef struct  extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed.  */ +#define TLS_DTV_UNALLOCATED    ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/metag/pthreaddef.h b/libpthread/nptl/sysdeps/metag/pthreaddef.h index bf4f0f29a..0fb28dc48 100644 --- a/libpthread/nptl/sysdeps/metag/pthreaddef.h +++ b/libpthread/nptl/sysdeps/metag/pthreaddef.h @@ -17,9 +17,6 @@  #include <sysdep.h> -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  */  #define STACK_ALIGN		8 diff --git a/libpthread/nptl/sysdeps/microblaze/dl-tls.h b/libpthread/nptl/sysdeps/microblaze/dl-tls.h index 5613e21e2..ded8714bd 100644 --- a/libpthread/nptl/sysdeps/microblaze/dl-tls.h +++ b/libpthread/nptl/sysdeps/microblaze/dl-tls.h @@ -24,3 +24,6 @@ typedef struct  } tls_index;  extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed.  */ +#define TLS_DTV_UNALLOCATED    ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/microblaze/pthreaddef.h b/libpthread/nptl/sysdeps/microblaze/pthreaddef.h index 47e87dd71..a01b59fab 100644 --- a/libpthread/nptl/sysdeps/microblaze/pthreaddef.h +++ b/libpthread/nptl/sysdeps/microblaze/pthreaddef.h @@ -19,9 +19,6 @@  #include <stdlib.h>  #include <string.h> -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE  (2 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  */  #define STACK_ALIGN         16 diff --git a/libpthread/nptl/sysdeps/mips/dl-tls.h b/libpthread/nptl/sysdeps/mips/dl-tls.h index e26aa388b..63ec2bc00 100644 --- a/libpthread/nptl/sysdeps/mips/dl-tls.h +++ b/libpthread/nptl/sysdeps/mips/dl-tls.h @@ -43,3 +43,6 @@ extern void *__tls_get_addr (tls_index *ti);  # define GET_ADDR_OFFSET	(ti->ti_offset + TLS_DTV_OFFSET)  # define __TLS_GET_ADDR(__ti)	(__tls_get_addr (__ti) - TLS_DTV_OFFSET) + +/* Value used for dtv entries for which the allocation is delayed.  */ +#define TLS_DTV_UNALLOCATED    ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/mips/pthreaddef.h b/libpthread/nptl/sysdeps/mips/pthreaddef.h index 692988205..adedd7715 100644 --- a/libpthread/nptl/sysdeps/mips/pthreaddef.h +++ b/libpthread/nptl/sysdeps/mips/pthreaddef.h @@ -15,9 +15,6 @@     License along with the GNU C Library; if not, see     <http://www.gnu.org/licenses/>.  */ -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  */  #define STACK_ALIGN		16 diff --git a/libpthread/nptl/sysdeps/nds32/dl-tls.h b/libpthread/nptl/sysdeps/nds32/dl-tls.h index 3b11e7f42..11101fdd2 100644 --- a/libpthread/nptl/sysdeps/nds32/dl-tls.h +++ b/libpthread/nptl/sysdeps/nds32/dl-tls.h @@ -50,10 +50,12 @@ struct tlsdesc_dynamic_arg  extern void *__tls_get_addr (tls_index *ti);  extern ptrdiff_t attribute_hidden -  _dl_tlsdesc_return(struct tlsdesc_dynamic_arg *); +  _dl_tlsdesc_return(struct tlsdesc *);  extern void *_dl_make_tlsdesc_dynamic (struct link_map *map, size_t ti_offset);  extern ptrdiff_t attribute_hidden    _dl_tlsdesc_dynamic(struct tlsdesc *); +#define TLS_DTV_UNALLOCATED ((void *) -1l) +  #endif //_NDS32_DL_TLS_H diff --git a/libpthread/nptl/sysdeps/nds32/pthreaddef.h b/libpthread/nptl/sysdeps/nds32/pthreaddef.h index c9d3f7781..0dca16c34 100644 --- a/libpthread/nptl/sysdeps/nds32/pthreaddef.h +++ b/libpthread/nptl/sysdeps/nds32/pthreaddef.h @@ -14,9 +14,6 @@     License along with the GNU C Library; if not, see     <http://www.gnu.org/licenses/>.  */ -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  SSE requires 16     bytes.  */  #define STACK_ALIGN		16 diff --git a/libpthread/nptl/sysdeps/nios2/pthreaddef.h b/libpthread/nptl/sysdeps/nios2/pthreaddef.h index 4268252dd..5be435237 100644 --- a/libpthread/nptl/sysdeps/nios2/pthreaddef.h +++ b/libpthread/nptl/sysdeps/nios2/pthreaddef.h @@ -16,9 +16,6 @@     License along with the GNU C Library.  If not, see     <http://www.gnu.org/licenses/>.  */ -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  */  #define STACK_ALIGN		4 diff --git a/libpthread/nptl/sysdeps/or1k/dl-tls.h b/libpthread/nptl/sysdeps/or1k/dl-tls.h index 5613e21e2..ded8714bd 100644 --- a/libpthread/nptl/sysdeps/or1k/dl-tls.h +++ b/libpthread/nptl/sysdeps/or1k/dl-tls.h @@ -24,3 +24,6 @@ typedef struct  } tls_index;  extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed.  */ +#define TLS_DTV_UNALLOCATED    ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/or1k/pthreaddef.h b/libpthread/nptl/sysdeps/or1k/pthreaddef.h index e8da3d965..394962172 100644 --- a/libpthread/nptl/sysdeps/or1k/pthreaddef.h +++ b/libpthread/nptl/sysdeps/or1k/pthreaddef.h @@ -16,9 +16,6 @@     License along with the GNU C Library; if not, see     <http://www.gnu.org/licenses/>.  */ -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  */  #define STACK_ALIGN 16 diff --git a/libpthread/nptl/sysdeps/powerpc/dl-tls.h b/libpthread/nptl/sysdeps/powerpc/dl-tls.h index c322ade60..ae50098c7 100644 --- a/libpthread/nptl/sysdeps/powerpc/dl-tls.h +++ b/libpthread/nptl/sysdeps/powerpc/dl-tls.h @@ -46,3 +46,6 @@ extern void *__tls_get_addr (tls_index *ti);  # define GET_ADDR_OFFSET	(ti->ti_offset + TLS_DTV_OFFSET)  # define __TLS_GET_ADDR(__ti)	(__tls_get_addr (__ti) - TLS_DTV_OFFSET)  #endif + +/* Value used for dtv entries for which the allocation is delayed.  */ +#define TLS_DTV_UNALLOCATED    ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/powerpc/pthreaddef.h b/libpthread/nptl/sysdeps/powerpc/pthreaddef.h index 36bf76404..a46c094b6 100644 --- a/libpthread/nptl/sysdeps/powerpc/pthreaddef.h +++ b/libpthread/nptl/sysdeps/powerpc/pthreaddef.h @@ -15,9 +15,6 @@     License along with the GNU C Library; if not, see     <http://www.gnu.org/licenses/>.  */ -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE	(4 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  The ABI requires 16     bytes (for both 32-bit and 64-bit PowerPC).  */  #define STACK_ALIGN		16 diff --git a/libpthread/nptl/sysdeps/pthread/Makefile.in b/libpthread/nptl/sysdeps/pthread/Makefile.in index 6c09e7b7e..70546bc0e 100644 --- a/libpthread/nptl/sysdeps/pthread/Makefile.in +++ b/libpthread/nptl/sysdeps/pthread/Makefile.in @@ -44,7 +44,9 @@ CFLAGS-unwind-forcedunwind.c = -fexceptions -fasynchronous-unwind-tables  CFLAGS-OMIT-librt-cancellation.c = -DIS_IN_libpthread  CFLAGS-librt-cancellation.c = -DIS_IN_librt				\  			      -fexceptions -fasynchronous-unwind-tables +ifneq ($(TARGET_ARCH),kvx)  libpthread-so-y += $(patsubst %,$(libpthread_pthread_OUT)/%.oS, unwind-forcedunwind) +endif  librt-pt-routines-y = librt-cancellation.c diff --git a/libpthread/nptl/sysdeps/pthread/pthread.h b/libpthread/nptl/sysdeps/pthread/pthread.h index 1fba7fca6..531e17322 100644 --- a/libpthread/nptl/sysdeps/pthread/pthread.h +++ b/libpthread/nptl/sysdeps/pthread/pthread.h @@ -28,6 +28,7 @@  #include <signal.h>  #include <bits/pthreadtypes.h>  #include <bits/setjmp.h> +#include <bits/jmp_buf_tag.h>  #include <bits/wordsize.h>  #if defined _LIBC && ( defined IS_IN_libc || !defined NOT_IN_libc )  #include <bits/uClibc_pthread.h> @@ -726,8 +727,7 @@ extern void __pthread_unwind_next (__pthread_unwind_buf_t *__buf)  #endif  /* Function used in the macros.  */ -struct __jmp_buf_tag; -extern int __sigsetjmp (struct __jmp_buf_tag *__env, int __savemask) __THROWNL; +extern int __sigsetjmp (struct __jmp_buf_tag __env[1], int __savemask) __THROWNL;  /* Mutex handling.  */ diff --git a/libpthread/nptl/sysdeps/pthread/pthread_cond_timedwait.c b/libpthread/nptl/sysdeps/pthread/pthread_cond_timedwait.c index f06b69e2f..ce738b1a1 100644 --- a/libpthread/nptl/sysdeps/pthread/pthread_cond_timedwait.c +++ b/libpthread/nptl/sysdeps/pthread/pthread_cond_timedwait.c @@ -95,17 +95,34 @@ __pthread_cond_timedwait (    while (1)      { -      struct timespec rt; +      struct timespec rt = {.tv_sec = 0, .tv_nsec = 0}; +#if defined(__UCLIBC_USE_TIME64__) +      struct __ts64_struct __rt64; +#endif        {  #ifdef __NR_clock_gettime  	INTERNAL_SYSCALL_DECL (err); -# ifndef __ASSUME_POSIX_TIMERS +# if !defined(__ASSUME_POSIX_TIMERS) || defined(__UCLIBC_USE_TIME64__)  	int ret =  # endif +#if defined(__UCLIBC_USE_TIME64__) && defined(__NR_clock_gettime64) +	INTERNAL_SYSCALL (clock_gettime64, err, 2, +				(cond->__data.__nwaiters +				 & ((1 << COND_NWAITERS_SHIFT) - 1)), +				&__rt64); + +  if (ret == 0) { +    rt.tv_sec = __rt64.tv_sec; +    rt.tv_nsec = __rt64.tv_nsec; +  } + +#else  	INTERNAL_SYSCALL (clock_gettime, err, 2,  				(cond->__data.__nwaiters  				 & ((1 << COND_NWAITERS_SHIFT) - 1)),  				&rt); +#endif +  # ifndef __ASSUME_POSIX_TIMERS  	if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (ret, err), 0))  	  { diff --git a/libpthread/nptl/sysdeps/riscv32/Makefile.arch b/libpthread/nptl/sysdeps/riscv32/Makefile.arch new file mode 100644 index 000000000..01fdac0b5 --- /dev/null +++ b/libpthread/nptl/sysdeps/riscv32/Makefile.arch @@ -0,0 +1,4 @@ +# Makefile for uClibc-ng NPTL +# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + +libc_arch_a_CSRC = libc-tls.c diff --git a/libpthread/nptl/sysdeps/riscv32/dl-tls.h b/libpthread/nptl/sysdeps/riscv32/dl-tls.h new file mode 100644 index 000000000..4124b7c78 --- /dev/null +++ b/libpthread/nptl/sysdeps/riscv32/dl-tls.h @@ -0,0 +1,37 @@ +/* Copyright (C) 2005-2016 Free Software Foundation, Inc. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +/* Type used for the representation of TLS information in the GOT.  */ +typedef struct +{ +  unsigned long int ti_module; +  unsigned long int ti_offset; +} tls_index; + +/* The thread pointer points to the first static TLS block.  */ +#define TLS_TP_OFFSET           0 + +/* Dynamic thread vector pointers point 0x800 past the start of each +   TLS block.  */ +#define TLS_DTV_OFFSET          0x800 + +extern void *__tls_get_addr (tls_index *ti); + +#define GET_ADDR_OFFSET        (ti->ti_offset + TLS_DTV_OFFSET) +#define __TLS_GET_ADDR(__ti)	(__tls_get_addr (__ti) - TLS_DTV_OFFSET) + +/* Value used for dtv entries for which the allocation is delayed.  */ +#define TLS_DTV_UNALLOCATED    ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/riscv32/libc-tls.c b/libpthread/nptl/sysdeps/riscv32/libc-tls.c new file mode 100644 index 000000000..8c601c06d --- /dev/null +++ b/libpthread/nptl/sysdeps/riscv32/libc-tls.c @@ -0,0 +1,34 @@ +/* Copyright (C) 2005-2016 Free Software Foundation, Inc. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +#include <sysdeps/generic/libc-tls.c> +#include <dl-tls.h> + +/* On RISC-V 32, linker optimizations are not required, so __tls_get_addr +   can be called even in statically linked binaries.  In this case module +   must be always 1 and PT_TLS segment exist in the binary, otherwise it +   would not link.  */ + +#if defined(USE_TLS) && USE_TLS + +void * +__tls_get_addr (tls_index *ti) +{ +  dtv_t *dtv = THREAD_DTV (); +  return (char *) dtv[1].pointer.val + ti->ti_offset; +} + +#endif diff --git a/libpthread/nptl/sysdeps/riscv32/pthread_spin_lock.c b/libpthread/nptl/sysdeps/riscv32/pthread_spin_lock.c new file mode 100644 index 000000000..cec3acbc6 --- /dev/null +++ b/libpthread/nptl/sysdeps/riscv32/pthread_spin_lock.c @@ -0,0 +1,65 @@ +/* pthread_spin_lock -- lock a spin lock.  Generic version. +   Copyright (C) 2012-2016 Free Software Foundation, Inc. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +#include <atomic.h> +#include "pthreadP.h" + +/* A machine-specific version can define SPIN_LOCK_READS_BETWEEN_CMPXCHG +  to the number of plain reads that it's optimal to spin on between uses +  of atomic_compare_and_exchange_val_acq.  If spinning forever is optimal +  then use -1.  If no plain reads here would ever be optimal, use 0.  */ +#define SPIN_LOCK_READS_BETWEEN_CMPXCHG 1000 + +int +pthread_spin_lock (pthread_spinlock_t *lock) +{ +  /* atomic_exchange usually takes less instructions than +     atomic_compare_and_exchange.  On the other hand, +     atomic_compare_and_exchange potentially generates less bus traffic +     when the lock is locked. +     We assume that the first try mostly will be successful, and we use +     atomic_exchange.  For the subsequent tries we use +     atomic_compare_and_exchange.  */ +  if (atomic_exchange_acq (lock, 1) == 0) +    return 0; + +  do +    { +      /* The lock is contended and we need to wait.  Going straight back +	 to cmpxchg is not a good idea on many targets as that will force +	 expensive memory synchronizations among processors and penalize other +	 running threads. +	 On the other hand, we do want to update memory state on the local core +	 once in a while to avoid spinning indefinitely until some event that +	 will happen to update local memory as a side-effect.  */ +      if (SPIN_LOCK_READS_BETWEEN_CMPXCHG >= 0) +	{ +	  int wait = SPIN_LOCK_READS_BETWEEN_CMPXCHG; + +	  while (*lock != 0 && wait > 0) +	    --wait; +	} +      else +	{ +	  while (*lock != 0) +	    ; +	} +    } +  while (atomic_compare_and_exchange_val_acq (lock, 1, 0) != 0); + +  return 0; +} diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_barrier_wait.S b/libpthread/nptl/sysdeps/riscv32/pthread_spin_trylock.c index d22c72467..4e9aa64d3 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_barrier_wait.S +++ b/libpthread/nptl/sysdeps/riscv32/pthread_spin_trylock.c @@ -1,6 +1,5 @@ -/* Copyright (C) 2002 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. +/* pthread_spin_trylock -- trylock a spin lock.  Generic version. +   Copyright (C) 2012-2016 Free Software Foundation, Inc.     The GNU C Library is free software; you can redistribute it and/or     modify it under the terms of the GNU Lesser General Public @@ -16,4 +15,12 @@     License along with the GNU C Library; if not, see     <http://www.gnu.org/licenses/>.  */ -#include "../i486/pthread_barrier_wait.S" +#include <errno.h> +#include <atomic.h> +#include "pthreadP.h" + +int +pthread_spin_trylock (pthread_spinlock_t *lock) +{ +  return atomic_exchange_acq (lock, 1) ? EBUSY : 0; +} diff --git a/libpthread/nptl/sysdeps/riscv32/pthreaddef.h b/libpthread/nptl/sysdeps/riscv32/pthreaddef.h new file mode 100644 index 000000000..5a929bc77 --- /dev/null +++ b/libpthread/nptl/sysdeps/riscv32/pthreaddef.h @@ -0,0 +1,33 @@ +/* Copyright (C) 2002-2012 Free Software Foundation, Inc. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +/* Required stack pointer alignment at beginning.  */ +#define STACK_ALIGN 16 + +/* Minimal stack size after allocating thread descriptor and guard size.  */ +#define MINIMAL_REST_STACK 2048 + +/* Alignment requirement for TCB.  */ +#define TCB_ALIGNMENT 16 + +/* Location of current stack frame.  */ +#define CURRENT_STACK_FRAME __builtin_frame_address (0) + + +/* XXX Until we have a better place keep the definitions here.  */ +#define __exit_thread_inline(val) \ +  INLINE_SYSCALL (exit, 1, (val)) + diff --git a/libpthread/nptl/sysdeps/riscv32/tcb-offsets.sym b/libpthread/nptl/sysdeps/riscv32/tcb-offsets.sym new file mode 100644 index 000000000..fe6856c5d --- /dev/null +++ b/libpthread/nptl/sysdeps/riscv32/tcb-offsets.sym @@ -0,0 +1,7 @@ +#include <sysdep.h> +#include <tls.h> + +#define thread_offsetof(mem)   (long)(offsetof (struct pthread, mem) - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE) + +MULTIPLE_THREADS_OFFSET                thread_offsetof (header.multiple_threads) + diff --git a/libpthread/nptl/sysdeps/riscv32/tls.h b/libpthread/nptl/sysdeps/riscv32/tls.h new file mode 100644 index 000000000..8ef9f3511 --- /dev/null +++ b/libpthread/nptl/sysdeps/riscv32/tls.h @@ -0,0 +1,170 @@ +/* Definition for thread-local data handling.  NPTL/RISCV32 version. +   Copyright (C) 2005, 2007, 2011 Free Software Foundation, Inc. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +#ifndef _TLS_H +#define _TLS_H  1 + +#ifndef __ASSEMBLER__ +# include <stdbool.h> +# include <stddef.h> +# include <stdint.h> + +/* Type for the dtv.  */ +typedef union dtv +{ +  size_t counter; +  struct +  { +    void *val; +    bool is_static; +  } pointer; +} dtv_t; + +#else /* __ASSEMBLER__ */ +# include <tcb-offsets.h> +#endif /* __ASSEMBLER__ */ + +/* We require TLS support in the tools.  */ +#define HAVE_TLS_SUPPORT                1 +#define HAVE_TLS_MODEL_ATTRIBUTE        1 +#define HAVE___THREAD                   1 + +/* Signal that TLS support is available.  */ +#define USE_TLS	1 + +#ifndef __ASSEMBLER__ + +register void *__thread_self __asm__("tp"); +# define READ_THREAD_POINTER() ({ __thread_self; }) + +/* Get system call information.  */ +# include <sysdep.h> + +/* The TP points to the start of the TLS block.  */ +# define TLS_DTV_AT_TP  1 + +/* Get the thread descriptor definition.  */ +# include <../../descr.h> + +typedef struct +{ +  dtv_t *dtv; +  void *private; +} tcbhead_t; + +/* This is the size of the initial TCB.  Because our TCB is before the thread +   pointer, we don't need this.  */ +# define TLS_INIT_TCB_SIZE    0 +# define TLS_INIT_TCB_ALIGN   __alignof__ (struct pthread) + +/* This is the size of the TCB.  Because our TCB is before the thread +   pointer, we don't need this.  */ +# define TLS_TCB_SIZE         0 +# define TLS_TCB_ALIGN        __alignof__ (struct pthread) + +/* This is the size we need before TCB - actually, it includes the TCB.  */ +# define TLS_PRE_TCB_SIZE \ +    (sizeof (struct pthread)                                                  \ +   + ((sizeof (tcbhead_t) + __alignof (struct pthread) - 1)                   \ +      & ~(__alignof (struct pthread) - 1))) + +/* The thread pointer tp points to the end of the TCB. +   The pthread_descr structure is immediately in front of the TCB.  */ +# define TLS_TCB_OFFSET 0 + +/* Install the dtv pointer.  The pointer passed is to the element with +   index -1 which contain the length.  */ +# define INSTALL_DTV(tcbp, dtvp) \ +  (((tcbhead_t *) (tcbp))[-1].dtv = (dtvp) + 1) + +/* Install new dtv for current thread  */ +# define INSTALL_NEW_DTV(dtv) \ +  (THREAD_DTV() = (dtv)) + +/* Return dtv of given thread descriptor.  */ +# define GET_DTV(tcbp) \ +  (((tcbhead_t *) (tcbp))[-1].dtv) + +/* Code to initially initialize the thread pointer. + * + * Set TP to the address _after_ tcbhead_t. This will allow us + * to change the size of tcbhead_t without having to re-link everything. + * + * secondcall has something to do with USE__THREAD, + * seems to always be 0 so we don't care about it. + * + * This has to return NULL on success (or a string with the failure text). + * It's hard to fail this, so return NULL always. + */ +# define TLS_INIT_TP(tcbp, secondcall) \ +  ({ __thread_self = (char*)tcbp + TLS_TCB_OFFSET; NULL; }) + +/* Return the address of the dtv for the current thread.  */ +#  define THREAD_DTV() \ +  (((tcbhead_t *) (READ_THREAD_POINTER () - TLS_TCB_OFFSET))[-1].dtv) + +/* Return the thread descriptor for the current thread.  */ +# define THREAD_SELF \ +  ((struct pthread *) (READ_THREAD_POINTER ()                         \ +                       - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE)) + +/* Informs libthread_db that the thread pointer is register 4, which is used + * to know how to do THREAD_SELF.  */ +# define DB_THREAD_SELF \ +  REGISTER (64, 64, 4 * 8, - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE) + +/* Access to data in the thread descriptor is easy.  */ +#define THREAD_GETMEM(descr, member) \ +  descr->member +#define THREAD_GETMEM_NC(descr, member, idx) \ +  descr->member[idx] +#define THREAD_SETMEM(descr, member, value) \ +  descr->member = (value) +#define THREAD_SETMEM_NC(descr, member, idx, value) \ +  descr->member[idx] = (value) + +/* l_tls_offset == 0 is perfectly valid, so we have to use some different +   value to mean unset l_tls_offset.  */ +# define NO_TLS_OFFSET          -1 + +/* Get and set the global scope generation counter in struct pthread.  */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED   1 +#define THREAD_GSCOPE_FLAG_WAIT   2 +#define THREAD_GSCOPE_RESET_FLAG() \ +  do                       \ +    { int __res                    \ +  = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag,       \ +             THREAD_GSCOPE_FLAG_UNUSED);         \ +      if (__res == THREAD_GSCOPE_FLAG_WAIT)            \ +  lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE);   \ +    }                      \ +  while (0) +#define THREAD_GSCOPE_SET_FLAG() \ +  do                       \ +    {                      \ +      THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED;       \ +      atomic_write_barrier ();                 \ +    }                      \ +  while (0) +#define THREAD_GSCOPE_WAIT() \ +  GL(dl_wait_lookup_done) () + +#endif /* __ASSEMBLER__ */ + +#endif  /* tls.h */ + diff --git a/libpthread/nptl/sysdeps/riscv64/Makefile.arch b/libpthread/nptl/sysdeps/riscv64/Makefile.arch new file mode 100644 index 000000000..01fdac0b5 --- /dev/null +++ b/libpthread/nptl/sysdeps/riscv64/Makefile.arch @@ -0,0 +1,4 @@ +# Makefile for uClibc-ng NPTL +# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + +libc_arch_a_CSRC = libc-tls.c diff --git a/libpthread/nptl/sysdeps/riscv64/dl-tls.h b/libpthread/nptl/sysdeps/riscv64/dl-tls.h new file mode 100644 index 000000000..4124b7c78 --- /dev/null +++ b/libpthread/nptl/sysdeps/riscv64/dl-tls.h @@ -0,0 +1,37 @@ +/* Copyright (C) 2005-2016 Free Software Foundation, Inc. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +/* Type used for the representation of TLS information in the GOT.  */ +typedef struct +{ +  unsigned long int ti_module; +  unsigned long int ti_offset; +} tls_index; + +/* The thread pointer points to the first static TLS block.  */ +#define TLS_TP_OFFSET           0 + +/* Dynamic thread vector pointers point 0x800 past the start of each +   TLS block.  */ +#define TLS_DTV_OFFSET          0x800 + +extern void *__tls_get_addr (tls_index *ti); + +#define GET_ADDR_OFFSET        (ti->ti_offset + TLS_DTV_OFFSET) +#define __TLS_GET_ADDR(__ti)	(__tls_get_addr (__ti) - TLS_DTV_OFFSET) + +/* Value used for dtv entries for which the allocation is delayed.  */ +#define TLS_DTV_UNALLOCATED    ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/riscv64/libc-tls.c b/libpthread/nptl/sysdeps/riscv64/libc-tls.c new file mode 100644 index 000000000..6c686aa8b --- /dev/null +++ b/libpthread/nptl/sysdeps/riscv64/libc-tls.c @@ -0,0 +1,34 @@ +/* Copyright (C) 2005-2016 Free Software Foundation, Inc. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +#include <sysdeps/generic/libc-tls.c> +#include <dl-tls.h> + +/* On RISC-V 64, linker optimizations are not required, so __tls_get_addr +   can be called even in statically linked binaries.  In this case module +   must be always 1 and PT_TLS segment exist in the binary, otherwise it +   would not link.  */ + +#if defined(USE_TLS) && USE_TLS + +void * +__tls_get_addr (tls_index *ti) +{ +  dtv_t *dtv = THREAD_DTV (); +  return (char *) dtv[1].pointer.val + GET_ADDR_OFFSET; +} + +#endif diff --git a/libpthread/nptl/sysdeps/riscv64/pthread_spin_lock.c b/libpthread/nptl/sysdeps/riscv64/pthread_spin_lock.c new file mode 100644 index 000000000..cec3acbc6 --- /dev/null +++ b/libpthread/nptl/sysdeps/riscv64/pthread_spin_lock.c @@ -0,0 +1,65 @@ +/* pthread_spin_lock -- lock a spin lock.  Generic version. +   Copyright (C) 2012-2016 Free Software Foundation, Inc. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +#include <atomic.h> +#include "pthreadP.h" + +/* A machine-specific version can define SPIN_LOCK_READS_BETWEEN_CMPXCHG +  to the number of plain reads that it's optimal to spin on between uses +  of atomic_compare_and_exchange_val_acq.  If spinning forever is optimal +  then use -1.  If no plain reads here would ever be optimal, use 0.  */ +#define SPIN_LOCK_READS_BETWEEN_CMPXCHG 1000 + +int +pthread_spin_lock (pthread_spinlock_t *lock) +{ +  /* atomic_exchange usually takes less instructions than +     atomic_compare_and_exchange.  On the other hand, +     atomic_compare_and_exchange potentially generates less bus traffic +     when the lock is locked. +     We assume that the first try mostly will be successful, and we use +     atomic_exchange.  For the subsequent tries we use +     atomic_compare_and_exchange.  */ +  if (atomic_exchange_acq (lock, 1) == 0) +    return 0; + +  do +    { +      /* The lock is contended and we need to wait.  Going straight back +	 to cmpxchg is not a good idea on many targets as that will force +	 expensive memory synchronizations among processors and penalize other +	 running threads. +	 On the other hand, we do want to update memory state on the local core +	 once in a while to avoid spinning indefinitely until some event that +	 will happen to update local memory as a side-effect.  */ +      if (SPIN_LOCK_READS_BETWEEN_CMPXCHG >= 0) +	{ +	  int wait = SPIN_LOCK_READS_BETWEEN_CMPXCHG; + +	  while (*lock != 0 && wait > 0) +	    --wait; +	} +      else +	{ +	  while (*lock != 0) +	    ; +	} +    } +  while (atomic_compare_and_exchange_val_acq (lock, 1, 0) != 0); + +  return 0; +} diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevellock.S b/libpthread/nptl/sysdeps/riscv64/pthread_spin_trylock.c index 59194c712..4e9aa64d3 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevellock.S +++ b/libpthread/nptl/sysdeps/riscv64/pthread_spin_trylock.c @@ -1,6 +1,5 @@ -/* Copyright (C) 2002 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. +/* pthread_spin_trylock -- trylock a spin lock.  Generic version. +   Copyright (C) 2012-2016 Free Software Foundation, Inc.     The GNU C Library is free software; you can redistribute it and/or     modify it under the terms of the GNU Lesser General Public @@ -16,4 +15,12 @@     License along with the GNU C Library; if not, see     <http://www.gnu.org/licenses/>.  */ -#include "../i486/lowlevellock.S" +#include <errno.h> +#include <atomic.h> +#include "pthreadP.h" + +int +pthread_spin_trylock (pthread_spinlock_t *lock) +{ +  return atomic_exchange_acq (lock, 1) ? EBUSY : 0; +} diff --git a/libpthread/nptl/sysdeps/riscv64/pthreaddef.h b/libpthread/nptl/sysdeps/riscv64/pthreaddef.h new file mode 100644 index 000000000..5a929bc77 --- /dev/null +++ b/libpthread/nptl/sysdeps/riscv64/pthreaddef.h @@ -0,0 +1,33 @@ +/* Copyright (C) 2002-2012 Free Software Foundation, Inc. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +/* Required stack pointer alignment at beginning.  */ +#define STACK_ALIGN 16 + +/* Minimal stack size after allocating thread descriptor and guard size.  */ +#define MINIMAL_REST_STACK 2048 + +/* Alignment requirement for TCB.  */ +#define TCB_ALIGNMENT 16 + +/* Location of current stack frame.  */ +#define CURRENT_STACK_FRAME __builtin_frame_address (0) + + +/* XXX Until we have a better place keep the definitions here.  */ +#define __exit_thread_inline(val) \ +  INLINE_SYSCALL (exit, 1, (val)) + diff --git a/libpthread/nptl/sysdeps/riscv64/tcb-offsets.sym b/libpthread/nptl/sysdeps/riscv64/tcb-offsets.sym new file mode 100644 index 000000000..fe6856c5d --- /dev/null +++ b/libpthread/nptl/sysdeps/riscv64/tcb-offsets.sym @@ -0,0 +1,7 @@ +#include <sysdep.h> +#include <tls.h> + +#define thread_offsetof(mem)   (long)(offsetof (struct pthread, mem) - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE) + +MULTIPLE_THREADS_OFFSET                thread_offsetof (header.multiple_threads) + diff --git a/libpthread/nptl/sysdeps/riscv64/tls.h b/libpthread/nptl/sysdeps/riscv64/tls.h new file mode 100644 index 000000000..d802ec2a9 --- /dev/null +++ b/libpthread/nptl/sysdeps/riscv64/tls.h @@ -0,0 +1,170 @@ +/* Definition for thread-local data handling.  NPTL/RISCV64 version. +   Copyright (C) 2005, 2007, 2011 Free Software Foundation, Inc. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +#ifndef _TLS_H +#define _TLS_H  1 + +#ifndef __ASSEMBLER__ +# include <stdbool.h> +# include <stddef.h> +# include <stdint.h> + +/* Type for the dtv.  */ +typedef union dtv +{ +  size_t counter; +  struct +  { +    void *val; +    bool is_static; +  } pointer; +} dtv_t; + +#else /* __ASSEMBLER__ */ +# include <tcb-offsets.h> +#endif /* __ASSEMBLER__ */ + +/* We require TLS support in the tools.  */ +#define HAVE_TLS_SUPPORT                1 +#define HAVE_TLS_MODEL_ATTRIBUTE        1 +#define HAVE___THREAD                   1 + +/* Signal that TLS support is available.  */ +#define USE_TLS	1 + +#ifndef __ASSEMBLER__ + +register void *__thread_self __asm__("tp"); +# define READ_THREAD_POINTER() ({ __thread_self; }) + +/* Get system call information.  */ +# include <sysdep.h> + +/* The TP points to the start of the TLS block.  */ +# define TLS_DTV_AT_TP  1 + +/* Get the thread descriptor definition.  */ +# include <../../descr.h> + +typedef struct +{ +  dtv_t *dtv; +  void *private; +} tcbhead_t; + +/* This is the size of the initial TCB.  Because our TCB is before the thread +   pointer, we don't need this.  */ +# define TLS_INIT_TCB_SIZE    0 +# define TLS_INIT_TCB_ALIGN   __alignof__ (struct pthread) + +/* This is the size of the TCB.  Because our TCB is before the thread +   pointer, we don't need this.  */ +# define TLS_TCB_SIZE         0 +# define TLS_TCB_ALIGN        __alignof__ (struct pthread) + +/* This is the size we need before TCB - actually, it includes the TCB.  */ +# define TLS_PRE_TCB_SIZE \ +    (sizeof (struct pthread)                                                  \ +   + ((sizeof (tcbhead_t) + __alignof (struct pthread) - 1)                   \ +      & ~(__alignof (struct pthread) - 1))) + +/* The thread pointer tp points to the end of the TCB. +   The pthread_descr structure is immediately in front of the TCB.  */ +# define TLS_TCB_OFFSET 0 + +/* Install the dtv pointer.  The pointer passed is to the element with +   index -1 which contain the length.  */ +# define INSTALL_DTV(tcbp, dtvp) \ +  (((tcbhead_t *) (tcbp))[-1].dtv = (dtvp) + 1) + +/* Install new dtv for current thread  */ +# define INSTALL_NEW_DTV(dtv) \ +  (THREAD_DTV() = (dtv)) + +/* Return dtv of given thread descriptor.  */ +# define GET_DTV(tcbp) \ +  (((tcbhead_t *) (tcbp))[-1].dtv) + +/* Code to initially initialize the thread pointer. + * + * Set TP to the address _after_ tcbhead_t. This will allow us + * to change the size of tcbhead_t without having to re-link everything. + * + * secondcall has something to do with USE__THREAD, + * seems to always be 0 so we don't care about it. + * + * This has to return NULL on success (or a string with the failure text). + * It's hard to fail this, so return NULL always. + */ +# define TLS_INIT_TP(tcbp, secondcall) \ +  ({ __thread_self = (char*)tcbp + TLS_TCB_OFFSET; NULL; }) + +/* Return the address of the dtv for the current thread.  */ +#  define THREAD_DTV() \ +  (((tcbhead_t *) (READ_THREAD_POINTER () - TLS_TCB_OFFSET))[-1].dtv) + +/* Return the thread descriptor for the current thread.  */ +# define THREAD_SELF \ +  ((struct pthread *) (READ_THREAD_POINTER ()                         \ +                       - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE)) + +/* Informs libthread_db that the thread pointer is register 4, which is used + * to know how to do THREAD_SELF.  */ +# define DB_THREAD_SELF \ +  REGISTER (64, 64, 4 * 8, - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE) + +/* Access to data in the thread descriptor is easy.  */ +#define THREAD_GETMEM(descr, member) \ +  descr->member +#define THREAD_GETMEM_NC(descr, member, idx) \ +  descr->member[idx] +#define THREAD_SETMEM(descr, member, value) \ +  descr->member = (value) +#define THREAD_SETMEM_NC(descr, member, idx, value) \ +  descr->member[idx] = (value) + +/* l_tls_offset == 0 is perfectly valid, so we have to use some different +   value to mean unset l_tls_offset.  */ +# define NO_TLS_OFFSET          -1 + +/* Get and set the global scope generation counter in struct pthread.  */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED   1 +#define THREAD_GSCOPE_FLAG_WAIT   2 +#define THREAD_GSCOPE_RESET_FLAG() \ +  do                       \ +    { int __res                    \ +  = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag,       \ +             THREAD_GSCOPE_FLAG_UNUSED);         \ +      if (__res == THREAD_GSCOPE_FLAG_WAIT)            \ +  lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE);   \ +    }                      \ +  while (0) +#define THREAD_GSCOPE_SET_FLAG() \ +  do                       \ +    {                      \ +      THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED;       \ +      atomic_write_barrier ();                 \ +    }                      \ +  while (0) +#define THREAD_GSCOPE_WAIT() \ +  GL(dl_wait_lookup_done) () + +#endif /* __ASSEMBLER__ */ + +#endif  /* tls.h */ + diff --git a/libpthread/nptl/sysdeps/sh/dl-tls.h b/libpthread/nptl/sysdeps/sh/dl-tls.h index f5f90beaf..e0d13eec4 100644 --- a/libpthread/nptl/sysdeps/sh/dl-tls.h +++ b/libpthread/nptl/sysdeps/sh/dl-tls.h @@ -26,3 +26,6 @@ typedef struct  extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed.  */ +#define TLS_DTV_UNALLOCATED    ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/sh/pthreaddef.h b/libpthread/nptl/sysdeps/sh/pthreaddef.h index fc3ae6029..918aaf54f 100644 --- a/libpthread/nptl/sysdeps/sh/pthreaddef.h +++ b/libpthread/nptl/sysdeps/sh/pthreaddef.h @@ -17,9 +17,6 @@  #include <sysdep.h> -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  */  #define STACK_ALIGN		8 diff --git a/libpthread/nptl/sysdeps/sparc/dl-tls.h b/libpthread/nptl/sysdeps/sparc/dl-tls.h index 7d9e8f0f7..aac9d5b30 100644 --- a/libpthread/nptl/sysdeps/sparc/dl-tls.h +++ b/libpthread/nptl/sysdeps/sparc/dl-tls.h @@ -26,3 +26,6 @@ typedef struct  extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed.  */ +#define TLS_DTV_UNALLOCATED    ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/sparc/pthreaddef.h b/libpthread/nptl/sysdeps/sparc/pthreaddef.h index 435fedcf3..65f6655a4 100644 --- a/libpthread/nptl/sysdeps/sparc/pthreaddef.h +++ b/libpthread/nptl/sysdeps/sparc/pthreaddef.h @@ -15,9 +15,6 @@     License along with the GNU C Library; if not, see     <http://www.gnu.org/licenses/>.  */ -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  */  #define STACK_ALIGN		16 diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/__syscall_error.c b/libpthread/nptl/sysdeps/unix/sysv/linux/__syscall_error.c index 5e109a83b..af26cf6ab 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/__syscall_error.c +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/__syscall_error.c @@ -10,8 +10,8 @@  /* This routine is jumped to by all the syscall handlers, to stash   * an error number into errno.  */ -int __syscall_error(int err_no) attribute_hidden; -int __syscall_error(int err_no) +long __syscall_error(int err_no) attribute_hidden; +long __syscall_error(int err_no)  {  	__set_errno(err_no);  	return -1; diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/aarch64/bits/pthreadtypes.h b/libpthread/nptl/sysdeps/unix/sysv/linux/aarch64/bits/pthreadtypes.h index 47293a1a8..67fcee28b 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/aarch64/bits/pthreadtypes.h +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/aarch64/bits/pthreadtypes.h @@ -36,7 +36,6 @@     exposed on purpose.  */  typedef unsigned long int pthread_t; -  union pthread_attr_t  {    char __size[__SIZEOF_PTHREAD_ATTR_T]; @@ -44,7 +43,7 @@ union pthread_attr_t  };  #ifndef __have_pthread_attr_t  typedef union pthread_attr_t pthread_attr_t; -# define __have_pthread_attr_t1 +# define __have_pthread_attr_t	1  #endif  typedef struct __pthread_internal_list @@ -75,9 +74,6 @@ typedef union    long int __align;  } pthread_mutex_t; -/* Mutex __spins initializer used by PTHREAD_MUTEX_INITIALIZER.  */ -#define __PTHREAD_SPINS 0 -  typedef union  {    char __size[__SIZEOF_PTHREAD_MUTEXATTR_T]; @@ -141,8 +137,6 @@ typedef union    long int __align;  } pthread_rwlock_t; -#define __PTHREAD_RWLOCK_ELISION_EXTRA 0 -  typedef union  {    char __size[__SIZEOF_PTHREAD_RWLOCKATTR_T]; diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/Makefile.arch index ee38a6988..c244b1f62 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/Makefile.arch +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/Makefile.arch @@ -5,9 +5,8 @@  # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.  # -libpthread_linux_arch_SSRC = pthread_spin_unlock.S pthread_once.S -libpthread_linux_arch_CSRC = pthread_spin_init.c +libpthread_linux_arch_SSRC = pthread_once.S +libpthread_linux_arch_CSRC =  libc_linux_arch_CSRC = fork.c -ASFLAGS += -DUSE___THREAD diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S deleted file mode 100644 index ff9a7847f..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S +++ /dev/null @@ -1,464 +0,0 @@ -/* Copyright (C) 2002-2004, 2006, 2007, 2009 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <pthread-errnos.h> -#include <bits/kernel-features.h> -#include <lowlevellock.h> -#include <tcb-offsets.h> - -	.text - -#ifdef __ASSUME_PRIVATE_FUTEX -# define LOAD_PRIVATE_FUTEX_WAIT(reg) \ -	movl	$(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), reg -# define LOAD_PRIVATE_FUTEX_WAKE(reg) \ -	movl	$(FUTEX_WAKE | FUTEX_PRIVATE_FLAG), reg -# define LOAD_FUTEX_WAIT(reg) \ -	xorl	$(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), reg -# define LOAD_FUTEX_WAIT_ABS(reg) \ -	xorl	$(FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME), reg -# define LOAD_FUTEX_WAKE(reg) \ -	xorl	$(FUTEX_WAKE | FUTEX_PRIVATE_FLAG), reg -#else -# if FUTEX_WAIT == 0 -#  define LOAD_PRIVATE_FUTEX_WAIT(reg) \ -	movl	%gs:PRIVATE_FUTEX, reg -# else -#  define LOAD_PRIVATE_FUTEX_WAIT(reg) \ -	movl	%gs:PRIVATE_FUTEX, reg ; \ -	orl	$FUTEX_WAIT, reg -# endif -# define LOAD_PRIVATE_FUTEX_WAKE(reg) \ -	movl	%gs:PRIVATE_FUTEX, reg ; \ -	orl	$FUTEX_WAKE, reg -# if FUTEX_WAIT == 0 -#  define LOAD_FUTEX_WAIT(reg) \ -	xorl	$FUTEX_PRIVATE_FLAG, reg ; \ -	andl	%gs:PRIVATE_FUTEX, reg -# else -#  define LOAD_FUTEX_WAIT(reg) \ -	xorl	$FUTEX_PRIVATE_FLAG, reg ; \ -	andl	%gs:PRIVATE_FUTEX, reg ; \ -	orl	$FUTEX_WAIT, reg -# endif -# define LOAD_FUTEX_WAIT_ABS(reg) \ -	xorl	$FUTEX_PRIVATE_FLAG, reg ; \ -	andl	%gs:PRIVATE_FUTEX, reg ; \ -	orl	$FUTEX_WAIT_BITSET | FUTEX_CLOCK_REALTIME, reg -# define LOAD_FUTEX_WAKE(reg) \ -	xorl	$FUTEX_PRIVATE_FLAG, reg ; \ -	andl	%gs:PRIVATE_FUTEX, reg ; \ -	orl	$FUTEX_WAKE, reg -#endif - -	.globl	__lll_lock_wait_private -	.type	__lll_lock_wait_private,@function -	.hidden	__lll_lock_wait_private -#ifndef IS_IN_libpthread -	.weak	__lll_lock_wait_private -#endif -	.align	16 -__lll_lock_wait_private: -	cfi_startproc -	pushl	%edx -	cfi_adjust_cfa_offset(4) -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	pushl	%esi -	cfi_adjust_cfa_offset(4) -	cfi_offset(%edx, -8) -	cfi_offset(%ebx, -12) -	cfi_offset(%esi, -16) - -	movl	$2, %edx -	movl	%ecx, %ebx -	xorl	%esi, %esi	/* No timeout.  */ -	LOAD_PRIVATE_FUTEX_WAIT (%ecx) - -	cmpl	%edx, %eax	/* NB:	 %edx == 2 */ -	jne 2f - -1:	movl	$SYS_futex, %eax -	ENTER_KERNEL - -2:	movl	%edx, %eax -	xchgl	%eax, (%ebx)	/* NB:	 lock is implied */ - -	testl	%eax, %eax -	jnz	1b - -	popl	%esi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%esi) -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	popl	%edx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%edx) -	ret -	cfi_endproc -	.size	__lll_lock_wait_private,.-__lll_lock_wait_private - -#ifdef NOT_IN_libc -	.globl	__lll_lock_wait -	.type	__lll_lock_wait,@function -	.hidden	__lll_lock_wait -	.align	16 -__lll_lock_wait: -	cfi_startproc -	pushl	%edx -	cfi_adjust_cfa_offset(4) -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	pushl	%esi -	cfi_adjust_cfa_offset(4) -	cfi_offset(%edx, -8) -	cfi_offset(%ebx, -12) -	cfi_offset(%esi, -16) - -	movl	%edx, %ebx -	movl	$2, %edx -	xorl	%esi, %esi	/* No timeout.  */ -	LOAD_FUTEX_WAIT (%ecx) - -	cmpl	%edx, %eax	/* NB:	 %edx == 2 */ -	jne 2f - -1:	movl	$SYS_futex, %eax -	ENTER_KERNEL - -2:	movl	%edx, %eax -	xchgl	%eax, (%ebx)	/* NB:	 lock is implied */ - -	testl	%eax, %eax -	jnz	1b - -	popl	%esi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%esi) -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	popl	%edx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%edx) -	ret -	cfi_endproc -	.size	__lll_lock_wait,.-__lll_lock_wait - -	/*      %ecx: futex -		%esi: flags -		%edx: timeout -		%eax: futex value -	*/ -	.globl	__lll_timedlock_wait -	.type	__lll_timedlock_wait,@function -	.hidden	__lll_timedlock_wait -	.align	16 -__lll_timedlock_wait: -	cfi_startproc -	pushl	%ebp -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%ebp, 0) -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%ebx, 0) - -# ifndef __ASSUME_FUTEX_CLOCK_REALTIME -#  ifdef __PIC__ -	LOAD_PIC_REG (bx) -	cmpl	$0, __have_futex_clock_realtime@GOTOFF(%ebx) -#  else -	cmpl	$0, __have_futex_clock_realtime -#  endif -	je	.Lreltmo -# endif - -	movl	%ecx, %ebx -	movl	%esi, %ecx -	movl	%edx, %esi -	movl	$0xffffffff, %ebp -	LOAD_FUTEX_WAIT_ABS (%ecx) - -	movl	$2, %edx -	cmpl	%edx, %eax -	jne	2f - -1:	movl	$SYS_futex, %eax -	movl	$2, %edx -	ENTER_KERNEL - -2:	xchgl	%edx, (%ebx)	/* NB:   lock is implied */ - -	testl	%edx, %edx -	jz	3f - -	cmpl	$-ETIMEDOUT, %eax -	je	4f -	cmpl	$-EINVAL, %eax -	jne	1b -4:	movl	%eax, %edx -	negl	%edx - -3:	movl	%edx, %eax -7:	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	popl	%ebp -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebp) -	ret - -# ifndef __ASSUME_FUTEX_CLOCK_REALTIME -.Lreltmo: -	/* Check for a valid timeout value.  */ -	cmpl	$1000000000, 4(%edx) -	jae	3f - -	pushl	%esi -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%esi, 0) -	pushl	%edi -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%edi, 0) - -	/* Stack frame for the timespec and timeval structs.  */ -	subl	$8, %esp -	cfi_adjust_cfa_offset(8) - -	movl	%ecx, %ebp -	movl	%edx, %edi - -	movl	$2, %edx -	xchgl	%edx, (%ebp) - -	test	%edx, %edx -	je	6f - -1: -	/* Get current time.  */ -	movl	%esp, %ebx -	xorl	%ecx, %ecx -	movl	$__NR_gettimeofday, %eax -	ENTER_KERNEL - -	/* Compute relative timeout.  */ -	movl	4(%esp), %eax -	movl	$1000, %edx -	mul	%edx		/* Milli seconds to nano seconds.  */ -	movl	(%edi), %ecx -	movl	4(%edi), %edx -	subl	(%esp), %ecx -	subl	%eax, %edx -	jns	4f -	addl	$1000000000, %edx -	subl	$1, %ecx -4:	testl	%ecx, %ecx -	js	2f		/* Time is already up.  */ - -	/* Store relative timeout.  */ -	movl	%ecx, (%esp) -	movl	%edx, 4(%esp) - -	/* Futex call.  */ -	movl	%ebp, %ebx -	movl	$2, %edx -	movl	%esp, %esi -	movl	16(%esp), %ecx -	LOAD_FUTEX_WAIT (%ecx) -	movl	$SYS_futex, %eax -	ENTER_KERNEL - -	/* NB: %edx == 2 */ -	xchgl	%edx, (%ebp) - -	testl	%edx, %edx -	je	6f - -	cmpl	$-ETIMEDOUT, %eax -	jne	1b -2:	movl	$ETIMEDOUT, %edx - -6:	addl	$8, %esp -	cfi_adjust_cfa_offset(-8) -	popl	%edi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%edi) -	popl	%esi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%esi) -7:	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	popl	%ebp -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebp) -	movl	%edx, %eax -	ret - -3:	movl	$EINVAL, %edx -	jmp	7b -# endif -	cfi_endproc -	.size	__lll_timedlock_wait,.-__lll_timedlock_wait -#endif - -	.globl	__lll_unlock_wake_private -	.type	__lll_unlock_wake_private,@function -	.hidden	__lll_unlock_wake_private -#ifndef IS_IN_libpthread -	.weak	__lll_unlock_wake_private -#endif -	.align	16 -__lll_unlock_wake_private: -	cfi_startproc -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	pushl	%ecx -	cfi_adjust_cfa_offset(4) -	pushl	%edx -	cfi_adjust_cfa_offset(4) -	cfi_offset(%ebx, -8) -	cfi_offset(%ecx, -12) -	cfi_offset(%edx, -16) - -	movl	%eax, %ebx -	movl	$0, (%eax) -	LOAD_PRIVATE_FUTEX_WAKE (%ecx) -	movl	$1, %edx	/* Wake one thread.  */ -	movl	$SYS_futex, %eax -	ENTER_KERNEL - -	popl	%edx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%edx) -	popl	%ecx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ecx) -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	ret -	cfi_endproc -	.size	__lll_unlock_wake_private,.-__lll_unlock_wake_private - -#ifdef NOT_IN_libc -	.globl	__lll_unlock_wake -	.type	__lll_unlock_wake,@function -	.hidden	__lll_unlock_wake -	.align	16 -__lll_unlock_wake: -	cfi_startproc -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	pushl	%ecx -	cfi_adjust_cfa_offset(4) -	pushl	%edx -	cfi_adjust_cfa_offset(4) -	cfi_offset(%ebx, -8) -	cfi_offset(%ecx, -12) -	cfi_offset(%edx, -16) - -	movl	%eax, %ebx -	movl	$0, (%eax) -	LOAD_FUTEX_WAKE (%ecx) -	movl	$1, %edx	/* Wake one thread.  */ -	movl	$SYS_futex, %eax -	ENTER_KERNEL - -	popl	%edx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%edx) -	popl	%ecx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ecx) -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	ret -	cfi_endproc -	.size	__lll_unlock_wake,.-__lll_unlock_wake - -	.globl	__lll_timedwait_tid -	.type	__lll_timedwait_tid,@function -	.hidden	__lll_timedwait_tid -	.align	16 -__lll_timedwait_tid: -	pushl	%edi -	pushl	%esi -	pushl	%ebx -	pushl	%ebp - -	movl	%eax, %ebp -	movl	%edx, %edi -	subl	$8, %esp - -	/* Get current time.  */ -2:	movl	%esp, %ebx -	xorl	%ecx, %ecx -	movl	$__NR_gettimeofday, %eax -	ENTER_KERNEL - -	/* Compute relative timeout.  */ -	movl	4(%esp), %eax -	movl	$1000, %edx -	mul	%edx		/* Milli seconds to nano seconds.  */ -	movl	(%edi), %ecx -	movl	4(%edi), %edx -	subl	(%esp), %ecx -	subl	%eax, %edx -	jns	5f -	addl	$1000000000, %edx -	subl	$1, %ecx -5:	testl	%ecx, %ecx -	js	6f		/* Time is already up.  */ - -	movl	%ecx, (%esp)	/* Store relative timeout.  */ -	movl	%edx, 4(%esp) - -	movl	(%ebp), %edx -	testl	%edx, %edx -	jz	4f - -	movl	%esp, %esi -	/* XXX The kernel so far uses global futex for the wakeup at -	   all times.  */ -	xorl	%ecx, %ecx	/* movl $FUTEX_WAIT, %ecx */ -	movl	%ebp, %ebx -	movl	$SYS_futex, %eax -	ENTER_KERNEL - -	cmpl	$0, (%ebx) -	jne	1f -4:	xorl	%eax, %eax - -3:	addl	$8, %esp -	popl	%ebp -	popl	%ebx -	popl	%esi -	popl	%edi -	ret - -1:	cmpl	$-ETIMEDOUT, %eax -	jne	2b -6:	movl	$ETIMEDOUT, %eax -	jmp	3b -	.size	__lll_timedwait_tid,.-__lll_timedwait_tid -#endif diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S deleted file mode 100644 index 7196d40e4..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S +++ /dev/null @@ -1,233 +0,0 @@ -/* Copyright (C) 2002, 2003, 2004, 2006, 2007 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <pthread-errnos.h> -#include <lowlevellock.h> -#include <lowlevelrobustlock.h> -#include <bits/kernel-features.h> -#include <tls.h> - -	.text - -#define FUTEX_WAITERS		0x80000000 -#define FUTEX_OWNER_DIED	0x40000000 - -#ifdef __ASSUME_PRIVATE_FUTEX -# define LOAD_FUTEX_WAIT(reg) \ -	xorl	$(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), reg -#else -# if FUTEX_WAIT == 0 -#  define LOAD_FUTEX_WAIT(reg) \ -	xorl	$FUTEX_PRIVATE_FLAG, reg ; \ -	andl	%gs:PRIVATE_FUTEX, reg -# else -#  define LOAD_FUTEX_WAIT(reg) \ -	xorl	$FUTEX_PRIVATE_FLAG, reg ; \ -	andl	%gs:PRIVATE_FUTEX, reg ; \ -	orl	$FUTEX_WAIT, reg -# endif -#endif - -	.globl	__lll_robust_lock_wait -	.type	__lll_robust_lock_wait,@function -	.hidden	__lll_robust_lock_wait -	.align	16 -__lll_robust_lock_wait: -	cfi_startproc -	pushl	%edx -	cfi_adjust_cfa_offset(4) -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	pushl	%esi -	cfi_adjust_cfa_offset(4) -	cfi_offset(%edx, -8) -	cfi_offset(%ebx, -12) -	cfi_offset(%esi, -16) - -	movl	%edx, %ebx -	xorl	%esi, %esi	/* No timeout.  */ -	LOAD_FUTEX_WAIT (%ecx) - -4:	movl	%eax, %edx -	orl	$FUTEX_WAITERS, %edx - -	testl	$FUTEX_OWNER_DIED, %eax -	jnz	3f - -	cmpl	%edx, %eax	/* NB:	 %edx == 2 */ -	je	1f - -	LOCK -	cmpxchgl %edx, (%ebx) -	jnz	2f - -1:	movl	$SYS_futex, %eax -	ENTER_KERNEL - -	movl	(%ebx), %eax - -2:	test	%eax, %eax -	jne	4b - -	movl	%gs:TID, %edx -	orl	$FUTEX_WAITERS, %edx -	LOCK -	cmpxchgl %edx, (%ebx) -	jnz	4b -	/* NB:	 %eax == 0 */ - -3:	popl	%esi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%esi) -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	popl	%edx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%edx) -	ret -	cfi_endproc -	.size	__lll_robust_lock_wait,.-__lll_robust_lock_wait - - -	.globl	__lll_robust_timedlock_wait -	.type	__lll_robust_timedlock_wait,@function -	.hidden	__lll_robust_timedlock_wait -	.align	16 -__lll_robust_timedlock_wait: -	cfi_startproc -	/* Check for a valid timeout value.  */ -	cmpl	$1000000000, 4(%edx) -	jae	3f - -	pushl	%edi -	cfi_adjust_cfa_offset(4) -	pushl	%esi -	cfi_adjust_cfa_offset(4) -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	pushl	%ebp -	cfi_adjust_cfa_offset(4) -	cfi_offset(%edi, -8) -	cfi_offset(%esi, -12) -	cfi_offset(%ebx, -16) -	cfi_offset(%ebp, -20) - -	/* Stack frame for the timespec and timeval structs.  */ -	subl	$12, %esp -	cfi_adjust_cfa_offset(12) - -	movl	%ecx, %ebp -	movl	%edx, %edi - -1:	movl	%eax, 8(%esp) - -	/* Get current time.  */ -	movl	%esp, %ebx -	xorl	%ecx, %ecx -	movl	$__NR_gettimeofday, %eax -	ENTER_KERNEL - -	/* Compute relative timeout.  */ -	movl	4(%esp), %eax -	movl	$1000, %edx -	mul	%edx		/* Milli seconds to nano seconds.  */ -	movl	(%edi), %ecx -	movl	4(%edi), %edx -	subl	(%esp), %ecx -	subl	%eax, %edx -	jns	4f -	addl	$1000000000, %edx -	subl	$1, %ecx -4:	testl	%ecx, %ecx -	js	8f		/* Time is already up.  */ - -	/* Store relative timeout.  */ -	movl	%ecx, (%esp) -	movl	%edx, 4(%esp) - -	movl	%ebp, %ebx - -	movl	8(%esp), %edx -	movl	%edx, %eax -	orl	$FUTEX_WAITERS, %edx - -	testl	$FUTEX_OWNER_DIED, %eax -	jnz	6f - -	cmpl	%eax, %edx -	je	2f - -	LOCK -	cmpxchgl %edx, (%ebx) -	movl	$0, %ecx	/* Must use mov to avoid changing cc.  */ -	jnz	5f - -2: -	/* Futex call.  */ -	movl	%esp, %esi -	movl	20(%esp), %ecx -	LOAD_FUTEX_WAIT (%ecx) -	movl	$SYS_futex, %eax -	ENTER_KERNEL -	movl	%eax, %ecx - -	movl	(%ebx), %eax - -5:	testl	%eax, %eax -	jne	7f - -	movl	%gs:TID, %edx -	orl	$FUTEX_WAITERS, %edx -	LOCK -	cmpxchgl %edx, (%ebx) -	jnz	7f - -6:	addl	$12, %esp -	cfi_adjust_cfa_offset(-12) -	popl	%ebp -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebp) -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	popl	%esi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%esi) -	popl	%edi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%edi) -	ret - -3:	movl	$EINVAL, %eax -	ret - -	cfi_adjust_cfa_offset(28) -	cfi_offset(%edi, -8) -	cfi_offset(%esi, -12) -	cfi_offset(%ebx, -16) -	cfi_offset(%ebp, -20) -	/* Check whether the time expired.  */ -7:	cmpl	$-ETIMEDOUT, %ecx -	jne	1b - -8:	movl	$ETIMEDOUT, %eax -	jmp	6b -	cfi_endproc -	.size	__lll_robust_timedlock_wait,.-__lll_robust_timedlock_wait diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S deleted file mode 100644 index 5443a3805..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S +++ /dev/null @@ -1,186 +0,0 @@ -/* Copyright (C) 2002, 2003, 2004, 2007 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelbarrier.h> - -	.text - -	.globl	pthread_barrier_wait -	.type	pthread_barrier_wait,@function -	.align	16 -pthread_barrier_wait: -	cfi_startproc -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	cfi_offset(%ebx, -8) - -	movl	8(%esp), %ebx - -	/* Get the mutex.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -	cmpxchgl %edx, MUTEX(%ebx) -	jnz	1f - -	/* One less waiter.  If this was the last one needed wake -	   everybody.  */ -2:	subl	$1, LEFT(%ebx) -	je	3f - -	/* There are more threads to come.  */ -	pushl	%esi -	cfi_adjust_cfa_offset(4) -	cfi_offset(%esi, -12) - -#if CURR_EVENT == 0 -	movl	(%ebx), %edx -#else -	movl	CURR_EVENT(%ebx), %edx -#endif - -	/* Release the mutex.  */ -	LOCK -	subl	$1, MUTEX(%ebx) -	jne	6f - -	/* Wait for the remaining threads.  The call will return immediately -	   if the CURR_EVENT memory has meanwhile been changed.  */ -7: -#if FUTEX_WAIT == 0 -	movl	PRIVATE(%ebx), %ecx -#else -	movl	$FUTEX_WAIT, %ecx -	orl	PRIVATE(%ebx), %ecx -#endif -	xorl	%esi, %esi -8:	movl	$SYS_futex, %eax -	ENTER_KERNEL - -	/* Don't return on spurious wakeups.  The syscall does not change -	   any register except %eax so there is no need to reload any of -	   them.  */ -#if CURR_EVENT == 0 -	cmpl	%edx, (%ebx) -#else -	cmpl	%edx, CURR_EVENT(%ebx) -#endif -	je	8b - -	/* Increment LEFT.  If this brings the count back to the -	   initial count unlock the object.  */ -	movl	$1, %edx -	movl	INIT_COUNT(%ebx), %ecx -	LOCK -	xaddl	%edx, LEFT(%ebx) -	subl	$1, %ecx -	cmpl	%ecx, %edx -	jne	10f - -	/* Release the mutex.  We cannot release the lock before -	   waking the waiting threads since otherwise a new thread might -	   arrive and gets waken up, too.  */ -	LOCK -	subl	$1, MUTEX(%ebx) -	jne	9f - -	/* Note: %esi is still zero.  */ -10:	movl	%esi, %eax		/* != PTHREAD_BARRIER_SERIAL_THREAD */ - -	popl	%esi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%esi) -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	ret - -	cfi_adjust_cfa_offset(4) -	cfi_offset(%ebx, -8) -	 -	/* The necessary number of threads arrived.  */ -3: -#if CURR_EVENT == 0 -	addl	$1, (%ebx) -#else -	addl	$1, CURR_EVENT(%ebx) -#endif - -	/* 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, %ecx -	orl	PRIVATE(%ebx), %ecx -	movl	$SYS_futex, %eax -	ENTER_KERNEL - -	/* Increment LEFT.  If this brings the count back to the -	   initial count unlock the object.  */ -	movl	$1, %edx -	movl	INIT_COUNT(%ebx), %ecx -	LOCK -	xaddl	%edx, LEFT(%ebx) -	subl	$1, %ecx -	cmpl	%ecx, %edx -	jne	5f - -	/* Release the mutex.  We cannot release the lock before -	   waking the waiting threads since otherwise a new thread might -	   arrive and gets waken up, too.  */ -	LOCK -	subl	$1, MUTEX(%ebx) -	jne	4f - -5:	orl	$-1, %eax		/* == PTHREAD_BARRIER_SERIAL_THREAD */ - -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	ret - -	cfi_adjust_cfa_offset(4) -	cfi_offset(%ebx, -8) -1:	movl	PRIVATE(%ebx), %ecx -	leal	MUTEX(%ebx), %edx -	xorl	$LLL_SHARED, %ecx -	call	__lll_lock_wait -	jmp	2b - -4:	movl	PRIVATE(%ebx), %ecx -	leal	MUTEX(%ebx), %eax -	xorl	$LLL_SHARED, %ecx -	call	__lll_unlock_wake -	jmp	5b - -	cfi_adjust_cfa_offset(4) -	cfi_offset(%esi, -12) -6:	movl	PRIVATE(%ebx), %ecx -	leal	MUTEX(%ebx), %eax -	xorl	$LLL_SHARED, %ecx -	call	__lll_unlock_wake -	jmp	7b - -9:	movl	PRIVATE(%ebx), %ecx -	leal	MUTEX(%ebx), %eax -	xorl	$LLL_SHARED, %ecx -	call	__lll_unlock_wake -	jmp	10b -	cfi_endproc -	.size	pthread_barrier_wait,.-pthread_barrier_wait diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S deleted file mode 100644 index d53aa7282..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S +++ /dev/null @@ -1,238 +0,0 @@ -/* Copyright (C) 2002,2003,2004,2006,2007,2009 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelcond.h> -#include <bits/kernel-features.h> -#include <pthread-pi-defines.h> -#include <pthread-errnos.h> -#include <tls.h> - -	.text - -	/* int pthread_cond_broadcast (pthread_cond_t *cond) */ -	.globl	__pthread_cond_broadcast -	.type	__pthread_cond_broadcast, @function -	.protected	__pthread_cond_broadcast -	.align	16 -__pthread_cond_broadcast: -	cfi_startproc -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%ebx, 0) -	pushl	%esi -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%esi, 0) -	pushl	%edi -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%edi, 0) -	pushl	%ebp -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%ebp, 0) -	cfi_remember_state - -	movl	20(%esp), %ebx - -	/* Get internal lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if cond_lock == 0 -	cmpxchgl %edx, (%ebx) -#else -	cmpxchgl %edx, cond_lock(%ebx) -#endif -	jnz	1f - -2:	addl	$cond_futex, %ebx -	movl	total_seq+4-cond_futex(%ebx), %eax -	movl	total_seq-cond_futex(%ebx), %ebp -	cmpl	wakeup_seq+4-cond_futex(%ebx), %eax -	ja	3f -	jb	4f -	cmpl	wakeup_seq-cond_futex(%ebx), %ebp -	jna	4f - -	/* Cause all currently waiting threads to recognize they are -	   woken up.  */ -3:	movl	%ebp, wakeup_seq-cond_futex(%ebx) -	movl	%eax, wakeup_seq-cond_futex+4(%ebx) -	movl	%ebp, woken_seq-cond_futex(%ebx) -	movl	%eax, woken_seq-cond_futex+4(%ebx) -	addl	%ebp, %ebp -	addl	$1, broadcast_seq-cond_futex(%ebx) -	movl	%ebp, (%ebx) - -	/* Get the address of the mutex used.  */ -	movl	dep_mutex-cond_futex(%ebx), %edi - -	/* Unlock.  */ -	LOCK -	subl	$1, cond_lock-cond_futex(%ebx) -	jne	7f - -	/* Don't use requeue for pshared condvars.  */ -8:	cmpl	$-1, %edi -	je	9f - -	/* Do not use requeue for pshared condvars.  */ -	testl	$PS_BIT, MUTEX_KIND(%edi) -	jne	9f - -	/* Requeue to a non-robust PI mutex if the PI bit is set and -	   the robust bit is not set.  */ -	movl	MUTEX_KIND(%edi), %eax -	andl	$(ROBUST_BIT|PI_BIT), %eax -	cmpl	$PI_BIT, %eax -	je	81f - -	/* Wake up all threads.  */ -#ifdef __ASSUME_PRIVATE_FUTEX -	movl	$(FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG), %ecx -#else -	movl	%gs:PRIVATE_FUTEX, %ecx -	orl	$FUTEX_CMP_REQUEUE, %ecx -#endif -	movl	$SYS_futex, %eax -	movl	$0x7fffffff, %esi -	movl	$1, %edx -	/* Get the address of the futex involved.  */ -# if MUTEX_FUTEX != 0 -	addl	$MUTEX_FUTEX, %edi -# endif -/* FIXME: Until Ingo fixes 4G/4G vDSO, 6 arg syscalls are broken for sysenter. -	ENTER_KERNEL  */ -	int	$0x80 - -	/* For any kind of error, which mainly is EAGAIN, we try again -	   with WAKE.  The general test also covers running on old -	   kernels.  */ -	cmpl	$0xfffff001, %eax -	jae	9f - -6:	xorl	%eax, %eax -	popl	%ebp -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebp) -	popl	%edi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%edi) -	popl	%esi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%esi) -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	ret - -	cfi_restore_state - -81:	movl	$(FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG), %ecx -	movl	$SYS_futex, %eax -	movl	$0x7fffffff, %esi -	movl	$1, %edx -	/* Get the address of the futex involved.  */ -# if MUTEX_FUTEX != 0 -	addl	$MUTEX_FUTEX, %edi -# endif -	int	$0x80 - -	/* For any kind of error, which mainly is EAGAIN, we try again -	with WAKE.  The general test also covers running on old -	kernels.  */ -	cmpl	$0xfffff001, %eax -	jb	6b -	jmp	9f - -	/* Initial locking failed.  */ -1: -#if cond_lock == 0 -	movl	%ebx, %edx -#else -	leal	cond_lock(%ebx), %edx -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_lock_wait -	jmp	2b - -	.align	16 -	/* Unlock.  */ -4:	LOCK -	subl	$1, cond_lock-cond_futex(%ebx) -	je	6b - -	/* Unlock in loop requires wakeup.  */ -5:	leal	cond_lock-cond_futex(%ebx), %eax -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex-cond_futex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_unlock_wake -	jmp	6b - -	/* Unlock in loop requires wakeup.  */ -7:	leal	cond_lock-cond_futex(%ebx), %eax -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex-cond_futex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_unlock_wake -	jmp	8b - -9:	/* The futex requeue functionality is not available.  */ -	movl	$0x7fffffff, %edx -#if FUTEX_PRIVATE_FLAG > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex-cond_futex(%ebx) -	sete	%cl -	subl	$1, %ecx -#ifdef __ASSUME_PRIVATE_FUTEX -	andl	$FUTEX_PRIVATE_FLAG, %ecx -#else -	andl	%gs:PRIVATE_FUTEX, %ecx -#endif -	addl	$FUTEX_WAKE, %ecx -	movl	$SYS_futex, %eax -	ENTER_KERNEL -	jmp	6b -	cfi_endproc -	.size	__pthread_cond_broadcast, .-__pthread_cond_broadcast -weak_alias(__pthread_cond_broadcast, pthread_cond_broadcast) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S deleted file mode 100644 index d831a6bf5..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S +++ /dev/null @@ -1,215 +0,0 @@ -/* Copyright (C) 2002,2003,2004,2005,2007,2009 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelcond.h> -#include <bits/kernel-features.h> -#include <pthread-pi-defines.h> -#include <pthread-errnos.h> -#include <tls.h> - - -	.text - -	/* int pthread_cond_signal (pthread_cond_t *cond) */ -	.globl	__pthread_cond_signal -	.type	__pthread_cond_signal, @function -	.protected	__pthread_cond_signal -	.align	16 -__pthread_cond_signal: - -	cfi_startproc -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%ebx, 0) -	pushl	%edi -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%edi, 0) -	cfi_remember_state - -	movl	12(%esp), %edi - -	/* Get internal lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if cond_lock == 0 -	cmpxchgl %edx, (%edi) -#else -	cmpxchgl %edx, cond_lock(%edi) -#endif -	jnz	1f - -2:	leal	cond_futex(%edi), %ebx -	movl	total_seq+4(%edi), %eax -	movl	total_seq(%edi), %ecx -	cmpl	wakeup_seq+4(%edi), %eax -#if cond_lock != 0 -	/* Must use leal to preserve the flags.  */ -	leal	cond_lock(%edi), %edi -#endif -	ja	3f -	jb	4f -	cmpl	wakeup_seq-cond_futex(%ebx), %ecx -	jbe	4f - -	/* Bump the wakeup number.  */ -3:	addl	$1, wakeup_seq-cond_futex(%ebx) -	adcl	$0, wakeup_seq-cond_futex+4(%ebx) -	addl	$1, (%ebx) - -	/* Wake up one thread.  */ -	pushl	%esi -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%esi, 0) -	pushl	%ebp -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%ebp, 0) - -#if FUTEX_PRIVATE_FLAG > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex-cond_futex(%ebx) -	sete	%cl -	je	8f - -	movl	dep_mutex-cond_futex(%ebx), %edx -	/* Requeue to a non-robust PI mutex if the PI bit is set and -	   the robust bit is not set.  */ -	movl	MUTEX_KIND(%edx), %eax -	andl	$(ROBUST_BIT|PI_BIT), %eax -	cmpl	$PI_BIT, %eax -	je	9f - -8:	subl	$1, %ecx -#ifdef __ASSUME_PRIVATE_FUTEX -	andl	$FUTEX_PRIVATE_FLAG, %ecx -#else -	andl	%gs:PRIVATE_FUTEX, %ecx -#endif -	addl	$FUTEX_WAKE_OP, %ecx -	movl	$SYS_futex, %eax -	movl	$1, %edx -	movl	$1, %esi -	movl	$FUTEX_OP_CLEAR_WAKE_IF_GT_ONE, %ebp -	/* FIXME: Until Ingo fixes 4G/4G vDSO, 6 arg syscalls are broken for -	   sysenter. -	ENTER_KERNEL  */ -	int	$0x80 -	popl	%ebp -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebp) -	popl	%esi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%esi) - -	/* For any kind of error, we try again with WAKE. -	   The general test also covers running on old kernels.  */ -	cmpl	$-4095, %eax -	jae	7f - -6:	xorl	%eax, %eax -	popl	%edi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%edi) -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	ret - -	cfi_restore_state - -9:	movl	$(FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG), %ecx -	movl	$SYS_futex, %eax -	movl	$1, %edx -	xorl	%esi, %esi -	movl	dep_mutex-cond_futex(%ebx), %edi -	movl	(%ebx), %ebp -	/* FIXME: Until Ingo fixes 4G/4G vDSO, 6 arg syscalls are broken for -	   sysenter. -	ENTER_KERNEL  */ -	int	$0x80 -	popl	%ebp -	popl	%esi - -	leal	-cond_futex(%ebx), %edi - -	/* For any kind of error, we try again with WAKE. -	   The general test also covers running on old kernels.  */ -	cmpl	$-4095, %eax -	jb	4f - -7: -#ifdef __ASSUME_PRIVATE_FUTEX -	andl	$FUTEX_PRIVATE_FLAG, %ecx -#else -	andl	%gs:PRIVATE_FUTEX, %ecx -#endif -	orl	$FUTEX_WAKE, %ecx - -	xorl	$(FUTEX_WAKE ^ FUTEX_WAKE_OP), %ecx -	movl	$SYS_futex, %eax -	/* %edx should be 1 already from $FUTEX_WAKE_OP syscall. -	movl	$1, %edx  */ -	ENTER_KERNEL - -	/* Unlock.  Note that at this point %edi always points to -	   cond_lock.  */ -4:	LOCK -	subl	$1, (%edi) -	je	6b - -	/* Unlock in loop requires wakeup.  */ -5:	movl	%edi, %eax -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex-cond_futex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_unlock_wake -	jmp	6b - -	/* Initial locking failed.  */ -1: -#if cond_lock == 0 -	movl	%edi, %edx -#else -	leal	cond_lock(%edi), %edx -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%edi) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_lock_wait -	jmp	2b - -	cfi_endproc -	.size	__pthread_cond_signal, .-__pthread_cond_signal -weak_alias(__pthread_cond_signal, pthread_cond_signal) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S deleted file mode 100644 index fd388f993..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S +++ /dev/null @@ -1,698 +0,0 @@ -/* Copyright (C) 2002-2004,2006-2007,2009,2010 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelcond.h> -#include <pthread-errnos.h> -#include <pthread-pi-defines.h> -#include <bits/kernel-features.h> -#include <tcb-offsets.h> - - -	.text - -/* int pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex, -			       const struct timespec *abstime)  */ -	.globl	__pthread_cond_timedwait -	.type	__pthread_cond_timedwait, @function -	.protected	__pthread_cond_timedwait -	.align	16 -__pthread_cond_timedwait: -.LSTARTCODE: -	cfi_startproc -#ifdef SHARED -	cfi_personality(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect, -			DW.ref.__gcc_personality_v0) -	cfi_lsda(DW_EH_PE_pcrel | DW_EH_PE_sdata4, .LexceptSTART) -#else -	cfi_personality(DW_EH_PE_udata4, __gcc_personality_v0) -	cfi_lsda(DW_EH_PE_udata4, .LexceptSTART) -#endif - -	pushl	%ebp -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%ebp, 0) -	pushl	%edi -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%edi, 0) -	pushl	%esi -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%esi, 0) -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%ebx, 0) - -	movl	20(%esp), %ebx -	movl	28(%esp), %ebp - -	cmpl	$1000000000, 4(%ebp) -	movl	$EINVAL, %eax -	jae	18f - -	/* Get internal lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if cond_lock == 0 -	cmpxchgl %edx, (%ebx) -#else -	cmpxchgl %edx, cond_lock(%ebx) -#endif -	jnz	1f - -	/* Store the reference to the mutex.  If there is already a -	   different value in there this is a bad user bug.  */ -2:	cmpl	$-1, dep_mutex(%ebx) -	movl	24(%esp), %eax -	je	17f -	movl	%eax, dep_mutex(%ebx) - -	/* Unlock the mutex.  */ -17:	xorl	%edx, %edx -	call	__pthread_mutex_unlock_usercnt - -	testl	%eax, %eax -	jne	16f - -	addl	$1, total_seq(%ebx) -	adcl	$0, total_seq+4(%ebx) -	addl	$1, cond_futex(%ebx) -	addl	$(1 << nwaiters_shift), cond_nwaiters(%ebx) - -#define FRAME_SIZE 32 -	subl	$FRAME_SIZE, %esp -	cfi_adjust_cfa_offset(FRAME_SIZE) -	cfi_remember_state - -	/* Get and store current wakeup_seq value.  */ -	movl	wakeup_seq(%ebx), %edi -	movl	wakeup_seq+4(%ebx), %edx -	movl	broadcast_seq(%ebx), %eax -	movl	%edi, 12(%esp) -	movl	%edx, 16(%esp) -	movl	%eax, 20(%esp) - -	/* Reset the pi-requeued flag.  */ -8:	movl	$0, 24(%esp) -	/* Get the current time.  */ -	movl	%ebx, %edx -#ifdef __NR_clock_gettime -	/* Get the clock number.  */ -	movl	cond_nwaiters(%ebx), %ebx -	andl	$((1 << nwaiters_shift) - 1), %ebx -	/* Only clocks 0 and 1 are allowed so far.  Both are handled in the -	   kernel.  */ -	leal	4(%esp), %ecx -	movl	$__NR_clock_gettime, %eax -	ENTER_KERNEL -# ifndef __ASSUME_POSIX_TIMERS -	cmpl	$-ENOSYS, %eax -	je	19f -# endif -	movl	%edx, %ebx - -	/* Compute relative timeout.  */ -	movl	(%ebp), %ecx -	movl	4(%ebp), %edx -	subl	4(%esp), %ecx -	subl	8(%esp), %edx -#else -	/* Get the current time.  */ -	leal	4(%esp), %ebx -	xorl	%ecx, %ecx -	movl	$__NR_gettimeofday, %eax -	ENTER_KERNEL -	movl	%edx, %ebx - -	/* Compute relative timeout.  */ -	movl	8(%esp), %eax -	movl	$1000, %edx -	mul	%edx		/* Milli seconds to nano seconds.  */ -	movl	(%ebp), %ecx -	movl	4(%ebp), %edx -	subl	4(%esp), %ecx -	subl	%eax, %edx -#endif -	jns	12f -	addl	$1000000000, %edx -	subl	$1, %ecx -12:	testl	%ecx, %ecx -	movl	$-ETIMEDOUT, %esi -	js	6f - -	/* Store relative timeout.  */ -21:	movl	%ecx, 4(%esp) -	movl	%edx, 8(%esp) - -	movl	cond_futex(%ebx), %edi -	movl	%edi, 28(%esp) - -	/* Unlock.  */ -	LOCK -#if cond_lock == 0 -	subl	$1, (%ebx) -#else -	subl	$1, cond_lock(%ebx) -#endif -	jne	3f - -.LcleanupSTART: -4:	call	__pthread_enable_asynccancel -	movl	%eax, (%esp) - -#if FUTEX_PRIVATE_FLAG > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%ebx) -	sete	%cl -	je	40f - -	movl	dep_mutex(%ebx), %edi -	/* Requeue to a non-robust PI mutex if the PI bit is set and -	   the robust bit is not set.  */ -	movl	MUTEX_KIND(%edi), %eax -	andl	$(ROBUST_BIT|PI_BIT), %eax -	cmpl	$PI_BIT, %eax -	jne	40f - -	movl	$(FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG), %ecx -	/* The following only works like this because we only support -	   two clocks, represented using a single bit.  */ -	testl	$1, cond_nwaiters(%ebx) -	/* XXX Need to implement using sete instead of a jump.  */ -	jne	42f -	orl	$FUTEX_CLOCK_REALTIME, %ecx - -	/* Requeue-PI uses absolute timeout */ -42:	leal	(%ebp), %esi -	movl	28(%esp), %edx -	addl	$cond_futex, %ebx -	movl	$SYS_futex, %eax -	ENTER_KERNEL -	subl	$cond_futex, %ebx -	movl	%eax, %esi -	/* Set the pi-requeued flag only if the kernel has returned 0. The -	   kernel does not hold the mutex on ETIMEDOUT or any other error.  */ -	cmpl	$0, %eax -	sete	24(%esp) -	je	41f - -	/* Normal and PI futexes dont mix. Use normal futex functions only -	   if the kernel does not support the PI futex functions.  */ -	cmpl	$-ENOSYS, %eax -	jne	41f -	xorl	%ecx, %ecx - -40:	subl	$1, %ecx -#ifdef __ASSUME_PRIVATE_FUTEX -	andl	$FUTEX_PRIVATE_FLAG, %ecx -#else -	andl	%gs:PRIVATE_FUTEX, %ecx -#endif -#if FUTEX_WAIT != 0 -	addl	$FUTEX_WAIT, %ecx -#endif -	leal	4(%esp), %esi -	movl	28(%esp), %edx -	addl	$cond_futex, %ebx -.Ladd_cond_futex: -	movl	$SYS_futex, %eax -	ENTER_KERNEL -	subl	$cond_futex, %ebx -.Lsub_cond_futex: -	movl	%eax, %esi - -41:	movl	(%esp), %eax -	call	__pthread_disable_asynccancel -.LcleanupEND: - -	/* Lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if cond_lock == 0 -	cmpxchgl %edx, (%ebx) -#else -	cmpxchgl %edx, cond_lock(%ebx) -#endif -	jnz	5f - -6:	movl	broadcast_seq(%ebx), %eax -	cmpl	20(%esp), %eax -	jne	23f - -	movl	woken_seq(%ebx), %eax -	movl	woken_seq+4(%ebx), %ecx - -	movl	wakeup_seq(%ebx), %edi -	movl	wakeup_seq+4(%ebx), %edx - -	cmpl	16(%esp), %edx -	jne	7f -	cmpl	12(%esp), %edi -	je	15f - -7:	cmpl	%ecx, %edx -	jne	9f -	cmp	%eax, %edi -	jne	9f - -15:	cmpl	$-ETIMEDOUT, %esi -	jne	8b - -	addl	$1, wakeup_seq(%ebx) -	adcl	$0, wakeup_seq+4(%ebx) -	addl	$1, cond_futex(%ebx) -	movl	$ETIMEDOUT, %esi -	jmp	14f - -23:	xorl	%esi, %esi -	jmp	24f - -9:	xorl	%esi, %esi -14:	addl	$1, woken_seq(%ebx) -	adcl	$0, woken_seq+4(%ebx) - -24:	subl	$(1 << nwaiters_shift), cond_nwaiters(%ebx) - -	/* Wake up a thread which wants to destroy the condvar object.  */ -	movl	total_seq(%ebx), %eax -	andl	total_seq+4(%ebx), %eax -	cmpl	$0xffffffff, %eax -	jne	25f -	movl	cond_nwaiters(%ebx), %eax -	andl	$~((1 << nwaiters_shift) - 1), %eax -	jne	25f - -	addl	$cond_nwaiters, %ebx -	movl	$SYS_futex, %eax -#if FUTEX_PRIVATE_FLAG > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex-cond_nwaiters(%ebx) -	sete	%cl -	subl	$1, %ecx -#ifdef __ASSUME_PRIVATE_FUTEX -	andl	$FUTEX_PRIVATE_FLAG, %ecx -#else -	andl	%gs:PRIVATE_FUTEX, %ecx -#endif -	addl	$FUTEX_WAKE, %ecx -	movl	$1, %edx -	ENTER_KERNEL -	subl	$cond_nwaiters, %ebx - -25:	LOCK -#if cond_lock == 0 -	subl	$1, (%ebx) -#else -	subl	$1, cond_lock(%ebx) -#endif -	jne	10f - -11:	movl	24+FRAME_SIZE(%esp), %eax -	/* With requeue_pi, the mutex lock is held in the kernel.  */ -	movl	24(%esp), %ecx -	testl	%ecx, %ecx -	jnz	27f - -	call	__pthread_mutex_cond_lock -26:	addl	$FRAME_SIZE, %esp -	cfi_adjust_cfa_offset(-FRAME_SIZE); - -	/* We return the result of the mutex_lock operation if it failed.  */ -	testl	%eax, %eax -#ifdef HAVE_CMOV -	cmovel	%esi, %eax -#else -	jne	22f -	movl	%esi, %eax -22: -#endif - -18:	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	popl	%esi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%esi) -	popl	%edi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%edi) -	popl	%ebp -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebp) - -	ret - -	cfi_restore_state - -27:	call	__pthread_mutex_cond_lock_adjust -	xorl	%eax, %eax -	jmp	26b - -	cfi_adjust_cfa_offset(-FRAME_SIZE); -	/* Initial locking failed.  */ -1: -#if cond_lock == 0 -	movl	%ebx, %edx -#else -	leal	cond_lock(%ebx), %edx -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_lock_wait -	jmp	2b - -	/* The initial unlocking of the mutex failed.  */ -16: -	LOCK -#if cond_lock == 0 -	subl	$1, (%ebx) -#else -	subl	$1, cond_lock(%ebx) -#endif -	jne	18b - -	movl	%eax, %esi -#if cond_lock == 0 -	movl	%ebx, %eax -#else -	leal	cond_lock(%ebx), %eax -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_unlock_wake - -	movl	%esi, %eax -	jmp	18b - -	cfi_adjust_cfa_offset(FRAME_SIZE) - -	/* Unlock in loop requires wakeup.  */ -3: -#if cond_lock == 0 -	movl	%ebx, %eax -#else -	leal	cond_lock(%ebx), %eax -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_unlock_wake -	jmp	4b - -	/* Locking in loop failed.  */ -5: -#if cond_lock == 0 -	movl	%ebx, %edx -#else -	leal	cond_lock(%ebx), %edx -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_lock_wait -	jmp	6b - -	/* Unlock after loop requires wakeup.  */ -10: -#if cond_lock == 0 -	movl	%ebx, %eax -#else -	leal	cond_lock(%ebx), %eax -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_unlock_wake -	jmp	11b - -#if defined __NR_clock_gettime && !defined __ASSUME_POSIX_TIMERS -	/* clock_gettime not available.  */ -19:	leal	4(%esp), %ebx -	xorl	%ecx, %ecx -	movl	$__NR_gettimeofday, %eax -	ENTER_KERNEL -	movl	%edx, %ebx - -	/* Compute relative timeout.  */ -	movl	8(%esp), %eax -	movl	$1000, %edx -	mul	%edx		/* Milli seconds to nano seconds.  */ -	movl	(%ebp), %ecx -	movl	4(%ebp), %edx -	subl	4(%esp), %ecx -	subl	%eax, %edx -	jns	20f -	addl	$1000000000, %edx -	subl	$1, %ecx -20:	testl	%ecx, %ecx -	movl	$-ETIMEDOUT, %esi -	js	6b -	jmp	21b -#endif -	.size	__pthread_cond_timedwait, .-__pthread_cond_timedwait -weak_alias(__pthread_cond_timedwait, pthread_cond_timedwait) - - -	.type	__condvar_tw_cleanup2, @function -__condvar_tw_cleanup2: -	subl	$cond_futex, %ebx -	.size	__condvar_tw_cleanup2, .-__condvar_tw_cleanup2 -	.type	__condvar_tw_cleanup, @function -__condvar_tw_cleanup: -	movl	%eax, %esi - -	/* Get internal lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if cond_lock == 0 -	cmpxchgl %edx, (%ebx) -#else -	cmpxchgl %edx, cond_lock(%ebx) -#endif -	jz	1f - -#if cond_lock == 0 -	movl	%ebx, %edx -#else -	leal	cond_lock(%ebx), %edx -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_lock_wait - -1:	movl	broadcast_seq(%ebx), %eax -	cmpl	20(%esp), %eax -	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.  */ -	movl	total_seq(%ebx), %eax -	movl	total_seq+4(%ebx), %edi -	cmpl	wakeup_seq+4(%ebx), %edi -	jb	6f -	ja	7f -	cmpl	wakeup_seq(%ebx), %eax -	jbe	7f - -6:	addl	$1, wakeup_seq(%ebx) -	adcl	$0, wakeup_seq+4(%ebx) -	addl	$1, cond_futex(%ebx) - -7:	addl	$1, woken_seq(%ebx) -	adcl	$0, woken_seq+4(%ebx) - -3:	subl	$(1 << nwaiters_shift), cond_nwaiters(%ebx) - -	/* Wake up a thread which wants to destroy the condvar object.  */ -	xorl	%edi, %edi -	movl	total_seq(%ebx), %eax -	andl	total_seq+4(%ebx), %eax -	cmpl	$0xffffffff, %eax -	jne	4f -	movl	cond_nwaiters(%ebx), %eax -	andl	$~((1 << nwaiters_shift) - 1), %eax -	jne	4f - -	addl	$cond_nwaiters, %ebx -	movl	$SYS_futex, %eax -#if FUTEX_PRIVATE_FLAG > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex-cond_nwaiters(%ebx) -	sete	%cl -	subl	$1, %ecx -#ifdef __ASSUME_PRIVATE_FUTEX -	andl	$FUTEX_PRIVATE_FLAG, %ecx -#else -	andl	%gs:PRIVATE_FUTEX, %ecx -#endif -	addl	$FUTEX_WAKE, %ecx -	movl	$1, %edx -	ENTER_KERNEL -	subl	$cond_nwaiters, %ebx -	movl	$1, %edi - -4:	LOCK -#if cond_lock == 0 -	subl	$1, (%ebx) -#else -	subl	$1, cond_lock(%ebx) -#endif -	je	2f - -#if cond_lock == 0 -	movl	%ebx, %eax -#else -	leal	cond_lock(%ebx), %eax -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_unlock_wake - -	/* Wake up all waiters to make sure no signal gets lost.  */ -2:	testl	%edi, %edi -	jnz	5f -	addl	$cond_futex, %ebx -#if FUTEX_PRIVATE_FLAG > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex-cond_futex(%ebx) -	sete	%cl -	subl	$1, %ecx -#ifdef __ASSUME_PRIVATE_FUTEX -	andl	$FUTEX_PRIVATE_FLAG, %ecx -#else -	andl	%gs:PRIVATE_FUTEX, %ecx -#endif -	addl	$FUTEX_WAKE, %ecx -	movl	$SYS_futex, %eax -	movl	$0x7fffffff, %edx -	ENTER_KERNEL - -5:	movl	24+FRAME_SIZE(%esp), %eax -	call	__pthread_mutex_cond_lock - -	movl	%esi, (%esp) -.LcallUR: -#ifdef __PIC__ -	call	__i686.get_pc_thunk.bx -	addl	$_GLOBAL_OFFSET_TABLE_, %ebx -#endif -	call	_Unwind_Resume@PLT -	hlt -.LENDCODE: -	cfi_endproc -	.size	__condvar_tw_cleanup, .-__condvar_tw_cleanup - - -	.section .gcc_except_table,"a",@progbits -.LexceptSTART: -	.byte	DW_EH_PE_omit			# @LPStart format (omit) -	.byte	DW_EH_PE_omit			# @TType format (omit) -	.byte	DW_EH_PE_sdata4			# call-site format -						# DW_EH_PE_sdata4 -	.uleb128 .Lcstend-.Lcstbegin -.Lcstbegin: -	.long	.LcleanupSTART-.LSTARTCODE -	.long	.Ladd_cond_futex-.LcleanupSTART -	.long	__condvar_tw_cleanup-.LSTARTCODE -	.uleb128  0 -	.long	.Ladd_cond_futex-.LSTARTCODE -	.long	.Lsub_cond_futex-.Ladd_cond_futex -	.long	__condvar_tw_cleanup2-.LSTARTCODE -	.uleb128  0 -	.long	.Lsub_cond_futex-.LSTARTCODE -	.long	.LcleanupEND-.Lsub_cond_futex -	.long	__condvar_tw_cleanup-.LSTARTCODE -	.uleb128  0 -	.long	.LcallUR-.LSTARTCODE -	.long	.LENDCODE-.LcallUR -	.long	0 -	.uleb128  0 -.Lcstend: - - -#ifdef SHARED -	.hidden DW.ref.__gcc_personality_v0 -	.weak	DW.ref.__gcc_personality_v0 -	.section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits -	.align	4 -	.type	DW.ref.__gcc_personality_v0, @object -	.size	DW.ref.__gcc_personality_v0, 4 -DW.ref.__gcc_personality_v0: -	.long   __gcc_personality_v0 -#endif diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S deleted file mode 100644 index 90f19800d..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S +++ /dev/null @@ -1,594 +0,0 @@ -/* Copyright (C) 2002-2004,2006-2007,2009,2010 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelcond.h> -#include <tcb-offsets.h> -#include <pthread-errnos.h> -#include <pthread-pi-defines.h> -#include <bits/kernel-features.h> - - -	.text - -/* int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex)  */ -	.globl	__pthread_cond_wait -	.type	__pthread_cond_wait, @function -	.protected	__pthread_cond_wait -	.align	16 -__pthread_cond_wait: -.LSTARTCODE: -	cfi_startproc -#ifdef SHARED -	cfi_personality(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect, -			DW.ref.__gcc_personality_v0) -	cfi_lsda(DW_EH_PE_pcrel | DW_EH_PE_sdata4, .LexceptSTART) -#else -	cfi_personality(DW_EH_PE_udata4, __gcc_personality_v0) -	cfi_lsda(DW_EH_PE_udata4, .LexceptSTART) -#endif - -	pushl	%ebp -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%ebp, 0) -	pushl	%edi -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%edi, 0) -	pushl	%esi -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%esi, 0) -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset(%ebx, 0) - -	xorl	%esi, %esi -	movl	20(%esp), %ebx - -	/* Get internal lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if cond_lock == 0 -	cmpxchgl %edx, (%ebx) -#else -	cmpxchgl %edx, cond_lock(%ebx) -#endif -	jnz	1f - -	/* Store the reference to the mutex.  If there is already a -	   different value in there this is a bad user bug.  */ -2:	cmpl	$-1, dep_mutex(%ebx) -	movl	24(%esp), %eax -	je	15f -	movl	%eax, dep_mutex(%ebx) - -	/* Unlock the mutex.  */ -15:	xorl	%edx, %edx -	call	__pthread_mutex_unlock_usercnt - -	testl	%eax, %eax -	jne	12f - -	addl	$1, total_seq(%ebx) -	adcl	$0, total_seq+4(%ebx) -	addl	$1, cond_futex(%ebx) -	addl	$(1 << nwaiters_shift), cond_nwaiters(%ebx) - -#define FRAME_SIZE 20 -	subl	$FRAME_SIZE, %esp -	cfi_adjust_cfa_offset(FRAME_SIZE) -	cfi_remember_state - -	/* Get and store current wakeup_seq value.  */ -	movl	wakeup_seq(%ebx), %edi -	movl	wakeup_seq+4(%ebx), %edx -	movl	broadcast_seq(%ebx), %eax -	movl	%edi, 4(%esp) -	movl	%edx, 8(%esp) -	movl	%eax, 12(%esp) - -	/* Reset the pi-requeued flag.  */ -8:	movl	$0, 16(%esp) -	movl	cond_futex(%ebx), %ebp - -	/* Unlock.  */ -	LOCK -#if cond_lock == 0 -	subl	$1, (%ebx) -#else -	subl	$1, cond_lock(%ebx) -#endif -	jne	3f - -.LcleanupSTART: -4:	call	__pthread_enable_asynccancel -	movl	%eax, (%esp) - -	xorl	%ecx, %ecx -	cmpl	$-1, dep_mutex(%ebx) -	sete	%cl -	je	18f - -	movl	dep_mutex(%ebx), %edi -	/* Requeue to a non-robust PI mutex if the PI bit is set and -	   the robust bit is not set.  */ -	movl	MUTEX_KIND(%edi), %eax -	andl	$(ROBUST_BIT|PI_BIT), %eax -	cmpl	$PI_BIT, %eax -	jne	18f - -	movl	$(FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG), %ecx -	movl	%ebp, %edx -	xorl	%esi, %esi -	addl	$cond_futex, %ebx -	movl	$SYS_futex, %eax -	ENTER_KERNEL -	subl	$cond_futex, %ebx -	/* Set the pi-requeued flag only if the kernel has returned 0. The -	   kernel does not hold the mutex on error.  */ -	cmpl	$0, %eax -	sete	16(%esp) -	je	19f - -	/* Normal and PI futexes dont mix. Use normal futex functions only -	   if the kernel does not support the PI futex functions.  */ -	cmpl	$-ENOSYS, %eax -	jne	19f -	xorl	%ecx, %ecx - -18:	subl	$1, %ecx -#ifdef __ASSUME_PRIVATE_FUTEX -	andl	$FUTEX_PRIVATE_FLAG, %ecx -#else -	andl	%gs:PRIVATE_FUTEX, %ecx -#endif -#if FUTEX_WAIT != 0 -	addl	$FUTEX_WAIT, %ecx -#endif -	movl	%ebp, %edx -	addl	$cond_futex, %ebx -.Ladd_cond_futex: -	movl	$SYS_futex, %eax -	ENTER_KERNEL -	subl	$cond_futex, %ebx -.Lsub_cond_futex: - -19:	movl	(%esp), %eax -	call	__pthread_disable_asynccancel -.LcleanupEND: - -	/* Lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if cond_lock == 0 -	cmpxchgl %edx, (%ebx) -#else -	cmpxchgl %edx, cond_lock(%ebx) -#endif -	jnz	5f - -6:	movl	broadcast_seq(%ebx), %eax -	cmpl	12(%esp), %eax -	jne	16f - -	movl	woken_seq(%ebx), %eax -	movl	woken_seq+4(%ebx), %ecx - -	movl	wakeup_seq(%ebx), %edi -	movl	wakeup_seq+4(%ebx), %edx - -	cmpl	8(%esp), %edx -	jne	7f -	cmpl	4(%esp), %edi -	je	8b - -7:	cmpl	%ecx, %edx -	jne	9f -	cmp	%eax, %edi -	je	8b - -9:	addl	$1, woken_seq(%ebx) -	adcl	$0, woken_seq+4(%ebx) - -	/* Unlock */ -16:	subl	$(1 << nwaiters_shift), cond_nwaiters(%ebx) - -	/* Wake up a thread which wants to destroy the condvar object.  */ -	movl	total_seq(%ebx), %eax -	andl	total_seq+4(%ebx), %eax -	cmpl	$0xffffffff, %eax -	jne	17f -	movl	cond_nwaiters(%ebx), %eax -	andl	$~((1 << nwaiters_shift) - 1), %eax -	jne	17f - -	addl	$cond_nwaiters, %ebx -	movl	$SYS_futex, %eax -#if FUTEX_PRIVATE_FLAG > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex-cond_nwaiters(%ebx) -	sete	%cl -	subl	$1, %ecx -#ifdef __ASSUME_PRIVATE_FUTEX -	andl	$FUTEX_PRIVATE_FLAG, %ecx -#else -	andl	%gs:PRIVATE_FUTEX, %ecx -#endif -	addl	$FUTEX_WAKE, %ecx -	movl	$1, %edx -	ENTER_KERNEL -	subl	$cond_nwaiters, %ebx - -17:	LOCK -#if cond_lock == 0 -	subl	$1, (%ebx) -#else -	subl	$1, cond_lock(%ebx) -#endif -	jne	10f - -	/* With requeue_pi, the mutex lock is held in the kernel.  */ -11:	movl	24+FRAME_SIZE(%esp), %eax -	movl	16(%esp), %ecx -	testl	%ecx, %ecx -	jnz	21f - -	call	__pthread_mutex_cond_lock -20:	addl	$FRAME_SIZE, %esp -	cfi_adjust_cfa_offset(-FRAME_SIZE); - -14:	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	popl	%esi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%esi) -	popl	%edi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%edi) -	popl	%ebp -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebp) - -	/* We return the result of the mutex_lock operation.  */ -	ret - -	cfi_restore_state - -21:	call	__pthread_mutex_cond_lock_adjust -	xorl	%eax, %eax -	jmp	20b - -	cfi_adjust_cfa_offset(-FRAME_SIZE); -	/* Initial locking failed.  */ -1: -#if cond_lock == 0 -	movl	%ebx, %edx -#else -	leal	cond_lock(%ebx), %edx -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_lock_wait -	jmp	2b - -	/* The initial unlocking of the mutex failed.  */ -12: -	LOCK -#if cond_lock == 0 -	subl	$1, (%ebx) -#else -	subl	$1, cond_lock(%ebx) -#endif -	jne	14b - -	movl	%eax, %esi -#if cond_lock == 0 -	movl	%ebx, %eax -#else -	leal	cond_lock(%ebx), %eax -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_unlock_wake - -	movl	%esi, %eax -	jmp	14b - -	cfi_adjust_cfa_offset(FRAME_SIZE) - -	/* Unlock in loop requires wakeup.  */ -3: -#if cond_lock == 0 -	movl	%ebx, %eax -#else -	leal	cond_lock(%ebx), %eax -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_unlock_wake -	jmp	4b - -	/* Locking in loop failed.  */ -5: -#if cond_lock == 0 -	movl	%ebx, %edx -#else -	leal	cond_lock(%ebx), %edx -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_lock_wait -	jmp	6b - -	/* Unlock after loop requires wakeup.  */ -10: -#if cond_lock == 0 -	movl	%ebx, %eax -#else -	leal	cond_lock(%ebx), %eax -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_unlock_wake -	jmp	11b -	.size	__pthread_cond_wait, .-__pthread_cond_wait -weak_alias(__pthread_cond_wait, pthread_cond_wait) - - -	.type	__condvar_w_cleanup2, @function -__condvar_w_cleanup2: -	subl	$cond_futex, %ebx -	.size	__condvar_w_cleanup2, .-__condvar_w_cleanup2 -.LSbl4: -	.type	__condvar_w_cleanup, @function -__condvar_w_cleanup: -	movl	%eax, %esi - -	/* Get internal lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if cond_lock == 0 -	cmpxchgl %edx, (%ebx) -#else -	cmpxchgl %edx, cond_lock(%ebx) -#endif -	jz	1f - -#if cond_lock == 0 -	movl	%ebx, %edx -#else -	leal	cond_lock(%ebx), %edx -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_lock_wait - -1:	movl	broadcast_seq(%ebx), %eax -	cmpl	12(%esp), %eax -	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.  */ -	movl	total_seq(%ebx), %eax -	movl	total_seq+4(%ebx), %edi -	cmpl	wakeup_seq+4(%ebx), %edi -	jb	6f -	ja	7f -	cmpl	wakeup_seq(%ebx), %eax -	jbe	7f - -6:	addl	$1, wakeup_seq(%ebx) -	adcl	$0, wakeup_seq+4(%ebx) -	addl	$1, cond_futex(%ebx) - -7:	addl	$1, woken_seq(%ebx) -	adcl	$0, woken_seq+4(%ebx) - -3:	subl	$(1 << nwaiters_shift), cond_nwaiters(%ebx) - -	/* Wake up a thread which wants to destroy the condvar object.  */ -	xorl	%edi, %edi -	movl	total_seq(%ebx), %eax -	andl	total_seq+4(%ebx), %eax -	cmpl	$0xffffffff, %eax -	jne	4f -	movl	cond_nwaiters(%ebx), %eax -	andl	$~((1 << nwaiters_shift) - 1), %eax -	jne	4f - -	addl	$cond_nwaiters, %ebx -	movl	$SYS_futex, %eax -#if FUTEX_PRIVATE_FLAG > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex-cond_nwaiters(%ebx) -	sete	%cl -	subl	$1, %ecx -#ifdef __ASSUME_PRIVATE_FUTEX -	andl	$FUTEX_PRIVATE_FLAG, %ecx -#else -	andl	%gs:PRIVATE_FUTEX, %ecx -#endif -	addl	$FUTEX_WAKE, %ecx -	movl	$1, %edx -	ENTER_KERNEL -	subl	$cond_nwaiters, %ebx -	movl	$1, %edi - -4:	LOCK -#if cond_lock == 0 -	subl	$1, (%ebx) -#else -	subl	$1, cond_lock(%ebx) -#endif -	je	2f - -#if cond_lock == 0 -	movl	%ebx, %eax -#else -	leal	cond_lock(%ebx), %eax -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex(%ebx) -	setne	%cl -	subl	$1, %ecx -	andl	$(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 -	addl	$LLL_PRIVATE, %ecx -#endif -	call	__lll_unlock_wake - -	/* Wake up all waiters to make sure no signal gets lost.  */ -2:	testl	%edi, %edi -	jnz	5f -	addl	$cond_futex, %ebx -#if FUTEX_PRIVATE_FLAG > 255 -	xorl	%ecx, %ecx -#endif -	cmpl	$-1, dep_mutex-cond_futex(%ebx) -	sete	%cl -	subl	$1, %ecx -#ifdef __ASSUME_PRIVATE_FUTEX -	andl	$FUTEX_PRIVATE_FLAG, %ecx -#else -	andl	%gs:PRIVATE_FUTEX, %ecx -#endif -	addl	$FUTEX_WAKE, %ecx -	movl	$SYS_futex, %eax -	movl	$0x7fffffff, %edx -	ENTER_KERNEL - -5:	movl	24+FRAME_SIZE(%esp), %eax -	call	__pthread_mutex_cond_lock - -	movl	%esi, (%esp) -.LcallUR: -#ifdef __PIC__ -	call	__i686.get_pc_thunk.bx -	addl	$_GLOBAL_OFFSET_TABLE_, %ebx -#endif -	call	_Unwind_Resume@PLT -	hlt -.LENDCODE: -	cfi_endproc -	.size	__condvar_w_cleanup, .-__condvar_w_cleanup - - -	.section .gcc_except_table,"a",@progbits -.LexceptSTART: -	.byte	DW_EH_PE_omit			# @LPStart format (omit) -	.byte	DW_EH_PE_omit			# @TType format (omit) -	.byte	DW_EH_PE_sdata4			# call-site format -						# DW_EH_PE_sdata4 -	.uleb128 .Lcstend-.Lcstbegin -.Lcstbegin: -	.long	.LcleanupSTART-.LSTARTCODE -	.long	.Ladd_cond_futex-.LcleanupSTART -	.long	__condvar_w_cleanup-.LSTARTCODE -	.uleb128  0 -	.long	.Ladd_cond_futex-.LSTARTCODE -	.long	.Lsub_cond_futex-.Ladd_cond_futex -	.long	__condvar_w_cleanup2-.LSTARTCODE -	.uleb128  0 -	.long	.Lsub_cond_futex-.LSTARTCODE -	.long	.LcleanupEND-.Lsub_cond_futex -	.long	__condvar_w_cleanup-.LSTARTCODE -	.uleb128  0 -	.long	.LcallUR-.LSTARTCODE -	.long	.LENDCODE-.LcallUR -	.long	0 -	.uleb128  0 -.Lcstend: - -#ifdef __PIC__ -	.section .gnu.linkonce.t.__i686.get_pc_thunk.bx,"ax",@progbits -	.globl	__i686.get_pc_thunk.bx -	.hidden	__i686.get_pc_thunk.bx -	.type	__i686.get_pc_thunk.bx,@function -__i686.get_pc_thunk.bx: -	movl (%esp), %ebx; -	ret -	.size	__i686.get_pc_thunk.bx,.-__i686.get_pc_thunk.bx -#endif - -#ifdef SHARED -	.hidden DW.ref.__gcc_personality_v0 -	.weak   DW.ref.__gcc_personality_v0 -	.section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits -	.align 4 -	.type   DW.ref.__gcc_personality_v0, @object -	.size   DW.ref.__gcc_personality_v0, 4 -DW.ref.__gcc_personality_v0: -	.long   __gcc_personality_v0 -#endif diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S deleted file mode 100644 index 23efa55da..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S +++ /dev/null @@ -1,194 +0,0 @@ -/* Copyright (C) 2002, 2003, 2007 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <pthread-errnos.h> -#include <bits/kernel-features.h> -#include <tls.h> - - -	.text - -	.globl	__pthread_rwlock_rdlock -	.type	__pthread_rwlock_rdlock,@function -	.protected	__pthread_rwlock_rdlock -	.align	16 -__pthread_rwlock_rdlock: -	cfi_startproc -	pushl	%esi -	cfi_adjust_cfa_offset(4) -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	cfi_offset(%esi, -8) -	cfi_offset(%ebx, -12) - -	xorl	%esi, %esi -	movl	12(%esp), %ebx - -	/* Get the lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if MUTEX == 0 -	cmpxchgl %edx, (%ebx) -#else -	cmpxchgl %edx, MUTEX(%ebx) -#endif -	jnz	1f - -2:	movl	WRITER(%ebx), %eax -	testl	%eax, %eax -	jne	14f -	cmpl	$0, WRITERS_QUEUED(%ebx) -	je	5f -	cmpb	$0, FLAGS(%ebx) -	je	5f - -3:	addl	$1, READERS_QUEUED(%ebx) -	je	4f - -	movl	READERS_WAKEUP(%ebx), %edx - -	LOCK -#if MUTEX == 0 -	subl	$1, (%ebx) -#else -	subl	$1, MUTEX(%ebx) -#endif -	jne	10f - -11: -#ifdef __ASSUME_PRIVATE_FUTEX -	movzbl	PSHARED(%ebx), %ecx -	xorl	$FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %ecx -#else -	movzbl	PSHARED(%ebx), %ecx -# if FUTEX_WAIT != 0 -	orl	$FUTEX_WAIT, %ecx -# endif -	xorl	%gs:PRIVATE_FUTEX, %ecx -#endif -	addl	$READERS_WAKEUP, %ebx -	movl	$SYS_futex, %eax -	ENTER_KERNEL - -	subl	$READERS_WAKEUP, %ebx - -	/* Reget the lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if MUTEX == 0 -	cmpxchgl %edx, (%ebx) -#else -	cmpxchgl %edx, MUTEX(%ebx) -#endif -	jnz	12f - -13:	subl	$1, READERS_QUEUED(%ebx) -	jmp	2b - -5:	xorl	%edx, %edx -	addl	$1, NR_READERS(%ebx) -	je	8f -9:	LOCK -#if MUTEX == 0 -	subl	$1, (%ebx) -#else -	subl	$1, MUTEX(%ebx) -#endif -	jne	6f -7: - -	movl	%edx, %eax -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	popl	%esi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%esi) -	ret - -	cfi_adjust_cfa_offset(8) -	cfi_offset(%esi, -8) -	cfi_offset(%ebx, -12) -1: -#if MUTEX == 0 -	movl	%ebx, %edx -#else -	leal	MUTEX(%ebx), %edx -#endif -	movzbl	PSHARED(%ebx), %ecx -	call	__lll_lock_wait -	jmp	2b - -14:	cmpl	%gs:TID, %eax -	jne	3b -	/* Deadlock detected.  */ -	movl	$EDEADLK, %edx -	jmp	9b - -6: -#if MUTEX == 0 -	movl	%ebx, %eax -#else -	leal	MUTEX(%ebx), %eax -#endif -	movzbl	PSHARED(%ebx), %ecx -	call	__lll_unlock_wake -	jmp	7b - -	/* Overflow.  */ -8:	subl	$1, NR_READERS(%ebx) -	movl	$EAGAIN, %edx -	jmp	9b - -	/* Overflow.  */ -4:	subl	$1, READERS_QUEUED(%ebx) -	movl	$EAGAIN, %edx -	jmp	9b - -10: -#if MUTEX == 0 -	movl	%ebx, %eax -#else -	leal	MUTEX(%ebx), %eax -#endif -	movzbl	PSHARED(%ebx), %ecx -	call	__lll_unlock_wake -	jmp	11b - -12: -#if MUTEX == 0 -	movl	%ebx, %edx -#else -	leal	MUTEX(%ebx), %edx -#endif -	movzbl	PSHARED(%ebx), %ecx -	call	__lll_lock_wait -	jmp	13b -	cfi_endproc -	.size	__pthread_rwlock_rdlock,.-__pthread_rwlock_rdlock - -	.globl	pthread_rwlock_rdlock -pthread_rwlock_rdlock = __pthread_rwlock_rdlock - -	.globl	__pthread_rwlock_rdlock_internal -__pthread_rwlock_rdlock_internal = __pthread_rwlock_rdlock diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S deleted file mode 100644 index 89baa00ec..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S +++ /dev/null @@ -1,244 +0,0 @@ -/* Copyright (C) 2002, 2003, 2007 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <pthread-errnos.h> -#include <bits/kernel-features.h> -#include <tls.h> - - -	.text - -	.globl	pthread_rwlock_timedrdlock -	.type	pthread_rwlock_timedrdlock,@function -	.align	16 -pthread_rwlock_timedrdlock: -	cfi_startproc -	pushl	%esi -	cfi_adjust_cfa_offset(4) -	pushl	%edi -	cfi_adjust_cfa_offset(4) -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	pushl	%ebp -	cfi_adjust_cfa_offset(4) -	cfi_offset(%esi, -8) -	cfi_offset(%edi, -12) -	cfi_offset(%ebx, -16) -	cfi_offset(%ebp, -20) -	subl	$8, %esp -	cfi_adjust_cfa_offset(8) - -	movl	28(%esp), %ebp -	movl	32(%esp), %edi - -	/* Get the lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if MUTEX == 0 -	cmpxchgl %edx, (%ebp) -#else -	cmpxchgl %edx, MUTEX(%ebp) -#endif -	jnz	1f - -2:	movl	WRITER(%ebp), %eax -	testl	%eax, %eax -	jne	14f -	cmpl	$0, WRITERS_QUEUED(%ebp) -	je	5f -	cmpb	$0, FLAGS(%ebp) -	je	5f - -	/* Check the value of the timeout parameter.  */ -3:	cmpl	$1000000000, 4(%edi) -	jae	19f - -	addl	$1, READERS_QUEUED(%ebp) -	je	4f - -	movl	READERS_WAKEUP(%ebp), %esi - -	LOCK -#if MUTEX == 0 -	subl	$1, (%ebp) -#else -	subl	$1, MUTEX(%ebp) -#endif -	jne	10f - -	/* Get current time.  */ -11:	movl	%esp, %ebx -	xorl	%ecx, %ecx -	movl	$__NR_gettimeofday, %eax -	ENTER_KERNEL - -	/* Compute relative timeout.  */ -	movl	4(%esp), %eax -	movl	$1000, %edx -	mul	%edx		/* Milli seconds to nano seconds.  */ -	movl	(%edi), %ecx -	movl	4(%edi), %edx -	subl	(%esp), %ecx -	subl	%eax, %edx -	jns	15f -	addl	$1000000000, %edx -	subl	$1, %ecx -15:	testl	%ecx, %ecx -	js	16f		/* Time is already up.  */ - -	/* Futex call.  */ -	movl	%ecx, (%esp)	/* Store relative timeout.  */ -	movl	%edx, 4(%esp) - -	movl	%esi, %edx -#ifdef __ASSUME_PRIVATE_FUTEX -	movzbl	PSHARED(%ebp), %ecx -	xorl	$FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %ecx -#else -	movzbl	PSHARED(%ebp), %ecx -# if FUTEX_WAIT != 0 -	orl	$FUTEX_WAIT, %ecx -# endif -	xorl	%gs:PRIVATE_FUTEX, %ecx -#endif -	movl	%esp, %esi -	leal	READERS_WAKEUP(%ebp), %ebx -	movl	$SYS_futex, %eax -	ENTER_KERNEL -	movl	%eax, %esi -17: - -	/* Reget the lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if MUTEX == 0 -	cmpxchgl %edx, (%ebp) -#else -	cmpxchgl %edx, MUTEX(%ebp) -#endif -	jnz	12f - -13:	subl	$1, READERS_QUEUED(%ebp) -	cmpl	$-ETIMEDOUT, %esi -	jne	2b - -18:	movl	$ETIMEDOUT, %edx -	jmp	9f - - -5:	xorl	%edx, %edx -	addl	$1, NR_READERS(%ebp) -	je	8f -9:	LOCK -#if MUTEX == 0 -	subl	$1, (%ebp) -#else -	subl	$1, MUTEX(%ebp) -#endif -	jne	6f - -7:	movl	%edx, %eax - -	addl	$8, %esp -	cfi_adjust_cfa_offset(-8) -	popl	%ebp -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebp) -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	popl	%edi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%edi) -	popl	%esi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%esi) -	ret - -	cfi_adjust_cfa_offset(24) -	cfi_offset(%esi, -8) -	cfi_offset(%edi, -12) -	cfi_offset(%ebx, -16) -	cfi_offset(%ebp, -20) -1: -#if MUTEX == 0 -	movl	%ebp, %edx -#else -	leal	MUTEX(%ebp), %edx -#endif -	movzbl	PSHARED(%ebp), %ecx -	call	__lll_lock_wait -	jmp	2b - -14:	cmpl	%gs:TID, %eax -	jne	3b -	movl	$EDEADLK, %edx -	jmp	9b - -6: -#if MUTEX == 0 -	movl	%ebp, %eax -#else -	leal	MUTEX(%ebp), %eax -#endif -	movzbl	PSHARED(%ebp), %ecx -	call	__lll_unlock_wake -	jmp	7b - -	/* Overflow.  */ -8:	subl	$1, NR_READERS(%ebp) -	movl	$EAGAIN, %edx -	jmp	9b - -	/* Overflow.  */ -4:	subl	$1, READERS_QUEUED(%ebp) -	movl	$EAGAIN, %edx -	jmp	9b - -10: -#if MUTEX == 0 -	movl	%ebp, %eax -#else -	leal	MUTEX(%ebp), %eax -#endif -	movzbl	PSHARED(%ebp), %ecx -	call	__lll_unlock_wake -	jmp	11b - -12: -#if MUTEX == 0 -	movl	%ebp, %edx -#else -	leal	MUTEX(%ebp), %edx -#endif -	movzbl	PSHARED(%ebp), %ecx -	call	__lll_lock_wait -	jmp	13b - -16:	movl	$-ETIMEDOUT, %esi -	jmp	17b - -19:	movl	$EINVAL, %edx -	jmp	9b -	cfi_endproc -	.size	pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S deleted file mode 100644 index 146a8a881..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S +++ /dev/null @@ -1,237 +0,0 @@ -/* Copyright (C) 2002, 2003, 2007 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <pthread-errnos.h> -#include <bits/kernel-features.h> -#include <tls.h> - - -	.text - -	.globl	pthread_rwlock_timedwrlock -	.type	pthread_rwlock_timedwrlock,@function -	.align	16 -pthread_rwlock_timedwrlock: -	cfi_startproc -	pushl	%esi -	cfi_adjust_cfa_offset(4) -	pushl	%edi -	cfi_adjust_cfa_offset(4) -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	pushl	%ebp -	cfi_adjust_cfa_offset(4) -	cfi_offset(%esi, -8) -	cfi_offset(%edi, -12) -	cfi_offset(%ebx, -16) -	cfi_offset(%ebp, -20) -	subl	$8, %esp -	cfi_adjust_cfa_offset(8) - -	movl	28(%esp), %ebp -	movl	32(%esp), %edi - -	/* Get the lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if MUTEX == 0 -	cmpxchgl %edx, (%ebp) -#else -	cmpxchgl %edx, MUTEX(%ebp) -#endif -	jnz	1f - -2:	movl	WRITER(%ebp), %eax -	testl	%eax, %eax -	jne	14f -	cmpl	$0, NR_READERS(%ebp) -	je	5f - -	/* Check the value of the timeout parameter.  */ -3:	cmpl	$1000000000, 4(%edi) -	jae	19f - -	addl	$1, WRITERS_QUEUED(%ebp) -	je	4f - -	movl	WRITERS_WAKEUP(%ebp), %esi - -	LOCK -#if MUTEX == 0 -	subl	$1, (%ebp) -#else -	subl	$1, MUTEX(%ebp) -#endif -	jne	10f - -	/* Get current time.  */ -11:	movl	%esp, %ebx -	xorl	%ecx, %ecx -	movl	$__NR_gettimeofday, %eax -	ENTER_KERNEL - -	/* Compute relative timeout.  */ -	movl	4(%esp), %eax -	movl	$1000, %edx -	mul	%edx		/* Milli seconds to nano seconds.  */ -	movl	(%edi), %ecx -	movl	4(%edi), %edx -	subl	(%esp), %ecx -	subl	%eax, %edx -	jns	15f -	addl	$1000000000, %edx -	subl	$1, %ecx -15:	testl	%ecx, %ecx -	js	16f		/* Time is already up.  */ - -	/* Futex call.  */ -	movl	%ecx, (%esp)	/* Store relative timeout.  */ -	movl	%edx, 4(%esp) - -	movl	%esi, %edx -#ifdef __ASSUME_PRIVATE_FUTEX -	movzbl	PSHARED(%ebp), %ecx -	xorl	$FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %ecx -#else -	movzbl	PSHARED(%ebp), %ecx -# if FUTEX_WAIT != 0 -	orl	$FUTEX_WAIT, %ecx -# endif -	xorl	%gs:PRIVATE_FUTEX, %ecx -#endif -	movl	%esp, %esi -	leal	WRITERS_WAKEUP(%ebp), %ebx -	movl	$SYS_futex, %eax -	ENTER_KERNEL -	movl	%eax, %esi -17: - -	/* Reget the lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if MUTEX == 0 -	cmpxchgl %edx, (%ebp) -#else -	cmpxchgl %edx, MUTEX(%ebp) -#endif -	jnz	12f - -13:	subl	$1, WRITERS_QUEUED(%ebp) -	cmpl	$-ETIMEDOUT, %esi -	jne	2b - -18:	movl	$ETIMEDOUT, %edx -	jmp	9f - - -5:	xorl	%edx, %edx -	movl	%gs:TID, %eax -	movl	%eax, WRITER(%ebp) -9:	LOCK -#if MUTEX == 0 -	subl	$1, (%ebp) -#else -	subl	$1, MUTEX(%ebp) -#endif -	jne	6f - -7:	movl	%edx, %eax - -	addl	$8, %esp -	cfi_adjust_cfa_offset(-8) -	popl	%ebp -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebp) -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	popl	%edi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%edi) -	popl	%esi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%esi) -	ret - -	cfi_adjust_cfa_offset(24) -	cfi_offset(%esi, -8) -	cfi_offset(%edi, -12) -	cfi_offset(%ebx, -16) -	cfi_offset(%ebp, -20) -1: -#if MUTEX == 0 -	movl	%ebp, %edx -#else -	leal	MUTEX(%ebp), %edx -#endif -	movzbl	PSHARED(%ebp), %ecx -	call	__lll_lock_wait -	jmp	2b - -14:	cmpl	%gs:TID, %eax -	jne	3b -20:	movl	$EDEADLK, %edx -	jmp	9b - -6: -#if MUTEX == 0 -	movl	%ebp, %eax -#else -	leal	MUTEX(%ebp), %eax -#endif -	movzbl	PSHARED(%ebp), %ecx -	call	__lll_unlock_wake -	jmp	7b - -	/* Overflow.  */ -4:	subl	$1, WRITERS_QUEUED(%ebp) -	movl	$EAGAIN, %edx -	jmp	9b - -10: -#if MUTEX == 0 -	movl	%ebp, %eax -#else -	leal	MUTEX(%ebp), %eax -#endif -	movzbl	PSHARED(%ebp), %ecx -	call	__lll_unlock_wake -	jmp	11b - -12: -#if MUTEX == 0 -	movl	%ebp, %edx -#else -	leal	MUTEX(%ebp), %edx -#endif -	movzbl	PSHARED(%ebp), %ecx -	call	__lll_lock_wait -	jmp	13b - -16:	movl	$-ETIMEDOUT, %esi -	jmp	17b - -19:	movl	$EINVAL, %edx -	jmp	9b -	cfi_endproc -	.size	pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S deleted file mode 100644 index ec3314770..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S +++ /dev/null @@ -1,156 +0,0 @@ -/* Copyright (C) 2002, 2003, 2007 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <bits/kernel-features.h> -#include <tls.h> - - -	.text - -	.globl	__pthread_rwlock_unlock -	.type	__pthread_rwlock_unlock,@function -	.protected	__pthread_rwlock_unlock -	.align	16 -__pthread_rwlock_unlock: -	cfi_startproc -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	pushl	%edi -	cfi_adjust_cfa_offset(4) -	cfi_offset(%ebx, -8) -	cfi_offset(%edi, -12) - -	movl	12(%esp), %edi - -	/* Get the lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if MUTEX == 0 -	cmpxchgl %edx, (%edi) -#else -	cmpxchgl %edx, MUTEX(%edi) -#endif -	jnz	1f - -2:	cmpl	$0, WRITER(%edi) -	jne	5f -	subl	$1, NR_READERS(%edi) -	jnz	6f - -5:	movl	$0, WRITER(%edi) - -	movl	$1, %edx -	leal	WRITERS_WAKEUP(%edi), %ebx -	cmpl	$0, WRITERS_QUEUED(%edi) -	jne	0f - -	/* If also no readers waiting nothing to do.  */ -	cmpl	$0, READERS_QUEUED(%edi) -	je	6f - -	movl	$0x7fffffff, %edx -	leal	READERS_WAKEUP(%edi), %ebx - -0:	addl	$1, (%ebx) -	LOCK -#if MUTEX == 0 -	subl	$1, (%edi) -#else -	subl	$1, MUTEX(%edi) -#endif -	jne	7f - -8: -#ifdef __ASSUME_PRIVATE_FUTEX -	movzbl	PSHARED(%edi), %ecx -	xorl	$FUTEX_PRIVATE_FLAG|FUTEX_WAKE, %ecx -#else -	movzbl	PSHARED(%edi), %ecx -	orl	$FUTEX_WAKE, %ecx -	xorl	%gs:PRIVATE_FUTEX, %ecx -#endif -	movl	$SYS_futex, %eax -	ENTER_KERNEL - -	xorl	%eax, %eax -	popl	%edi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%edi) -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	ret - -	cfi_adjust_cfa_offset(8) -	cfi_offset(%ebx, -8) -	cfi_offset(%edi, -12) -	.align	16 -6:	LOCK -#if MUTEX == 0 -	subl	$1, (%edi) -#else -	subl	$1, MUTEX(%edi) -#endif -	jne	3f - -4:	xorl	%eax, %eax -	popl	%edi -	popl	%ebx -	ret - -1: -#if MUTEX == 0 -	movl	%edi, %edx -#else -	leal	MUTEX(%edi), %edx -#endif -	movzbl	PSHARED(%edi), %ecx -	call	__lll_lock_wait -	jmp	2b - -3: -#if MUTEX == 0 -	movl	%edi, %eax -#else -	leal	MUTEX(%edi), %eax -#endif -	movzbl	PSHARED(%edi), %ecx -	call	__lll_unlock_wake -	jmp	4b - -7: -#if MUTEX == 0 -	movl	%edi, %eax -#else -	leal	MUTEX(%edi), %eax -#endif -	movzbl	PSHARED(%edi), %ecx -	call	__lll_unlock_wake -	jmp	8b -	cfi_endproc -	.size	__pthread_rwlock_unlock,.-__pthread_rwlock_unlock - -	.globl	pthread_rwlock_unlock -pthread_rwlock_unlock = __pthread_rwlock_unlock - -	.globl	__pthread_rwlock_unlock_internal -__pthread_rwlock_unlock_internal = __pthread_rwlock_unlock diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S deleted file mode 100644 index c0fc69119..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S +++ /dev/null @@ -1,185 +0,0 @@ -/* Copyright (C) 2002, 2003, 2007 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <pthread-errnos.h> -#include <bits/kernel-features.h> -#include <tls.h> - - -	.text - -	.globl	__pthread_rwlock_wrlock -	.type	__pthread_rwlock_wrlock,@function -	.protected	__pthread_rwlock_wrlock -	.align	16 -__pthread_rwlock_wrlock: -	cfi_startproc -	pushl	%esi -	cfi_adjust_cfa_offset(4) -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	cfi_offset(%esi, -8) -	cfi_offset(%ebx, -12) - -	xorl	%esi, %esi -	movl	12(%esp), %ebx - -	/* Get the lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if MUTEX == 0 -	cmpxchgl %edx, (%ebx) -#else -	cmpxchgl %edx, MUTEX(%ebx) -#endif -	jnz	1f - -2:	movl	WRITER(%ebx), %eax -	testl	%eax, %eax -	jne	14f -	cmpl	$0, NR_READERS(%ebx) -	je	5f - -3:	addl	$1, WRITERS_QUEUED(%ebx) -	je	4f - -	movl	WRITERS_WAKEUP(%ebx), %edx - -	LOCK -#if MUTEX == 0 -	subl	$1, (%ebx) -#else -	subl	$1, MUTEX(%ebx) -#endif -	jne	10f - -11: -#ifdef __ASSUME_PRIVATE_FUTEX -	movzbl	PSHARED(%ebx), %ecx -	xorl	$FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %ecx -#else -	movzbl	PSHARED(%ebx), %ecx -# if FUTEX_WAIT != 0 -	orl	$FUTEX_WAIT, %ecx -# endif -	xorl	%gs:PRIVATE_FUTEX, %ecx -#endif -	addl	$WRITERS_WAKEUP, %ebx -	movl	$SYS_futex, %eax -	ENTER_KERNEL - -	subl	$WRITERS_WAKEUP, %ebx - -	/* Reget the lock.  */ -	movl	$1, %edx -	xorl	%eax, %eax -	LOCK -#if MUTEX == 0 -	cmpxchgl %edx, (%ebx) -#else -	cmpxchgl %edx, MUTEX(%ebx) -#endif -	jnz	12f - -13:	subl	$1, WRITERS_QUEUED(%ebx) -	jmp	2b - -5:	xorl	%edx, %edx -	movl	%gs:TID, %eax -	movl	%eax, WRITER(%ebx) -9:	LOCK -#if MUTEX == 0 -	subl	$1, (%ebx) -#else -	subl	$1, MUTEX(%ebx) -#endif -	jne	6f -7: - -	movl	%edx, %eax -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	popl	%esi -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%esi) -	ret - -	cfi_adjust_cfa_offset(8) -	cfi_offset(%esi, -8) -	cfi_offset(%ebx, -12) -1: -#if MUTEX == 0 -	movl	%ebx, %edx -#else -	leal	MUTEX(%ebx), %edx -#endif -	movzbl	PSHARED(%ebx), %ecx -	call	__lll_lock_wait -	jmp	2b - -14:	cmpl	%gs:TID	, %eax -	jne	3b -	movl	$EDEADLK, %edx -	jmp	9b - -6: -#if MUTEX == 0 -	movl	%ebx, %eax -#else -	leal	MUTEX(%ebx), %eax -#endif -	movzbl	PSHARED(%ebx), %ecx -	call	__lll_unlock_wake -	jmp	7b - -4:	subl	$1, WRITERS_QUEUED(%ebx) -	movl	$EAGAIN, %edx -	jmp	9b - -10: -#if MUTEX == 0 -	movl	%ebx, %eax -#else -	leal	MUTEX(%ebx), %eax -#endif -	movzbl	PSHARED(%ebx), %ecx -	call	__lll_unlock_wake -	jmp	11b - -12: -#if MUTEX == 0 -	movl	%ebx, %edx -#else -	leal	MUTEX(%ebx), %edx -#endif -	movzbl	PSHARED(%ebx), %ecx -	call	__lll_lock_wait -	jmp	13b -	cfi_endproc -	.size	__pthread_rwlock_wrlock,.-__pthread_rwlock_wrlock - -	.globl	pthread_rwlock_wrlock -pthread_rwlock_wrlock = __pthread_rwlock_wrlock - -	.globl	__pthread_rwlock_wrlock_internal -__pthread_rwlock_wrlock_internal = __pthread_rwlock_wrlock diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S deleted file mode 100644 index 2d7394d84..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S +++ /dev/null @@ -1,139 +0,0 @@ -/* Copyright (C) 2002, 2003, 2005, 2007, 2008 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <pthread-errnos.h> -#include <structsem.h> -#include <lowlevellock.h> - - -	.text - -	.globl	sem_post -	.type	sem_post,@function -	.align	16 -sem_post: -	cfi_startproc -	pushl	%ebx -	cfi_adjust_cfa_offset(4) -	cfi_offset(%ebx, -8) - -	movl	8(%esp), %ebx - -#if VALUE == 0 -	movl	(%ebx), %eax -#else -	movl	VALUE(%ebx), %eax -#endif -0:	cmpl	$SEM_VALUE_MAX, %eax -	je	3f -	leal	1(%eax), %edx -	LOCK -#if VALUE == 0 -	cmpxchgl %edx, (%ebx) -#else -	cmpxchgl %edx, VALUE(%ebx) -#endif -	jnz	0b - -	cmpl	$0, NWAITERS(%ebx) -	je	2f - -	movl	$FUTEX_WAKE, %ecx -	orl	PRIVATE(%ebx), %ecx -	movl	$1, %edx -	movl	$SYS_futex, %eax -	ENTER_KERNEL - -	testl	%eax, %eax -	js	1f - -2:	xorl	%eax, %eax -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	ret - -	cfi_adjust_cfa_offset(4) -	cfi_offset(%ebx, -8) -1: -#ifdef __PIC__ -	call	__x86.get_pc_thunk.bx -#else -	movl	$4f, %ebx -4: -#endif -	addl	$_GLOBAL_OFFSET_TABLE_, %ebx -#if USE___THREAD -# ifdef NO_TLS_DIRECT_SEG_REFS -	movl	errno@gotntpoff(%ebx), %edx -	addl	%gs:0, %edx -	movl	$EINVAL, (%edx) -# else -	movl	errno@gotntpoff(%ebx), %edx -	movl	$EINVAL, %gs:(%edx) -# endif -#else -	call	__errno_location@plt -	movl	$EINVAL, (%eax) -#endif - -	orl	$-1, %eax -	popl	%ebx -	ret - -3: -#ifdef __PIC__ -	call	__x86.get_pc_thunk.bx -#else -	movl	$5f, %ebx -5: -#endif -	addl	$_GLOBAL_OFFSET_TABLE_, %ebx -#if USE___THREAD -# ifdef NO_TLS_DIRECT_SEG_REFS -	movl	errno@gotntpoff(%ebx), %edx -	addl	%gs:0, %edx -	movl	$EOVERFLOW, (%edx) -# else -	movl	errno@gotntpoff(%ebx), %edx -	movl	$EOVERFLOW, %gs:(%edx) -# endif -#else -	call	__errno_location@plt -	movl	$EOVERFLOW, (%eax) -#endif - -	orl	$-1, %eax -	popl	%ebx -	cfi_adjust_cfa_offset(-4) -	cfi_restore(%ebx) -	ret -	cfi_endproc -	.size	sem_post,.-sem_post - -#ifdef __PIC__ -	.section .gnu.linkonce.t.__x86.get_pc_thunk.bx,"ax",@progbits -	.globl	__x86.get_pc_thunk.bx -	.hidden	__x86.get_pc_thunk.bx -	.type	__x86.get_pc_thunk.bx,@function -__x86.get_pc_thunk.bx: -	movl (%esp), %ebx; -	ret -	.size	__x86.get_pc_thunk.bx,.-__x86.get_pc_thunk.bx -#endif diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S deleted file mode 100644 index 6d6968100..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S +++ /dev/null @@ -1,328 +0,0 @@ -/* Copyright (C) 2002, 2003, 2004, 2005, 2007, 2009 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <pthread-errnos.h> -#include <structsem.h> -#include <lowlevellock.h> - - -#if VALUE != 0 -# error "code needs to be rewritten for VALUE != 0" -#endif - - -	.text - -	.globl	sem_timedwait -	.type	sem_timedwait,@function -	.align	16 -sem_timedwait: -.LSTARTCODE: -	movl	4(%esp), %ecx - -	movl	(%ecx), %eax -2:	testl	%eax, %eax -	je	1f - -	leal	-1(%eax), %edx -	LOCK -	cmpxchgl %edx, (%ecx) -	jne	2b - -	xorl	%eax, %eax -	ret - -	/* Check whether the timeout value is valid.  */ -1:	pushl	%esi -.Lpush_esi: -	pushl	%edi -.Lpush_edi: -	pushl	%ebx -.Lpush_ebx: -	subl	$12, %esp -.Lsub_esp: - -	movl	32(%esp), %edi - -	/* Check for invalid nanosecond field.  */ -	cmpl	$1000000000, 4(%edi) -	movl	$EINVAL, %esi -	jae	6f - -	LOCK -	incl	NWAITERS(%ecx) - -7:	xorl	%ecx, %ecx -	movl	%esp, %ebx -	movl	%ecx, %edx -	movl	$__NR_gettimeofday, %eax -	ENTER_KERNEL - -	/* Compute relative timeout.  */ -	movl	4(%esp), %eax -	movl	$1000, %edx -	mul	%edx		/* Milli seconds to nano seconds.  */ -	movl	(%edi), %ecx -	movl	4(%edi), %edx -	subl	(%esp), %ecx -	subl	%eax, %edx -	jns	5f -	addl	$1000000000, %edx -	subl	$1, %ecx -5:	testl	%ecx, %ecx -	movl	$ETIMEDOUT, %esi -	js	6f		/* Time is already up.  */ - -	movl	%ecx, (%esp)	/* Store relative timeout.  */ -	movl	%edx, 4(%esp) - -.LcleanupSTART: -	call	__pthread_enable_asynccancel -	movl	%eax, 8(%esp) - -	movl	28(%esp), %ebx	/* Load semaphore address.  */ -#if FUTEX_WAIT == 0 -	movl	PRIVATE(%ebx), %ecx -#else -	movl	$FUTEX_WAIT, %ecx -	orl	PRIVATE(%ebx), %ecx -#endif -	movl	%esp, %esi -	xorl	%edx, %edx -	movl	$SYS_futex, %eax -	ENTER_KERNEL -	movl	%eax, %esi - -	movl	8(%esp), %eax -	call	__pthread_disable_asynccancel -.LcleanupEND: - -	testl	%esi, %esi -	je	9f -	cmpl	$-EWOULDBLOCK, %esi -	jne	3f - -9:	movl	(%ebx), %eax -8:	testl	%eax, %eax -	je	7b - -	leal	-1(%eax), %ecx -	LOCK -	cmpxchgl %ecx, (%ebx) -	jne	8b - -	xorl	%eax, %eax - -	LOCK -	decl	NWAITERS(%ebx) - -10:	addl	$12, %esp -.Ladd_esp: -	popl	%ebx -.Lpop_ebx: -	popl	%edi -.Lpop_edi: -	popl	%esi -.Lpop_esi: -	ret - -.Lafter_ret: -3:	negl	%esi -6: -#ifdef __PIC__ -	call	__x86.get_pc_thunk.bx -#else -	movl	$4f, %ebx -4: -#endif -	addl	$_GLOBAL_OFFSET_TABLE_, %ebx -#if USE___THREAD -# ifdef NO_TLS_DIRECT_SEG_REFS -	movl	errno@gotntpoff(%ebx), %edx -	addl	%gs:0, %edx -	movl	%esi, (%edx) -# else -	movl	errno@gotntpoff(%ebx), %edx -	movl	%esi, %gs:(%edx) -# endif -#else -	call	__errno_location@plt -	movl	%esi, (%eax) -#endif - -	movl	28(%esp), %ebx	/* Load semaphore address.  */ -	orl	$-1, %eax -	jmp	10b -	.size	sem_timedwait,.-sem_timedwait - - -	.type	sem_wait_cleanup,@function -sem_wait_cleanup: -	LOCK -	decl	NWAITERS(%ebx) -	movl	%eax, (%esp) -.LcallUR: -	call	_Unwind_Resume@PLT -	hlt -.LENDCODE: -	.size	sem_wait_cleanup,.-sem_wait_cleanup - - -	.section .gcc_except_table,"a",@progbits -.LexceptSTART: -	.byte	0xff				# @LPStart format (omit) -	.byte	0xff				# @TType format (omit) -	.byte	0x01				# call-site format -						# DW_EH_PE_uleb128 -	.uleb128 .Lcstend-.Lcstbegin -.Lcstbegin: -	.uleb128 .LcleanupSTART-.LSTARTCODE -	.uleb128 .LcleanupEND-.LcleanupSTART -	.uleb128 sem_wait_cleanup-.LSTARTCODE -	.uleb128  0 -	.uleb128 .LcallUR-.LSTARTCODE -	.uleb128 .LENDCODE-.LcallUR -	.uleb128 0 -	.uleb128  0 -.Lcstend: - - -	.section .eh_frame,"a",@progbits -.LSTARTFRAME: -	.long	.LENDCIE-.LSTARTCIE		# Length of the CIE. -.LSTARTCIE: -	.long	0				# CIE ID. -	.byte	1				# Version number. -#ifdef SHARED -	.string	"zPLR"				# NUL-terminated augmentation -						# string. -#else -	.string	"zPL"				# NUL-terminated augmentation -						# string. -#endif -	.uleb128 1				# Code alignment factor. -	.sleb128 -4				# Data alignment factor. -	.byte	8				# Return address register -						# column. -#ifdef SHARED -	.uleb128 7				# Augmentation value length. -	.byte	0x9b				# Personality: DW_EH_PE_pcrel -						# + DW_EH_PE_sdata4 -						# + DW_EH_PE_indirect -	.long	DW.ref.__gcc_personality_v0-. -	.byte	0x1b				# LSDA Encoding: DW_EH_PE_pcrel -						# + DW_EH_PE_sdata4. -	.byte	0x1b				# FDE Encoding: DW_EH_PE_pcrel -						# + DW_EH_PE_sdata4. -#else -	.uleb128 6				# Augmentation value length. -	.byte	0x0				# Personality: absolute -	.long	__gcc_personality_v0 -	.byte	0x0				# LSDA Encoding: absolute -#endif -	.byte 0x0c				# DW_CFA_def_cfa -	.uleb128 4 -	.uleb128 4 -	.byte	0x88				# DW_CFA_offset, column 0x10 -	.uleb128 1 -	.align 4 -.LENDCIE: - -	.long	.LENDFDE-.LSTARTFDE		# Length of the FDE. -.LSTARTFDE: -	.long	.LSTARTFDE-.LSTARTFRAME		# CIE pointer. -#ifdef SHARED -	.long	.LSTARTCODE-.			# PC-relative start address -						# of the code. -#else -	.long	.LSTARTCODE			# Start address of the code. -#endif -	.long	.LENDCODE-.LSTARTCODE		# Length of the code. -	.uleb128 4				# Augmentation size -#ifdef SHARED -	.long	.LexceptSTART-. -#else -	.long	.LexceptSTART -#endif - -	.byte	4				# DW_CFA_advance_loc4 -	.long	.Lpush_esi-.LSTARTCODE -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 8 -	.byte   0x86				# DW_CFA_offset %esi -	.uleb128 2 -	.byte	4				# DW_CFA_advance_loc4 -	.long	.Lpush_edi-.Lpush_esi -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 12 -	.byte   0x87				# DW_CFA_offset %edi -	.uleb128 3 -	.byte	4				# DW_CFA_advance_loc4 -	.long	.Lpush_ebx-.Lpush_edi -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 16 -	.byte   0x83				# DW_CFA_offset %ebx -	.uleb128 4 -	.byte	4				# DW_CFA_advance_loc4 -	.long	.Lsub_esp-.Lpush_ebx -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 28 -	.byte	4				# DW_CFA_advance_loc4 -	.long	.Ladd_esp-.Lsub_esp -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 16 -	.byte	4				# DW_CFA_advance_loc4 -	.long	.Lpop_ebx-.Ladd_esp -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 12 -	.byte	0xc3				# DW_CFA_restore %ebx -	.byte	4				# DW_CFA_advance_loc4 -	.long	.Lpop_edi-.Lpop_ebx -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 8 -	.byte	0xc7				# DW_CFA_restore %edi -	.byte	4				# DW_CFA_advance_loc4 -	.long	.Lpop_esi-.Lpop_edi -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 4 -	.byte	0xc6				# DW_CFA_restore %esi -	.byte	4				# DW_CFA_advance_loc4 -	.long	.Lafter_ret-.Lpop_esi -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 28 -	.byte   0x86				# DW_CFA_offset %esi -	.uleb128 2 -	.byte   0x87				# DW_CFA_offset %edi -	.uleb128 3 -	.byte   0x83				# DW_CFA_offset %ebx -	.uleb128 4 -	.align	4 -.LENDFDE: - - -#ifdef SHARED -	.hidden	DW.ref.__gcc_personality_v0 -	.weak	DW.ref.__gcc_personality_v0 -	.section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits -	.align	4 -	.type	DW.ref.__gcc_personality_v0, @object -	.size	DW.ref.__gcc_personality_v0, 4 -DW.ref.__gcc_personality_v0: -	.long	__gcc_personality_v0 -#endif diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S deleted file mode 100644 index befa0c912..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright (C) 2002, 2003, 2005, 2007 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <pthread-errnos.h> -#include <lowlevellock.h> - -	.text - -	.globl	sem_trywait -	.type	sem_trywait,@function -	.align	16 -sem_trywait: -	movl	4(%esp), %ecx - -	movl	(%ecx), %eax -2:	testl	%eax, %eax -	jz	1f - -	leal	-1(%eax), %edx -	LOCK -	cmpxchgl %edx, (%ecx) -	jne	2b -	xorl	%eax, %eax -	ret - -1: -#ifdef __PIC__ -	call	__x86.get_pc_thunk.cx -#else -	movl	$3f, %ecx -3: -#endif -	addl	$_GLOBAL_OFFSET_TABLE_, %ecx -#if USE___THREAD -# ifdef NO_TLS_DIRECT_SEG_REFS -	movl	errno@gotntpoff(%ecx), %edx -	addl	%gs:0, %edx -	movl	$EAGAIN, (%edx) -# else -	movl	errno@gotntpoff(%ecx), %edx -	movl	$EAGAIN, %gs:(%edx) -# endif -#else -	call	__errno_location@plt -	movl	$EAGAIN, (%eax) -#endif -	orl	$-1, %eax -	ret -	.size	sem_trywait,.-sem_trywait - -#ifdef __PIC__ -	.section .gnu.linkonce.t.__x86.get_pc_thunk.cx,"ax",@progbits -	.globl	__x86.get_pc_thunk.cx -	.hidden	__x86.get_pc_thunk.cx -	.type	__x86.get_pc_thunk.cx,@function -__x86.get_pc_thunk.cx: -	movl (%esp), %ecx; -	ret -	.size	__x86.get_pc_thunk.cx,.-__x86.get_pc_thunk.cx -#endif diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_wait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_wait.S deleted file mode 100644 index 5f568976d..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_wait.S +++ /dev/null @@ -1,267 +0,0 @@ -/* Copyright (C) 2002, 2003, 2005, 2007 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <pthread-errnos.h> -#include <structsem.h> -#include <lowlevellock.h> - - -#if VALUE != 0 -# error "code needs to be rewritten for VALUE != 0" -#endif - -	.text - -	.globl	sem_wait -	.type	sem_wait,@function -	.align	16 -sem_wait: -.LSTARTCODE: -	pushl	%ebx -.Lpush_ebx: -	pushl	%esi -.Lpush_esi: -	subl	$4, %esp -.Lsub_esp: - -	movl	16(%esp), %ebx - -	movl	(%ebx), %eax -2:	testl	%eax, %eax -	je	1f - -	leal	-1(%eax), %edx -	LOCK -	cmpxchgl %edx, (%ebx) -	jne	2b -7:	xorl	%eax, %eax - -9:	movl	4(%esp), %esi -	movl	8(%esp), %ebx -	addl	$12, %esp -.Ladd_esp: -	ret - -.Lafter_ret: -1:	LOCK -	incl	NWAITERS(%ebx) - -.LcleanupSTART: -6:	call	__pthread_enable_asynccancel -	movl	%eax, (%esp) - -#if FUTEX_WAIT == 0 -	movl	PRIVATE(%ebx), %ecx -#else -	movl	$FUTEX_WAIT, %ecx -	orl	PRIVATE(%ebx), %ecx -#endif -	xorl	%esi, %esi -	xorl	%edx, %edx -	movl	$SYS_futex, %eax -	ENTER_KERNEL -	movl	%eax, %esi - -	movl	(%esp), %eax -	call	__pthread_disable_asynccancel -.LcleanupEND: - -	testl	%esi, %esi -	je	3f -	cmpl	$-EWOULDBLOCK, %esi -	jne	4f - -3: -	movl	(%ebx), %eax -5:	testl	%eax, %eax -	je	6b - -	leal	-1(%eax), %edx -	LOCK -	cmpxchgl %edx, (%ebx) -	jne	5b - -	LOCK -	decl	NWAITERS(%ebx) -	jmp	7b - -4:	LOCK -	decl	NWAITERS(%ebx) - -	negl	%esi -#ifdef __PIC__ -	call	__x86.get_pc_thunk.bx -#else -	movl	$8f, %ebx -8: -#endif -	addl	$_GLOBAL_OFFSET_TABLE_, %ebx -#if USE___THREAD -# ifdef NO_TLS_DIRECT_SEG_REFS -	movl	errno@gotntpoff(%ebx), %edx -	addl	%gs:0, %edx -	movl	%esi, (%edx) -# else -	movl	errno@gotntpoff(%ebx), %edx -	movl	%esi, %gs:(%edx) -# endif -#else -	call	__errno_location@plt -	movl	%esi, (%eax) -#endif -	orl	$-1, %eax - -	jmp	9b -	.size	sem_wait,.-sem_wait - - -	.type	sem_wait_cleanup,@function -sem_wait_cleanup: -	LOCK -	decl	NWAITERS(%ebx) -	movl	%eax, (%esp) -.LcallUR: -	call	_Unwind_Resume@PLT -	hlt -.LENDCODE: -	.size	sem_wait_cleanup,.-sem_wait_cleanup - - -	.section .gcc_except_table,"a",@progbits -.LexceptSTART: -	.byte	0xff				# @LPStart format (omit) -	.byte	0xff				# @TType format (omit) -	.byte	0x01				# call-site format -						# DW_EH_PE_uleb128 -	.uleb128 .Lcstend-.Lcstbegin -.Lcstbegin: -	.uleb128 .LcleanupSTART-.LSTARTCODE -	.uleb128 .LcleanupEND-.LcleanupSTART -	.uleb128 sem_wait_cleanup-.LSTARTCODE -	.uleb128  0 -	.uleb128 .LcallUR-.LSTARTCODE -	.uleb128 .LENDCODE-.LcallUR -	.uleb128 0 -	.uleb128  0 -.Lcstend: - - -	.section .eh_frame,"a",@progbits -.LSTARTFRAME: -	.long	.LENDCIE-.LSTARTCIE		# Length of the CIE. -.LSTARTCIE: -	.long	0				# CIE ID. -	.byte	1				# Version number. -#ifdef SHARED -	.string	"zPLR"				# NUL-terminated augmentation -						# string. -#else -	.string	"zPL"				# NUL-terminated augmentation -						# string. -#endif -	.uleb128 1				# Code alignment factor. -	.sleb128 -4				# Data alignment factor. -	.byte	8				# Return address register -						# column. -#ifdef SHARED -	.uleb128 7				# Augmentation value length. -	.byte	0x9b				# Personality: DW_EH_PE_pcrel -						# + DW_EH_PE_sdata4 -						# + DW_EH_PE_indirect -	.long	DW.ref.__gcc_personality_v0-. -	.byte	0x1b				# LSDA Encoding: DW_EH_PE_pcrel -						# + DW_EH_PE_sdata4. -	.byte	0x1b				# FDE Encoding: DW_EH_PE_pcrel -						# + DW_EH_PE_sdata4. -#else -	.uleb128 6				# Augmentation value length. -	.byte	0x0				# Personality: absolute -	.long	__gcc_personality_v0 -	.byte	0x0				# LSDA Encoding: absolute -#endif -	.byte 0x0c				# DW_CFA_def_cfa -	.uleb128 4 -	.uleb128 4 -	.byte	0x88				# DW_CFA_offset, column 0x10 -	.uleb128 1 -	.align 4 -.LENDCIE: - -	.long	.LENDFDE-.LSTARTFDE		# Length of the FDE. -.LSTARTFDE: -	.long	.LSTARTFDE-.LSTARTFRAME		# CIE pointer. -#ifdef SHARED -	.long	.LSTARTCODE-.			# PC-relative start address -						# of the code. -#else -	.long	.LSTARTCODE			# Start address of the code. -#endif -	.long	.LENDCODE-.LSTARTCODE		# Length of the code. -	.uleb128 4				# Augmentation size -#ifdef SHARED -	.long	.LexceptSTART-. -#else -	.long	.LexceptSTART -#endif - -	.byte	4				# DW_CFA_advance_loc4 -	.long	.Lpush_ebx-.LSTARTCODE -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 8 -	.byte   0x83				# DW_CFA_offset %ebx -        .uleb128 2 -	.byte	4				# DW_CFA_advance_loc4 -	.long	.Lpush_esi-.Lpush_ebx -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 12 -	.byte   0x86				# DW_CFA_offset %esi -        .uleb128 3 -	.byte	4				# DW_CFA_advance_loc4 -	.long	.Lsub_esp-.Lpush_esi -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 16 -	.byte	4				# DW_CFA_advance_loc4 -	.long	.Ladd_esp-.Lsub_esp -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 4 -	.byte	0xc3				# DW_CFA_restore %ebx -	.byte	0xc6				# DW_CFA_restore %esi -	.byte	4				# DW_CFA_advance_loc4 -	.long	.Lafter_ret-.Ladd_esp -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 16 -	.byte   0x83				# DW_CFA_offset %ebx -        .uleb128 2 -	.byte   0x86				# DW_CFA_offset %esi -        .uleb128 3 -	.align	4 -.LENDFDE: - - -#ifdef SHARED -	.hidden	DW.ref.__gcc_personality_v0 -	.weak	DW.ref.__gcc_personality_v0 -	.section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits -	.align	4 -	.type	DW.ref.__gcc_personality_v0, @object -	.size	DW.ref.__gcc_personality_v0, 4 -DW.ref.__gcc_personality_v0: -	.long	__gcc_personality_v0 -#endif - diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/libc-lowlevellock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/libc-lowlevellock.S deleted file mode 100644 index f567c1d6d..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/libc-lowlevellock.S +++ /dev/null @@ -1 +0,0 @@ -#include "../i486/libc-lowlevellock.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_broadcast.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_broadcast.S deleted file mode 100644 index 4d459716b..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_broadcast.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_cond_broadcast.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_signal.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_signal.S deleted file mode 100644 index 36634766c..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_signal.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_cond_signal.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_timedwait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_timedwait.S deleted file mode 100644 index 673d873de..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_timedwait.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_cond_timedwait.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_wait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_wait.S deleted file mode 100644 index d3e1549cd..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_wait.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_cond_wait.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_rdlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_rdlock.S deleted file mode 100644 index 688541a62..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_rdlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_rwlock_rdlock.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedrdlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedrdlock.S deleted file mode 100644 index 353c28535..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedrdlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_rwlock_timedrdlock.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedwrlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedwrlock.S deleted file mode 100644 index 515da0a4f..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedwrlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_rwlock_timedwrlock.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_unlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_unlock.S deleted file mode 100644 index 9d8acc4f3..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_unlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_rwlock_unlock.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_wrlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_wrlock.S deleted file mode 100644 index 79ee12dde..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_wrlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_rwlock_wrlock.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_post.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_post.S deleted file mode 100644 index 5e7a41926..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_post.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/sem_post.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_timedwait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_timedwait.S deleted file mode 100644 index ad941ce9a..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_timedwait.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/sem_timedwait.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_trywait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_trywait.S deleted file mode 100644 index 4044a723c..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_trywait.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/sem_trywait.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_wait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_wait.S deleted file mode 100644 index 6f130d3d0..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/sem_wait.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/sem_wait.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/libc-lowlevellock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/libc-lowlevellock.S deleted file mode 100644 index f567c1d6d..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/libc-lowlevellock.S +++ /dev/null @@ -1 +0,0 @@ -#include "../i486/libc-lowlevellock.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevellock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevellock.S deleted file mode 100644 index 59194c712..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevellock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2002 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/lowlevellock.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelrobustlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelrobustlock.S deleted file mode 100644 index 6103f2ee4..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/lowlevelrobustlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2002, 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/lowlevelrobustlock.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_barrier_wait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_barrier_wait.S deleted file mode 100644 index d22c72467..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_barrier_wait.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2002 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_barrier_wait.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_broadcast.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_broadcast.S deleted file mode 100644 index 4d459716b..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_broadcast.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_cond_broadcast.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_signal.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_signal.S deleted file mode 100644 index 36634766c..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_signal.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_cond_signal.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_timedwait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_timedwait.S deleted file mode 100644 index 3f67df1fc..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_timedwait.S +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#define HAVE_CMOV 1 -#include "../i486/pthread_cond_timedwait.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_wait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_wait.S deleted file mode 100644 index d3e1549cd..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_wait.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_cond_wait.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_rdlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_rdlock.S deleted file mode 100644 index 688541a62..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_rdlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_rwlock_rdlock.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedrdlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedrdlock.S deleted file mode 100644 index 353c28535..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedrdlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_rwlock_timedrdlock.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedwrlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedwrlock.S deleted file mode 100644 index 515da0a4f..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedwrlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_rwlock_timedwrlock.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_unlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_unlock.S deleted file mode 100644 index 39f88ff68..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_unlock.S +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#define HAVE_CMOV	1 -#include "../i486/pthread_rwlock_unlock.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_wrlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_wrlock.S deleted file mode 100644 index 79ee12dde..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_wrlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/pthread_rwlock_wrlock.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_post.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_post.S deleted file mode 100644 index 5e7a41926..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_post.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/sem_post.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_timedwait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_timedwait.S deleted file mode 100644 index ad941ce9a..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_timedwait.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/sem_timedwait.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_trywait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_trywait.S deleted file mode 100644 index 4044a723c..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_trywait.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/sem_trywait.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_wait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_wait.S deleted file mode 100644 index 6f130d3d0..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i686/sem_wait.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include "../i486/sem_wait.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h deleted file mode 100644 index d27ef2b68..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h +++ /dev/null @@ -1,584 +0,0 @@ -/* Copyright (C) 2002-2004, 2006-2008, 2009 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, see -   <http://www.gnu.org/licenses/>.  */ - -#ifndef _LOWLEVELLOCK_H -#define _LOWLEVELLOCK_H	1 - -#ifndef __ASSEMBLER__ -# include <time.h> -# include <sys/param.h> -# include <bits/pthreadtypes.h> -# include <bits/kernel-features.h> -# include <tcb-offsets.h> -# include <atomic.h> - -# ifndef LOCK_INSTR -#  ifdef UP -#   define LOCK_INSTR	/* nothing */ -#  else -#   define LOCK_INSTR "lock;" -#  endif -# endif -#else -# ifndef LOCK -#  ifdef UP -#   define LOCK -#  else -#   define LOCK lock -#  endif -# endif -#endif - -#define FUTEX_WAIT		0 -#define FUTEX_WAKE		1 -#define FUTEX_CMP_REQUEUE	4 -#define FUTEX_WAKE_OP		5 -#define FUTEX_LOCK_PI		6 -#define FUTEX_UNLOCK_PI		7 -#define FUTEX_TRYLOCK_PI	8 -#define FUTEX_WAIT_BITSET	9 -#define FUTEX_WAKE_BITSET	10 -#define FUTEX_WAIT_REQUEUE_PI	11 -#define FUTEX_CMP_REQUEUE_PI	12 -#define FUTEX_PRIVATE_FLAG	128 -#define FUTEX_CLOCK_REALTIME	256 - -#define FUTEX_BITSET_MATCH_ANY	0xffffffff - -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) - -/* Values for 'private' parameter of locking macros.  Yes, the -   definition seems to be backwards.  But it is not.  The bit will be -   reversed before passing to the system call.  */ -#define LLL_PRIVATE	0 -#define LLL_SHARED	FUTEX_PRIVATE_FLAG - - -#if !defined NOT_IN_libc || defined IS_IN_rtld -/* In libc.so or ld.so all futexes are private.  */ -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  ((fl) | FUTEX_PRIVATE_FLAG) -# else -#  define __lll_private_flag(fl, private) \ -  ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) -# endif -#else -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) -# else -#  define __lll_private_flag(fl, private) \ -  (__builtin_constant_p (private)					      \ -   ? ((private) == 0							      \ -      ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))	      \ -      : (fl))								      \ -   : ({ unsigned int __fl = ((private) ^ FUTEX_PRIVATE_FLAG);		      \ -	__asm__ ("andl %%gs:%P1, %0" : "+r" (__fl)				      \ -	     : "i" (offsetof (struct pthread, header.private_futex)));	      \ -	__fl | (fl); })) -# endif -#endif - -#ifndef __ASSEMBLER__ - -/* Initializer for compatibility lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) -#define LLL_LOCK_INITIALIZER_WAITERS	(2) - - -#ifdef __PIC__ -# define LLL_EBX_LOAD	"xchgl %2, %%ebx\n" -# define LLL_EBX_REG	"D" -#else -# define LLL_EBX_LOAD -# define LLL_EBX_REG	"b" -#endif - -#ifdef I386_USE_SYSENTER -# ifdef SHARED -#  define LLL_ENTER_KERNEL	"call *%%gs:%P6\n\t" -# else -#  define LLL_ENTER_KERNEL	"call *_dl_sysinfo\n\t" -# endif -#else -# define LLL_ENTER_KERNEL	"int $0x80\n\t" -#endif - -/* Delay in spinlock loop.  */ -#define BUSY_WAIT_NOP	__asm__ ("rep; nop") - - -#define LLL_STUB_UNWIND_INFO_START \ -	".section	.eh_frame,\"a\",@progbits\n"		\ -"5:\t"	".long	7f-6f	# Length of Common Information Entry\n"	\ -"6:\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 -4	# CIE Data Alignment Factor\n\t"	\ -	".byte	0x8	# CIE RA Column\n\t"			\ -	".uleb128 0x1	# Augmentation size\n\t"		\ -	".byte	0x1b	# FDE Encoding (pcrel sdata4)\n\t"	\ -	".byte	0xc	# DW_CFA_def_cfa\n\t"			\ -	".uleb128 0x4\n\t"					\ -	".uleb128 0x0\n\t"					\ -	".align 4\n"						\ -"7:\t"	".long	17f-8f	# FDE Length\n"				\ -"8:\t"	".long	8b-5b	# FDE CIE offset\n\t"			\ -	".long	1b-.	# FDE initial location\n\t"		\ -	".long	4b-1b	# FDE address range\n\t"		\ -	".uleb128 0x0	# Augmentation size\n\t"		\ -	".byte	0x16	# DW_CFA_val_expression\n\t"		\ -	".uleb128 0x8\n\t"					\ -	".uleb128 10f-9f\n"					\ -"9:\t"	".byte	0x78	# DW_OP_breg8\n\t"			\ -	".sleb128 3b-1b\n" -#define LLL_STUB_UNWIND_INFO_END \ -	".byte	0x16	# DW_CFA_val_expression\n\t"		\ -	".uleb128 0x8\n\t"					\ -	".uleb128 12f-11f\n"					\ -"11:\t"	".byte	0x78	# DW_OP_breg8\n\t"			\ -	".sleb128 3b-2b\n"					\ -"12:\t"	".byte	0x40 + (3b-2b-1) # DW_CFA_advance_loc\n\t"	\ -	".byte	0x16	# DW_CFA_val_expression\n\t"		\ -	".uleb128 0x8\n\t"					\ -	".uleb128 16f-13f\n"					\ -"13:\t"	".byte	0x78	# DW_OP_breg8\n\t"			\ -	".sleb128 15f-14f\n\t"					\ -	".byte	0x0d	# DW_OP_const4s\n"			\ -"14:\t"	".4byte	3b-.\n\t"					\ -	".byte	0x1c	# DW_OP_minus\n\t"			\ -	".byte	0x0d	# DW_OP_const4s\n"			\ -"15:\t"	".4byte	18f-.\n\t"					\ -	".byte	0x22	# DW_OP_plus\n"				\ -"16:\t"	".align 4\n"						\ -"17:\t"	".previous\n" - -/* Unwind info for -   1: lea ..., ... -   2: call ... -   3: jmp 18f -   4: -   snippet.  */ -#define LLL_STUB_UNWIND_INFO_3 \ -LLL_STUB_UNWIND_INFO_START					\ -"10:\t"	".byte	0x40 + (2b-1b) # DW_CFA_advance_loc\n\t"	\ -LLL_STUB_UNWIND_INFO_END - -/* Unwind info for -   1: lea ..., ... -   0: movl ..., ... -   2: call ... -   3: jmp 18f -   4: -   snippet.  */ -#define LLL_STUB_UNWIND_INFO_4 \ -LLL_STUB_UNWIND_INFO_START					\ -"10:\t"	".byte	0x40 + (0b-1b) # DW_CFA_advance_loc\n\t"	\ -	".byte	0x16	# DW_CFA_val_expression\n\t"		\ -	".uleb128 0x8\n\t"					\ -	".uleb128 20f-19f\n"					\ -"19:\t"	".byte	0x78	# DW_OP_breg8\n\t"			\ -	".sleb128 3b-0b\n"					\ -"20:\t"	".byte	0x40 + (2b-0b) # DW_CFA_advance_loc\n\t"	\ -LLL_STUB_UNWIND_INFO_END - - -#define lll_futex_wait(futex, val, private) \ -  lll_futex_timed_wait (futex, val, NULL, private) - - -#define lll_futex_timed_wait(futex, val, timeout, private) \ -  ({									      \ -    int __status;							      \ -    register __typeof (val) _val __asm__ ("edx") = (val);			      \ -    __asm__ __volatile__ (LLL_EBX_LOAD					      \ -		      LLL_ENTER_KERNEL					      \ -		      LLL_EBX_LOAD					      \ -		      : "=a" (__status)					      \ -		      : "0" (SYS_futex), LLL_EBX_REG (futex), "S" (timeout),  \ -			"c" (__lll_private_flag (FUTEX_WAIT, private)),	      \ -			"d" (_val), "i" (offsetof (tcbhead_t, sysinfo))	      \ -		      : "memory");					      \ -    __status;								      \ -  }) - - -#define lll_futex_wake(futex, nr, private) \ -  do {									      \ -    int __ignore;							      \ -    register __typeof (nr) _nr __asm__ ("edx") = (nr);			      \ -    __asm__ __volatile__ (LLL_EBX_LOAD					      \ -		      LLL_ENTER_KERNEL					      \ -		      LLL_EBX_LOAD					      \ -		      : "=a" (__ignore)					      \ -		      : "0" (SYS_futex), LLL_EBX_REG (futex),		      \ -			"c" (__lll_private_flag (FUTEX_WAKE, private)),	      \ -			"d" (_nr),					      \ -			"i" (0) /* phony, to align next arg's number */,      \ -			"i" (offsetof (tcbhead_t, sysinfo)));		      \ -  } while (0) - - -/* NB: in the lll_trylock macro we simply return the value in %eax -   after the cmpxchg instruction.  In case the operation succeded this -   value is zero.  In case the operation failed, the cmpxchg instruction -   has loaded the current value of the memory work which is guaranteed -   to be nonzero.  */ -#if defined NOT_IN_libc || defined UP -# define __lll_trylock_asm LOCK_INSTR "cmpxchgl %2, %1" -#else -# define __lll_trylock_asm "cmpl $0, %%gs:%P5\n\t" \ -			   "je 0f\n\t"					      \ -			   "lock\n"					      \ -			   "0:\tcmpxchgl %2, %1" -#endif - -#define lll_trylock(futex) \ -  ({ int ret;								      \ -     __asm__ __volatile__ (__lll_trylock_asm				      \ -		       : "=a" (ret), "=m" (futex)			      \ -		       : "r" (LLL_LOCK_INITIALIZER_LOCKED), "m" (futex),      \ -			 "0" (LLL_LOCK_INITIALIZER),			      \ -			 "i" (MULTIPLE_THREADS_OFFSET)			      \ -		       : "memory");					      \ -     ret; }) - -#define lll_robust_trylock(futex, id) \ -  ({ int ret;								      \ -     __asm__ __volatile__ (LOCK_INSTR "cmpxchgl %2, %1"			      \ -		       : "=a" (ret), "=m" (futex)			      \ -		       : "r" (id), "m" (futex),				      \ -			 "0" (LLL_LOCK_INITIALIZER)			      \ -		       : "memory");					      \ -     ret; }) - - -#define lll_cond_trylock(futex) \ -  ({ int ret;								      \ -     __asm__ __volatile__ (LOCK_INSTR "cmpxchgl %2, %1"			      \ -		       : "=a" (ret), "=m" (futex)			      \ -		       : "r" (LLL_LOCK_INITIALIZER_WAITERS),		      \ -			 "m" (futex), "0" (LLL_LOCK_INITIALIZER)	      \ -		       : "memory");					      \ -     ret; }) - -#if defined NOT_IN_libc || defined UP -# define __lll_lock_asm_start LOCK_INSTR "cmpxchgl %1, %2\n\t" -#else -# define __lll_lock_asm_start "cmpl $0, %%gs:%P6\n\t"			      \ -			      "je 0f\n\t"				      \ -			      "lock\n"					      \ -			      "0:\tcmpxchgl %1, %2\n\t" -#endif - -#define lll_lock(futex, private) \ -  (void)								      \ -    ({ int ignore1, ignore2;						      \ -       if (__builtin_constant_p (private) && (private) == LLL_PRIVATE)	      \ -	 __asm__ __volatile__ (__lll_lock_asm_start				      \ -			   "jnz _L_lock_%=\n\t"				      \ -			   ".subsection 1\n\t"				      \ -			   ".type _L_lock_%=,@function\n"		      \ -			   "_L_lock_%=:\n"				      \ -			   "1:\tleal %2, %%ecx\n"			      \ -			   "2:\tcall __lll_lock_wait_private\n" 	      \ -			   "3:\tjmp 18f\n"				      \ -			   "4:\t.size _L_lock_%=, 4b-1b\n\t"		      \ -			   ".previous\n"				      \ -			   LLL_STUB_UNWIND_INFO_3			      \ -			   "18:"					      \ -			   : "=a" (ignore1), "=c" (ignore2), "=m" (futex)     \ -			   : "0" (0), "1" (1), "m" (futex),		      \ -			     "i" (MULTIPLE_THREADS_OFFSET)		      \ -			   : "memory");					      \ -       else								      \ -	 {								      \ -	   int ignore3;							      \ -	   __asm__ __volatile__ (__lll_lock_asm_start			      \ -			     "jnz _L_lock_%=\n\t"			      \ -			     ".subsection 1\n\t"			      \ -			     ".type _L_lock_%=,@function\n"		      \ -			     "_L_lock_%=:\n"				      \ -			     "1:\tleal %2, %%edx\n"			      \ -			     "0:\tmovl %8, %%ecx\n"			      \ -			     "2:\tcall __lll_lock_wait\n"		      \ -			     "3:\tjmp 18f\n"				      \ -			     "4:\t.size _L_lock_%=, 4b-1b\n\t"		      \ -			     ".previous\n"				      \ -			     LLL_STUB_UNWIND_INFO_4			      \ -			     "18:"					      \ -			     : "=a" (ignore1), "=c" (ignore2),		      \ -			       "=m" (futex), "=&d" (ignore3) 		      \ -			     : "1" (1), "m" (futex),			      \ -			       "i" (MULTIPLE_THREADS_OFFSET), "0" (0),	      \ -			       "g" ((int) (private))			      \ -			     : "memory");				      \ -	 }								      \ -    }) - -#define lll_robust_lock(futex, id, private) \ -  ({ int __ret, ignore1, ignore2;					      \ -     __asm__ __volatile__ (LOCK_INSTR "cmpxchgl %1, %2\n\t"			      \ -		       "jnz _L_robust_lock_%=\n\t"			      \ -		       ".subsection 1\n\t"				      \ -		       ".type _L_robust_lock_%=,@function\n"		      \ -		       "_L_robust_lock_%=:\n"				      \ -		       "1:\tleal %2, %%edx\n"				      \ -		       "0:\tmovl %7, %%ecx\n"				      \ -		       "2:\tcall __lll_robust_lock_wait\n"		      \ -		       "3:\tjmp 18f\n"					      \ -		       "4:\t.size _L_robust_lock_%=, 4b-1b\n\t"		      \ -		       ".previous\n"					      \ -		       LLL_STUB_UNWIND_INFO_4				      \ -		       "18:"						      \ -		       : "=a" (__ret), "=c" (ignore1), "=m" (futex),	      \ -			 "=&d" (ignore2)				      \ -		       : "0" (0), "1" (id), "m" (futex), "g" ((int) (private))\ -		       : "memory");					      \ -     __ret; }) - - -/* Special version of lll_lock which causes the unlock function to -   always wakeup waiters.  */ -#define lll_cond_lock(futex, private) \ -  (void)								      \ -    ({ int ignore1, ignore2, ignore3;					      \ -       __asm__ __volatile__ (LOCK_INSTR "cmpxchgl %1, %2\n\t"		      \ -			 "jnz _L_cond_lock_%=\n\t"			      \ -			 ".subsection 1\n\t"				      \ -			 ".type _L_cond_lock_%=,@function\n"		      \ -			 "_L_cond_lock_%=:\n"				      \ -			 "1:\tleal %2, %%edx\n"				      \ -			 "0:\tmovl %7, %%ecx\n"				      \ -			 "2:\tcall __lll_lock_wait\n"			      \ -			 "3:\tjmp 18f\n"				      \ -			 "4:\t.size _L_cond_lock_%=, 4b-1b\n\t"		      \ -			 ".previous\n"					      \ -			 LLL_STUB_UNWIND_INFO_4				      \ -			 "18:"						      \ -			 : "=a" (ignore1), "=c" (ignore2), "=m" (futex),      \ -			   "=&d" (ignore3)				      \ -			 : "0" (0), "1" (2), "m" (futex), "g" ((int) (private))\ -			 : "memory");					      \ -    }) - - -#define lll_robust_cond_lock(futex, id, private) \ -  ({ int __ret, ignore1, ignore2;					      \ -     __asm__ __volatile__ (LOCK_INSTR "cmpxchgl %1, %2\n\t"			      \ -		       "jnz _L_robust_cond_lock_%=\n\t"			      \ -		       ".subsection 1\n\t"				      \ -		       ".type _L_robust_cond_lock_%=,@function\n"	      \ -		       "_L_robust_cond_lock_%=:\n"			      \ -		       "1:\tleal %2, %%edx\n"				      \ -		       "0:\tmovl %7, %%ecx\n"				      \ -		       "2:\tcall __lll_robust_lock_wait\n"		      \ -		       "3:\tjmp 18f\n"					      \ -		       "4:\t.size _L_robust_cond_lock_%=, 4b-1b\n\t"	      \ -		       ".previous\n"					      \ -		       LLL_STUB_UNWIND_INFO_4				      \ -		       "18:"						      \ -		       : "=a" (__ret), "=c" (ignore1), "=m" (futex),	      \ -			 "=&d" (ignore2)				      \ -		       : "0" (0), "1" (id | FUTEX_WAITERS), "m" (futex),      \ -			 "g" ((int) (private))				      \ -		       : "memory");					      \ -     __ret; }) - - -#define lll_timedlock(futex, timeout, private) \ -  ({ int __ret, ignore1, ignore2, ignore3;				      \ -     __asm__ __volatile__ (LOCK_INSTR "cmpxchgl %1, %3\n\t"			      \ -		       "jnz _L_timedlock_%=\n\t"			      \ -		       ".subsection 1\n\t"				      \ -		       ".type _L_timedlock_%=,@function\n"		      \ -		       "_L_timedlock_%=:\n"				      \ -		       "1:\tleal %3, %%ecx\n"				      \ -		       "0:\tmovl %8, %%edx\n"				      \ -		       "2:\tcall __lll_timedlock_wait\n"		      \ -		       "3:\tjmp 18f\n"					      \ -		       "4:\t.size _L_timedlock_%=, 4b-1b\n\t"		      \ -		       ".previous\n"					      \ -		       LLL_STUB_UNWIND_INFO_4				      \ -		       "18:"						      \ -		       : "=a" (__ret), "=c" (ignore1), "=&d" (ignore2),      \ -			 "=m" (futex), "=S" (ignore3)			      \ -		       : "0" (0), "1" (1), "m" (futex), "m" (timeout),	      \ -			 "4" ((int) (private))				      \ -		       : "memory");					      \ -     __ret; }) - - -#define lll_robust_timedlock(futex, timeout, id, private) \ -  ({ int __ret, ignore1, ignore2, ignore3;				      \ -     __asm__ __volatile__ (LOCK_INSTR "cmpxchgl %1, %3\n\t"			      \ -		       "jnz _L_robust_timedlock_%=\n\t"			      \ -		       ".subsection 1\n\t"				      \ -		       ".type _L_robust_timedlock_%=,@function\n"	      \ -		       "_L_robust_timedlock_%=:\n"			      \ -		       "1:\tleal %3, %%ecx\n"				      \ -		       "0:\tmovl %8, %%edx\n"				      \ -		       "2:\tcall __lll_robust_timedlock_wait\n"		      \ -		       "3:\tjmp 18f\n"					      \ -		       "4:\t.size _L_robust_timedlock_%=, 4b-1b\n\t"	      \ -		       ".previous\n"					      \ -		       LLL_STUB_UNWIND_INFO_4				      \ -		       "18:"						      \ -		       : "=a" (__ret), "=c" (ignore1), "=&d" (ignore2),      \ -			 "=m" (futex), "=S" (ignore3)			      \ -		       : "0" (0), "1" (id), "m" (futex), "m" (timeout),	      \ -			 "4" ((int) (private))				      \ -		       : "memory");					      \ -     __ret; }) - -#if defined NOT_IN_libc || defined UP -# define __lll_unlock_asm LOCK_INSTR "subl $1, %0\n\t" -#else -# define __lll_unlock_asm "cmpl $0, %%gs:%P3\n\t"			      \ -			  "je 0f\n\t"					      \ -			  "lock\n"					      \ -			  "0:\tsubl $1,%0\n\t" -#endif - -#define lll_unlock(futex, private) \ -  (void)								      \ -    ({ int ignore;							      \ -       if (__builtin_constant_p (private) && (private) == LLL_PRIVATE)	      \ -	 __asm__ __volatile__ (__lll_unlock_asm				      \ -			   "jne _L_unlock_%=\n\t"			      \ -			   ".subsection 1\n\t"				      \ -			   ".type _L_unlock_%=,@function\n"		      \ -			   "_L_unlock_%=:\n"				      \ -			   "1:\tleal %0, %%eax\n"			      \ -			   "2:\tcall __lll_unlock_wake_private\n"	      \ -			   "3:\tjmp 18f\n"				      \ -			   "4:\t.size _L_unlock_%=, 4b-1b\n\t"		      \ -			   ".previous\n"				      \ -			   LLL_STUB_UNWIND_INFO_3			      \ -			   "18:"					      \ -			   : "=m" (futex), "=&a" (ignore)		      \ -			   : "m" (futex), "i" (MULTIPLE_THREADS_OFFSET)	      \ -			   : "memory");					      \ -       else								      \ -	 {								      \ -	   int ignore2;							      \ -	   __asm__ __volatile__ (__lll_unlock_asm				      \ -			     "jne _L_unlock_%=\n\t"			      \ -			     ".subsection 1\n\t"			      \ -			     ".type _L_unlock_%=,@function\n"		      \ -			     "_L_unlock_%=:\n"				      \ -			     "1:\tleal %0, %%eax\n"			      \ -			     "0:\tmovl %5, %%ecx\n"			      \ -			     "2:\tcall __lll_unlock_wake\n"		      \ -			     "3:\tjmp 18f\n"				      \ -			     "4:\t.size _L_unlock_%=, 4b-1b\n\t"	      \ -			     ".previous\n"				      \ -			     LLL_STUB_UNWIND_INFO_4			      \ -			     "18:"					      \ -			     : "=m" (futex), "=&a" (ignore), "=&c" (ignore2)  \ -			     : "i" (MULTIPLE_THREADS_OFFSET), "m" (futex),    \ -			       "g" ((int) (private))			      \ -			     : "memory");				      \ -	 }								      \ -    }) - -#define lll_robust_unlock(futex, private) \ -  (void)								      \ -    ({ int ignore, ignore2;						      \ -       __asm__ __volatile__ (LOCK_INSTR "andl %3, %0\n\t"			      \ -			 "jne _L_robust_unlock_%=\n\t"			      \ -			 ".subsection 1\n\t"				      \ -			 ".type _L_robust_unlock_%=,@function\n"	      \ -			 "_L_robust_unlock_%=:\n\t"			      \ -			 "1:\tleal %0, %%eax\n"				      \ -			 "0:\tmovl %5, %%ecx\n"				      \ -			 "2:\tcall __lll_unlock_wake\n"			      \ -			 "3:\tjmp 18f\n"				      \ -			 "4:\t.size _L_robust_unlock_%=, 4b-1b\n\t"	      \ -			 ".previous\n"					      \ -			 LLL_STUB_UNWIND_INFO_4				      \ -			 "18:"						      \ -			 : "=m" (futex), "=&a" (ignore), "=&c" (ignore2)      \ -			 : "i" (FUTEX_WAITERS), "m" (futex),		      \ -			   "g" ((int) (private))			      \ -			 : "memory");					      \ -    }) - - -#define lll_robust_dead(futex, private) \ -  (void)								      \ -    ({ int __ignore;							      \ -       register int _nr __asm__ ("edx") = 1;				      \ -       __asm__ __volatile__ (LOCK_INSTR "orl %5, (%2)\n\t"			      \ -			 LLL_EBX_LOAD					      \ -			 LLL_ENTER_KERNEL				      \ -			 LLL_EBX_LOAD					      \ -			 : "=a" (__ignore)				      \ -			 : "0" (SYS_futex), LLL_EBX_REG (&(futex)),	      \ -			   "c" (__lll_private_flag (FUTEX_WAKE, private)),    \ -			   "d" (_nr), "i" (FUTEX_OWNER_DIED),		      \ -			   "i" (offsetof (tcbhead_t, sysinfo)));	      \ -    }) - -#define lll_islocked(futex) \ -  (futex != LLL_LOCK_INITIALIZER) - -/* The kernel notifies a process with uses CLONE_CLEARTID via futex -   wakeup when the clone terminates.  The memory location contains the -   thread ID while the clone is running and is reset to zero -   afterwards. - -   The macro parameter must not have any side effect.  */ -#define lll_wait_tid(tid) \ -  do {									      \ -    int __ignore;							      \ -    register __typeof (tid) _tid __asm__ ("edx") = (tid);			      \ -    if (_tid != 0)							      \ -      __asm__ __volatile__ (LLL_EBX_LOAD					      \ -			"1:\tmovl %1, %%eax\n\t"			      \ -			LLL_ENTER_KERNEL				      \ -			"cmpl $0, (%%ebx)\n\t"				      \ -			"jne 1b\n\t"					      \ -			LLL_EBX_LOAD					      \ -			: "=&a" (__ignore)				      \ -			: "i" (SYS_futex), LLL_EBX_REG (&tid), "S" (0),	      \ -			  "c" (FUTEX_WAIT), "d" (_tid),			      \ -			  "i" (offsetof (tcbhead_t, sysinfo))		      \ -			: "memory");					      \ -  } while (0) - -extern int __lll_timedwait_tid (int *tid, const struct timespec *abstime) -     __attribute__ ((regparm (2))) attribute_hidden; -#define lll_timedwait_tid(tid, abstime) \ -  ({									      \ -    int __ret = 0;							      \ -    if (tid != 0)							      \ -      {									      \ -	if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)	      \ -	  __ret = EINVAL;						      \ -	else								      \ -	  __ret = __lll_timedwait_tid (&tid, abstime);		      \ -      }									      \ -    __ret; }) - -#endif  /* !__ASSEMBLER__ */ - -#endif	/* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_spin_init.c b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_spin_init.c deleted file mode 100644 index d36e5373d..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_spin_init.c +++ /dev/null @@ -1 +0,0 @@ -#include <sysdeps/i386/pthread_spin_init.c> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_spin_unlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_spin_unlock.S deleted file mode 100644 index 8bae0fd31..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_spin_unlock.S +++ /dev/null @@ -1 +0,0 @@ -#include <sysdeps/i386/pthread_spin_unlock.S> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/Makefile b/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/Makefile new file mode 100644 index 000000000..0d6f2f45d --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/Makefile @@ -0,0 +1,13 @@ +# Makefile for uClibc NPTL +# +# Copyright (C) 2019 Kalray +# +# Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. +# + +top_srcdir=../../../../../../../ +top_builddir=../../../../../../../ +all: objs +include $(top_builddir)Rules.mak +include Makefile.arch +include $(top_srcdir)Makerules diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/Makefile.arch new file mode 100644 index 000000000..8af56320c --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/Makefile.arch @@ -0,0 +1,14 @@ +# Makefile for uClibc NPTL +# +# Copyright (C) 2019 Kalray +# +# Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. +# + +libpthread_linux_arch_SSRC = +libpthread_linux_arch_CSRC = pthread_once.c + +libc_linux_arch_CSRC = fork.c + +CFLAGS += $(SSP_ALL_CFLAGS) + diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/bits/pthreadtypes.h b/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/bits/pthreadtypes.h new file mode 100644 index 000000000..e1bfe51cf --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/bits/pthreadtypes.h @@ -0,0 +1,166 @@ +/* + * This file is subject to the terms and conditions of the LGPL V2.1 + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2019 Kalray Inc. + */ + +#ifndef _BITS_PTHREADTYPES_H +#define _BITS_PTHREADTYPES_H	1 + +#include <endian.h> + +#define __SIZEOF_PTHREAD_ATTR_T        64 +#define __SIZEOF_PTHREAD_MUTEX_T       48 +#define __SIZEOF_PTHREAD_MUTEXATTR_T    8 +#define __SIZEOF_PTHREAD_COND_T        72 +#define __SIZEOF_PTHREAD_COND_COMPAT_T 48 +#define __SIZEOF_PTHREAD_CONDATTR_T     8 +#define __SIZEOF_PTHREAD_RWLOCK_T      80 +#define __SIZEOF_PTHREAD_RWLOCKATTR_T   16 +#define __SIZEOF_PTHREAD_BARRIER_T      32 +#define __SIZEOF_PTHREAD_BARRIERATTR_T  16 + +#define __PTHREAD_RWLOCK_INT_FLAGS_SHARED 1 + +/* Thread identifiers.  The structure of the attribute type is not +   exposed on purpose.  */ +typedef unsigned long int pthread_t; + + +union pthread_attr_t +{ +  char __size[__SIZEOF_PTHREAD_ATTR_T]; +  long int __align; +}; +#ifndef __have_pthread_attr_t +typedef union pthread_attr_t pthread_attr_t; +# define __have_pthread_attr_t1 +#endif + +typedef struct __pthread_internal_list +{ +  struct __pthread_internal_list *__prev; +  struct __pthread_internal_list *__next; +} __pthread_list_t; + + +/* Data structures for mutex handling.  The structure of the attribute +   type is not exposed on purpose.  */ +typedef union +{ +  struct __pthread_mutex_s +  { +    int __lock; +    unsigned int __count; +    int __owner; +    unsigned int __nusers; +    /* KIND must stay at this position in the structure to maintain +       binary compatibility with static initializers.  */ +    int __kind; +    int __spins; +    __pthread_list_t __list; +#define __PTHREAD_MUTEX_HAVE_PREV	1 +  } __data; +  char __size[__SIZEOF_PTHREAD_MUTEX_T]; +  long int __align; +} pthread_mutex_t; + +/* Mutex __spins initializer used by PTHREAD_MUTEX_INITIALIZER.  */ +#define __PTHREAD_SPINS 0 + +typedef union +{ +  char __size[__SIZEOF_PTHREAD_MUTEXATTR_T]; +  long int __align; +} pthread_mutexattr_t; + +/* Data structure for conditional variable handling.  The structure of +   the attribute type is not exposed on purpose.  */ +typedef union +{ +  struct +  { +    int __lock; +    unsigned int __futex; +    __extension__ unsigned long long int __total_seq; +    __extension__ unsigned long long int __wakeup_seq; +    __extension__ unsigned long long int __woken_seq; +    void *__mutex; +    unsigned int __nwaiters; +    unsigned int __broadcast_seq; +  } __data; +  char __size[__SIZEOF_PTHREAD_COND_T]; +  __extension__ long long int __align; +} pthread_cond_t; + +typedef union +{ +  char __size[__SIZEOF_PTHREAD_CONDATTR_T]; +  int __align; +} pthread_condattr_t; + + +/* Keys for thread-specific data */ +typedef unsigned int pthread_key_t; + + +/* Once-only execution */ +typedef int pthread_once_t; + + +#if defined __USE_UNIX98 || defined __USE_XOPEN2K +/* Data structure for read-write lock variable handling.  The +   structure of the attribute type is not exposed on purpose.  */ +typedef union +{ +  struct +  { +    int __lock; +    unsigned int __nr_readers; +    unsigned int __readers_wakeup; +    unsigned int __writer_wakeup; +    unsigned int __nr_readers_queued; +    unsigned int __nr_writers_queued; +    int __writer; +    int __shared; +    unsigned long int __pad1; +    unsigned long int __pad2; +    unsigned int __flags; +  } __data; +  char __size[__SIZEOF_PTHREAD_RWLOCK_T]; +  long int __align; +} pthread_rwlock_t; + +#define __PTHREAD_RWLOCK_ELISION_EXTRA 0 + +typedef union +{ +  char __size[__SIZEOF_PTHREAD_RWLOCKATTR_T]; +  long int __align; +} pthread_rwlockattr_t; +#endif + + +#ifdef __USE_XOPEN2K +/* POSIX spinlock data type.  */ +typedef volatile int pthread_spinlock_t; + + +/* POSIX barriers data type.  The structure of the type is +   deliberately not exposed.  */ +typedef union +{ +  char __size[__SIZEOF_PTHREAD_BARRIER_T]; +  long int __align; +} pthread_barrier_t; + +typedef union +{ +  char __size[__SIZEOF_PTHREAD_BARRIERATTR_T]; +  int __align; +} pthread_barrierattr_t; +#endif + +#endif	/* bits/pthreadtypes.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/bits/semaphore.h b/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/bits/semaphore.h new file mode 100644 index 000000000..0acafdbb0 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/bits/semaphore.h @@ -0,0 +1,30 @@ +/* + * This file is subject to the terms and conditions of the LGPL V2.1 + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2019 Kalray Inc. + */ + +#ifndef _SEMAPHORE_H +# error "Never use <bits/semaphore.h> directly; include <semaphore.h> instead." +#endif + +#include <bits/wordsize.h> + +#if __WORDSIZE == 64 +# define __SIZEOF_SEM_T	32 +#else +# define __SIZEOF_SEM_T	16 +#endif + + +/* Value returned if `sem_open' failed.  */ +#define SEM_FAILED      ((sem_t *) 0) + + +typedef union +{ +  char __size[__SIZEOF_SEM_T]; +  long int __align; +} sem_t; diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/createthread.c b/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/createthread.c new file mode 100644 index 000000000..1b82c9190 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/createthread.c @@ -0,0 +1,14 @@ +/* + * This file is subject to the terms and conditions of the LGPL V2.1 + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2019 Kalray Inc. + */ + +/* Value passed to 'clone' for initialization of the thread register.  */ +#define TLS_VALUE ((void *) (pd) \ +		   + TLS_PRE_TCB_SIZE + TLS_INIT_TCB_SIZE) + +/* Get the real implementation.	 */ +#include <sysdeps/pthread/createthread.c> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/fork.c b/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/fork.c new file mode 100644 index 000000000..4f7044a0b --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/fork.c @@ -0,0 +1,11 @@ +#include <sched.h> +#include <signal.h> +#include <sysdep.h> +#include <tls.h> + +#define ARCH_FORK() \ +  INLINE_SYSCALL (clone, 5,                                                  \ +                 CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0,     \ +                 NULL, &THREAD_SELF->tid, NULL) + +#include "../fork.c" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/pthread_once.c b/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/pthread_once.c new file mode 100644 index 000000000..0d2749edf --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/pthread_once.c @@ -0,0 +1,77 @@ +/* + * This file is subject to the terms and conditions of the LGPL V2.1 + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2019 Kalray Inc. + */ + +#include "pthreadP.h" +#include <lowlevellock.h> + +unsigned long int __fork_generation attribute_hidden; + +static void +clear_once_control (void *arg) +{ +	pthread_once_t *once_control = (pthread_once_t *) arg; + +	*once_control = 0; +	lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +} + + +int +__pthread_once (once_control, init_routine) +	pthread_once_t *once_control; +	void (*init_routine) (void); +{ +	while (1) +	{ +		int oldval, val, newval; + +		val = *once_control; +		do +		{ +			/* Check if the initialized has already been done. */ +			if ((val & 2) != 0) +				return 0; + +			oldval = val; +			newval = (oldval & 3) | __fork_generation | 1; +			val = atomic_compare_and_exchange_val_acq (once_control, newval, oldval); +		} while (__builtin_expect (val != oldval, 0)); + +		/* Check if another thread already runs the initializer. */ +		if ((oldval & 1) != 0) +		{ +		/* Check whether the initializer execution was interrupted +		 * by a fork. */ +			if (((oldval ^ newval) & -4) == 0) +			{ +				/* Same generation, some other thread was faster. Wait. */ +				lll_futex_wait (once_control, newval, LLL_PRIVATE); +				continue; +			} +		} +		/* This thread is the first here.  Do the initialization. +		 * Register a cleanup handler so that in case the thread gets +		 * interrupted the initialization can be restarted. */ +		pthread_cleanup_push (clear_once_control, once_control); + +		init_routine (); + +		pthread_cleanup_pop (0); + +		/* Add one to *once_control. */ +		atomic_increment (once_control); + +		/* Wake up all other threads. */ +		lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +		break; +	} + +	return 0; +} +weak_alias (__pthread_once, pthread_once) +strong_alias (__pthread_once, __pthread_once_internal) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/sysdep-cancel.h b/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/sysdep-cancel.h new file mode 100644 index 000000000..09f538fc2 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/kvx/sysdep-cancel.h @@ -0,0 +1,43 @@ +/* + * This file is subject to the terms and conditions of the LGPV V2.1 + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2019 Kalray Inc. + */ + +#include <sysdep.h> +#include <tls.h> +#ifndef __ASSEMBLER__ +# include <pthreadP.h> +#endif + +#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt + +# if defined IS_IN_libpthread +#  define __local_multiple_threads __pthread_multiple_threads +# elif !defined NOT_IN_libc +#  define __local_multiple_threads __libc_multiple_threads +# endif + +# if defined IS_IN_libpthread || !defined NOT_IN_libc +extern int __local_multiple_threads attribute_hidden; +#  define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1) +# else +/*  There is no __local_multiple_threads for librt, so use the TCB.  */ +#  define SINGLE_THREAD_P						\ +  __builtin_expect (THREAD_GETMEM (THREAD_SELF,				\ +				   header.multiple_threads) == 0, 1) +# endif + +#else + +/* For rtld, et cetera.  */ +# define SINGLE_THREAD_P 1 +# define NO_CANCELLATION 1 + +#endif + +# define RTLD_SINGLE_THREAD_P \ +  __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ +				   header.multiple_threads) == 0, 1) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.h index b5b0afdf8..99025fdf3 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.h +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.h @@ -17,13 +17,6 @@  #ifndef _LOWLEVELLOCK_H  #define _LOWLEVELLOCK_H	1 -#include <time.h> -#include <sys/param.h> -#include <bits/pthreadtypes.h> -#include <atomic.h> -#include <sysdep.h> -#include <bits/kernel-features.h> -  #define FUTEX_WAIT		0  #define FUTEX_WAKE		1  #define FUTEX_REQUEUE		3 @@ -40,6 +33,19 @@  #define FUTEX_BITSET_MATCH_ANY	0xffffffff +#ifndef __ASSEMBLER__ + +#include <time.h> +#include <sys/param.h> +#include <bits/pthreadtypes.h> +#include <atomic.h> +#include <sysdep.h> +#include <bits/kernel-features.h> + +#if defined(__UCLIBC_USE_TIME64__) +#include "internal/time64_helpers.h" +#endif +  /* Values for 'private' parameter of locking macros.  Yes, the     definition seems to be backwards.  But it is not.  The bit will be     reversed before passing to the system call.  */ @@ -71,10 +77,33 @@  # endif	        #endif -  #define lll_futex_wait(futexp, val, private) \    lll_futex_timed_wait(futexp, val, NULL, private) +#if defined(__UCLIBC_USE_TIME64__) && defined(__NR_futex_time64) + +#define lll_futex_timed_wait(futexp, val, timespec, private) \ +  ({									      \ +    INTERNAL_SYSCALL_DECL (__err);					      \ +    long int __ret;							      \ +    __ret = INTERNAL_SYSCALL (futex_time64, __err, 4, (futexp),		      \ +			      __lll_private_flag (FUTEX_WAIT, private),	      \ +			      (val), (TO_TS64_P(timespec)));			      \ +    __ret;								      \ +  }) + +#define lll_futex_wake(futexp, nr, private) \ +  ({									      \ +    INTERNAL_SYSCALL_DECL (__err);					      \ +    long int __ret;							      \ +    __ret = INTERNAL_SYSCALL (futex_time64, __err, 4, (futexp),		      \ +			      __lll_private_flag (FUTEX_WAKE, private),	      \ +			      (nr), 0);					      \ +    __ret;								      \ +  }) + +#else +  #define lll_futex_timed_wait(futexp, val, timespec, private) \    ({									      \      INTERNAL_SYSCALL_DECL (__err);					      \ @@ -95,6 +124,8 @@      __ret;								      \    }) +#endif +  #define lll_robust_dead(futexv, private) \    do									      \      {									      \ @@ -105,6 +136,35 @@    while (0)  /* Returns non-zero if error happened, zero if success.  */ + +#if defined(__UCLIBC_USE_TIME64__) && defined(__NR_futex_time64) + +#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ +  ({									      \ +    INTERNAL_SYSCALL_DECL (__err);					      \ +    long int __ret;							      \ +    __ret = INTERNAL_SYSCALL (futex_time64, __err, 6, (futexp),		      \ +			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ +			      (nr_wake), (nr_move), (mutex), (val));	      \ +    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ +  }) + + +/* Returns non-zero if error happened, zero if success.  */ +#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ +  ({									      \ +    INTERNAL_SYSCALL_DECL (__err);					      \ +    long int __ret;							      \ +    __ret = INTERNAL_SYSCALL (futex_time64, __err, 6, (futexp),		      \ +			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ +			      (nr_wake), (nr_wake2), (futexp2),		      \ +			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ +    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ +  }) + +#else + +  #define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \    ({									      \      INTERNAL_SYSCALL_DECL (__err);					      \ @@ -128,6 +188,8 @@      INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \    }) +#endif +  #define lll_trylock(lock)	\    atomic_compare_and_exchange_val_acq(&(lock), 1, 0) @@ -277,4 +339,6 @@ extern int __lll_timedwait_tid (int *, const struct timespec *)      __res;						\    }) +#endif /* __ASSEMBLER__ */ +  #endif	/* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/m68k/bits/pthreadtypes.h b/libpthread/nptl/sysdeps/unix/sysv/linux/m68k/bits/pthreadtypes.h index 2a90a0b90..d2f22caee 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/m68k/bits/pthreadtypes.h +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/m68k/bits/pthreadtypes.h @@ -39,7 +39,7 @@ typedef unsigned long int pthread_t;  typedef union  {    char __size[__SIZEOF_PTHREAD_ATTR_T]; -  long int __align; +  long int __align __attribute__((__aligned__(4)));  } pthread_attr_t; @@ -69,13 +69,13 @@ typedef union      };    } __data;    char __size[__SIZEOF_PTHREAD_MUTEX_T]; -  long int __align; +  long int __align __attribute__((__aligned__(4)));  } pthread_mutex_t;  typedef union  {    char __size[__SIZEOF_PTHREAD_MUTEXATTR_T]; -  long int __align; +  long int __align __attribute__((__aligned__(4)));  } pthread_mutexattr_t; @@ -95,13 +95,13 @@ typedef union      unsigned int __broadcast_seq;    } __data;    char __size[__SIZEOF_PTHREAD_COND_T]; -  __extension__ long long int __align; +  __extension__ long long int __align __attribute__((__aligned__(8)));  } pthread_cond_t;  typedef union  {    char __size[__SIZEOF_PTHREAD_CONDATTR_T]; -  long int __align; +  long int __align __attribute__((__aligned__(4)));  } pthread_condattr_t; @@ -144,13 +144,13 @@ typedef union      int __writer;    } __data;    char __size[__SIZEOF_PTHREAD_RWLOCK_T]; -  long int __align; +  long int __align __attribute__((__aligned__(4)));  } pthread_rwlock_t;  typedef union  {    char __size[__SIZEOF_PTHREAD_RWLOCKATTR_T]; -  long int __align; +  long int __align __attribute__((__aligned__(4)));  } pthread_rwlockattr_t;  #endif @@ -165,13 +165,13 @@ typedef volatile int pthread_spinlock_t;  typedef union  {    char __size[__SIZEOF_PTHREAD_BARRIER_T]; -  long int __align; +  long int __align __attribute__((__aligned__(4)));  } pthread_barrier_t;  typedef union  {    char __size[__SIZEOF_PTHREAD_BARRIERATTR_T]; -  int __align; +  int __align __attribute__((__aligned__(4)));  } pthread_barrierattr_t;  #endif diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/mips/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/mips/lowlevellock.h index 450a286b4..9fc000a91 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/mips/lowlevellock.h +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/mips/lowlevellock.h @@ -26,6 +26,10 @@  #include <sysdep.h>  #include <bits/kernel-features.h> +#if defined(__UCLIBC_USE_TIME64__) +#include "internal/time64_helpers.h" +#endif +  #define FUTEX_WAIT		0  #define FUTEX_WAKE		1  #define FUTEX_REQUEUE		3 @@ -77,6 +81,30 @@  #define lll_futex_wait(futexp, val, private) \    lll_futex_timed_wait(futexp, val, NULL, private) +#if defined(__UCLIBC_USE_TIME64__) && defined(__NR_futex_time64) + +#define lll_futex_timed_wait(futexp, val, timespec, private) \ +  ({									      \ +    INTERNAL_SYSCALL_DECL (__err);					      \ +    long int __ret attribute_unused;					      \ +    __ret = INTERNAL_SYSCALL (futex_time64, __err, 4, (long) (futexp),		      \ +			      __lll_private_flag (FUTEX_WAIT, private),	      \ +			      (val), (TO_TS64_P(timespec)));			      \ +    INTERNAL_SYSCALL_ERROR_P (__ret, __err) ? -__ret : __ret;		      \ +  }) + +#define lll_futex_wake(futexp, nr, private) \ +  ({									      \ +    INTERNAL_SYSCALL_DECL (__err);					      \ +    long int __ret attribute_unused;					      \ +    __ret = INTERNAL_SYSCALL (futex_time64, __err, 4, (long) (futexp),		      \ +			      __lll_private_flag (FUTEX_WAKE, private),	      \ +			      (nr), 0);	      \ +    INTERNAL_SYSCALL_ERROR_P (__ret, __err) ? -__ret : __ret;		      \ +  }) + +#else +  #define lll_futex_timed_wait(futexp, val, timespec, private) \    ({									      \      INTERNAL_SYSCALL_DECL (__err);					      \ @@ -97,6 +125,8 @@      INTERNAL_SYSCALL_ERROR_P (__ret, __err) ? -__ret : __ret;		      \    }) +#endif +  #define lll_robust_dead(futexv, private) \    do									      \      {									      \ @@ -106,6 +136,35 @@      }									      \    while (0) +#if defined(__UCLIBC_USE_TIME64__) && defined(__NR_futex_time64) + +/* Returns non-zero if error happened, zero if success.  */ +#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ +  ({									      \ +    INTERNAL_SYSCALL_DECL (__err);					      \ +    long int __ret attribute_unused;					      \ +    __ret = INTERNAL_SYSCALL (futex_time64, __err, 6, (long) (futexp),		      \ +			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ +			      (nr_wake), (nr_move), (mutex), (val));	      \ +    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ +  }) + +/* Returns non-zero if error happened, zero if success.  */ +#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ +  ({									      \ +    INTERNAL_SYSCALL_DECL (__err);					      \ +    long int __ret attribute_unused;					      \ +									      \ +    __ret = INTERNAL_SYSCALL (futex_time64, __err, 6, (futexp),		      \ +			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ +			      (nr_wake), (nr_wake2), (futexp2),		      \ +			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ +    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ +  }) + + +#else +  /* Returns non-zero if error happened, zero if success.  */  #define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \    ({									      \ @@ -130,6 +189,8 @@      INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \    }) +#endif +  static inline int __attribute__((always_inline))  __lll_trylock(int *futex)  { diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/nanosleep.c b/libpthread/nptl/sysdeps/unix/sysv/linux/nanosleep.c index 73fae44bc..9c7230934 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/nanosleep.c +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/nanosleep.c @@ -8,11 +8,17 @@  /* Pause execution for a number of nanoseconds.  */  int -nanosleep (const struct timespec *requested_time, +_NC(nanosleep) (const struct timespec *requested_time,               struct timespec *remaining)  { -  return _syscall2(int, __NC(nanosleep), const struct timespec*, -			requested_time, struct timespec* remaining) +    int __ret = clock_nanosleep(CLOCK_REALTIME, 0, requested_time, remaining); + +    if (__ret != 0) { +      __set_errno(__ret); +      return -1; +    } + +    return __ret;  }  CANCELLABLE_SYSCALL(int, nanosleep, (const struct timespec *requested_time, diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/not-cancel.h b/libpthread/nptl/sysdeps/unix/sysv/linux/not-cancel.h index bbdb0739c..6d7c4d70a 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/not-cancel.h +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/not-cancel.h @@ -19,6 +19,7 @@  #include <sys/types.h>  #include <sysdep.h> +#include <time.h>  /* Uncancelable open.  */  #if defined __NR_openat && !defined __NR_open @@ -104,6 +105,7 @@ extern int __openat64_nocancel (int fd, const char *fname, int oflag,  # define nanosleep_not_cancel(requested_time, remaining) \    INLINE_SYSCALL (nanosleep, 2, requested_time, remaining)  #else +extern int __nanosleep_nocancel (const struct timespec *requested_time, struct timespec *remaining);  # define nanosleep_not_cancel(requested_time, remaining) \    __nanosleep_nocancel (requested_time, remaining)  #endif diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/Makefile b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/Makefile new file mode 100644 index 000000000..2caba11b7 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/Makefile @@ -0,0 +1,9 @@ +# Makefile for uClibc-ng NPTL +# Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. + +top_srcdir=../../../../../../../ +top_builddir=../../../../../../../ +all: objs +include $(top_builddir)Rules.mak +include Makefile.arch +include $(top_srcdir)Makerules diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/Makefile.arch new file mode 100644 index 000000000..94aa25ffb --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/Makefile.arch @@ -0,0 +1,9 @@ +# Makefile for uClibc-ng NPTL +# Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. + +libpthread_linux_arch_SSRC = +libpthread_linux_arch_CSRC = pthread_once.c + +libc_linux_arch_CSRC = fork.c + +CFLAGS += $(SSP_ALL_CFLAGS) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/bits/pthreadtypes.h b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/bits/pthreadtypes.h new file mode 100644 index 000000000..ad10c405c --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/bits/pthreadtypes.h @@ -0,0 +1,168 @@ +/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc. + +   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.  */ + +#ifndef _BITS_PTHREADTYPES_H +#define _BITS_PTHREADTYPES_H	1 + +#define __SIZEOF_PTHREAD_ATTR_T 	32 +#define __SIZEOF_PTHREAD_MUTEX_T 	32 +#define __SIZEOF_PTHREAD_MUTEXATTR_T 	4 +#define __SIZEOF_PTHREAD_COND_T 	48 +#define __SIZEOF_PTHREAD_COND_COMPAT_T 	12 +#define __SIZEOF_PTHREAD_CONDATTR_T 	4 +#define __SIZEOF_PTHREAD_RWLOCK_T 	48 +#define __SIZEOF_PTHREAD_RWLOCKATTR_T 	8 +#define __SIZEOF_PTHREAD_BARRIER_T 	20 +#define __SIZEOF_PTHREAD_BARRIERATTR_T 	4 + + +/* Thread identifiers.  The structure of the attribute type is not +   exposed on purpose.  */ +typedef unsigned long int pthread_t; + +union pthread_attr_t +{ +  char __size[__SIZEOF_PTHREAD_ATTR_T]; +  long int __align; +}; +#ifndef __have_pthread_attr_t +typedef union pthread_attr_t pthread_attr_t; +# define __have_pthread_attr_t  1 +#endif + +typedef struct __pthread_internal_slist +{ +  struct __pthread_internal_slist *__next; +} __pthread_slist_t; + + +/* Data structures for mutex handling.  The structure of the attribute +   type is not exposed on purpose.  */ +typedef union +{ +  struct __pthread_mutex_s +  { +    int __lock; +    unsigned int __count; +    int __owner; +    /* KIND must stay at this position in the structure to maintain +       binary compatibility with static initializers.  */ +    int __kind; +    unsigned int __nusers; +    __extension__ union +    { +      int __spins; +      __pthread_slist_t __list; +    }; +  } __data; +  char __size[__SIZEOF_PTHREAD_MUTEX_T]; +  long int __align; +} pthread_mutex_t; + +typedef union +{ +  char __size[__SIZEOF_PTHREAD_MUTEXATTR_T]; +  long int __align; +} pthread_mutexattr_t; + + +/* Data structure for conditional variable handling.  The structure of +   the attribute type is not exposed on purpose.  */ +typedef union +{ +  struct +  { +    int __lock; +    unsigned int __futex; +    __extension__ unsigned long long int __total_seq; +    __extension__ unsigned long long int __wakeup_seq; +    __extension__ unsigned long long int __woken_seq; +    void *__mutex; +    unsigned int __nwaiters; +    unsigned int __broadcast_seq; +  } __data; +  char __size[__SIZEOF_PTHREAD_COND_T]; +  __extension__ long long int __align; +} pthread_cond_t; + +typedef union +{ +  char __size[__SIZEOF_PTHREAD_CONDATTR_T]; +  long int __align; +} pthread_condattr_t; + + +/* Keys for thread-specific data */ +typedef unsigned int pthread_key_t; + + +/* Once-only execution */ +typedef int pthread_once_t; + + +#if defined __USE_UNIX98 || defined __USE_XOPEN2K +/* Data structure for read-write lock variable handling.  The +   structure of the attribute type is not exposed on purpose.  */ +typedef union +{ +  struct +  { +    int __lock; +    unsigned int __nr_readers; +    unsigned int __readers_wakeup; +    unsigned int __writer_wakeup; +    unsigned int __nr_readers_queued; +    unsigned int __nr_writers_queued; +    int __writer; +    int __shared; +    unsigned long int __pad1; +    unsigned long int __pad2; +    unsigned int __flags; +  } __data; +  char __size[__SIZEOF_PTHREAD_RWLOCK_T]; +  long int __align; +} pthread_rwlock_t; + +typedef union +{ +  char __size[__SIZEOF_PTHREAD_RWLOCKATTR_T]; +  long int __align; +} pthread_rwlockattr_t; +#endif + + +#ifdef __USE_XOPEN2K +/* POSIX spinlock data type.  */ +typedef volatile int pthread_spinlock_t; + + +/* POSIX barriers data type.  The structure of the type is +   deliberately not exposed.  */ +typedef union +{ +  char __size[__SIZEOF_PTHREAD_BARRIER_T]; +  long int __align; +} pthread_barrier_t; + +typedef union +{ +  char __size[__SIZEOF_PTHREAD_BARRIERATTR_T]; +  int __align; +} pthread_barrierattr_t; +#endif + +#endif	/* bits/pthreadtypes.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/bits/semaphore.h b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/bits/semaphore.h new file mode 100644 index 000000000..796a4383b --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/bits/semaphore.h @@ -0,0 +1,33 @@ +/* Copyright (C) 2002, 2005, 2007 Free Software Foundation, Inc. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +#ifndef _SEMAPHORE_H +# error "Never use <bits/semaphore.h> directly; include <semaphore.h> instead." +#endif + + +#define __SIZEOF_SEM_T	(4 * __SIZEOF_POINTER__) + + +/* Value returned if `sem_open' failed.  */ +#define SEM_FAILED      ((sem_t *) 0) + + +typedef union +{ +  char __size[__SIZEOF_SEM_T]; +  long int __align; +} sem_t; diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelrobustlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/createthread.c index 6103f2ee4..3079007c7 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i586/lowlevelrobustlock.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/createthread.c @@ -1,6 +1,5 @@ -/* Copyright (C) 2002, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2005 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 @@ -9,11 +8,16 @@     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 +   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, see     <http://www.gnu.org/licenses/>.  */ -#include "../i486/lowlevelrobustlock.S" +/* Value passed to 'clone' for initialization of the thread register.  */ +#define TLS_VALUE ((void *) (pd) \ +		   + TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE) + +/* Get the real implementation.	 */ +#include <sysdeps/pthread/createthread.c> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/fork.c b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/fork.c new file mode 100644 index 000000000..c5d963aad --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/fork.c @@ -0,0 +1,11 @@ +#include <sched.h> +#include <signal.h> +#include <sysdep.h> +#include <tls.h> + +#define ARCH_FORK() \ +  INLINE_SYSCALL (clone, 5,                                                  \ +                 CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0,     \ +                 NULL, NULL, &THREAD_SELF->tid) + +#include "../fork.c" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/pthread_once.c b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/pthread_once.c new file mode 100644 index 000000000..ce68ce68c --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/pthread_once.c @@ -0,0 +1,92 @@ +/* Copyright (C) 2003-2013 Free Software Foundation, Inc. +   Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +#include "pthreadP.h" +#include <lowlevellock.h> + + +unsigned long int __fork_generation attribute_hidden; + + +static void +clear_once_control (void *arg) +{ +  pthread_once_t *once_control = (pthread_once_t *) arg; + +  *once_control = 0; +  lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +} + + +int +__pthread_once (once_control, init_routine) +     pthread_once_t *once_control; +     void (*init_routine) (void); +{ +  while (1) +    { +      int oldval, val, newval; + +      val = *once_control; +      do +	{ +	  /* Check if the initialized has already been done.  */ +	  if ((val & 2) != 0) +	    return 0; + +	  oldval = val; +	  newval = (oldval & 3) | __fork_generation | 1; +	  val = atomic_compare_and_exchange_val_acq (once_control, newval, +						     oldval); +	} +      while (__builtin_expect (val != oldval, 0)); + +      /* Check if another thread already runs the initializer.	*/ +      if ((oldval & 1) != 0) +	{ +	  /* Check whether the initializer execution was interrupted +	     by a fork.	 */ +	  if (((oldval ^ newval) & -4) == 0) +	    { +	      /* Same generation, some other thread was faster. Wait.  */ +	      lll_futex_wait (once_control, newval, LLL_PRIVATE); +	      continue; +	    } +	} + +      /* This thread is the first here.  Do the initialization. +	 Register a cleanup handler so that in case the thread gets +	 interrupted the initialization can be restarted.  */ +      pthread_cleanup_push (clear_once_control, once_control); + +      init_routine (); + +      pthread_cleanup_pop (0); + + +      /* Add one to *once_control.  */ +      atomic_increment (once_control); + +      /* Wake up all other threads.  */ +      lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +      break; +    } + +  return 0; +} +weak_alias (__pthread_once, pthread_once) +strong_alias (__pthread_once, __pthread_once_internal) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/sysdep-cancel.h b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/sysdep-cancel.h new file mode 100644 index 000000000..f7e70514a --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv32/sysdep-cancel.h @@ -0,0 +1,38 @@ +/* Copyright (C) 2014 Free Software Foundation, Inc. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +#include <sysdep.h> +#include <tls.h> +#ifndef __ASSEMBLER__ +# include <pthreadP.h> +#endif + +#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt + +# define SINGLE_THREAD_P \ +  __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ +                                   header.multiple_threads) == 0, 1) + +#else + +# define SINGLE_THREAD_P 1 +# define NO_CANCELLATION 1 + +#endif + +#define RTLD_SINGLE_THREAD_P \ +  __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ +                                   header.multiple_threads) == 0, 1) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/Makefile b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/Makefile new file mode 100644 index 000000000..2caba11b7 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/Makefile @@ -0,0 +1,9 @@ +# Makefile for uClibc-ng NPTL +# Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. + +top_srcdir=../../../../../../../ +top_builddir=../../../../../../../ +all: objs +include $(top_builddir)Rules.mak +include Makefile.arch +include $(top_srcdir)Makerules diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/Makefile.arch new file mode 100644 index 000000000..94aa25ffb --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/Makefile.arch @@ -0,0 +1,9 @@ +# Makefile for uClibc-ng NPTL +# Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. + +libpthread_linux_arch_SSRC = +libpthread_linux_arch_CSRC = pthread_once.c + +libc_linux_arch_CSRC = fork.c + +CFLAGS += $(SSP_ALL_CFLAGS) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/bits/pthreadtypes.h b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/bits/pthreadtypes.h new file mode 100644 index 000000000..e0c0534f6 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/bits/pthreadtypes.h @@ -0,0 +1,167 @@ +/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc. + +   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.  */ + +#ifndef _BITS_PTHREADTYPES_H +#define _BITS_PTHREADTYPES_H	1 + +#define __SIZEOF_PTHREAD_ATTR_T 	56 +#define __SIZEOF_PTHREAD_MUTEX_T 	40 +#define __SIZEOF_PTHREAD_MUTEXATTR_T 	4 +#define __SIZEOF_PTHREAD_COND_T 	48 +#define __SIZEOF_PTHREAD_COND_COMPAT_T 	12 +#define __SIZEOF_PTHREAD_CONDATTR_T 	4 +#define __SIZEOF_PTHREAD_RWLOCK_T 	56 +#define __SIZEOF_PTHREAD_RWLOCKATTR_T 	8 +#define __SIZEOF_PTHREAD_BARRIER_T 	32 +#define __SIZEOF_PTHREAD_BARRIERATTR_T 	4 + + +/* Thread identifiers.  The structure of the attribute type is not +   exposed on purpose.  */ +typedef unsigned long int pthread_t; + +union pthread_attr_t +{ +  char __size[__SIZEOF_PTHREAD_ATTR_T]; +  long int __align; +}; +#ifndef __have_pthread_attr_t +typedef union pthread_attr_t pthread_attr_t; +# define __have_pthread_attr_t  1 +#endif + +typedef struct __pthread_internal_list +{ +  struct __pthread_internal_list *__prev; +  struct __pthread_internal_list *__next; +} __pthread_list_t; + + +/* Data structures for mutex handling.  The structure of the attribute +   type is not exposed on purpose.  */ +typedef union +{ +  struct __pthread_mutex_s +  { +    int __lock; +    unsigned int __count; +    int __owner; +    unsigned int __nusers; +    /* KIND must stay at this position in the structure to maintain +       binary compatibility with static initializers.  */ +    int __kind; +    int __spins; +    __pthread_list_t __list; +#define __PTHREAD_MUTEX_HAVE_PREV	1 +  } __data; +  char __size[__SIZEOF_PTHREAD_MUTEX_T]; +  long int __align; +} pthread_mutex_t; + +typedef union +{ +  char __size[__SIZEOF_PTHREAD_MUTEXATTR_T]; +  long int __align; +} pthread_mutexattr_t; + + +/* Data structure for conditional variable handling.  The structure of +   the attribute type is not exposed on purpose.  */ +typedef union +{ +  struct +  { +    int __lock; +    unsigned int __futex; +    __extension__ unsigned long long int __total_seq; +    __extension__ unsigned long long int __wakeup_seq; +    __extension__ unsigned long long int __woken_seq; +    void *__mutex; +    unsigned int __nwaiters; +    unsigned int __broadcast_seq; +  } __data; +  char __size[__SIZEOF_PTHREAD_COND_T]; +  __extension__ long long int __align; +} pthread_cond_t; + +typedef union +{ +  char __size[__SIZEOF_PTHREAD_CONDATTR_T]; +  int __align; +} pthread_condattr_t; + + +/* Keys for thread-specific data */ +typedef unsigned int pthread_key_t; + + +/* Once-only execution */ +typedef int pthread_once_t; + + +#if defined __USE_UNIX98 || defined __USE_XOPEN2K +/* Data structure for read-write lock variable handling.  The +   structure of the attribute type is not exposed on purpose.  */ +typedef union +{ +  struct +  { +    int __lock; +    unsigned int __nr_readers; +    unsigned int __readers_wakeup; +    unsigned int __writer_wakeup; +    unsigned int __nr_readers_queued; +    unsigned int __nr_writers_queued; +    int __writer; +    int __shared; +    unsigned long int __pad1; +    unsigned long int __pad2; +    unsigned int __flags; +  } __data; +  char __size[__SIZEOF_PTHREAD_RWLOCK_T]; +  long int __align; +} pthread_rwlock_t; + +typedef union +{ +  char __size[__SIZEOF_PTHREAD_RWLOCKATTR_T]; +  long int __align; +} pthread_rwlockattr_t; +#endif + + +#ifdef __USE_XOPEN2K +/* POSIX spinlock data type.  */ +typedef volatile int pthread_spinlock_t; + + +/* POSIX barriers data type.  The structure of the type is +   deliberately not exposed.  */ +typedef union +{ +  char __size[__SIZEOF_PTHREAD_BARRIER_T]; +  long int __align; +} pthread_barrier_t; + +typedef union +{ +  char __size[__SIZEOF_PTHREAD_BARRIERATTR_T]; +  int __align; +} pthread_barrierattr_t; +#endif + +#endif	/* bits/pthreadtypes.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/bits/semaphore.h b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/bits/semaphore.h new file mode 100644 index 000000000..796a4383b --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/bits/semaphore.h @@ -0,0 +1,33 @@ +/* Copyright (C) 2002, 2005, 2007 Free Software Foundation, Inc. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +#ifndef _SEMAPHORE_H +# error "Never use <bits/semaphore.h> directly; include <semaphore.h> instead." +#endif + + +#define __SIZEOF_SEM_T	(4 * __SIZEOF_POINTER__) + + +/* Value returned if `sem_open' failed.  */ +#define SEM_FAILED      ((sem_t *) 0) + + +typedef union +{ +  char __size[__SIZEOF_SEM_T]; +  long int __align; +} sem_t; diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/createthread.c b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/createthread.c new file mode 100644 index 000000000..3079007c7 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/createthread.c @@ -0,0 +1,23 @@ +/* Copyright (C) 2005 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, see +   <http://www.gnu.org/licenses/>.  */ + +/* Value passed to 'clone' for initialization of the thread register.  */ +#define TLS_VALUE ((void *) (pd) \ +		   + TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE) + +/* Get the real implementation.	 */ +#include <sysdeps/pthread/createthread.c> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/fork.c b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/fork.c new file mode 100644 index 000000000..c5d963aad --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/fork.c @@ -0,0 +1,11 @@ +#include <sched.h> +#include <signal.h> +#include <sysdep.h> +#include <tls.h> + +#define ARCH_FORK() \ +  INLINE_SYSCALL (clone, 5,                                                  \ +                 CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0,     \ +                 NULL, NULL, &THREAD_SELF->tid) + +#include "../fork.c" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/pthread_once.c b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/pthread_once.c new file mode 100644 index 000000000..ce68ce68c --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/pthread_once.c @@ -0,0 +1,92 @@ +/* Copyright (C) 2003-2013 Free Software Foundation, Inc. +   Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +#include "pthreadP.h" +#include <lowlevellock.h> + + +unsigned long int __fork_generation attribute_hidden; + + +static void +clear_once_control (void *arg) +{ +  pthread_once_t *once_control = (pthread_once_t *) arg; + +  *once_control = 0; +  lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +} + + +int +__pthread_once (once_control, init_routine) +     pthread_once_t *once_control; +     void (*init_routine) (void); +{ +  while (1) +    { +      int oldval, val, newval; + +      val = *once_control; +      do +	{ +	  /* Check if the initialized has already been done.  */ +	  if ((val & 2) != 0) +	    return 0; + +	  oldval = val; +	  newval = (oldval & 3) | __fork_generation | 1; +	  val = atomic_compare_and_exchange_val_acq (once_control, newval, +						     oldval); +	} +      while (__builtin_expect (val != oldval, 0)); + +      /* Check if another thread already runs the initializer.	*/ +      if ((oldval & 1) != 0) +	{ +	  /* Check whether the initializer execution was interrupted +	     by a fork.	 */ +	  if (((oldval ^ newval) & -4) == 0) +	    { +	      /* Same generation, some other thread was faster. Wait.  */ +	      lll_futex_wait (once_control, newval, LLL_PRIVATE); +	      continue; +	    } +	} + +      /* This thread is the first here.  Do the initialization. +	 Register a cleanup handler so that in case the thread gets +	 interrupted the initialization can be restarted.  */ +      pthread_cleanup_push (clear_once_control, once_control); + +      init_routine (); + +      pthread_cleanup_pop (0); + + +      /* Add one to *once_control.  */ +      atomic_increment (once_control); + +      /* Wake up all other threads.  */ +      lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +      break; +    } + +  return 0; +} +weak_alias (__pthread_once, pthread_once) +strong_alias (__pthread_once, __pthread_once_internal) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/sysdep-cancel.h b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/sysdep-cancel.h new file mode 100644 index 000000000..f7e70514a --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/riscv64/sysdep-cancel.h @@ -0,0 +1,38 @@ +/* Copyright (C) 2014 Free Software Foundation, Inc. + +   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, see +   <http://www.gnu.org/licenses/>.  */ + +#include <sysdep.h> +#include <tls.h> +#ifndef __ASSEMBLER__ +# include <pthreadP.h> +#endif + +#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt + +# define SINGLE_THREAD_P \ +  __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ +                                   header.multiple_threads) == 0, 1) + +#else + +# define SINGLE_THREAD_P 1 +# define NO_CANCELLATION 1 + +#endif + +#define RTLD_SINGLE_THREAD_P \ +  __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ +                                   header.multiple_threads) == 0, 1) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/timer_create.c b/libpthread/nptl/sysdeps/unix/sysv/linux/timer_create.c index 93e4e6070..cd8d2f84f 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/timer_create.c +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/timer_create.c @@ -140,8 +140,13 @@ timer_create (  	      INTERNAL_SYSCALL_DECL (err);  	      struct timespec ts;  	      int res; +#if defined(__UCLIBC_USE_TIME64__) && defined(__NR_clock_getres_time64) +	      res = INTERNAL_SYSCALL (clock_getres_time64, err, 2, +				      CLOCK_REALTIME, &ts); +#else  	      res = INTERNAL_SYSCALL (clock_getres, err, 2,  				      CLOCK_REALTIME, &ts); +#endif  	      __no_posix_timers = (INTERNAL_SYSCALL_ERROR_P (res, err)  				   ? -1 : 1);  	    } diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/timer_gettime.c b/libpthread/nptl/sysdeps/unix/sysv/linux/timer_gettime.c index 699874f3f..fccda6976 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/timer_gettime.c +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/timer_gettime.c @@ -24,7 +24,7 @@  #include "kernel-posix-timers.h" -#ifdef __NR_timer_gettime +#if defined(__NR_timer_gettime) || defined(__NR_timer_gettime64)  # ifndef __ASSUME_POSIX_TIMERS  static int compat_timer_gettime (timer_t timerid, struct itimerspec *value);  #  define timer_gettime static compat_timer_gettime @@ -50,7 +50,11 @@ timer_gettime (        struct timer *kt = (struct timer *) timerid;        /* Delete the kernel timer object.  */ +# if defined(__UCLIBC_USE_TIME64__) && defined(__NR_timer_gettime64) +      int res = INLINE_SYSCALL (timer_gettime64, 2, kt->ktimerid, value); +# else        int res = INLINE_SYSCALL (timer_gettime, 2, kt->ktimerid, value); +# endif  # ifndef __ASSUME_POSIX_TIMERS        if (res != -1 || errno != ENOSYS) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/timer_routines.c b/libpthread/nptl/sysdeps/unix/sysv/linux/timer_routines.c index 514913317..8c828fbb1 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/timer_routines.c +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/timer_routines.c @@ -90,8 +90,13 @@ timer_helper_thread (void *arg)        /* XXX The size argument hopefully will have to be changed to the  	 real size of the user-level sigset_t.  */ +#if defined(__NR_rt_sigtimedwait_time64) && defined(__UCLIBC_USE_TIME64__) +      int result = INLINE_SYSCALL (rt_sigtimedwait_time64, 4, &ss, &si, NULL, +				   _NSIG / 8); +#else        int result = INLINE_SYSCALL (rt_sigtimedwait, 4, &ss, &si, NULL,  				   _NSIG / 8); +#endif        LIBC_CANCEL_RESET (oldtype); @@ -164,7 +169,7 @@ __start_helper_thread (void)       and should go away automatically when canceled.  */    pthread_attr_t attr;    (void) pthread_attr_init (&attr); -  (void) pthread_attr_setstacksize (&attr, PTHREAD_STACK_MIN); +  (void) pthread_attr_setstacksize (&attr, __pthread_get_minstack (&attr));    /* Block all signals in the helper thread but SIGSETXID.  To do this       thoroughly we temporarily have to block all signals here.  The diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/timer_settime.c b/libpthread/nptl/sysdeps/unix/sysv/linux/timer_settime.c index 81a0fa568..fca839d64 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/timer_settime.c +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/timer_settime.c @@ -23,8 +23,11 @@  #include <bits/kernel-features.h>  #include "kernel-posix-timers.h" +#if defined(__UCLIBC_USE_TIME64__) +#include "internal/time64_helpers.h" +#endif -#ifdef __NR_timer_settime +#if defined(__NR_timer_settime) || defined(__NR_timer_settime64)  # ifndef __ASSUME_POSIX_TIMERS  static int compat_timer_settime (timer_t timerid, int flags,  				 const struct itimerspec *value, @@ -54,8 +57,13 @@ timer_settime (        struct timer *kt = (struct timer *) timerid;        /* Delete the kernel timer object.  */ +# if defined(__UCLIBC_USE_TIME64__) && defined(__NR_timer_settime64) +      int res = INLINE_SYSCALL (timer_settime64, 4, kt->ktimerid, flags, +				TO_ITS64_P(value), ovalue); +# else        int res = INLINE_SYSCALL (timer_settime, 4, kt->ktimerid, flags,  				value, ovalue); +# endif  # ifndef __ASSUME_POSIX_TIMERS        if (res != -1 || errno != ENOSYS) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/Makefile.arch index 6f1734871..a3719a3fb 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/Makefile.arch +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/Makefile.arch @@ -9,3 +9,5 @@ CFLAGS-OMIT-fork.c = -DNOT_IN_libc -DIS_IN_libpthread  ASFLAGS-syscall.S = -D_LIBC_REENTRANT  ASFLAGS-mmap.S = -D_LIBC_REENTRANT + +ASFLAGS += -DUSE___THREAD diff --git a/libpthread/nptl/sysdeps/x86_64/dl-tls.h b/libpthread/nptl/sysdeps/x86_64/dl-tls.h index d6c338cda..5cac55f33 100644 --- a/libpthread/nptl/sysdeps/x86_64/dl-tls.h +++ b/libpthread/nptl/sysdeps/x86_64/dl-tls.h @@ -26,3 +26,6 @@ typedef struct  extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed.  */ +#define TLS_DTV_UNALLOCATED	((void *) -1l) diff --git a/libpthread/nptl/sysdeps/x86_64/pthreaddef.h b/libpthread/nptl/sysdeps/x86_64/pthreaddef.h index 2b2285285..98ab8cfb1 100644 --- a/libpthread/nptl/sysdeps/x86_64/pthreaddef.h +++ b/libpthread/nptl/sysdeps/x86_64/pthreaddef.h @@ -16,9 +16,6 @@     License along with the GNU C Library; if not, see     <http://www.gnu.org/licenses/>.  */ -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  SSE requires 16     bytes.  */  #define STACK_ALIGN		16 diff --git a/libpthread/nptl/sysdeps/x86_64/tls.h b/libpthread/nptl/sysdeps/x86_64/tls.h index d8b82ede9..41b3c3bf6 100644 --- a/libpthread/nptl/sysdeps/x86_64/tls.h +++ b/libpthread/nptl/sysdeps/x86_64/tls.h @@ -58,7 +58,7 @@ typedef struct  # ifndef __ASSUME_PRIVATE_FUTEX    int private_futex;  # else -  int __unused1; +  int __uclibc_unused1;  # endif  # if __WORDSIZE == 64    int rtld_must_xmm_save; @@ -66,7 +66,7 @@ typedef struct    /* Reservation of some values for the TM ABI.  */    void *__private_tm[5];  # if __WORDSIZE == 64 -  long int __unused2; +  long int __uclibc_unused2;    /* Have space for the post-AVX register size.  */    __m128 rtld_savespace_sse[8][4]; diff --git a/libpthread/nptl/sysdeps/xtensa/dl-tls.h b/libpthread/nptl/sysdeps/xtensa/dl-tls.h index adc02d74a..dfc91753e 100644 --- a/libpthread/nptl/sysdeps/xtensa/dl-tls.h +++ b/libpthread/nptl/sysdeps/xtensa/dl-tls.h @@ -28,6 +28,29 @@ typedef struct  extern void *__tls_get_addr (tls_index *ti); +/* Type used as the argument in a TLS descriptor for a symbol that +   needs dynamic TLS offsets.  */ +struct tlsdesc_dynamic_arg +{ +  tls_index tlsinfo; +  size_t gen_count; +}; + +#ifdef __FDPIC__ +/* Type used to represent a TLS descriptor.  */ +struct tlsdesc +{ +  ptrdiff_t (*entry)(struct tlsdesc *); +  void *argument; +}; + +extern ptrdiff_t attribute_hidden +  _dl_tlsdesc_return(struct tlsdesc *); + +extern void *_dl_make_tlsdesc_dynamic (struct link_map *map, size_t ti_offset); +extern ptrdiff_t attribute_hidden +  _dl_tlsdesc_dynamic(struct tlsdesc *); +#else  /* Type used to represent a TLS descriptor.  */  struct tlsdesc  { @@ -39,19 +62,14 @@ struct tlsdesc    ptrdiff_t (*entry)(struct tlsdesc *);  }; -/* Type used as the argument in a TLS descriptor for a symbol that -   needs dynamic TLS offsets.  */ -struct tlsdesc_dynamic_arg -{ -  tls_index tlsinfo; -  size_t gen_count; -}; -  extern ptrdiff_t attribute_hidden    _dl_tlsdesc_return(struct tlsdesc_dynamic_arg *);  extern void *_dl_make_tlsdesc_dynamic (struct link_map *map, size_t ti_offset);  extern ptrdiff_t attribute_hidden    _dl_tlsdesc_dynamic(struct tlsdesc_dynamic_arg *); -  #endif +#endif + +/* Value used for dtv entries for which the allocation is delayed.  */ +#define TLS_DTV_UNALLOCATED    ((void *) -1l) diff --git a/libpthread/nptl/sysdeps/xtensa/pthread_spin_lock.S b/libpthread/nptl/sysdeps/xtensa/pthread_spin_lock.S index 3386afae9..3faac36da 100644 --- a/libpthread/nptl/sysdeps/xtensa/pthread_spin_lock.S +++ b/libpthread/nptl/sysdeps/xtensa/pthread_spin_lock.S @@ -15,16 +15,32 @@     License along with the GNU C Library; see the file COPYING.LIB.  If     not, see <http://www.gnu.org/licenses/>.  */ +#include <bits/xtensa-config.h>  #include <sysdep.h>  	.text  ENTRY (pthread_spin_lock) +#if XCHAL_HAVE_EXCLUSIVE +	memw +1:	l32ex	a3, a2 +	bnez	a3, 1b +	movi	a3, 1 +	s32ex	a3, a2 +	getex	a3 +	beqz	a3, 1b +	memw +#elif XCHAL_HAVE_S32C1I  	movi	a3, 0  	wsr 	a3, scompare1  	movi	a3, 1  1:	s32c1i	a3, a2, 0  	bnez	a3, 1b +#else + +#error No hardware atomic operations + +#endif  	movi	a2, 0  	abi_ret diff --git a/libpthread/nptl/sysdeps/xtensa/pthread_spin_trylock.S b/libpthread/nptl/sysdeps/xtensa/pthread_spin_trylock.S index 72b2dda92..0669682ec 100644 --- a/libpthread/nptl/sysdeps/xtensa/pthread_spin_trylock.S +++ b/libpthread/nptl/sysdeps/xtensa/pthread_spin_trylock.S @@ -17,15 +17,32 @@  #define _ERRNO_H 1  #include <bits/errno.h> +#include <bits/xtensa-config.h>  #include <sysdep.h>  	.text  ENTRY (pthread_spin_trylock) +#if XCHAL_HAVE_EXCLUSIVE +	memw +	l32ex	a3, a2 +	bnez	a3, 1f +	movi	a3, 1 +	s32ex	a3, a2 +	getex	a3 +	addi	a3, a3, -1 +	memw +1: +#elif XCHAL_HAVE_S32C1I  	movi	a3, 0  	wsr 	a3, scompare1  	movi	a3, 1  	s32c1i	a3, a2, 0 +#else + +#error No hardware atomic operations + +#endif  	movi	a2, EBUSY  	moveqz	a2, a3, a3 diff --git a/libpthread/nptl/sysdeps/xtensa/pthreaddef.h b/libpthread/nptl/sysdeps/xtensa/pthreaddef.h index 34c1851c3..13d8fef4c 100644 --- a/libpthread/nptl/sysdeps/xtensa/pthreaddef.h +++ b/libpthread/nptl/sysdeps/xtensa/pthreaddef.h @@ -15,9 +15,6 @@     License along with the GNU C Library; see the file COPYING.LIB.  If     not, see <http://www.gnu.org/licenses/>.  */ -/* Default stack size.  */ -#define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024) -  /* Required stack pointer alignment at beginning.  */  #define STACK_ALIGN		16 | 
