Hi Daniel, On Mon, 16 Feb 2026 at 14:23, Daniel Golle <[email protected]> wrote: > > Add unit tests for the image_loader framework covering its core > logic with a mock storage backend: > > - map() allocates, reads and records a region > - map() returns cached pointer for already-mapped range > - map() returns correct offset within a larger region > - map() re-reads when extending a region to a larger size > - map_to() reads to a specified address and records it > - lookup() returns NULL for unmapped ranges > - alloc_ptr advances with correct alignment > - map() returns NULL when the translation table is full > - cleanup() calls backend and resets state > - map() with multiple disjoint regions > - read beyond image size returns error > > Also fix IMAGE_LOADER_MAX_REGIONS Kconfig to depend on IMAGE_LOADER > and default to 16 unconditionally (the previous 'default 0' fallback > caused the regions array to be zero-sized when IMAGE_LOADER was > enabled after initial defconfig generation). > > Register the new 'image_loader' test suite in test/cmd_ut.c so it > can be run via 'ut image_loader'. > > Signed-off-by: Daniel Golle <[email protected]> > --- > boot/Kconfig | 4 +- > test/boot/Makefile | 2 + > test/boot/image_loader.c | 429 +++++++++++++++++++++++++++++++++++++++ > test/cmd_ut.c | 2 + > 4 files changed, 435 insertions(+), 2 deletions(-) > create mode 100644 test/boot/image_loader.c > > diff --git a/boot/Kconfig b/boot/Kconfig > index 1f870c7d251..efc06f3cd1a 100644 > --- a/boot/Kconfig > +++ b/boot/Kconfig > @@ -1179,8 +1179,8 @@ config IMAGE_LOADER > > config IMAGE_LOADER_MAX_REGIONS > int "Maximum number of mapped regions in image loader" > - default 16 if IMAGE_LOADER > - default 0 > + depends on IMAGE_LOADER > + default 16 > help > Maximum number of distinct image regions that can be mapped > into RAM simultaneously. 16 is sufficient for typical FIT
As Tom mentioned, this is in the wrong patch. But really we should just remove it and use an alist > diff --git a/test/boot/Makefile b/test/boot/Makefile > index 89538d4f0a6..6fd349a65bc 100644 > --- a/test/boot/Makefile > +++ b/test/boot/Makefile > @@ -23,3 +23,5 @@ endif > obj-$(CONFIG_BOOTMETH_VBE) += vbe_fixup.o > > obj-$(CONFIG_UPL) += upl.o > + > +obj-$(CONFIG_IMAGE_LOADER) += image_loader.o > diff --git a/test/boot/image_loader.c b/test/boot/image_loader.c > new file mode 100644 > index 00000000000..dc4b0b4173a > --- /dev/null > +++ b/test/boot/image_loader.c > @@ -0,0 +1,429 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * Tests for image_loader framework > + * > + * Copyright (C) 2026 Daniel Golle <[email protected]> > + */ > + > +#include <image-loader.h> > +#include <mapmem.h> > +#include <malloc.h> > +#include <asm/cache.h> > +#include <test/test.h> > +#include <test/ut.h> > + > +#define IMG_LOADER_TEST(_name, _flags) \ > + UNIT_TEST(_name, _flags, image_loader) > + > +/* Synthetic image size used throughout the tests */ > +#define IMAGE_SIZE 4096 > + > +/** > + * struct mock_priv - private data for the mock storage backend > + * > + * @image: pointer to synthetic image data in RAM > + * @image_size: size of the synthetic image > + * @read_count: number of times .read() was called > + * @last_off: offset from the most recent .read() call > + * @last_size: size from the most recent .read() call > + */ > +struct mock_priv { > + const void *image; > + size_t image_size; > + int read_count; > + ulong last_off; > + ulong last_size; > +}; > + [..] > +/* Test: lookup() returns NULL for unmapped ranges */ > +static int image_loader_test_lookup_miss(struct unit_test_state *uts) > +{ > + struct image_loader ldr; > + struct mock_priv mock; > + u8 image[IMAGE_SIZE]; > + void *p; > + > + init_mock_loader(&ldr, &mock, image, IMAGE_SIZE, 0x1000000); > + > + /* Nothing mapped yet — should return NULL */ > + p = image_loader_lookup(&ldr, 0, 64); > + ut_assertnull(p); AI tends to write it like this, but you can just do: ut_assertnull(image_loader_lookup(&ldr, 0, 64)); There are various examples of this in this patch. The test declarations should immediately follow the } of the function they refer to image_loader_test_map_basic() { ... } IMG_LOADER_TEST(image_loader_test_map_basic, 0); Regards, Simon

