From 39b2b573fc8ac948ff4565c194c6bda8599e73d8 Mon Sep 17 00:00:00 2001 From: MikeBeaton Date: Sun, 5 Sep 2021 12:09:39 +0100 Subject: [PATCH] OpenLinuxBoot: Add scan of /boot/loader/entries for when /boot is not separate volume --- Platform/OpenLinuxBoot/Autodetect.c | 21 +++++++++- Platform/OpenLinuxBoot/LoaderEntry.c | 55 ++++++++++++++++++++++++-- Platform/OpenLinuxBoot/OpenLinuxBoot.c | 8 ---- 3 files changed, 71 insertions(+), 13 deletions(-) diff --git a/Platform/OpenLinuxBoot/Autodetect.c b/Platform/OpenLinuxBoot/Autodetect.c index b9a78ad0..d34af002 100644 --- a/Platform/OpenLinuxBoot/Autodetect.c +++ b/Platform/OpenLinuxBoot/Autodetect.c @@ -600,8 +600,9 @@ GenerateEntriesForVmlinuzFiles ( return EFI_SUCCESS; } +STATIC EFI_STATUS -AutodetectLinux ( +InternalAutodetectLinux ( IN EFI_FILE_PROTOCOL *RootDirectory, OUT OC_PICKER_ENTRY **Entries, OUT UINTN *NumEntries @@ -691,3 +692,21 @@ AutodetectLinux ( VmlinuzDirectory->Close (VmlinuzDirectory); return Status; } + +EFI_STATUS +AutodetectLinux ( + IN EFI_FILE_PROTOCOL *RootDirectory, + OUT OC_PICKER_ENTRY **Entries, + OUT UINTN *NumEntries + ) +{ + EFI_STATUS Status; + + Status = InternalAutodetectLinux (RootDirectory, Entries, NumEntries); + + if (EFI_ERROR (Status) && Status != EFI_NOT_FOUND) { + DEBUG ((DEBUG_WARN, "LNX: AutodetectLinux - %r\n", Status)); + } + + return Status; +} diff --git a/Platform/OpenLinuxBoot/LoaderEntry.c b/Platform/OpenLinuxBoot/LoaderEntry.c index bd764514..1db1cd58 100644 --- a/Platform/OpenLinuxBoot/LoaderEntry.c +++ b/Platform/OpenLinuxBoot/LoaderEntry.c @@ -22,9 +22,20 @@ #include -#define LOADER_ENTRIES_DIR L"\\loader\\entries" -#define GRUB2_GRUB_CFG L"\\grub2\\grub.cfg" -#define GRUB2_GRUBENV L"\\grub2\\grubenv" +// +// Required where the BTRFS subvolume is /boot, as this looks like a +// normal directory within EFI. Note that scanning / and then /boot +// is how blscfg behaves by default too. +// +#define ADDITIONAL_SCAN_DIR L"boot" + +// +// No leading slash so they can be relative to root or +// additional scan dir. +// +#define LOADER_ENTRIES_DIR L"loader\\entries" +#define GRUB2_GRUB_CFG L"grub2\\grub.cfg" +#define GRUB2_GRUBENV L"grub2\\grubenv" #define GRUB2_GRUBENV_SIZE SIZE_1KB #define BLSPEC_SUFFIX_CONF L".conf" @@ -664,8 +675,9 @@ ProcessLoaderEntry ( return EFI_SUCCESS; } +STATIC EFI_STATUS -ScanLoaderEntries ( +InternalScanLoaderEntries ( IN EFI_FILE_PROTOCOL *RootDirectory, OUT OC_PICKER_ENTRY **Entries, OUT UINTN *NumEntries @@ -767,6 +779,41 @@ ScanLoaderEntries ( return Status; } +EFI_STATUS +ScanLoaderEntries ( + IN EFI_FILE_PROTOCOL *RootDirectory, + OUT OC_PICKER_ENTRY **Entries, + OUT UINTN *NumEntries + ) +{ + EFI_STATUS Status; + EFI_STATUS TempStatus; + EFI_FILE_PROTOCOL *AdditionalScanDirectory; + + Status = InternalScanLoaderEntries (RootDirectory, Entries, NumEntries); + if (!EFI_ERROR (Status)) { + return Status; + } + if (Status != EFI_NOT_FOUND) { + DEBUG ((DEBUG_WARN, "LNX: ScanLoaderEntries @root - %r\n", Status)); + } + + TempStatus = OcSafeFileOpen (RootDirectory, &AdditionalScanDirectory, ADDITIONAL_SCAN_DIR, EFI_FILE_MODE_READ, 0); + if (EFI_ERROR (TempStatus)) { + return Status; + } + + Status = InternalScanLoaderEntries (AdditionalScanDirectory, Entries, NumEntries); + if (!EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "LNX: ScanLoaderEntries @%s - %r\n", ADDITIONAL_SCAN_DIR, Status)); + return Status; + } + if (Status != EFI_NOT_FOUND) { + DEBUG ((DEBUG_WARN, "LNX: ScanLoaderEntries @%s - %r\n", ADDITIONAL_SCAN_DIR, Status)); + } + return Status; +} + VOID InternalFreeNamedLoaderEntry ( NAMED_LOADER_ENTRY *Entry diff --git a/Platform/OpenLinuxBoot/OpenLinuxBoot.c b/Platform/OpenLinuxBoot/OpenLinuxBoot.c index 098eb267..bea73914 100644 --- a/Platform/OpenLinuxBoot/OpenLinuxBoot.c +++ b/Platform/OpenLinuxBoot/OpenLinuxBoot.c @@ -238,10 +238,6 @@ OcGetLinuxBootEntries ( // are only unusable files in there. // if (EFI_ERROR (Status)) { - if (Status != EFI_NOT_FOUND) { - DEBUG ((DEBUG_WARN, "LNX: ScanLoaderEntries - %r\n", Status)); - } - // // Auto-detect vmlinuz and initrd files on own root filesystem (Debian-like). // @@ -251,10 +247,6 @@ OcGetLinuxBootEntries ( Entries, NumEntries ); - - if (EFI_ERROR (Status) && Status != EFI_NOT_FOUND) { - DEBUG ((DEBUG_WARN, "LNX: AutodetectLinux - %r\n", Status)); - } } } -- GitLab