diff options
| author | Peter Jones <pjones@redhat.com> | 2016-04-12 13:41:45 -0400 |
|---|---|---|
| committer | Peter Jones <pjones@redhat.com> | 2016-09-06 14:39:15 -0400 |
| commit | 47f3a65eda2f864ea3a60aeb127cfec7bff64389 (patch) | |
| tree | e66ec38dd0e9ffac556213cc7c41cd086da98cdf | |
| parent | 6cbcfb727e1d42127e782e57f8b79268b9b2cff8 (diff) | |
| download | efi-boot-shim-47f3a65eda2f864ea3a60aeb127cfec7bff64389.tar.gz efi-boot-shim-47f3a65eda2f864ea3a60aeb127cfec7bff64389.zip | |
Improve BOOT${ARCH}.CSV support.
Signed-off-by: Peter Jones <pjones@redhat.com>
| -rw-r--r-- | README.fallback | 5 | ||||
| -rw-r--r-- | fallback.c | 49 |
2 files changed, 36 insertions, 18 deletions
diff --git a/README.fallback b/README.fallback index af2a354a..3f91c1ac 100644 --- a/README.fallback +++ b/README.fallback @@ -41,8 +41,9 @@ media. In that case, it'll invoke \EFI\BOOT\BOOTX64.EFI (or whatever filename is right for your architecture.) In that case it'll be in \EFI\BOOT, so it'll check for fallback.efi , and it'll find it and run it. When it runs, fallback will look for every directory in \EFI\ with -a BOOT.CSV in it, and it'll parse that, and create new boot variables -from what it finds. Then it'll try to boot one of them. +a BOOT${ARCH}.CSV in it, or BOOT.CSV if that's not found. It'll parse that, +and create new boot variables from what it finds. Then it'll try to boot one +of them. BOOT.CSV is a UCS-2 LE formatted CSV file. So it has the LE byte order marker, and after that it's just a series of lines, each having @@ -579,6 +579,8 @@ find_boot_csv(EFI_FILE_HANDLE fh, CHAR16 *dirname) FreePool(buffer); buffer = NULL; + CHAR16 *bootcsv=NULL, *bootarchcsv=NULL; + bs = 0; do { bs = 0; @@ -608,28 +610,43 @@ find_boot_csv(EFI_FILE_HANDLE fh, CHAR16 *dirname) fi = buffer; - if (!StrCaseCmp(fi->FileName, L"boot.csv") - || !StrCaseCmp(fi->FileName, L"boot" EFI_ARCH L".csv")) { - EFI_FILE_HANDLE fh2; - rc = uefi_call_wrapper(fh->Open, 5, fh, &fh2, - fi->FileName, - EFI_FILE_READ_ONLY, 0); - if (EFI_ERROR(rc) || fh2 == NULL) { - Print(L"Couldn't open \\EFI\\%s\\%s: %d\n", - dirname, fi->FileName, rc); - FreePool(buffer); - buffer = NULL; - continue; - } - rc = try_boot_csv(fh2, dirname, fi->FileName); - uefi_call_wrapper(fh2->Close, 1, fh2); - } + if (!bootcsv && !StrCaseCmp(fi->FileName, L"boot.csv")) + bootcsv = StrDuplicate(fi->FileName); + + if (!bootarchcsv && + !StrCaseCmp(fi->FileName, L"boot" EFI_ARCH L".csv")) + bootarchcsv = StrDuplicate(fi->FileName); FreePool(buffer); buffer = NULL; } while (bs != 0); rc = EFI_SUCCESS; + if (bootarchcsv) { + EFI_FILE_HANDLE fh2; + rc = uefi_call_wrapper(fh->Open, 5, fh, &fh2, + bootarchcsv, EFI_FILE_READ_ONLY, 0); + if (EFI_ERROR(rc) || fh2 == NULL) { + Print(L"Couldn't open \\EFI\\%s\\%s: %d\n", + dirname, bootarchcsv, rc); + } else { + rc = try_boot_csv(fh2, dirname, bootarchcsv); + uefi_call_wrapper(fh2->Close, 1, fh2); + } + } + if ((EFI_ERROR(rc) || !bootarchcsv) && bootcsv) { + EFI_FILE_HANDLE fh2; + rc = uefi_call_wrapper(fh->Open, 5, fh, &fh2, + bootcsv, EFI_FILE_READ_ONLY, 0); + if (EFI_ERROR(rc) || fh2 == NULL) { + Print(L"Couldn't open \\EFI\\%s\\%s: %d\n", + dirname, bootcsv, rc); + } else { + rc = try_boot_csv(fh2, dirname, bootcsv); + uefi_call_wrapper(fh2->Close, 1, fh2); + } + } + rc = EFI_SUCCESS; return rc; } |
