Hi Max,

On Mon, 28 Nov 2022 at 21:41, Max Krummenacher <max.oss...@gmail.com> wrote:
>
> From: Max Krummenacher <max.krummenac...@toradex.com>
>
> With LTO enabled the U-Boot initial environment is no longer stored
> in an easy accessible section in env/common.o. I.e. the section name
> changes from build to build, its content maybe compressed and it is
> annotated with additional data.
>
> Drop trying to read the initial env with elf tools from the compiler
> specific object file in favour of adding and using a host tool with
> the only functionality of printing the initial env to stdout.
>
> See also:
> https://lore.kernel.org/all/927b122e-1f62-e790-f5ca-30bae4332...@foss.st.com/
>
> Signed-off-by: Max Krummenacher <max.krummenac...@toradex.com>
> Acked-by: Pali Rohár <p...@kernel.org>
>
> ---
>
> Changes in v5:
> - don't build the printinitialenv tool unconditionally but build it
>   only as part of the u-boot-initial-env target.
>   This no longer fails the 'make tools-only_defconfig tools-only'
>   use-case which is reported by Tom Rini.
>   Adding the $(env_h) dependencies to the tools target might give
>   circular dependencies issues with some future tool.
> - add Acked-by: Pali Rohár <p...@kernel.org>
>
> Changes in v4:
> - add '(objtree)/' when calling the tool. Suggested by Pali Rohár.
> - renamed patch, as more than just the Makefile has changes
>
> Changes in v3:
> - moved the tool from scripts/ to tools/. Suggested by Tom Rini
> - changed the dependencies to '$(env_h)' and 'tools'.
>   Suggested by Tom Rini and Pali Rohár.
> - removed the sed rule which replaces \x00 with \x0A as this is already
>   done by the tool. Suggested by Pali Rohár.
>
> Changes in v2:
> - reworked to build a host tool which prints the configured
>   environment as proposed by Pali Rohár
>   
> https://lore.kernel.org/u-boot/20221018174827.1393211-1-max.oss...@gmail.com/
> - renamed patch, v1 used "Makefile: fix u-boot-initial-env target if lto is 
> enabled"
>
>  Makefile                | 10 ++++++----
>  tools/.gitignore        |  1 +
>  tools/Makefile          |  4 ++++
>  tools/printinitialenv.c | 44 +++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 55 insertions(+), 4 deletions(-)
>  create mode 100644 tools/printinitialenv.c

Reviewed-by: Simon Glass <s...@chromium.org>

It would be nice to have a test for this. It could go in test_env.py
and you can use test_event.py as an example.


- Simon


>
> diff --git a/Makefile b/Makefile
> index 2d24ac3959f..32e4bef10f5 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2439,11 +2439,13 @@ endif
>         $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
>
>  quiet_cmd_genenv = GENENV  $@
> -cmd_genenv = $(OBJCOPY) --dump-section .rodata.default_environment=$@ 
> env/common.o; \
> -       sed --in-place -e 's/\x00/\x0A/g' $@; sed --in-place -e '/^\s*$$/d' 
> $@; \
> -       sort --field-separator== -k1,1 --stable $@ -o $@
> +cmd_genenv = \
> +       $(objtree)/tools/printinitialenv | \
> +       sed -e '/^\s*$$/d' | \
> +       sort --field-separator== -k1,1 --stable -o $@
>
> -u-boot-initial-env: u-boot.bin
> +u-boot-initial-env: $(env_h) FORCE
> +       $(Q)$(MAKE) $(build)=tools $(objtree)/tools/printinitialenv
>         $(call if_changed,genenv)
>
>  # Consistency checks
> diff --git a/tools/.gitignore b/tools/.gitignore
> index d3a93ff294a..28e8ce2a07a 100644
> --- a/tools/.gitignore
> +++ b/tools/.gitignore
> @@ -28,6 +28,7 @@
>  /mxsboot
>  /ncb
>  /prelink-riscv
> +/printinitialenv
>  /proftool
>  /relocate-rela
>  /spl_size_limit
> diff --git a/tools/Makefile b/tools/Makefile
> index 26be0a7ba2e..80bc62befcb 100644
> --- a/tools/Makefile
> +++ b/tools/Makefile
> @@ -275,6 +275,10 @@ clean-dirs := lib common
>
>  always := $(hostprogs-y)
>
> +# Host tool to dump the currently configured default environment,
> +# build it on demand, i.e. not add it to 'always'.
> +hostprogs-y += printinitialenv
> +
>  # Generated LCD/video logo
>  LOGO_H = $(objtree)/include/bmp_logo.h
>  LOGO_DATA_H = $(objtree)/include/bmp_logo_data.h
> diff --git a/tools/printinitialenv.c b/tools/printinitialenv.c
> new file mode 100644
> index 00000000000..c58b234d679
> --- /dev/null
> +++ b/tools/printinitialenv.c
> @@ -0,0 +1,44 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * (C) Copyright 2022
> + * Max Krummenacher, Toradex
> + *
> + * Snippets taken from tools/env/fw_env.c
> + *
> + * This prints the list of default environment variables as currently
> + * configured.
> + *
> + */
> +
> +#include <stdio.h>
> +
> +/* Pull in the current config to define the default environment */
> +#include <linux/kconfig.h>
> +
> +#ifndef __ASSEMBLY__
> +#define __ASSEMBLY__ /* get only #defines from config.h */
> +#include <config.h>
> +#undef __ASSEMBLY__
> +#else
> +#include <config.h>
> +#endif
> +
> +#define DEFAULT_ENV_INSTANCE_STATIC
> +#include <generated/environment.h>
> +#include <env_default.h>
> +
> +int main(void)
> +{
> +       char *env, *nxt;
> +
> +       for (env = default_environment; *env; env = nxt + 1) {
> +               for (nxt = env; *nxt; ++nxt) {
> +                       if (nxt >= 
> &default_environment[sizeof(default_environment)]) {
> +                               fprintf(stderr, "## Error: environment not 
> terminated\n");
> +                               return -1;
> +                       }
> +               }
> +               printf("%s\n", env);
> +       }
> +       return 0;
> +}
> --
> 2.35.3
>

Reply via email to