diff options
author | Jan-Simon Möller <dl9pf@gmx.de> | 2014-04-23 17:14:02 +0200 |
---|---|---|
committer | Sumit Semwal <sumit.semwal@linaro.org> | 2016-12-20 22:19:27 +0530 |
commit | 1fecead9ce04059bb4f698593bfbc7afc8acecbe (patch) | |
tree | 5b3ebc1c7071125548d2ac15e7597abc2437c56d /arch | |
parent | 9ddd8819f770eeab7a8b492fe35e2bf089781616 (diff) |
WORKAROUND DO-NOT-UPSTREAM x86, boot: Work around clang PR18415.
Clang's intrinsics ignore -mregparm=3 when they fall back to calling the
out-of-line implementations. Putting the args on the stack when memcpy()
expects them in registers is not a recipe for a happy kernel.
This bites with -m32 too, so clang is presumably catastrophically
broken for the i386 kernel until this is fixed, unless I'm missing
something.
For information/testing only; do not apply. With this, I can use
'clang -m16' to build all the kernel's 16-bit code and get a successful
boot.
Not-signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Forward-ported-by: Jan-Simon Möller <dl9pf@gmx.de>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/boot/memory.c | 7 | ||||
-rw-r--r-- | arch/x86/boot/string.h | 2 |
2 files changed, 8 insertions, 1 deletions
diff --git a/arch/x86/boot/memory.c b/arch/x86/boot/memory.c index db75d07c3645..7af65046dfad 100644 --- a/arch/x86/boot/memory.c +++ b/arch/x86/boot/memory.c @@ -63,8 +63,13 @@ static int detect_memory_e820(void) count = 0; break; } - +#ifdef __clang__ + /* PR18415 */ + memcpy(desc, &buf, sizeof(*desc)); + desc++; +#else *desc++ = buf; +#endif count++; } while (ireg.ebx && count < ARRAY_SIZE(boot_params.e820_map)); diff --git a/arch/x86/boot/string.h b/arch/x86/boot/string.h index 725e820602b1..3e07af1d80e3 100644 --- a/arch/x86/boot/string.h +++ b/arch/x86/boot/string.h @@ -14,8 +14,10 @@ int memcmp(const void *s1, const void *s2, size_t len); * Access builtin version by default. If one needs to use optimized version, * do "undef memcpy" in .c file and link against right string.c */ +#ifndef __clang__ /* PR18415 */ #define memcpy(d,s,l) __builtin_memcpy(d,s,l) #define memset(d,c,l) __builtin_memset(d,c,l) #define memcmp __builtin_memcmp +#endif #endif /* BOOT_STRING_H */ |