aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorJan-Simon Möller <dl9pf@gmx.de>2014-04-23 17:14:02 +0200
committerSumit Semwal <sumit.semwal@linaro.org>2016-12-20 22:19:27 +0530
commit1fecead9ce04059bb4f698593bfbc7afc8acecbe (patch)
tree5b3ebc1c7071125548d2ac15e7597abc2437c56d /arch
parent9ddd8819f770eeab7a8b492fe35e2bf089781616 (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.c7
-rw-r--r--arch/x86/boot/string.h2
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 */