Commit 966728dd authored by Anton Blanchard's avatar Anton Blanchard Committed by Benjamin Herrenschmidt

powerpc: Fix device tree claim code

I have a box that fails in OF during boot with:

DEFAULT CATCH!, exception-handler=fff00400
at   %SRR0: 49424d2c4c6f6768   %SRR1: 800000004000b002

ie "IBM,Logh". OF got corrupted with a device tree string.

Looking at make_room and alloc_up, we claim the first chunk (1 MB)
but we never claim any more. mem_end is always set to alloc_top
which is the top of our available address space, guaranteeing we will
never call alloc_up and claim more memory.

Also alloc_up wasn't setting alloc_bottom to the bottom of the
available address space.

This doesn't help the box to boot, but we at least fail with
an obvious error. We could relocate the device tree in a future
patch.
Signed-off-by: default avatarAnton Blanchard <anton@samba.org>
Cc: <stable@kernel.org>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 26ee9767
...@@ -1020,7 +1020,7 @@ static unsigned long __init alloc_up(unsigned long size, unsigned long align) ...@@ -1020,7 +1020,7 @@ static unsigned long __init alloc_up(unsigned long size, unsigned long align)
} }
if (addr == 0) if (addr == 0)
return 0; return 0;
RELOC(alloc_bottom) = addr; RELOC(alloc_bottom) = addr + size;
prom_debug(" -> %x\n", addr); prom_debug(" -> %x\n", addr);
prom_debug(" alloc_bottom : %x\n", RELOC(alloc_bottom)); prom_debug(" alloc_bottom : %x\n", RELOC(alloc_bottom));
...@@ -1834,7 +1834,7 @@ static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end, ...@@ -1834,7 +1834,7 @@ static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end,
chunk = alloc_up(room, 0); chunk = alloc_up(room, 0);
if (chunk == 0) if (chunk == 0)
prom_panic("No memory for flatten_device_tree (claim failed)"); prom_panic("No memory for flatten_device_tree (claim failed)");
*mem_end = RELOC(alloc_top); *mem_end = chunk + room;
} }
ret = (void *)*mem_start; ret = (void *)*mem_start;
...@@ -2053,7 +2053,7 @@ static void __init flatten_device_tree(void) ...@@ -2053,7 +2053,7 @@ static void __init flatten_device_tree(void)
mem_start = (unsigned long)alloc_up(room, PAGE_SIZE); mem_start = (unsigned long)alloc_up(room, PAGE_SIZE);
if (mem_start == 0) if (mem_start == 0)
prom_panic("Can't allocate initial device-tree chunk\n"); prom_panic("Can't allocate initial device-tree chunk\n");
mem_end = RELOC(alloc_top); mem_end = mem_start + room;
/* Get root of tree */ /* Get root of tree */
root = call_prom("peer", 1, 1, (phandle)0); root = call_prom("peer", 1, 1, (phandle)0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment