]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
boot: Don't change the method count after global bootmeths
authorSimon Glass <sjg@chromium.org>
Wed, 15 Oct 2025 15:44:12 +0000 (16:44 +0100)
committerTom Rini <trini@konsulko.com>
Wed, 22 Oct 2025 20:16:56 +0000 (14:16 -0600)
At present before scanning global bootmeths, the iterator sets the
method count to the index of the first global bootmeth. Now that we
support scanning the global bootmeths multiple times, we must leave this
count alone.

Check against have_global and first_glob_method instead.

Signed-off-by: Simon Glass <sjg@chromium.org>
boot/bootflow.c
test/boot/bootflow.c

index 1a4cd0e28e8a2eb20b8fb583a76e2b2388d7d793..38b8af916b299f1ceaf723d42d9da0eb921924b3 100644 (file)
@@ -304,9 +304,20 @@ static int iter_incr(struct bootflow_iter *iter)
        for (iter->cur_method++; iter->cur_method < iter->num_methods;
             iter->cur_method++) {
                /* loop until we find a global bootmeth we haven't used */
-               if (IS_ENABLED(CONFIG_BOOTMETH_GLOBAL) && iter->doing_global &&
-                   !bootmeth_glob_allowed(iter, iter->cur_method))
-                       continue;
+               if (IS_ENABLED(CONFIG_BOOTMETH_GLOBAL) && iter->doing_global) {
+                       if (!bootmeth_glob_allowed(iter, iter->cur_method))
+                               continue;
+
+                       iter->method = iter->method_order[iter->cur_method];
+                       log_debug("-> next global method '%s'\n",
+                                 iter->method->name);
+                       return 0;
+               }
+
+               /* at this point we are only considering non-global bootmeths */
+               if (IS_ENABLED(CONFIG_BOOTMETH_GLOBAL) && iter->have_global &&
+                   iter->cur_method >= iter->first_glob_method)
+                       break;
 
                iter->method = iter->method_order[iter->cur_method];
                return 0;
@@ -317,7 +328,6 @@ static int iter_incr(struct bootflow_iter *iter)
         * normal bootdev scan
         */
        if (IS_ENABLED(CONFIG_BOOTMETH_GLOBAL) && global) {
-               iter->num_methods = iter->first_glob_method;
                iter->doing_global = false;
 
                /*
index 8317dee1e20ad471f977a8d19dd7bbc6036a3df1..20297136e3f8027e6dfa256a9029dfe2fa75a101 100644 (file)
@@ -426,7 +426,7 @@ static int bootflow_iter_glob(struct unit_test_state *uts)
        ut_asserteq(-EPROTONOSUPPORT, bootflow_scan_next(&iter, &bflow));
 
        /* at this point the global bootmeths are stranded above num_methods */
-       ut_asserteq(2, iter.num_methods);
+       ut_asserteq(3, iter.num_methods);
        ut_asserteq(2, iter.first_glob_method);
        ut_assert(!iter.doing_global);
        ut_assert(iter.have_global);
@@ -493,7 +493,7 @@ static int bootflow_iter_disable(struct unit_test_state *uts)
        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_asserteq(4, iter.num_methods);
        ut_assert(!iter.doing_global);
        ut_assert(iter.have_global);
        ut_asserteq(3, iter.first_glob_method);
@@ -505,7 +505,7 @@ static int bootflow_iter_disable(struct unit_test_state *uts)
        ut_assert_console_end();
 
        /* Check that the sandbox bootmeth has been removed */
-       ut_asserteq(2, iter.num_methods);
+       ut_asserteq(3, iter.num_methods);
 
        for (i = 0; i < iter.num_methods; i++)
                ut_assert(strcmp("sandbox", iter.method_order[i]->name));