aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0002-2b74315d-to-b9b2db2f.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/musl/0002-2b74315d-to-b9b2db2f.patch')
-rw-r--r--main/musl/0002-2b74315d-to-b9b2db2f.patch457
1 files changed, 457 insertions, 0 deletions
diff --git a/main/musl/0002-2b74315d-to-b9b2db2f.patch b/main/musl/0002-2b74315d-to-b9b2db2f.patch
new file mode 100644
index 0000000000..0d3a49c49e
--- /dev/null
+++ b/main/musl/0002-2b74315d-to-b9b2db2f.patch
@@ -0,0 +1,457 @@
+git diff 2b74315d8a31ad8fbcd369116c82e055e0ec3fb7...b9b2db2f374bce907fa5015c9cf63205054f2356
+
+diff --git a/arch/microblaze/syscall_arch.h b/arch/microblaze/syscall_arch.h
+index 70217ff..cab4607 100644
+--- a/arch/microblaze/syscall_arch.h
++++ b/arch/microblaze/syscall_arch.h
+@@ -13,7 +13,7 @@ static __inline long __syscall0(long n)
+ register unsigned long r3 __asm__("r3");
+ __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
+ : "r"(r12)
+- : "memory");
++ : "memory", "r4");
+ return r3;
+ }
+
+@@ -24,7 +24,7 @@ static inline long __syscall1(long n, long a)
+ register unsigned long r5 __asm__("r5") = a;
+ __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
+ : "r"(r12), "r"(r5)
+- : "memory");
++ : "memory", "r4");
+ return r3;
+ }
+
+@@ -36,7 +36,7 @@ static inline long __syscall2(long n, long a, long b)
+ register unsigned long r6 __asm__("r6") = b;
+ __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
+ : "r"(r12), "r"(r5), "r"(r6)
+- : "memory");
++ : "memory", "r4");
+ return r3;
+ }
+
+@@ -49,7 +49,7 @@ static inline long __syscall3(long n, long a, long b, long c)
+ register unsigned long r7 __asm__("r7") = c;
+ __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
+ : "r"(r12), "r"(r5), "r"(r6), "r"(r7)
+- : "memory");
++ : "memory", "r4");
+ return r3;
+ }
+
+@@ -63,7 +63,7 @@ static inline long __syscall4(long n, long a, long b, long c, long d)
+ register unsigned long r8 __asm__("r8") = d;
+ __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
+ : "r"(r12), "r"(r5), "r"(r6), "r"(r7), "r"(r8)
+- : "memory");
++ : "memory", "r4");
+ return r3;
+ }
+
+@@ -78,7 +78,7 @@ static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+ register unsigned long r9 __asm__("r9") = e;
+ __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
+ : "r"(r12), "r"(r5), "r"(r6), "r"(r7), "r"(r8), "r"(r9)
+- : "memory");
++ : "memory", "r4");
+ return r3;
+ }
+
+@@ -94,7 +94,7 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo
+ register unsigned long r10 __asm__("r10") = f;
+ __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
+ : "r"(r12), "r"(r5), "r"(r6), "r"(r7), "r"(r8), "r"(r9), "r"(r10)
+- : "memory");
++ : "memory", "r4");
+ return r3;
+ }
+
+diff --git a/include/search.h b/include/search.h
+index 27f6107..02e407e 100644
+--- a/include/search.h
++++ b/include/search.h
+@@ -22,6 +22,18 @@ int hcreate(size_t);
+ void hdestroy(void);
+ ENTRY *hsearch(ENTRY, ACTION);
+
++#ifdef _GNU_SOURCE
++struct hsearch_data {
++ struct __tab *__tab;
++ unsigned int __unused1;
++ unsigned int __unused2;
++};
++
++int hcreate_r(size_t, struct hsearch_data *);
++void hdestroy_r(struct hsearch_data *);
++int hsearch_r(ENTRY, ACTION, ENTRY **, struct hsearch_data *);
++#endif
++
+ void insque(void *, void *);
+ void remque(void *);
+
+diff --git a/src/malloc/malloc.c b/src/malloc/malloc.c
+index d6ad904..7932a97 100644
+--- a/src/malloc/malloc.c
++++ b/src/malloc/malloc.c
+@@ -37,6 +37,7 @@ static struct {
+ struct bin bins[64];
+ int brk_lock[2];
+ int free_lock[2];
++ unsigned mmap_step;
+ } mal;
+
+
+@@ -162,7 +163,28 @@ static struct chunk *expand_heap(size_t n)
+ new = mal.brk + n + SIZE_ALIGN + PAGE_SIZE - 1 & -PAGE_SIZE;
+ n = new - mal.brk;
+
+- if (__brk(new) != new) goto fail;
++ if (__brk(new) != new) {
++ size_t min = (size_t)PAGE_SIZE << mal.mmap_step/2;
++ n += -n & PAGE_SIZE-1;
++ if (n < min) n = min;
++ void *area = __mmap(0, n, PROT_READ|PROT_WRITE,
++ MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
++ if (area == MAP_FAILED) goto fail;
++
++ mal.mmap_step++;
++ area = (char *)area + SIZE_ALIGN - OVERHEAD;
++ w = area;
++ n -= SIZE_ALIGN;
++ w->psize = 0 | C_INUSE;
++ w->csize = n | C_INUSE;
++ w = NEXT_CHUNK(w);
++ w->psize = n | C_INUSE;
++ w->csize = 0 | C_INUSE;
++
++ unlock(mal.brk_lock);
++
++ return area;
++ }
+
+ w = MEM_TO_CHUNK(new);
+ w->psize = n | C_INUSE;
+diff --git a/src/search/hsearch.c b/src/search/hsearch.c
+index 6fe5ced..5c89651 100644
+--- a/src/search/hsearch.c
++++ b/src/search/hsearch.c
+@@ -1,6 +1,8 @@
++#define _GNU_SOURCE
+ #include <stdlib.h>
+ #include <string.h>
+ #include <search.h>
++#include "libc.h"
+
+ /*
+ open addressing hash table with 2^n table size
+@@ -14,14 +16,17 @@ with the posix api items cannot be iterated and length cannot be queried
+ #define MINSIZE 8
+ #define MAXSIZE ((size_t)-1/2 + 1)
+
+-struct elem {
+- ENTRY item;
+- size_t hash;
++struct __tab {
++ ENTRY *entries;
++ size_t mask;
++ size_t used;
+ };
+
+-static size_t mask;
+-static size_t used;
+-static struct elem *tab;
++static struct hsearch_data htab;
++
++int __hcreate_r(size_t, struct hsearch_data *);
++void __hdestroy_r(struct hsearch_data *);
++int __hsearch_r(ENTRY, ACTION, ENTRY **, struct hsearch_data *);
+
+ static size_t keyhash(char *k)
+ {
+@@ -33,30 +38,30 @@ static size_t keyhash(char *k)
+ return h;
+ }
+
+-static int resize(size_t nel)
++static int resize(size_t nel, struct hsearch_data *htab)
+ {
+ size_t newsize;
+ size_t i, j;
+- struct elem *e, *newe;
+- struct elem *oldtab = tab;
+- struct elem *oldend = tab + mask + 1;
++ ENTRY *e, *newe;
++ ENTRY *oldtab = htab->__tab->entries;
++ ENTRY *oldend = htab->__tab->entries + htab->__tab->mask + 1;
+
+ if (nel > MAXSIZE)
+ nel = MAXSIZE;
+ for (newsize = MINSIZE; newsize < nel; newsize *= 2);
+- tab = calloc(newsize, sizeof *tab);
+- if (!tab) {
+- tab = oldtab;
++ htab->__tab->entries = calloc(newsize, sizeof *htab->__tab->entries);
++ if (!htab->__tab->entries) {
++ htab->__tab->entries = oldtab;
+ return 0;
+ }
+- mask = newsize - 1;
++ htab->__tab->mask = newsize - 1;
+ if (!oldtab)
+ return 1;
+ for (e = oldtab; e < oldend; e++)
+- if (e->item.key) {
+- for (i=e->hash,j=1; ; i+=j++) {
+- newe = tab + (i & mask);
+- if (!newe->item.key)
++ if (e->key) {
++ for (i=keyhash(e->key),j=1; ; i+=j++) {
++ newe = htab->__tab->entries + (i & htab->__tab->mask);
++ if (!newe->key)
+ break;
+ }
+ *newe = *e;
+@@ -67,29 +72,22 @@ static int resize(size_t nel)
+
+ int hcreate(size_t nel)
+ {
+- mask = 0;
+- used = 0;
+- tab = 0;
+- return resize(nel);
++ return __hcreate_r(nel, &htab);
+ }
+
+ void hdestroy(void)
+ {
+- free(tab);
+- tab = 0;
+- mask = 0;
+- used = 0;
++ __hdestroy_r(&htab);
+ }
+
+-static struct elem *lookup(char *key, size_t hash)
++static ENTRY *lookup(char *key, size_t hash, struct hsearch_data *htab)
+ {
+ size_t i, j;
+- struct elem *e;
++ ENTRY *e;
+
+ for (i=hash,j=1; ; i+=j++) {
+- e = tab + (i & mask);
+- if (!e->item.key ||
+- (e->hash==hash && strcmp(e->item.key, key)==0))
++ e = htab->__tab->entries + (i & htab->__tab->mask);
++ if (!e->key || strcmp(e->key, key) == 0)
+ break;
+ }
+ return e;
+@@ -97,22 +95,60 @@ static struct elem *lookup(char *key, size_t hash)
+
+ ENTRY *hsearch(ENTRY item, ACTION action)
+ {
++ ENTRY *e;
++
++ __hsearch_r(item, action, &e, &htab);
++ return e;
++}
++
++int __hcreate_r(size_t nel, struct hsearch_data *htab)
++{
++ int r;
++
++ htab->__tab = calloc(1, sizeof *htab->__tab);
++ if (!htab->__tab)
++ return 0;
++ r = resize(nel, htab);
++ if (r == 0) {
++ free(htab->__tab);
++ htab->__tab = 0;
++ }
++ return r;
++}
++weak_alias(__hcreate_r, hcreate_r);
++
++void __hdestroy_r(struct hsearch_data *htab)
++{
++ if (htab->__tab) free(htab->__tab->entries);
++ free(htab->__tab);
++ htab->__tab = 0;
++}
++weak_alias(__hdestroy_r, hdestroy_r);
++
++int __hsearch_r(ENTRY item, ACTION action, ENTRY **retval, struct hsearch_data *htab)
++{
+ size_t hash = keyhash(item.key);
+- struct elem *e = lookup(item.key, hash);
++ ENTRY *e = lookup(item.key, hash, htab);
+
+- if (e->item.key)
+- return &e->item;
+- if (action == FIND)
++ if (e->key) {
++ *retval = e;
++ return 1;
++ }
++ if (action == FIND) {
++ *retval = 0;
+ return 0;
+- e->item = item;
+- e->hash = hash;
+- if (++used > mask - mask/4) {
+- if (!resize(2*used)) {
+- used--;
+- e->item.key = 0;
++ }
++ *e = item;
++ if (++htab->__tab->used > htab->__tab->mask - htab->__tab->mask/4) {
++ if (!resize(2*htab->__tab->used, htab)) {
++ htab->__tab->used--;
++ e->key = 0;
++ *retval = 0;
+ return 0;
+ }
+- e = lookup(item.key, hash);
++ e = lookup(item.key, hash, htab);
+ }
+- return &e->item;
++ *retval = e;
++ return 1;
+ }
++weak_alias(__hsearch_r, hsearch_r);
+diff --git a/src/signal/arm/sigsetjmp.s b/src/signal/arm/sigsetjmp.s
+index acb0301..0e7bcd4 100644
+--- a/src/signal/arm/sigsetjmp.s
++++ b/src/signal/arm/sigsetjmp.s
+@@ -1,6 +1,9 @@
+ .global sigsetjmp
++.global __sigsetjmp
+ .type sigsetjmp,%function
++.type __sigsetjmp,%function
+ sigsetjmp:
++__sigsetjmp:
+ str a2,[a1,#256]
+ tst a2,a2
+ beq setjmp
+diff --git a/src/signal/i386/sigsetjmp.s b/src/signal/i386/sigsetjmp.s
+index 06e0a61..91c8c04 100644
+--- a/src/signal/i386/sigsetjmp.s
++++ b/src/signal/i386/sigsetjmp.s
+@@ -1,6 +1,9 @@
+ .global sigsetjmp
++.global __sigsetjmp
+ .type sigsetjmp,@function
++.type __sigsetjmp,@function
+ sigsetjmp:
++__sigsetjmp:
+ mov 4(%esp),%eax
+ mov 8(%esp),%ecx
+ mov %ecx,24(%eax)
+diff --git a/src/signal/microblaze/sigsetjmp.s b/src/signal/microblaze/sigsetjmp.s
+index be869d6..2a23d14 100644
+--- a/src/signal/microblaze/sigsetjmp.s
++++ b/src/signal/microblaze/sigsetjmp.s
+@@ -1,6 +1,9 @@
+ .global sigsetjmp
++.global __sigsetjmp
+ .type sigsetjmp,@function
++.type __sigsetjmp,@function
+ sigsetjmp:
++__sigsetjmp:
+ swi r6, r5, 72
+ beqi r6, setjmp@PLT
+
+diff --git a/src/signal/mips/sigsetjmp.s b/src/signal/mips/sigsetjmp.s
+index 502e079..133ca77 100644
+--- a/src/signal/mips/sigsetjmp.s
++++ b/src/signal/mips/sigsetjmp.s
+@@ -1,8 +1,11 @@
+ .set noreorder
+
+ .global sigsetjmp
++.global __sigsetjmp
+ .type sigsetjmp,@function
++.type __sigsetjmp,@function
+ sigsetjmp:
++__sigsetjmp:
+ lui $gp, %hi(_gp_disp)
+ addiu $gp, %lo(_gp_disp)
+ beq $5, $0, 1f
+diff --git a/src/signal/powerpc/sigsetjmp.s b/src/signal/powerpc/sigsetjmp.s
+index d7d1af3..461b737 100644
+--- a/src/signal/powerpc/sigsetjmp.s
++++ b/src/signal/powerpc/sigsetjmp.s
+@@ -1,6 +1,9 @@
+ .global sigsetjmp
++ .global __sigsetjmp
+ .type sigsetjmp,%function
++ .type __sigsetjmp,%function
+ sigsetjmp:
++__sigsetjmp:
+ #int sigsetjmp(sigjmp_buf buf, int save)
+ # r3 r4
+ #0) store save into buf->__fl
+diff --git a/src/signal/sh/sigsetjmp.s b/src/signal/sh/sigsetjmp.s
+index f6cae80..7951f07 100644
+--- a/src/signal/sh/sigsetjmp.s
++++ b/src/signal/sh/sigsetjmp.s
+@@ -1,6 +1,9 @@
+ .global sigsetjmp
+-.type sigsetjmp, @function
++.global __sigsetjmp
++.type sigsetjmp,@function
++.type __sigsetjmp,@function
+ sigsetjmp:
++__sigsetjmp:
+ mov.l r5, @(36,r4)
+ tst r5, r5
+ bf 2f
+diff --git a/src/signal/sigsetjmp.c b/src/signal/sigsetjmp.c
+index cb2257f..1bbe1a0 100644
+--- a/src/signal/sigsetjmp.c
++++ b/src/signal/sigsetjmp.c
+@@ -1,5 +1,6 @@
+ #include <setjmp.h>
+ #include <signal.h>
++#include "libc.h"
+
+ /* !!! This function will not work unless the compiler performs
+ * tail call optimization. Machine-specific asm versions should
+@@ -12,3 +13,5 @@ int sigsetjmp(sigjmp_buf buf, int save)
+ pthread_sigmask(SIG_SETMASK, 0, (sigset_t *)buf->__ss);
+ return setjmp(buf);
+ }
++
++weak_alias(sigsetjmp, __sigsetjmp);
+diff --git a/src/signal/x32/sigsetjmp.s b/src/signal/x32/sigsetjmp.s
+index dc38f03..17436f0 100644
+--- a/src/signal/x32/sigsetjmp.s
++++ b/src/signal/x32/sigsetjmp.s
+@@ -1,7 +1,10 @@
+ /* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */
+ .global sigsetjmp
++.global __sigsetjmp
+ .type sigsetjmp,@function
++.type __sigsetjmp,@function
+ sigsetjmp:
++__sigsetjmp:
+ andl %esi,%esi
+ movq %rsi,64(%rdi)
+ jz 1f
+diff --git a/src/signal/x86_64/sigsetjmp.s b/src/signal/x86_64/sigsetjmp.s
+index dc38f03..17436f0 100644
+--- a/src/signal/x86_64/sigsetjmp.s
++++ b/src/signal/x86_64/sigsetjmp.s
+@@ -1,7 +1,10 @@
+ /* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */
+ .global sigsetjmp
++.global __sigsetjmp
+ .type sigsetjmp,@function
++.type __sigsetjmp,@function
+ sigsetjmp:
++__sigsetjmp:
+ andl %esi,%esi
+ movq %rsi,64(%rdi)
+ jz 1f