aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ppc64
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2005-11-07 00:57:58 -0800
committerLinus Torvalds <torvalds@g5.osdl.org>2005-11-07 07:53:23 -0800
commitc8e3c8b21bd7a317d071ab8cf478880e7a4f92d6 (patch)
tree0b97687ffb4a3a0860b6c5170cadeb7526988c1a /arch/ppc64
parent2d4b95f06062d590aef8e44d42cec27b1828119f (diff)
downloadkernel_samsung_smdk4412-c8e3c8b21bd7a317d071ab8cf478880e7a4f92d6.zip
kernel_samsung_smdk4412-c8e3c8b21bd7a317d071ab8cf478880e7a4f92d6.tar.gz
kernel_samsung_smdk4412-c8e3c8b21bd7a317d071ab8cf478880e7a4f92d6.tar.bz2
[PATCH] ppc64: Fix zImage boot
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>
Diffstat (limited to 'arch/ppc64')
-rw-r--r--arch/ppc64/boot/main.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/arch/ppc64/boot/main.c b/arch/ppc64/boot/main.c
index c1dc876..e0dde24 100644
--- a/arch/ppc64/boot/main.c
+++ b/arch/ppc64/boot/main.c
@@ -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) {