linux/arch
Steven Rostedt 45f81b1c96 jump label: Add work around to i386 gcc asm goto bug
On i386 (not x86_64) early implementations of gcc would have a bug
with asm goto causing it to produce code like the following:

(This was noticed by Peter Zijlstra)

   56 pushl 0
   67 nopl         jmp 0x6f
      popl
      jmp 0x8c

   6f              mov
                   test
                   je 0x8c

   8c mov
      call *(%esp)

The jump added in the asm goto skipped over the popl that matched
the pushl 0, which lead up to a quick crash of the system when
the jump was enabled. The nopl is defined in the asm goto () statement
and when tracepoints are enabled, the nop changes to a jump to the label
that was specified by the asm goto. asm goto is suppose to tell gcc that
the code in the asm might jump to an external label. Here gcc obviously
fails to make that work.

The bug report for gcc is here:

  http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46226

The bug only appears on x86 when not compiled with
-maccumulate-outgoing-args. This option is always set on x86_64 and it
is also the work around for a function graph tracer i386 bug.
(See commit: 746357d6a5)
This explains why the bug only showed up on i386 when function graph
tracer was not enabled.

This patch now adds a CONFIG_JUMP_LABEL option that is default
off instead of using jump labels by default. When jump labels are
enabled, the -maccumulate-outgoing-args will be used (causing a
slightly larger kernel image on i386). This option will exist
until we have a way to detect if the gcc compiler in use is safe
to use on all configurations without the work around.

Note, there exists such a test, but for now we will keep the enabling
of jump label as a manual option.

Archs that know the compiler is safe with asm goto, may choose to
select JUMP_LABEL and enable it by default.

Reported-by: Ingo Molnar <mingo@elte.hu>
Cause-discovered-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Jason Baron <jbaron@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: David Daney <ddaney@caviumnetworks.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: David Miller <davem@davemloft.net>
Cc: Richard Henderson <rth@redhat.com>
LKML-Reference: <1288028746.3673.11.camel@laptop>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
2010-10-29 14:45:29 -04:00
..
alpha alpha: remove dma64_addr_t usage 2010-10-27 18:03:17 -07:00
arm Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx 2010-10-27 19:04:36 -07:00
avr32 ptrace: cleanup arch_ptrace() on avr32 2010-10-27 18:03:10 -07:00
blackfin ptrace: cleanup arch_ptrace() and friends on Blackfin 2010-10-27 18:03:10 -07:00
cris ptrace: cleanup arch_ptrace() on cris 2010-10-27 18:03:10 -07:00
frv ptrace: cleanup arch_ptrace() on frv 2010-10-27 18:03:10 -07:00
h8300 ptrace: cleanup arch_ptrace() on h8300 2010-10-27 18:03:11 -07:00
ia64 taskstats: use real microsecond granularity for CPU times 2010-10-27 18:03:17 -07:00
m32r ptrace: cleanup arch_ptrace() on m32r 2010-10-27 18:03:11 -07:00
m68k ptrace: cleanup arch_ptrace() on m68k 2010-10-27 18:03:11 -07:00
m68knommu ptrace: cleanup arch_ptrace() on m68knommu 2010-10-27 18:03:11 -07:00
microblaze ptrace: cleanup arch_ptrace() on microblaze 2010-10-27 18:03:11 -07:00
mips mips: remove dma64_addr_t usage 2010-10-27 18:03:17 -07:00
mn10300 Merge git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-2.6-mn10300 2010-10-27 18:53:26 -07:00
parisc ptrace: cleanup arch_ptrace() on parisc 2010-10-27 18:03:11 -07:00
powerpc Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx 2010-10-27 19:04:36 -07:00
s390 taskstats: use real microsecond granularity for CPU times 2010-10-27 18:03:17 -07:00
score ptrace: cleanup arch_ptrace() on score 2010-10-27 18:03:12 -07:00
sh ptrace: cleanup arch_ptrace() on sh 2010-10-27 18:03:12 -07:00
sparc jump_label: Fix unaligned traps on sparc. 2010-10-29 12:57:06 -04:00
tile Remove duplicate includes from many files 2010-10-27 18:03:18 -07:00
um ptrace: cleanup arch_ptrace() on um 2010-10-27 18:03:12 -07:00
x86 jump label: Add work around to i386 gcc asm goto bug 2010-10-29 14:45:29 -04:00
xtensa ptrace: cleanup arch_ptrace() on xtensa 2010-10-27 18:03:12 -07:00
.gitignore
Kconfig jump label: Add work around to i386 gcc asm goto bug 2010-10-29 14:45:29 -04:00