summaryrefslogtreecommitdiff
path: root/toolchain/uclibc/patches
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbx@openadk.org>2014-07-05 13:20:23 +0200
committerWaldemar Brodkorb <wbx@openadk.org>2014-07-05 13:21:37 +0200
commit5ce7c00aadc63e34d8629b36b8c7cf3c9ee0c380 (patch)
tree665868894292c3e90a7af5d8778da6a631fc8223 /toolchain/uclibc/patches
parentf5332c1a325054bec10a11a42b6f0456ad2dea27 (diff)
remove addon patches
Diffstat (limited to 'toolchain/uclibc/patches')
-rw-r--r--toolchain/uclibc/patches/xxx-origin.patch177
-rw-r--r--toolchain/uclibc/patches/xxx-sparc-wait4.patch12
-rw-r--r--toolchain/uclibc/patches/xxx-xtensa-nptl.patch3515
3 files changed, 0 insertions, 3704 deletions
diff --git a/toolchain/uclibc/patches/xxx-origin.patch b/toolchain/uclibc/patches/xxx-origin.patch
deleted file mode 100644
index 42b524017..000000000
--- a/toolchain/uclibc/patches/xxx-origin.patch
+++ /dev/null
@@ -1,177 +0,0 @@
-diff -Nur uClibc-git/ldso/ldso/dl-elf.c uClibc-origin/ldso/ldso/dl-elf.c
---- uClibc-git/ldso/ldso/dl-elf.c 2014-02-03 12:32:56.000000000 +0100
-+++ uClibc-origin/ldso/ldso/dl-elf.c 2014-02-17 14:44:13.000000000 +0100
-@@ -133,56 +133,59 @@
- * in uClibc/ldso/util/ldd.c */
- static struct elf_resolve *
- search_for_named_library(const char *name, unsigned rflags, const char *path_list,
-- struct dyn_elf **rpnt)
-+ struct dyn_elf **rpnt, const char *origin)
- {
-- char *path, *path_n, *mylibname;
-+ char *mylibname;
-+ const char *p, *pn;
- struct elf_resolve *tpnt;
-- int done;
-+ int plen;
-
- if (path_list==NULL)
- return NULL;
-
-- /* We need a writable copy of this string, but we don't
-- * need this allocated permanently since we don't want
-- * to leak memory, so use alloca to put path on the stack */
-- done = _dl_strlen(path_list);
-- path = alloca(done + 1);
--
- /* another bit of local storage */
- mylibname = alloca(2050);
-
-- _dl_memcpy(path, path_list, done+1);
--
- /* Unlike ldd.c, don't bother to eliminate double //s */
-
- /* Replace colons with zeros in path_list */
- /* : at the beginning or end of path maps to CWD */
- /* :: anywhere maps CWD */
- /* "" maps to CWD */
-- done = 0;
-- path_n = path;
-- do {
-- if (*path == 0) {
-- *path = ':';
-- done = 1;
-+ for (p = path_list; p != NULL; p = pn) {
-+ pn = _dl_strchr(p + 1, ':');
-+ if (pn != NULL) {
-+ plen = pn - p;
-+ pn++;
-+ } else
-+ plen = _dl_strlen(p);
-+
-+ if (plen >= 7 && _dl_memcmp(p, "$ORIGIN", 7) == 0) {
-+ int olen;
-+ if (rflags && plen != 7)
-+ continue;
-+ if (origin == NULL)
-+ continue;
-+ for (olen = _dl_strlen(origin) - 1; olen >= 0 && origin[olen] != '/'; olen--)
-+ ;
-+ if (olen <= 0)
-+ continue;
-+ _dl_memcpy(&mylibname[0], origin, olen);
-+ _dl_memcpy(&mylibname[olen], p + 7, plen - 7);
-+ mylibname[olen + plen - 7] = 0;
-+ } else if (plen != 0) {
-+ _dl_memcpy(mylibname, p, plen);
-+ mylibname[plen] = 0;
-+ } else {
-+ _dl_strcpy(mylibname, ".");
- }
-- if (*path == ':') {
-- *path = 0;
-- if (*path_n)
-- _dl_strcpy(mylibname, path_n);
-- else
-- _dl_strcpy(mylibname, "."); /* Assume current dir if empty path */
-- _dl_strcat(mylibname, "/");
-- _dl_strcat(mylibname, name);
--#ifdef __LDSO_SAFE_RUNPATH__
-- if (*mylibname == '/')
--#endif
-- if ((tpnt = _dl_load_elf_shared_library(rflags, rpnt, mylibname)) != NULL)
-- return tpnt;
-- path_n = path+1;
-- }
-- path++;
-- } while (!done);
-+ _dl_strcat(mylibname, "/");
-+ _dl_strcat(mylibname, name);
-+
-+ tpnt = _dl_load_elf_shared_library(rflags, rpnt, mylibname);
-+ if (tpnt != NULL)
-+ return tpnt;
-+ }
- return NULL;
- }
-
-@@ -234,7 +237,7 @@
- if (pnt) {
- pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB];
- _dl_if_debug_dprint("\tsearching RPATH='%s'\n", pnt);
-- if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt)) != NULL)
-+ if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt, tpnt->libname)) != NULL)
- return tpnt1;
- }
- #endif
-@@ -243,7 +246,7 @@
- /* Check in LD_{ELF_}LIBRARY_PATH, if specified and allowed */
- if (_dl_library_path) {
- _dl_if_debug_dprint("\tsearching LD_LIBRARY_PATH='%s'\n", _dl_library_path);
-- if ((tpnt1 = search_for_named_library(libname, rflags, _dl_library_path, rpnt)) != NULL)
-+ if ((tpnt1 = search_for_named_library(libname, rflags, _dl_library_path, rpnt, NULL)) != NULL)
- {
- return tpnt1;
- }
-@@ -257,7 +260,7 @@
- if (pnt) {
- pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB];
- _dl_if_debug_dprint("\tsearching RUNPATH='%s'\n", pnt);
-- if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt)) != NULL)
-+ if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt, NULL)) != NULL)
- return tpnt1;
- }
- #endif
-@@ -291,7 +294,7 @@
- /* Look for libraries wherever the shared library loader
- * was installed */
- _dl_if_debug_dprint("\tsearching ldso dir='%s'\n", _dl_ldsopath);
-- tpnt1 = search_for_named_library(libname, rflags, _dl_ldsopath, rpnt);
-+ tpnt1 = search_for_named_library(libname, rflags, _dl_ldsopath, rpnt, NULL);
- if (tpnt1 != NULL)
- return tpnt1;
- #endif
-@@ -304,7 +307,7 @@
- #ifndef __LDSO_CACHE_SUPPORT__
- ":" UCLIBC_RUNTIME_PREFIX "usr/X11R6/lib"
- #endif
-- , rpnt);
-+ , rpnt, NULL);
- if (tpnt1 != NULL)
- return tpnt1;
-
-diff -Nur uClibc-git/ldso/ldso/ldso.c uClibc-origin/ldso/ldso/ldso.c
---- uClibc-git/ldso/ldso/ldso.c 2014-02-03 12:32:56.000000000 +0100
-+++ uClibc-origin/ldso/ldso/ldso.c 2014-02-17 12:34:00.000000000 +0100
-@@ -403,6 +403,20 @@
- return p - list;
- }
-
-+static void _dl_setup_progname(const char *argv0)
-+{
-+ char image[PATH_MAX];
-+ ssize_t s;
-+
-+ s = _dl_readlink("/proc/self/exe", image, sizeof(image));
-+ if (s > 0 && image[0] == '/') {
-+ image[s] = 0;
-+ _dl_progname = _dl_strdup(image);
-+ } else if (argv0) {
-+ _dl_progname = argv0;
-+ }
-+}
-+
- void *_dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
- ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp, char **argv
- DL_GET_READY_TO_RUN_EXTRA_PARMS)
-@@ -454,9 +468,7 @@
- * been fixed up by now. Still no function calls outside of this
- * library, since the dynamic resolver is not yet ready.
- */
-- if (argv[0]) {
-- _dl_progname = argv[0];
-- }
-+ _dl_setup_progname(argv[0]);
-
- #ifdef __DSBT__
- _dl_ldso_dsbt = (void *)tpnt->dynamic_info[DT_DSBT_BASE_IDX];
diff --git a/toolchain/uclibc/patches/xxx-sparc-wait4.patch b/toolchain/uclibc/patches/xxx-sparc-wait4.patch
deleted file mode 100644
index e219ed773..000000000
--- a/toolchain/uclibc/patches/xxx-sparc-wait4.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -Nur uClibc-0.9.33.2.orig/include/sys/wait.h uClibc-0.9.33.2/include/sys/wait.h
---- uClibc-0.9.33.2.orig/include/sys/wait.h 2014-03-01 19:15:53.000000000 +0100
-+++ uClibc-0.9.33.2/include/sys/wait.h 2014-03-01 19:16:42.000000000 +0100
-@@ -176,7 +176,7 @@
- #endif /* Use BSD. */
-
- #ifdef _LIBC
--extern __pid_t __wait4_nocancel(__pid_t, __WAIT_STATUS, int, struct rusage *) attribute_hidden;
-+extern __pid_t __wait4_nocancel(__pid_t, __WAIT_STATUS, int, struct rusage *);
- #endif
-
-
diff --git a/toolchain/uclibc/patches/xxx-xtensa-nptl.patch b/toolchain/uclibc/patches/xxx-xtensa-nptl.patch
deleted file mode 100644
index 16241e161..000000000
--- a/toolchain/uclibc/patches/xxx-xtensa-nptl.patch
+++ /dev/null
@@ -1,3515 +0,0 @@
-diff -Nur uClibc-git/include/elf.h uClibc-xtensa/include/elf.h
---- uClibc-git/include/elf.h 2014-06-02 17:40:33.826710944 +0200
-+++ uClibc-xtensa/include/elf.h 2014-06-03 16:03:19.065886532 +0200
-@@ -3072,8 +3071,11 @@
- #define R_XTENSA_SLOT12_ALT 47
- #define R_XTENSA_SLOT13_ALT 48
- #define R_XTENSA_SLOT14_ALT 49
-+#define R_XTENSA_TLSDESC_FN 50
-+#define R_XTENSA_TLSDESC_ARG 51
-+#define R_XTENSA_TLS_TPOFF 53
- /* Keep this the last entry. */
--#define R_XTENSA_NUM 50
-+#define R_XTENSA_NUM 54
-
- /* C6X specific relocs */
- #define R_C6000_NONE 0
-diff -Nur uClibc-git/include/link.h uClibc-xtensa/include/link.h
---- uClibc-git/include/link.h 2014-06-02 17:40:33.846711055 +0200
-+++ uClibc-xtensa/include/link.h 2014-06-03 15:28:27.185347373 +0200
-@@ -132,6 +132,8 @@
- size_t l_tls_modid;
- /* Nonzero if _dl_init_static_tls should be called for this module */
- unsigned int l_need_tls_init:1;
-+ /* Address of TLS descriptor hash table. */
-+ void *l_tlsdesc_table;
- #endif
- #endif
- };
-diff -Nur uClibc-git/ldso/include/dl-hash.h uClibc-xtensa/ldso/include/dl-hash.h
---- uClibc-git/ldso/include/dl-hash.h 2014-06-02 17:40:33.902711365 +0200
-+++ uClibc-xtensa/ldso/include/dl-hash.h 2014-06-03 15:29:09.505536959 +0200
-@@ -70,6 +70,8 @@
- size_t l_tls_modid;
- /* Nonzero if _dl_init_static_tls should be called for this module */
- unsigned int l_need_tls_init:1;
-+ /* Address of TLS descriptor hash table. */
-+ void *l_tlsdesc_table;
- #endif
-
- ElfW(Addr) mapaddr;
-diff -Nur uClibc-git/ldso/include/inline-hashtab.h uClibc-xtensa/ldso/include/inline-hashtab.h
---- uClibc-git/ldso/include/inline-hashtab.h 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/ldso/include/inline-hashtab.h 2014-06-03 11:57:42.031052092 +0200
-@@ -0,0 +1,265 @@
-+/*
-+ * The hashcode handling code below is heavily inspired in libiberty's
-+ * hashtab code, but with most adaptation points and support for
-+ * deleting elements removed.
-+ *
-+ * Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
-+ * Contributed by Vladimir Makarov (vmakarov@cygnus.com).
-+ */
-+
-+#ifndef INLINE_HASHTAB_H
-+# define INLINE_HASHTAB_H 1
-+
-+static __always_inline unsigned long
-+higher_prime_number(unsigned long n)
-+{
-+ /* These are primes that are near, but slightly smaller than, a power of two. */
-+ static const unsigned long primes[] = {
-+ 7,
-+ 13,
-+ 31,
-+ 61,
-+ 127,
-+ 251,
-+ 509,
-+ 1021,
-+ 2039,
-+ 4093,
-+ 8191,
-+ 16381,
-+ 32749,
-+ 65521,
-+ 131071,
-+ 262139,
-+ 524287,
-+ 1048573,
-+ 2097143,
-+ 4194301,
-+ 8388593,
-+ 16777213,
-+ 33554393,
-+ 67108859,
-+ 134217689,
-+ 268435399,
-+ 536870909,
-+ 1073741789,
-+ /* 4294967291 */
-+ ((unsigned long) 2147483647) + ((unsigned long) 2147483644),
-+ };
-+ const unsigned long *low = &primes[0];
-+ const unsigned long *high = &primes[ARRAY_SIZE(primes)];
-+
-+ while (low != high) {
-+ const unsigned long *mid = low + (high - low) / 2;
-+ if (n > *mid)
-+ low = mid + 1;
-+ else
-+ high = mid;
-+ }
-+
-+#if 0
-+ /* If we've run out of primes, abort. */
-+ if (n > *low) {
-+ fprintf(stderr, "Cannot find prime bigger than %lu\n", n);
-+ abort();
-+ }
-+#endif
-+
-+ return *low;
-+}
-+
-+struct funcdesc_ht
-+{
-+ /* Table itself */
-+ void **entries;
-+
-+ /* Current size (in entries) of the hash table */
-+ size_t size;
-+
-+ /* Current number of elements */
-+ size_t n_elements;
-+};
-+
-+static __always_inline struct funcdesc_ht *
-+htab_create(void)
-+{
-+ struct funcdesc_ht *ht = _dl_malloc(sizeof(*ht));
-+ size_t ent_size;
-+
-+ if (!ht)
-+ return NULL;
-+ ht->size = 3;
-+ ent_size = sizeof(void *) * ht->size;
-+ ht->entries = _dl_malloc(ent_size);
-+ if (!ht->entries)
-+ return NULL;
-+
-+ ht->n_elements = 0;
-+ _dl_memset(ht->entries, 0, ent_size);
-+
-+ return ht;
-+}
-+
-+/*
-+ * This is only called from _dl_loadaddr_unmap, so it's safe to call
-+ * _dl_free(). See the discussion below.
-+ */
-+static __always_inline void
-+htab_delete(struct funcdesc_ht *htab)
-+{
-+ size_t i;
-+
-+ for (i = htab->size - 1; i >= 0; i--)
-+ if (htab->entries[i])
-+ _dl_free(htab->entries[i]);
-+
-+ _dl_free(htab->entries);
-+ _dl_free(htab);
-+}
-+
-+/*
-+ * Similar to htab_find_slot, but without several unwanted side effects:
-+ * - Does not call htab->eq_f when it finds an existing entry.
-+ * - Does not change the count of elements/searches/collisions in the
-+ * hash table.
-+ * This function also assumes there are no deleted entries in the table.
-+ * HASH is the hash value for the element to be inserted.
-+ */
-+static __always_inline void **
-+find_empty_slot_for_expand(struct funcdesc_ht *htab, int hash)
-+{
-+ size_t size = htab->size;
-+ unsigned int index = hash % size;
-+ void **slot = htab->entries + index;
-+ int hash2;
-+
-+ if (!*slot)
-+ return slot;
-+
-+ hash2 = 1 + hash % (size - 2);
-+ for (;;) {
-+ index += hash2;
-+ if (index >= size)
-+ index -= size;
-+
-+ slot = htab->entries + index;
-+ if (!*slot)
-+ return slot;
-+ }
-+}
-+
-+/*
-+ * The following function changes size of memory allocated for the
-+ * entries and repeatedly inserts the table elements. The occupancy
-+ * of the table after the call will be about 50%. Naturally the hash
-+ * table must already exist. Remember also that the place of the
-+ * table entries is changed. If memory allocation failures are allowed,
-+ * this function will return zero, indicating that the table could not be
-+ * expanded. If all goes well, it will return a non-zero value.
-+ */
-+static __always_inline int
-+htab_expand(struct funcdesc_ht *htab, int (*hash_fn) (void *))
-+{
-+ void **oentries;
-+ void **olimit;
-+ void **p;
-+ void **nentries;
-+ size_t nsize;
-+
-+ oentries = htab->entries;
-+ olimit = oentries + htab->size;
-+
-+ /*
-+ * Resize only when table after removal of unused elements is either
-+ * too full or too empty.
-+ */
-+ if (htab->n_elements * 2 > htab->size)
-+ nsize = higher_prime_number(htab->n_elements * 2);
-+ else
-+ nsize = htab->size;
-+
-+ nentries = _dl_malloc(sizeof(*nentries) * nsize);
-+ _dl_memset(nentries, 0, sizeof(*nentries) * nsize);
-+ if (nentries == NULL)
-+ return 0;
-+ htab->entries = nentries;
-+ htab->size = nsize;
-+
-+ p = oentries;
-+ do {
-+ if (*p)
-+ *find_empty_slot_for_expand(htab, hash_fn(*p)) = *p;
-+ p++;
-+ } while (p < olimit);
-+
-+#if 0
-+ /*
-+ * We can't tell whether this was allocated by the _dl_malloc()
-+ * built into ld.so or malloc() in the main executable or libc,
-+ * and calling free() for something that wasn't malloc()ed could
-+ * do Very Bad Things (TM). Take the conservative approach
-+ * here, potentially wasting as much memory as actually used by
-+ * the hash table, even if multiple growths occur. That's not
-+ * so bad as to require some overengineered solution that would
-+ * enable us to keep track of how it was allocated.
-+ */
-+ _dl_free(oentries);
-+#endif
-+ return 1;
-+}
-+
-+/*
-+ * This function searches for a hash table slot containing an entry
-+ * equal to the given element. To delete an entry, call this with
-+ * INSERT = 0, then call htab_clear_slot on the slot returned (possibly
-+ * after doing some checks). To insert an entry, call this with
-+ * INSERT = 1, then write the value you want into the returned slot.
-+ * When inserting an entry, NULL may be returned if memory allocation
-+ * fails.
-+ */
-+static __always_inline void **
-+htab_find_slot(struct funcdesc_ht *htab, void *ptr, int insert,
-+ int (*hash_fn)(void *), int (*eq_fn)(void *, void *))
-+{
-+ unsigned int index;
-+ int hash, hash2;
-+ size_t size;
-+ void **entry;
-+
-+ if (htab->size * 3 <= htab->n_elements * 4 &&
-+ htab_expand(htab, hash_fn) == 0)
-+ return NULL;
-+
-+ hash = hash_fn(ptr);
-+
-+ size = htab->size;
-+ index = hash % size;
-+
-+ entry = &htab->entries[index];
-+ if (!*entry)
-+ goto empty_entry;
-+ else if (eq_fn(*entry, ptr))
-+ return entry;
-+
-+ hash2 = 1 + hash % (size - 2);
-+ for (;;) {
-+ index += hash2;
-+ if (index >= size)
-+ index -= size;
-+
-+ entry = &htab->entries[index];
-+ if (!*entry)
-+ goto empty_entry;
-+ else if (eq_fn(*entry, ptr))
-+ return entry;
-+ }
-+
-+ empty_entry:
-+ if (!insert)
-+ return NULL;
-+
-+ htab->n_elements++;
-+ return entry;
-+}
-+
-+#endif
-diff -Nur uClibc-git/ldso/include/ldsodefs.h uClibc-xtensa/ldso/include/ldsodefs.h
---- uClibc-git/ldso/include/ldsodefs.h 2014-06-02 17:40:33.922711475 +0200
-+++ uClibc-xtensa/ldso/include/ldsodefs.h 2014-06-03 16:10:51.175659505 +0200
-@@ -62,13 +62,18 @@
-
- extern void _dl_allocate_static_tls (struct link_map *map)
- internal_function attribute_hidden;
-+extern int _dl_try_allocate_static_tls (struct link_map* map)
-+ internal_function attribute_hidden;
-
- /* Taken from glibc/elf/dl-reloc.c */
- #define CHECK_STATIC_TLS(sym_map) \
- do { \
-- if (unlikely((sym_map)->l_tls_offset == NO_TLS_OFFSET)) \
-+ if (__builtin_expect ((sym_map)->l_tls_offset == NO_TLS_OFFSET, 0)) \
- _dl_allocate_static_tls (sym_map); \
- } while (0)
-+#define TRY_STATIC_TLS(sym_map) \
-+ (__builtin_expect ((sym_map)->l_tls_offset != NO_TLS_OFFSET, 1) \
-+ || _dl_try_allocate_static_tls (sym_map) == 0)
-
- /* These are internal entry points to the two halves of _dl_allocate_tls,
- only used within rtld.c itself at startup time. */
-diff -Nur uClibc-git/ldso/include/tlsdeschtab.h uClibc-xtensa/ldso/include/tlsdeschtab.h
---- uClibc-git/ldso/include/tlsdeschtab.h 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/ldso/include/tlsdeschtab.h 2014-06-03 14:58:29.681335708 +0200
-@@ -0,0 +1,119 @@
-+/* Hash table for TLS descriptors.
-+ Copyright (C) 2005-2013 Free Software Foundation, Inc.
-+ This file is part of the GNU C Library.
-+ Contributed by Alexandre Oliva <aoliva@redhat.com>
-+
-+ uClibc port by Baruch Siach <baruch@tkos.co.il>
-+
-+ 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 TLSDESCHTAB_H
-+# define TLSDESCHTAB_H 1
-+
-+# ifdef SHARED
-+
-+# include <inline-hashtab.h>
-+
-+inline static int
-+hash_tlsdesc (void *p)
-+{
-+ struct tlsdesc_dynamic_arg *td = p;
-+
-+ /* We know all entries are for the same module, so ti_offset is the
-+ only distinguishing entry. */
-+ return td->tlsinfo.ti_offset;
-+}
-+
-+inline static int
-+eq_tlsdesc (void *p, void *q)
-+{
-+ struct tlsdesc_dynamic_arg *tdp = p, *tdq = q;
-+
-+ return tdp->tlsinfo.ti_offset == tdq->tlsinfo.ti_offset;
-+}
-+
-+inline static int
-+map_generation (struct link_map *map)
-+{
-+ size_t idx = map->l_tls_modid;
-+ struct dtv_slotinfo_list *listp = GL(dl_tls_dtv_slotinfo_list);
-+
-+ /* Find the place in the dtv slotinfo list. */
-+ do
-+ {
-+ /* Does it fit in the array of this list element? */
-+ if (idx < listp->len)
-+ {
-+ /* We should never get here for a module in static TLS, so
-+ we can assume that, if the generation count is zero, we
-+ still haven't determined the generation count for this
-+ module. */
-+ if (listp->slotinfo[idx].gen)
-+ return listp->slotinfo[idx].gen;
-+ else
-+ break;
-+ }
-+ idx -= listp->len;
-+ listp = listp->next;
-+ }
-+ while (listp != NULL);
-+
-+ /* If we get to this point, the module still hasn't been assigned an
-+ entry in the dtv slotinfo data structures, and it will when we're
-+ done with relocations. At that point, the module will get a
-+ generation number that is one past the current generation, so
-+ return exactly that. */
-+ return GL(dl_tls_generation) + 1;
-+}
-+
-+void *
-+internal_function
-+_dl_make_tlsdesc_dynamic (struct link_map *map, size_t ti_offset)
-+{
-+ struct funcdesc_ht *ht;
-+ void **entry;
-+ struct tlsdesc_dynamic_arg *td, test;
-+
-+ ht = map->l_tlsdesc_table;
-+ if (! ht)
-+ {
-+ ht = htab_create ();
-+ if (! ht)
-+ return 0;
-+ map->l_tlsdesc_table = ht;
-+ }
-+
-+ test.tlsinfo.ti_module = map->l_tls_modid;
-+ test.tlsinfo.ti_offset = ti_offset;
-+ entry = htab_find_slot (ht, &test, 1, hash_tlsdesc, eq_tlsdesc);
-+ if (*entry)
-+ {
-+ td = *entry;
-+ return td;
-+ }
-+
-+ *entry = td = _dl_malloc (sizeof (struct tlsdesc_dynamic_arg));
-+ /* This may be higher than the map's generation, but it doesn't
-+ matter much. Worst case, we'll have one extra DTV update per
-+ thread. */
-+ td->gen_count = map_generation (map);
-+ td->tlsinfo = test.tlsinfo;
-+
-+ return td;
-+}
-+
-+# endif /* SHARED */
-+
-+#endif
-diff -Nur uClibc-git/ldso/ldso/dl-tls.c uClibc-xtensa/ldso/ldso/dl-tls.c
---- uClibc-git/ldso/ldso/dl-tls.c 2014-06-02 17:40:33.946711608 +0200
-+++ uClibc-xtensa/ldso/ldso/dl-tls.c 2014-06-03 16:10:28.547570023 +0200
-@@ -100,20 +100,16 @@
- * the static TLS area already allocated for each running thread. If this
- * object's TLS segment is too big to fit, we fail. If it fits,
- * we set MAP->l_tls_offset and return.
-- * This function intentionally does not return any value but signals error
-- * directly, as static TLS should be rare and code handling it should
-- * not be inlined as much as possible.
- */
--void
--internal_function __attribute_noinline__
--_dl_allocate_static_tls (struct link_map *map)
-+int
-+internal_function
-+_dl_try_allocate_static_tls (struct link_map* map)
- {
- /* If the alignment requirements are too high fail. */
- if (map->l_tls_align > _dl_tls_static_align)
- {
- fail:
-- _dl_dprintf(2, "cannot allocate memory in static TLS block");
-- _dl_exit(30);
-+ return -1;
- }
-
- # ifdef TLS_TCB_AT_TP
-@@ -169,6 +165,23 @@
- }
- else
- map->l_need_tls_init = 1;
-+
-+ return 0;
-+}
-+
-+/*
-+ * This function intentionally does not return any value but signals error
-+ * directly, as static TLS should be rare and code handling it should
-+ * not be inlined as much as possible.
-+ */
-+void
-+internal_function __attribute_noinline__
-+_dl_allocate_static_tls (struct link_map *map)
-+{
-+ if (_dl_try_allocate_static_tls (map)) {
-+ _dl_dprintf(2, "cannot allocate memory in static TLS block");
-+ _dl_exit(30);
-+ }
- }
-
- #ifdef SHARED
-diff -Nur uClibc-git/ldso/ldso/fdpic/dl-inlines.h uClibc-xtensa/ldso/ldso/fdpic/dl-inlines.h
---- uClibc-git/ldso/ldso/fdpic/dl-inlines.h 2014-06-02 17:40:33.950711630 +0200
-+++ uClibc-xtensa/ldso/ldso/fdpic/dl-inlines.h 2014-06-03 11:57:43.263058897 +0200
-@@ -5,6 +5,8 @@
- * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
- */
-
-+#include <inline-hashtab.h>
-+
- /* Initialize a DL_LOADADDR_TYPE given a got pointer and a complete load map. */
- static __always_inline void
- __dl_init_loadaddr_map(struct elf32_fdpic_loadaddr *loadaddr, Elf32_Addr dl_boot_got_pointer,
-@@ -143,269 +145,18 @@
- return 0;
- }
-
--/*
-- * The hashcode handling code below is heavily inspired in libiberty's
-- * hashtab code, but with most adaptation points and support for
-- * deleting elements removed.
-- *
-- * Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
-- * Contributed by Vladimir Makarov (vmakarov@cygnus.com).
-- */
--static __always_inline unsigned long
--higher_prime_number(unsigned long n)
--{
-- /* These are primes that are near, but slightly smaller than, a power of two. */
-- static const unsigned long primes[] = {
-- 7,
-- 13,
-- 31,
-- 61,
-- 127,
-- 251,
-- 509,
-- 1021,
-- 2039,
-- 4093,
-- 8191,
-- 16381,
-- 32749,
-- 65521,
-- 131071,
-- 262139,
-- 524287,
-- 1048573,
-- 2097143,
-- 4194301,
-- 8388593,
-- 16777213,
-- 33554393,
-- 67108859,
-- 134217689,
-- 268435399,
-- 536870909,
-- 1073741789,
-- /* 4294967291 */
-- ((unsigned long) 2147483647) + ((unsigned long) 2147483644),
-- };
-- const unsigned long *low = &primes[0];
-- const unsigned long *high = &primes[ARRAY_SIZE(primes)];
--
-- while (low != high) {
-- const unsigned long *mid = low + (high - low) / 2;
-- if (n > *mid)
-- low = mid + 1;
-- else
-- high = mid;
-- }
--
--#if 0
-- /* If we've run out of primes, abort. */
-- if (n > *low) {
-- fprintf(stderr, "Cannot find prime bigger than %lu\n", n);
-- abort();
-- }
--#endif
--
-- return *low;
--}
--
--struct funcdesc_ht
--{
-- /* Table itself */
-- struct funcdesc_value **entries;
--
-- /* Current size (in entries) of the hash table */
-- size_t size;
--
-- /* Current number of elements */
-- size_t n_elements;
--};
--
--static __always_inline int
--hash_pointer(const void *p)
-+static int
-+hash_pointer(void *p)
- {
- return (int) ((long)p >> 3);
- }
-
--static __always_inline struct funcdesc_ht *
--htab_create(void)
--{
-- struct funcdesc_ht *ht = _dl_malloc(sizeof(*ht));
-- size_t ent_size;
--
-- if (!ht)
-- return NULL;
-- ht->size = 3;
-- ent_size = sizeof(struct funcdesc_ht_value *) * ht->size;
-- ht->entries = _dl_malloc(ent_size);
-- if (!ht->entries)
-- return NULL;
--
-- ht->n_elements = 0;
-- _dl_memset(ht->entries, 0, ent_size);
--
-- return ht;
--}
--
--/*
-- * This is only called from _dl_loadaddr_unmap, so it's safe to call
-- * _dl_free(). See the discussion below.
-- */
--static __always_inline void
--htab_delete(struct funcdesc_ht *htab)
--{
-- size_t i;
--
-- for (i = htab->size - 1; i >= 0; i--)
-- if (htab->entries[i])
-- _dl_free(htab->entries[i]);
--
-- _dl_free(htab->entries);
-- _dl_free(htab);
--}
--
--/*
-- * Similar to htab_find_slot, but without several unwanted side effects:
-- * - Does not call htab->eq_f when it finds an existing entry.
-- * - Does not change the count of elements/searches/collisions in the
-- * hash table.
-- * This function also assumes there are no deleted entries in the table.
-- * HASH is the hash value for the element to be inserted.
-- */
--static __always_inline struct funcdesc_value **
--find_empty_slot_for_expand(struct funcdesc_ht *htab, int hash)
-+static int
-+eq_pointer(void *p, void *q)
- {
-- size_t size = htab->size;
-- unsigned int index = hash % size;
-- struct funcdesc_value **slot = htab->entries + index;
-- int hash2;
--
-- if (!*slot)
-- return slot;
--
-- hash2 = 1 + hash % (size - 2);
-- for (;;) {
-- index += hash2;
-- if (index >= size)
-- index -= size;
--
-- slot = htab->entries + index;
-- if (!*slot)
-- return slot;
-- }
--}
--
--/*
-- * The following function changes size of memory allocated for the
-- * entries and repeatedly inserts the table elements. The occupancy
-- * of the table after the call will be about 50%. Naturally the hash
-- * table must already exist. Remember also that the place of the
-- * table entries is changed. If memory allocation failures are allowed,
-- * this function will return zero, indicating that the table could not be
-- * expanded. If all goes well, it will return a non-zero value.
-- */
--static __always_inline int
--htab_expand(struct funcdesc_ht *htab)
--{
-- struct funcdesc_value **oentries;
-- struct funcdesc_value **olimit;
-- struct funcdesc_value **p;
-- struct funcdesc_value **nentries;
-- size_t nsize;
--
-- oentries = htab->entries;
-- olimit = oentries + htab->size;
--
-- /*
-- * Resize only when table after removal of unused elements is either
-- * too full or too empty.
-- */
-- if (htab->n_elements * 2 > htab->size)
-- nsize = higher_prime_number(htab->n_elements * 2);
-- else
-- nsize = htab->size;
--
-- nentries = _dl_malloc(sizeof(*nentries) * nsize);
-- _dl_memset(nentries, 0, sizeof(*nentries) * nsize);
-- if (nentries == NULL)
-- return 0;
-- htab->entries = nentries;
-- htab->size = nsize;
--
-- p = oentries;
-- do {
-- if (*p)
-- *find_empty_slot_for_expand(htab, hash_pointer((*p)->entry_point)) = *p;
-- p++;
-- } while (p < olimit);
--
--#if 0
-- /*
-- * We can't tell whether this was allocated by the _dl_malloc()
-- * built into ld.so or malloc() in the main executable or libc,
-- * and calling free() for something that wasn't malloc()ed could
-- * do Very Bad Things (TM). Take the conservative approach
-- * here, potentially wasting as much memory as actually used by
-- * the hash table, even if multiple growths occur. That's not
-- * so bad as to require some overengineered solution that would
-- * enable us to keep track of how it was allocated.
-- */
-- _dl_free(oentries);
--#endif
-- return 1;
--}
--
--/*
-- * This function searches for a hash table slot containing an entry
-- * equal to the given element. To delete an entry, call this with
-- * INSERT = 0, then call htab_clear_slot on the slot returned (possibly
-- * after doing some checks). To insert an entry, call this with
-- * INSERT = 1, then write the value you want into the returned slot.
-- * When inserting an entry, NULL may be returned if memory allocation
-- * fails.
-- */
--static __always_inline struct funcdesc_value **
--htab_find_slot(struct funcdesc_ht *htab, void *ptr, int insert)
--{
-- unsigned int index;
-- int hash, hash2;
-- size_t size;
-- struct funcdesc_value **entry;
--
-- if (htab->size * 3 <= htab->n_elements * 4 &&
-- htab_expand(htab) == 0)
-- return NULL;
--
-- hash = hash_pointer(ptr);
--
-- size = htab->size;
-- index = hash % size;
--
-- entry = &htab->entries[index];
-- if (!*entry)
-- goto empty_entry;
-- else if ((*entry)->entry_point == ptr)
-- return entry;
--
-- hash2 = 1 + hash % (size - 2);
-- for (;;) {
-- index += hash2;
-- if (index >= size)
-- index -= size;
--
-- entry = &htab->entries[index];
-- if (!*entry)
-- goto empty_entry;
-- else if ((*entry)->entry_point == ptr)
-- return entry;
-- }
--
-- empty_entry:
-- if (!insert)
-- return NULL;
-+ struct funcdesc_value *entry = p;
-
-- htab->n_elements++;
-- return entry;
-+ return entry->entry_point == q;
- }
-
- void *
-@@ -424,7 +175,7 @@
- tpnt->funcdesc_ht = ht;
- }
-
-- entry = htab_find_slot(ht, entry_point, 1);
-+ entry = htab_find_slot(ht, entry_point, 1, hash_pointer, eq_pointer);
- if (*entry) {
- _dl_assert((*entry)->entry_point == entry_point);
- return _dl_stabilize_funcdesc(*entry);
-@@ -459,7 +210,8 @@
- if (fd->got_value != rpnt->loadaddr.got_value)
- continue;
-
-- address = htab_find_slot(rpnt->funcdesc_ht, (void *)fd->entry_point, 0);
-+ address = htab_find_slot(rpnt->funcdesc_ht, (void *)fd->entry_point, 0,
-+ hash_pointer, eq_pointer);
-
- if (address && *(struct funcdesc_value *const*)address == fd) {
- address = (*(struct funcdesc_value *const*)address)->entry_point;
-diff -Nur uClibc-git/ldso/ldso/xtensa/dl-debug.h uClibc-xtensa/ldso/ldso/xtensa/dl-debug.h
---- uClibc-git/ldso/ldso/xtensa/dl-debug.h 2014-06-02 17:40:33.958711675 +0200
-+++ uClibc-xtensa/ldso/ldso/xtensa/dl-debug.h 2014-06-03 12:22:20.032058866 +0200
-@@ -8,54 +8,31 @@
-
- static const char * const _dl_reltypes_tab[] =
- {
-- "R_XTENSA_NONE",
-- "R_XTENSA_32",
-- "R_XTENSA_RTLD",
-- "R_XTENSA_GLOB_DAT",
-- "R_XTENSA_JMP_SLOT",
-- "R_XTENSA_RELATIVE",
-- "R_XTENSA_PLT",
-- "R_XTENSA_UNUSED7",
-- "R_XTENSA_OP0",
-- "R_XTENSA_OP1",
-- "R_XTENSA_OP2",
-- "R_XTENSA_ASM_EXPAND",
-- "R_XTENSA_ASM_SIMPLIFY",
-- "R_XTENSA_UNUSED13",
-- "R_XTENSA_UNUSED14",
-- "R_XTENSA_GNU_VTINHERIT",
-- "R_XTENSA_GNU_VTENTRY",
-- "R_XTENSA_DIFF8",
-- "R_XTENSA_DIFF16",
-- "R_XTENSA_DIFF32",
-- "R_XTENSA_SLOT0_OP",
-- "R_XTENSA_SLOT1_OP",
-- "R_XTENSA_SLOT2_OP",
-- "R_XTENSA_SLOT3_OP",
-- "R_XTENSA_SLOT4_OP",
-- "R_XTENSA_SLOT5_OP",
-- "R_XTENSA_SLOT6_OP",
-- "R_XTENSA_SLOT7_OP",
-- "R_XTENSA_SLOT8_OP",
-- "R_XTENSA_SLOT9_OP",
-- "R_XTENSA_SLOT10_OP",
-- "R_XTENSA_SLOT11_OP",
-- "R_XTENSA_SLOT12_OP",
-- "R_XTENSA_SLOT13_OP",
-- "R_XTENSA_SLOT14_OP",
-- "R_XTENSA_SLOT0_ALT",
-- "R_XTENSA_SLOT1_ALT",
-- "R_XTENSA_SLOT2_ALT",
-- "R_XTENSA_SLOT3_ALT",
-- "R_XTENSA_SLOT4_ALT",
-- "R_XTENSA_SLOT5_ALT",
-- "R_XTENSA_SLOT6_ALT",
-- "R_XTENSA_SLOT7_ALT",
-- "R_XTENSA_SLOT8_ALT",
-- "R_XTENSA_SLOT9_ALT",
-- "R_XTENSA_SLOT10_ALT",
-- "R_XTENSA_SLOT11_ALT",
-- "R_XTENSA_SLOT12_ALT",
-- "R_XTENSA_SLOT13_ALT",
-- "R_XTENSA_SLOT14_ALT"
-+ [0] "R_XTENSA_NONE", "R_XTENSA_32",
-+ [2] "R_XTENSA_RTLD", "R_XTENSA_GLOB_DAT",
-+ [4] "R_XTENSA_JMP_SLOT", "R_XTENSA_RELATIVE",
-+ [6] "R_XTENSA_PLT", "R_XTENSA_UNUSED7",
-+ [8] "R_XTENSA_OP0", "R_XTENSA_OP1",
-+ [10] "R_XTENSA_OP2", "R_XTENSA_ASM_EXPAND",
-+ [12] "R_XTENSA_ASM_SIMPLIFY", "R_XTENSA_UNUSED13",
-+ [14] "R_XTENSA_UNUSED14", "R_XTENSA_GNU_VTINHERIT",
-+ [16] "R_XTENSA_GNU_VTENTRY", "R_XTENSA_DIFF8",
-+ [18] "R_XTENSA_DIFF16", "R_XTENSA_DIFF32",
-+ [20] "R_XTENSA_SLOT0_OP", "R_XTENSA_SLOT1_OP",
-+ [22] "R_XTENSA_SLOT2_OP", "R_XTENSA_SLOT3_OP",
-+ [24] "R_XTENSA_SLOT4_OP", "R_XTENSA_SLOT5_OP",
-+ [26] "R_XTENSA_SLOT6_OP", "R_XTENSA_SLOT7_OP",
-+ [28] "R_XTENSA_SLOT8_OP", "R_XTENSA_SLOT9_OP",
-+ [30] "R_XTENSA_SLOT10_OP", "R_XTENSA_SLOT11_OP",
-+ [32] "R_XTENSA_SLOT12_OP", "R_XTENSA_SLOT13_OP",
-+ [34] "R_XTENSA_SLOT14_OP", "R_XTENSA_SLOT0_ALT",
-+ [36] "R_XTENSA_SLOT1_ALT", "R_XTENSA_SLOT2_ALT",
-+ [38] "R_XTENSA_SLOT3_ALT", "R_XTENSA_SLOT4_ALT",
-+ [40] "R_XTENSA_SLOT5_ALT", "R_XTENSA_SLOT6_ALT",
-+ [42] "R_XTENSA_SLOT7_ALT", "R_XTENSA_SLOT8_ALT",
-+ [44] "R_XTENSA_SLOT9_ALT", "R_XTENSA_SLOT10_ALT",
-+ [46] "R_XTENSA_SLOT11_ALT", "R_XTENSA_SLOT12_ALT",
-+ [48] "R_XTENSA_SLOT13_ALT", "R_XTENSA_SLOT14_ALT",
-+ [50] "R_XTENSA_TLSDESC_FN", "R_XTENSA_TLSDESC_ARG",
-+ [52] "R_XTENSA_TLS_TPOFF"
- };
-diff -Nur uClibc-git/ldso/ldso/xtensa/dl-startup.h uClibc-xtensa/ldso/ldso/xtensa/dl-startup.h
---- uClibc-git/ldso/ldso/xtensa/dl-startup.h 2014-06-02 17:40:33.958711675 +0200
-+++ uClibc-xtensa/ldso/ldso/xtensa/dl-startup.h 2014-06-03 12:22:20.112059404 +0200
-@@ -11,7 +11,6 @@
- __asm__ (
- " .text\n"
- " .align 4\n"
-- " .literal_position\n"
- " .global _start\n"
- " .type _start, @function\n"
- " .hidden _start\n"
-diff -Nur uClibc-git/ldso/ldso/xtensa/dl-sysdep.h uClibc-xtensa/ldso/ldso/xtensa/dl-sysdep.h
---- uClibc-git/ldso/ldso/xtensa/dl-sysdep.h 2014-06-02 17:40:33.958711675 +0200
-+++ uClibc-xtensa/ldso/ldso/xtensa/dl-sysdep.h 2014-06-03 12:22:20.340060933 +0200
-@@ -78,10 +78,13 @@
- struct elf_resolve;
- extern unsigned long _dl_linux_resolver (struct elf_resolve *, int);
-
--/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
-- undefined references should not be allowed to define the value. */
-+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry or
-+ TLS variable, so undefined references should not be allowed to define
-+ the value. */
- #define elf_machine_type_class(type) \
-- (((type) == R_XTENSA_JMP_SLOT) * ELF_RTYPE_CLASS_PLT)
-+ (((type) == R_XTENSA_JMP_SLOT || (type) == R_XTENSA_TLS_TPOFF \
-+ || (type) == R_XTENSA_TLSDESC_FN || (type) == R_XTENSA_TLSDESC_ARG) \
-+ * ELF_RTYPE_CLASS_PLT)
-
- /* Return the link-time address of _DYNAMIC. */
- static __always_inline Elf32_Addr
-diff -Nur uClibc-git/ldso/ldso/xtensa/dl-tlsdesc.S uClibc-xtensa/ldso/ldso/xtensa/dl-tlsdesc.S
---- uClibc-git/ldso/ldso/xtensa/dl-tlsdesc.S 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/ldso/ldso/xtensa/dl-tlsdesc.S 2014-06-03 12:22:20.340060933 +0200
-@@ -0,0 +1,96 @@
-+/* Thread-local storage handling in the ELF dynamic linker. Xtensa version.
-+ Copyright (C) 2012-2013 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/>. */
-+
-+#include <sysdep.h>
-+#include <tls.h>
-+#include "tlsdesc.h"
-+
-+
-+ .text
-+ .align 4
-+ .hidden _dl_tlsdesc_return
-+ .global _dl_tlsdesc_return
-+ .type _dl_tlsdesc_return, @function
-+_dl_tlsdesc_return:
-+ entry a1, 16
-+ rur.threadptr a3
-+ add a2, a2, a3
-+ retw
-+ .size _dl_tlsdesc_return, .-_dl_tlsdesc_return
-+
-+#ifdef SHARED
-+
-+
-+ /* This function is used for symbols that need dynamic TLS.
-+
-+ The argument passed to this function points to the TLS descriptor.
-+
-+ The assembly code that follows is a rendition of the following
-+ C code, hand-optimized a little bit.
-+
-+ ptrdiff_t
-+ _dl_tlsdesc_dynamic(struct tlsdesc_dynamic_arg *td)
-+ {
-+ dtv_t *dtv = (dtv_t *)THREAD_DTV();
-+ if (td->gen_count <= dtv[0].counter
-+ && dtv[td->tlsinfo.ti_module].pointer.val
-+ != TLS_DTV_UNALLOCATED)
-+ return dtv[td->tlsinfo.ti_module].pointer.val
-+ + td->tlsinfo.ti_offset - __builtin_thread_pointer();
-+ return __tls_get_addr (&td->tlsinfo) - __builtin_thread_pointer();
-+ }
-+ */
-+
-+ .align 4
-+ .hidden _dl_tlsdesc_dynamic
-+ .global _dl_tlsdesc_dynamic
-+ .type _dl_tlsdesc_dynamic, @function
-+_dl_tlsdesc_dynamic:
-+ entry a1, 32
-+
-+ /* dtv_t *dtv = (dtv_t *)THREAD_DTV(); */
-+ rur.threadptr a3
-+ l32i a4, a3, 0
-+
-+ /* if (td->gen_count <= dtv[0].counter */
-+ l32i a6, a2, TLSDESC_GEN_COUNT
-+ l32i a7, a4, 0
-+ blt a7, a6, .Lslow
-+
-+ /* && dtv[td->tlsinfo.ti_module].pointer.val != TLS_DTV_UNALLOCATED) */
-+ l32i a6, a2, TLSDESC_MODID
-+ addx8 a6, a3, a6
-+ l32i a6, a6, 0
-+ beqi a6, -1, .Lslow
-+
-+ /* return dtv[td->tlsinfo.ti_module].pointer.val
-+ + td->tlsinfo.ti_offset - __builtin_thread_pointer(); */
-+ l32i a6, a2, TLSDESC_MODOFF
-+ sub a2, a6, a3
-+ retw
-+
-+ /* return __tls_get_addr (&td->tlsinfo) - __builtin_thread_pointer(); */
-+.Lslow:
-+ mov a10, a2
-+ movi a8, __tls_get_addr
-+ callx8 a8
-+ sub a2, a10, a3
-+ retw
-+ .size _dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic
-+
-+#endif /* SHARED */
-diff -Nur uClibc-git/ldso/ldso/xtensa/elfinterp.c uClibc-xtensa/ldso/ldso/xtensa/elfinterp.c
---- uClibc-git/ldso/ldso/xtensa/elfinterp.c 2014-06-02 17:40:33.958711675 +0200
-+++ uClibc-xtensa/ldso/ldso/xtensa/elfinterp.c 2014-06-03 12:22:20.340060933 +0200
-@@ -31,6 +31,8 @@
- */
-
- #include "ldso.h"
-+#include "dl-tls.h"
-+#include "tlsdeschtab.h"
-
- unsigned long
- _dl_linux_resolver (struct elf_resolve *tpnt, int reloc_entry)
-@@ -146,6 +148,9 @@
- int reloc_type;
- int symtab_index;
- char *symname;
-+#if defined USE_TLS && USE_TLS
-+ struct elf_resolve *tls_tpnt = NULL;
-+#endif
- struct symbol_ref sym_ref;
- ElfW(Addr) *reloc_addr;
- ElfW(Addr) symbol_addr;
-@@ -172,15 +177,22 @@
- * here, so all bases should be covered.
- */
- if (unlikely (!symbol_addr &&
-+ ELF_ST_TYPE (sym_ref.sym->st_info) != STT_TLS &&
- ELF_ST_BIND (sym_ref.sym->st_info) != STB_WEAK)) {
-- _dl_dprintf (2, "%s: can't resolve symbol '%s'\n",
-- _dl_progname, symname);
-- _dl_exit (1);
-+ return 1;
- }
- if (_dl_trace_prelink) {
- _dl_debug_lookup (symname, tpnt, &symtab[symtab_index],
- &sym_ref, elf_machine_type_class(reloc_type));
- }
-+#if defined USE_TLS && USE_TLS
-+ tls_tpnt = sym_ref.tpnt;
-+#endif
-+ } else {
-+ symbol_addr =symtab[symtab_index].st_value;
-+#if defined USE_TLS && USE_TLS
-+ tls_tpnt = tpnt;
-+#endif
- }
-
- #if defined (__SUPPORT_LD_DEBUG__)
-@@ -198,8 +210,8 @@
-
- case R_XTENSA_RTLD:
- if (rpnt->r_addend == 1) {
-- /* Grab the function pointer stashed at the beginning of the
-- GOT by the GOT_INIT function. */
-+ /* Grab the function pointer stashed at the beginning
-+ of the GOT by the GOT_INIT function. */
- *reloc_addr = *(ElfW(Addr) *) tpnt->dynamic_info[DT_PLTGOT];
- } else if (rpnt->r_addend == 2) {
- /* Store the link map for the object. */
-@@ -213,6 +225,35 @@
- *reloc_addr += tpnt->loadaddr + rpnt->r_addend;
- break;
-
-+#if defined USE_TLS && USE_TLS
-+ case R_XTENSA_TLS_TPOFF:
-+ CHECK_STATIC_TLS((struct link_map *) tls_tpnt);
-+ *reloc_addr = symbol_addr + tls_tpnt->l_tls_offset + rpnt->r_addend;
-+ break;
-+ case R_XTENSA_TLSDESC_FN:
-+#ifndef SHARED
-+ CHECK_STATIC_TLS((struct link_map *) tls_tpnt);
-+#else
-+ if (!TRY_STATIC_TLS ((struct link_map *) tls_tpnt))
-+ *reloc_addr = (ElfW(Addr)) _dl_tlsdesc_dynamic;
-+ else
-+#endif
-+ *reloc_addr = (ElfW(Addr)) _dl_tlsdesc_return;
-+ break;
-+ case R_XTENSA_TLSDESC_ARG:
-+#ifndef SHARED
-+ CHECK_STATIC_TLS((struct link_map *) tls_tpnt);
-+#else
-+ if (!TRY_STATIC_TLS ((struct link_map *) tls_tpnt))
-+ *reloc_addr = (ElfW(Addr))
-+ _dl_make_tlsdesc_dynamic((struct link_map *) tls_tpnt,
-+ symbol_addr + *reloc_addr);
-+ else
-+#endif
-+ *reloc_addr += symbol_addr + tls_tpnt->l_tls_offset;
-+ break;
-+#endif
-+
- default:
- return -1; /* Calls _dl_exit(1). */
- }
-diff -Nur uClibc-git/ldso/ldso/xtensa/resolve.S uClibc-xtensa/ldso/ldso/xtensa/resolve.S
---- uClibc-git/ldso/ldso/xtensa/resolve.S 2014-06-02 17:40:33.958711675 +0200
-+++ uClibc-xtensa/ldso/ldso/xtensa/resolve.S 2014-06-03 12:22:20.344060961 +0200
-@@ -27,7 +27,6 @@
-
- .text
- .align 4
-- .literal_position
- .global _dl_linux_resolve
- .type _dl_linux_resolve, @function
- _dl_linux_resolve:
-diff -Nur uClibc-git/libc/sysdeps/linux/xtensa/clone.S uClibc-xtensa/libc/sysdeps/linux/xtensa/clone.S
---- uClibc-git/libc/sysdeps/linux/xtensa/clone.S 2014-06-02 17:40:34.722715903 +0200
-+++ uClibc-xtensa/libc/sysdeps/linux/xtensa/clone.S 2014-06-03 12:04:16.669187814 +0200
-@@ -1,34 +1,38 @@
--/* Copyright (C) 2001, 2005, 2007 Free Software Foundation, Inc.
-+/* Copyright (C) 2001, 2005 Free Software Foundation, Inc.
-
- 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.
-+ modify it under the terms of the GNU Library General Public License as
-+ published by the Free Software Foundation; either version 2 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.
-+ Library 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/>. */
-+ You should have received a copy of the GNU Library 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. */
-
- /* clone is even more special than fork as it mucks with stacks
-- and invokes a function in the right context after it's all over. */
-+ and invokes a function in the right context after its all over. */
-
--#include "sysdep.h"
--#include <sys/syscall.h>
-+#include <features.h>
-+#include <sysdep.h>
- #define _ERRNO_H 1
- #include <bits/errno.h>
--
--/* int clone (a2 = int (*fn)(void *arg),
-- a3 = void *child_stack,
-- a4 = int flags,
-- a5 = void *arg,
-- a6 = pid_t *ptid,
-- a7 = struct user_desc *tls,
-- 16(sp) = pid_t *ctid) */
-+#ifdef RESET_PID
-+#include <tls.h>
-+#endif
-+#define __ASSEMBLY__
-+#include <linux/sched.h>
-+
-+/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,
-+ a2 a3 a4 a5
-+ pid_t *ptid, struct user_desc *tls, pid_t *ctid)
-+ a6 a7 16(sp)
-+*/
-
- .text
- ENTRY (__clone)
-@@ -39,7 +43,7 @@
-
- /* a2 and a3 are candidates for destruction by system-call return
- parameters. We don't need the stack pointer after the system
-- call. We trust that the kernel will preserve a7, a9, and a6. */
-+ call. We trust that the kernel will preserve a6, a7 and a9. */
-
- mov a9, a5 /* save function argument */
- mov a5, a7
-@@ -48,19 +52,18 @@
- mov a6, a4
- mov a4, a8
- l32i a8, a1, 16 /* child_tid */
-- movi a2, SYS_ify (clone)
-+ movi a2, SYS_ify(clone)
-+
-+ /* syscall(NR_clone,clone_flags, usp, parent_tid, child_tls, child_tid)
-+ a2 a6 a3 a4 a5 a8
-+ */
-
-- /* syscall (a2 = NR_clone,
-- a6 = clone_flags,
-- a3 = usp,
-- a4 = parent_tid,
-- a5 = child_tls,
-- a8 = child_tid) */
- syscall
- bltz a2, SYSCALL_ERROR_LABEL
- beqz a2, .Lthread_start
-
-- /* Fall through for parent. */
-+ /* fall through for parent */
-+
- .Lpseudo_end:
- retw
-
-@@ -69,32 +72,38 @@
- j SYSCALL_ERROR_LABEL
-
- .Lthread_start:
-- /* Start child thread. */
-- movi a0, 0 /* terminate the stack frame */
-+
-+#if CLONE_THREAD != 0x00010000 || CLONE_VM != 0x00000100
-+# error invalid values for CLONE_THREAD or CLONE_VM
-+#endif
-
- #ifdef RESET_PID
-- /* Check and see if we need to reset the PID. */
-- bbsi.l a6, 16, 1f /* CLONE_THREAD = 0x00010000 */
-+ bbsi.l a6, 16, .Lskip_restore_pid /* CLONE_THREAD = 0x00010000 */
- movi a2, -1
-- bbsi.l a6, 8, 2f /* CLONE_VM = 0x00000100 */
-- movi a2, SYS_ify (getpid)
-+ bbsi a6, 8, .Lgotpid /* CLONE_VM = 0x00000100 */
-+ movi a2, SYS_ify(getpid)
- syscall
--2: rur a3, THREADPTR
-- movi a4, PID_OFFSET
-- add a4, a4, a3
-- s32i a2, a4, 0
-- movi a4, TID_OFFSET
-- add a4, a4, a3
-- s32i a2, a3, 0
--1:
--#endif /* RESET_PID */
-+.Lgotpid:
-+ rur a3, threadptr
-+ movi a0, TLS_PRE_TCB_SIZE
-+ sub a3, a3, a0
-+ s32i a2, a3, PID
-+ s32i a2, a3, TID
-+.Lskip_restore_pid:
-+#endif
-
-+ /* start child thread */
-+ movi a0, 0 /* terminate the stack frame */
- mov a6, a9 /* load up the 'arg' parameter */
- callx4 a7 /* call the user's function */
-
- /* Call _exit. Note that any return parameter from the user's
-- function in a6 is seen as inputs to _exit. */
-- movi a2, JUMPTARGET(_exit)
-+ function in a6 is seen as inputs to _exit. */
-+#ifdef PIC
-+ movi a2, _exit@PLT
-+#else
-+ movi a2, _exit
-+#endif
- callx4 a2
-
- PSEUDO_END (__clone)
-diff -Nur uClibc-git/libc/sysdeps/linux/xtensa/fork.c uClibc-xtensa/libc/sysdeps/linux/xtensa/fork.c
---- uClibc-git/libc/sysdeps/linux/xtensa/fork.c 2014-06-02 17:40:34.726715926 +0200
-+++ uClibc-xtensa/libc/sysdeps/linux/xtensa/fork.c 2014-06-03 12:04:16.669187814 +0200
-@@ -20,6 +20,10 @@
- {
- return (pid_t) INLINE_SYSCALL(clone, 2, SIGCHLD, 0);
- }
--lt_strong_alias(fork)
--lt_libc_hidden(fork)
-+# ifdef __UCLIBC_HAS_THREADS__
-+strong_alias(fork,__libc_fork)
-+libc_hidden_weak(fork)
-+# else
-+libc_hidden_def(fork)
-+# endif
- #endif
-diff -Nur uClibc-git/libc/sysdeps/linux/xtensa/jmpbuf-unwind.h uClibc-xtensa/libc/sysdeps/linux/xtensa/jmpbuf-unwind.h
---- uClibc-git/libc/sysdeps/linux/xtensa/jmpbuf-unwind.h 2014-06-02 17:40:34.726715926 +0200
-+++ uClibc-xtensa/libc/sysdeps/linux/xtensa/jmpbuf-unwind.h 2014-06-03 12:04:16.669187814 +0200
-@@ -1,25 +1,23 @@
--/* Copyright (C) 1997, 1998, 2007 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/>. */
--
--/* Test if longjmp to JMPBUF would unwind the frame containing a local
-- variable at ADDRESS. */
--
-+/*
-+ * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
-+ *
-+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
-+ */
- #include <setjmp.h>
- #include <jmpbuf-offsets.h>
-
-+/* Test if longjmp to JMPBUF would unwind the frame
-+ containing a local variable at ADDRESS. */
- #define _JMPBUF_UNWINDS(jmpbuf, address) \
- ((void *) (address) < (void *) (jmpbuf)[JB_SP])
-+
-+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
-+#include <stdint.h>
-+#include <unwind.h>
-+
-+#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
-+ _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
-+
-+#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
-+ ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf)[JB_SP] - (_adj))
-+#endif
-diff -Nur uClibc-git/libc/sysdeps/linux/xtensa/Makefile.arch uClibc-xtensa/libc/sysdeps/linux/xtensa/Makefile.arch
---- uClibc-git/libc/sysdeps/linux/xtensa/Makefile.arch 2014-06-02 17:40:34.686715704 +0200
-+++ uClibc-xtensa/libc/sysdeps/linux/xtensa/Makefile.arch 2014-06-03 12:04:16.669187814 +0200
-@@ -5,7 +5,10 @@
- # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
- #
-
--CSRC-y := brk.c fork.c sigaction.c __syscall_error.c
-+CSRC-y := brk.c sigaction.c __syscall_error.c
-
- SSRC-y := bsd-_setjmp.S bsd-setjmp.S setjmp.S clone.S \
- sigrestorer.S syscall.S mmap.S windowspill.S __longjmp.S vfork.S
-+
-+CSRC-$(if $(UCLIBC_HAS_THREADS_NATIVE),,y) += fork.c
-+SSRC-$(if $(UCLIBC_HAS_THREADS_NATIVE),,y) += clone.S
-diff -Nur uClibc-git/libc/sysdeps/linux/xtensa/sys/ptrace.h uClibc-xtensa/libc/sysdeps/linux/xtensa/sys/ptrace.h
---- uClibc-git/libc/sysdeps/linux/xtensa/sys/ptrace.h 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libc/sysdeps/linux/xtensa/sys/ptrace.h 2014-06-03 11:58:41.563379928 +0200
-@@ -0,0 +1,155 @@
-+/* `ptrace' debugger support interface. Linux version.
-+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007
-+ 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 _SYS_PTRACE_H
-+#define _SYS_PTRACE_H 1
-+
-+#include <features.h>
-+
-+/* Kludge away careless namespace pollution from the kernel. */
-+
-+#undef PTRACE_GETREGS
-+#undef PTRACE_SETREGS
-+#undef PTRACE_GETFPREGS
-+#undef PTRACE_SETFPREGS
-+#undef PTRACE_GETFPREGSIZE
-+
-+
-+__BEGIN_DECLS
-+
-+/* Type of the REQUEST argument to `ptrace.' */
-+enum __ptrace_request
-+{
-+ /* Indicate that the process making this request should be traced.
-+ All signals received by this process can be intercepted by its
-+ parent, and its parent can use the other `ptrace' requests. */
-+ PTRACE_TRACEME = 0,
-+#define PT_TRACE_ME PTRACE_TRACEME
-+
-+ /* Return the word in the process's text space at address ADDR. */
-+ PTRACE_PEEKTEXT = 1,
-+#define PT_READ_I PTRACE_PEEKTEXT
-+
-+ /* Return the word in the process's data space at address ADDR. */
-+ PTRACE_PEEKDATA = 2,
-+#define PT_READ_D PTRACE_PEEKDATA
-+
-+ /* Return the word in the process's user area at offset ADDR. */
-+ PTRACE_PEEKUSER = 3,
-+#define PT_READ_U PTRACE_PEEKUSER
-+
-+ /* Write the word DATA into the process's text space at address ADDR. */
-+ PTRACE_POKETEXT = 4,
-+#define PT_WRITE_I PTRACE_POKETEXT
-+
-+ /* Write the word DATA into the process's data space at address ADDR. */
-+ PTRACE_POKEDATA = 5,
-+#define PT_WRITE_D PTRACE_POKEDATA
-+
-+ /* Write the word DATA into the process's user area at offset ADDR. */
-+ PTRACE_POKEUSER = 6,
-+#define PT_WRITE_U PTRACE_POKEUSER
-+
-+ /* Continue the process. */
-+ PTRACE_CONT = 7,
-+#define PT_CONTINUE PTRACE_CONT
-+
-+ /* Kill the process. */
-+ PTRACE_KILL = 8,
-+#define PT_KILL PTRACE_KILL
-+
-+ /* Single step the process.
-+ This is not supported on all machines. */
-+ PTRACE_SINGLESTEP = 9,
-+#define PT_STEP PTRACE_SINGLESTEP
-+
-+ /* Get all general purpose registers used by a processes.
-+ This is not supported on all machines. */
-+ PTRACE_GETREGS = 12,
-+#define PT_GETREGS PTRACE_GETREGS
-+
-+ /* Set all general purpose registers used by a processes.
-+ This is not supported on all machines. */
-+ PTRACE_SETREGS = 13,
-+#define PT_SETREGS PTRACE_SETREGS
-+
-+ /* Get all floating point registers used by a processes.
-+ This is not supported on all machines. */
-+ PTRACE_GETFPREGS = 14,
-+#define PT_GETFPREGS PTRACE_GETFPREGS
-+
-+ /* Set all floating point registers used by a processes.
-+ This is not supported on all machines. */
-+ PTRACE_SETFPREGS = 15,
-+#define PT_SETFPREGS PTRACE_SETFPREGS
-+
-+ /* Attach to a process that is already running. */
-+ PTRACE_ATTACH = 16,
-+#define PT_ATTACH PTRACE_ATTACH
-+
-+ /* Detach from a process attached to with PTRACE_ATTACH. */
-+ PTRACE_DETACH = 17,
-+#define PT_DETACH PTRACE_DETACH
-+
-+ /* Get size required for the buffer holding the floating point registers.
-+ This is not supported on all machines. */
-+ PTRACE_GETFPREGSIZE = 18,
-+#define PT_GETFPREGSIZE PTRACE_GETFPREGSIZE
-+
-+ /* Continue and stop at the next (return from) syscall. */
-+ PTRACE_SYSCALL = 24
-+#define PT_SYSCALL PTRACE_SYSCALL
-+};
-+
-+/* Options set using PTRACE_SETOPTIONS. */
-+enum __ptrace_setoptions {
-+ PTRACE_O_TRACESYSGOOD = 0x00000001,
-+ PTRACE_O_TRACEFORK = 0x00000002,
-+ PTRACE_O_TRACEVFORK = 0x00000004,
-+ PTRACE_O_TRACECLONE = 0x00000008,
-+ PTRACE_O_TRACEEXEC = 0x00000010,
-+ PTRACE_O_TRACEVFORKDONE = 0x00000020,
-+ PTRACE_O_TRACEEXIT = 0x00000040,
-+ PTRACE_O_MASK = 0x0000007f
-+};
-+
-+/* Wait extended result codes for the above trace options. */
-+enum __ptrace_eventcodes {
-+ PTRACE_EVENT_FORK = 1,
-+ PTRACE_EVENT_VFORK = 2,
-+ PTRACE_EVENT_CLONE = 3,
-+ PTRACE_EVENT_EXEC = 4,
-+ PTRACE_EVENT_VFORK_DONE = 5,
-+ PTRACE_EVENT_EXIT = 6
-+};
-+
-+/* Perform process tracing functions. REQUEST is one of the values
-+ above, and determines the action to be taken.
-+ For all requests except PTRACE_TRACEME, PID specifies the process to be
-+ traced.
-+
-+ PID and the other arguments described above for the various requests should
-+ appear (those that are used for the particular request) as:
-+ pid_t PID, void *ADDR, int DATA, void *ADDR2
-+ after REQUEST. */
-+extern long int ptrace (enum __ptrace_request __request, ...) __THROW;
-+
-+__END_DECLS
-+
-+#endif /* _SYS_PTRACE_H */
-diff -Nur uClibc-git/libc/sysdeps/linux/xtensa/sysdep.h uClibc-xtensa/libc/sysdeps/linux/xtensa/sysdep.h
---- uClibc-git/libc/sysdeps/linux/xtensa/sysdep.h 2014-06-02 17:40:34.726715926 +0200
-+++ uClibc-xtensa/libc/sysdeps/linux/xtensa/sysdep.h 2014-06-03 15:24:57.308410770 +0200
-@@ -16,6 +16,10 @@
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-+#ifndef _LINUX_XTENSA_SYSDEP_H
-+#define _LINUX_XTENSA_SYSDEP_H 1
-+
-+#include <common/sysdep.h>
- #include <sys/syscall.h>
-
- #ifdef __ASSEMBLER__
-@@ -24,12 +28,6 @@
- #define ASM_TYPE_DIRECTIVE(name, typearg) .type name, typearg
- #define ASM_SIZE_DIRECTIVE(name) .size name, . - name
-
--#ifdef __STDC__
--#define C_LABEL(name) name :
--#else
--#define C_LABEL(name) name/**/:
--#endif
--
- #define ENTRY(name) \
- ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \
- ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name), @function); \
-@@ -52,6 +50,15 @@
- #undef END
- #define END(name) ASM_SIZE_DIRECTIVE(name)
-
-+/* Local label name for asm code. */
-+#ifndef L
-+# ifdef HAVE_ELF
-+# define L(name) .L##name
-+# else
-+# define L(name) name
-+# endif
-+#endif
-+
- /* Define a macro for this directive so it can be removed in a few places. */
- #define LITERAL_POSITION .literal_position
-
-@@ -123,19 +130,7 @@
- #define PSEUDO_END_ERRVAL(name) \
- END (name)
-
--#undef ret_ERRVAL
--#define ret_ERRVAL retw
--
--#if defined RTLD_PRIVATE_ERRNO
--# define SYSCALL_ERROR_HANDLER \
--0: movi a4, rtld_errno; \
-- neg a2, a2; \
-- s32i a2, a4, 0; \
-- movi a2, -1; \
-- j .Lpseudo_end;
--
--#elif defined _LIBC_REENTRANT
--
-+#if defined _LIBC_REENTRANT
- # if defined USE___THREAD
- # ifndef NOT_IN_libc
- # define SYSCALL_ERROR_ERRNO __libc_errno
-@@ -170,3 +165,9 @@
- #endif /* _LIBC_REENTRANT */
-
- #endif /* __ASSEMBLER__ */
-+
-+/* Pointer mangling is not yet supported for Xtensa. */
-+#define PTR_MANGLE(var) (void) (var)
-+#define PTR_DEMANGLE(var) (void) (var)
-+
-+#endif /* _LINUX_XTENSA_SYSDEP_H */
-diff -Nur uClibc-git/libc/sysdeps/linux/xtensa/vfork.S uClibc-xtensa/libc/sysdeps/linux/xtensa/vfork.S
---- uClibc-git/libc/sysdeps/linux/xtensa/vfork.S 2014-06-02 17:40:34.726715926 +0200
-+++ uClibc-xtensa/libc/sysdeps/linux/xtensa/vfork.S 2014-06-03 12:04:16.669187814 +0200
-@@ -1,4 +1,4 @@
--/* Copyright (C) 2005, 2007 Free Software Foundation, Inc.
-+/* Copyright (C) 2005-2013 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
-@@ -19,72 +19,67 @@
- #include <sys/syscall.h>
- #define _SIGNAL_H
- #include <bits/signum.h>
-+#define __ASSEMBLY__
-+#include <linux/sched.h>
-
-
--/* Clone the calling process, but without copying the whole address space.
-+/*
-+ Clone the calling process, but without copying the whole address space.
- The calling process is suspended until the new process exits or is
- replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
- and the process ID of the new process to the old process.
-
- Note that it is important that we don't create a new stack frame for the
-- caller. */
-+ caller.
-
--
--/* The following are defined in linux/sched.h, which unfortunately
-- is not safe for inclusion in an assembly file. */
--#define CLONE_VM 0x00000100 /* set if VM shared between processes */
--#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to
-- wake it up on mm_release */
-+*/
-
- #ifndef SAVE_PID
--#define SAVE_PID
-+#define SAVE_PID(a,b,c,d)
- #endif
--
- #ifndef RESTORE_PID
--#define RESTORE_PID
-+#define RESTORE_PID(a,b,c)
-+#endif
-+#ifndef RESTORE_PID12
-+#define RESTORE_PID12(a,b,c)
- #endif
-
-+/*
-+ pid_t vfork(void);
-+ Implemented as __clone_syscall(CLONE_VFORK | CLONE_VM | SIGCHLD, 0)
-+ */
-
--/* pid_t vfork(void);
-- Implemented as __clone_syscall(CLONE_VFORK | CLONE_VM | SIGCHLD, 0) */
-
- HIDDEN_ENTRY (__vfork)
-+ .literal .Ljumptable, 0, .L4, .L8, .L12
-
-- movi a6, .Ljumptable
-- extui a2, a0, 30, 2 /* call-size: call4/8/12 = 1/2/3 */
-- addx4 a4, a2, a6 /* find return address in jumptable */
-- l32i a4, a4, 0
-- add a4, a4, a6
--
-+ mov a3, a0 # move return address out of the way
-+ movi a0, .Ljumptable
-+ extui a2, a3, 30, 2 # call-size: call4/8/12 = 1/2/3
-+ addx4 a0, a2, a0 # find return address in jumptable
- slli a2, a2, 30
-- xor a3, a0, a2 /* remove call-size from return addr */
-- extui a5, a4, 30, 2 /* get high bits of jump target */
-- slli a5, a5, 30
-- or a3, a3, a5 /* stuff them into the return address */
-- xor a4, a4, a5 /* clear high bits of jump target */
-- or a0, a4, a2 /* create temporary return address */
-- retw /* "return" to .L4, .L8, or .L12 */
--
-- .align 4
--.Ljumptable:
-- .word 0
-- .word .L4 - .Ljumptable
-- .word .L8 - .Ljumptable
-- .word .L12 - .Ljumptable
-+ l32i a0, a0, 0
-+
-+ xor a3, a3, a2 # remove call-size from return address
-+ or a0, a0, a2 # create temporary return address
-+ retw
-
- /* a7: return address */
-+
- .L4: mov a12, a2
- mov a13, a3
-
-- SAVE_PID
-+ SAVE_PID(a5,a15,a2,a3)
-
-- /* Use syscall 'clone'. Set new stack pointer to the same address. */
-- movi a2, SYS_ify (clone)
-+ /* use syscall 'clone' and set new stack pointer to the same address */
-+
-+ movi a2, SYS_ify(clone)
- movi a3, 0
- movi a6, CLONE_VM | CLONE_VFORK | SIGCHLD
-+
- syscall
-
-- RESTORE_PID
-+ RESTORE_PID(a5,a15,a2)
-
- movi a5, -4096
-
-@@ -94,22 +89,24 @@
-
- bgeu a6, a5, 1f
- jx a7
--1: call4 .Lerr /* returns to original caller */
-
-+1: call4 .Lerr
-
- /* a11: return address */
-+
- .L8: mov a12, a2
- mov a13, a3
- mov a14, a6
-
-- SAVE_PID
-+ SAVE_PID(a9,a15,a2,a3)
-
-- movi a2, SYS_ify (clone)
-+ movi a2, SYS_ify(clone)
- movi a3, 0
- movi a6, CLONE_VM | CLONE_VFORK | SIGCHLD
-+
- syscall
-
-- RESTORE_PID
-+ RESTORE_PID(a9,a15,a2)
-
- movi a9, -4096
-
-@@ -120,22 +117,25 @@
-
- bgeu a10, a9, 1f
- jx a11
--1: call8 .Lerr /* returns to original caller */
-+
-+1: call8 .Lerr
-
-
- /* a15: return address */
-+
- .L12: mov a12, a2
- mov a13, a3
- mov a14, a6
-
-- SAVE_PID
-+ SAVE_PID (a2,a3,a2,a6)
-
-- movi a2, SYS_ify (clone)
-+ movi a2, SYS_ify(clone)
- movi a3, 0
- movi a6, CLONE_VM | CLONE_VFORK | SIGCHLD
-+
- syscall
-
-- RESTORE_PID
-+ RESTORE_PID12(a3,a6,a15)
-
- mov a3, a13
- movi a13, -4096
-@@ -147,18 +147,18 @@
-
- bgeu a14, a13, 1f
- jx a15
--1: call12 .Lerr /* returns to original caller */
-
-+1: call12 .Lerr
-
- .align 4
-+
- .Lerr: entry a1, 16
-
-- /* Restore the return address. */
-- extui a4, a0, 30, 2 /* get the call-size bits */
-+ /* Restore return address */
-+
-+ extui a4, a0, 30, 2
- slli a4, a4, 30
-- slli a3, a3, 2 /* clear high bits of target address */
-- srli a3, a3, 2
-- or a0, a3, a4 /* combine them */
-+ or a0, a3, a4
-
- PSEUDO_END (__vfork)
- .Lpseudo_end:
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.c uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.c
---- uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.c 2014-06-02 17:40:35.102718006 +0200
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.c 2014-06-03 12:35:45.097932730 +0200
-@@ -22,8 +22,6 @@
- #include <lowlevellock.h>
- #include <sys/time.h>
- #include <tls.h>
--#include <tcb-offsets.h>
--
-
- void
- __lll_lock_wait_private (int *futex)
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/pthreadtypes.h uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/pthreadtypes.h
---- uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/pthreadtypes.h 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/pthreadtypes.h 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,184 @@
-+/* Copyright (C) 2002-2012 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 _BITS_PTHREADTYPES_H
-+#define _BITS_PTHREADTYPES_H 1
-+
-+#include <endian.h>
-+
-+#define __SIZEOF_PTHREAD_ATTR_T 36
-+#define __SIZEOF_PTHREAD_MUTEX_T 24
-+#define __SIZEOF_PTHREAD_MUTEXATTR_T 4
-+#define __SIZEOF_PTHREAD_COND_T 48
-+#define __SIZEOF_PTHREAD_COND_COMPAT_T 12
-+#define __SIZEOF_PTHREAD_CONDATTR_T 4
-+#define __SIZEOF_PTHREAD_RWLOCK_T 32
-+#define __SIZEOF_PTHREAD_RWLOCKATTR_T 8
-+#define __SIZEOF_PTHREAD_BARRIER_T 20
-+#define __SIZEOF_PTHREAD_BARRIERATTR_T 4
-+
-+
-+/* Thread identifiers. The structure of the attribute type is not
-+ exposed on purpose. */
-+typedef unsigned long int pthread_t;
-+
-+
-+union pthread_attr_t
-+{
-+ char __size[__SIZEOF_PTHREAD_ATTR_T];
-+ long int __align;
-+};
-+#ifndef __have_pthread_attr_t
-+typedef union pthread_attr_t pthread_attr_t;
-+# define __have_pthread_attr_t 1
-+#endif
-+
-+
-+typedef struct __pthread_internal_slist
-+{
-+ struct __pthread_internal_slist *__next;
-+} __pthread_slist_t;
-+
-+
-+/* Data structures for mutex handling. The structure of the attribute
-+ type is not exposed on purpose. */
-+typedef union
-+{
-+ struct __pthread_mutex_s
-+ {
-+ int __lock;
-+ unsigned int __count;
-+ int __owner;
-+ /* KIND must stay at this position in the structure to maintain
-+ binary compatibility. */
-+ int __kind;
-+ unsigned int __nusers;
-+ __extension__ union
-+ {
-+ int __spins;
-+ __pthread_slist_t __list;
-+ };
-+ } __data;
-+ char __size[__SIZEOF_PTHREAD_MUTEX_T];
-+ long int __align;
-+} pthread_mutex_t;
-+
-+typedef union
-+{
-+ char __size[__SIZEOF_PTHREAD_MUTEXATTR_T];
-+ long int __align;
-+} pthread_mutexattr_t;
-+
-+
-+/* Data structure for conditional variable handling. The structure of
-+ the attribute type is not exposed on purpose. */
-+typedef union
-+{
-+ struct
-+ {
-+ int __lock;
-+ unsigned int __futex;
-+ __extension__ unsigned long long int __total_seq;
-+ __extension__ unsigned long long int __wakeup_seq;
-+ __extension__ unsigned long long int __woken_seq;
-+ void *__mutex;
-+ unsigned int __nwaiters;
-+ unsigned int __broadcast_seq;
-+ } __data;
-+ char __size[__SIZEOF_PTHREAD_COND_T];
-+ __extension__ long long int __align;
-+} pthread_cond_t;
-+
-+typedef union
-+{
-+ char __size[__SIZEOF_PTHREAD_CONDATTR_T];
-+ long int __align;
-+} pthread_condattr_t;
-+
-+
-+/* Keys for thread-specific data */
-+typedef unsigned int pthread_key_t;
-+
-+
-+/* Once-only execution */
-+typedef int pthread_once_t;
-+
-+
-+#if defined __USE_UNIX98 || defined __USE_XOPEN2K
-+/* Data structure for read-write lock variable handling. The
-+ structure of the attribute type is not exposed on purpose. */
-+typedef union
-+{
-+ struct
-+ {
-+ int __lock;
-+ unsigned int __nr_readers;
-+ unsigned int __readers_wakeup;
-+ unsigned int __writer_wakeup;
-+ unsigned int __nr_readers_queued;
-+ unsigned int __nr_writers_queued;
-+#if __BYTE_ORDER == __BIG_ENDIAN
-+ unsigned char __pad1;
-+ unsigned char __pad2;
-+ unsigned char __shared;
-+ /* FLAGS must stay at this position in the structure to maintain
-+ binary compatibility. */
-+ unsigned char __flags;
-+#else
-+ /* FLAGS must stay at this position in the structure to maintain
-+ binary compatibility. */
-+ unsigned char __flags;
-+ unsigned char __shared;
-+ unsigned char __pad1;
-+ unsigned char __pad2;
-+#endif
-+ int __writer;
-+ } __data;
-+ char __size[__SIZEOF_PTHREAD_RWLOCK_T];
-+ long int __align;
-+} pthread_rwlock_t;
-+
-+typedef union
-+{
-+ char __size[__SIZEOF_PTHREAD_RWLOCKATTR_T];
-+ long int __align;
-+} pthread_rwlockattr_t;
-+#endif
-+
-+
-+#ifdef __USE_XOPEN2K
-+/* POSIX spinlock data type. */
-+typedef volatile int pthread_spinlock_t;
-+
-+
-+/* POSIX barriers data type. The structure of the type is
-+ deliberately not exposed. */
-+typedef union
-+{
-+ char __size[__SIZEOF_PTHREAD_BARRIER_T];
-+ long int __align;
-+} pthread_barrier_t;
-+
-+typedef union
-+{
-+ char __size[__SIZEOF_PTHREAD_BARRIERATTR_T];
-+ int __align;
-+} pthread_barrierattr_t;
-+#endif
-+
-+
-+#endif /* bits/pthreadtypes.h */
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/semaphore.h uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/semaphore.h
---- uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/semaphore.h 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/semaphore.h 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,35 @@
-+/* Copyright (C) 2012 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 _SEMAPHORE_H
-+# error "Never use <bits/semaphore.h> directly; include <semaphore.h> instead."
-+#endif
-+
-+
-+#define __SIZEOF_SEM_T 16
-+
-+
-+/* Value returned if `sem_open' failed. */
-+#define SEM_FAILED ((sem_t *) 0)
-+
-+
-+typedef union
-+{
-+ char __size[__SIZEOF_SEM_T];
-+ long int __align;
-+} sem_t;
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/clone.S uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/clone.S
---- uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/clone.S 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/clone.S 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,3 @@
-+#define RESET_PID
-+#include <tcb-offsets.h>
-+#include <libc/sysdeps/linux/xtensa/clone.S>
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/createthread.c uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/createthread.c
---- uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/createthread.c 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/createthread.c 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,24 @@
-+/* Copyright (C) 2012 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. */
-+
-+/* Value passed to 'clone' for initialization of the thread register. */
-+#define TLS_VALUE (pd + 1)
-+
-+
-+/* Get the real implementation. */
-+#include <sysdeps/pthread/createthread.c>
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/fork.c uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/fork.c
---- uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/fork.c 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/fork.c 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,29 @@
-+/* Copyright (C) 2013 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/>. */
-+
-+#include <sched.h>
-+#include <signal.h>
-+#include <sysdep.h>
-+#include <tls.h>
-+
-+
-+#define ARCH_FORK() \
-+ INLINE_SYSCALL (clone, 5, \
-+ CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0, \
-+ NULL, NULL, &THREAD_SELF->tid)
-+
-+#include "../fork.c"
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.c uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.c
---- uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.c 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.c 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,132 @@
-+/* low level locking for pthread library. Generic futex-using version.
-+ Copyright (C) 2003-2013 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/>. */
-+
-+#include <errno.h>
-+#include <sysdep.h>
-+#include <lowlevellock.h>
-+#include <sys/time.h>
-+
-+void
-+__lll_lock_wait_private (int *futex)
-+{
-+ do
-+ {
-+ int oldval = atomic_compare_and_exchange_val_acq (futex, 2, 1);
-+ if (oldval != 0)
-+ lll_futex_wait (futex, 2, LLL_PRIVATE);
-+ }
-+ while (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0);
-+}
-+
-+
-+/* These functions don't get included in libc.so */
-+#ifdef IS_IN_libpthread
-+void
-+__lll_lock_wait (int *futex, int private)
-+{
-+ do
-+ {
-+ int oldval = atomic_compare_and_exchange_val_acq (futex, 2, 1);
-+ if (oldval != 0)
-+ lll_futex_wait (futex, 2, private);
-+ }
-+ while (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0);
-+}
-+
-+
-+int
-+__lll_timedlock_wait (int *futex, const struct timespec *abstime, int private)
-+{
-+ struct timespec rt;
-+
-+ /* Reject invalid timeouts. */
-+ if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
-+ return EINVAL;
-+
-+ /* Upgrade the lock. */
-+ if (atomic_exchange_acq (futex, 2) == 0)
-+ return 0;
-+
-+ do
-+ {
-+ struct timeval tv;
-+
-+ /* Get the current time. */
-+ (void) __gettimeofday (&tv, NULL);
-+
-+ /* Compute relative timeout. */
-+ rt.tv_sec = abstime->tv_sec - tv.tv_sec;
-+ rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000;
-+ if (rt.tv_nsec < 0)
-+ {
-+ rt.tv_nsec += 1000000000;
-+ --rt.tv_sec;
-+ }
-+
-+ /* Already timed out? */
-+ if (rt.tv_sec < 0)
-+ return ETIMEDOUT;
-+
-+ // XYZ: Lost the lock to check whether it was private.
-+ lll_futex_timed_wait (futex, 2, &rt, private);
-+ }
-+ while (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0);
-+
-+ return 0;
-+}
-+
-+
-+int
-+__lll_timedwait_tid (int *tidp, const struct timespec *abstime)
-+{
-+ int tid;
-+
-+ if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
-+ return EINVAL;
-+
-+ /* Repeat until thread terminated. */
-+ while ((tid = *tidp) != 0)
-+ {
-+ struct timeval tv;
-+ struct timespec rt;
-+
-+ /* Get the current time. */
-+ (void) __gettimeofday (&tv, NULL);
-+
-+ /* Compute relative timeout. */
-+ rt.tv_sec = abstime->tv_sec - tv.tv_sec;
-+ rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000;
-+ if (rt.tv_nsec < 0)
-+ {
-+ rt.tv_nsec += 1000000000;
-+ --rt.tv_sec;
-+ }
-+
-+ /* Already timed out? */
-+ if (rt.tv_sec < 0)
-+ return ETIMEDOUT;
-+
-+ /* Wait until thread terminates. */
-+ // XYZ: Lost the lock to check whether it was private.
-+ if (lll_futex_timed_wait (tidp, tid, &rt, LLL_SHARED) == -ETIMEDOUT)
-+ return ETIMEDOUT;
-+ }
-+
-+ return 0;
-+}
-+#endif
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.h uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.h
---- uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.h 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.h 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,293 @@
-+/* Copyright (C) 2005-2013 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 _LOWLEVELLOCK_H
-+#define _LOWLEVELLOCK_H 1
-+
-+#include <time.h>
-+#include <sys/param.h>
-+#include <bits/pthreadtypes.h>
-+#include <atomic.h>
-+#include <sysdep.h>
-+#include <bits/kernel-features.h>
-+
-+#define FUTEX_WAIT 0
-+#define FUTEX_WAKE 1
-+#define FUTEX_REQUEUE 3
-+#define FUTEX_CMP_REQUEUE 4
-+#define FUTEX_WAKE_OP 5
-+#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE ((4 << 24) | 1)
-+#define FUTEX_LOCK_PI 6
-+#define FUTEX_UNLOCK_PI 7
-+#define FUTEX_TRYLOCK_PI 8
-+#define FUTEX_WAIT_BITSET 9
-+#define FUTEX_WAKE_BITSET 10
-+#define FUTEX_PRIVATE_FLAG 128
-+#define FUTEX_CLOCK_REALTIME 256
-+
-+#define FUTEX_BITSET_MATCH_ANY 0xffffffff
-+
-+/* Values for 'private' parameter of locking macros. Yes, the
-+ definition seems to be backwards. But it is not. The bit will be
-+ reversed before passing to the system call. */
-+#define LLL_PRIVATE 0
-+#define LLL_SHARED FUTEX_PRIVATE_FLAG
-+
-+
-+#if !defined NOT_IN_libc || defined IS_IN_rtld
-+/* In libc.so or ld.so all futexes are private. */
-+# ifdef __ASSUME_PRIVATE_FUTEX
-+# define __lll_private_flag(fl, private) \
-+ ((fl) | FUTEX_PRIVATE_FLAG)
-+# else
-+# define __lll_private_flag(fl, private) \
-+ ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))
-+# endif
-+#else
-+# ifdef __ASSUME_PRIVATE_FUTEX
-+# define __lll_private_flag(fl, private) \
-+ (((fl) | FUTEX_PRIVATE_FLAG) ^ (private))
-+# else
-+# define __lll_private_flag(fl, private) \
-+ (__builtin_constant_p (private) \
-+ ? ((private) == 0 \
-+ ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) \
-+ : (fl)) \
-+ : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG) \
-+ & THREAD_GETMEM (THREAD_SELF, header.private_futex))))
-+# endif
-+#endif
-+
-+
-+#define lll_futex_wait(futexp, val, private) \
-+ lll_futex_timed_wait(futexp, val, NULL, private)
-+
-+#define lll_futex_timed_wait(futexp, val, timespec, private) \
-+ ({ \
-+ INTERNAL_SYSCALL_DECL (__err); \
-+ long int __ret; \
-+ __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp), \
-+ __lll_private_flag (FUTEX_WAIT, private), \
-+ (val), (timespec)); \
-+ __ret; \
-+ })
-+
-+#define lll_futex_timed_wait_bitset(futexp, val, timespec, clockbit, private) \
-+ ({ \
-+ INTERNAL_SYSCALL_DECL (__err); \
-+ long int __ret; \
-+ int __op = FUTEX_WAIT_BITSET | clockbit; \
-+ __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp), \
-+ __lll_private_flag (__op, private), \
-+ (val), (timespec), NULL /* Unused. */, \
-+ FUTEX_BITSET_MATCH_ANY); \
-+ __ret; \
-+ })
-+
-+#define lll_futex_wake(futexp, nr, private) \
-+ ({ \
-+ INTERNAL_SYSCALL_DECL (__err); \
-+ long int __ret; \
-+ __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp), \
-+ __lll_private_flag (FUTEX_WAKE, private), \
-+ (nr), 0); \
-+ __ret; \
-+ })
-+
-+#define lll_robust_dead(futexv, private) \
-+ do \
-+ { \
-+ int *__futexp = &(futexv); \
-+ atomic_or (__futexp, FUTEX_OWNER_DIED); \
-+ lll_futex_wake (__futexp, 1, private); \
-+ } \
-+ while (0)
-+
-+/* Returns non-zero if error happened, zero if success. */
-+#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \
-+ ({ \
-+ INTERNAL_SYSCALL_DECL (__err); \
-+ long int __ret; \
-+ __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp), \
-+ __lll_private_flag (FUTEX_CMP_REQUEUE, private),\
-+ (nr_wake), (nr_move), (mutex), (val)); \
-+ INTERNAL_SYSCALL_ERROR_P (__ret, __err); \
-+ })
-+
-+
-+/* Returns non-zero if error happened, zero if success. */
-+#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \
-+ ({ \
-+ INTERNAL_SYSCALL_DECL (__err); \
-+ long int __ret; \
-+ __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp), \
-+ __lll_private_flag (FUTEX_WAKE_OP, private), \
-+ (nr_wake), (nr_wake2), (futexp2), \
-+ FUTEX_OP_CLEAR_WAKE_IF_GT_ONE); \
-+ INTERNAL_SYSCALL_ERROR_P (__ret, __err); \
-+ })
-+
-+
-+#define lll_trylock(lock) \
-+ atomic_compare_and_exchange_val_acq(&(lock), 1, 0)
-+
-+#define lll_cond_trylock(lock) \
-+ atomic_compare_and_exchange_val_acq(&(lock), 2, 0)
-+
-+#define __lll_robust_trylock(futex, id) \
-+ (atomic_compare_and_exchange_val_acq (futex, id, 0) != 0)
-+#define lll_robust_trylock(lock, id) \
-+ __lll_robust_trylock (&(lock), id)
-+
-+extern void __lll_lock_wait_private (int *futex) attribute_hidden;
-+extern void __lll_lock_wait (int *futex, int private) attribute_hidden;
-+extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden;
-+
-+#define __lll_lock(futex, private) \
-+ ((void) ({ \
-+ int *__futex = (futex); \
-+ if (__builtin_expect (atomic_compare_and_exchange_val_acq (__futex, \
-+ 1, 0), 0)) \
-+ { \
-+ if (__builtin_constant_p (private) && (private) == LLL_PRIVATE) \
-+ __lll_lock_wait_private (__futex); \
-+ else \
-+ __lll_lock_wait (__futex, private); \
-+ } \
-+ }))
-+#define lll_lock(futex, private) __lll_lock (&(futex), private)
-+
-+
-+#define __lll_robust_lock(futex, id, private) \
-+ ({ \
-+ int *__futex = (futex); \
-+ int __val = 0; \
-+ \
-+ if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id, \
-+ 0), 0)) \
-+ __val = __lll_robust_lock_wait (__futex, private); \
-+ __val; \
-+ })
-+#define lll_robust_lock(futex, id, private) \
-+ __lll_robust_lock (&(futex), id, private)
-+
-+
-+#define __lll_cond_lock(futex, private) \
-+ ((void) ({ \
-+ int *__futex = (futex); \
-+ if (__builtin_expect (atomic_exchange_acq (__futex, 2), 0)) \
-+ __lll_lock_wait (__futex, private); \
-+ }))
-+#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private)
-+
-+
-+#define lll_robust_cond_lock(futex, id, private) \
-+ __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private)
-+
-+
-+extern int __lll_timedlock_wait (int *futex, const struct timespec *,
-+ int private) attribute_hidden;
-+extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *,
-+ int private) attribute_hidden;
-+
-+#define __lll_timedlock(futex, abstime, private) \
-+ ({ \
-+ int *__futex = (futex); \
-+ int __val = 0; \
-+ \
-+ if (__builtin_expect (atomic_exchange_acq (__futex, 1), 0)) \
-+ __val = __lll_timedlock_wait (__futex, abstime, private); \
-+ __val; \
-+ })
-+#define lll_timedlock(futex, abstime, private) \
-+ __lll_timedlock (&(futex), abstime, private)
-+
-+
-+#define __lll_robust_timedlock(futex, abstime, id, private) \
-+ ({ \
-+ int *__futex = (futex); \
-+ int __val = 0; \
-+ \
-+ if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id, \
-+ 0), 0)) \
-+ __val = __lll_robust_timedlock_wait (__futex, abstime, private); \
-+ __val; \
-+ })
-+#define lll_robust_timedlock(futex, abstime, id, private) \
-+ __lll_robust_timedlock (&(futex), abstime, id, private)
-+
-+
-+#define __lll_unlock(futex, private) \
-+ (void) \
-+ ({ int *__futex = (futex); \
-+ int __oldval = atomic_exchange_rel (__futex, 0); \
-+ if (__builtin_expect (__oldval > 1, 0)) \
-+ lll_futex_wake (__futex, 1, private); \
-+ })
-+#define lll_unlock(futex, private) __lll_unlock(&(futex), private)
-+
-+
-+#define __lll_robust_unlock(futex, private) \
-+ (void) \
-+ ({ int *__futex = (futex); \
-+ int __oldval = atomic_exchange_rel (__futex, 0); \
-+ if (__builtin_expect (__oldval & FUTEX_WAITERS, 0)) \
-+ lll_futex_wake (__futex, 1, private); \
-+ })
-+#define lll_robust_unlock(futex, private) \
-+ __lll_robust_unlock(&(futex), private)
-+
-+
-+#define lll_islocked(futex) \
-+ (futex != 0)
-+
-+
-+/* Our internal lock implementation is identical to the binary-compatible
-+ mutex implementation. */
-+
-+/* Initializers for lock. */
-+#define LLL_LOCK_INITIALIZER (0)
-+#define LLL_LOCK_INITIALIZER_LOCKED (1)
-+
-+/* The states of a lock are:
-+ 0 - untaken
-+ 1 - taken by one user
-+ >1 - taken by more users */
-+
-+/* The kernel notifies a process which uses CLONE_CHILD_CLEARTID via futex
-+ wakeup when the clone terminates. The memory location contains the
-+ thread ID while the clone is running and is reset to zero
-+ afterwards. */
-+#define lll_wait_tid(tid) \
-+ do { \
-+ __typeof (tid) __tid; \
-+ while ((__tid = (tid)) != 0) \
-+ lll_futex_wait (&(tid), __tid, LLL_SHARED);\
-+ } while (0)
-+
-+extern int __lll_timedwait_tid (int *, const struct timespec *)
-+ attribute_hidden;
-+
-+#define lll_timedwait_tid(tid, abstime) \
-+ ({ \
-+ int __res = 0; \
-+ if ((tid) != 0) \
-+ __res = __lll_timedwait_tid (&(tid), (abstime)); \
-+ __res; \
-+ })
-+
-+#endif /* lowlevellock.h */
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/Makefile.arch uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/Makefile.arch
---- uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/Makefile.arch 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/Makefile.arch 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,17 @@
-+# Makefile for uClibc NPTL
-+#
-+# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
-+#
-+
-+libc_linux_arch_CSRC = fork.c
-+libc_linux_arch_SSRC = clone.S vfork.S
-+libpthread_linux_arch_CSRC = pthread_once.c
-+libpthread_linux_arch_SSRC = pt-vfork.S
-+
-+CFLAGS-OMIT-fork.c = -DNOT_IN_libc -DIS_IN_libpthread
-+ASFLAGS-pt-vfork.S = -DNOT_IN_libc -DIS_IN_libpthread -D_LIBC_REENTRANT
-+
-+ASFLAGS-clone.S = -D_LIBC_REENTRANT
-+ASFLAGS-vfork.S = -D_LIBC_REENTRANT
-+ASFLAGS-syscall.S = -D_LIBC_REENTRANT
-+ASFLAGS-mmap.S = -D_LIBC_REENTRANT
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pthread_once.c uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pthread_once.c
---- uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pthread_once.c 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pthread_once.c 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,89 @@
-+/* Copyright (C) 2004-2013 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/>. */
-+
-+#include "pthreadP.h"
-+#include <lowlevellock.h>
-+
-+unsigned long int __fork_generation attribute_hidden;
-+
-+static void
-+clear_once_control (void *arg)
-+{
-+ pthread_once_t *once_control = (pthread_once_t *) arg;
-+
-+ *once_control = 0;
-+ lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE);
-+}
-+
-+int
-+__pthread_once (pthread_once_t *once_control, void (*init_routine) (void))
-+{
-+ for (;;)
-+ {
-+ int oldval;
-+ int newval;
-+
-+ /* Pseudo code:
-+ newval = __fork_generation | 1;
-+ oldval = *once_control;
-+ if ((oldval & 2) == 0)
-+ *once_control = newval;
-+ Do this atomically.
-+ */
-+ do
-+ {
-+ newval = __fork_generation | 1;
-+ oldval = *once_control;
-+ if (oldval & 2)
-+ break;
-+ } while (atomic_compare_and_exchange_val_acq (once_control, newval, oldval) != oldval);
-+
-+ /* Check if the initializer has already been done. */
-+ if ((oldval & 2) != 0)
-+ return 0;
-+
-+ /* Check if another thread already runs the initializer. */
-+ if ((oldval & 1) == 0)
-+ break;
-+
-+ /* Check whether the initializer execution was interrupted by a fork. */
-+ if (oldval != newval)
-+ break;
-+
-+ /* Same generation, some other thread was faster. Wait. */
-+ lll_futex_wait (once_control, oldval, LLL_PRIVATE);
-+ }
-+
-+ /* This thread is the first here. Do the initialization.
-+ Register a cleanup handler so that in case the thread gets
-+ interrupted the initialization can be restarted. */
-+ pthread_cleanup_push (clear_once_control, once_control);
-+
-+ init_routine ();
-+
-+ pthread_cleanup_pop (0);
-+
-+ /* Say that the initialisation is done. */
-+ *once_control = __fork_generation | 2;
-+
-+ /* Wake up all other threads. */
-+ lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE);
-+
-+ return 0;
-+}
-+weak_alias (__pthread_once, pthread_once)
-+strong_alias (__pthread_once, __pthread_once_internal)
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pt-initfini.c uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pt-initfini.c
---- uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pt-initfini.c 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pt-initfini.c 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,134 @@
-+/* Special .init and .fini section support. Linuxthread version.
-+ Copyright (C) 1995,1996,1997,2000,2001,2002 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 of the License, or (at your option) any later version.
-+
-+ In addition to the permissions in the GNU Lesser General Public
-+ License, the Free Software Foundation gives you unlimited
-+ permission to link the compiled version of this file with other
-+ programs, and to distribute those programs without any restriction
-+ coming from the use of this file. (The Library General Public
-+ License restrictions do apply in other respects; for example, they
-+ cover modification of the file, and distribution when not linked
-+ into another program.)
-+
-+ 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/>. */
-+
-+/* This file is compiled into assembly code which is then munged by a sed
-+ script into two files: crti.s and crtn.s.
-+
-+ * crti.s puts a function prologue at the beginning of the
-+ .init and .fini sections and defines global symbols for
-+ those addresses, so they can be called as functions.
-+
-+ * crtn.s puts the corresponding function epilogues
-+ in the .init and .fini sections. */
-+
-+#include <stdlib.h>
-+
-+/* We use embedded asm for .section unconditionally, as this makes it
-+ easier to insert the necessary directives into crtn.S. */
-+#define SECTION(x) __asm__ (".section " x )
-+
-+/* Embed an #include to pull in the alignment and .end directives. */
-+__asm__ ("\n#include \"defs.h\"");
-+__asm__ ("\n#if defined __i686 && defined __ASSEMBLER__");
-+__asm__ ("\n#undef __i686");
-+__asm__ ("\n#define __i686 __i686");
-+__asm__ ("\n#endif");
-+
-+/* The initial common code ends here. */
-+__asm__ ("\n/*@HEADER_ENDS*/");
-+
-+/* To determine whether we need .end and .align: */
-+__asm__ ("\n/*@TESTS_BEGIN*/");
-+extern void dummy (void (*foo) (void));
-+void
-+dummy (void (*foo) (void))
-+{
-+ if (foo)
-+ (*foo) ();
-+}
-+__asm__ ("\n/*@TESTS_END*/");
-+
-+/* The beginning of _init: */
-+__asm__ ("\n/*@_init_PROLOG_BEGINS*/");
-+
-+static void
-+call_initialize_minimal (void)
-+{
-+ extern void __pthread_initialize_minimal_internal (void)
-+ __attribute ((visibility ("hidden")));
-+
-+ __pthread_initialize_minimal_internal ();
-+}
-+
-+SECTION (".init");
-+extern void __attribute__ ((section (".init"))) _init (void);
-+void
-+_init (void)
-+{
-+ /* The very first thing we must do is to set up the registers. */
-+ call_initialize_minimal ();
-+
-+ __asm__ ("ALIGN");
-+ __asm__("END_INIT");
-+ /* Now the epilog. */
-+ __asm__ ("\n/*@_init_PROLOG_ENDS*/");
-+ __asm__ ("\n/*@_init_EPILOG_BEGINS*/");
-+ SECTION(".init");
-+}
-+__asm__ ("END_INIT");
-+
-+/* End of the _init epilog, beginning of the _fini prolog. */
-+__asm__ ("\n/*@_init_EPILOG_ENDS*/");
-+__asm__ ("\n/*@_fini_PROLOG_BEGINS*/");
-+
-+SECTION (".fini");
-+extern void __attribute__ ((section (".fini"))) _fini (void);
-+void
-+_fini (void)
-+{
-+
-+ /* End of the _fini prolog. */
-+ __asm__ ("ALIGN");
-+ __asm__ ("END_FINI");
-+ __asm__ ("\n/*@_fini_PROLOG_ENDS*/");
-+
-+ /* Xtensa: It doesn't really matter whether GCC thinks this is a leaf
-+ function or not, and the scripts that are supposed to remove the
-+ call don't catch the literal, resulting in an undefined symbol
-+ reference. */
-+#if 0
-+ {
-+ /* Let GCC know that _fini is not a leaf function by having a dummy
-+ function call here. We arrange for this call to be omitted from
-+ either crt file. */
-+ extern void i_am_not_a_leaf (void);
-+ i_am_not_a_leaf ();
-+ }
-+#endif
-+
-+ /* Beginning of the _fini epilog. */
-+ __asm__ ("\n/*@_fini_EPILOG_BEGINS*/");
-+ SECTION (".fini");
-+}
-+__asm__ ("END_FINI");
-+
-+/* End of the _fini epilog. Any further generated assembly (e.g. .ident)
-+ is shared between both crt files. */
-+__asm__ ("\n/*@_fini_EPILOG_ENDS*/");
-+__asm__ ("\n/*@TRAILER_BEGINS*/");
-+
-+/* End of file. */
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pt-vfork.S uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pt-vfork.S
---- uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pt-vfork.S 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pt-vfork.S 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,48 @@
-+/* Copyright (C) 2013 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/>. */
-+
-+#include <tls.h>
-+
-+/*
-+ Save the PID value (save the negated value)
-+ Registers ar, as are available; pid, tp are preserved across
-+ */
-+#define SAVE_PID(pid, tp, ar, as) \
-+ rur tp, threadptr; \
-+ movi ar, TLS_PRE_TCB_SIZE; \
-+ sub tp, tp, ar; \
-+ l32i pid, tp, PID; \
-+ neg ar, pid; \
-+ s32i pid, tp, PID; \
-+
-+/*
-+ Restore the PID value if we are back in the parent.
-+ */
-+#define RESTORE_PID(pid, tp, res) \
-+ beqz res, 1f; \
-+ s32i pid, tp, PID; \
-+1:
-+
-+#define RESTORE_PID12(ar, as, at) \
-+ rur as, threadptr; \
-+ movi ar, TLS_PRE_TCB_SIZE; \
-+ sub as, as, ar; \
-+ l32i ar, as, PID; \
-+ neg ar, ar; \
-+ s32i ar, as, PID;
-+
-+#include <libc/sysdeps/linux/xtensa/vfork.S>
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/sysdep-cancel.h uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/sysdep-cancel.h
---- uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/sysdep-cancel.h 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/sysdep-cancel.h 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,108 @@
-+/* Copyright (C) 2003 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. */
-+
-+#include <sysdep.h>
-+#include <tls.h>
-+/* #include <pt-machine.h> */
-+#ifndef __ASSEMBLER__
-+# include <pthreadP.h>
-+#endif
-+
-+#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-+// FIXME: ENTRY includes an entry instruction, here we'd want entry sp, 48!
-+# undef PSEUDO
-+# define PSEUDO(name, syscall_name, args) \
-+ .text; \
-+ ENTRY (name) \
-+ SINGLE_THREAD_P(a15); \
-+ bnez a15, .Lpseudo_cancel; \
-+ DO_CALL (syscall_name, args); \
-+ bgez a2, .Lpseudo_done; \
-+ movi a4, -4095; \
-+ blt a2, a4, .Lpseudo_done; \
-+ j SYSCALL_ERROR_LABEL; \
-+ .Lpseudo_done: \
-+ retw; \
-+ .Lpseudo_cancel: \
-+ /* The syscall args are in a2...a7; no need to save */ \
-+ CENABLE; \
-+ /* The return value is in a10 and preserved across the syscall */ \
-+ DO_CALL (syscall_name, args); \
-+ CDISABLE; \
-+ bgez a2, .Lpseudo_end; \
-+ movi a4, -4095; \
-+ blt a2, a4, .Lpseudo_end; \
-+ j SYSCALL_ERROR_LABEL; \
-+ .Lpseudo_end:
-+
-+
-+# ifdef IS_IN_libpthread
-+# define CENABLE_FUNC __pthread_enable_asynccancel
-+# define CDISABLE_FUNC __pthread_disable_asynccancel
-+# define __local_multiple_threads __pthread_multiple_threads
-+# elif !defined NOT_IN_libc
-+# define CENABLE_FUNC __libc_enable_asynccancel
-+# define CDISABLE_FUNC __libc_disable_asynccancel
-+# define __local_multiple_threads __libc_multiple_threads
-+# elif defined IS_IN_librt
-+# define CENABLE_FUNC __librt_enable_asynccancel
-+# define CDISABLE_FUNC __librt_disable_asynccancel
-+# else
-+# error Unsupported library
-+# endif
-+
-+# define CENABLE movi a8, CENABLE_FUNC; \
-+ callx8 a8
-+# define CDISABLE movi a8, CDISABLE_FUNC; \
-+ callx8 a8
-+
-+# if defined IS_IN_libpthread || !defined NOT_IN_libc
-+# ifndef __ASSEMBLER__
-+extern int __local_multiple_threads attribute_hidden;
-+# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
-+# else
-+# define SINGLE_THREAD_P(reg) movi reg, __local_multiple_threads; \
-+ l32i reg, reg, 0;
-+# endif
-+
-+# else
-+# ifndef __ASSEMBLER__
-+# define SINGLE_THREAD_P \
-+ __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
-+ header.multiple_threads) == 0, 1)
-+# else
-+# define SINGLE_THREAD_P(reg) \
-+ rur reg, threadptr; \
-+ l32i reg, reg, MULTIPLE_THREADS_OFFSET;
-+# endif
-+# endif
-+
-+#else
-+
-+/* This code should never be used but we define it anyhow. */
-+# define SINGLE_THREAD_P (1)
-+# define NO_CANCELLATION 1
-+
-+#endif
-+
-+
-+#ifndef __ASSEMBLER__
-+# define RTLD_SINGLE_THREAD_P \
-+ __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
-+ header.multiple_threads) == 0, 1)
-+#endif
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/vfork.S uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/vfork.S
---- uClibc-git/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/vfork.S 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/vfork.S 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,59 @@
-+/* Copyright (C) 2013 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/>. */
-+
-+#include <tls.h>
-+
-+/*
-+ Save the PID value, save 0x80000000 if PID was 0.
-+ Registers a2 and a3 are available; ar should return the PID and as threadptr
-+ */
-+
-+#define SAVE_PID(pid,tp,ar,as) \
-+ rur tp, threadptr; \
-+ movi ar, TLS_PRE_TCB_SIZE; \
-+ sub tp, tp, ar; \
-+ l32i pid, tp, PID; \
-+ neg ar, pid; \
-+ movi as, 0x80000000; \
-+ moveqz ar, as, ar; \
-+ s32i ar, tp, PID; \
-+
-+/*
-+ Restore the PID value, restore to 0 if saved value was 0x80000000
-+ Return value from the syscall is in a2.
-+ */
-+#define RESTORE_PID(pid,tp,res) \
-+ beqz res, 1f; \
-+ s32i pid, tp, PID; \
-+1:
-+
-+/*
-+ Special version for call12, where we don't have enough registers
-+ available to preserve the original PID.
-+ */
-+#define RESTORE_PID12(ar, as, at) \
-+ rur as, threadptr; \
-+ movi ar, TLS_PRE_TCB_SIZE; \
-+ sub as, as, ar; \
-+ l32i ar, as, PID; \
-+ movi at, 0x80000000; \
-+ sub at, at, ar; \
-+ neg ar, ar; \
-+ moveqz ar, at, at; \
-+ s32i ar, as, PID;
-+
-+#include <libc/sysdeps/linux/xtensa/vfork.S>
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/xtensa/dl-tls.h uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/dl-tls.h
---- uClibc-git/libpthread/nptl/sysdeps/xtensa/dl-tls.h 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/dl-tls.h 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,58 @@
-+/* Thread-local storage handling in the ELF dynamic linker. Xtensa version.
-+ Copyright (C) 2013 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 _XTENSA_DL_TLS_H
-+#define _XTENSA_DL_TLS_H 1
-+
-+/* Type used for the representation of TLS information in the GOT. */
-+typedef struct
-+{
-+ unsigned long int ti_module;
-+ unsigned long int ti_offset;
-+} tls_index;
-+
-+extern void *__tls_get_addr (tls_index *ti);
-+
-+/* Type used to represent a TLS descriptor. */
-+struct tlsdesc
-+{
-+ union
-+ {
-+ void *pointer;
-+ long value;
-+ } argument;
-+ 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
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/xtensa/jmpbuf-unwind.h uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/jmpbuf-unwind.h
---- uClibc-git/libpthread/nptl/sysdeps/xtensa/jmpbuf-unwind.h 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/jmpbuf-unwind.h 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,32 @@
-+/* Copyright (C) 2005,2006 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/>. */
-+
-+#include <setjmp.h>
-+#include <stdint.h>
-+#include <unwind.h>
-+
-+/* Test if longjmp to JMPBUF would unwind the frame
-+ containing a local variable at ADDRESS. */
-+#undef _JMPBUF_UNWINDS
-+#define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \
-+ ((void *) (address) < (void *) demangle (jmpbuf[JB_SP]))
-+
-+#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
-+ _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
-+
-+#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
-+ ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf)[JB_SP] - (_adj))
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/xtensa/libc-tls.c uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/libc-tls.c
---- uClibc-git/libpthread/nptl/sysdeps/xtensa/libc-tls.c 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/libc-tls.c 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,36 @@
-+/* Thread-local storage handling in the ELF dynamic linker. Xtensa 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/>. */
-+
-+#include <sysdeps/generic/libc-tls.c>
-+#include <dl-tls.h>
-+
-+#if defined(USE_TLS) && USE_TLS
-+
-+/* On Xtensa, linker optimizations are not required, so __tls_get_addr
-+ can be called even in statically linked binaries. In this case module
-+ must be always 1 and PT_TLS segment exist in the binary, otherwise it
-+ would not link. */
-+
-+void *
-+__tls_get_addr (tls_index *ti)
-+{
-+ dtv_t *dtv = THREAD_DTV ();
-+ return (char *) dtv[1].pointer.val + ti->ti_offset;
-+}
-+
-+#endif
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/xtensa/Makefile.arch uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/Makefile.arch
---- uClibc-git/libpthread/nptl/sysdeps/xtensa/Makefile.arch 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/Makefile.arch 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,40 @@
-+# Copyright (C) 2012 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.
-+
-+CFLAGS-pt-raise.c = -DNOT_IN_libc -DIS_IN_libpthread
-+
-+ASFLAGS-dl-tlsdesc.S = -DNOT_IN_libc=1
-+ASFLAGS-pthread_spin_lock.S = -DNOT_IN_libc -DIS_IN_libpthread
-+ASFLAGS-pthread_spin_trylock.S = -DNOT_IN_libc -DIS_IN_libpthread
-+ASFLAGS-nptl-sysdep.S = -DNOT_IN_libc -DIS_IN_libpthread \
-+ -D_LIBC_REENTRANT \
-+ -I$(top_srcdir)libc/sysdeps/linux/xtensa
-+
-+libc_arch_a_CSRC = libc-tls.c
-+librt_arch_a_SSRC = dl-tlsdesc.S
-+
-+CFLAGS-gen_tlsdesc.c = -S
-+$(libpthread_arch_OUT)/gen_tlsdesc.c: $(libpthread_arch_DIR)/tlsdesc.sym | $(libpthread_arch_OUT)
-+ $(do_awk) $(top_srcdir)extra/scripts/gen-as-const.awk $< > $@
-+$(libpthread_arch_OUT)/gen_tlsdesc.s: $(libpthread_arch_OUT)/gen_tlsdesc.c | headers
-+ $(compile.c)
-+libpthread-generated-y += $(libpthread_arch_OUT)/gen_tlsdesc.s
-+$(libpthread_arch_OUT)/tlsdesc.h: $(libpthread_arch_OUT)/gen_tlsdesc.s
-+ $(do_sed) $(PTHREAD_GENERATE_MANGLE) $< > $@
-+ @if test ! -s $@ ; then rm -f $@ ; false ; fi
-+pregen-headers-$(UCLIBC_HAS_THREADS_NATIVE) += $(libpthread_arch_OUT)/tlsdesc.h
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/xtensa/pthreaddef.h uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/pthreaddef.h
---- uClibc-git/libpthread/nptl/sysdeps/xtensa/pthreaddef.h 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/pthreaddef.h 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,39 @@
-+/* 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. */
-+
-+/* Default stack size. */
-+#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024)
-+
-+/* Required stack pointer alignment at beginning. */
-+#define STACK_ALIGN 16
-+
-+/* Minimal stack size after allocating thread descriptor and guard size. */
-+#define MINIMAL_REST_STACK 2048
-+
-+/* Alignment requirement for TCB. */
-+#define TCB_ALIGNMENT 16
-+
-+
-+/* Location of current stack frame. */
-+#define CURRENT_STACK_FRAME __builtin_frame_address (0)
-+
-+
-+/* XXX Until we have a better place keep the definitions here. */
-+
-+#define __exit_thread_inline(val) \
-+ INLINE_SYSCALL (exit, 1, (val))
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/xtensa/pthread_spin_lock.S uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/pthread_spin_lock.S
---- uClibc-git/libpthread/nptl/sysdeps/xtensa/pthread_spin_lock.S 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/pthread_spin_lock.S 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,37 @@
-+/* Copyright (C) 2012 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. */
-+
-+ .text
-+ .align 4
-+
-+ .globl pthread_spin_lock
-+pthread_spin_lock:
-+
-+ entry a1, 16
-+
-+ movi a3, 0
-+ wsr a3, scompare1
-+ movi a3, 1
-+1: s32c1i a3, a2, 0
-+ bnez a3, 1b
-+ movi a2, 0
-+
-+ retw
-+
-+ .type pthread_spin_lock, @function
-+ .size pthread_spin_lock, .-pthread_spin_lock
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/xtensa/pthread_spin_trylock.S uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/pthread_spin_trylock.S
---- uClibc-git/libpthread/nptl/sysdeps/xtensa/pthread_spin_trylock.S 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/pthread_spin_trylock.S 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,40 @@
-+/* 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, write to the Free
-+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-+ 02111-1307 USA. */
-+
-+#define _ERRNO_H 1
-+#include <bits/errno.h>
-+
-+ .text
-+ .align 4
-+
-+ .globl pthread_spin_trylock
-+pthread_spin_trylock:
-+
-+ entry a1, 16
-+
-+ movi a3, 0
-+ wsr a3, scompare1
-+ movi a3, 1
-+ s32c1i a3, a2, 0
-+ movi a2, EBUSY
-+ moveqz a2, a3, a3
-+
-+ retw
-+
-+ .type pthread_spin_trylock, @function
-+ .size pthread_spin_trylock, .-pthread_spin_trylock
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/xtensa/tcb-offsets.sym uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/tcb-offsets.sym
---- uClibc-git/libpthread/nptl/sysdeps/xtensa/tcb-offsets.sym 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/tcb-offsets.sym 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,7 @@
-+#include <sysdep.h>
-+#include <tls.h>
-+
-+TLS_PRE_TCB_SIZE sizeof (struct pthread)
-+MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads)
-+PID offsetof (struct pthread, pid)
-+TID offsetof (struct pthread, tid)
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/xtensa/tlsdesc.sym uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/tlsdesc.sym
---- uClibc-git/libpthread/nptl/sysdeps/xtensa/tlsdesc.sym 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/tlsdesc.sym 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,10 @@
-+#include <stddef.h>
-+#include <sysdep.h>
-+#include <tls.h>
-+#include <link.h>
-+#include <dl-tls.h>
-+
-+TLSDESC_ARG offsetof(struct tlsdesc, argument)
-+TLSDESC_GEN_COUNT offsetof(struct tlsdesc_dynamic_arg, gen_count)
-+TLSDESC_MODID offsetof(struct tlsdesc_dynamic_arg, tlsinfo.ti_module)
-+TLSDESC_MODOFF offsetof(struct tlsdesc_dynamic_arg, tlsinfo.ti_offset)
-diff -Nur uClibc-git/libpthread/nptl/sysdeps/xtensa/tls.h uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/tls.h
---- uClibc-git/libpthread/nptl/sysdeps/xtensa/tls.h 1970-01-01 01:00:00.000000000 +0100
-+++ uClibc-xtensa/libpthread/nptl/sysdeps/xtensa/tls.h 2014-06-03 12:04:16.669187814 +0200
-@@ -0,0 +1,159 @@
-+/* Definition for thread-local data handling. NPTL/Xtensa version.
-+ Copyright (C) 2012 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 <stdbool.h>
-+# include <stddef.h>
-+# include <stdint.h>
-+
-+/* Type for the dtv. */
-+typedef union dtv
-+{
-+ size_t counter;
-+ struct
-+ {
-+ void *val;
-+ bool is_static;
-+ } pointer;
-+} dtv_t;
-+
-+
-+#else /* __ASSEMBLER__ */
-+# include <tcb-offsets.h>
-+#endif /* __ASSEMBLER__ */
-+
-+/* We require TLS support in the tools. */
-+#define HAVE_TLS_SUPPORT 1
-+#define HAVE_TLS_MODEL_ATTRIBUTE 1
-+#define HAVE___THREAD 1
-+
-+/* Signal that TLS support is available. */
-+#define USE_TLS 1
-+
-+#ifndef __ASSEMBLER__
-+
-+/* Get system call information. */
-+# include <sysdep.h>
-+
-+/* The TLS blocks start right after the TCB. */
-+# define TLS_DTV_AT_TP 1
-+
-+/* Get the thread descriptor definition. */
-+# include <../../descr.h>
-+
-+typedef struct
-+{
-+ dtv_t *dtv;
-+ void *private;
-+} tcbhead_t;
-+
-+/* 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 16
-+
-+/* This is the size of the TCB. */
-+# define TLS_TCB_SIZE sizeof (tcbhead_t)
-+
-+/* This is the size we need before TCB. */
-+# define TLS_PRE_TCB_SIZE sizeof (struct pthread)
-+
-+/* Alignment requirements for the TCB. */
-+# define TLS_TCB_ALIGN 16
-+
-+
-+/* 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))->dtv = (dtvp) + 1)
-+
-+/* Install new dtv for current thread. */
-+# define INSTALL_NEW_DTV(dtv) \
-+ ({ tcbhead_t *__tcbp; \
-+ __asm__ __volatile__ ("rur %0, threadptr" : "=r" (__tcbp)); \
-+ __tcbp->dtv = (dtv); }) \
-+
-+/* Return dtv of given thread descriptor. */
-+# define GET_DTV(tcbp) \
-+ (((tcbhead_t *) (tcbp))->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) \
-+ ({ __asm__ __volatile__ ("wur %0, threadptr" : : "r" (tcbp)); 0; })
-+
-+/* Return the address of the dtv for the current thread. */
-+# define THREAD_DTV() \
-+ ({ tcbhead_t *__tcbp; \
-+ __asm__ __volatile__ ("rur %0, threadptr" : "=r" (__tcbp)); \
-+ __tcbp->dtv; })
-+
-+/* Return the thread descriptor for the current thread. */
-+# define THREAD_SELF \
-+ ({ struct pthread *__self; \
-+ __asm__ ("rur %0, threadptr" : "=r" (__self)); \
-+ __self - 1; })
-+
-+/* Magic for libthread_db to know how to do THREAD_SELF. */
-+# define DB_THREAD_SELF \
-+ CONST_THREAD_AREA (32, sizeof (struct pthread))
-+
-+/* Access to data in the thread descriptor is easy. */
-+#define THREAD_GETMEM(descr, member) \
-+ descr->member
-+#define THREAD_GETMEM_NC(descr, member, idx) \
-+ descr->member[idx]
-+#define THREAD_SETMEM(descr, member, value) \
-+ descr->member = (value)
-+#define THREAD_SETMEM_NC(descr, member, idx, value) \
-+ descr->member[idx] = (value)
-+
-+/* Get and set the global scope generation counter in struct pthread. */
-+#define THREAD_GSCOPE_FLAG_UNUSED 0
-+#define THREAD_GSCOPE_FLAG_USED 1
-+#define THREAD_GSCOPE_FLAG_WAIT 2
-+#define THREAD_GSCOPE_RESET_FLAG() \
-+ do \
-+ { int __res \
-+ = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
-+ THREAD_GSCOPE_FLAG_UNUSED); \
-+ if (__res == THREAD_GSCOPE_FLAG_WAIT) \
-+ lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE); \
-+ } \
-+ while (0)
-+#define THREAD_GSCOPE_SET_FLAG() \
-+ do \
-+ { \
-+ THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \
-+ atomic_write_barrier (); \
-+ } \
-+ while (0)
-+
-+#define THREAD_GSCOPE_WAIT() \
-+ GL(dl_wait_lookup_done) ()
-+
-+#endif /* __ASSEMBLER__ */
-+
-+#endif /* tls.h */