aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Blanchard <anton@samba.org>2011-07-25 16:47:07 -0400
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2011-08-05 00:47:54 -0400
commit966728dd88b4026ec58fee169ccceaeaf56ef120 (patch)
treed114fd06a0610a44e3916d1441b51015a3225ed5
parent26ee97672eaee9725bd7d66c3964579c4af7037d (diff)
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: Anton Blanchard <anton@samba.org> Cc: <stable@kernel.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r--arch/powerpc/kernel/prom_init.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
index c016033ba78d..3b22142c40df 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -1020,7 +1020,7 @@ static unsigned long __init alloc_up(unsigned long size, unsigned long align)
1020 } 1020 }
1021 if (addr == 0) 1021 if (addr == 0)
1022 return 0; 1022 return 0;
1023 RELOC(alloc_bottom) = addr; 1023 RELOC(alloc_bottom) = addr + size;
1024 1024
1025 prom_debug(" -> %x\n", addr); 1025 prom_debug(" -> %x\n", addr);
1026 prom_debug(" alloc_bottom : %x\n", RELOC(alloc_bottom)); 1026 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 chunk = alloc_up(room, 0); 1834 chunk = alloc_up(room, 0);
1835 if (chunk == 0) 1835 if (chunk == 0)
1836 prom_panic("No memory for flatten_device_tree (claim failed)"); 1836 prom_panic("No memory for flatten_device_tree (claim failed)");
1837 *mem_end = RELOC(alloc_top); 1837 *mem_end = chunk + room;
1838 } 1838 }
1839 1839
1840 ret = (void *)*mem_start; 1840 ret = (void *)*mem_start;
@@ -2053,7 +2053,7 @@ static void __init flatten_device_tree(void)
2053 mem_start = (unsigned long)alloc_up(room, PAGE_SIZE); 2053 mem_start = (unsigned long)alloc_up(room, PAGE_SIZE);
2054 if (mem_start == 0) 2054 if (mem_start == 0)
2055 prom_panic("Can't allocate initial device-tree chunk\n"); 2055 prom_panic("Can't allocate initial device-tree chunk\n");
2056 mem_end = RELOC(alloc_top); 2056 mem_end = mem_start + room;
2057 2057
2058 /* Get root of tree */ 2058 /* Get root of tree */
2059 root = call_prom("peer", 1, 1, (phandle)0); 2059 root = call_prom("peer", 1, 1, (phandle)0);