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 | 	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; | ||||||
| 
 | 
 | ||||||
| 		entry->title = u16_strdup(u"U-Boot console"); | 		/* 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) { | 		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…
	
		Reference in New Issue