[PATCH v3 0/3] allow control DTB to double as "FIT image"
Rasmus Villemoes
rv at rasmusvillemoes.dk
Fri May 29 21:46:18 CEST 2026
The commit message for patch 1 explains what it is I'd like to be able
to do, but here's some more background:
For a long time, we've embedded the boot script in the U-Boot binary
by building a bootscript.itb, and using a .dtsi like
/ {
config {
bootscript = /incbin/("/path/to/bootscript.itb");
};
};
which in turn is mentioned in CONFIG_DEVICE_TREE_INCLUDES, that
bootscript.itb FIT image has been embedded in U-Boot's control
dtb. Running that was then a matter of doing
fdt addr ${fdtcontroladdr} && fdt get addr bsaddr /config bootscript && source ${bsaddr}
There are a couple of advantage of having the bootscript (and other
script logic) embedded in the U-Boot binary. First, there's no need to
figure out some separate partition to store the script in, and making
sure that gets updated whenever the bootloader itself does. Second,
one doesn't need to worry about verifying the script; whatever steps
one needs to take to implement secure boot for U-Boot itself will by
necessity also cover the control dtb (if nothing else then because
that's where the public key for the kernel verification lives). And
third, the boot script is automatically updated together with U-Boot
itself; and if U-Boot is stored in an eMMC boot partition, that update
is guaranteed to be atomic.
Now with the stricter requirements of libfdt starting from v2026.04,
the above command no longer worked, or only half the time, because the
embedded FIT image may not land on an 8-byte aligned address. So that
line had to be changed a little (line breaks added)
fdt addr ${fdtcontroladdr}
&& fdt get addr bsaddr /config bootscript
&& fdt get size bssize /config bootscript
&& cp.b ${bsaddr} ${loadaddr} ${bssize}
&& source ${loadaddr}
which is getting quite unwieldy.
Then it struck me that one could perhaps simplify all of this quite a
lot: Cut out the intermediate bootscript.itb, just create a .dtsi
which directly puts a /images node inside the control dtb
/ {
images {
default = "bootscript";
bootscript {
description = "Boot script";
data = /incbin/("/path/to/bootscript.sh");
type = "script";
compression = "none";
};
};
};
and treat the control dtb itself as a FIT image; so the command to put
in $bootcmd becomes simply
source ${fdtcontroladdr}:bootscript
and embedding other pieces of callable scripts is quite trivial.
And that almost works out-of-the-box, except for the fit_check_format() sanity check.
Introduce a CONFIG_ knob that allows one to opt out of those sanity
checks, for the special case of the address being checked being
identical to gd->fdt_blob.
v1: https://lore.kernel.org/u-boot/20260512161631.284143-1-ravi@prevas.dk/
v2: https://lore.kernel.org/u-boot/20260519225458.5587-1-ravi@prevas.dk/
Changes in v3:
- Factor out tail of fit_check_format (verifying existence of /images
node) to separate function, instead of using goto.
- Reword the config help text to emphasize that this is safe to use
even in a secure boot setup.
- Put test cases in separate function to not lose coverage when
!CONTROL_DTB_AS_FIT, and add a separate function verifying that
source ${fdtcontroladdr} is always rejected in that case.
- Change author email address to private address because company smtp
server (*cough* office365 *cough*) can apparently no longer be used
for, erh, sending emails ?!
Changes in v2:
- Guard this behind a CONFIG_ option
- Move the exemption logic into fit_check_format()
- Add a section to doc/develop/devicetree/control.rst describing this feature.
- Fix and improve the included tests.
Rasmus Villemoes (3):
image-fit.c: introduce CONTROL_DTB_AS_FIT config knob
doc: develop: add section on embedding scripts inside control DTB
test: hook up test of allowing control DTB to act as FIT image
arch/sandbox/dts/sandbox-boot.sh | 2 +
arch/sandbox/dts/sandbox-inner.sh | 4 ++
arch/sandbox/dts/sandbox-outer.sh | 4 ++
arch/sandbox/dts/sandbox_scripts.dtsi | 24 +++++++++++
boot/Kconfig | 13 ++++++
boot/image-fit.c | 21 +++++++---
configs/sandbox_defconfig | 2 +
doc/develop/devicetree/control.rst | 58 +++++++++++++++++++++++++++
test/py/tests/test_source.py | 32 +++++++++++++++
9 files changed, 154 insertions(+), 6 deletions(-)
create mode 100644 arch/sandbox/dts/sandbox-boot.sh
create mode 100644 arch/sandbox/dts/sandbox-inner.sh
create mode 100644 arch/sandbox/dts/sandbox-outer.sh
create mode 100644 arch/sandbox/dts/sandbox_scripts.dtsi
--
2.54.0
More information about the U-Boot
mailing list