Skip to content
Snippets Groups Projects
Commit f9a90ace authored by Andre Przywara's avatar Andre Przywara Committed by Tom Rini
Browse files

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: default avatarAndre Przywara <andre.przywara@arm.com>

[1] https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/arm64/booting.txt
parent 82f2a144
No related branches found
No related tags found
No related merge requests found
...@@ -655,6 +655,7 @@ static int booti_setup(bootm_headers_t *images) ...@@ -655,6 +655,7 @@ static int booti_setup(bootm_headers_t *images)
{ {
struct Image_header *ih; struct Image_header *ih;
uint64_t dst; uint64_t dst;
uint64_t image_size;
ih = (struct Image_header *)map_sysmem(images->ep, 0); ih = (struct Image_header *)map_sysmem(images->ep, 0);
...@@ -665,14 +666,16 @@ static int booti_setup(bootm_headers_t *images) ...@@ -665,14 +666,16 @@ static int booti_setup(bootm_headers_t *images)
if (ih->image_size == 0) { if (ih->image_size == 0) {
puts("Image lacks image_size field, assuming 16MiB\n"); 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 * If we are not at the correct run-time location, set the new
* correct location and then move the image there. * 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); unmap_sysmem(ih);
...@@ -683,7 +686,7 @@ static int booti_setup(bootm_headers_t *images) ...@@ -683,7 +686,7 @@ static int booti_setup(bootm_headers_t *images)
src = (void *)images->ep; src = (void *)images->ep;
images->ep = dst; images->ep = dst;
memmove((void *)dst, src, le32_to_cpu(ih->image_size)); memmove((void *)dst, src, image_size);
} }
return 0; return 0;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment