]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
grub-install: Check for arm-efi as a default target
authorSteve McIntyre <93sam@debian.org>
Thu, 21 Feb 2019 14:46:11 +0000 (14:46 +0000)
committerDaniel Kiper <daniel.kiper@oracle.com>
Tue, 26 Feb 2019 14:25:13 +0000 (15:25 +0100)
Much like on x86, we can work out if the system is running on top of EFI
firmware. If so, return "arm-efi". If not, fall back to "arm-uboot" as
previously.

Split out the code to (maybe) load the efivar module and check for
/sys/firmware/efi into a common helper routine is_efi_system().

Signed-off-by: Steve McIntyre <93sam@debian.org>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
grub-core/osdep/basic/platform.c
grub-core/osdep/linux/platform.c
include/grub/util/install.h
util/grub-install.c

index 4b5502aeb73e2b763fcc097ee144e6959bf33430..a7dafd85a9059a126a2f344d4a7724f2a46aba33 100644 (file)
 
 #include <grub/util/install.h>
 
+const char *
+grub_install_get_default_arm_platform (void)
+{
+  return "arm-uboot";
+}
+
 const char *
 grub_install_get_default_x86_platform (void)
 { 
index 775b6c03128b971af59318666bbdcfe6c56b5f49..e28a79dab387332442955bb0eecdd52501d3f82d 100644 (file)
@@ -97,15 +97,16 @@ read_platform_size (void)
   return ret;
 }
 
-const char *
-grub_install_get_default_x86_platform (void)
-{ 
+/* Are we running on an EFI-based system? */
+static int
+is_efi_system (void)
+{
   /*
-     On Linux, we need the efivars kernel modules.
-     If no EFI is available this module just does nothing
-     besides a small hello and if we detect efi we'll load it
-     anyway later. So it should be safe to
-     try to load it here.
+   * Linux uses efivarfs (mounted on /sys/firmware/efi/efivars) to access the
+   * EFI variable store. Some legacy systems may still use the deprecated
+   * efivars interface (accessed through /sys/firmware/efi/vars). Where both
+   * are present, libefivar will use the former in preference, so attempting
+   * to load efivars will not interfere with later operations.
    */
   grub_util_exec_redirect_all ((const char * []){ "modprobe", "efivars", NULL },
                               NULL, NULL, "/dev/null");
@@ -114,13 +115,36 @@ grub_install_get_default_x86_platform (void)
   if (is_not_empty_directory ("/sys/firmware/efi"))
     {
       grub_util_info ("...found");
+      return 1;
+    }
+  else
+    {
+      grub_util_info ("... not found");
+      return 0;
+    }
+}
+
+const char *
+grub_install_get_default_arm_platform (void)
+{
+  if (is_efi_system())
+    return "arm-efi";
+  else
+    return "arm-uboot";
+}
+
+const char *
+grub_install_get_default_x86_platform (void)
+{
+  if (is_efi_system())
+    {
       if (read_platform_size() == 64)
        return "x86_64-efi";
       else
        return "i386-efi";
     }
 
-  grub_util_info ("... not found. Looking for /proc/device-tree ..");
+  grub_util_info ("Looking for /proc/device-tree ..");
   if (is_not_empty_directory ("/proc/device-tree"))
     {
       grub_util_info ("...found");
index b1a00154feb399e5a02da6dd7cb2d42e02e49ac7..2631b1074513c25a22ff22c21e0d752e24b74279 100644 (file)
@@ -210,6 +210,9 @@ grub_util_get_target_dirname (const struct grub_install_image_target_desc *t);
 void
 grub_install_create_envblk_file (const char *name);
 
+const char *
+grub_install_get_default_arm_platform (void);
+
 const char *
 grub_install_get_default_x86_platform (void);
 
index c6c3da3316eba46f66cbae42c7958e1f6e6ded75..264f9ecdc59f14de1926ce42ec669d41aa5afd6c 100644 (file)
@@ -319,7 +319,7 @@ get_default_platform (void)
 #elif defined (__ia64__)
    return "ia64-efi";
 #elif defined (__arm__)
-   return "arm-uboot";
+   return grub_install_get_default_arm_platform ();
 #elif defined (__aarch64__)
    return "arm64-efi";
 #elif defined (__amd64__) || defined (__x86_64__) || defined (__i386__)