diff options
| author | Mike Frysinger <vapier@gentoo.org> | 2006-01-31 05:05:15 +0000 | 
|---|---|---|
| committer | Mike Frysinger <vapier@gentoo.org> | 2006-01-31 05:05:15 +0000 | 
| commit | cccc549ced940c85039c8ce263c8bb571f244afd (patch) | |
| tree | ef77a870db7211ad6f511867fc56ee1a1a8b4c18 /libpthread/linuxthreads/sysdeps/sparc | |
| parent | e73b1211737842732951f9b9049294ef732e1ef0 (diff) | |
initial import of latest linuxthreads
Diffstat (limited to 'libpthread/linuxthreads/sysdeps/sparc')
21 files changed, 627 insertions, 0 deletions
diff --git a/libpthread/linuxthreads/sysdeps/sparc/CVS/Entries b/libpthread/linuxthreads/sysdeps/sparc/CVS/Entries new file mode 100644 index 000000000..dbf9a96b1 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/CVS/Entries @@ -0,0 +1,5 @@ +D/sparc32//// +D/sparc64//// +/Makefile/1.1/Tue Nov 15 14:20:47 2005// +/tcb-offsets.sym/1.1/Tue Nov 15 14:20:47 2005// +/tls.h/1.4/Tue Nov 15 14:20:47 2005// diff --git a/libpthread/linuxthreads/sysdeps/sparc/CVS/Repository b/libpthread/linuxthreads/sysdeps/sparc/CVS/Repository new file mode 100644 index 000000000..575bd926d --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/CVS/Repository @@ -0,0 +1 @@ +ports/linuxthreads/sysdeps/sparc diff --git a/libpthread/linuxthreads/sysdeps/sparc/CVS/Root b/libpthread/linuxthreads/sysdeps/sparc/CVS/Root new file mode 100644 index 000000000..ca45c5d4d --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/CVS/Root @@ -0,0 +1 @@ +:pserver:anoncvs@sources.redhat.com:/cvs/glibc diff --git a/libpthread/linuxthreads/sysdeps/sparc/pspinlock.c b/libpthread/linuxthreads/sysdeps/sparc/pspinlock.c new file mode 100644 index 000000000..72a9af5b1 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/pspinlock.c @@ -0,0 +1,14 @@ +#include <features.h> +#include <bits/wordsize.h> + +#if __WORDSIZE == 32 + +# if defined(__CONFIG_SPARC_V9B__) +#  include "sparc32/sparcv9b/pspinlock.c" +# else +#  include "sparc32/pspinlock.c" +# endif + +#else +# include "sparc64/pspinlock.c" +#endif diff --git a/libpthread/linuxthreads/sysdeps/sparc/pt-machine.h b/libpthread/linuxthreads/sysdeps/sparc/pt-machine.h new file mode 100644 index 000000000..ab90810f1 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/pt-machine.h @@ -0,0 +1,8 @@ +#include <features.h> +#include <bits/wordsize.h> + +#if __WORDSIZE == 32 +# include "sparc32/pt-machine.h" +#else +# include "sparc64/pt-machine.h" +#endif diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc32/CVS/Entries b/libpthread/linuxthreads/sysdeps/sparc/sparc32/CVS/Entries new file mode 100644 index 000000000..eb2efbc9f --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/sparc32/CVS/Entries @@ -0,0 +1,3 @@ +D/sparcv9//// +/pspinlock.c/1.4/Tue Nov 15 14:20:47 2005// +/pt-machine.h/1.16/Tue Nov 15 14:20:47 2005// diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc32/CVS/Repository b/libpthread/linuxthreads/sysdeps/sparc/sparc32/CVS/Repository new file mode 100644 index 000000000..cfce5a35f --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/sparc32/CVS/Repository @@ -0,0 +1 @@ +ports/linuxthreads/sysdeps/sparc/sparc32 diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc32/CVS/Root b/libpthread/linuxthreads/sysdeps/sparc/sparc32/CVS/Root new file mode 100644 index 000000000..ca45c5d4d --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/sparc32/CVS/Root @@ -0,0 +1 @@ +:pserver:anoncvs@sources.redhat.com:/cvs/glibc diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc32/pspinlock.c b/libpthread/linuxthreads/sysdeps/sparc/sparc32/pspinlock.c new file mode 100644 index 000000000..a67dbf901 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/sparc32/pspinlock.c @@ -0,0 +1,88 @@ +/* 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, +   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +   Boston, MA 02111-1307, USA.  */ + +#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/sparc32/pt-machine.h b/libpthread/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h new file mode 100644 index 000000000..322a52051 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h @@ -0,0 +1,83 @@ +/* Machine-dependent pthreads configuration and inline functions. +   sparc version. +   Copyright (C) 1996-1998, 2000-2003 Free Software Foundation, Inc. +   This file is part of the GNU C Library. +   Contributed by Richard Henderson <rth@tamu.edu>. + +   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, +   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +   Boston, MA 02111-1307, USA.  */ + +#ifndef _PT_MACHINE_H +#define _PT_MACHINE_H   1 + +#ifndef PT_EI +# define PT_EI extern inline __attribute__ ((always_inline)) +#endif + +extern long int testandset (int *spinlock); +extern int __compare_and_swap (long int *p, long int oldval, long int newval); + +/* Spinlock implementation; required.  */ +PT_EI long int +testandset (int *spinlock) +{ +  int ret; + +  __asm__ __volatile__("ldstub %1,%0" +	: "=r"(ret), "=m"(*spinlock) +	: "m"(*spinlock)); + +  return ret; +} + + +/* Memory barrier; default is to do nothing */ +#define MEMORY_BARRIER() __asm__ __volatile__("stbar" : : : "memory") + + +/* Get some notion of the current stack.  Need not be exactly the top +   of the stack, just something somewhere in the current frame.  */ +#define CURRENT_STACK_FRAME  (stack_pointer + (2 * 64)) +register char *stack_pointer __asm__("%sp"); + + +/* Registers %g6 and %g7 are reserved by the ABI for "system use". +   %g7 is specified in the TLS ABI as thread pointer -- we do the same.  */ +struct _pthread_descr_struct; +register struct _pthread_descr_struct *__thread_self __asm__("%g7"); + +/* Return the thread descriptor for the current thread.  */ +#define THREAD_SELF  __thread_self + +/* Initialize the thread-unique value.  */ +#define INIT_THREAD_SELF(descr, nr)  (__thread_self = (descr)) + +/* Access to data in the thread descriptor is easy.  */ +#define THREAD_GETMEM(descr, member) \ +  ((void) sizeof (descr), THREAD_SELF->member) +#define THREAD_GETMEM_NC(descr, member) \ +  ((void) sizeof (descr), THREAD_SELF->member) +#define THREAD_SETMEM(descr, member, value) \ +  ((void) sizeof (descr), THREAD_SELF->member = (value)) +#define THREAD_SETMEM_NC(descr, member, value) \ +  ((void) sizeof (descr), THREAD_SELF->member = (value)) + +/* We want the OS to assign stack addresses.  */ +#define FLOATING_STACKS 1 + +/* Maximum size of the stack if the rlimit is unlimited.  */ +#define ARCH_STACK_MAX_SIZE     8*1024*1024 + +#endif /* pt-machine.h */ diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/CVS/Entries b/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/CVS/Entries new file mode 100644 index 000000000..6a76bc542 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/CVS/Entries @@ -0,0 +1,3 @@ +/Versions/1.1/Tue Nov 15 14:20:47 2005// +/pspinlock.c/1.4/Tue Nov 15 14:20:47 2005// +D diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/CVS/Repository b/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/CVS/Repository new file mode 100644 index 000000000..73a5bbb95 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/CVS/Repository @@ -0,0 +1 @@ +ports/linuxthreads/sysdeps/sparc/sparc32/sparcv9 diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/CVS/Root b/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/CVS/Root new file mode 100644 index 000000000..ca45c5d4d --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/CVS/Root @@ -0,0 +1 @@ +:pserver:anoncvs@sources.redhat.com:/cvs/glibc diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/pspinlock.c b/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/pspinlock.c new file mode 100644 index 000000000..04f588bed --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/pspinlock.c @@ -0,0 +1,94 @@ +/* POSIX spinlock implementation.  SPARC v9 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, +   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +   Boston, MA 02111-1307, USA.  */ + +#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" +     "   brnz,pn %%g2, 2f\n" +     "    membar #StoreLoad | #StoreStore\n" +     ".subsection 2\n" +     "2: ldub    [%0], %%g2\n" +     "   brnz,pt %%g2, 2b\n" +     "    membar #LoadLoad\n" +     "   b,a,pt  %%xcc, 1b\n" +     ".previous" +     : /* no outputs */ +     : "r" (lock) +     : "g2", "memory"); +  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\n" +     "membar #StoreLoad | #StoreStore" +     : "=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) +{ +  asm volatile +    ("membar #StoreStore | #LoadStore\n" +     "stb    %%g0, [%0]" +     : +     : "r" (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/sparc/sparc64/CVS/Entries b/libpthread/linuxthreads/sysdeps/sparc/sparc64/CVS/Entries new file mode 100644 index 000000000..854b8a788 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/sparc64/CVS/Entries @@ -0,0 +1,4 @@ +/Versions/1.1/Tue Nov 15 14:20:47 2005// +/pspinlock.c/1.5/Tue Nov 15 14:20:47 2005// +/pt-machine.h/1.20/Tue Nov 15 14:20:47 2005// +D diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc64/CVS/Repository b/libpthread/linuxthreads/sysdeps/sparc/sparc64/CVS/Repository new file mode 100644 index 000000000..534fc8ed2 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/sparc64/CVS/Repository @@ -0,0 +1 @@ +ports/linuxthreads/sysdeps/sparc/sparc64 diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc64/CVS/Root b/libpthread/linuxthreads/sysdeps/sparc/sparc64/CVS/Root new file mode 100644 index 000000000..ca45c5d4d --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/sparc64/CVS/Root @@ -0,0 +1 @@ +:pserver:anoncvs@sources.redhat.com:/cvs/glibc diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc64/pspinlock.c b/libpthread/linuxthreads/sysdeps/sparc/sparc64/pspinlock.c new file mode 100644 index 000000000..92b84f510 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/sparc64/pspinlock.c @@ -0,0 +1,93 @@ +/* POSIX spinlock implementation.  SPARC64 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, +   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +   Boston, MA 02111-1307, USA.  */ + +#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], %%g5\n" +     "   brnz,pn %%g5, 2f\n" +     "    membar #StoreLoad | #StoreStore\n" +     ".subsection 2\n" +     "2: ldub    [%0], %%g5\n" +     "   brnz,pt %%g5, 2b\n" +     "    membar #LoadLoad\n" +     "   b,a,pt  %%xcc, 1b\n" +     ".previous" +     : /* no outputs */ +     : "r" (lock) +     : "g5", "memory"); +  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\n" +     "membar #StoreLoad | #StoreStore" +     : "=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) +{ +  asm volatile +    ("membar #StoreStore | #LoadStore\n" +     "stb    %%g0, [%0]" +     : +     : "r" (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/sparc/sparc64/pt-machine.h b/libpthread/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h new file mode 100644 index 000000000..f65c13be1 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h @@ -0,0 +1,105 @@ +/* Machine-dependent pthreads configuration and inline functions. +   Sparc v9 version. +   Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc. +   This file is part of the GNU C Library. +   Contributed by Richard Henderson <rth@tamu.edu>. + +   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, write to the Free Software Foundation, Inc., +   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */ + +#ifndef _PT_MACHINE_H +#define _PT_MACHINE_H   1 + +#ifndef PT_EI +# define PT_EI extern inline __attribute__ ((always_inline)) +#endif + +extern long int testandset (int *spinlock); +extern int __compare_and_swap (long int *p, long int oldval, long int newval); + +/* Spinlock implementation; required.  */ +PT_EI long int +testandset (int *spinlock) +{ +  int ret; + +  __asm__ __volatile__("ldstub %1,%0" +	: "=r" (ret), "=m" (*spinlock) : "m" (*spinlock)); + +  return ret; +} + + +/* Memory barrier; default is to do nothing */ +#define MEMORY_BARRIER() \ +     __asm__ __volatile__("membar #LoadLoad | #LoadStore | #StoreLoad | #StoreStore" : : : "memory") +/* Read barrier.  */ +#define READ_MEMORY_BARRIER() \ +     __asm__ __volatile__("membar #LoadLoad | #LoadStore" : : : "memory") +/* Write barrier.  */ +#define WRITE_MEMORY_BARRIER() \ +     __asm__ __volatile__("membar #StoreLoad | #StoreStore" : : : "memory") + + +/* Get some notion of the current stack.  Need not be exactly the top +   of the stack, just something somewhere in the current frame.  */ +#define CURRENT_STACK_FRAME  (stack_pointer + (2 * 128)) +register char *stack_pointer __asm__ ("%sp"); + + +/* Registers %g6 and %g7 are reserved by the ABI for "system use".  The +   TLS ABI specifies %g7 as the thread pointer.  */ +struct _pthread_descr_struct; +register struct _pthread_descr_struct *__thread_self __asm__ ("%g7"); + +/* Return the thread descriptor for the current thread.  */ +#define THREAD_SELF  __thread_self + +/* Initialize the thread-unique value.  */ +#define INIT_THREAD_SELF(descr, nr)  (__thread_self = (descr)) + + +/* Compare-and-swap for semaphores. */ + +#define HAS_COMPARE_AND_SWAP +PT_EI int +__compare_and_swap (long int *p, long int oldval, long int newval) +{ +  long int readval; + +  __asm__ __volatile__ ("casx	[%4], %2, %0" +			: "=r"(readval), "=m"(*p) +			: "r"(oldval), "m"(*p), "r"(p), "0"(newval)); +  MEMORY_BARRIER(); +  return readval == oldval; +} + +/* Access to data in the thread descriptor is easy.  */ +#define THREAD_GETMEM(descr, member) \ +  ((void) sizeof (descr), THREAD_SELF->member) +#define THREAD_GETMEM_NC(descr, member) \ +  ((void) sizeof (descr), THREAD_SELF->member) +#define THREAD_SETMEM(descr, member, value) \ +  ((void) sizeof (descr), THREAD_SELF->member = (value)) +#define THREAD_SETMEM_NC(descr, member, value) \ +  ((void) sizeof (descr), THREAD_SELF->member = (value)) + +/* We want the OS to assign stack addresses.  */ +#define FLOATING_STACKS 1 + +/* Maximum size of the stack if the rlimit is unlimited.  */ +#define ARCH_STACK_MAX_SIZE     32*1024*1024 + +#endif /* pt-machine.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..2df97d61e --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/sparc/tls.h @@ -0,0 +1,115 @@ +/* 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, write to the Free +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +   02111-1307 USA.  */ + +#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 */  | 
