grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] util/grub-mkrescue: use capitalised paths for removable EFI imag


From: Mingcong Bai
Subject: [PATCH] util/grub-mkrescue: use capitalised paths for removable EFI images
Date: Wed, 12 Jun 2024 00:24:35 +0800

Per UEFI Specification, section 3.4.1.1:

... If FilePathList[0] points to a device that supports the
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL, then the system firmware will attempt to boot from a removable media FilePathList[0] by adding a default file name in the
form \EFI\BOOT\BOOT{machine type short-name}.EFI.

While FAT < 32 filesystems are not case sensitive (which grub-mkrescue creates
as a FAT12 image via mformat with a size of 2.88MiB), it seems that
some of Loongson's LoongArch-based firmware (namely those found on their
latest XA61200 boards) seems to treat this file system as case-sensitive. In
this case, at least the XA61200 board seems incapable of identifying
/efi/boot/bootloongarch64.efi as a valid removable EFI image.

In any case, according to the UEFI Specification, all paths and image
filenames should be capitalised (with the exception of BOOTx64.EFI, according to section 3.5.1.1, for some reason) to stay compliant. The Loongson case is only one example of users running into buggy firmware and unbootable GRUB
ISO images.

Signed-off-by: Mingcong Bai <jeffbai@aosc.io>
---
 util/grub-mkrescue.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/util/grub-mkrescue.c b/util/grub-mkrescue.c
index 27696e034..963b47117 100644
--- a/util/grub-mkrescue.c
+++ b/util/grub-mkrescue.c
@@ -769,8 +769,8 @@ main (int argc, char *argv[])
       || source_dirs[GRUB_INSTALL_PLATFORM_RISCV64_EFI])
     {
       FILE *f;
-      char *efidir_efi = grub_util_path_concat (2, iso9660_dir, "efi");
- char *efidir_efi_boot = grub_util_path_concat (3, iso9660_dir, "efi", "boot");
+      char *efidir_efi = grub_util_path_concat (2, iso9660_dir, "EFI");
+ char *efidir_efi_boot = grub_util_path_concat (3, iso9660_dir, "EFI", "BOOT");
       char *imgname, *img32, *img64, *img_mac = NULL;
       char *efiimgfat, *iso_uuid_file, *diskdir, *diskdir_uuid;
       grub_install_mkdir_p (efidir_efi_boot);
@@ -792,52 +792,52 @@ main (int argc, char *argv[])
       free (diskdir_uuid);
       free (diskdir);

- imgname = grub_util_path_concat (2, efidir_efi_boot, "bootia64.efi"); + imgname = grub_util_path_concat (2, efidir_efi_boot, "BOOTIA64.EFI"); make_image_fwdisk_abs (GRUB_INSTALL_PLATFORM_IA64_EFI, "ia64-efi", imgname);
       free (imgname);

       grub_install_push_module ("part_apple");
- img64 = grub_util_path_concat (2, efidir_efi_boot, "bootx64.efi"); + img64 = grub_util_path_concat (2, efidir_efi_boot, "BOOTx64.EFI"); make_image_abs (GRUB_INSTALL_PLATFORM_X86_64_EFI, "x86_64-efi", img64);
       grub_install_pop_module ();

       grub_install_push_module ("part_apple");
- img32 = grub_util_path_concat (2, efidir_efi_boot, "bootia32.efi"); + img32 = grub_util_path_concat (2, efidir_efi_boot, "BOOTIA32.EFI"); make_image_abs (GRUB_INSTALL_PLATFORM_I386_EFI, "i386-efi", img32);
       grub_install_pop_module ();

- imgname = grub_util_path_concat (2, efidir_efi_boot, "bootarm.efi"); + imgname = grub_util_path_concat (2, efidir_efi_boot, "BOOTARM.EFI"); make_image_abs (GRUB_INSTALL_PLATFORM_ARM_EFI, "arm-efi", imgname);
       free (imgname);

- imgname = grub_util_path_concat (2, efidir_efi_boot, "bootaa64.efi"); + imgname = grub_util_path_concat (2, efidir_efi_boot, "BOOTAA64.EFI"); make_image_abs (GRUB_INSTALL_PLATFORM_ARM64_EFI, "arm64-efi", imgname);
       free (imgname);

- imgname = grub_util_path_concat (2, efidir_efi_boot, "bootloongarch64.efi"); + imgname = grub_util_path_concat (2, efidir_efi_boot, "BOOTLOONGARCH64.EFI");
       make_image_fwdisk_abs (GRUB_INSTALL_PLATFORM_LOONGARCH64_EFI,
                             "loongarch64-efi",
                             imgname);
       free (imgname);

- imgname = grub_util_path_concat (2, efidir_efi_boot, "bootriscv32.efi"); + imgname = grub_util_path_concat (2, efidir_efi_boot, "BOOTRISCV32.EFI"); make_image_abs (GRUB_INSTALL_PLATFORM_RISCV32_EFI, "riscv32-efi", imgname);
       free (imgname);

- imgname = grub_util_path_concat (2, efidir_efi_boot, "bootriscv64.efi"); + imgname = grub_util_path_concat (2, efidir_efi_boot, "BOOTRISCV64.EFI"); make_image_abs (GRUB_INSTALL_PLATFORM_RISCV64_EFI, "riscv64-efi", imgname);
       free (imgname);

       if (source_dirs[GRUB_INSTALL_PLATFORM_I386_EFI])
        {
-         imgname = grub_util_path_concat (2, efidir_efi_boot, "boot.efi");
+         imgname = grub_util_path_concat (2, efidir_efi_boot, "BOOT.EFI");
          /* For old macs. Suggested by Peter Jones.  */
          grub_install_copy_file (img32, imgname, 1);
        }

       if (source_dirs[GRUB_INSTALL_PLATFORM_I386_EFI]
          || source_dirs[GRUB_INSTALL_PLATFORM_X86_64_EFI])
-       img_mac = grub_util_path_concat (2, core_services, "boot.efi");
+       img_mac = grub_util_path_concat (2, core_services, "BOOT.EFI");

       if (source_dirs[GRUB_INSTALL_PLATFORM_I386_EFI]
          && source_dirs[GRUB_INSTALL_PLATFORM_X86_64_EFI])
--
2.45.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]