summaryrefslogtreecommitdiff
path: root/libpthread/nptl/sysdeps/xtensa
diff options
context:
space:
mode:
Diffstat (limited to 'libpthread/nptl/sysdeps/xtensa')
-rw-r--r--libpthread/nptl/sysdeps/xtensa/dl-tls.h36
-rw-r--r--libpthread/nptl/sysdeps/xtensa/pthread_spin_lock.S16
-rw-r--r--libpthread/nptl/sysdeps/xtensa/pthread_spin_trylock.S17
-rw-r--r--libpthread/nptl/sysdeps/xtensa/pthreaddef.h3
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