Am 26. Dezember 2020 20:15:40 MEZ schrieb "Pali Rohár" <p...@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" ><p...@kernel.org>: >> >On Saturday 26 December 2020 19:44:23 Heinrich Schuchardt wrote: >> >> Am 26. Dezember 2020 19:02:25 MEZ schrieb "Pali Rohár" >> ><p...@kernel.org>: >> >> >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 <p...@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; >> >> >+ return iter->key; >> >> > default: >> >> > break; >> >> > } >> >> >@@ -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); >> >> >>