------- Comment #6 from tglx at linutronix dot de 2009-11-20 00:52 ------- I changed the summary to match the real problem.
Further info: While testing various kernel configs we found out that the problem comes and goes. Finally I started to compare the gcc command line options and after some fiddling it turned out that the following minimal deltas change the code generator behaviour: Bad: -march=pentium-mmx -Wa,-mtune=generic32 Good: -march=i686 -mtune=generic -Wa,-mtune=generic32 Good: -march=pentium-mmx -mtune-generic -Wa,-mtune=generic32 The good ones produce: 650: 55 push %ebp 651: 89 e5 mov %esp,%ebp 653: 83 e4 f0 and $0xfffffff0,%esp The bad one: 000005f0 <timer_stats_update_stats>: 5f0: 57 push %edi 5f1: 8d 7c 24 08 lea 0x8(%esp),%edi 5f5: 83 e4 f0 and $0xfffffff0,%esp 5f8: ff 77 fc pushl -0x4(%edi) 5fb: 55 push %ebp 5fc: 89 e5 mov %esp,%ebp It's worse code for no reason and breaks the kernel assumption of ebp + 4 pointing to the real return address on the stack. -- tglx at linutronix dot de changed: What |Removed |Added ---------------------------------------------------------------------------- Summary|16 byte stack alignment on |stack alignment happens |random Linux kernel |_before_ mcount "push %ebp |functions |..." depending on -mtune | |flags http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42109