[PATCH] ppc64: Fix zImage boot
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Mon, 7 Nov 2005 08:57:58 +0000 (00:57 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 7 Nov 2005 15:53:23 +0000 (07:53 -0800)
The zImage wrapper has a bug where it doesn't claim() the memory for the
kernel properly, it forgets to take into account the offset between the ELF
header and the kernel itself.  This results on some machines, like G5s,
into a kernel that crashes at boot when clearing the BSS.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/ppc64/boot/main.c

index c1dc876bccab04d424ec7e0b9527c81b0f203462..e0dde24a72cebda62a135314b8c819230b4fd09a 100644 (file)
@@ -203,8 +203,15 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
                if (elf64ph->p_type == PT_LOAD && elf64ph->p_offset != 0)
                        break;
        }
-       vmlinux.size = (unsigned long)elf64ph->p_filesz;
-       vmlinux.memsize = (unsigned long)elf64ph->p_memsz;
+       vmlinux.size = (unsigned long)elf64ph->p_filesz +
+               (unsigned long)elf64ph->p_offset;
+       /* We need to claim the memsize plus the file offset since gzip
+        * will expand the header (file offset), then the kernel, then
+        * possible rubbish we don't care about. But the kernel bss must
+        * be claimed (it will be zero'd by the kernel itself)
+        */
+       vmlinux.memsize = (unsigned long)elf64ph->p_memsz +
+               (unsigned long)elf64ph->p_offset;
        printf("Allocating 0x%lx bytes for kernel ...\n\r", vmlinux.memsize);
        vmlinux.addr = try_claim(vmlinux.memsize);
        if (vmlinux.addr == 0) {