Message ID | 20180602213601.29657-2-marek.vasut+renesas@gmail.com |
---|---|
State | Changes Requested |
Delegated to: | Tom Rini |
Headers | show |
Series | [U-Boot,1/2] ARM: image: Add option for ignoring ep bit 3 | expand |
On Sat, Jun 02, 2018 at 11:36:01PM +0200, Marek Vasut wrote: > The ARM64 has 2 MiB alignment requirement for the kernel. When using > fitImage, this requirement may by violated, the kernel will thus be > executed from unaligned address and fail to boot. Do what booti does > and run booti_setup() for kernel_noload images on arm64 to obtain a > suitable aligned address to which the image shall be relocated. > > Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com> > Cc: Bin Chen <bin.chen@linaro.org> > Cc: Masahiro Yamada <yamada.masahiro@socionext.com> > Cc: Tom Rini <trini@konsulko.com> > --- > common/bootm.c | 18 ++++++++++++++++-- > 1 file changed, 16 insertions(+), 2 deletions(-) > > diff --git a/common/bootm.c b/common/bootm.c > index a0ffc1cd67..5b0e755ded 100644 > --- a/common/bootm.c > +++ b/common/bootm.c > @@ -198,8 +198,22 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc, > } > > if (images.os.type == IH_TYPE_KERNEL_NOLOAD) { > - images.os.load = images.os.image_start; > - images.ep += images.os.load; > + ulong image_addr; > + ulong image_size; > + > + if (images.os.arch == IH_ARCH_ARM64) { > + ret = booti_setup(images.os.image_start, &image_addr, > + &image_size, 1); > + if (ret != 0) > + return 1; > + > + images.os.type = IH_TYPE_KERNEL; > + images.os.load = image_addr; > + images.ep = image_addr; > + } else { > + images.os.load = images.os.image_start; > + images.ep += images.os.image_start; > + } We need to (and using if (IS_ENABLED(...)) would be good for readability) make sure this change doesn't cause size growth on all targets, only when CONFIG_CMD_BOOTI is setup, as it also won't link otherwise. Thanks!
diff --git a/common/bootm.c b/common/bootm.c index a0ffc1cd67..5b0e755ded 100644 --- a/common/bootm.c +++ b/common/bootm.c @@ -198,8 +198,22 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc, } if (images.os.type == IH_TYPE_KERNEL_NOLOAD) { - images.os.load = images.os.image_start; - images.ep += images.os.load; + ulong image_addr; + ulong image_size; + + if (images.os.arch == IH_ARCH_ARM64) { + ret = booti_setup(images.os.image_start, &image_addr, + &image_size, 1); + if (ret != 0) + return 1; + + images.os.type = IH_TYPE_KERNEL; + images.os.load = image_addr; + images.ep = image_addr; + } else { + images.os.load = images.os.image_start; + images.ep += images.os.image_start; + } } images.os.start = map_to_sysmem(os_hdr);
The ARM64 has 2 MiB alignment requirement for the kernel. When using fitImage, this requirement may by violated, the kernel will thus be executed from unaligned address and fail to boot. Do what booti does and run booti_setup() for kernel_noload images on arm64 to obtain a suitable aligned address to which the image shall be relocated. Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com> Cc: Bin Chen <bin.chen@linaro.org> Cc: Masahiro Yamada <yamada.masahiro@socionext.com> Cc: Tom Rini <trini@konsulko.com> --- common/bootm.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)