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
					
				
							
								
								
									
										10
									
								
								cmd/Kconfig
								
								
								
								
							
							
						
						
									
										10
									
								
								cmd/Kconfig
								
								
								
								
							|  | @ -357,6 +357,16 @@ config CMD_BOOTMENU | |||
| 	help | ||||
| 	  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 | ||||
| 	bool "adtimg" | ||||
| 	help | ||||
|  |  | |||
|  | @ -27,6 +27,13 @@ | |||
|  */ | ||||
| #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 { | ||||
| 	BOOTMENU_TYPE_NONE = 0, | ||||
| 	BOOTMENU_TYPE_BOOTMENU, | ||||
|  | @ -489,7 +496,12 @@ static struct bootmenu_data *bootmenu_create(int delay) | |||
| 		if (!entry) | ||||
| 			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"); | ||||
| 		else | ||||
| 			entry->title = u16_strdup(u"Quit"); | ||||
| 
 | ||||
| 		if (!entry->title) { | ||||
| 			free(entry); | ||||
| 			goto cleanup; | ||||
|  | @ -585,15 +597,17 @@ static void handle_uefi_bootnext(void) | |||
| 		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; | ||||
| 	void *choice = NULL; | ||||
| 	u16 *title = NULL; | ||||
| 	char *command = NULL; | ||||
| 	struct menu *menu; | ||||
| 	struct bootmenu_data *bootmenu; | ||||
| 	struct bootmenu_entry *iter; | ||||
| 	int ret = BOOTMENU_RET_SUCCESS; | ||||
| 	struct bootmenu_data *bootmenu; | ||||
| 	efi_status_t efi_ret = EFI_SUCCESS; | ||||
| 	char *option, *sep; | ||||
| 
 | ||||
|  | @ -605,27 +619,27 @@ static void bootmenu_show(int delay) | |||
| 		option = bootmenu_getoption(0); | ||||
| 		if (!option) { | ||||
| 			puts("bootmenu option 0 was not found\n"); | ||||
| 			return; | ||||
| 			return BOOTMENU_RET_FAIL; | ||||
| 		} | ||||
| 		sep = strchr(option, '='); | ||||
| 		if (!sep) { | ||||
| 			puts("bootmenu option 0 is invalid\n"); | ||||
| 			return; | ||||
| 			return BOOTMENU_RET_FAIL; | ||||
| 		} | ||||
| 		run_command(sep+1, 0); | ||||
| 		return; | ||||
| 		cmd_ret = run_command(sep + 1, 0); | ||||
| 		return (cmd_ret == CMD_RET_SUCCESS ? BOOTMENU_RET_SUCCESS : BOOTMENU_RET_FAIL); | ||||
| 	} | ||||
| 
 | ||||
| 	bootmenu = bootmenu_create(delay); | ||||
| 	if (!bootmenu) | ||||
| 		return; | ||||
| 		return BOOTMENU_RET_FAIL; | ||||
| 
 | ||||
| 	menu = menu_create(NULL, bootmenu->delay, 1, menu_display_statusline, | ||||
| 			   bootmenu_print_entry, bootmenu_choice_entry, | ||||
| 			   bootmenu); | ||||
| 	if (!menu) { | ||||
| 		bootmenu_destroy(bootmenu); | ||||
| 		return; | ||||
| 		return BOOTMENU_RET_FAIL; | ||||
| 	} | ||||
| 
 | ||||
| 	for (iter = bootmenu->first; iter; iter = iter->next) { | ||||
|  | @ -646,6 +660,14 @@ static void bootmenu_show(int delay) | |||
| 		iter = choice; | ||||
| 		title = u16_strdup(iter->title); | ||||
| 		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); | ||||
| 		free(title); | ||||
| 		if (efi_ret == EFI_SUCCESS) | ||||
| 			run_command(command, 0); | ||||
| 			cmd_ret = run_command(command, 0); | ||||
| 		free(command); | ||||
| 	} | ||||
| 
 | ||||
| #ifdef CONFIG_POSTBOOTMENU | ||||
| 	run_command(CONFIG_POSTBOOTMENU, 0); | ||||
| #endif | ||||
| 
 | ||||
| 	if (efi_ret != EFI_SUCCESS || cmd_ret != CMD_RET_SUCCESS) | ||||
| 		ret = BOOTMENU_RET_FAIL; | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_AUTOBOOT_MENU_SHOW | ||||
| 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 */ | ||||
| } | ||||
| #endif | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue