mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-22 12:54:37 +00:00
bootmenu: add Kconfig option not to enter U-Boot console
This commit adds the Kconfig option to disable to enter the U-Boot console from bootmenu. If CMD_BOOTMENU_ENTER_UBOOT_CONSOLE is enabled, "U-Boot console" entry is appeared as the last entry in the bootmenu, then user can enter U-Boot console. If CMD_BOOTMENU_ENTER_UBOOT_CONSOLE is disabled, "Quit" entry is appeared as the last entry instead of "U-Boot console". When user chooses "Quit" from bootmenu, the following default commands are invoked. - "bootefi bootmgr" (if efi bootmgr is enabled) - "run bootcmd" If the both commands are executed and returns to the bootmenu, the bootmenu will appears again. Signed-off-by: Masahisa Kojima <masahisa.kojima@linaro.org>
This commit is contained in:
parent
c606c0059f
commit
2158b0da22
2 changed files with 68 additions and 11 deletions
10
cmd/Kconfig
10
cmd/Kconfig
|
@ -357,6 +357,16 @@ config CMD_BOOTMENU
|
||||||
help
|
help
|
||||||
Add an ANSI terminal boot menu command.
|
Add an ANSI terminal boot menu command.
|
||||||
|
|
||||||
|
config CMD_BOOTMENU_ENTER_UBOOT_CONSOLE
|
||||||
|
bool "Allow Bootmenu to enter the U-Boot console"
|
||||||
|
depends on CMD_BOOTMENU
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
Add an entry to enter U-Boot console in bootmenu.
|
||||||
|
If this option is disabled, user can not enter
|
||||||
|
the U-Boot console from bootmenu. It increases
|
||||||
|
the system security.
|
||||||
|
|
||||||
config CMD_ADTIMG
|
config CMD_ADTIMG
|
||||||
bool "adtimg"
|
bool "adtimg"
|
||||||
help
|
help
|
||||||
|
|
|
@ -27,6 +27,13 @@
|
||||||
*/
|
*/
|
||||||
#define MAX_ENV_SIZE (9 + 2 + 1)
|
#define MAX_ENV_SIZE (9 + 2 + 1)
|
||||||
|
|
||||||
|
enum bootmenu_ret {
|
||||||
|
BOOTMENU_RET_SUCCESS = 0,
|
||||||
|
BOOTMENU_RET_FAIL,
|
||||||
|
BOOTMENU_RET_QUIT,
|
||||||
|
BOOTMENU_RET_UPDATED,
|
||||||
|
};
|
||||||
|
|
||||||
enum boot_type {
|
enum boot_type {
|
||||||
BOOTMENU_TYPE_NONE = 0,
|
BOOTMENU_TYPE_NONE = 0,
|
||||||
BOOTMENU_TYPE_BOOTMENU,
|
BOOTMENU_TYPE_BOOTMENU,
|
||||||
|
@ -489,7 +496,12 @@ static struct bootmenu_data *bootmenu_create(int delay)
|
||||||
if (!entry)
|
if (!entry)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
/* Add Quit entry if entering U-Boot console is disabled */
|
||||||
|
if (IS_ENABLED(CONFIG_CMD_BOOTMENU_ENTER_UBOOT_CONSOLE))
|
||||||
entry->title = u16_strdup(u"U-Boot console");
|
entry->title = u16_strdup(u"U-Boot console");
|
||||||
|
else
|
||||||
|
entry->title = u16_strdup(u"Quit");
|
||||||
|
|
||||||
if (!entry->title) {
|
if (!entry->title) {
|
||||||
free(entry);
|
free(entry);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
@ -585,15 +597,17 @@ static void handle_uefi_bootnext(void)
|
||||||
run_command("bootefi bootmgr", 0);
|
run_command("bootefi bootmgr", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bootmenu_show(int delay)
|
static enum bootmenu_ret bootmenu_show(int delay)
|
||||||
{
|
{
|
||||||
|
int cmd_ret;
|
||||||
int init = 0;
|
int init = 0;
|
||||||
void *choice = NULL;
|
void *choice = NULL;
|
||||||
u16 *title = NULL;
|
u16 *title = NULL;
|
||||||
char *command = NULL;
|
char *command = NULL;
|
||||||
struct menu *menu;
|
struct menu *menu;
|
||||||
struct bootmenu_data *bootmenu;
|
|
||||||
struct bootmenu_entry *iter;
|
struct bootmenu_entry *iter;
|
||||||
|
int ret = BOOTMENU_RET_SUCCESS;
|
||||||
|
struct bootmenu_data *bootmenu;
|
||||||
efi_status_t efi_ret = EFI_SUCCESS;
|
efi_status_t efi_ret = EFI_SUCCESS;
|
||||||
char *option, *sep;
|
char *option, *sep;
|
||||||
|
|
||||||
|
@ -605,27 +619,27 @@ static void bootmenu_show(int delay)
|
||||||
option = bootmenu_getoption(0);
|
option = bootmenu_getoption(0);
|
||||||
if (!option) {
|
if (!option) {
|
||||||
puts("bootmenu option 0 was not found\n");
|
puts("bootmenu option 0 was not found\n");
|
||||||
return;
|
return BOOTMENU_RET_FAIL;
|
||||||
}
|
}
|
||||||
sep = strchr(option, '=');
|
sep = strchr(option, '=');
|
||||||
if (!sep) {
|
if (!sep) {
|
||||||
puts("bootmenu option 0 is invalid\n");
|
puts("bootmenu option 0 is invalid\n");
|
||||||
return;
|
return BOOTMENU_RET_FAIL;
|
||||||
}
|
}
|
||||||
run_command(sep+1, 0);
|
cmd_ret = run_command(sep + 1, 0);
|
||||||
return;
|
return (cmd_ret == CMD_RET_SUCCESS ? BOOTMENU_RET_SUCCESS : BOOTMENU_RET_FAIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
bootmenu = bootmenu_create(delay);
|
bootmenu = bootmenu_create(delay);
|
||||||
if (!bootmenu)
|
if (!bootmenu)
|
||||||
return;
|
return BOOTMENU_RET_FAIL;
|
||||||
|
|
||||||
menu = menu_create(NULL, bootmenu->delay, 1, menu_display_statusline,
|
menu = menu_create(NULL, bootmenu->delay, 1, menu_display_statusline,
|
||||||
bootmenu_print_entry, bootmenu_choice_entry,
|
bootmenu_print_entry, bootmenu_choice_entry,
|
||||||
bootmenu);
|
bootmenu);
|
||||||
if (!menu) {
|
if (!menu) {
|
||||||
bootmenu_destroy(bootmenu);
|
bootmenu_destroy(bootmenu);
|
||||||
return;
|
return BOOTMENU_RET_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (iter = bootmenu->first; iter; iter = iter->next) {
|
for (iter = bootmenu->first; iter; iter = iter->next) {
|
||||||
|
@ -646,6 +660,14 @@ static void bootmenu_show(int delay)
|
||||||
iter = choice;
|
iter = choice;
|
||||||
title = u16_strdup(iter->title);
|
title = u16_strdup(iter->title);
|
||||||
command = strdup(iter->command);
|
command = strdup(iter->command);
|
||||||
|
|
||||||
|
/* last entry is U-Boot console or Quit */
|
||||||
|
if (iter->num == iter->menu->count - 1) {
|
||||||
|
ret = BOOTMENU_RET_QUIT;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -683,19 +705,44 @@ cleanup:
|
||||||
debug("Starting entry '%ls'\n", title);
|
debug("Starting entry '%ls'\n", title);
|
||||||
free(title);
|
free(title);
|
||||||
if (efi_ret == EFI_SUCCESS)
|
if (efi_ret == EFI_SUCCESS)
|
||||||
run_command(command, 0);
|
cmd_ret = run_command(command, 0);
|
||||||
free(command);
|
free(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_POSTBOOTMENU
|
#ifdef CONFIG_POSTBOOTMENU
|
||||||
run_command(CONFIG_POSTBOOTMENU, 0);
|
run_command(CONFIG_POSTBOOTMENU, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (efi_ret != EFI_SUCCESS || cmd_ret != CMD_RET_SUCCESS)
|
||||||
|
ret = BOOTMENU_RET_FAIL;
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_AUTOBOOT_MENU_SHOW
|
#ifdef CONFIG_AUTOBOOT_MENU_SHOW
|
||||||
int menu_show(int bootdelay)
|
int menu_show(int bootdelay)
|
||||||
{
|
{
|
||||||
bootmenu_show(bootdelay);
|
int ret;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
ret = bootmenu_show(bootdelay);
|
||||||
|
bootdelay = -1;
|
||||||
|
if (ret == BOOTMENU_RET_UPDATED)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!IS_ENABLED(CONFIG_CMD_BOOTMENU_ENTER_UBOOT_CONSOLE)) {
|
||||||
|
if (ret == BOOTMENU_RET_QUIT) {
|
||||||
|
/* default boot process */
|
||||||
|
if (IS_ENABLED(CONFIG_CMD_BOOTEFI_BOOTMGR))
|
||||||
|
run_command("bootefi bootmgr", 0);
|
||||||
|
|
||||||
|
run_command("run bootcmd", 0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return -1; /* -1 - abort boot and run monitor code */
|
return -1; /* -1 - abort boot and run monitor code */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue