Skip to content
Snippets Groups Projects
  1. Dec 31, 2023
  2. Dec 28, 2023
    • Tom Rini's avatar
      Merge patch series "Modernize U-Boot shell" · 2b28c3b8
      Tom Rini authored
      Francis Laniel <francis.laniel@amarulasolutions.com> says:
      
      During 2021 summer, Sean Anderson wrote a contribution to add a new shell, based
      on LIL, to U-Boot [1, 2].
      While one of the goals of this contribution was to address the fact actual
      U-Boot shell, which is based on Busybox hush, is old there was a discussion
      about adding a new shell versus updating the actual one [3, 4].
      
      So, in this series, with Harald Seiler, we updated the actual U-Boot shell to
      reflect what is currently in Busybox source code.
      Basically, this contribution is about taking a snapshot of Busybox shell/hush.c
      file (as it exists in commit 37460f5da) and adapt it to suit U-Boot needs.
      
      This contribution was written to be as backward-compatible as possible to avoid
      breaking the existing.
      So, the modern hush flavor offers the same as the actual, that is to say:
      1. Variable expansion.
      2. Instruction lists (;, && and ||).
      3. If, then and else.
      4. Loops (for, while and until).
      No new features offered by Busybox hush were implemented (e.g. functions).
      
      It is possible to change the parser at runtime using the "cli" command:
      => cli print
      old
      => cli set modern
      => cli print
      modern
      => cli set old
      The default parser is the old one.
      Note that to use both parser, you would need to set both
      CONFIG_HUSH_MODERN_PARSER and CONFIG_HUSH_OLD_PARSER.
      
      In terms of testing, new unit tests were added to ut to ensure the new behavior
      is the same as the old one and it does not add regression.
      Nonetheless, if old behavior was buggy and fixed upstream, the fix is then added
      to U-Boot [5].
      In sandbox, all of these tests pass smoothly:
      => printenv board
      board=sandbox
      => ut hush
      Running 20 hush tests
      ...
      Failures: 0
      => cli set modern
      => ut hush
      Running 20 hush tests
      ...
      Failures: 0
      
      Thanks to the effort of Harald Seiler, I was successful booting a board:
      => printenv fdtfile
      fdtfile=amlogic/meson-gxl-s905x-libretech-cc.dtb
      => cli get
      old
      => boot
      ...
      root@lepotato:~#
      root@lepotato:~# reboot
      ...
      => cli set modern
      => cli get
      modern
      => printenv fdtfile
      fdtfile=amlogic/meson-gxl-s905x-libretech-cc.dtb
      => boot
      ...
      root@lepotato:~#
      
      This contribution indeed adds a lot of code and there were concern about its
      size [6, 7].
      With regard to the amount of code added, the cli_hush_upstream.c is 13030 lines
      long but it seems a smaller subset is really used:
      gcc -D__U_BOOT__ -E common/cli_hush_upstream.c | wc -l
      2870
      Despite this, it is better to still have the whole upstream code for the sake of
      easing maintenance.
      With regard to memory size, I conducted some experiments for version 8 of this
      series and for a subset of arm64 boards and found the worst case to be 4K [8].
      Tom Rini conducted more research on this and also found the increase to be
      acceptable [9].
      
      If you want to review it - your review will really be appreciated - here are
      some information regarding the commits:
      * commits marked as "test:" deal with unit tests.
      * commit "cli: Add Busybox upstream hush.c file." copies Busybox shell/hush.c
      into U-Boot tree, this explain why this commit contains around 12000 additions.
      * commit "cli: Port Busybox 2021 hush to U-Boot." modifies previously added file
      to permit us to use this as new shell.
      The really good idea of #include'ing Busybox code into a wrapper file to define
      some particular functions while minimizing modifications to upstream code comes
      from Harald Seiler.
      * commit "cmd: Add new parser command" adds a new command which permits
      selecting parser at runtime.
      I am not really satisfied with the fact it calls cli_init() and cli_loop() each
      time the parser is set, so your reviews would be welcomed.
      * Other commits focus on enabling features we need (e.g. if).
      2b28c3b8
    • Francis Laniel's avatar
      configs: Use old hush for several boards · 2a58783f
      Francis Laniel authored and Tom Rini's avatar Tom Rini committed
      The keymile board family is not compatible with modern hush parser.
      Indeed, This boards used set_local_var() to store some variables as local shell.
      They then used get_local_var() to retrieve the variables values.
      Sadly, this two functions do not exist with CONFIG_HUSH_MODERN_PARSER.
      A patch was proposed to use environment variables rather than local variables
      but it does not tackle the problem, so complementary work is needed to make
      this boards use CONFIG_HUSH_MODERN_PARSER.
      
      Also, with CONFIG_HUSH_MODERN_PARSER, kirkwoord sheevaplug and phytec bk4r1 hit
      their board limits, so better to stick with old hush.
      
      Cc: Holger Brunck <holger.brunck@hitachienergy.com>
      Link: https://marc.info/?l=u-boot&m=165541917618725&w=2
      
      
      Signed-off-by: default avatarFrancis Laniel <francis.laniel@amarulasolutions.com>
      2a58783f
    • Francis Laniel's avatar
      cmd: Set modern hush as default shell · 78912cfd
      Francis Laniel authored and Tom Rini's avatar Tom Rini committed
      
      Signed-off-by: default avatarFrancis Laniel <francis.laniel@amarulasolutions.com>
      78912cfd
    • Francis Laniel's avatar
      cli: modern_hush: Add upstream commits up to 2nd October 2023. · c24cb3eb
      Francis Laniel authored and Tom Rini's avatar Tom Rini committed
      
      This commit adds the following hush busybox upstream commits:
      791b222dd55d ("sleep: fix "sleep -- ARGS"")
      5353df91cba7 ("Update applet size estimates")
      e41e481fd571 ("hush: fix a compile failure")
      07a95cfcabb0 ("ash: disable check for "good" function name, bash does not check this")
      e5692e2342c6 ("hush: quote values in "readonly" output")
      96769486e20f ("shell: move varcmp() to shell_common.h and use it in hush")
      bab8828b0dad ("hush: fix expansion of space in "a=${a:+$a }c" construct")
      b5be8da350b5 ("hush: make "false" built-in")
      6824298ab4d3 ("hush: fix ELIF cmd1;cmd2 THEN ... not executing cmd2, closes 15571")
      3a7f00eadcf4 ("hush: add comment about abort on syntax error %{^}")
      acae889dd972 ("ash,hush: tab completion of functions and aliases")
      90b607d79a13 ("hush: quote variable values printed by "set" (match ash behavior)")
      6748e6494c22 ("hush (NOMMU): fix LINENO in execed children")
      fd5fb2d2b596 ("hush: speed up "big heredoc" code")
      1409432d072e ("hush: add TODO comment")
      93ae7464e6e4 ("hush: restore SIGHUP handling, this time explain why we do what we do")
      1fdb33bd07e5 ("hush: restore tty pgrp on SIGHUP")
      6101b6d3eaa0 ("hush: remove special handling of SIGHUP")
      93e0898c663a ("shell: fix SIGWINCH and SIGCHLD (in hush) interrupting line input, closes 15256")
      969e00816835 ("hush: code shrink")
      27be0e8cfeb6 ("shell: fix compile failures in some configs")
      7d1c7d833785 ("ash,hush: use HOME for tab completion and prompts")
      21afddefd258 ("hush: fix "error: invalid preprocessing directive ##"")
      e53c7dbafc78 ("hush: fix set -n to act immediately, not just after run_list()")
      574b9c446da1 ("hush: fix var_LINENO3.tests failure")
      49bcf9f40cff ("hush: speed up ${x//\*/|} too")
      53b2fdcdba4c ("*: add NOINLINEs where code noticeably shrinks")
      7c3e96d4b3d4 ("shell: use more compact SHELL_ASH / HUSH config defines. no code changes")
      62f1eed1e191 ("hush: in a comment, document what -i might be doing")
      aaf3d5ba74c5 ("shell: tweak --help")
      db5546ca1018 ("libbb: code shrink: introduce and use [_]exit_SUCCESS()")
      931c55f9e2b4 ("libbb: invert the meaning of SETUP_ENV_NO_CHDIR -> SETUP_ENV_CHDIR")
      12566e7f9b5e ("ash,hush: fix handling of SIGINT while waiting for interactive input")
      987be932ed3c ("*: slap on a few ALIGN_PTR where appropriate")
      
      Signed-off-by: default avatarFrancis Laniel <francis.laniel@amarulasolutions.com>
      c24cb3eb
    • Francis Laniel's avatar
      test: hush: Fix loop tests for modern hush · 2223c49c
      Francis Laniel authored and Tom Rini's avatar Tom Rini committed
      
      Modifies return code got from while loop as modern hush always returns 0 from
      while loop.
      
      Reviewed-by: Simon Glass's avatarSimon Glass <sjg@chromium.org>
      Signed-off-by: default avatarFrancis Laniel <francis.laniel@amarulasolutions.com>
      2223c49c
    • Francis Laniel's avatar
      cli: hush_modern: Enable loops · e252f50f
      Francis Laniel authored and Tom Rini's avatar Tom Rini committed
      
      Enables the use of for, while and until loops for command line as
      well as with run_command().
      
      Signed-off-by: default avatarFrancis Laniel <francis.laniel@amarulasolutions.com>
      Reviewed-by: Simon Glass's avatarSimon Glass <sjg@chromium.org>
      e252f50f
    • Francis Laniel's avatar
      cli: hush_modern: Enable if keyword · 374b77ed
      Francis Laniel authored and Tom Rini's avatar Tom Rini committed
      
      Adds support for "if then else" construct both for command line interface and
      through run_command().
      
      Signed-off-by: default avatarFrancis Laniel <francis.laniel@amarulasolutions.com>
      Reviewed-by: Simon Glass's avatarSimon Glass <sjg@chromium.org>
      374b77ed
    • Francis Laniel's avatar
      cli: hush_modern: Enable using < and > as string compare operators · d8b25630
      Francis Laniel authored and Tom Rini's avatar Tom Rini committed
      
      In Busybox hush, '<' and '>' are used as redirection operators.
      For example, cat foo > bar will write content of file foo inside file bar.
      In U-Boot, we do not have file system, so we can hardly redirect command output
      inside a file.
      
      But, in actual U-Boot hush, these operators ('<' and '>') are used as string
      compare operators.
      For example, test aaa < bbb returns 0 as aaa is before bbb in the dictionary.
      Busybox hush also permits this, but operators need to be escaped ('\<' and
      '\>').
      Indeed, if escaping is needed it permits the developer to think about its code,
      as in a lot of case, we want to compare integers (using '-lt' or '-gt') rather
      than strings.
      
      As testing in U-Boot is handled by the test command, we will stick with the
      original behaviour and not adapt to Busybox one.
      
      Nonetheless, if one day we decide to implement test with '[[ ]]', we will then
      stick to upstream Busybox behavior.
      
      Signed-off-by: default avatarFrancis Laniel <francis.laniel@amarulasolutions.com>
      Reviewed-by: Simon Glass's avatarSimon Glass <sjg@chromium.org>
      d8b25630
    • Francis Laniel's avatar
      test: hush: Fix variable expansion tests for modern hush · 410e78df
      Francis Laniel authored and Tom Rini's avatar Tom Rini committed
      
      Modifies the expected result for modern hush.
      Indeed, there were bugs in actual U-Boot hush which were fixed in upstream
      Busybox.
      As modern hush is based on upstream Busybox, these bugs no longer exist.
      
      Reviewed-by: Simon Glass's avatarSimon Glass <sjg@chromium.org>
      Signed-off-by: default avatarFrancis Laniel <francis.laniel@amarulasolutions.com>
      410e78df
    • Francis Laniel's avatar
      test: hush: Fix instructions list tests for modern hush · 6d3914f9
      Francis Laniel authored and Tom Rini's avatar Tom Rini committed
      
      Modifies the expected result for modern hush.
      Indeed, there were bugs in actual U-Boot hush which were fixed in upstream
      Busybox.
      As modern hush is based on upstream Busybox, these bugs no longer exist.
      
      Reviewed-by: Simon Glass's avatarSimon Glass <sjg@chromium.org>
      Signed-off-by: default avatarFrancis Laniel <francis.laniel@amarulasolutions.com>
      6d3914f9
    • Francis Laniel's avatar
      cli: add modern hush as parser for run_command*() · 3ea3c57e
      Francis Laniel authored and Tom Rini's avatar Tom Rini committed
      
      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's avatarSimon Glass <sjg@chromium.org>
      Signed-off-by: default avatarFrancis Laniel <francis.laniel@amarulasolutions.com>
      3ea3c57e
    • Francis Laniel's avatar
      cli: hush_modern: Add functions to be called from run_command() · 3b13faf9
      Francis Laniel authored and Tom Rini's avatar Tom Rini committed
      
      run_command() is called internally by the command run and it can also be called
      directly from U-Boot code, e.g. to do unit tests.
      This commit adds this path to go to modern hush.
      
      Signed-off-by: default avatarFrancis Laniel <francis.laniel@amarulasolutions.com>
      Reviewed-by: Simon Glass's avatarSimon Glass <sjg@chromium.org>
      3b13faf9
    • Francis Laniel's avatar
      cli: hush_modern: Enable variables expansion for modern hush · 74e42540
      Francis Laniel authored and Tom Rini's avatar Tom Rini committed
      
      Enables variables expansion for modern hush, both for local and environment
      variables.
      So the following commands:
      foo=bar
      echo $foo
      setenv bar foo
      echo $bar
      leads to "bar" and "foo" being printed on console output.
      
      Signed-off-by: default avatarFrancis Laniel <francis.laniel@amarulasolutions.com>
      Reviewed-by: Simon Glass's avatarSimon Glass <sjg@chromium.org>
      74e42540
    • Francis Laniel's avatar
      cli: Enables using modern hush parser as command line parser · 9a068377
      Francis Laniel authored and Tom Rini's avatar Tom Rini committed
      
      If one defines HUSH_MODERN_PARSER, it is then possible to use modern parser with:
      => cli get
      old
      => cli set modern
      => cli get
      modern
      
      Reviewed-by: Simon Glass's avatarSimon Glass <sjg@chromium.org>
      Signed-off-by: default avatarFrancis Laniel <francis.laniel@amarulasolutions.com>
      9a068377
    • Francis Laniel's avatar
      cmd: Add new cli command · 6bb39f5d
      Francis Laniel authored and Tom Rini's avatar Tom Rini committed
      
      This command can be used to print the current parser with 'cli get'.
      It can also be used to set the current parser with 'cli set'.
      For the moment, only one value is valid for set: old.
      
      Signed-off-by: default avatarFrancis Laniel <francis.laniel@amarulasolutions.com>
      6bb39f5d
    • Francis Laniel's avatar
      global_data.h: add GD_FLG_HUSH_OLD_PARSER flag · 603a814a
      Francis Laniel authored and Tom Rini's avatar Tom Rini committed
      
      This flag is used to indicate we are using the hush parser.
      
      Reviewed-by: Simon Glass's avatarSimon Glass <sjg@chromium.org>
      Signed-off-by: default avatarFrancis Laniel <francis.laniel@amarulasolutions.com>
      603a814a
Loading