linux_old1/arch
Thomas Gleixner 746357d6a5 x86: Prevent GCC 4.4.x (pentium-mmx et al) function prologue wreckage
When the kernel is compiled with -pg for tracing GCC 4.4.x inserts
stack alignment of a function _before_ the mcount prologue if the
-march=pentium-mmx is set and -mtune=generic is not set. This breaks
the assumption of the function graph tracer which expects that the
mcount prologue

       push %ebp
       mov  %esp, %ebp

is the first stack operation in a function because it needs to modify
the function return address on the stack to trap into the tracer
before returning to the real caller.

The generated code is:

        push   %edi
        lea    0x8(%esp),%edi
        and    $0xfffffff0,%esp
        pushl  -0x4(%edi)
        push   %ebp
        mov    %esp,%ebp

so the tracer modifies the copy of the return address which is stored
after the stack alignment and therefor does not trap the return which
in turn breaks the call chain logic of the tracer and leads to a
kernel panic.

Aside of the fact that the generated code is horrible for no good
reason other -march -mtune options generate the expected:

        push   %ebp
        mov    %esp,%ebp
        and    $0xfffffff0,%esp

which does the same and keeps everything intact.

After some experimenting we found out that this problem is restricted
to gcc4.4.x and to the following -march settings:

i586, pentium, pentium-mmx, k6, k6-2, k6-3, winchip-c6, winchip2, c3,
geode

By adding -mtune=generic the code generator produces always the
expected code.

So forcing -mtune=generic when CONFIG_FUNCTION_GRAPH_TRACER=y is not
pretty, but at the moment the only way to prevent that the kernel
trips over gcc-shrooms induced code madness.

Most distro kernels have CONFIG_X86_GENERIC=y anyway which forces
-mtune=generic as well so it will not impact those.

References: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42109
	    http://lkml.org/lkml/2009/11/19/17

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
LKML-Reference: <alpine.LFD.2.00.0911200206570.24119@localhost.localdomain>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>,
Cc: Jeff Law <law@redhat.com>
Cc: gcc@gcc.gnu.org
Cc: David Daney <ddaney@caviumnetworks.com>
Cc: Andrew Haley <aph@redhat.com>
Cc: Richard Guenther <richard.guenther@gmail.com>
Cc: stable@kernel.org
2009-11-20 14:06:46 +01:00
..
alpha alpha: Fix duplicate <asm/thread_info.h> include 2009-09-27 14:46:05 -07:00
arm Merge branch 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6 2009-10-15 15:09:55 -07:00
avr32 Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild-next 2009-09-23 15:37:02 -07:00
blackfin headers: remove sched.h from interrupt.h 2009-10-11 11:20:58 -07:00
cris const: constify remaining file_operations 2009-10-01 16:11:11 -07:00
frv FRV: Flash mappings for the MB93090-MB00 motherboard 2009-09-24 17:18:38 -07:00
h8300 h8300: Cleanup linker script using new linker script macros. 2009-09-24 17:16:22 -07:00
ia64 const: mark struct vm_struct_operations 2009-09-27 11:39:25 -07:00
m32r headers: remove sched.h from interrupt.h 2009-10-11 11:20:58 -07:00
m68k revert "m68k: convert to asm-generic/hardirq.h" 2009-10-01 16:11:11 -07:00
m68knommu m68knommu: fix rename of pt_regs offset defines breakage 2009-09-30 10:06:07 +10:00
microblaze microblaze: Clear sticky FSR register after saving it to func parametr 2009-10-05 11:37:47 +02:00
mips MIPS: Avoid spurious make includecheck message 2009-09-30 21:47:02 +02:00
mn10300 mn10300: fix kernel build failures when using gcc-4.x 2009-10-01 16:11:12 -07:00
parisc parisc: Fix linker script breakage. 2009-09-28 00:25:07 -04:00
powerpc Merge commit 'ftrace/ppc' into merge 2009-10-15 14:09:11 +11:00
s390 [S390] Add highgprs facility to /proc/cpuinfo 2009-10-14 12:43:53 +02:00
score Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild-next 2009-09-23 15:37:02 -07:00
sh sh: Fix a TRACE_IRQS_OFF typo. 2009-10-14 15:50:28 +09:00
sparc sparc64: Set IRQF_DISABLED on LDC channel IRQs. 2009-10-13 00:49:09 -07:00
um headers: remove sched.h from interrupt.h 2009-10-11 11:20:58 -07:00
x86 x86: Prevent GCC 4.4.x (pentium-mmx et al) function prologue wreckage 2009-11-20 14:06:46 +01:00
xtensa headers: remove sched.h from interrupt.h 2009-10-11 11:20:58 -07:00
.gitignore
Kconfig oprofile: fix oprofile regression: select RING_BUFFER_ALLOW_SWAP 2009-09-17 15:53:42 -04:00