From: Michal Marek <mma...@suse.com>

commit c7858bf16c0b2cc62f475f31e6df28c3a68da1d6 upstream.

The asm-prototypes.h file is used to provide dummy function declarations
for genksyms, when processing asm files with EXPORT_SYMBOL. Make sure
that any architecture defines get out of our way. x86 currently has an
issue with memcpy on 64bit with CONFIG_KMEMCHECK=y and with
memset/__memset on 32bit:

        $ cat init/test.c
        #include <asm/asm-prototypes.h>
        $ make -s init/test.o
        In file included from ./arch/x86/include/asm/string.h:4:0,
                         from ./include/linux/string.h:18,
                         from ./include/linux/bitmap.h:8,
                         from ./include/linux/cpumask.h:11,
                         from ./arch/x86/include/asm/cpumask.h:4,
                         from ./arch/x86/include/asm/msr.h:10,
                         from ./arch/x86/include/asm/processor.h:20,
                         from ./arch/x86/include/asm/cpufeature.h:4,
                         from ./arch/x86/include/asm/thread_info.h:52,
                         from ./include/linux/thread_info.h:25,
                         from ./arch/x86/include/asm/preempt.h:6,
                         from ./include/linux/preempt.h:59,
                         from ./include/linux/spinlock.h:50,
                         from ./include/linux/seqlock.h:35,
                         from ./include/linux/time.h:5,
                         from ./include/uapi/linux/timex.h:56,
                         from ./include/linux/timex.h:56,
                         from ./include/linux/sched.h:19,
                         from ./include/linux/uaccess.h:4,
                         from ./arch/x86/include/asm/asm-prototypes.h:2,
                         from init/test.c:1:
        ./arch/x86/include/asm/string_64.h:52:47: error: expected declaration 
specifiers or ‘...’ before ‘(’ token
         #define memcpy(dst, src, len) __inline_memcpy((dst), (src), (len))
         ./include/asm-generic/asm-prototypes.h:6:14: note: in expansion of 
macro ‘memcpy’
          extern void *memcpy(void *, const void *, __kernel_size_t);

                                                       ^
        ...

During real build, this manifests itself by genksyms segfaulting.

Fixes: 334bb7738764 ("x86/kbuild: enable modversions for symbols exported from 
asm")
Reported-and-tested-by: Borislav Petkov <b...@alien8.de>
Cc: Adam Borowski <kilob...@angband.pl>
Signed-off-by: Michal Marek <mma...@suse.com>
Cc: Guenter Roeck <li...@roeck-us.net>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 include/asm-generic/asm-prototypes.h |    6 ++++++
 1 file changed, 6 insertions(+)

--- a/include/asm-generic/asm-prototypes.h
+++ b/include/asm-generic/asm-prototypes.h
@@ -1,7 +1,13 @@
 #include <linux/bitops.h>
+#undef __memset
 extern void *__memset(void *, int, __kernel_size_t);
+#undef __memcpy
 extern void *__memcpy(void *, const void *, __kernel_size_t);
+#undef __memmove
 extern void *__memmove(void *, const void *, __kernel_size_t);
+#undef memset
 extern void *memset(void *, int, __kernel_size_t);
+#undef memcpy
 extern void *memcpy(void *, const void *, __kernel_size_t);
+#undef memmove
 extern void *memmove(void *, const void *, __kernel_size_t);


Reply via email to