]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
systemd-boot: Make automatic entries configurable
authorJan Janssen <medhefgo@web.de>
Sun, 28 Jan 2018 16:06:22 +0000 (17:06 +0100)
committerJan Janssen <medhefgo@web.de>
Sun, 28 Jan 2018 16:20:41 +0000 (17:20 +0100)
Hiding automatic entries allows for giving custom entry names like
"Windows 10" instead of "Windows Boot Manager" by creating an appropriate
loader file in the loader/entries folder.
Note that it is already doable by renaming bootmgfw.efi (or the other auto-detected
boot loaders) and then using the renamed file for a custom entry. But windows will
automatically recreate the boot loader on updates, including the default EFI
bootloader entry if that one is missing.

Make hiding EFI reboot a separate option because there is no simple way to create
it with a custom loader entry and people may still want that around while still
hiding the other auto entries.

Also, turn no_editor into a positive boolean name while we're touching this code.

src/boot/efi/boot.c
src/shared/bootspec.c
src/shared/bootspec.h

index 9d5ea6ed93e14cb3869dd2f95e5defe45d2f4a01..e0438281e1a9746bbf186d7008dc310ab8fa3909 100644 (file)
@@ -68,7 +68,9 @@ typedef struct {
         CHAR16 *entry_default_pattern;
         CHAR16 *entry_oneshot;
         CHAR16 *options_edit;
-        BOOLEAN no_editor;
+        BOOLEAN editor;
+        BOOLEAN auto_entries;
+        BOOLEAN auto_firmware;
 } Config;
 
 static VOID cursor_left(UINTN *cursor, UINTN *first) {
@@ -392,7 +394,9 @@ static VOID print_status(Config *config, CHAR16 *loaded_image_path) {
                 Print(L"OsIndicationsSupported: %d\n", (UINT64)*b);
                 FreePool(b);
         }
-        Print(L"\n");
+
+        Print(L"\n--- press key ---\n\n");
+        console_key_read(&key, TRUE);
 
         Print(L"timeout:                %d\n", config->timeout_sec);
         if (config->timeout_sec_efivar >= 0)
@@ -400,7 +404,9 @@ static VOID print_status(Config *config, CHAR16 *loaded_image_path) {
         Print(L"timeout (config):       %d\n", config->timeout_sec_config);
         if (config->entry_default_pattern)
                 Print(L"default pattern:        '%s'\n", config->entry_default_pattern);
-        Print(L"editor:                 %s\n", yes_no(!config->no_editor));
+        Print(L"editor:                 %s\n", yes_no(config->editor));
+        Print(L"auto-entries:           %s\n", yes_no(config->auto_entries));
+        Print(L"auto-firmware:          %s\n", yes_no(config->auto_firmware));
         Print(L"\n");
 
         Print(L"config entry count:     %d\n", config->entry_count);
@@ -774,7 +780,7 @@ static BOOLEAN menu_run(Config *config, ConfigEntry **chosen_entry, CHAR16 *load
 
                 case KEYPRESS(0, 0, 'e'):
                         /* only the options of configured entries can be edited */
-                        if (config->no_editor || config->entries[idx_highlight]->type == LOADER_UNDEFINED)
+                        if (!config->editor || config->entries[idx_highlight]->type == LOADER_UNDEFINED)
                                 break;
                         uefi_call_wrapper(ST->ConOut->SetAttribute, 2, ST->ConOut, EFI_LIGHTGRAY|EFI_BACKGROUND_BLACK);
                         uefi_call_wrapper(ST->ConOut->SetCursorPosition, 3, ST->ConOut, 0, y_max-1);
@@ -1006,7 +1012,23 @@ static VOID config_defaults_load_from_file(Config *config, CHAR8 *content) {
 
                         if (EFI_ERROR(parse_boolean(value, &on)))
                                 continue;
-                        config->no_editor = !on;
+                        config->editor = on;
+                }
+
+                if (strcmpa((CHAR8 *)"auto-entries", key) == 0) {
+                        BOOLEAN on;
+
+                        if (EFI_ERROR(parse_boolean(value, &on)))
+                                continue;
+                        config->auto_entries = on;
+                }
+
+                if (strcmpa((CHAR8 *)"auto-firmware", key) == 0) {
+                        BOOLEAN on;
+
+                        if (EFI_ERROR(parse_boolean(value, &on)))
+                                continue;
+                        config->auto_firmware = on;
                 }
         }
 }
@@ -1144,6 +1166,10 @@ static VOID config_load_defaults(Config *config, EFI_FILE *root_dir) {
         UINTN sec;
         EFI_STATUS err;
 
+        config->editor = TRUE;
+        config->auto_entries = TRUE;
+        config->auto_firmware = TRUE;
+
         err = file_read(root_dir, L"\\loader\\loader.conf", 0, 0, &content, NULL);
         if (!EFI_ERROR(err))
                 config_defaults_load_from_file(config, content);
@@ -1428,6 +1454,9 @@ static BOOLEAN config_entry_add_loader_auto(Config *config, EFI_HANDLE *device,
         ConfigEntry *entry;
         EFI_STATUS err;
 
+        if (!config->auto_entries)
+                return FALSE;
+
         /* do not add an entry for ourselves */
         if (loaded_image_path && StriCmp(loader, loaded_image_path) == 0)
                 return FALSE;
@@ -1453,6 +1482,9 @@ static VOID config_entry_add_osx(Config *config) {
         UINTN handle_count = 0;
         EFI_HANDLE *handles = NULL;
 
+        if (!config->auto_entries)
+                return;
+
         err = LibLocateHandle(ByProtocol, &FileSystemProtocol, NULL, &handle_count, &handles);
         if (!EFI_ERROR(err)) {
                 UINTN i;
@@ -1761,7 +1793,7 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
                                      L"auto-efi-default", '\0', L"EFI Default Loader", L"\\EFI\\Boot\\boot" EFI_MACHINE_TYPE_NAME ".efi");
         config_entry_add_osx(&config);
 
-        if (efivar_get_raw(&global_guid, L"OsIndicationsSupported", &b, &size) == EFI_SUCCESS) {
+        if (config.auto_firmware && efivar_get_raw(&global_guid, L"OsIndicationsSupported", &b, &size) == EFI_SUCCESS) {
                 UINT64 osind = (UINT64)*b;
 
                 if (osind & EFI_OS_INDICATIONS_BOOT_TO_FW_UI)
index 9c3bdd47de45b8013ce38eb6aebdf4adf2d6df64..8f3faeecb3972f105eaf06f41106a6cf2eaf66a6 100644 (file)
@@ -142,6 +142,8 @@ void boot_config_free(BootConfig *config) {
         free(config->default_pattern);
         free(config->timeout);
         free(config->editor);
+        free(config->auto_entries);
+        free(config->auto_firmware);
 
         free(config->entry_oneshot);
         free(config->entry_default);
@@ -194,6 +196,10 @@ int boot_loader_read_conf(const char *path, BootConfig *config) {
                         r = free_and_strdup(&config->timeout, p);
                 else if (streq(buf, "editor"))
                         r = free_and_strdup(&config->editor, p);
+                else if (streq(buf, "auto-entries"))
+                        r = free_and_strdup(&config->auto_entries, p);
+                else if (streq(buf, "auto-firmware"))
+                        r = free_and_strdup(&config->auto_firmware, p);
                 else {
                         log_notice("%s:%u: Unknown line \"%s\"", path, line, buf);
                         continue;
index d9c641bf081bb740e30d6ccbd91e66331bf5fb32..fe875454b1db7baa3f1d36b12c43aedd3694cf0d 100644 (file)
@@ -40,6 +40,8 @@ typedef struct BootConfig {
         char *default_pattern;
         char *timeout;
         char *editor;
+        char *auto_entries;
+        char *auto_firmware;
 
         char *entry_oneshot;
         char *entry_default;