mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Szabolcs Nagy <nsz@port70.net>
To: musl@lists.openwall.com
Subject: [PATCH] fix arm run-time abi string functions
Date: Tue, 21 Feb 2017 02:15:08 +0100	[thread overview]
Message-ID: <20170221011506.GO12395@port70.net> (raw)

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



             reply	other threads:[~2017-02-21  1:15 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-21  1:15 Szabolcs Nagy [this message]
2017-06-18 11:58 ` Szabolcs Nagy
2017-06-18 12:14 ` Alexander Monakov
2017-06-18 18:50   ` Szabolcs Nagy
2017-06-18 19:05     ` Alexander Monakov
2017-06-18 19:09       ` Szabolcs Nagy
2017-06-18 19:27         ` Alexander Monakov
2017-06-18 19:11     ` Szabolcs Nagy
2017-06-18 19:40       ` Szabolcs Nagy
2017-06-22 22:39         ` Rich Felker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170221011506.GO12395@port70.net \
    --to=nsz@port70.net \
    --cc=musl@lists.openwall.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).