Port-sparc64 archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Early crash on SB2000 (panic: init: no memory
On Tue, 30 Oct 2012, Julian Coleman wrote:
> Hi,
>
> > I assume you dumped this before booting?
>
> Yes.
>
> > Could you boot with -d and when you get to DDB drop to the PROM and dump
> > the /memory available property when booting both from disk and from the
> > network? And if it's possible to do the same from ofwboot just before it
> > jumps into the kernel that would also be helpful.
>
> > I'm guessing that the ofwboot logic that makes sure the kernel is aligned
> > to a 4MB page has a math problem that's corrupting OBP's free list.
>
> Booting to ddb across the network gives:
>
> available 00000001 ffe8c000 00000000 00014000
> 00000001 ffe70000 00000000 0000a000
> 00000001 ffdb0000 00000000 000a0000
> 00000001 ffc00000 00000000 001a0000
> 00000001 fec00000 00000000 003fe000
> 00000001 fe008000 00000000 007f8000
> 00000000 00000000 00000001 fe000000
>
> I managed to stop it just after the line:
> Loading netbsd: 9168736+550632+326656 [606696+406275]=0xdce098
> and it showed:
> available 00000001 ffe8c000 00000000 0001e000
> 00000001 ffdb0000 00000000 000c0000
> 00000001 ffc00000 00000000 001a0000
> 00000001 fec00000 00000000 003fe000
> 00000001 fe008000 00000000 007f8000
> 00000000 00000000 00000001 fe000000
>
> Strangely, when I continued, it booted OK and showed:
> available 00000001 ffe8c000 00000000 00004000
> 00000001 ffdb0000 00000000 000a0000
> 00000001 ffc00000 00000000 001a0000
> 00000001 fec00000 00000000 003fe000
> 00000001 fe008000 00000000 007f8000
> 00000000 00000000 00000001 fe000000
>
> When it fails to boot from disk:
>
> available 00000001 ffe8c000 00000000 00004000
> 00000001 ffdb0000 00000000 000a0000
> 00000001 ffc00000 00000000 001a0000
> 00000001 fec00000 00000000 003fe000
> 00000001 fe008000 00000000 007f8000
> 00000000 00000000 00000001 fe000000
Is this after the failed pmap_read_memlist() call?
>
> However, it looks like the large block of memory is there in all cases.
>
> Looking at the debug output in this last case, I see:
>
> prom_memlist_size = 96
> pcnt = 6
> Available physical memory:
> kdata_alloc(): Allocated 96@0x1ed05f0, 1243568 free.
> memlist start 1ffea0000 size 2000
> memlist start 1ffe8c000 size 4000
> memlist start 1ffdb0000 size a0000
> memlist start 1ffc00000 size 1a0000
> memlist start 1fec00000 size 3fe000
> memlist start 1fe008000 size 7f8000
> End of available physical memory
>
> It looks like we expect 6 ranges, as there are in the memory dump above,
> but there is an extra range inserted at the start, so we have lost the
> main block of memory at the end. I'll add some debugging to
> pmap_read_memlist() and see what I can see.
I've been reviewing the code and the only way I can see this happening is
if somehow the 1ffea0000,2000 entry is added to the property between the
OF_getproplen() call and the OF_getprop() call. That shouldn't happen.
I suppose you could change the OF_getproplen() routine to do a "getprop"
call with a zero buflen parameter. The return from "getprop" should be
the size of the property.
Or change pmap_read_memlist() to compare the return value from the
OF_getproplen() with the requested size and if the return is larger free
up the memory and try again with a larger size.
Eduardo
Home |
Main Index |
Thread Index |
Old Index