From 54db255529ce8afc689ae425c24b7fb1d45654e8 Mon Sep 17 00:00:00 2001 From: Jeremy Compostella Date: Mon, 10 Jul 2017 17:21:51 -0700 Subject: 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 Reviewed-on: https://review.coreboot.org/20524 Tested-by: build bot (Jenkins) Reviewed-by: Julius Werner Reviewed-by: Paul Menzel --- payloads/libpayload/libc/memory.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'payloads/libpayload') 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; -- cgit v1.2.3