[U-Boot] [PATCH v2] arm64: booti: allow to place kernel image anywhere in physical memory

Masahiro Yamada yamada.masahiro at socionext.com
Thu Mar 9 02:10:18 UTC 2017


Hi Mark,


2017-03-09 1:05 GMT+09:00 Mark Rutland <mark.rutland at arm.com>:
>>
>>       /*
>> -      * If we are not at the correct run-time location, set the new
>> -      * correct location and then move the image there.
>> +      * If bit 3 of the flags field is set, the 2MB aligned base of the
>> +      * kernel image can be anywhere in physical memory, so respect
>> +      * images->ep.  Otherwise, relocate the image to the base of RAM
>> +      * since memory below it is not accessible via the linear mapping.
>>        */
>> -     dst = gd->bd->bi_dram[0].start + le64_to_cpu(ih->text_offset);
>> +     if (le64_to_cpu(ih->flags) & BIT(3))
>> +             dst = images->ep - le64_to_cpu(ih->text_offset);
>
> I take it this is a pre-correction for the ALIGN() below?

Without this, the image would be always relocated
even if images->ep is already bootable location.

Unnecessary relocation should be avoided.





> There's one last wrinkle to take care of here, if we want to boot a
> kernel older than commit a2c1d73b94ed49f5 (i.e. v3.16). Until then, the
> text_offset was of unknown endianness.
>
> As mentiond in the Linux documentation, you can detect this based on the
> image_size field, e.g.
>
>         uint64_t text_offset;
>
>         /*
>          * Prior to Linux commit a2c1d73b94ed49f5, the text_offset field
>          * is of unknown endianness. In these cases, the image_size
>          * field is zero, and we can assume a fixed value of 0x80000.
>          */
>         if (le64_to_cpu(ih->image_size) == 0)
>                 text_offset = 0x80000;
>         else
>                 text_offset = (le64_to_cpu(ih->text_offset));
>
> ... then you can reuse that text_offset value for both cases above.
>

Thanks.  I will fix this too.



-- 
Best Regards
Masahiro Yamada


More information about the U-Boot mailing list