Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull gcc "asm goto" miscompilation workaround from Ingo Molnar:
"This is the fix for the GCC miscompilation discussed in the following
lkml thread:

[x86] BUG: unable to handle kernel paging request at 00740060

The bug in GCC has been fixed by Jakub and the fix will be part of the
GCC 4.8.2 release expected to be released next week - so the quirk's
version test checks for <= 4.8.1.

The quirk is only added to compiler-gcc4.h and not to the higher level
compiler.h because all asm goto uses are behind a feature check"

* 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
compiler/gcc4: Add quirk for 'asm goto' miscompilation bug

+26 -11
+1 -1
arch/arm/include/asm/jump_label.h
··· 16 16 17 17 static __always_inline bool arch_static_branch(struct static_key *key) 18 18 { 19 - asm goto("1:\n\t" 19 + asm_volatile_goto("1:\n\t" 20 20 JUMP_LABEL_NOP "\n\t" 21 21 ".pushsection __jump_table, \"aw\"\n\t" 22 22 ".word 1b, %l[l_yes], %c0\n\t"
+1 -1
arch/mips/include/asm/jump_label.h
··· 22 22 23 23 static __always_inline bool arch_static_branch(struct static_key *key) 24 24 { 25 - asm goto("1:\tnop\n\t" 25 + asm_volatile_goto("1:\tnop\n\t" 26 26 "nop\n\t" 27 27 ".pushsection __jump_table, \"aw\"\n\t" 28 28 WORD_INSN " 1b, %l[l_yes], %0\n\t"
+1 -1
arch/powerpc/include/asm/jump_label.h
··· 19 19 20 20 static __always_inline bool arch_static_branch(struct static_key *key) 21 21 { 22 - asm goto("1:\n\t" 22 + asm_volatile_goto("1:\n\t" 23 23 "nop\n\t" 24 24 ".pushsection __jump_table, \"aw\"\n\t" 25 25 JUMP_ENTRY_TYPE "1b, %l[l_yes], %c0\n\t"
+1 -1
arch/s390/include/asm/jump_label.h
··· 15 15 16 16 static __always_inline bool arch_static_branch(struct static_key *key) 17 17 { 18 - asm goto("0: brcl 0,0\n" 18 + asm_volatile_goto("0: brcl 0,0\n" 19 19 ".pushsection __jump_table, \"aw\"\n" 20 20 ASM_ALIGN "\n" 21 21 ASM_PTR " 0b, %l[label], %0\n"
+1 -1
arch/sparc/include/asm/jump_label.h
··· 9 9 10 10 static __always_inline bool arch_static_branch(struct static_key *key) 11 11 { 12 - asm goto("1:\n\t" 12 + asm_volatile_goto("1:\n\t" 13 13 "nop\n\t" 14 14 "nop\n\t" 15 15 ".pushsection __jump_table, \"aw\"\n\t"
+3 -3
arch/x86/include/asm/cpufeature.h
··· 374 374 * Catch too early usage of this before alternatives 375 375 * have run. 376 376 */ 377 - asm goto("1: jmp %l[t_warn]\n" 377 + asm_volatile_goto("1: jmp %l[t_warn]\n" 378 378 "2:\n" 379 379 ".section .altinstructions,\"a\"\n" 380 380 " .long 1b - .\n" ··· 388 388 389 389 #endif 390 390 391 - asm goto("1: jmp %l[t_no]\n" 391 + asm_volatile_goto("1: jmp %l[t_no]\n" 392 392 "2:\n" 393 393 ".section .altinstructions,\"a\"\n" 394 394 " .long 1b - .\n" ··· 453 453 * have. Thus, we force the jump to the widest, 4-byte, signed relative 454 454 * offset even though the last would often fit in less bytes. 455 455 */ 456 - asm goto("1: .byte 0xe9\n .long %l[t_dynamic] - 2f\n" 456 + asm_volatile_goto("1: .byte 0xe9\n .long %l[t_dynamic] - 2f\n" 457 457 "2:\n" 458 458 ".section .altinstructions,\"a\"\n" 459 459 " .long 1b - .\n" /* src offset */
+1 -1
arch/x86/include/asm/jump_label.h
··· 18 18 19 19 static __always_inline bool arch_static_branch(struct static_key *key) 20 20 { 21 - asm goto("1:" 21 + asm_volatile_goto("1:" 22 22 ".byte " __stringify(STATIC_KEY_INIT_NOP) "\n\t" 23 23 ".pushsection __jump_table, \"aw\" \n\t" 24 24 _ASM_ALIGN "\n\t"
+2 -2
arch/x86/include/asm/mutex_64.h
··· 20 20 static inline void __mutex_fastpath_lock(atomic_t *v, 21 21 void (*fail_fn)(atomic_t *)) 22 22 { 23 - asm volatile goto(LOCK_PREFIX " decl %0\n" 23 + asm_volatile_goto(LOCK_PREFIX " decl %0\n" 24 24 " jns %l[exit]\n" 25 25 : : "m" (v->counter) 26 26 : "memory", "cc" ··· 75 75 static inline void __mutex_fastpath_unlock(atomic_t *v, 76 76 void (*fail_fn)(atomic_t *)) 77 77 { 78 - asm volatile goto(LOCK_PREFIX " incl %0\n" 78 + asm_volatile_goto(LOCK_PREFIX " incl %0\n" 79 79 " jg %l[exit]\n" 80 80 : : "m" (v->counter) 81 81 : "memory", "cc"
+15
include/linux/compiler-gcc4.h
··· 65 65 #define __visible __attribute__((externally_visible)) 66 66 #endif 67 67 68 + /* 69 + * GCC 'asm goto' miscompiles certain code sequences: 70 + * 71 + * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 72 + * 73 + * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. 74 + * Fixed in GCC 4.8.2 and later versions. 75 + * 76 + * (asm goto is automatically volatile - the naming reflects this.) 77 + */ 78 + #if GCC_VERSION <= 40801 79 + # define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0) 80 + #else 81 + # define asm_volatile_goto(x...) do { asm goto(x); } while (0) 82 + #endif 68 83 69 84 #ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP 70 85 #if GCC_VERSION >= 40400