Re: [patch] Re: Kernels > 2.6.1-mm3 do not boot. - REALLY SOLVED

Andi Kleen
2004-01-27T18:16:57Z

On Tue, Jan 27, 2004 at 12:37:43AM -0600, Eric wrote:
> On Monday 26 January 2004 23:50, Andrew Morton wrote:
> > Eric <eric@cisu.net> wrote:
> > > YES. I finally have a working 2.6.2-rc1-mm3 booted kernel.
> > > Lets review folks---
> > > reverted -funit-at-a-time
> > > patched test_wp_bit so exception tables are sorted sooner
> > > reverted md-partition patch
> >
> > The latter two are understood, but the `-funit-at-a-time' problem is not.
> >
> > Can you plesae confirm that restoring only -funit-at-a-time again produces
> > a crashy kernel? And that you are using a flavour of gcc-3.3? If so, I
> > guess we'll need to only enable it for gcc-3.4 and later.
> >
> Yes, confirmed. My version of gcc, I just sent you adding the
> -funit-at-a-time hung after uncompressing the kernel. I booted a secondary
> kernel, recompiled without it and all was fine again. Confirmed non-boot for
> 2.6.2-rc1-mm3 but without a doubt for all kernels previous where
> -funit-at-a-time is active in the makefile.

Ok, found it. This patch should fix it. The top level asm in process.c
assumed that the section was .text, but that is not guaranteed in a
funit-at-a-time compiler. It ended up in the setup section and messed up
the argument parsing. This bug could have hit with any compiler,
it was just plain luck that it worked with newer gcc 3.3 and 3.4.

Please test if it fixes your problem.

Andrew, please merge it if the bug is confirmed to be fixed.

-Andi

diff -u linux-2.6.2rc1mm3-test/arch/i386/kernel/process.c-o linux-2.6.2rc1mm3-test/arch/i386/kernel/process.c
--- linux-2.6.2rc1mm3-test/arch/i386/kernel/process.c-o 2004-01-27 02:26:39.000000000 +0100
+++ linux-2.6.2rc1mm3-test/arch/i386/kernel/process.c 2004-01-27 19:09:41.131460832 +0100
@@ -253,13 +253,15 @@
* the "args".
*/
extern void kernel_thread_helper(void);
-__asm__(".align 4\n"
+__asm__(".section .text\n"
+ ".align 4\n"
"kernel_thread_helper:\n\t"
"movl %edx,%eax\n\t"
"pushl %edx\n\t"
"call *%ebx\n\t"
"pushl %eax\n\t"
- "call do_exit");
+ "call do_exit\n"
+ ".previous");

/*
* Create a kernel thread