From de2b5c0925d1d87046ed172562190377db8f4449 Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Fri, 26 Apr 2013 13:03:01 +0200 Subject: [PATCH] Fix alignment bug in memcpy_arm (fix #718) --- base/include/arm/cpu/string.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/base/include/arm/cpu/string.h b/base/include/arm/cpu/string.h index 320a143e9..7200acb49 100644 --- a/base/include/arm/cpu/string.h +++ b/base/include/arm/cpu/string.h @@ -34,12 +34,13 @@ namespace Genode size_t d_align = (size_t)d & 0x3; size_t s_align = (size_t)s & 0x3; - /* at least 32 bytes, 4 byte aligned, same alignment */ - if (size < 32 || (d_align ^ s_align)) + /* only same alignments work for the following LDM/STM loop */ + if (d_align != s_align) return size; /* copy to 4 byte alignment */ - for (size_t i = 0; i < s_align; i++, *d++ = *s++, size--); + for (; (size > 0) && (s_align > 0) && (s_align < 4); + s_align++, *d++ = *s++, size--); /* copy 32 byte chunks */ for (; size >= 32; size -= 32) { @@ -48,7 +49,6 @@ namespace Genode : "+r" (s), "+r" (d) :: "r3","r4","r5","r6","r7","r8","r9","r10"); } - return size; } }