diff options
Diffstat (limited to 'libpthread/nptl/sysdeps/xtensa')
| -rw-r--r-- | libpthread/nptl/sysdeps/xtensa/dl-tls.h | 36 | ||||
| -rw-r--r-- | libpthread/nptl/sysdeps/xtensa/pthread_spin_lock.S | 16 | ||||
| -rw-r--r-- | libpthread/nptl/sysdeps/xtensa/pthread_spin_trylock.S | 17 | ||||
| -rw-r--r-- | libpthread/nptl/sysdeps/xtensa/pthreaddef.h | 3 |
4 files changed, 60 insertions, 12 deletions
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 |
