boot: Update first_glob_method when dropping a bootmeth

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@chromium.org>
This commit is contained in:
Simon Glass
2025-10-15 16:44:06 +01:00
committed by Tom Rini
parent a2301201e3
commit eca985905d
2 changed files with 14 additions and 0 deletions

View File

@@ -109,11 +109,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;
}

View File

@@ -482,7 +482,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));
@@ -492,9 +496,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);