diff --git a/debian/changelog b/debian/changelog index 7ebb0715f..2189accbf 100644 --- a/debian/changelog +++ b/debian/changelog @@ -32,6 +32,7 @@ linux (3.11.5-1) UNRELEASED; urgency=low * Stop providing virtual packages linux-image (Closes: #724569), linux-headers and linux-source * hwmon: Enable SENSORS_JC42, SENSORS_NCT6775 as modules (Closes: #722062) + * compiler/gcc4: Add quirk for 'asm goto' miscompilation bug [ Ian Campbell ] * [armhf] Enable CONFIG_PCI for multiplatform flavour. diff --git a/debian/patches/bugfix/all/compiler-gcc-4-add-quirk-for-asm-goto-miscompilation-bug.patch b/debian/patches/bugfix/all/compiler-gcc-4-add-quirk-for-asm-goto-miscompilation-bug.patch new file mode 100644 index 000000000..67389f23d --- /dev/null +++ b/debian/patches/bugfix/all/compiler-gcc-4-add-quirk-for-asm-goto-miscompilation-bug.patch @@ -0,0 +1,169 @@ +From: Ingo Molnar +Date: Tue, 15 Oct 2013 08:23:51 +0200 +Subject: [PATCH] compiler/gcc4: Add quirk for 'asm goto' miscompilation bug +Origin: https://lkml.kernel.org/g/20131015062933.GB4666@gmail.com + +Fengguang Wu, Oleg Nesterov and Peter Zijlstra tracked down +a kernel crash to a GCC bug: GCC miscompiles certain 'asm goto' +constructs, as outlined here: + + http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 + +Implement a workaround suggested by Jakub Jelinek. + +Reported-and-tested-by: Fengguang Wu +Reported-by: Oleg Nesterov +Reported-by: Peter Zijlstra +Suggested-by: Jakub Jelinek +Reviewed-by: Richard Henderson +Cc: Linus Torvalds +Cc: Andrew Morton +Cc: +Link: http://lkml.kernel.org/r/20131015062351.GA4666@gmail.com +Signed-off-by: Ingo Molnar +--- + arch/arm/include/asm/jump_label.h | 2 +- + arch/mips/include/asm/jump_label.h | 2 +- + arch/powerpc/include/asm/jump_label.h | 2 +- + arch/s390/include/asm/jump_label.h | 2 +- + arch/sparc/include/asm/jump_label.h | 2 +- + arch/x86/include/asm/cpufeature.h | 6 +++--- + arch/x86/include/asm/jump_label.h | 2 +- + include/linux/compiler-gcc4.h | 15 +++++++++++++++ + 8 files changed, 24 insertions(+), 9 deletions(-) + +diff --git a/arch/arm/include/asm/jump_label.h b/arch/arm/include/asm/jump_label.h +index bfc198c..863c892 100644 +--- a/arch/arm/include/asm/jump_label.h ++++ b/arch/arm/include/asm/jump_label.h +@@ -16,7 +16,7 @@ + + static __always_inline bool arch_static_branch(struct static_key *key) + { +- asm goto("1:\n\t" ++ asm_volatile_goto("1:\n\t" + JUMP_LABEL_NOP "\n\t" + ".pushsection __jump_table, \"aw\"\n\t" + ".word 1b, %l[l_yes], %c0\n\t" +diff --git a/arch/mips/include/asm/jump_label.h b/arch/mips/include/asm/jump_label.h +index 4d6d77e..e194f95 100644 +--- a/arch/mips/include/asm/jump_label.h ++++ b/arch/mips/include/asm/jump_label.h +@@ -22,7 +22,7 @@ + + static __always_inline bool arch_static_branch(struct static_key *key) + { +- asm goto("1:\tnop\n\t" ++ asm_volatile_goto("1:\tnop\n\t" + "nop\n\t" + ".pushsection __jump_table, \"aw\"\n\t" + WORD_INSN " 1b, %l[l_yes], %0\n\t" +diff --git a/arch/powerpc/include/asm/jump_label.h b/arch/powerpc/include/asm/jump_label.h +index ae098c4..f016bb6 100644 +--- a/arch/powerpc/include/asm/jump_label.h ++++ b/arch/powerpc/include/asm/jump_label.h +@@ -19,7 +19,7 @@ + + static __always_inline bool arch_static_branch(struct static_key *key) + { +- asm goto("1:\n\t" ++ asm_volatile_goto("1:\n\t" + "nop\n\t" + ".pushsection __jump_table, \"aw\"\n\t" + JUMP_ENTRY_TYPE "1b, %l[l_yes], %c0\n\t" +diff --git a/arch/s390/include/asm/jump_label.h b/arch/s390/include/asm/jump_label.h +index 6c32190..346b1c8 100644 +--- a/arch/s390/include/asm/jump_label.h ++++ b/arch/s390/include/asm/jump_label.h +@@ -15,7 +15,7 @@ + + static __always_inline bool arch_static_branch(struct static_key *key) + { +- asm goto("0: brcl 0,0\n" ++ asm_volatile_goto("0: brcl 0,0\n" + ".pushsection __jump_table, \"aw\"\n" + ASM_ALIGN "\n" + ASM_PTR " 0b, %l[label], %0\n" +diff --git a/arch/sparc/include/asm/jump_label.h b/arch/sparc/include/asm/jump_label.h +index 5080d16..ec2e2e2 100644 +--- a/arch/sparc/include/asm/jump_label.h ++++ b/arch/sparc/include/asm/jump_label.h +@@ -9,7 +9,7 @@ + + static __always_inline bool arch_static_branch(struct static_key *key) + { +- asm goto("1:\n\t" ++ asm_volatile_goto("1:\n\t" + "nop\n\t" + "nop\n\t" + ".pushsection __jump_table, \"aw\"\n\t" +diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h +index 47538a6..7290585 100644 +--- a/arch/x86/include/asm/cpufeature.h ++++ b/arch/x86/include/asm/cpufeature.h +@@ -373,7 +373,7 @@ static __always_inline __pure bool __static_cpu_has(u16 bit) + * Catch too early usage of this before alternatives + * have run. + */ +- asm goto("1: jmp %l[t_warn]\n" ++ asm_volatile_goto("1: jmp %l[t_warn]\n" + "2:\n" + ".section .altinstructions,\"a\"\n" + " .long 1b - .\n" +@@ -386,7 +386,7 @@ static __always_inline __pure bool __static_cpu_has(u16 bit) + : : "i" (X86_FEATURE_ALWAYS) : : t_warn); + #endif + +- asm goto("1: jmp %l[t_no]\n" ++ asm_volatile_goto("1: jmp %l[t_no]\n" + "2:\n" + ".section .altinstructions,\"a\"\n" + " .long 1b - .\n" +@@ -448,7 +448,7 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit) + * have. Thus, we force the jump to the widest, 4-byte, signed relative + * offset even though the last would often fit in less bytes. + */ +- asm goto("1: .byte 0xe9\n .long %l[t_dynamic] - 2f\n" ++ asm_volatile_goto("1: .byte 0xe9\n .long %l[t_dynamic] - 2f\n" + "2:\n" + ".section .altinstructions,\"a\"\n" + " .long 1b - .\n" /* src offset */ +diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h +index 3a16c14..0297669 100644 +--- a/arch/x86/include/asm/jump_label.h ++++ b/arch/x86/include/asm/jump_label.h +@@ -13,7 +13,7 @@ + + static __always_inline bool arch_static_branch(struct static_key *key) + { +- asm goto("1:" ++ asm_volatile_goto("1:" + STATIC_KEY_INITIAL_NOP + ".pushsection __jump_table, \"aw\" \n\t" + _ASM_ALIGN "\n\t" +diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h +index 842de22..ded4299 100644 +--- a/include/linux/compiler-gcc4.h ++++ b/include/linux/compiler-gcc4.h +@@ -65,6 +65,21 @@ + #define __visible __attribute__((externally_visible)) + #endif + ++/* ++ * GCC 'asm goto' miscompiles certain code sequences: ++ * ++ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 ++ * ++ * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. ++ * Fixed in GCC 4.8.2 and later versions. ++ * ++ * (asm goto is automatically volatile - the naming reflects this.) ++ */ ++#if GCC_VERSION <= 40801 ++# define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0) ++#else ++# define asm_volatile_goto(x...) do { asm goto(x); } while (0) ++#endif + + #ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP + #if GCC_VERSION >= 40400 diff --git a/debian/patches/series b/debian/patches/series index 716196e41..81d79add1 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -76,3 +76,4 @@ bugfix/m68k/ethernat-kconfig.patch # m68k IRQ bugfix bugfix/m68k/atari-irqs.patch +bugfix/all/compiler-gcc-4-add-quirk-for-asm-goto-miscompilation-bug.patch