|
Message-ID: <20170618115847.GG27071@port70.net> Date: Sun, 18 Jun 2017 13:58:47 +0200 From: Szabolcs Nagy <nsz@...t70.net> To: musl@...ts.openwall.com Subject: Re: [PATCH] fix arm run-time abi string functions * Szabolcs Nagy <nsz@...t70.net> [2017-02-21 02:15:08 +0100]: > 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. > --- ping > 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.