Commit b668970e authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Ralf Baechle

MIPS: Fix modversions

kernelci.org reports tons of build warnings for linux-next:

35	WARNING: "memcpy" [fs/fat/msdos.ko] has no CRC!
35	WARNING: "__copy_user" [fs/fat/fat.ko] has no CRC!
32	WARNING: EXPORT symbol "memset" [vmlinux] version generation failed, symbol will not be versioned.
32	WARNING: EXPORT symbol "copy_page" [vmlinux] version generation failed, symbol will not be versioned.
32	WARNING: EXPORT symbol "clear_page" [vmlinux] version generation failed, symbol will not be versioned.
32	WARNING: EXPORT symbol "__strncpy_from_user_nocheck_asm" [vmlinux] version generation failed, symbol will not be versioned.

The problem here is mainly the missing asm/asm-prototypes.h header file
that is supposed to include the prototypes for each symbol that is exported
from an assembler file.

A second problem is that the asm/uaccess.h header contains some but not
all the necessary declarations for the user access helpers.

Finally, the vdso build is broken once we add asm/asm-prototypes.h, so
we have to fix this at the same time by changing the vdso header. My
approach here is to just not look for exported symbols in the VDSO
assembler files, as the symbols cannot be exported anyway.

Fixes: 576a2f0c ("MIPS: Export memcpy & memset functions alongside their definitions")
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: James Hogan <james.hogan@imgtec.com>
Cc: Maciej W. Rozycki <macro@imgtec.com>
Cc: linux-mips@linux-mips.org
Cc: linux-kernel@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/15038/
Patchwork: https://patchwork.linux-mips.org/patch/15069/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent ea58fca1
#include <asm/checksum.h>
#include <asm/page.h>
#include <asm/fpu.h>
#include <asm-generic/asm-prototypes.h>
#include <asm/uaccess.h>
...@@ -1241,6 +1241,9 @@ extern size_t __copy_in_user_eva(void *__to, const void *__from, size_t __n); ...@@ -1241,6 +1241,9 @@ extern size_t __copy_in_user_eva(void *__to, const void *__from, size_t __n);
__cu_len; \ __cu_len; \
}) })
extern __kernel_size_t __bzero_kernel(void __user *addr, __kernel_size_t size);
extern __kernel_size_t __bzero(void __user *addr, __kernel_size_t size);
/* /*
* __clear_user: - Zero a block of memory in user space, with less checking. * __clear_user: - Zero a block of memory in user space, with less checking.
* @to: Destination address, in user space. * @to: Destination address, in user space.
...@@ -1293,6 +1296,9 @@ __clear_user(void __user *addr, __kernel_size_t size) ...@@ -1293,6 +1296,9 @@ __clear_user(void __user *addr, __kernel_size_t size)
__cl_size; \ __cl_size; \
}) })
extern long __strncpy_from_kernel_nocheck_asm(char *__to, const char __user *__from, long __len);
extern long __strncpy_from_user_nocheck_asm(char *__to, const char __user *__from, long __len);
/* /*
* __strncpy_from_user: - Copy a NUL terminated string from userspace, with less checking. * __strncpy_from_user: - Copy a NUL terminated string from userspace, with less checking.
* @dst: Destination address, in kernel space. This buffer must be at * @dst: Destination address, in kernel space. This buffer must be at
...@@ -1344,6 +1350,9 @@ __strncpy_from_user(char *__to, const char __user *__from, long __len) ...@@ -1344,6 +1350,9 @@ __strncpy_from_user(char *__to, const char __user *__from, long __len)
return res; return res;
} }
extern long __strncpy_from_kernel_asm(char *__to, const char __user *__from, long __len);
extern long __strncpy_from_user_asm(char *__to, const char __user *__from, long __len);
/* /*
* strncpy_from_user: - Copy a NUL terminated string from userspace. * strncpy_from_user: - Copy a NUL terminated string from userspace.
* @dst: Destination address, in kernel space. This buffer must be at * @dst: Destination address, in kernel space. This buffer must be at
...@@ -1393,6 +1402,9 @@ strncpy_from_user(char *__to, const char __user *__from, long __len) ...@@ -1393,6 +1402,9 @@ strncpy_from_user(char *__to, const char __user *__from, long __len)
return res; return res;
} }
extern long __strlen_kernel_asm(const char __user *s);
extern long __strlen_user_asm(const char __user *s);
/* /*
* strlen_user: - Get the size of a string in user space. * strlen_user: - Get the size of a string in user space.
* @str: The string to measure. * @str: The string to measure.
...@@ -1434,6 +1446,9 @@ static inline long strlen_user(const char __user *s) ...@@ -1434,6 +1446,9 @@ static inline long strlen_user(const char __user *s)
return res; return res;
} }
extern long __strnlen_kernel_nocheck_asm(const char __user *s, long n);
extern long __strnlen_user_nocheck_asm(const char __user *s, long n);
/* Returns: 0 if bad, string length+1 (memory size) of string if ok */ /* Returns: 0 if bad, string length+1 (memory size) of string if ok */
static inline long __strnlen_user(const char __user *s, long n) static inline long __strnlen_user(const char __user *s, long n)
{ {
...@@ -1463,6 +1478,9 @@ static inline long __strnlen_user(const char __user *s, long n) ...@@ -1463,6 +1478,9 @@ static inline long __strnlen_user(const char __user *s, long n)
return res; return res;
} }
extern long __strnlen_kernel_asm(const char __user *s, long n);
extern long __strnlen_user_asm(const char __user *s, long n);
/* /*
* strnlen_user: - Get the size of a string in user space. * strnlen_user: - Get the size of a string in user space.
* @str: The string to measure. * @str: The string to measure.
......
...@@ -25,7 +25,6 @@ ...@@ -25,7 +25,6 @@
*/ */
.macro __BUILD_STRLEN_ASM func .macro __BUILD_STRLEN_ASM func
LEAF(__strlen_\func\()_asm) LEAF(__strlen_\func\()_asm)
EXPORT_SYMBOL(__strlen_\func\()_asm)
LONG_L v0, TI_ADDR_LIMIT($28) # pointer ok? LONG_L v0, TI_ADDR_LIMIT($28) # pointer ok?
and v0, a0 and v0, a0
bnez v0, .Lfault\@ bnez v0, .Lfault\@
...@@ -50,9 +49,11 @@ EXPORT_SYMBOL(__strlen_\func\()_asm) ...@@ -50,9 +49,11 @@ EXPORT_SYMBOL(__strlen_\func\()_asm)
/* Set aliases */ /* Set aliases */
.global __strlen_user_asm .global __strlen_user_asm
.set __strlen_user_asm, __strlen_kernel_asm .set __strlen_user_asm, __strlen_kernel_asm
EXPORT_SYMBOL(__strlen_user_asm)
#endif #endif
__BUILD_STRLEN_ASM kernel __BUILD_STRLEN_ASM kernel
EXPORT_SYMBOL(__strlen_kernel_asm)
#ifdef CONFIG_EVA #ifdef CONFIG_EVA
...@@ -60,4 +61,5 @@ __BUILD_STRLEN_ASM kernel ...@@ -60,4 +61,5 @@ __BUILD_STRLEN_ASM kernel
.set eva .set eva
__BUILD_STRLEN_ASM user __BUILD_STRLEN_ASM user
.set pop .set pop
EXPORT_SYMBOL(__strlen_user_asm)
#endif #endif
...@@ -31,13 +31,11 @@ ...@@ -31,13 +31,11 @@
.macro __BUILD_STRNCPY_ASM func .macro __BUILD_STRNCPY_ASM func
LEAF(__strncpy_from_\func\()_asm) LEAF(__strncpy_from_\func\()_asm)
EXPORT_SYMBOL(__strncpy_from_\func\()_asm)
LONG_L v0, TI_ADDR_LIMIT($28) # pointer ok? LONG_L v0, TI_ADDR_LIMIT($28) # pointer ok?
and v0, a1 and v0, a1
bnez v0, .Lfault\@ bnez v0, .Lfault\@
FEXPORT(__strncpy_from_\func\()_nocheck_asm) FEXPORT(__strncpy_from_\func\()_nocheck_asm)
EXPORT_SYMBOL(__strncpy_from_\func\()_nocheck_asm)
move t0, zero move t0, zero
move v1, a1 move v1, a1
.ifeqs "\func","kernel" .ifeqs "\func","kernel"
...@@ -75,15 +73,19 @@ EXPORT_SYMBOL(__strncpy_from_\func\()_nocheck_asm) ...@@ -75,15 +73,19 @@ EXPORT_SYMBOL(__strncpy_from_\func\()_nocheck_asm)
.global __strncpy_from_user_nocheck_asm .global __strncpy_from_user_nocheck_asm
.set __strncpy_from_user_asm, __strncpy_from_kernel_asm .set __strncpy_from_user_asm, __strncpy_from_kernel_asm
.set __strncpy_from_user_nocheck_asm, __strncpy_from_kernel_nocheck_asm .set __strncpy_from_user_nocheck_asm, __strncpy_from_kernel_nocheck_asm
EXPORT_SYMBOL(__strncpy_from_user_asm) EXPORT_SYMBOL(__strncpy_from_user_asm)
EXPORT_SYMBOL(__strncpy_from_user_nocheck_asm) EXPORT_SYMBOL(__strncpy_from_user_nocheck_asm)
#endif #endif
__BUILD_STRNCPY_ASM kernel __BUILD_STRNCPY_ASM kernel
EXPORT_SYMBOL(__strncpy_from_kernel_asm)
EXPORT_SYMBOL(__strncpy_from_kernel_nocheck_asm)
#ifdef CONFIG_EVA #ifdef CONFIG_EVA
.set push .set push
.set eva .set eva
__BUILD_STRNCPY_ASM user __BUILD_STRNCPY_ASM user
.set pop .set pop
EXPORT_SYMBOL(__strncpy_from_user_asm)
EXPORT_SYMBOL(__strncpy_from_user_nocheck_asm)
#endif #endif
...@@ -28,13 +28,11 @@ ...@@ -28,13 +28,11 @@
*/ */
.macro __BUILD_STRNLEN_ASM func .macro __BUILD_STRNLEN_ASM func
LEAF(__strnlen_\func\()_asm) LEAF(__strnlen_\func\()_asm)
EXPORT_SYMBOL(__strnlen_\func\()_asm)
LONG_L v0, TI_ADDR_LIMIT($28) # pointer ok? LONG_L v0, TI_ADDR_LIMIT($28) # pointer ok?
and v0, a0 and v0, a0
bnez v0, .Lfault\@ bnez v0, .Lfault\@
FEXPORT(__strnlen_\func\()_nocheck_asm) FEXPORT(__strnlen_\func\()_nocheck_asm)
EXPORT_SYMBOL(__strnlen_\func\()_nocheck_asm)
move v0, a0 move v0, a0
PTR_ADDU a1, a0 # stop pointer PTR_ADDU a1, a0 # stop pointer
1: 1:
...@@ -73,9 +71,13 @@ EXPORT_SYMBOL(__strnlen_\func\()_nocheck_asm) ...@@ -73,9 +71,13 @@ EXPORT_SYMBOL(__strnlen_\func\()_nocheck_asm)
.global __strnlen_user_nocheck_asm .global __strnlen_user_nocheck_asm
.set __strnlen_user_asm, __strnlen_kernel_asm .set __strnlen_user_asm, __strnlen_kernel_asm
.set __strnlen_user_nocheck_asm, __strnlen_kernel_nocheck_asm .set __strnlen_user_nocheck_asm, __strnlen_kernel_nocheck_asm
EXPORT_SYMBOL(__strnlen_user_asm)
EXPORT_SYMBOL(__strnlen_user_nocheck_asm)
#endif #endif
__BUILD_STRNLEN_ASM kernel __BUILD_STRNLEN_ASM kernel
EXPORT_SYMBOL(__strnlen_kernel_asm)
EXPORT_SYMBOL(__strnlen_kernel_nocheck_asm)
#ifdef CONFIG_EVA #ifdef CONFIG_EVA
...@@ -83,4 +85,6 @@ __BUILD_STRNLEN_ASM kernel ...@@ -83,4 +85,6 @@ __BUILD_STRNLEN_ASM kernel
.set eva .set eva
__BUILD_STRNLEN_ASM user __BUILD_STRNLEN_ASM user
.set pop .set pop
EXPORT_SYMBOL(__strnlen_user_asm)
EXPORT_SYMBOL(__strnlen_user_nocheck_asm)
#endif #endif
...@@ -50,6 +50,9 @@ quiet_cmd_vdsold = VDSO $@ ...@@ -50,6 +50,9 @@ quiet_cmd_vdsold = VDSO $@
cmd_vdsold = $(CC) $(c_flags) $(VDSO_LDFLAGS) \ cmd_vdsold = $(CC) $(c_flags) $(VDSO_LDFLAGS) \
-Wl,-T $(filter %.lds,$^) $(filter %.o,$^) -o $@ -Wl,-T $(filter %.lds,$^) $(filter %.o,$^) -o $@
quiet_cmd_vdsoas_o_S = AS $@
cmd_vdsoas_o_S = $(CC) $(a_flags) -c -o $@ $<
# Strip rule for the raw .so files # Strip rule for the raw .so files
$(obj)/%.so.raw: OBJCOPYFLAGS := -S $(obj)/%.so.raw: OBJCOPYFLAGS := -S
$(obj)/%.so.raw: $(obj)/%.so.dbg.raw FORCE $(obj)/%.so.raw: $(obj)/%.so.dbg.raw FORCE
...@@ -110,7 +113,7 @@ $(obj-vdso-o32): KBUILD_CFLAGS := $(cflags-vdso) -mabi=32 ...@@ -110,7 +113,7 @@ $(obj-vdso-o32): KBUILD_CFLAGS := $(cflags-vdso) -mabi=32
$(obj-vdso-o32): KBUILD_AFLAGS := $(aflags-vdso) -mabi=32 $(obj-vdso-o32): KBUILD_AFLAGS := $(aflags-vdso) -mabi=32
$(obj)/%-o32.o: $(src)/%.S FORCE $(obj)/%-o32.o: $(src)/%.S FORCE
$(call if_changed_dep,as_o_S) $(call if_changed_dep,vdsoas_o_S)
$(obj)/%-o32.o: $(src)/%.c FORCE $(obj)/%-o32.o: $(src)/%.c FORCE
$(call cmd,force_checksrc) $(call cmd,force_checksrc)
...@@ -150,7 +153,7 @@ $(obj-vdso-n32): KBUILD_CFLAGS := $(cflags-vdso) -mabi=n32 ...@@ -150,7 +153,7 @@ $(obj-vdso-n32): KBUILD_CFLAGS := $(cflags-vdso) -mabi=n32
$(obj-vdso-n32): KBUILD_AFLAGS := $(aflags-vdso) -mabi=n32 $(obj-vdso-n32): KBUILD_AFLAGS := $(aflags-vdso) -mabi=n32
$(obj)/%-n32.o: $(src)/%.S FORCE $(obj)/%-n32.o: $(src)/%.S FORCE
$(call if_changed_dep,as_o_S) $(call if_changed_dep,vdsoas_o_S)
$(obj)/%-n32.o: $(src)/%.c FORCE $(obj)/%-n32.o: $(src)/%.c FORCE
$(call cmd,force_checksrc) $(call cmd,force_checksrc)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment