diff options
author | Jeremy Compostella <jeremy.compostella@intel.com> | 2017-07-10 17:21:51 -0700 |
---|---|---|
committer | Nico Huber <nico.h@gmx.de> | 2017-07-12 10:58:55 +0000 |
commit | 54db255529ce8afc689ae425c24b7fb1d45654e8 (patch) | |
tree | 496d241e0cf6f70791343ad5e775464b1cce17e4 /payloads/libpayload | |
parent | 3d384486190c37e8162543fed53da0a7040712d9 (diff) |
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>
Diffstat (limited to 'payloads/libpayload')
-rw-r--r-- | payloads/libpayload/libc/memory.c | 5 |
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; |