aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0051-fix-arm-run-time-abi-string-functions.patch
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2017-07-05 13:04:48 +0300
committerTimo Teräs <timo.teras@iki.fi>2017-07-05 13:06:40 +0300
commit50c197239c89545dd072af45f8e644c92fb706a5 (patch)
tree269117c2bc4f3577f66718accc9d70c66b52bd06 /main/musl/0051-fix-arm-run-time-abi-string-functions.patch
parenta0e0ebc0d01600ae0a82f6a1a788324d1b5e09c5 (diff)
downloadaports-50c197239c89545dd072af45f8e644c92fb706a5.tar.bz2
aports-50c197239c89545dd072af45f8e644c92fb706a5.tar.xz
main/musl: cherry-pick upstream fixes
including regression fix for promoting RTLD_LOCAL to RTLD_GLOBAL
Diffstat (limited to 'main/musl/0051-fix-arm-run-time-abi-string-functions.patch')
-rw-r--r--main/musl/0051-fix-arm-run-time-abi-string-functions.patch177
1 files changed, 177 insertions, 0 deletions
diff --git a/main/musl/0051-fix-arm-run-time-abi-string-functions.patch b/main/musl/0051-fix-arm-run-time-abi-string-functions.patch
new file mode 100644
index 0000000000..a5327410e0
--- /dev/null
+++ b/main/musl/0051-fix-arm-run-time-abi-string-functions.patch
@@ -0,0 +1,177 @@
+From e6def544358afd5648a428d2e02c147a1f901048 Mon Sep 17 00:00:00 2001
+From: Szabolcs Nagy <nsz@port70.net>
+Date: Tue, 21 Feb 2017 00:07:34 +0000
+Subject: [PATCH 51/51] fix arm run-time abi string functions
+
+in arm rtabi these __aeabi_* functions have special abi (they are
+only allowed to clobber r0,r1,r2,r3,ip,lr,cpsr), so they cannot
+be simple wrappers around normal string functions (which may
+clobber other registers), the safest solution is to write them in
+asm, a minimalistic implementation works because these are not
+supposed to be emitted by compilers or used in general.
+---
+ src/string/arm/__aeabi_memclr.c | 9 --------
+ src/string/arm/__aeabi_memcpy.c | 9 --------
+ src/string/arm/__aeabi_memcpy.s | 45 ++++++++++++++++++++++++++++++++++++++++
+ src/string/arm/__aeabi_memmove.c | 9 --------
+ src/string/arm/__aeabi_memset.c | 9 --------
+ src/string/arm/__aeabi_memset.s | 31 +++++++++++++++++++++++++++
+ 6 files changed, 76 insertions(+), 36 deletions(-)
+ delete mode 100644 src/string/arm/__aeabi_memclr.c
+ delete mode 100644 src/string/arm/__aeabi_memcpy.c
+ create mode 100644 src/string/arm/__aeabi_memcpy.s
+ delete mode 100644 src/string/arm/__aeabi_memmove.c
+ delete mode 100644 src/string/arm/__aeabi_memset.c
+ create mode 100644 src/string/arm/__aeabi_memset.s
+
+diff --git a/src/string/arm/__aeabi_memclr.c b/src/string/arm/__aeabi_memclr.c
+deleted file mode 100644
+index a25306d7..00000000
+--- a/src/string/arm/__aeabi_memclr.c
++++ /dev/null
+@@ -1,9 +0,0 @@
+-#include <string.h>
+-#include "libc.h"
+-
+-void __aeabi_memclr(void *dest, size_t n)
+-{
+- memset(dest, 0, n);
+-}
+-weak_alias(__aeabi_memclr, __aeabi_memclr4);
+-weak_alias(__aeabi_memclr, __aeabi_memclr8);
+diff --git a/src/string/arm/__aeabi_memcpy.c b/src/string/arm/__aeabi_memcpy.c
+deleted file mode 100644
+index 4ae5c777..00000000
+--- a/src/string/arm/__aeabi_memcpy.c
++++ /dev/null
+@@ -1,9 +0,0 @@
+-#include <string.h>
+-#include "libc.h"
+-
+-void __aeabi_memcpy(void *restrict dest, const void *restrict src, size_t n)
+-{
+- memcpy(dest, src, n);
+-}
+-weak_alias(__aeabi_memcpy, __aeabi_memcpy4);
+-weak_alias(__aeabi_memcpy, __aeabi_memcpy8);
+diff --git a/src/string/arm/__aeabi_memcpy.s b/src/string/arm/__aeabi_memcpy.s
+new file mode 100644
+index 00000000..3a527e41
+--- /dev/null
++++ b/src/string/arm/__aeabi_memcpy.s
+@@ -0,0 +1,45 @@
++.syntax unified
++
++.global __aeabi_memcpy8
++.global __aeabi_memcpy4
++.global __aeabi_memcpy
++.global __aeabi_memmove8
++.global __aeabi_memmove4
++.global __aeabi_memmove
++
++.type __aeabi_memcpy8,%function
++.type __aeabi_memcpy4,%function
++.type __aeabi_memcpy,%function
++.type __aeabi_memmove8,%function
++.type __aeabi_memmove4,%function
++.type __aeabi_memmove,%function
++
++__aeabi_memmove8:
++__aeabi_memmove4:
++__aeabi_memmove:
++ cmp r0, r1
++ bls 3f
++ cmp r2, #0
++ beq 2f
++ adds r0, r0, r2
++ adds r2, r1, r2
++1: subs r2, r2, #1
++ ldrb r3, [r2]
++ subs r0, r0, #1
++ strb r3, [r0]
++ cmp r1, r2
++ bne 1b
++2: bx lr
++__aeabi_memcpy8:
++__aeabi_memcpy4:
++__aeabi_memcpy:
++3: cmp r2, #0
++ beq 2f
++ adds r2, r1, r2
++1: ldrb r3, [r1]
++ adds r1, r1, #1
++ strb r3, [r0]
++ adds r0, r0, #1
++ cmp r1, r2
++ bne 1b
++2: bx lr
+diff --git a/src/string/arm/__aeabi_memmove.c b/src/string/arm/__aeabi_memmove.c
+deleted file mode 100644
+index 951e7d39..00000000
+--- a/src/string/arm/__aeabi_memmove.c
++++ /dev/null
+@@ -1,9 +0,0 @@
+-#include <string.h>
+-#include "libc.h"
+-
+-void __aeabi_memmove(void *dest, const void *src, size_t n)
+-{
+- memmove(dest, src, n);
+-}
+-weak_alias(__aeabi_memmove, __aeabi_memmove4);
+-weak_alias(__aeabi_memmove, __aeabi_memmove8);
+diff --git a/src/string/arm/__aeabi_memset.c b/src/string/arm/__aeabi_memset.c
+deleted file mode 100644
+index 89299757..00000000
+--- a/src/string/arm/__aeabi_memset.c
++++ /dev/null
+@@ -1,9 +0,0 @@
+-#include <string.h>
+-#include "libc.h"
+-
+-void __aeabi_memset(void *dest, size_t n, int c)
+-{
+- memset(dest, c, n);
+-}
+-weak_alias(__aeabi_memset, __aeabi_memset4);
+-weak_alias(__aeabi_memset, __aeabi_memset8);
+diff --git a/src/string/arm/__aeabi_memset.s b/src/string/arm/__aeabi_memset.s
+new file mode 100644
+index 00000000..f9f60583
+--- /dev/null
++++ b/src/string/arm/__aeabi_memset.s
+@@ -0,0 +1,31 @@
++.syntax unified
++
++.global __aeabi_memclr8
++.global __aeabi_memclr4
++.global __aeabi_memclr
++.global __aeabi_memset8
++.global __aeabi_memset4
++.global __aeabi_memset
++
++.type __aeabi_memclr8,%function
++.type __aeabi_memclr4,%function
++.type __aeabi_memclr,%function
++.type __aeabi_memset8,%function
++.type __aeabi_memset4,%function
++.type __aeabi_memset,%function
++
++__aeabi_memclr8:
++__aeabi_memclr4:
++__aeabi_memclr:
++ movs r2, #0
++__aeabi_memset8:
++__aeabi_memset4:
++__aeabi_memset:
++ cmp r1, #0
++ beq 2f
++ adds r1, r0, r1
++1: strb r2, [r0]
++ adds r0, r0, #1
++ cmp r1, r0
++ bne 1b
++2: bx lr
+--
+2.13.1
+