| From 966728dd88b4026ec58fee169ccceaeaf56ef120 Mon Sep 17 00:00:00 2001 |
| From: Anton Blanchard <anton@samba.org> |
| Date: Mon, 25 Jul 2011 20:47:07 +0000 |
| Subject: powerpc: Fix device tree claim code |
| |
| From: Anton Blanchard <anton@samba.org> |
| |
| commit 966728dd88b4026ec58fee169ccceaeaf56ef120 upstream. |
| |
| 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: Anton Blanchard <anton@samba.org> |
| Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/powerpc/kernel/prom_init.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/arch/powerpc/kernel/prom_init.c |
| +++ b/arch/powerpc/kernel/prom_init.c |
| @@ -890,7 +890,7 @@ static unsigned long __init alloc_up(uns |
| } |
| if (addr == 0) |
| return 0; |
| - RELOC(alloc_bottom) = addr; |
| + RELOC(alloc_bottom) = addr + size; |
| |
| prom_debug(" -> %x\n", addr); |
| prom_debug(" alloc_bottom : %x\n", RELOC(alloc_bottom)); |
| @@ -1704,7 +1704,7 @@ static void __init *make_room(unsigned l |
| chunk = alloc_up(room, 0); |
| if (chunk == 0) |
| prom_panic("No memory for flatten_device_tree (claim failed)"); |
| - *mem_end = RELOC(alloc_top); |
| + *mem_end = chunk + room; |
| } |
| |
| ret = (void *)*mem_start; |
| @@ -1923,7 +1923,7 @@ static void __init flatten_device_tree(v |
| mem_start = (unsigned long)alloc_up(room, PAGE_SIZE); |
| if (mem_start == 0) |
| prom_panic("Can't allocate initial device-tree chunk\n"); |
| - mem_end = RELOC(alloc_top); |
| + mem_end = mem_start + room; |
| |
| /* Get root of tree */ |
| root = call_prom("peer", 1, 1, (phandle)0); |