From: Ahmad Fatoum <a.fatoum@pengutronix.de>
To: barebox@lists.infradead.org
Cc: Ahmad Fatoum <a.fatoum@pengutronix.de>
Subject: [PATCH master v2 1/2] bootm: associate bootm overrides with struct bootentry
Date: Mon, 7 Apr 2025 12:47:55 +0200 [thread overview]
Message-ID: <20250407104756.3379066-1-a.fatoum@pengutronix.de> (raw)
The boot override logic is currently controlled by the boot command,
which makes it cumbersome to exercise from custom bootentry providers.
A more natural place would be associating it with the boot entry logic,
so move it there.
No functional change.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
v1 -> v2:
- no change
---
commands/boot.c | 11 ++---------
common/boot.c | 4 ++++
common/bootm.c | 3 ++-
include/boot.h | 2 ++
include/bootm-overrides.h | 30 ++++++++++++++++++++++++++++++
include/bootm.h | 18 ------------------
6 files changed, 40 insertions(+), 28 deletions(-)
create mode 100644 include/bootm-overrides.h
diff --git a/commands/boot.c b/commands/boot.c
index 820708380191..aad01fdc6c95 100644
--- a/commands/boot.c
+++ b/commands/boot.c
@@ -55,11 +55,6 @@ static int boot_add_override(struct bootm_overrides *overrides, char *var)
return 0;
}
-static inline bool boot_has_overrides(const struct bootm_overrides *overrides)
-{
- return overrides->os_file || overrides->oftree_file || overrides->initrd_file;
-}
-
static int do_boot(int argc, char *argv[])
{
char *freep = NULL;
@@ -128,8 +123,6 @@ static int do_boot(int argc, char *argv[])
}
entries = bootentries_alloc();
- if (boot_has_overrides(&overrides))
- bootm_set_overrides(&overrides);
while ((name = next(&handle)) != NULL) {
if (!*name)
@@ -142,6 +135,8 @@ static int do_boot(int argc, char *argv[])
continue;
bootentries_for_each_entry(entries, entry) {
+ bootm_merge_overrides(&entry->overrides, &overrides);
+
ret = boot_entry(entry, verbose, dryrun);
if (!ret)
goto out;
@@ -164,8 +159,6 @@ static int do_boot(int argc, char *argv[])
ret = 0;
out:
- if (boot_has_overrides(&overrides))
- bootm_unset_overrides();
bootentries_free(entries);
free(freep);
diff --git a/common/boot.c b/common/boot.c
index 2530a5bbeeac..e6edb816eee0 100644
--- a/common/boot.c
+++ b/common/boot.c
@@ -162,10 +162,14 @@ int boot_entry(struct bootentry *be, int verbose, int dryrun)
}
}
+ bootm_set_overrides(&be->overrides);
+
ret = be->boot(be, verbose, dryrun);
if (ret && ret != -ENOMEDIUM)
pr_err("Booting entry '%s' failed: %pe\n", be->title, ERR_PTR(ret));
+ bootm_set_overrides(NULL);
+
globalvar_set_match("linux.bootargs.dyn.", "");
return ret;
diff --git a/common/bootm.c b/common/bootm.c
index fe4d51681d73..6b63987f0900 100644
--- a/common/bootm.c
+++ b/common/bootm.c
@@ -2,6 +2,7 @@
#include <common.h>
#include <bootm.h>
+#include <bootm-overrides.h>
#include <fs.h>
#include <malloc.h>
#include <memory.h>
@@ -1004,7 +1005,7 @@ int bootm_boot(struct bootm_data *bootm_data)
#ifdef CONFIG_BOOT_OVERRIDE
void bootm_set_overrides(const struct bootm_overrides *overrides)
{
- bootm_overrides = *overrides;
+ bootm_overrides = overrides ? *overrides : (struct bootm_overrides){};
}
#endif
diff --git a/include/boot.h b/include/boot.h
index 53ad1360a5f3..9af397db5b62 100644
--- a/include/boot.h
+++ b/include/boot.h
@@ -5,6 +5,7 @@
#include <of.h>
#include <menu.h>
#include <environment.h>
+#include <bootm-overrides.h>
#ifdef CONFIG_FLEXIBLE_BOOTARGS
const char *linux_bootargs_get(void);
@@ -33,6 +34,7 @@ struct bootentry {
char *description;
int (*boot)(struct bootentry *entry, int verbose, int dryrun);
void (*release)(struct bootentry *entry);
+ struct bootm_overrides overrides;
};
int bootentries_add_entry(struct bootentries *entries, struct bootentry *entry);
diff --git a/include/bootm-overrides.h b/include/bootm-overrides.h
new file mode 100644
index 000000000000..231c913709e2
--- /dev/null
+++ b/include/bootm-overrides.h
@@ -0,0 +1,30 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef __BOOTM_OVERRIDES_H
+#define __BOOTM_OVERRIDES_H
+
+struct bootm_overrides {
+ const char *os_file;
+ const char *oftree_file;
+ const char *initrd_file;
+};
+
+#ifdef CONFIG_BOOT_OVERRIDE
+void bootm_set_overrides(const struct bootm_overrides *overrides);
+#else
+static inline void bootm_set_overrides(const struct bootm_overrides *overrides) {}
+#endif
+
+static inline void bootm_merge_overrides(struct bootm_overrides *dst,
+ const struct bootm_overrides *src)
+{
+ if (!IS_ENABLED(CONFIG_BOOT_OVERRIDE))
+ return;
+ if (src->os_file)
+ dst->os_file = src->os_file;
+ if (src->oftree_file)
+ dst->oftree_file = src->oftree_file;
+ if (src->initrd_file)
+ dst->initrd_file = src->initrd_file;
+}
+
+#endif
diff --git a/include/bootm.h b/include/bootm.h
index 0e5e99773a26..b86d06b0f55d 100644
--- a/include/bootm.h
+++ b/include/bootm.h
@@ -160,22 +160,4 @@ void bootm_force_signed_images(void);
void *booti_load_image(struct image_data *data, phys_addr_t *oftree);
-struct bootm_overrides {
- const char *os_file;
- const char *oftree_file;
- const char *initrd_file;
-};
-
-#ifdef CONFIG_BOOT_OVERRIDE
-void bootm_set_overrides(const struct bootm_overrides *overrides);
-#else
-static inline void bootm_set_overrides(const struct bootm_overrides *overrides) {}
-#endif
-
-static inline void bootm_unset_overrides(void)
-{
- struct bootm_overrides overrides = {};
- bootm_set_overrides(&overrides);
-}
-
#endif /* __BOOTM_H */
--
2.39.5
next reply other threads:[~2025-04-07 10:48 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-07 10:47 Ahmad Fatoum [this message]
2025-04-07 10:47 ` [PATCH master v2 2/2] bootm: remove ability for late override of bootm.image Ahmad Fatoum
2025-04-07 13:01 ` [PATCH master v2 1/2] bootm: associate bootm overrides with struct bootentry Sascha Hauer
2025-04-07 13:16 ` Sascha Hauer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250407104756.3379066-1-a.fatoum@pengutronix.de \
--to=a.fatoum@pengutronix.de \
--cc=barebox@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox