Skip to content

Commit

Permalink
powerpc/boot: Fix boot on systems with uncompressed kernel image
Browse files Browse the repository at this point in the history
This commit broke boot on systems with an uncompressed kernel image,
namely systems using a cuImage. On such systems the compressed boot
image (boot wrapper, uncompressed kernel image, ..) is decompressed
by u-boot already, therefore the boot wrapper code sees an
uncompressed kernel image.

The old decompression code silently assumed an uncompressed kernel
image if it found no valid gzip signature, whilst the new code
bailed out in this case.

Fix this by re-introducing such a fallback if no valid compressed
image is found.

Fixes: 1b7898e ("Use the pre-boot decompression API")
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
  • Loading branch information
Heiner Kallweit authored and Michael Ellerman committed Oct 19, 2016
1 parent d2cf909 commit 65bc3ec
Showing 1 changed file with 16 additions and 2 deletions.
18 changes: 16 additions & 2 deletions arch/powerpc/boot/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,16 @@ static struct addr_range prep_kernel(void)
void *addr = 0;
struct elf_info ei;
long len;
int uncompressed_image = 0;

partial_decompress(vmlinuz_addr, vmlinuz_size,
len = partial_decompress(vmlinuz_addr, vmlinuz_size,
elfheader, sizeof(elfheader), 0);
/* assume uncompressed data if -1 is returned */
if (len == -1) {
uncompressed_image = 1;
memcpy(elfheader, vmlinuz_addr, sizeof(elfheader));
printf("No valid compressed data found, assume uncompressed data\n\r");
}

if (!parse_elf64(elfheader, &ei) && !parse_elf32(elfheader, &ei))
fatal("Error: not a valid PPC32 or PPC64 ELF file!\n\r");
Expand Down Expand Up @@ -67,6 +74,13 @@ static struct addr_range prep_kernel(void)
"device tree\n\r");
}

if (uncompressed_image) {
memcpy(addr, vmlinuz_addr + ei.elfoffset, ei.loadsize);
printf("0x%lx bytes of uncompressed data copied\n\r",
ei.loadsize);
goto out;
}

/* Finally, decompress the kernel */
printf("Decompressing (0x%p <- 0x%p:0x%p)...\n\r", addr,
vmlinuz_addr, vmlinuz_addr+vmlinuz_size);
Expand All @@ -82,7 +96,7 @@ static struct addr_range prep_kernel(void)
len, ei.loadsize);

printf("Done! Decompressed 0x%lx bytes\n\r", len);

out:
flush_cache(addr, ei.loadsize);

return (struct addr_range){addr, ei.memsize};
Expand Down

0 comments on commit 65bc3ec

Please sign in to comment.