Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
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.