All of lore.kernel.org
 help / color / mirror / Atom feed
From: Francis Laniel <francis.laniel@amarulasolutions.com>
To: u-boot@lists.denx.de
Cc: Tom Rini <trini@konsulko.com>,
	Michael Nazzareno Trimarchi <michael@amarulasolutions.com>,
	Harald Seiler <hws@denx.de>, Simon Glass <sjg@chromium.org>,
	Evgeny Bachinin <EABachinin@sberdevices.ru>,
	Marek Vasut <marex@denx.de>,
	Hector Palacios <hector.palacios@digi.com>
Subject: Re: [PATCH v13 15/24] cli: add modern hush as parser for run_command*()
Date: Fri, 22 Dec 2023 22:10:42 +0100	[thread overview]
Message-ID: <5739012.DvuYhMxLoT@pwmachine> (raw)
In-Reply-To: <20231222210244.91830-16-francis.laniel@amarulasolutions.com>

Hi!


Le vendredi 22 décembre 2023, 22:02:35 CET Francis Laniel a écrit :
> Enables using, in code, modern hush as parser for run_command function
> family. It also enables the command run to be used by CLI user of modern
> hush.
> 
> Reviewed-by: Simon Glass <sjg@chromium.org>
> Signed-off-by: Francis Laniel <francis.laniel@amarulasolutions.com>
> ---
>  common/cli.c               | 67 ++++++++++++++++++++++++++++----------
>  common/cli_hush_upstream.c |  2 +-
>  test/boot/bootflow.c       | 16 ++++++++-
>  3 files changed, 66 insertions(+), 19 deletions(-)
> 
> diff --git a/common/cli.c b/common/cli.c
> index b3eb512b62..a34938294e 100644
> --- a/common/cli.c
> +++ b/common/cli.c
> @@ -25,6 +25,14 @@
>  #include <linux/errno.h>
> 
>  #ifdef CONFIG_CMDLINE
> +
> +static inline bool use_hush_old(void)
> +{
> +	return IS_ENABLED(CONFIG_HUSH_SELECTABLE) ?
> +	gd->flags & GD_FLG_HUSH_OLD_PARSER :
> +	IS_ENABLED(CONFIG_HUSH_OLD_PARSER);
> +}
> +
>  /*
>   * Run a command using the selected parser.
>   *
> @@ -43,15 +51,30 @@ int run_command(const char *cmd, int flag)
>  		return 1;
> 
>  	return 0;
> -#elif CONFIG_IS_ENABLED(HUSH_OLD_PARSER)
> -	int hush_flags = FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP;
> -
> -	if (flag & CMD_FLAG_ENV)
> -		hush_flags |= FLAG_CONT_ON_NEWLINE;
> -	return parse_string_outer(cmd, hush_flags);
> -#else /* HUSH_MODERN_PARSER */
> -	/* Not yet implemented. */
> -	return 1;
> +#else
> +	if (use_hush_old()) {
> +		int hush_flags = FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP;
> +
> +		if (flag & CMD_FLAG_ENV)
> +			hush_flags |= FLAG_CONT_ON_NEWLINE;
> +		return parse_string_outer(cmd, hush_flags);
> +	}
> +	/*
> +	 * Possible values for flags are the following:
> +	 * FLAG_EXIT_FROM_LOOP: This flags ensures we exit from loop in
> +	 * parse_and_run_stream() after first iteration while normal
> +	 * behavior, * i.e. when called from cli_loop(), is to loop
> +	 * infinitely.
> +	 * FLAG_PARSE_SEMICOLON: modern Hush parses ';' and does not stop
> +	 * first time it sees one. So, I think we do not need this flag.
> +	 * FLAG_REPARSING: For the moment, I do not understand the goal
> +	 * of this flag.
> +	 * FLAG_CONT_ON_NEWLINE: This flag seems to be used to continue
> +	 * parsing even when reading '\n' when coming from
> +	 * run_command(). In this case, modern Hush reads until it finds
> +	 * '\0'. So, I think we do not need this flag.
> +	 */
> +	return parse_string_outer_modern(cmd, FLAG_EXIT_FROM_LOOP);
>  #endif
>  }
> 
> @@ -67,12 +90,23 @@ int run_command_repeatable(const char *cmd, int flag)
>  #ifndef CONFIG_HUSH_PARSER
>  	return cli_simple_run_command(cmd, flag);
>  #else
> +	int ret;
> +
> +	if (use_hush_old()) {
> +		ret = parse_string_outer(cmd,
> +					 FLAG_PARSE_SEMICOLON
> +					 | FLAG_EXIT_FROM_LOOP);
> +	} else {
> +		ret = parse_string_outer_modern(cmd,
> +					      FLAG_PARSE_SEMICOLON
> +					      | FLAG_EXIT_FROM_LOOP);
> +	}
> +
>  	/*
>  	 * parse_string_outer() returns 1 for failure, so clean up
>  	 * its result.
>  	 */
> -	if (parse_string_outer(cmd,
> -			       FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP))
> +	if (ret)
>  		return -1;
> 
>  	return 0;
> @@ -111,12 +145,11 @@ int run_command_list(const char *cmd, int len, int
> flag) buff[len] = '\0';
>  	}
>  #ifdef CONFIG_HUSH_PARSER
> -#if CONFIG_IS_ENABLED(HUSH_OLD_PARSER)
> -	rcode = parse_string_outer(buff, FLAG_PARSE_SEMICOLON);
> -#else /* HUSH_MODERN_PARSER */
> -	/* Not yet implemented. */
> -	rcode = 1;
> -#endif
> +	if (use_hush_old()) {
> +		rcode = parse_string_outer(buff, FLAG_PARSE_SEMICOLON);
> +	} else {
> +		rcode = parse_string_outer_modern(buff, FLAG_PARSE_SEMICOLON);
> +	}
>  #else
>  	/*
>  	 * This function will overwrite any \n it sees with a \0, which
> diff --git a/common/cli_hush_upstream.c b/common/cli_hush_upstream.c
> index 7f6b058e6c..11870c51e8 100644
> --- a/common/cli_hush_upstream.c
> +++ b/common/cli_hush_upstream.c
> @@ -8022,7 +8022,7 @@ static int parse_and_run_string(const char *s)
>  }
> 
>  #ifdef __U_BOOT__
> -int parse_string_outer(const char *cmd, int flags)
> +int parse_string_outer_modern(const char *cmd, int flags)
>  {
>  	int ret;
>  	int old_flags;
> diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
> index a9b555c779..104f49deef 100644
> --- a/test/boot/bootflow.c
> +++ b/test/boot/bootflow.c
> @@ -710,7 +710,21 @@ static int bootflow_scan_menu_boot(struct
> unit_test_state *uts) ut_assert_skip_to_line("(2 bootflows, 2 valid)");
> 
>  	ut_assert_nextline("Selected: Armbian");
> -	ut_assert_skip_to_line("Boot failed (err=-14)");
> +
> +	if (gd->flags & GD_FLG_HUSH_OLD_PARSER) {
> +		/*
> +		 * With old hush, despite booti failing to boot, i.e. returning
> +		 * CMD_RET_FAILURE, run_command() returns 0 which leads 
bootflow_boot(),
> as +		 * we are using bootmeth_script here, to return -EFAULT.
> +		 */
> +		ut_assert_skip_to_line("Boot failed (err=-14)");
> +	} else if (gd->flags & GD_FLG_HUSH_MODERN_PARSER) {
> +		/*
> +		 * While with modern one, run_command() propagates 
CMD_RET_FAILURE
> returned +		 * by booti, so we get 1 here.
> +		 */
> +		ut_assert_skip_to_line("Boot failed (err=1)");
> +	}

I would like to give a bit of context here.
With the following patch:
diff --git a/test/py/tests/test_ut.py b/test/py/tests/test_ut.py
index c169c835e3..cc5adda0a3 100644
--- a/test/py/tests/test_ut.py
+++ b/test/py/tests/test_ut.py
@@ -173,7 +173,7 @@ else
        fi
 fi
 booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
-
+echo $?
 # Recompile with:
 # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr
 ''' % (mmc_dev)
We can easily see that booti is failing while running the test:
$ ./test/py/test.py -o log_cli=true -s --build -v -k 
'test_ut[ut_bootstd_bootflow_scan_menu_boot'
...
Aborting!
Failed to load '/boot/dtb/rockchip/overlay/-fixup.scr'
1

The problem with old hush, is that the 1 returned here, which corresponds to 
CMD_RET_FAILURE, is not propagated as the return value of run_command().
So, this lead the -EFAULT branch here to be taken:
int bootflow_boot(struct bootflow *bflow)
{
	/* ... */

	ret = bootmeth_boot(bflow->method, bflow);
	if (ret)
		return log_msg_ret("boot", ret);

	/*
	 * internal error, should not get here since we should have booted
	 * something or returned an error
	 */

	return log_msg_ret("end", -EFAULT);
}

With modern hush, CMD_RET_FAILURE is propagated as the return value of 
run_command().
As a consequence, we return with log_mst_ret("boot", 1), which leaded to this 
test to fail.
The above modification consists in adapting the expected output to the current 
shell flavor.
I think this is the good thing to do, as I find modern hush behavior better 
than the old one, i.e. it propagates CMD_RET_FAILURE as return of 
run_command().

>  	ut_assertnonnull(std->cur_bootflow);
>  	ut_assert_console_end();


Happy end of the year!



  reply	other threads:[~2023-12-22 21:10 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-22 21:02 [PATCH v13 00/24] Modernize U-Boot shell Francis Laniel
2023-12-22 21:02 ` [PATCH v13 01/24] test: Add framework to test hush behavior Francis Laniel
2023-12-22 21:02 ` [PATCH v13 02/24] test: hush: Test hush if/else Francis Laniel
2023-12-22 21:02 ` [PATCH v13 03/24] test/py: hush_if_test: Remove the test file Francis Laniel
2023-12-22 21:02 ` [PATCH v13 04/24] test: hush: Test hush variable expansion Francis Laniel
2023-12-22 21:02 ` [PATCH v13 05/24] test: hush: Test hush commands list Francis Laniel
2023-12-22 21:02 ` [PATCH v13 06/24] test: hush: Test hush loops Francis Laniel
2023-12-22 21:02 ` [PATCH v13 07/24] cli: Add Busybox upstream hush.c file Francis Laniel
2023-12-22 21:02 ` [PATCH v13 08/24] cli: Port upstream Busybox hush to U-Boot Francis Laniel
2023-12-22 21:02 ` [PATCH v13 09/24] cli: Add menu for hush parser Francis Laniel
2023-12-22 21:02 ` [PATCH v13 10/24] global_data.h: add GD_FLG_HUSH_OLD_PARSER flag Francis Laniel
2023-12-22 21:02 ` [PATCH v13 11/24] cmd: Add new cli command Francis Laniel
2023-12-22 21:02 ` [PATCH v13 12/24] cli: Enables using modern hush parser as command line parser Francis Laniel
2023-12-22 21:02 ` [PATCH v13 13/24] cli: hush_modern: Enable variables expansion for modern hush Francis Laniel
2023-12-22 21:02 ` [PATCH v13 14/24] cli: hush_modern: Add functions to be called from run_command() Francis Laniel
2023-12-22 21:02 ` [PATCH v13 15/24] cli: add modern hush as parser for run_command*() Francis Laniel
2023-12-22 21:10   ` Francis Laniel [this message]
2023-12-22 21:23     ` Tom Rini
2023-12-26  9:46       ` Simon Glass
2023-12-29 18:55         ` Francis Laniel
2023-12-22 21:02 ` [PATCH v13 16/24] test: hush: Fix instructions list tests for modern hush Francis Laniel
2023-12-22 21:02 ` [PATCH v13 17/24] test: hush: Fix variable expansion " Francis Laniel
2023-12-22 21:02 ` [PATCH v13 18/24] cli: hush_modern: Enable using < and > as string compare operators Francis Laniel
2023-12-22 21:02 ` [PATCH v13 19/24] cli: hush_modern: Enable if keyword Francis Laniel
2023-12-22 21:02 ` [PATCH v13 20/24] cli: hush_modern: Enable loops Francis Laniel
2023-12-22 21:02 ` [PATCH v13 21/24] test: hush: Fix loop tests for modern hush Francis Laniel
2023-12-22 21:02 ` [PATCH v13 22/24] cli: modern_hush: Add upstream commits up to 2nd October 2023 Francis Laniel
2023-12-22 21:02 ` [PATCH v13 23/24] cmd: Set modern hush as default shell Francis Laniel
2023-12-22 21:02 ` [PATCH v13 24/24] configs: Use old hush for several boards Francis Laniel
2023-12-28 20:58 ` [PATCH v13 00/24] Modernize U-Boot shell Tom Rini
2023-12-29 18:55   ` Francis Laniel
2024-01-11 17:04     ` Francesco Dolcini
2024-01-15 17:34       ` Patrice CHOTARD
2024-01-16  0:46         ` Tom Rini
2024-01-16  7:08           ` Patrice CHOTARD
2024-01-16 17:25         ` Francis Laniel
2024-01-17 10:05           ` Patrice CHOTARD
2024-01-17 17:30             ` Francis Laniel
2024-01-17 17:39               ` Francesco Dolcini
2024-01-18  7:05                 ` Patrice CHOTARD
2024-01-18 14:09                   ` Tom Rini
2024-01-16 17:20       ` Francis Laniel

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=5739012.DvuYhMxLoT@pwmachine \
    --to=francis.laniel@amarulasolutions.com \
    --cc=EABachinin@sberdevices.ru \
    --cc=hector.palacios@digi.com \
    --cc=hws@denx.de \
    --cc=marex@denx.de \
    --cc=michael@amarulasolutions.com \
    --cc=sjg@chromium.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.