summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Przywara <andre.przywara@arm.com>2016-05-25 09:48:14 +0100
committerTom Rini <trini@konsulko.com>2016-05-25 12:52:44 -0400
commitf9a90ace21c52a5a6948b9f3a0d8fe088e47a595 (patch)
treea9939f06b27632d610f9b14764103c76c668953b
parent82f2a144917d6cc5f8a9a49b1a1a15b0fb5742d5 (diff)
arm64: fix arm64 Linux boot image header field sizes
The arm64 Linux boot protocol [1] describes the fields in the Image header as being 64-bit little endian values. So fix the endianess conversion to use 64-bit sized operations, for both image_size and text_offset. Also we use a local variable for the image_size to avoid both writing to the header and also accessing it after we actually unmapped it. Signed-off-by: Andre Przywara <andre.przywara@arm.com> [1] https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/arm64/booting.txt
-rw-r--r--cmd/bootm.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/cmd/bootm.c b/cmd/bootm.c
index 1bca6fa920..ee3b460adb 100644
--- a/cmd/bootm.c
+++ b/cmd/bootm.c
@@ -655,6 +655,7 @@ static int booti_setup(bootm_headers_t *images)
{
struct Image_header *ih;
uint64_t dst;
+ uint64_t image_size;
ih = (struct Image_header *)map_sysmem(images->ep, 0);
@@ -665,14 +666,16 @@ static int booti_setup(bootm_headers_t *images)
if (ih->image_size == 0) {
puts("Image lacks image_size field, assuming 16MiB\n");
- ih->image_size = (16 << 20);
+ image_size = 16 << 20;
+ } else {
+ image_size = le64_to_cpu(ih->image_size);
}
/*
* If we are not at the correct run-time location, set the new
* correct location and then move the image there.
*/
- dst = gd->bd->bi_dram[0].start + le32_to_cpu(ih->text_offset);
+ dst = gd->bd->bi_dram[0].start + le64_to_cpu(ih->text_offset);
unmap_sysmem(ih);
@@ -683,7 +686,7 @@ static int booti_setup(bootm_headers_t *images)
src = (void *)images->ep;
images->ep = dst;
- memmove((void *)dst, src, le32_to_cpu(ih->image_size));
+ memmove((void *)dst, src, image_size);
}
return 0;