mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Andrey Smirnov <andrew.smirnov@gmail.com>
To: barebox@lists.infradead.org
Cc: Andrey Smirnov <andrew.smirnov@gmail.com>
Subject: [PATCH] ARM: lib64: Properly handle unaligned addresses in string functions
Date: Fri, 10 Aug 2018 11:52:01 -0700	[thread overview]
Message-ID: <20180810185201.7677-1-andrew.smirnov@gmail.com> (raw)

Together FEC driver and parts of IP stack might end up trying to
memcpy() small chunks of memory from uncached (that is Device memory)
addresses that are not properly aligned, leading to data abort.

To prevent such cases, add code to guard unaligned accesses and
redirect them to byte-wise implementations which do not have the above
problem.

Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
---
 arch/arm/lib64/string.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/arch/arm/lib64/string.c b/arch/arm/lib64/string.c
index cb2633152..1b04f4487 100644
--- a/arch/arm/lib64/string.c
+++ b/arch/arm/lib64/string.c
@@ -5,9 +5,16 @@
 void *__arch_memset(void *dst, int c, __kernel_size_t size);
 void *__arch_memcpy(void * dest, const void *src, size_t count);
 
+static bool properly_aligned(const void *ptr)
+{
+	const unsigned long address = (unsigned long)ptr;
+
+	return get_cr() & CR_M && IS_ALIGNED(address, 16);
+}
+
 void *memset(void *dst, int c, __kernel_size_t size)
 {
-	if (likely(get_cr() & CR_M))
+	if (likely(properly_aligned(dst)))
 		return __arch_memset(dst, c, size);
 
 	return __default_memset(dst, c, size);
@@ -15,7 +22,7 @@ void *memset(void *dst, int c, __kernel_size_t size)
 
 void *memcpy(void * dest, const void *src, size_t count)
 {
-	if (likely(get_cr() & CR_M))
+	if (likely(properly_aligned(dest) && properly_aligned(src)))
 		return __arch_memcpy(dest, src, count);
 
 	return __default_memcpy(dest, src, count);
-- 
2.17.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

             reply	other threads:[~2018-08-10 18:52 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-10 18:52 Andrey Smirnov [this message]
2018-08-13  6:41 ` Sascha Hauer
2018-08-13 14:16   ` Andrey Smirnov

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=20180810185201.7677-1-andrew.smirnov@gmail.com \
    --to=andrew.smirnov@gmail.com \
    --cc=barebox@lists.infradead.org \
    /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.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox