diff --git a/debian/changelog b/debian/changelog index adc71b9e5..b18f57e54 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +linux (4.9~rc5-1~exp2) UNRELEASED; urgency=medium + + * [armhf,armel] Fix problem with module CRC generation (Closes: #844530) + + -- Uwe Kleine-König Thu, 17 Nov 2016 09:55:16 +0100 + linux (4.9~rc5-1~exp1) experimental; urgency=medium * New upstream release candidate diff --git a/debian/patches/bugfix/arm/ARM-move-mmiocpy-mmioset-exports-to-io.c.patch b/debian/patches/bugfix/arm/ARM-move-mmiocpy-mmioset-exports-to-io.c.patch new file mode 100644 index 000000000..364cf6654 --- /dev/null +++ b/debian/patches/bugfix/arm/ARM-move-mmiocpy-mmioset-exports-to-io.c.patch @@ -0,0 +1,49 @@ +From: Arnd Bergmann +Subject: ARM: move mmiocpy/mmioset exports to io.c +Date: Mon, 24 Oct 2016 17:06:45 +0200 +Origin: https://patchwork.kernel.org/patch/9392291/ + +The prototypes for mmioset/mmiocpy are intentionally hidden +inside of inline functions, which breaks the EXPORT_SYMBOL +statements when symbol versioning is enabled. + +This moves the two exports from the files that implement the +code into the kernel/io.c file, adding another local declaration +there. + +Signed-off-by: Arnd Bergmann +--- + +diff --git a/arch/arm/kernel/io.c b/arch/arm/kernel/io.c +index eedefe050022..c74746997626 100644 +--- a/arch/arm/kernel/io.c ++++ b/arch/arm/kernel/io.c +@@ -82,3 +82,10 @@ void _memset_io(volatile void __iomem *dst, int c, size_t count) + } + } + EXPORT_SYMBOL(_memset_io); ++ ++/* can't export them from memcpy.S/memset.S because of hidden declaration */ ++void mmioset(void __iomem *addr, unsigned int c, size_t n); ++EXPORT_SYMBOL(mmioset); ++ ++void mmiocpy(void *dest, const void __iomem *src, size_t n); ++EXPORT_SYMBOL(mmiocpy); +diff --git a/arch/arm/lib/memcpy.S b/arch/arm/lib/memcpy.S +index 1be5b6ddf37c..1f822fc52400 100644 +--- a/arch/arm/lib/memcpy.S ++++ b/arch/arm/lib/memcpy.S +@@ -70,4 +70,3 @@ ENTRY(memcpy) + ENDPROC(memcpy) + ENDPROC(mmiocpy) + EXPORT_SYMBOL(memcpy) +-EXPORT_SYMBOL(mmiocpy) +diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S +index 7b72044cba62..6f075ca09abc 100644 +--- a/arch/arm/lib/memset.S ++++ b/arch/arm/lib/memset.S +@@ -137,4 +137,3 @@ UNWIND( .fnend ) + ENDPROC(memset) + ENDPROC(mmioset) + EXPORT_SYMBOL(memset) +-EXPORT_SYMBOL(mmioset) diff --git a/debian/patches/bugfix/arm/kbuild-be-more-careful-about-matching-preprocessed-a.patch b/debian/patches/bugfix/arm/kbuild-be-more-careful-about-matching-preprocessed-a.patch new file mode 100644 index 000000000..f277bfd33 --- /dev/null +++ b/debian/patches/bugfix/arm/kbuild-be-more-careful-about-matching-preprocessed-a.patch @@ -0,0 +1,41 @@ +From: Nicholas Piggin +Date: Wed, 9 Nov 2016 15:34:05 +1100 +Subject: kbuild: be more careful about matching preprocessed asm ___EXPORT_SYMBOL +Origin: https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/commit/?id=cc6acc11cad1eb1ae39707a3a6e4a97fafbeeabd + +The CRC code for asm exports grabs the preprocessed asm, finds the +___EXPORT_SYMBOL and turns those into EXPORT_SYMBOL in a C program +that can be preprocessed and parsed to create the CRC signatures from +the type. + +The existing regex matching and replacement is too strict, and doesn't +deal well with whitespace among other things. The line +" EXPORT_SYMBOL(sym)" in a .S file would not match due to initial +whitespace, for example, which resulted in x86's ___preempt_schedule +failing to get CRCs. + +Reported-by: Philip Müller +Signed-off-by: Nicholas Piggin +Signed-off-by: Michal Marek +--- + scripts/Makefile.build | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/scripts/Makefile.build b/scripts/Makefile.build +index 3e223c264469..7675d11ee65e 100644 +--- a/scripts/Makefile.build ++++ b/scripts/Makefile.build +@@ -332,8 +332,8 @@ cmd_gensymtypes_S = \ + (echo "\#include " ; \ + echo "\#include " ; \ + $(CPP) $(a_flags) $< | \ +- grep ^___EXPORT_SYMBOL | \ +- sed 's/___EXPORT_SYMBOL \([a-zA-Z0-9_]*\),.*/EXPORT_SYMBOL(\1);/' ) | \ ++ grep "\<___EXPORT_SYMBOL\>" | \ ++ sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ) | \ + $(CPP) -D__GENKSYMS__ $(c_flags) -xc - | \ + $(GENKSYMS) $(if $(1), -T $(2)) \ + $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX)) \ +-- +2.10.2 + diff --git a/debian/patches/bugfix/arm/kbuild-modversions-for-EXPORT_SYMBOL-for-asm.patch b/debian/patches/bugfix/arm/kbuild-modversions-for-EXPORT_SYMBOL-for-asm.patch new file mode 100644 index 000000000..f4c55fd2b --- /dev/null +++ b/debian/patches/bugfix/arm/kbuild-modversions-for-EXPORT_SYMBOL-for-asm.patch @@ -0,0 +1,149 @@ +From: Nicholas Piggin +Date: Tue, 1 Nov 2016 12:46:19 +1100 +Subject: [PATCH] kbuild: modversions for EXPORT_SYMBOL() for asm +Origin: https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/commit/?id=4efca4ed05cbdfd13ec3e8cb623fb77d6e4ab187 + +Allow architectures to create asm/asm-prototypes.h file that +provides C prototypes for exported asm functions, which enables +proper CRC versions to be generated for them. + +Signed-off-by: Nicholas Piggin +Signed-off-by: Michal Marek +--- + scripts/Makefile.build | 78 ++++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 72 insertions(+), 6 deletions(-) + +diff --git a/scripts/Makefile.build b/scripts/Makefile.build +index e1f25d6d132e..3e223c264469 100644 +--- a/scripts/Makefile.build ++++ b/scripts/Makefile.build +@@ -159,7 +159,8 @@ cmd_cpp_i_c = $(CPP) $(c_flags) -o $@ $< + $(obj)/%.i: $(src)/%.c FORCE + $(call if_changed_dep,cpp_i_c) + +-cmd_gensymtypes = \ ++# These mirror gensymtypes_S and co below, keep them in synch. ++cmd_gensymtypes_c = \ + $(CPP) -D__GENKSYMS__ $(c_flags) $< | \ + $(GENKSYMS) $(if $(1), -T $(2)) \ + $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX)) \ +@@ -169,7 +170,7 @@ cmd_gensymtypes = \ + quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@ + cmd_cc_symtypes_c = \ + set -e; \ +- $(call cmd_gensymtypes,true,$@) >/dev/null; \ ++ $(call cmd_gensymtypes_c,true,$@) >/dev/null; \ + test -s $@ || rm -f $@ + + $(obj)/%.symtypes : $(src)/%.c FORCE +@@ -198,9 +199,10 @@ else + # the actual value of the checksum generated by genksyms + + cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $< +-cmd_modversions = \ ++ ++cmd_modversions_c = \ + if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ +- $(call cmd_gensymtypes,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ ++ $(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ + > $(@D)/.tmp_$(@F:.o=.ver); \ + \ + $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \ +@@ -268,13 +270,14 @@ endif # CONFIG_STACK_VALIDATION + define rule_cc_o_c + $(call echo-cmd,checksrc) $(cmd_checksrc) \ + $(call cmd_and_fixdep,cc_o_c) \ +- $(cmd_modversions) \ ++ $(cmd_modversions_c) \ + $(cmd_objtool) \ + $(call echo-cmd,record_mcount) $(cmd_record_mcount) + endef + + define rule_as_o_S + $(call cmd_and_fixdep,as_o_S) \ ++ $(cmd_modversions_S) \ + $(cmd_objtool) + endef + +@@ -314,6 +317,39 @@ modkern_aflags := $(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL) + $(real-objs-m) : modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE) + $(real-objs-m:.o=.s): modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE) + ++# .S file exports must have their C prototypes defined in asm/asm-prototypes.h ++# or a file that it includes, in order to get versioned symbols. We build a ++# dummy C file that includes asm-prototypes and the EXPORT_SYMBOL lines from ++# the .S file (with trailing ';'), and run genksyms on that, to extract vers. ++# ++# This is convoluted. The .S file must first be preprocessed to run guards and ++# expand names, then the resulting exports must be constructed into plain ++# EXPORT_SYMBOL(symbol); to build our dummy C file, and that gets preprocessed ++# to make the genksyms input. ++# ++# These mirror gensymtypes_c and co above, keep them in synch. ++cmd_gensymtypes_S = \ ++ (echo "\#include " ; \ ++ echo "\#include " ; \ ++ $(CPP) $(a_flags) $< | \ ++ grep ^___EXPORT_SYMBOL | \ ++ sed 's/___EXPORT_SYMBOL \([a-zA-Z0-9_]*\),.*/EXPORT_SYMBOL(\1);/' ) | \ ++ $(CPP) -D__GENKSYMS__ $(c_flags) -xc - | \ ++ $(GENKSYMS) $(if $(1), -T $(2)) \ ++ $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX)) \ ++ $(if $(KBUILD_PRESERVE),-p) \ ++ -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null)) ++ ++quiet_cmd_cc_symtypes_S = SYM $(quiet_modtag) $@ ++cmd_cc_symtypes_S = \ ++ set -e; \ ++ $(call cmd_gensymtypes_S,true,$@) >/dev/null; \ ++ test -s $@ || rm -f $@ ++ ++$(obj)/%.symtypes : $(src)/%.S FORCE ++ $(call cmd,cc_symtypes_S) ++ ++ + quiet_cmd_cpp_s_S = CPP $(quiet_modtag) $@ + cmd_cpp_s_S = $(CPP) $(a_flags) -o $@ $< + +@@ -321,7 +357,37 @@ $(obj)/%.s: $(src)/%.S FORCE + $(call if_changed_dep,cpp_s_S) + + quiet_cmd_as_o_S = AS $(quiet_modtag) $@ +-cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< ++ ++ifndef CONFIG_MODVERSIONS ++cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< ++ ++else ++ ++ASM_PROTOTYPES := $(wildcard $(srctree)/arch/$(SRCARCH)/include/asm/asm-prototypes.h) ++ ++ifeq ($(ASM_PROTOTYPES),) ++cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< ++ ++else ++ ++# versioning matches the C process described above, with difference that ++# we parse asm-prototypes.h C header to get function definitions. ++ ++cmd_as_o_S = $(CC) $(a_flags) -c -o $(@D)/.tmp_$(@F) $< ++ ++cmd_modversions_S = \ ++ if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ ++ $(call cmd_gensymtypes_S,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ ++ > $(@D)/.tmp_$(@F:.o=.ver); \ ++ \ ++ $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \ ++ -T $(@D)/.tmp_$(@F:.o=.ver); \ ++ rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver); \ ++ else \ ++ mv -f $(@D)/.tmp_$(@F) $@; \ ++ fi; ++endif ++endif + + $(obj)/%.o: $(src)/%.S $(objtool_obj) FORCE + $(call if_changed_rule,as_o_S) +-- +2.10.2 + diff --git a/debian/patches/bugfix/arm/kbuild-provide-include-asm-asm-prototypes.h-for-ARM.patch b/debian/patches/bugfix/arm/kbuild-provide-include-asm-asm-prototypes.h-for-ARM.patch new file mode 100644 index 000000000..83261b187 --- /dev/null +++ b/debian/patches/bugfix/arm/kbuild-provide-include-asm-asm-prototypes.h-for-ARM.patch @@ -0,0 +1,192 @@ +From: Arnd Bergmann +Subject: kbuild: provide include/asm/asm-prototypes.h for ARM +Date: Mon, 24 Oct 2016 17:05:26 +0200 +Origin: https://patchwork.kernel.org/patch/9392287/ + +This adds an asm/asm-prototypes.h header for ARM to fix the +broken symbol versioning for symbols exported from assembler +files. + +In addition to the header, we have to do these other small +changes: + +- move the exports from bitops.h to {change,clear,set,...}bit.S +- move the exports from csumpartialgeneric.S into the files + including it + +I couldn't find the correct prototypes for the compiler builtins, +so I went with the fake 'void f(void)' prototypes that we had +before. + +This leaves the mmioset/mmiocpy function for now, as it's not +obvious how to best handle them. + +Signed-off-by: Arnd Bergmann +--- + +diff --git a/arch/arm/include/asm/asm-prototypes.h b/arch/arm/include/asm/asm-prototypes.h +new file mode 100644 +index 000000000000..04e5616a7b15 +--- /dev/null ++++ b/arch/arm/include/asm/asm-prototypes.h +@@ -0,0 +1,34 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++extern void __aeabi_idivmod(void); ++extern void __aeabi_idiv(void); ++extern void __aeabi_lasr(void); ++extern void __aeabi_llsl(void); ++extern void __aeabi_llsr(void); ++extern void __aeabi_lmul(void); ++extern void __aeabi_uidivmod(void); ++extern void __aeabi_uidiv(void); ++extern void __aeabi_ulcmp(void); ++ ++extern void __ashldi3(void); ++extern void __ashrdi3(void); ++extern void __bswapdi2(void); ++extern void __bswapsi2(void); ++extern void __divsi3(void); ++extern void __do_div64(void); ++extern void __lshrdi3(void); ++extern void __modsi3(void); ++extern void __muldi3(void); ++extern void __ucmpdi2(void); ++extern void __udivsi3(void); ++extern void __umodsi3(void); +diff --git a/arch/arm/lib/bitops.h b/arch/arm/lib/bitops.h +index df06638b327c..afaef2a7faec 100644 +--- a/arch/arm/lib/bitops.h ++++ b/arch/arm/lib/bitops.h +@@ -26,7 +26,6 @@ UNWIND( .fnstart ) + bx lr + UNWIND( .fnend ) + ENDPROC(\name ) +-EXPORT_SYMBOL(\name ) + .endm + + .macro testop, name, instr, store +@@ -57,7 +56,6 @@ UNWIND( .fnstart ) + 2: bx lr + UNWIND( .fnend ) + ENDPROC(\name ) +-EXPORT_SYMBOL(\name ) + .endm + #else + .macro bitop, name, instr +@@ -77,7 +75,6 @@ UNWIND( .fnstart ) + ret lr + UNWIND( .fnend ) + ENDPROC(\name ) +-EXPORT_SYMBOL(\name ) + .endm + + /** +@@ -106,6 +103,5 @@ UNWIND( .fnstart ) + ret lr + UNWIND( .fnend ) + ENDPROC(\name ) +-EXPORT_SYMBOL(\name ) + .endm + #endif +diff --git a/arch/arm/lib/changebit.S b/arch/arm/lib/changebit.S +index f4027862172f..005fdd18c509 100644 +--- a/arch/arm/lib/changebit.S ++++ b/arch/arm/lib/changebit.S +@@ -13,3 +13,4 @@ + .text + + bitop _change_bit, eor ++EXPORT_SYMBOL(_change_bit) +diff --git a/arch/arm/lib/clearbit.S b/arch/arm/lib/clearbit.S +index f6b75fb64d30..501eff09968d 100644 +--- a/arch/arm/lib/clearbit.S ++++ b/arch/arm/lib/clearbit.S +@@ -13,3 +13,4 @@ + .text + + bitop _clear_bit, bic ++EXPORT_SYMBOL(_clear_bit) +diff --git a/arch/arm/lib/csumpartialcopy.S b/arch/arm/lib/csumpartialcopy.S +index 9c3383fed129..bdcc2eea4e5c 100644 +--- a/arch/arm/lib/csumpartialcopy.S ++++ b/arch/arm/lib/csumpartialcopy.S +@@ -49,6 +49,7 @@ + + #define FN_ENTRY ENTRY(csum_partial_copy_nocheck) + #define FN_EXIT ENDPROC(csum_partial_copy_nocheck) +-#define FN_EXPORT EXPORT_SYMBOL(csum_partial_copy_nocheck) + + #include "csumpartialcopygeneric.S" ++ ++EXPORT_SYMBOL(csum_partial_copy_nocheck) +diff --git a/arch/arm/lib/csumpartialcopygeneric.S b/arch/arm/lib/csumpartialcopygeneric.S +index 8b94d20e51d1..06825566c0f7 100644 +--- a/arch/arm/lib/csumpartialcopygeneric.S ++++ b/arch/arm/lib/csumpartialcopygeneric.S +@@ -332,4 +332,3 @@ FN_ENTRY + mov r5, r4, get_byte_1 + b .Lexit + FN_EXIT +-FN_EXPORT +diff --git a/arch/arm/lib/csumpartialcopyuser.S b/arch/arm/lib/csumpartialcopyuser.S +index 5d495edf3d83..d5522c94f58c 100644 +--- a/arch/arm/lib/csumpartialcopyuser.S ++++ b/arch/arm/lib/csumpartialcopyuser.S +@@ -73,9 +73,9 @@ + + #define FN_ENTRY ENTRY(csum_partial_copy_from_user) + #define FN_EXIT ENDPROC(csum_partial_copy_from_user) +-#define FN_EXPORT EXPORT_SYMBOL(csum_partial_copy_from_user) + + #include "csumpartialcopygeneric.S" ++EXPORT_SYMBOL(csum_partial_copy_from_user) + + /* + * FIXME: minor buglet here +diff --git a/arch/arm/lib/setbit.S b/arch/arm/lib/setbit.S +index 618fedae4b37..d748b8d1326f 100644 +--- a/arch/arm/lib/setbit.S ++++ b/arch/arm/lib/setbit.S +@@ -13,3 +13,4 @@ + .text + + bitop _set_bit, orr ++EXPORT_SYMBOL(_set_bit) +diff --git a/arch/arm/lib/testchangebit.S b/arch/arm/lib/testchangebit.S +index 4becdc3a59cb..4d2dafa9b787 100644 +--- a/arch/arm/lib/testchangebit.S ++++ b/arch/arm/lib/testchangebit.S +@@ -13,3 +13,4 @@ + .text + + testop _test_and_change_bit, eor, str ++EXPORT_SYMBOL(_test_and_change_bit) +diff --git a/arch/arm/lib/testclearbit.S b/arch/arm/lib/testclearbit.S +index 918841dcce7a..fe5cae2e480a 100644 +--- a/arch/arm/lib/testclearbit.S ++++ b/arch/arm/lib/testclearbit.S +@@ -13,3 +13,4 @@ + .text + + testop _test_and_clear_bit, bicne, strne ++EXPORT_SYMBOL(_test_and_clear_bit) +diff --git a/arch/arm/lib/testsetbit.S b/arch/arm/lib/testsetbit.S +index 8d1b2fe9e487..25fed837edb3 100644 +--- a/arch/arm/lib/testsetbit.S ++++ b/arch/arm/lib/testsetbit.S +@@ -13,3 +13,4 @@ + .text + + testop _test_and_set_bit, orreq, streq ++EXPORT_SYMBOL(_test_and_set_bit) diff --git a/debian/patches/series b/debian/patches/series index 5d4a0b5e5..a65130a01 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -48,6 +48,10 @@ debian/fanotify-taint-on-use-of-fanotify_access_permissions.patch # Arch bug fixes bugfix/arm64/arm64-mm-limit-task_size_64-for-compatibility.patch bugfix/x86/x86-efi-prevent-mixed-mode-boot-corruption-with-conf.patch +bugfix/arm/kbuild-modversions-for-EXPORT_SYMBOL-for-asm.patch +bugfix/arm/kbuild-be-more-careful-about-matching-preprocessed-a.patch +bugfix/arm/kbuild-provide-include-asm-asm-prototypes.h-for-ARM.patch +bugfix/arm/ARM-move-mmiocpy-mmioset-exports-to-io.c.patch # Arch features features/mips/MIPS-increase-MAX-PHYSMEM-BITS-on-Loongson-3-only.patch