[PATCH RFC] image: apply FDTOs on FDT image node without a load property
Marek Vasut
marex at denx.de
Thu Dec 19 19:26:01 CET 2024
On 12/19/24 4:03 PM, Quentin Schulz wrote:
> From: Quentin Schulz <quentin.schulz at cherry.de>
>
> A FIT image which is NOT using -E when created by mkimage - that is with
> image data within the FIT - will fail to apply FDTO if the base FDT
> image node does not specify a load property (which points to an address
> in DRAM). This is because we check that the FDT address we want to apply
> overlay to (i.e. modify and likely increase in size) is not inside the
> FIT and give up otherwise. This is assumed necessary because we may then
> overwrite other data when applying in-place.
>
> However, we can do better than giving up: relocating the FDT in another
> place in DRAM where it's safe to increase its size and apply FDTOs.
>
> Suggested-by: Marek Vasut <marex at denx.de>
> Signed-off-by: Quentin Schulz <quentin.schulz at cherry.de>
> ---
> Tested with extlinux with:
> - conf node with multiple fdt entries
> - conf node with base fdt + conf node with fdto (stored in fdt property)
> - FDT image node with load property (behavior unchanged)
> - FDT image node without load property
>
> I'll be frank, I don't really know what I'm doing here and I'm on
> holidays for a month in a few hours, so take this with a bigger grain of
> salt than usual (hence the RFC). It works (tm) for now.
>
> Cc: Heiko Stuebner <heiko at sntech.de>
> ---
> boot/image-fit.c | 17 +++++++++++------
> 1 file changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/boot/image-fit.c b/boot/image-fit.c
> index 7d56f0b5e6ed39a75e029b09dc95d605835c0f91..088482c4d5d2e194cce66f10b0acd9e586f826b2 100644
> --- a/boot/image-fit.c
> +++ b/boot/image-fit.c
> @@ -2392,13 +2392,18 @@ int boot_get_fdt_fit(struct bootm_headers *images, ulong addr,
> image_end = addr + fit_get_size(fit);
> /* verify that relocation took place by load address not being in fit */
> if (load >= image_start && load < image_end) {
This has to be updated to handle the mkimage -E case too. Basically, if
the FDT is outside of the fitImage tree area, but still in the trailing
blob area at the end of fitImage generated with mkimage -E, then any
modification to the DT which would result in resize may either fail or
corrupt the surrounding blobs.
The safe but heavy handed option would be to relocate unconditionally .
> - /* check is simplified; fit load checks for overlaps */
> - printf("Overlayed FDT requires relocation\n");
> - fdt_noffset = -EBADF;
> - goto out;
> - }
> + /* Cannot overlay an FDT stored inside the fitImage, so let's relocate */
> + char *of_flat_tree = map_sysmem(load, len);
>
> - base = map_sysmem(load, len);
> + len = ALIGN(fdt_totalsize(load), SZ_4K);
> + if (boot_relocate_fdt(&of_flat_tree, &len)) {
Please print the error value in case of failure here, it is useful for
debugging.
> + printf("Required FDT relocation for applying overlays failed...");
> + fdt_noffset = -EBADF;
> + goto out;
> + }
> +
> + load = (ulong)of_flat_tree;
> + }
More information about the U-Boot
mailing list