diff options
Diffstat (limited to 'libpthread/linuxthreads/sysdeps/mips')
| -rw-r--r-- | libpthread/linuxthreads/sysdeps/mips/pspinlock.c | 95 | ||||
| -rw-r--r-- | libpthread/linuxthreads/sysdeps/mips/pt-machine.h | 41 | ||||
| -rw-r--r-- | libpthread/linuxthreads/sysdeps/mips/tls.h | 169 | 
3 files changed, 29 insertions, 276 deletions
| diff --git a/libpthread/linuxthreads/sysdeps/mips/pspinlock.c b/libpthread/linuxthreads/sysdeps/mips/pspinlock.c deleted file mode 100644 index 7b9205ef0..000000000 --- a/libpthread/linuxthreads/sysdeps/mips/pspinlock.c +++ /dev/null @@ -1,95 +0,0 @@ -/* POSIX spinlock implementation.  MIPS version. -   Copyright (C) 2000, 2002, 2003, 2004 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 <sgidefs.h> -#include <sys/tas.h> -#include "internals.h" - -/* This implementation is similar to the one used in the Linux kernel.  */ -int -__pthread_spin_lock (pthread_spinlock_t *lock) -{ -  unsigned int tmp1, tmp2; - -  __asm__ __volatile__ -    ("\t\t\t# spin_lock\n" -     "1:\n\t" -     ".set	push\n\t" -#if _MIPS_SIM == _ABIO32 -     ".set	mips2\n\t" -#endif -     "ll	%1,%3\n\t" -     "li	%2,1\n\t" -     "bnez	%1,1b\n\t" -     "sc	%2,%0\n\t" -     ".set	pop\n\t" -     "beqz	%2,1b" -     : "=m" (*lock), "=&r" (tmp1), "=&r" (tmp2) -     : "m" (*lock) -     : "memory"); - -  return 0; -} - -weak_alias (__pthread_spin_lock, pthread_spin_lock) - - -int -__pthread_spin_trylock (pthread_spinlock_t *lock) -{ -  /* To be done.  */ -  return 0; -} -weak_alias (__pthread_spin_trylock, pthread_spin_trylock) - - -int -__pthread_spin_unlock (pthread_spinlock_t *lock) -{ -  __asm__ __volatile__ -    ("\t\t\t# spin_unlock\n\t" -     "sw	$0,%0" -     : "=m" (*lock) -     : -     : "memory"); -  return 0; -} -weak_alias (__pthread_spin_unlock, pthread_spin_unlock) - - -int -__pthread_spin_init (pthread_spinlock_t *lock, int pshared) -{ -  /* We can ignore the `pshared' parameter.  Since we are busy-waiting -     all processes which can access the memory location `lock' points -     to can use the spinlock.  */ -  *lock = 0; -  return 0; -} -weak_alias (__pthread_spin_init, pthread_spin_init) - - -int -__pthread_spin_destroy (pthread_spinlock_t *lock) -{ -  /* Nothing to do.  */ -  return 0; -} -weak_alias (__pthread_spin_destroy, pthread_spin_destroy) diff --git a/libpthread/linuxthreads/sysdeps/mips/pt-machine.h b/libpthread/linuxthreads/sysdeps/mips/pt-machine.h index 74e8807eb..caaf9a7c0 100644 --- a/libpthread/linuxthreads/sysdeps/mips/pt-machine.h +++ b/libpthread/linuxthreads/sysdeps/mips/pt-machine.h @@ -24,13 +24,40 @@  #define _PT_MACHINE_H   1  #include <features.h> -#include <sgidefs.h> -#include <sys/tas.h>  #ifndef PT_EI  # define PT_EI __extern_always_inline  #endif +/* Copyright (C) 2000, 2002 Free Software Foundation, Inc. +   This file is part of the GNU C Library. +   Contributed by Maciej W. Rozycki <macro@ds2.pg.gda.pl>, 2000.  */ +static __inline__ int +__NTH (_test_and_set (int *p, int v)) +{ +  int r, t; + +  __asm__ __volatile__ +    ("/* Inline test and set */\n" +     "1:\n\t" +     ".set	push\n\t" +     ".set	mips2\n\t" +     "ll	%0,%3\n\t" +     "move	%1,%4\n\t" +     "beq	%0,%4,2f\n\t" +     "sc	%1,%2\n\t" +     ".set	pop\n\t" +     "beqz	%1,1b\n" +     "2:\n\t" +     "/* End test and set */" +     : "=&r" (r), "=&r" (t), "=m" (*p) +     : "m" (*p), "r" (v) +     : "memory"); + +  return r; +} + +  /* Spinlock implementation; required.  */  PT_EI long int @@ -58,22 +85,12 @@ __compare_and_swap (long int *p, long int oldval, long int newval)      ("/* Inline compare & swap */\n"       "1:\n\t"       ".set	push\n\t" -#if _MIPS_SIM == _ABIO32       ".set	mips2\n\t" -#endif -#if _MIPS_SIM == _ABI64 -     "lld	%1,%5\n\t" -#else       "ll	%1,%5\n\t" -#endif       "move	%0,$0\n\t"       "bne	%1,%3,2f\n\t"       "move	%0,%4\n\t" -#if _MIPS_SIM == _ABI64 -     "scd	%0,%2\n\t" -#else       "sc	%0,%2\n\t" -#endif       ".set	pop\n\t"       "beqz	%0,1b\n"       "2:\n\t" diff --git a/libpthread/linuxthreads/sysdeps/mips/tls.h b/libpthread/linuxthreads/sysdeps/mips/tls.h deleted file mode 100644 index 4e7887a74..000000000 --- a/libpthread/linuxthreads/sysdeps/mips/tls.h +++ /dev/null @@ -1,169 +0,0 @@ -/* Definitions for thread-local data handling.  linuxthreads/MIPS version. -   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/>.  */ - -#ifndef _TLS_H -#define _TLS_H - -#ifndef __ASSEMBLER__ - -# include <stdbool.h> -# include <pt-machine.h> -# include <stddef.h> - -/* Type for the dtv.  */ -typedef union dtv -{ -  size_t counter; -  struct -  { -    void *val; -    bool is_static; -  } pointer; -} dtv_t; - -# define READ_THREAD_POINTER() \ -    ({ void *__result;							      \ -       __asm__ __volatile__ (".set\tpush\n\t.set\tmips32r2\n\t"			      \ -		     "rdhwr\t%0, $29\n\t.set\tpop" : "=v" (__result));	      \ -       __result; }) - -#else /* __ASSEMBLER__ */ -# include <tcb-offsets.h> - -/* Note: rd must be $v1 to be ABI-conformant.  */ -# define READ_THREAD_POINTER(rd) \ -	.set	push;							      \ -	.set	mips32r2;						      \ -	rdhwr	rd, $29;						      \ -	.set	pop -#endif /* __ASSEMBLER__ */ - -/* LinuxThreads can only use TLS if both floating stacks (in the MIPS case, -   that means support for "rdhwr") and support from the tools are available. - -   We have to define USE_TLS consistently, or ldsodefs.h will lay out types -   differently between an NPTL build and a LinuxThreads build.  It can be set -   for libc.so and not libpthread.so, but only if we provide appropriate padding -   in the _pthread_descr_struct. - -   Currently nothing defines FLOATING_STACKS.  We could assume this based on -   kernel version once the TLS patches are available in kernel.org, but -   it hardly seems worth it.  Use NPTL if you can. - -   To avoid bothering with the TLS support code at all, use configure -   --without-tls.  */ - -#if defined HAVE_TLS_SUPPORT \ -    && (defined FLOATING_STACKS || !defined IS_IN_libpthread) - -/* Signal that TLS support is available.  */ -# define USE_TLS	1 - -/* 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 - -# ifndef __ASSEMBLER__ - -/* This layout is actually wholly private and not affected by the ABI. -   Nor does it overlap the pthread data structure, so we need nothing -   extra here at all.  */ -typedef struct -{ -  dtv_t *dtv; -  void *private; -} tcbhead_t; - -/* This is the size of the initial TCB.  */ -#  define TLS_INIT_TCB_SIZE	0 - -/* Alignment requirements for the initial TCB.  */ -#  define TLS_INIT_TCB_ALIGN	__alignof__ (struct _pthread_descr_struct) - -/* This is the size of the TCB.  */ -#  define TLS_TCB_SIZE		0 - -/* Alignment requirements for the TCB.  */ -#  define TLS_TCB_ALIGN		__alignof__ (struct _pthread_descr_struct) - -/* This is the size we need before TCB.  */ -#  define TLS_PRE_TCB_SIZE \ -  (sizeof (struct _pthread_descr_struct)				      \ -   + ((sizeof (tcbhead_t) + TLS_TCB_ALIGN - 1) & ~(TLS_TCB_ALIGN - 1))) - -/* The thread pointer (in hardware register $29) points to the end of -   the TCB + 0x7000, as for PowerPC.  The pthread_descr structure is -   immediately in front of the TCB.  */ -#define TLS_TCB_OFFSET		0x7000 - -/* The DTV is allocated at the TP; the TCB is placed elsewhere.  */ -/* This is not really true for powerpc64.  We are following alpha -   where the DTV pointer is first doubleword in the TCB.  */ -#  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))[-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.  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) \ -  ({ INTERNAL_SYSCALL_DECL (err);					\ -     long result_var;							\ -     result_var = INTERNAL_SYSCALL (set_thread_area, err, 1,		\ -				    (char *) (tcbp) + TLS_TCB_OFFSET);	\ -     INTERNAL_SYSCALL_ERROR_P (result_var, err)				\ -       ? "unknown error" : 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.  */ -#  undef THREAD_SELF -#  define THREAD_SELF \ -    ((pthread_descr) (READ_THREAD_POINTER () \ -		      - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE)) - -/* Get the thread descriptor definition.  */ -#  include <linuxthreads/descr.h> - -/* l_tls_offset == 0 is perfectly valid on MIPS, so we have to use some -   different value to mean unset l_tls_offset.  */ -#  define NO_TLS_OFFSET	-1 - -/* Initializing the thread pointer requires a syscall which may not be -   available, so don't do it if we don't need to.  */ -#  define TLS_INIT_TP_EXPENSIVE 1 - -# endif /* __ASSEMBLER__ */ - -#endif /* HAVE_TLS_SUPPORT */ - -#endif	/* tls.h */ | 
