[U-Boot] [PATCH V4 2/2] bootm: Handle kernel_noload on arm64

Marek Vasut marek.vasut at gmail.com
Wed Jun 13 04:13:33 UTC 2018


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 at gmail.com>
Cc: Bin Chen <bin.chen at linaro.org>
Cc: Masahiro Yamada <yamada.masahiro at socionext.com>
Cc: Tom Rini <trini at konsulko.com>
---
V2: Protect the ARM64 booti bit with if IS_ENABLED(CMD_BOOTI)
V3: Use if() instead of #ifdef
V4: Switch force_reloc to bool
---
 common/bootm.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/common/bootm.c b/common/bootm.c
index e789f6818a..e517d9f118 100644
--- a/common/bootm.c
+++ b/common/bootm.c
@@ -202,8 +202,23 @@ 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;
+		if (CONFIG_IS_ENABLED(CMD_BOOTI) &&
+		    images.os.arch == IH_ARCH_ARM64) {
+			ulong image_addr;
+			ulong image_size;
+
+			ret = booti_setup(images.os.image_start, &image_addr,
+					  &image_size, true);
+			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);
-- 
2.17.1



More information about the U-Boot mailing list