summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Compostella <jeremy.compostella@intel.com>2017-07-10 17:21:51 -0700
committerNico Huber <nico.h@gmx.de>2017-07-12 10:58:55 +0000
commit54db255529ce8afc689ae425c24b7fb1d45654e8 (patch)
tree496d241e0cf6f70791343ad5e775464b1cce17e4
parent3d384486190c37e8162543fed53da0a7040712d9 (diff)
downloadcoreboot-54db255529ce8afc689ae425c24b7fb1d45654e8.tar.xz
libpayload: Support unaligned pointers for memset
The optimization of the memset() function introduced by commit dbadb1dd634c8c9419215ade0666a7fb69a4447b (libpayload: Reorder default memcpy, speed up memset and memcmp) is provoking an issue on x86 platform when compiling without the CONFIG_GPL option. GCC is making use of the movdqa instruction to copy words. This instruction can raise a "General Protection Fault Exception" when it is called on a non-aligned address argument. Change-Id: I73382a76a4399d8e78244867f2ebb1dca176a6bf Signed-off-by: Jeremy Compostella <jeremy.compostella@intel.com> Reviewed-on: https://review.coreboot.org/20524 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Julius Werner <jwerner@chromium.org> Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
-rw-r--r--payloads/libpayload/libc/memory.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/payloads/libpayload/libc/memory.c b/payloads/libpayload/libc/memory.c
index ae476cf196..1adfb3207f 100644
--- a/payloads/libpayload/libc/memory.c
+++ b/payloads/libpayload/libc/memory.c
@@ -38,6 +38,11 @@ static void *default_memset(void *s, int c, size_t n)
size_t i;
void *ret = s;
unsigned long w = c & 0xff;
+ u8 *p = s;
+
+ s = (void *)ALIGN_UP((uintptr_t)s, sizeof(unsigned long));
+ while (p != (u8 *)s && n--)
+ *p++ = c;
for (i = 1; i < sizeof(unsigned long); i <<= 1)
w = (w << (i * 8)) | w;