[PATCH RFC v2] image: apply FDTOs on FDT image node without a load property

Marek Vasut marex at denx.de
Tue Jan 21 00:55:35 CET 2025


On 1/16/25 12:46 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.
> 
> While at it, do not discriminate anymore on whether the data is within
> the FIT data address space - that is FIT images created with mkimage -E
> - as that still may be susceptible to unintended data overwrites as
> mkimage -E simply concatenates all blobs after the FIT. If the FDT blob
> isn't the last, it'll result in overwriting later blobs when resizing.
> 
> The side effect is that the load property in the FIT is only
> temporarily used to load the FDT but then relocated right before we
> start applying overlays.
> 
> Suggested-by: Marek Vasut <marex at denx.de>
> Signed-off-by: Quentin Schulz <quentin.schulz at cherry.de>
> ---
> This actually forces the base FDT to always be relocated whenever FDTO
> are expected to be applied, regardless of the presence of the load
> property in the base FDT image node.
> 
> Tested with extlinux with:
> - conf node with multiple fdt entries (scenario A)
> - conf node with base fdt + conf node with fdto (stored in fdt property)
>    (scenario B)
> - conf node with multiple fdt entries with base fdt with load property
>    (scenario C)
> - conf node with base fdt + conf node with fdto (stored in fdt property)
>    with base fdt with load property (scenario D)
> 
> """fit.its
> /dts-v1/;
> 
> / {
> 	description = "Kernel fitImage for Jaguar";
> 	#address-cells = <1>;
> 
> 	images {
> 		kernel-1 {
> 			description = "Linux kernel";
> 			data = /incbin/("arch/arm64/boot/Image.gz");
> 			type = "kernel";
> 			arch = "arm64";
> 			os = "linux";
> 			compression = "gzip";
> 			load = <0x06000000>;
> 			entry = <0x06000000>;
> 			hash-1 {
> 				algo = "sha256";
> 			};
> 		};
> 		fdt-rk3588-jaguar.dtb {
> 			description = "Flattened Device Tree blob";
> 			data = /incbin/("arch/arm64/boot/dts/rockchip/rk3588-jaguar.dtb");
> 			type = "flat_dt";
> 			arch = "arm64";
> 			compression = "none";
> 
> 			hash-1 {
> 				algo = "sha256";
> 			};
> 		};
> 		fdt-rk3588-jaguar.dtb-load {
> 			description = "Flattened Device Tree blob";
> 			data = /incbin/("arch/arm64/boot/dts/rockchip/rk3588-jaguar.dtb");
> 			type = "flat_dt";
> 			arch = "arm64";
> 			compression = "none";
> 			load = <0x12000000>;
> 
> 			hash-1 {
> 				algo = "sha256";
> 			};
> 		};
> 		fdt-rk3588-jaguar-pre-ict-tester.dtbo {
> 			description = "Flattened Device Tree blob";
> 			data = /incbin/("arch/arm64/boot/dts/rockchip/rk3588-jaguar-pre-ict-tester.dtbo");
> 			type = "flat_dt";
> 			arch = "arm64";
> 			compression = "none";
> 
> 			hash-1 {
> 				algo = "sha256";
> 			};
> 		};
> 	};
> 
> 	configurations {
> 		default = "conf-rk3588-jaguar.dtb";
> 		conf-rk3588-jaguar.dtb {
> 			description = "1 Linux kernel, FDT blob";
> 			kernel = "kernel-1";
> 			fdt = "fdt-rk3588-jaguar.dtb";
> 
> 			hash-1 {
> 				algo = "sha256";
> 			};
> 		};
> 
> 		conf-rk3588-jaguar.dtb-and-dtbo {
> 			description = "1 Linux kernel, FDT blob";
> 			kernel = "kernel-1";
> 			fdt = "fdt-rk3588-jaguar.dtb", "fdt-rk3588-jaguar-pre-ict-tester.dtbo";
> 
> 			hash-1 {
> 				algo = "sha256";
> 			};
> 		};
> 
> 		conf-rk3588-jaguar.dtb-load {
> 			description = "1 Linux kernel, FDT blob";
> 			kernel = "kernel-1";
> 			fdt = "fdt-rk3588-jaguar.dtb-load";
> 
> 			hash-1 {
> 				algo = "sha256";
> 			};
> 		};
> 
> 		conf-rk3588-jaguar.dtb-load-and-dtbo {
> 			description = "1 Linux kernel, FDT blob";
> 			kernel = "kernel-1";
> 			fdt = "fdt-rk3588-jaguar.dtb-load", "fdt-rk3588-jaguar-pre-ict-tester.dtbo";
> 
> 			hash-1 {
> 				algo = "sha256";
> 			};
> 		};
> 
> 		conf-rk3588-jaguar-pre-ict-tester.dtbo {
> 			description = "0 FDT blob";
> 
> 			fdt = "fdt-rk3588-jaguar-pre-ict-tester.dtbo";
> 
> 			hash-1 {
> 				algo = "sha256";
> 			};
> 		};
> 	};
> };
> """
> 
> """extlinux.conf (scenario A)
> LABEL rk3588-jaguar
> LINUX /boot/fit#conf-rk3588-jaguar.dtb-and-dtbo
> APPEND root=PARTLABEL=debos-rootfs rw rootwait net.ifnames=0
> """
> 
> Log:
> """
> 
>     Using 'conf-rk3588-jaguar.dtb-and-dtbo' configuration
>     Verifying Hash Integrity ... OK
>     Trying 'kernel-1' kernel subimage
>       Description:  Linux kernel
>       Type:         Kernel Image
>       Compression:  gzip compressed
>       Data Start:   0x020000cc
>       Data Size:    11862415 Bytes = 11.3 MiB
>       Architecture: AArch64
>       OS:           Linux
>       Load Address: 0x06000000
>       Entry Point:  0x06000000
>       Hash algo:    sha256
>       Hash value:   51a2b828aec49d9ede09a2de2cd05226def258dedcc8e4c4098fa2ba38fb9690
>     Verifying Hash Integrity ... sha256+ OK
> 
>     Using 'conf-rk3588-jaguar.dtb-and-dtbo' configuration
>     Verifying Hash Integrity ... OK
>     Trying 'fdt-rk3588-jaguar.dtb' fdt subimage
>       Description:  Flattened Device Tree blob
>       Type:         Flat Device Tree
>       Compression:  uncompressed
>       Data Start:   0x02b50370
>       Data Size:    168750 Bytes = 164.8 KiB
>       Architecture: AArch64
>       Hash algo:    sha256
>       Hash value:   96213ce3930a5f926b27c90671ca779fc327e2e62c2135f7ed7d8b6dd659b973
>     Verifying Hash Integrity ... sha256+ OK
>     Loading Device Tree to 00000000ece9d000, end 00000000ecec9fff ... OK
> Working FDT set to ece9d000
> 
>     Trying 'fdt-rk3588-jaguar-pre-ict-tester.dtbo' fdt subimage
>       Description:  Flattened Device Tree blob
>       Type:         Flat Device Tree
>       Compression:  uncompressed
>       Data Start:   0x02ba2bb4
>       Data Size:    2753 Bytes = 2.7 KiB
>       Architecture: AArch64
>       Hash algo:    sha256
>       Hash value:   e5eb1fe225d03b04e9bb27c04fe3278f294b48c6ab6757292c9650f6d3ce9f34
>     Verifying Hash Integrity ... sha256+ OK
>     Booting using the fdt blob at 0xece9d000
> Working FDT set to ece9d000
>     Uncompressing Kernel Image to 6000000
>     Loading Device Tree to 00000000ece70000, end 00000000ece9c62d ... OK
> Working FDT set to ece70000
> """
> 
> """extlinux.conf (scenario B)
> LABEL rk3588-jaguar
> LINUX /boot/fit#conf-rk3588-jaguar.dtb-load-and-dtbo
> APPEND root=PARTLABEL=debos-rootfs rw rootwait net.ifnames=0
> """
> 
> Log:
> """
> 
>     Using 'conf-rk3588-jaguar.dtb-load-and-dtbo' configuration
>     Verifying Hash Integrity ... OK
>     Trying 'kernel-1' kernel subimage
>       Description:  Linux kernel
>       Type:         Kernel Image
>       Compression:  gzip compressed
>       Data Start:   0x020000cc
>       Data Size:    11862415 Bytes = 11.3 MiB
>       Architecture: AArch64
>       OS:           Linux
>       Load Address: 0x06000000
>       Entry Point:  0x06000000
>       Hash algo:    sha256
>       Hash value:   51a2b828aec49d9ede09a2de2cd05226def258dedcc8e4c4098fa2ba38fb9690
>     Verifying Hash Integrity ... sha256+ OK
> 
>     Using 'conf-rk3588-jaguar.dtb-load-and-dtbo' configuration
>     Verifying Hash Integrity ... OK
>     Trying 'fdt-rk3588-jaguar.dtb-load' fdt subimage
>       Description:  Flattened Device Tree blob
>       Type:         Flat Device Tree
>       Compression:  uncompressed
>       Data Start:   0x02b79784
>       Data Size:    168750 Bytes = 164.8 KiB
>       Architecture: AArch64
>       Load Address: 0x12000000
>       Hash algo:    sha256
>       Hash value:   96213ce3930a5f926b27c90671ca779fc327e2e62c2135f7ed7d8b6dd659b973
>     Verifying Hash Integrity ... sha256+ OK
>     Loading fdt from 0x02b79784 to 0x12000000
>     Loading Device Tree to 00000000ece9d000, end 00000000ecec9fff ... OK
> Working FDT set to ece9d000
> 
>     Trying 'fdt-rk3588-jaguar-pre-ict-tester.dtbo' fdt subimage
>       Description:  Flattened Device Tree blob
>       Type:         Flat Device Tree
>       Compression:  uncompressed
>       Data Start:   0x02ba2bb4
>       Data Size:    2753 Bytes = 2.7 KiB
>       Architecture: AArch64
>       Hash algo:    sha256
>       Hash value:   e5eb1fe225d03b04e9bb27c04fe3278f294b48c6ab6757292c9650f6d3ce9f34
>     Verifying Hash Integrity ... sha256+ OK
>     Booting using the fdt blob at 0xece9d000
> Working FDT set to ece9d000
>     Uncompressing Kernel Image to 6000000
>     Loading Device Tree to 00000000ece70000, end 00000000ece9c62d ... OK
> Working FDT set to ece70000
> """
> 
> """extlinux.conf (scenario C)
> LABEL rk3588-jaguar
> LINUX /boot/fit#conf-rk3588-jaguar.dtb#conf-rk3588-jaguar-pre-ict-tester.dtbo
> APPEND root=PARTLABEL=debos-rootfs rw rootwait net.ifnames=0
> """
> 
> Log:
> """
> 
>     Using 'conf-rk3588-jaguar.dtb' configuration
>     Verifying Hash Integrity ... OK
>     Trying 'kernel-1' kernel subimage
>       Description:  Linux kernel
>       Type:         Kernel Image
>       Compression:  gzip compressed
>       Data Start:   0x020000cc
>       Data Size:    11862415 Bytes = 11.3 MiB
>       Architecture: AArch64
>       OS:           Linux
>       Load Address: 0x06000000
>       Entry Point:  0x06000000
>       Hash algo:    sha256
>       Hash value:   51a2b828aec49d9ede09a2de2cd05226def258dedcc8e4c4098fa2ba38fb9690
>     Verifying Hash Integrity ... sha256+ OK
> 
>     Using 'conf-rk3588-jaguar.dtb' configuration
>     Verifying Hash Integrity ... OK
>     Trying 'fdt-rk3588-jaguar.dtb' fdt subimage
>       Description:  Flattened Device Tree blob
>       Type:         Flat Device Tree
>       Compression:  uncompressed
>       Data Start:   0x02b50370
>       Data Size:    168750 Bytes = 164.8 KiB
>       Architecture: AArch64
>       Hash algo:    sha256
>       Hash value:   96213ce3930a5f926b27c90671ca779fc327e2e62c2135f7ed7d8b6dd659b973
>     Verifying Hash Integrity ... sha256+ OK
>     Loading Device Tree to 00000000ece9d000, end 00000000ecec9fff ... OK
> Working FDT set to ece9d000
> 
>     Using 'conf-rk3588-jaguar-pre-ict-tester.dtbo' configuration
>     Verifying Hash Integrity ... OK
>     Trying 'fdt-rk3588-jaguar-pre-ict-tester.dtbo' fdt subimage
>       Description:  Flattened Device Tree blob
>       Type:         Flat Device Tree
>       Compression:  uncompressed
>       Data Start:   0x02ba2bb4
>       Data Size:    2753 Bytes = 2.7 KiB
>       Architecture: AArch64
>       Hash algo:    sha256
>       Hash value:   e5eb1fe225d03b04e9bb27c04fe3278f294b48c6ab6757292c9650f6d3ce9f34
>     Verifying Hash Integrity ... sha256+ OK
>     Booting using the fdt blob at 0xece9d000
> Working FDT set to ece9d000
>     Uncompressing Kernel Image to 6000000
>     Loading Device Tree to 00000000ece70000, end 00000000ece9c62d ... OK
> Working FDT set to ece70000
> """
> 
> """extlinux.conf (scenario D)
> LABEL rk3588-jaguar
> LINUX /boot/fit#conf-rk3588-jaguar.dtb-load#conf-rk3588-jaguar-pre-ict-tester.dtbo
> APPEND root=PARTLABEL=debos-rootfs rw rootwait net.ifnames=0
> """
> 
> Log:
> """
> 
>     Using 'conf-rk3588-jaguar.dtb-load' configuration
>     Verifying Hash Integrity ... OK
>     Trying 'kernel-1' kernel subimage
>       Description:  Linux kernel
>       Type:         Kernel Image
>       Compression:  gzip compressed
>       Data Start:   0x020000cc
>       Data Size:    11862415 Bytes = 11.3 MiB
>       Architecture: AArch64
>       OS:           Linux
>       Load Address: 0x06000000
>       Entry Point:  0x06000000
>       Hash algo:    sha256
>       Hash value:   51a2b828aec49d9ede09a2de2cd05226def258dedcc8e4c4098fa2ba38fb9690
>     Verifying Hash Integrity ... sha256+ OK
> 
>     Using 'conf-rk3588-jaguar.dtb-load' configuration
>     Verifying Hash Integrity ... OK
>     Trying 'fdt-rk3588-jaguar.dtb-load' fdt subimage
>       Description:  Flattened Device Tree blob
>       Type:         Flat Device Tree
>       Compression:  uncompressed
>       Data Start:   0x02b79784
>       Data Size:    168750 Bytes = 164.8 KiB
>       Architecture: AArch64
>       Load Address: 0x12000000
>       Hash algo:    sha256
>       Hash value:   96213ce3930a5f926b27c90671ca779fc327e2e62c2135f7ed7d8b6dd659b973
>     Verifying Hash Integrity ... sha256+ OK
>     Loading fdt from 0x02b79784 to 0x12000000
>     Loading Device Tree to 00000000ece9d000, end 00000000ecec9fff ... OK
> Working FDT set to ece9d000
> 
>     Using 'conf-rk3588-jaguar-pre-ict-tester.dtbo' configuration
>     Verifying Hash Integrity ... OK
>     Trying 'fdt-rk3588-jaguar-pre-ict-tester.dtbo' fdt subimage
>       Description:  Flattened Device Tree blob
>       Type:         Flat Device Tree
>       Compression:  uncompressed
>       Data Start:   0x02ba2bb4
>       Data Size:    2753 Bytes = 2.7 KiB
>       Architecture: AArch64
>       Hash algo:    sha256
>       Hash value:   e5eb1fe225d03b04e9bb27c04fe3278f294b48c6ab6757292c9650f6d3ce9f34
>     Verifying Hash Integrity ... sha256+ OK
>     Booting using the fdt blob at 0xece9d000
> Working FDT set to ece9d000
>     Uncompressing Kernel Image to 6000000
>     Loading Device Tree to 00000000ece70000, end 00000000ece9c62d ... OK
> Working FDT set to ece70000
> """
> 
> Cc: Heiko Stuebner <heiko at sntech.de>
> ---
> Changes in v2:
> - Indiscriminately relocate, regardless of location of FDT to be on the
>    safe side wrt data overlap/overwrite,
> - print return value of boot_relocate_fdt when it fails,
> - Link to v1: https://lore.kernel.org/r/20241219-extlinux-relocate-dtb-when-dtbo-v1-1-fe5eeb8fd4f1@cherry.de
> ---
>   boot/image-fit.c | 17 +++++++++--------
>   1 file changed, 9 insertions(+), 8 deletions(-)
> 
> diff --git a/boot/image-fit.c b/boot/image-fit.c
> index db7fb61bca948e42a4136b9ceb263a53362ad3f8..f3df8e2393559596f5100ea54a7ede77407713ac 100644
> --- a/boot/image-fit.c
> +++ b/boot/image-fit.c
> @@ -2348,10 +2348,10 @@ int boot_get_fdt_fit(struct bootm_headers *images, ulong addr,
>   	char *next_config = NULL;
>   	ulong load, len;
>   #ifdef CONFIG_OF_LIBFDT_OVERLAY
> -	ulong image_start, image_end;
>   	ulong ovload, ovlen, ovcopylen;
>   	const char *uconfig;
>   	const char *uname;
> +	char *of_flat_tree;

Can this be void * instead ?

Aside from that:

Reviewed-by: Marek Vasut <marex at denx.de>

Thanks !


More information about the U-Boot mailing list