|
Message-ID: <20170221011506.GO12395@port70.net> Date: Tue, 21 Feb 2017 02:15:08 +0100 From: Szabolcs Nagy <nsz@...t70.net> To: musl@...ts.openwall.com Subject: [PATCH] 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 naive implementation will do 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 | 42 ++++++++++++++++++++++++++++++++++++++++ src/string/arm/__aeabi_memmove.c | 9 --------- src/string/arm/__aeabi_memset.c | 9 --------- src/string/arm/__aeabi_memset.s | 31 +++++++++++++++++++++++++++++ 6 files changed, 73 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..5dd9b027 --- /dev/null +++ b/src/string/arm/__aeabi_memcpy.s @@ -0,0 +1,42 @@ +.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 2f + cmp r2, #0 + bxeq lr + add r0, r0, r2 + add r2, r1, r2 +1: ldrb r3, [r2, #-1]! + cmp r1, r2 + strb r3, [r0, #-1]! + bne 1b + bx lr +__aeabi_memcpy8: +__aeabi_memcpy4: +__aeabi_memcpy: +2: cmp r2, #0 + bxeq lr + sub r0, r0, #1 + add r2, r1, r2 +1: ldrb r3, [r1], #1 + cmp r1, r2 + strb r3, [r0, #1]! + bne 1b + 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..f2c85883 --- /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: + mov r2, #0 +__aeabi_memset8: +__aeabi_memset4: +__aeabi_memset: + cmp r1, #0 + bxeq lr + and r2, r2, #255 + add r1, r0, r1 +1: strb r2, [r0], #1 + cmp r1, r0 + bne 1b + bx lr -- 2.11.0
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.