[PATCH 07/18] bootstd: Use the bootargs env var for changing the cmdline
Bin Meng
bmeng.cn at gmail.com
Mon May 15 09:48:03 CEST 2023
Hi Simon,
On Sat, Apr 29, 2023 at 3:27 AM Simon Glass <sjg at chromium.org> wrote:
>
> The "bootargs" environment variable is used to set the command-line
> arguments to pass to the OS. Use this same mechanism with bootstd as well.
> When the variable is updated, it is written to the current bootflow. When
> the current bootflow is updated, the environment variable is updated too.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> boot/bootflow.c | 59 ++++++++++++++++++++++++++++++++++++++++++
> cmd/bootflow.c | 6 +++++
> include/env_callback.h | 6 +++--
> 3 files changed, 69 insertions(+), 2 deletions(-)
>
> diff --git a/boot/bootflow.c b/boot/bootflow.c
> index 487552fa28c..62b7f45ab27 100644
> --- a/boot/bootflow.c
> +++ b/boot/bootflow.c
> @@ -12,6 +12,7 @@
> #include <bootmeth.h>
> #include <bootstd.h>
> #include <dm.h>
> +#include <env_internal.h>
> #include <malloc.h>
> #include <dm/device-internal.h>
> #include <dm/uclass-internal.h>
> @@ -552,3 +553,61 @@ int bootflow_iter_check_system(const struct bootflow_iter *iter)
>
> return -ENOTSUPP;
> }
> +
> +/**
> + * bootflow_cmdline_set() - Set the command line for a bootflow
> + *
> + * @value: New command-line string
> + * Returns 0 if OK, -ENOENT if no current bootflow, -ENOMEM if out of memory
> + */
> +int bootflow_cmdline_set(struct bootflow *bflow, const char *value)
> +{
> + char *cmdline = NULL;
> +
> + if (value) {
> + cmdline = strdup(value);
> + if (!cmdline)
> + return -ENOMEM;
> + }
> +
> + free(bflow->cmdline);
What happens if this API gets called the very first time, with
flow->cmdline points to a random place?
> + bflow->cmdline = cmdline;
> +
> + return 0;
> +}
> +
> +#ifdef CONFIG_BOOTSTD_FULL
> +/**
> + * on_bootargs() - Update the cmdline of a bootflow
> + */
> +static int on_bootargs(const char *name, const char *value, enum env_op op,
> + int flags)
> +{
> + struct bootstd_priv *std;
> + struct bootflow *bflow;
> + int ret;
> +
> + ret = bootstd_get_priv(&std);
> + if (ret)
> + return 0;
> + bflow = std->cur_bootflow;
> + if (!bflow)
> + return 0;
> +
> + switch (op) {
> + case env_op_create:
> + case env_op_overwrite:
> + ret = bootflow_cmdline_set(bflow, value);
> + if (ret && ret != ENOENT)
> + return 1;
> + return 0;
> + case env_op_delete:
> + bootflow_cmdline_set(bflow, NULL);
> + fallthrough;
> + default:
> + return 0;
> + }
> +}
> +U_BOOT_ENV_CALLBACK(bootargs, on_bootargs);
> +#endif
> +
> diff --git a/cmd/bootflow.c b/cmd/bootflow.c
> index 59d1bdc25b7..b20d5893632 100644
> --- a/cmd/bootflow.c
> +++ b/cmd/bootflow.c
> @@ -288,6 +288,12 @@ static int do_bootflow_select(struct cmd_tbl *cmdtp, int flag, int argc,
> return CMD_RET_FAILURE;
> }
> std->cur_bootflow = found;
> + if (IS_ENABLED(CONFIG_BOOTSTD_FULL)) {
> + if (env_set("bootargs", found->cmdline)) {
> + printf("Cannot set bootargs\n");
> + return CMD_RET_FAILURE;
> + }
> + }
>
> return 0;
> }
> diff --git a/include/env_callback.h b/include/env_callback.h
> index a9a14f2a84a..23bc650c162 100644
> --- a/include/env_callback.h
> +++ b/include/env_callback.h
> @@ -60,8 +60,10 @@
> #define NET6_CALLBACKS
> #endif
>
> -#ifdef CONFIG_BOOTSTD
> -#define BOOTSTD_CALLBACK "bootmeths:bootmeths,"
> +#ifdef CONFIG_BOOTSTD_FULL
> +#define BOOTSTD_CALLBACK \
> + "bootmeths:bootmeths," \
> + "bootargs:bootargs,"
> #else
> #define BOOTSTD_CALLBACK
> #endif
> --
Regards,
Bin
More information about the U-Boot
mailing list