diff options
| author | Waldemar Brodkorb <wbx@openadk.org> | 2015-02-14 23:04:02 -0600 | 
|---|---|---|
| committer | Waldemar Brodkorb <wbx@openadk.org> | 2015-02-14 23:04:02 -0600 | 
| commit | e1e46622ac0fce73d802fa4a8a2e83cc25cd9e7a (patch) | |
| tree | 2c8d14e4dcc733f4227f0984ed05da5826b13acd /libpthread/linuxthreads/sysdeps/sparc | |
| parent | 6b6ede3d15f04fe825cfa9f697507457e3640344 (diff) | |
Revert "resolve merge"
This reverts commit 6b6ede3d15f04fe825cfa9f697507457e3640344.
Diffstat (limited to 'libpthread/linuxthreads/sysdeps/sparc')
| -rw-r--r-- | libpthread/linuxthreads/sysdeps/sparc/pspinlock.c | 87 | ||||
| -rw-r--r-- | libpthread/linuxthreads/sysdeps/sparc/tcb-offsets.h | 1 | ||||
| -rw-r--r-- | libpthread/linuxthreads/sysdeps/sparc/tcb-offsets.sym | 4 | ||||
| -rw-r--r-- | libpthread/linuxthreads/sysdeps/sparc/tls.h | 114 | 
4 files changed, 205 insertions, 1 deletions
| diff --git a/libpthread/linuxthreads/sysdeps/sparc/pspinlock.c b/libpthread/linuxthreads/sysdeps/sparc/pspinlock.c new file mode 100644 index 000000000..4de152be3 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/pspinlock.c @@ -0,0 +1,87 @@ +/* POSIX spinlock implementation.  SPARC32 version. +   Copyright (C) 2000 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" + +/* This implementation is similar to the one used in the Linux kernel.  */ +int +__pthread_spin_lock (pthread_spinlock_t *lock) +{ +  __asm__ __volatile__ +    ("1: ldstub [%0], %%g2\n" +     "   orcc   %%g2, 0x0, %%g0\n" +     "   bne,a  2f\n" +     "   ldub   [%0], %%g2\n" +     ".subsection 2\n" +     "2: orcc   %%g2, 0x0, %%g0\n" +     "   bne,a  2b\n" +     "   ldub   [%0], %%g2\n" +     "   b,a    1b\n" +     ".previous" +     : /* no outputs */ +     : "r" (lock) +     : "g2", "memory", "cc"); +  return 0; +} +weak_alias (__pthread_spin_lock, pthread_spin_lock) + + +int +__pthread_spin_trylock (pthread_spinlock_t *lock) +{ +  int result; +  __asm__ __volatile__ +    ("ldstub [%1], %0" +     : "=r" (result) +     : "r" (lock) +     : "memory"); +  return result == 0 ? 0 : EBUSY; +} +weak_alias (__pthread_spin_trylock, pthread_spin_trylock) + + +int +__pthread_spin_unlock (pthread_spinlock_t *lock) +{ +  *lock = 0; +  return 0; +} +weak_alias (__pthread_spin_unlock, pthread_spin_unlock) + + +int +__pthread_spin_init (pthread_spinlock_t *lock, int pshared) +{ +  /* We can ignore the `pshared' parameter.  Since we are busy-waiting +     all processes which can access the memory location `lock' points +     to can use the spinlock.  */ +  *lock = 0; +  return 0; +} +weak_alias (__pthread_spin_init, pthread_spin_init) + + +int +__pthread_spin_destroy (pthread_spinlock_t *lock) +{ +  /* Nothing to do.  */ +  return 0; +} +weak_alias (__pthread_spin_destroy, pthread_spin_destroy) diff --git a/libpthread/linuxthreads/sysdeps/sparc/tcb-offsets.h b/libpthread/linuxthreads/sysdeps/sparc/tcb-offsets.h deleted file mode 100644 index 6d6f111f4..000000000 --- a/libpthread/linuxthreads/sysdeps/sparc/tcb-offsets.h +++ /dev/null @@ -1 +0,0 @@ -#include "../../../linuxthreads/sysdeps/pthread/tcb-offsets.h" diff --git a/libpthread/linuxthreads/sysdeps/sparc/tcb-offsets.sym b/libpthread/linuxthreads/sysdeps/sparc/tcb-offsets.sym new file mode 100644 index 000000000..aee6be257 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/tcb-offsets.sym @@ -0,0 +1,4 @@ +#include <sysdep.h> +#include <tls.h> + +MULTIPLE_THREADS_OFFSET		offsetof (tcbhead_t, multiple_threads) diff --git a/libpthread/linuxthreads/sysdeps/sparc/tls.h b/libpthread/linuxthreads/sysdeps/sparc/tls.h new file mode 100644 index 000000000..1e31c2e63 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/tls.h @@ -0,0 +1,114 @@ +/* Definitions for thread-local data handling.  linuxthreads/sparc version. +   Copyright (C) 2002, 2003, 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/>.  */ + +#ifndef _TLS_H +#define _TLS_H + +#ifndef __ASSEMBLER__ + +# include <pt-machine.h> +# include <stdbool.h> +# include <stddef.h> + +/* Type for the dtv.  */ +typedef union dtv +{ +  size_t counter; +  struct +  { +    void *val; +    bool is_static; +  } pointer; +} dtv_t; + +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.  */ +  int multiple_threads; +} tcbhead_t; + +#else /* __ASSEMBLER__ */ +# include <tcb-offsets.h> +#endif /* __ASSEMBLER__ */ + +#ifdef HAVE_TLS_SUPPORT + +/* Signal that TLS support is available.  */ +# define USE_TLS	1 + +# ifndef __ASSEMBLER__ +/* Get system call information.  */ +#  include <sysdep.h> + +/* 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) + +/* 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 (struct _pthread_descr_struct) + +/* Alignment requirements for the TCB.  */ +#  define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct) + +/* The TCB can have any size and the memory following the address the +   thread pointer points to is unspecified.  Allocate the TCB there.  */ +#  define TLS_TCB_AT_TP	1 + +/* Install the dtv pointer.  The pointer passed is to the element with +   index -1 which contain the length.  */ +#  define INSTALL_DTV(descr, dtvp) \ +  ((tcbhead_t *) (descr))->dtv = (dtvp) + 1 + +/* Install new dtv for current thread.  */ +#  define INSTALL_NEW_DTV(DTV) \ +  (((tcbhead_t *) __thread_self)->dtv = (DTV)) + +/* Return dtv of given thread descriptor.  */ +#  define GET_DTV(descr) \ +  (((tcbhead_t *) (descr))->dtv) + +/* Code to initially initialize the thread pointer.  */ +# define TLS_INIT_TP(descr, secondcall) \ +  (__thread_self = (__typeof (__thread_self)) (descr), NULL) + +/* Return the address of the dtv for the current thread.  */ +#  define THREAD_DTV() \ +  (((tcbhead_t *) __thread_self)->dtv) + +# endif + +#else + +# define NONTLS_INIT_TP \ +  do {									      \ +    static const tcbhead_t nontls_init_tp				      \ +      = { .multiple_threads = 0 };					      \ +    __thread_self = (__typeof (__thread_self)) &nontls_init_tp;		      \ +  } while (0) + +#endif /* USE_TLS */ + +#endif	/* tls.h */ | 
