From patchwork Tue Sep 30 00:51:23 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 444 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1759193543; bh=3VuwlgfmUISs48eVCBzyC+EkYZMHXEkRQK3n2z7ZO0w=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=VcHDqP8pN2MNwaFyWQT3PwJoqS4kRycQFP93FVvGjnhXvC5P7QiwfiRIvT3I3vtO8 jnnz/ixLs96jr7gArVbES1GDCDrDaT7aIFA29OlUGo8pSwlNbkXag8S0Fw9/1+cd3S 41T9ussV/3MwK6Hj3OmolLVJQvBlTPU45GcC5sznAn/2zyrS5g+01rUjVRWdiiSPvI /pd24KSSLVoJlUaNMMjOvQmKoWQ8WmfiIr6/k2Yqvoxt5mN5nT7F78jw0Ih7naJqzQ zk67WdszNRkRvkZWuVLkkMApv03mlE5sujlIjGkhtf8cEhAokKxQqL5oYsX6OgMffV yg0w9PWP33mFQ== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id ECFC267E80 for ; Mon, 29 Sep 2025 18:52:23 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id KVPpVeDZ3EP3 for ; Mon, 29 Sep 2025 18:52:23 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1759193541; bh=3VuwlgfmUISs48eVCBzyC+EkYZMHXEkRQK3n2z7ZO0w=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=T2NwFdqMtn120nmQff0j4YN3wYBPgcAuOJqNZNqwHvng/mQyN8ozXLILPe2Ka1d9X rObAou4RAp5vKAlF3G/WvJQ4Y8CeRDBd6rXpi1rHSm4npxb8RWDwbJ8kZIKiSW1w/C BZ0YFOk85yk6lsUcI9nHdkTJE7BE2w9DAsWhov2C5/NM0kwqkeSVtncTePaXtit0aF y7Z/oVi9j+sYYcXuBcauERySrh6Pj2E5OhNVRWcLr27iK7t14UWxO8Xqr2mJI2emCY eyRIDSbMtn58qrRMHac1OBxE4fCtxdj1vFO9Q8/SdmU7hFTHASGeue3GwdwAH41+uh 9aCb5k9r1Fksg== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id E968967E59 for ; Mon, 29 Sep 2025 18:52:21 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1759193538; bh=54FAyOOnZGhiA/DW2vIRg2gZCFm3znHo6IBECYPbxc8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eNlMQlFF24UikBueCXBq3VJxjiaWBzPAvYPaSvNFY/Kktc6XIrgSUFtLG0lX0TTQE xvdb1GY+B1P1m4ecn8hQw3/V92O2tYGe1MuWDChIaKPhWCgwuhvAGxhwaqlAipq4jZ MSoOkaNQFx+vJzCcDw05yeP8q0IQl8k3fHcH7wftjFdawh4IV8FyezGIaBEJldehrG F0/IG0w/zDQXEpzeBonfrKLaWwOmz7QOub3oHAulxECZRETQiXkCDqu+3KRlY6lcD/ IkwSUu60TH3XJqJftjWISa9oWWXMS5DT3LRdvJu4nJk9H3WvEoqL57g/DDaNIVzy5b ++CLXY/PatzNg== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id D4FA867E31; Mon, 29 Sep 2025 18:52:18 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id gYnNII7NO8Px; Mon, 29 Sep 2025 18:52:18 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1759193530; bh=LgYW+dZp4dpcUU4pxFrVJXM94yrcCpMmNnNU6PUBUbk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qU0bWUhcb4XDqX6Q6JHsP7Eu6YZyf/LQ10kPslQzTplT67iBGbBCQVPyYgTVaPd1t z5IQgXTBvqcDbp2jr+AfY6glvRkEJ7PEOfj0EYqAKkeD7BBbahdNUL/QrvuXFmn20H 3DondGF695VaSd4pz9BMmwzux3dUJk0hyuSpyDVMLPb1+QwzCwe02jybSudVBHUCQC oErNIxf6Fv/4nzW54l1ly/Lgn7QmjCdsHbYkZb+WGoJX9tHklNCPlLL7fZLrdlhaKZ AY+CmvYPci3Q1HUTzn4xCC4dzi64a4L6nc1sUtEOCkFEvkh2vYmPySFeNJ9g6buOFa eqLaZeZmtRBYA== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id 476D967E03; Mon, 29 Sep 2025 18:52:10 -0600 (MDT) From: Simon Glass To: U-Boot Concept Date: Mon, 29 Sep 2025 18:51:23 -0600 Message-ID: <20250930005137.3650600-8-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250930005137.3650600-1-sjg@u-boot.org> References: <20250930005137.3650600-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: AZ722RBFMCYFCUT5Z3K7NBEZT2L2VFHC X-Message-ID-Hash: AZ722RBFMCYFCUT5Z3K7NBEZT2L2VFHC X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Heinrich Schuchardt , Simon Glass X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 07/15] boot: Keep track of which bootmeths have been used List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass Add a bitfield which tracks when bootmeths have been used. This will be needed when global bootmeths can be used later in the iteration. Fix a missing bootflow_free() while here. Signed-off-by: Simon Glass --- boot/bootflow.c | 13 +++++++++++++ boot/bootmeth-uclass.c | 10 ++++++++++ include/bootflow.h | 8 ++++++++ test/boot/bootflow.c | 8 ++++++++ 4 files changed, 39 insertions(+) diff --git a/boot/bootflow.c b/boot/bootflow.c index efe8aea765d..6f5876548b2 100644 --- a/boot/bootflow.c +++ b/boot/bootflow.c @@ -18,6 +18,10 @@ #include #include +/* ensure BOOTMETH_MAX_COUNT fits in method_flags field */ +static_assert(BOOTMETH_MAX_COUNT <= + (sizeof(((struct bootflow_iter *)NULL)->method_flags) * 8)); + /* error codes used to signal running out of things */ enum { BF_NO_MORE_PARTS = -ESHUTDOWN, @@ -491,6 +495,10 @@ int bootflow_scan_first(struct udevice *dev, const char *label, bootflow_iter_set_dev(iter, dev, method_flags); } + if (IS_ENABLED(CONFIG_BOOTMETH_GLOBAL)) { + iter->methods_done |= BIT(iter->cur_method); + log_debug("methods_done now %x\n", iter->cur_method); + } ret = bootflow_check(iter, bflow); if (ret) { log_debug("check - ret=%d\n", ret); @@ -518,6 +526,11 @@ int bootflow_scan_next(struct bootflow_iter *iter, struct bootflow *bflow) return log_msg_ret("done", ret); if (!ret) { + if (IS_ENABLED(CONFIG_BOOTMETH_GLOBAL)) { + iter->methods_done |= BIT(iter->cur_method); + log_debug("methods_done now %x\n", + iter->cur_method); + } ret = bootflow_check(iter, bflow); log_debug("check - ret=%d\n", ret); if (!ret) diff --git a/boot/bootmeth-uclass.c b/boot/bootmeth-uclass.c index 0147b97fcb0..d71e4f001f1 100644 --- a/boot/bootmeth-uclass.c +++ b/boot/bootmeth-uclass.c @@ -199,6 +199,16 @@ int bootmeth_setup_iter_order(struct bootflow_iter *iter, bool include_global) iter->doing_global = true; iter->have_global = true; } + + /* + * check we don't exceed the maximum bits in methods_done when tracking + * which global bootmeths have run + */ + if (IS_ENABLED(CONFIG_BOOTMETH_GLOBAL) && count > BOOTMETH_MAX_COUNT) { + free(order); + return log_msg_ret("tmb", -ENOSPC); + } + iter->method_order = order; iter->num_methods = count; diff --git a/include/bootflow.h b/include/bootflow.h index 0805d10e197..051158780e6 100644 --- a/include/bootflow.h +++ b/include/bootflow.h @@ -12,6 +12,7 @@ #include #include #include +#include struct bootstd_priv; struct expo; @@ -226,6 +227,10 @@ enum bootflow_meth_flags_t { BOOTFLOW_METHF_SINGLE_UCLASS = 1 << 3, }; +enum { + BOOTMETH_MAX_COUNT = 32, +}; + /** * struct bootflow_iter - state for iterating through bootflows * @@ -273,6 +278,8 @@ enum bootflow_meth_flags_t { * happens before the normal ones) * @method_flags: flags controlling which methods should be used for this @dev * (enum bootflow_meth_flags_t) + * @methods_done: indicates which methods have been processed, one bit for + * each method in @method_order[] */ struct bootflow_iter { int flags; @@ -295,6 +302,7 @@ struct bootflow_iter { bool have_global; bool doing_global; int method_flags; + uint methods_done; }; /** diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c index a18afad0f72..af7f7391160 100644 --- a/test/boot/bootflow.c +++ b/test/boot/bootflow.c @@ -316,6 +316,7 @@ static int bootflow_iter(struct unit_test_state *uts) ut_assert(!iter.doing_global); ut_assert(!iter.have_global); ut_asserteq(-1, iter.first_glob_method); + ut_asserteq(BIT(0), iter.methods_done); /* * This shows MEDIA even though there is none, since in @@ -324,6 +325,7 @@ static int bootflow_iter(struct unit_test_state *uts) * know. */ ut_asserteq(BOOTFLOWST_MEDIA, bflow.state); + bootflow_free(&bflow); ut_asserteq(-EPROTONOSUPPORT, bootflow_scan_next(&iter, &bflow)); ut_asserteq(3, iter.num_methods); @@ -333,6 +335,7 @@ static int bootflow_iter(struct unit_test_state *uts) ut_asserteq_str("efi", iter.method->name); ut_asserteq(0, bflow.err); ut_asserteq(BOOTFLOWST_MEDIA, bflow.state); + ut_asserteq(BIT(0) | BIT(1), iter.methods_done); bootflow_free(&bflow); /* now the VBE boothmeth */ @@ -344,6 +347,7 @@ static int bootflow_iter(struct unit_test_state *uts) ut_asserteq_str("vbe", iter.method->name); ut_asserteq(0, bflow.err); ut_asserteq(BOOTFLOWST_MEDIA, bflow.state); + ut_asserteq(BIT(0) | BIT(1) | BIT(2), iter.methods_done); bootflow_free(&bflow); /* The next device is mmc1.bootdev - at first we use the whole device */ @@ -355,6 +359,7 @@ static int bootflow_iter(struct unit_test_state *uts) ut_asserteq_str("extlinux", iter.method->name); ut_asserteq(0, bflow.err); ut_asserteq(BOOTFLOWST_MEDIA, bflow.state); + ut_asserteq(BIT(0) | BIT(1) | BIT(2), iter.methods_done); bootflow_free(&bflow); ut_asserteq(-ENOENT, bootflow_scan_next(&iter, &bflow)); @@ -365,6 +370,7 @@ static int bootflow_iter(struct unit_test_state *uts) ut_asserteq_str("efi", iter.method->name); ut_asserteq(0, bflow.err); ut_asserteq(BOOTFLOWST_MEDIA, bflow.state); + ut_asserteq(BIT(0) | BIT(1) | BIT(2), iter.methods_done); bootflow_free(&bflow); /* now the VBE boothmeth */ @@ -376,6 +382,7 @@ static int bootflow_iter(struct unit_test_state *uts) ut_asserteq_str("vbe", iter.method->name); ut_asserteq(0, bflow.err); ut_asserteq(BOOTFLOWST_MEDIA, bflow.state); + ut_asserteq(BIT(0) | BIT(1) | BIT(2), iter.methods_done); bootflow_free(&bflow); /* Then move to partition 1 where we find something */ @@ -418,6 +425,7 @@ static int bootflow_iter(struct unit_test_state *uts) ut_asserteq_str("extlinux", iter.method->name); ut_asserteq(0, bflow.err); ut_asserteq(BOOTFLOWST_MEDIA, bflow.state); + ut_asserteq(BIT(0) | BIT(1) | BIT(2), iter.methods_done); bootflow_free(&bflow); bootflow_iter_uninit(&iter);