mirror of
https://xff.cz/git/u-boot/
synced 2025-09-02 09:12:08 +02:00
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
This commit is contained in:
@@ -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)
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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;
|
||||||
|
Reference in New Issue
Block a user