diff options
Diffstat (limited to 'libpthread/linuxthreads/sysdeps/sh')
| -rw-r--r-- | libpthread/linuxthreads/sysdeps/sh/pspinlock.c | 79 | ||||
| -rw-r--r-- | libpthread/linuxthreads/sysdeps/sh/tcb-offsets.sym | 10 | ||||
| -rw-r--r-- | libpthread/linuxthreads/sysdeps/sh/tls.h | 140 | 
3 files changed, 49 insertions, 180 deletions
| diff --git a/libpthread/linuxthreads/sysdeps/sh/pspinlock.c b/libpthread/linuxthreads/sysdeps/sh/pspinlock.c deleted file mode 100644 index 2f039de53..000000000 --- a/libpthread/linuxthreads/sysdeps/sh/pspinlock.c +++ /dev/null @@ -1,79 +0,0 @@ -/* POSIX spinlock implementation.  SH version. -   Copyright (C) 2000, 2001 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; see the file COPYING.LIB.  If -   not, see <http://www.gnu.org/licenses/>.  */ - -#include <errno.h> -#include <pthread.h> -#include "internals.h" - -int -__pthread_spin_lock (pthread_spinlock_t *lock) -{ -  unsigned int val; - -  do -    __asm__ __volatile__ ("tas.b @%1; movt %0" -		  : "=r" (val) -		  : "r" (lock) -		  : "memory"); -  while (val == 0); - -  return 0; -} -weak_alias (__pthread_spin_lock, pthread_spin_lock) - - -int -__pthread_spin_trylock (pthread_spinlock_t *lock) -{ -  unsigned int val; - -  __asm__ __volatile__ ("tas.b @%1; movt %0" -		: "=r" (val) -		: "r" (lock) -		: "memory"); -  return val ? 0 : EBUSY; -} -weak_alias (__pthread_spin_trylock, pthread_spin_trylock) - - -int -__pthread_spin_unlock (pthread_spinlock_t *lock) -{ -  return *lock = 0; -} -weak_alias (__pthread_spin_unlock, pthread_spin_unlock) - - -int -__pthread_spin_init (pthread_spinlock_t *lock, int pshared) -{ -  /* We can ignore the `pshared' parameter.  Since we are busy-waiting -     all processes which can access the memory location `lock' points -     to can use the spinlock.  */ -  return *lock = 0; -} -weak_alias (__pthread_spin_init, pthread_spin_init) - - -int -__pthread_spin_destroy (pthread_spinlock_t *lock) -{ -  /* Nothing to do.  */ -  return 0; -} -weak_alias (__pthread_spin_destroy, pthread_spin_destroy) diff --git a/libpthread/linuxthreads/sysdeps/sh/tcb-offsets.sym b/libpthread/linuxthreads/sysdeps/sh/tcb-offsets.sym deleted file mode 100644 index 6324a016c..000000000 --- a/libpthread/linuxthreads/sysdeps/sh/tcb-offsets.sym +++ /dev/null @@ -1,10 +0,0 @@ -#include <sysdep.h> -#include <tls.h> - --- -#ifdef __UCLIBC_HAS_TLS__ -MULTIPLE_THREADS_OFFSET offsetof (struct _pthread_descr_struct, p_multiple_threads) -TLS_PRE_TCB_SIZE	sizeof (struct _pthread_descr_struct) -#else -MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads) -#endif diff --git a/libpthread/linuxthreads/sysdeps/sh/tls.h b/libpthread/linuxthreads/sysdeps/sh/tls.h index 512e3181e..25bef830f 100644 --- a/libpthread/linuxthreads/sysdeps/sh/tls.h +++ b/libpthread/linuxthreads/sysdeps/sh/tls.h @@ -30,129 +30,87 @@  typedef union dtv  {    size_t counter; -  struct -  { -    void *val; -    bool is_static; -  } pointer; +  void *pointer;  } dtv_t; -#else /* __ASSEMBLER__ */ -# include <tcb-offsets.h> -#endif /* __ASSEMBLER__ */ + +typedef struct +{ +  void *tcb;		/* Pointer to the TCB.  Not necessary the +			   thread descriptor used by libpthread.  */ +  dtv_t *dtv; +  void *self;		/* Pointer to the thread descriptor.  */ +} tcbhead_t;  /* We can support TLS only if the floating-stack support is available.  */ -#if defined HAVE_TLS_SUPPORT \ -    && (defined FLOATING_STACKS || !defined IS_IN_libpthread) +#if defined FLOATING_STACKS && defined HAVE_TLS_SUPPORT -/* Signal that TLS support is available.  */ -# define USE_TLS	1 +/* Get system call information.  */ +# include <sysdep.h> -/* Include padding in _pthread_descr_struct so that libc can find p_errno, -   if libpthread will only include the padding because of the !IS_IN_libpthread -   check.  */ -#ifndef FLOATING_STACKS -# define INCLUDE_TLS_PADDING	1 -#endif +/* Signal that TLS support is available.  */ +//# define USE_TLS	1 -# ifndef __ASSEMBLER__ -typedef struct -{ -  dtv_t *dtv; -  void *private; -} tcbhead_t; +/* Get the thread descriptor definition.  */ +# include <linuxthreads/descr.h>  /* This is the size of the initial TCB.  */ -#  define TLS_INIT_TCB_SIZE sizeof (tcbhead_t) +# define TLS_INIT_TCB_SIZE sizeof (tcbhead_t)  /* Alignment requirements for the initial TCB.  */ -#  define TLS_INIT_TCB_ALIGN __alignof__ (tcbhead_t) +# 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_descr_struct) +# define TLS_TCB_SIZE sizeof (struct _pthread_descr_struct)  /* Alignment requirements for the TCB.  */ -#  define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct) +# define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)  /* The TLS blocks start right after the TCB.  */ -#  define TLS_DTV_AT_TP	1 +# define TLS_DTV_AT_TP	1 +  /* 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 +# define INSTALL_DTV(descr, dtvp) \ +  ((tcbhead_t *) (descr))->dtv = dtvp + 1  /* Install new dtv for current thread.  */ -#  define INSTALL_NEW_DTV(dtv) \ -  ({ tcbhead_t *__tcbp;							      \ -     __asm__ __volatile__ ("stc gbr,%0" : "=r" (__tcbp));			      \ -     __tcbp->dtv = (dtv);}) +# define INSTALL_NEW_DTV(dtv) \ +  ({ struct _pthread_descr_struct *__descr;				      \ +     THREAD_SETMEM (__descr, p_header.data.dtvp, (dtv)); })  /* Return dtv of given thread descriptor.  */ -#  define GET_DTV(tcbp) \ -  (((tcbhead_t *) (tcbp))->dtv) +# define GET_DTV(descr) \ +  (((tcbhead_t *) (descr))->dtv)  /* Code to initially initialize the thread pointer.  This might need     special attention since 'errno' is not yet available and if the     operation can cause a failure 'errno' must not be touched.  */ -#  define TLS_INIT_TP(tcbp, secondcall) \ -  ({ __asm__ __volatile__ ("ldc %0,gbr" : : "r" (tcbp)); 0; }) - -/* Return the address of the dtv for the current thread.  */ -#  define THREAD_DTV() \ -  ({ tcbhead_t *__tcbp;							      \ -     __asm__ __volatile__ ("stc gbr,%0" : "=r" (__tcbp));			      \ -     __tcbp->dtv;}) +# define TLS_INIT_TP(descr, secondcall) \ +  ({									      \ +    void *_descr = (descr);						      \ +    int result;								      \ +    tcbhead_t *head = _descr;						      \ +									      \ +    head->tcb = _descr;							      \ +    /* For now the thread descriptor is at the same address.  */	      \ +    head->self = _descr;						      \ +									      \ +    __asm__ ("ldc %0,gbr" : : "r" (_descr));				      \ +									      \ +    0;									      \ +  }) -/* Return the thread descriptor for the current thread.  */ -#  undef THREAD_SELF -#  define THREAD_SELF \ -  ({ struct _pthread_descr_struct *__self;				      \ -     __asm__ ("stc gbr,%0" : "=r" (__self));				      \ -     __self - 1;}) -#  undef INIT_THREAD_SELF -#  define INIT_THREAD_SELF(descr, nr) \ -  ({ struct _pthread_descr_struct *__self = (void *) descr;		      \ -     __asm__ __volatile__ ("ldc %0,gbr" : : "r" (__self + 1));		      \ -     0; }) - -# define TLS_MULTIPLE_THREADS_IN_TCB 1 - -/* Get the thread descriptor definition.  This must be after the -   the definition of THREAD_SELF for TLS.  */ -#  include <linuxthreads/descr.h> - -# endif /* __ASSEMBLER__ */ - -#else - -# ifndef __ASSEMBLER__ - -typedef struct -{ -  void *tcb; -  dtv_t *dtv; -  void *self; -  int multiple_threads; -} tcbhead_t; - -/* Get the thread descriptor definition.  */ -#  include <linuxthreads/descr.h> - -#  define NONTLS_INIT_TP \ -  do { 									\ -    static const tcbhead_t nontls_init_tp = { .multiple_threads = 0 };	\ -    __asm__ __volatile__ ("ldc %0,gbr" : : "r" (&nontls_init_tp));	        \ -  } while (0) - -# endif /* __ASSEMBLER__ */ +/* Return the address of the dtv for the current thread.  */ +# define THREAD_DTV() \ +  ({ struct _pthread_descr_struct *__descr;				      \ +     THREAD_GETMEM (__descr, p_header.data.dtvp); }) -#endif	/* HAVE_TLS_SUPPORT && (FLOATING_STACKS || !IS_IN_libpthread) */ +#endif	/* FLOATING_STACKS && HAVE_TLS_SUPPORT */ +#endif /* __ASSEMBLER__ */  #endif	/* tls.h */ | 
