The fitImage may contain FDT at 4-byte aligned address, because alignment of DT tags is 4 bytes. However, libfdt and also Linux expects DT to be at 8-byte aligned address. Make sure that the DTs embedded in fitImages are always used from 8-byte aligned addresses. In case the DT is decompressed, make sure the target buffer is 8-byte aligned. In case the DT is only loaded, make sure the target buffer is 8-byte aligned too.
Signed-off-by: Marek Vasut <[email protected]> --- Cc: Heinrich Schuchardt <[email protected]> Cc: Quentin Schulz <[email protected]> Cc: Simon Glass <[email protected]> Cc: Tom Rini <[email protected]> Cc: Wolfgang Wallner <[email protected]> Cc: [email protected] --- boot/image-fit.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/boot/image-fit.c b/boot/image-fit.c index 2f2d3e9304d..cccaa48f683 100644 --- a/boot/image-fit.c +++ b/boot/image-fit.c @@ -23,7 +23,6 @@ #include <log.h> #include <mapmem.h> #include <asm/io.h> -#include <malloc.h> #include <memalign.h> #include <asm/global_data.h> #ifdef CONFIG_DM_HASH @@ -36,6 +35,7 @@ DECLARE_GLOBAL_DATA_PTR; #include <bootm.h> #include <image.h> #include <bootstage.h> +#include <malloc.h> #include <upl.h> #include <u-boot/crc.h> @@ -2279,7 +2279,7 @@ int fit_image_load(struct bootm_headers *images, ulong addr, log_debug("decompressing image\n"); if (load == data) { - loadbuf = malloc(max_decomp_len); + loadbuf = memalign(8, max_decomp_len); load = map_to_sysmem(loadbuf); } else { loadbuf = map_sysmem(load, max_decomp_len); @@ -2291,6 +2291,11 @@ int fit_image_load(struct bootm_headers *images, ulong addr, return -ENOEXEC; } len = load_end - load; + } else if (load_op != FIT_LOAD_IGNORED && image_type == IH_TYPE_FLATDT && + ((uintptr_t)buf & 7)) { + loadbuf = memalign(8, len); + load = map_to_sysmem(loadbuf); + memcpy(loadbuf, buf, len); } else if (load != data) { log_debug("copying\n"); loadbuf = map_sysmem(load, len); -- 2.51.0

