
Am 26. Dezember 2020 20:15:40 MEZ schrieb "Pali Rohár" pali@kernel.org:
On Saturday 26 December 2020 20:10:10 Heinrich Schuchardt wrote:
Am 26. Dezember 2020 20:03:56 MEZ schrieb "Pali Rohár"
On Saturday 26 December 2020 19:44:23 Heinrich Schuchardt wrote:
Am 26. Dezember 2020 19:02:25 MEZ schrieb "Pali Rohár"
When CTRL+C is pressed interrupt bootmenu and jump into U-Boot
console.
As the last entry in bootmenu is always U-Boot console just
choose
the
last entry when CTRL+C is pressed.
It is useful when bootmenu is part of boot process and you want
to
interrupt boot process by scripts which control U-Boot (serial) console.
Wouldn't the escape key be a better choice?
I can add also escape key. But has escape key stable ANSI sequence which is needed to catch? If you tell me which bytes to catch (for escape key) I will add it.
0x1b is Escape
Does not work. 0x1b is not escape key. It is start of the ANSI escape sequence which matches also existing keys up and down.
On the serial console you have to hit the key twice.
The device driver will tranlate it to a single 0x1b which is the char you want to react to.
On the sandbox CTRL-C makes you quit U-Boot.
When hitting CTRL-C late on other systems it might interrupt a
follow-up command.
I understand your concerns. But all other commands catch also CTRL+C
so
I think that bootmenu command should it too.
--
The following is not directly related to your patch:
Is it really a good design that a user cannot be stopped from
reaching the console?
Currently "U-Boot console" option is always added to menu list. But option is doing only one thing: exiting the current U-Boot command
and
returning back to the monitor mode.
I could think of use cases in the context of secure booting where
you
want to show a menu but you do not want to give access to the
command
line.
If bootmenu is not started from monitor mode then this "U-Boot
console"
command just enter into monitor mode. And I think that you can
already
block monitor mode and therefore has ability of this secure boot scheme.
Best regards
Heinrich
Signed-off-by: Pali Rohár pali@kernel.org
cmd/bootmenu.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/cmd/bootmenu.c b/cmd/bootmenu.c index 1ba7b622e5..9b56bfaa9a 100644 --- a/cmd/bootmenu.c +++ b/cmd/bootmenu.c @@ -45,6 +45,7 @@ enum bootmenu_key { KEY_UP, KEY_DOWN, KEY_SELECT,
- KEY_QUIT,
};
static char *bootmenu_getoption(unsigned short int n) @@ -109,6 +110,9 @@ static void bootmenu_autoboot_loop(struct bootmenu_data *menu, case '\r': *key = KEY_SELECT; break;
case 0x3: /* ^C */
*key = KEY_QUIT;
break; default: *key = KEY_NONE; break;
@@ -187,6 +191,10 @@ static void bootmenu_loop(struct
bootmenu_data
*menu, /* enter key was pressed */ if (c == '\r') *key = KEY_SELECT;
- /* ^C was pressed */
- if (c == 0x3)
*key = KEY_QUIT;
}
static char *bootmenu_choice_entry(void *data) @@ -222,6 +230,12 @@ static char *bootmenu_choice_entry(void
*data)
for (i = 0; i < menu->active; ++i) iter = iter->next; return iter->key;
case KEY_QUIT:
/* Quit by choosing the last entry - U-Boot console */
iter = menu->first;
while (iter->next)
iter = iter->next;
default: break; }return iter->key;
@@ -389,7 +403,7 @@ static void menu_display_statusline(struct
menu
*m)
printf(ANSI_CURSOR_POSITION, menu->count + 5, 1); puts(ANSI_CLEAR_LINE); printf(ANSI_CURSOR_POSITION, menu->count + 6, 1);
- puts(" Press UP/DOWN to move, ENTER to select");
- puts(" Press UP/DOWN to move, ENTER to select, CTRL+C to
quit");
puts(ANSI_CLEAR_LINE_TO_END); printf(ANSI_CURSOR_POSITION, menu->count + 7, 1); puts(ANSI_CLEAR_LINE);