bootm_run_states() puts the imagemap back into the global images struct after bootm_start() has zeroed it, which leaves the invariant split across two functions: any later state that calls bootm_start() again drops the pointer, and BOOTM_STATE_RESTART is already close to doing so.
Pass the imagemap to bootm_start() and let it set the field while it initialises the rest of the struct. Signed-off-by: Daniel Golle <[email protected]> --- boot/bootm.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/boot/bootm.c b/boot/bootm.c index b9aa83c3328..67df647d176 100644 --- a/boot/bootm.c +++ b/boot/bootm.c @@ -275,7 +275,7 @@ static int boot_get_kernel(const char *addr_fit, struct bootm_headers *images, return 0; } -static int bootm_start(void) +static int bootm_start(struct udevice *imagemap) { /* * Free dm-verity allocations from a prior boot attempt before @@ -286,6 +286,7 @@ static int bootm_start(void) fit_verity_free(&images); memset((void *)&images, 0, sizeof(images)); images.verify = env_get_yesno("verify"); + images.imagemap = imagemap; bootstage_mark_name(BOOTSTAGE_ID_BOOTM_START, "bootm_start"); images.state = BOOTM_STATE_START; @@ -1198,15 +1199,8 @@ int bootm_run_states(struct bootm_info *bmi, int states) * Work through the states and see how far we get. We stop on * any error. */ - if (states & BOOTM_STATE_START) { - ret = bootm_start(); - /* - * bootm_start() zeroes the global images struct. Restore - * the loader pointer so the storage-backed path works. - */ - if (IS_ENABLED(CONFIG_IMAGEMAP) && bmi->imagemap) - images->imagemap = bmi->imagemap; - } + if (states & BOOTM_STATE_START) + ret = bootm_start(bmi->imagemap); if (!ret && (states & BOOTM_STATE_PRE_LOAD)) { /* Pre-load verification is not applicable to storage boot */ -- 2.56.0
