[PATCH v2 07/17] boot: Update first_glob_method when dropping a bootmeth

Simon Glass sjg at chromium.org
Wed Oct 1 23:26:32 CEST 2025


For now we only support dropping non-global bootmeths from the
iteration. Update first_glob_method in that case and add a few checks
that things are correct.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

(no changes since v1)

 boot/bootflow.c      | 6 ++++++
 test/boot/bootflow.c | 8 ++++++++
 2 files changed, 14 insertions(+)

diff --git a/boot/bootflow.c b/boot/bootflow.c
index 9aa9d449b7f..cf7a3befe8d 100644
--- a/boot/bootflow.c
+++ b/boot/bootflow.c
@@ -167,11 +167,17 @@ int bootflow_iter_drop_bootmeth(struct bootflow_iter *iter,
 	    iter->method_order[iter->cur_method] != bmeth)
 		return -EINVAL;
 
+	log_debug("Dropping bootmeth '%s'\n", bmeth->name);
+
 	memmove(&iter->method_order[iter->cur_method],
 		&iter->method_order[iter->cur_method + 1],
 		(iter->num_methods - iter->cur_method - 1) * sizeof(void *));
 
 	iter->num_methods--;
+	if (iter->first_glob_method > 0) {
+		iter->first_glob_method--;
+		log_debug("first_glob_method %d\n", iter->first_glob_method);
+	}
 
 	return 0;
 }
diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
index f6661530848..a65fcd3d4e3 100644
--- a/test/boot/bootflow.c
+++ b/test/boot/bootflow.c
@@ -483,7 +483,11 @@ static int bootflow_iter_disable(struct unit_test_state *uts)
 	/* Try to boot the bootmgr flow, which will fail */
 	console_record_reset_enable();
 	ut_assertok(bootflow_scan_first(NULL, NULL, &iter, 0, &bflow));
+
+	/* at this point the global bootmeths are stranded above num_methods */
 	ut_asserteq(3, iter.num_methods);
+	ut_assert(!iter.doing_global);
+	ut_asserteq(3, iter.first_glob_method);
 	ut_asserteq_str("sandbox", iter.method->name);
 	ut_assertok(inject_response(uts));
 	ut_asserteq(-ENOTSUPP, bootflow_run_boot(&iter, &bflow));
@@ -493,9 +497,13 @@ static int bootflow_iter_disable(struct unit_test_state *uts)
 
 	/* Check that the sandbox bootmeth has been removed */
 	ut_asserteq(2, iter.num_methods);
+
 	for (i = 0; i < iter.num_methods; i++)
 		ut_assert(strcmp("sandbox", iter.method_order[i]->name));
 
+	/* the first global bootmeth is now down one place in the list */
+	ut_asserteq(2, iter.first_glob_method);
+
 	return 0;
 }
 BOOTSTD_TEST(bootflow_iter_disable, UTF_DM | UTF_SCAN_FDT | UTF_CONSOLE);
-- 
2.43.0



More information about the U-Boot mailing list