[PATCH] boot: Assure FDT is always at 8-byte aligned address

Simon Glass sjg at chromium.org
Thu Nov 13 20:33:12 CET 2025


Hi Marek,

On Thu, 13 Nov 2025 at 04:55, Marek Vasut
<marek.vasut+renesas at mailbox.org> wrote:
>
> 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 <marek.vasut+renesas at mailbox.org>
> ---
> Cc: Heinrich Schuchardt <xypron.glpk at gmx.de>
> Cc: Quentin Schulz <quentin.schulz at cherry.de>
> Cc: Simon Glass <sjg at chromium.org>
> Cc: Tom Rini <trini at konsulko.com>
> Cc: Wolfgang Wallner <wolfgang.wallner at br-automation.com>
> Cc: u-boot at lists.denx.de
> ---
>  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
>

We really can't do a memory allocation in fit_image_load() !

The problem should be fixed higher up, in its callers, etc. For one
thing, the caller knows whether it is a DT or not, so putting this
logic here is messy. See boot_get_fdt_fit()

Regards,
Simon


More information about the U-Boot mailing list