Re: 2.6.4-mm1 - 4g patch breaks when X86_4G not selected

Neil Brown
2004-03-16T01:42:35Z

On Monday March 15, mingo@elte.hu wrote:
>
> * Neil Brown <neilb@cse.unsw.edu.au> wrote:
>
> > And it turns out it was spot on. Applying 4g-2.6.0-test2-mm2-A5.patch
> > (on top of preceding -mm1 patches) causes my server not to boot.
>
> hm. Since your .config boots on akpm's box, this is some BIOS dependency
> creating an early-boot problem i fear. Debugging such bugs is hard. One
> way would be via the PC speaker:
>
> movb $0x3,%al; outb %al,$0x61
>
> this will cause a continuous beep on a typical PC - it works in 16-bit
> code too, doesnt have any memory-model assumptions, etc.
>
> the first place to put this would be startup_32 - do we get to this
> point at all? (check CONFIG_4G first, to make sure the beep triggers.)
> If it beeps, then move it down until you find the place that crashes.
>
> Ingo

Thanks for the pointer. I now have something useful to report.

start_kernel calls setup_arch
which calls paging_init
which calls pagetable_init
which calls setup_identity_mappings
which calls page_address

If I put
asm("push %eax; movb $0x3,%al; outb %al,$0x61; popl %eax\n");
before the call to page_address, and
asm("push %eax; movb $0x0,%al; outb %al,$0x61; popl %eax\n");
afterwards, then I get a tone after boot, suggesting that page_address
isn't returning.

I'm guessing that the problem is:

page_address calls
spin_lock_irqsave(&pas->lock, flags);

but the spinlock isn't initialised by page_address_init
until much later in start_kernel.

NeilBrown