[PATCH v4 1/1] image: fit: Apply overlays using aligned writable FDT copies

Marek Vasut marek.vasut at mailbox.org
Thu Feb 12 16:26:41 CET 2026


On 2/11/26 7:06 PM, James Hilliard wrote:

> +static int boot_get_fdt_fit_into_buffer(const void *src, ulong srclen,
> +					ulong extra, ulong min_dstlen,
> +					void **fdtdstbuf, ulong *fdtdstlenp)
> +{
> +	const void *fdtsrcbuf;
> +	void *tmp = NULL;
> +	void *dstbuf, *newdstbuf;
> +	ulong dstlen, newdstlen;
> +	int err;
> +
> +	/* Make sure the source FDT/DTO is 8-byte aligned for libfdt. */
> +	fdtsrcbuf = src;
> +	if (!IS_ALIGNED((uintptr_t)src, 8)) {
> +		tmp = memalign(8, srclen);
> +		if (!tmp)
> +			return -ENOMEM;
> +
> +		memcpy(tmp, src, srclen);
> +		fdtsrcbuf = tmp;
> +	}
> +
> +	newdstlen = ALIGN(fdt_totalsize(fdtsrcbuf) + extra, SZ_4K);
> +	min_dstlen = ALIGN(min_dstlen, SZ_4K);
> +	if (newdstlen < min_dstlen)
> +		newdstlen = min_dstlen;
> +
> +	dstbuf = *fdtdstbuf;
> +	dstlen = dstbuf ? *fdtdstlenp : 0;
> +
> +	/*
> +	 * If the caller already provided a large enough writable buffer,
> +	 * and we're not moving the FDT, nothing to do.
> +	 */
> +	if (dstbuf && dstlen >= newdstlen && dstbuf == fdtsrcbuf) {

Can $dstbuf ever be NULL ?

> +		free(tmp);
> +		return 0;

You could try something like this here, to reduce the duplicate 
free(tmp) in the code:

"
err = 0;
goto exit;

...

exit:
   free(tmp);
   return err;
"

> +	}
> +

[...]

> -	load = (ulong)of_flat_tree;
> +	len = fdt_off_dt_strings(base_buf) + fdt_size_dt_strings(base_buf);
How does this new length calculation work, can you please clarify that ?

I don't think this will work for fitImages with external data (generated 
using mkimage -E) , but I might be wrong.


More information about the U-Boot mailing list