• S
    jump label: Add work around to i386 gcc asm goto bug · 45f81b1c
    Steven Rostedt 提交于
    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: 746357d6)
    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: NIngo Molnar <mingo@elte.hu>
    Cause-discovered-by: NPeter 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: NSteven Rostedt <rostedt@goodmis.org>
    45f81b1c
jump_label.h 1.7 KB