[PATCH 10/11] boot: build the imagemap pointers only when enabled
Daniel Golle
daniel at makrotopia.org
Wed Oct 14 01:40:20 PDT 2026
struct bootm_headers and struct bootm_info carry an imagemap pointer
whatever the configuration, so every board pays for it with the feature
off, and each use site has to spell out an IS_ENABLED() test beside the
NULL check.
Compile the two fields under CONFIG_IMAGEMAP and reach them through
bootm_imagemap(), bootm_set_imagemap() and bootm_info_imagemap(), which
fold to NULL and to nothing when it is off.
Signed-off-by: Daniel Golle <daniel at makrotopia.org>
---
boot/bootm.c | 28 ++++++++++++++--------------
boot/image-fit.c | 12 ++++++------
include/bootm.h | 17 +++++++++++++++++
include/image.h | 31 +++++++++++++++++++++++++++++++
4 files changed, 68 insertions(+), 20 deletions(-)
diff --git a/boot/bootm.c b/boot/bootm.c
index 67df647d176..8d3fabab39b 100644
--- a/boot/bootm.c
+++ b/boot/bootm.c
@@ -151,14 +151,14 @@ static int boot_get_kernel(const char *addr_fit, struct bootm_headers *images,
/* check image type, for FIT images get FIT kernel node */
*os_data = *os_len = 0;
- if (IS_ENABLED(CONFIG_IMAGEMAP) && images->imagemap) {
+ if (bootm_imagemap(images)) {
/*
* Storage path: read enough bytes to detect the image
* format. genimg_get_kernel_addr_fit() above still
* parsed any #config / :subimage suffix so the FIT
* selection variables are populated.
*/
- buf = imagemap_map(images->imagemap, 0,
+ buf = imagemap_map(bootm_imagemap(images), 0,
sizeof(struct legacy_img_hdr));
if (IS_ERR(buf)) {
puts("Cannot read image header from storage\n");
@@ -213,14 +213,14 @@ static int boot_get_kernel(const char *addr_fit, struct bootm_headers *images,
#endif
#if CONFIG_IS_ENABLED(FIT)
case IMAGE_FORMAT_FIT:
- if (IS_ENABLED(CONFIG_IMAGEMAP) && images->imagemap) {
+ if (bootm_imagemap(images)) {
/*
* Extend the mapping to cover the full FIT
* FDT structure so all metadata is accessible.
*/
size_t fdt_sz = fdt_totalsize(buf);
- buf = imagemap_map(images->imagemap, 0, fdt_sz);
+ buf = imagemap_map(bootm_imagemap(images), 0, fdt_sz);
if (IS_ERR(buf)) {
puts("Cannot read FIT header from storage\n");
return PTR_ERR(buf);
@@ -286,7 +286,7 @@ static int bootm_start(struct udevice *imagemap)
fit_verity_free(&images);
memset((void *)&images, 0, sizeof(images));
images.verify = env_get_yesno("verify");
- images.imagemap = imagemap;
+ bootm_set_imagemap(&images, imagemap);
bootstage_mark_name(BOOTSTAGE_ID_BOOTM_START, "bootm_start");
images.state = BOOTM_STATE_START;
@@ -1200,11 +1200,11 @@ int bootm_run_states(struct bootm_info *bmi, int states)
* any error.
*/
if (states & BOOTM_STATE_START)
- ret = bootm_start(bmi->imagemap);
+ ret = bootm_start(bootm_info_imagemap(bmi));
if (!ret && (states & BOOTM_STATE_PRE_LOAD)) {
/* Pre-load verification is not applicable to storage boot */
- if (!IS_ENABLED(CONFIG_IMAGEMAP) || !images->imagemap)
+ if (!bootm_imagemap(images))
ret = bootm_pre_load(bmi->addr_img);
}
@@ -1214,7 +1214,7 @@ int bootm_run_states(struct bootm_info *bmi, int states)
if (!ret && (states & BOOTM_STATE_FINDOTHER)) {
ulong img_addr;
- if (IS_ENABLED(CONFIG_IMAGEMAP) && images->imagemap)
+ if (bootm_imagemap(images))
img_addr = images->os.start;
else
img_addr = bmi->addr_img ? hextoul(bmi->addr_img, NULL)
@@ -1318,9 +1318,9 @@ int bootm_run_states(struct bootm_info *bmi, int states)
/* Now run the OS! We hope this doesn't return */
if (!ret && (states & BOOTM_STATE_OS_GO)) {
/* Release storage backend before jumping - no return expected */
- if (IS_ENABLED(CONFIG_IMAGEMAP) && images->imagemap) {
- imagemap_cleanup(images->imagemap);
- images->imagemap = NULL;
+ if (bootm_imagemap(images)) {
+ imagemap_cleanup(bootm_imagemap(images));
+ bootm_set_imagemap(images, NULL);
}
ret = boot_selected_os(BOOTM_STATE_OS_GO, bmi, boot_fn);
@@ -1329,9 +1329,9 @@ int bootm_run_states(struct bootm_info *bmi, int states)
/* Deal with any fallout */
err:
/* Clean up imagemap on error (not reached on successful boot) */
- if (IS_ENABLED(CONFIG_IMAGEMAP) && images->imagemap) {
- imagemap_cleanup(images->imagemap);
- images->imagemap = NULL;
+ if (bootm_imagemap(images)) {
+ imagemap_cleanup(bootm_imagemap(images));
+ bootm_set_imagemap(images, NULL);
}
if (iflag)
diff --git a/boot/image-fit.c b/boot/image-fit.c
index f02ac58d733..a461dc8f215 100644
--- a/boot/image-fit.c
+++ b/boot/image-fit.c
@@ -1164,10 +1164,10 @@ int fit_image_get_data(const void *fit, int noffset, const void **data,
}
*data = fit + offset;
#if !defined(USE_HOSTCC) && CONFIG_IS_ENABLED(IMAGEMAP)
- if (images.imagemap) {
+ if (bootm_imagemap(&images)) {
void *mapped;
- mapped = imagemap_lookup(images.imagemap,
+ mapped = imagemap_lookup(bootm_imagemap(&images),
offset, len);
if (mapped)
*data = mapped;
@@ -2246,11 +2246,11 @@ static int fit_image_load_storage(struct bootm_headers *images, const void *fit,
!fit_image_get_load(fit, noffset, &img_load)) {
dst = map_sysmem(img_load, data_sz);
- mapped = imagemap_map_to(images->imagemap, data_off, data_sz,
+ mapped = imagemap_map_to(bootm_imagemap(images), data_off, data_sz,
dst);
unmap_sysmem(dst);
} else {
- mapped = imagemap_map(images->imagemap, data_off, data_sz);
+ mapped = imagemap_map(bootm_imagemap(images), data_off, data_sz);
}
return IS_ERR(mapped) ? PTR_ERR(mapped) : 0;
@@ -2365,7 +2365,7 @@ int fit_image_load(struct bootm_headers *images, ulong addr,
* On-demand storage: pre-load external-data payloads into RAM (or leave
* dm-verity filesystems on storage) before fit_image_select() verifies.
*/
- if (CONFIG_IS_ENABLED(IMAGEMAP) && !tools_build() && images->imagemap) {
+ if (!tools_build() && bootm_imagemap(images)) {
bool early = false;
ret = fit_image_load_storage(images, fit, noffset, load_op,
@@ -2490,7 +2490,7 @@ int fit_image_load(struct bootm_headers *images, ulong addr,
}
/* A storage-backed image was read straight to its load address */
- if (!images->imagemap || data != load)
+ if (!bootm_imagemap(images) || data != load)
printf(" Loading %s from 0x%08lx to 0x%08lx\n",
prop_name, data, load);
} else {
diff --git a/include/bootm.h b/include/bootm.h
index d1aac3d44df..ce13ce3dc61 100644
--- a/include/bootm.h
+++ b/include/bootm.h
@@ -52,12 +52,29 @@ struct bootm_info {
const char *conf_fdt;
bool boot_progress;
struct bootm_headers *images;
+#if CONFIG_IS_ENABLED(IMAGEMAP)
struct udevice *imagemap;
+#endif
const char *cmd_name;
int argc;
char *const *argv;
};
+/**
+ * bootm_info_imagemap() - Get the storage loader a boot was asked to use
+ *
+ * @bmi: Boot info
+ * Return: the imagemap device, or NULL to boot an image already in RAM
+ */
+static inline struct udevice *bootm_info_imagemap(struct bootm_info *bmi)
+{
+#if CONFIG_IS_ENABLED(IMAGEMAP)
+ return bmi->imagemap;
+#else
+ return NULL;
+#endif
+}
+
/**
* bootm_init() - Set up a bootm_info struct with useful defaults
*
diff --git a/include/image.h b/include/image.h
index 5248ca98d41..14189581646 100644
--- a/include/image.h
+++ b/include/image.h
@@ -412,7 +412,9 @@ struct bootm_headers {
int verify; /* env_get("verify")[0] != 'n' */
+#if !defined(USE_HOSTCC) && CONFIG_IS_ENABLED(IMAGEMAP)
struct udevice *imagemap; /* on-demand storage loader, or NULL */
+#endif
#define BOOTM_STATE_START 0x00000001
#define BOOTM_STATE_FINDOS 0x00000002
@@ -432,6 +434,35 @@ struct bootm_headers {
extern struct bootm_headers images;
+/**
+ * bootm_imagemap() - Get the on-demand storage loader in use, if any
+ *
+ * @images: Images being booted
+ * Return: the imagemap device, or NULL when the image is already in RAM
+ */
+static inline struct udevice *bootm_imagemap(struct bootm_headers *images)
+{
+#if !defined(USE_HOSTCC) && CONFIG_IS_ENABLED(IMAGEMAP)
+ return images->imagemap;
+#else
+ return NULL;
+#endif
+}
+
+/**
+ * bootm_set_imagemap() - Record the on-demand storage loader to read through
+ *
+ * @images: Images being booted
+ * @imagemap: The imagemap device, or NULL for an image already in RAM
+ */
+static inline void bootm_set_imagemap(struct bootm_headers *images,
+ struct udevice *imagemap)
+{
+#if !defined(USE_HOSTCC) && CONFIG_IS_ENABLED(IMAGEMAP)
+ images->imagemap = imagemap;
+#endif
+}
+
/*
* Some systems (for example LWMON) have very short watchdog periods;
* we must make sure to split long operations like memmove() or
--
2.56.0
More information about the openwrt-devel
mailing list