From 082fd84d525f8d6602f892160b77c0a948308a78 Mon Sep 17 00:00:00 2001 From: Steve McIntyre <93sam@debian.org> Date: Mon, 11 Feb 2019 02:42:34 +0000 Subject: [PATCH] grub-install: Check for arm-efi as a default target 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. Heavily inspired by the existing code for x86. Signed-off-by: Steve McIntyre <93sam@debian.org> Reviewed-by: Leif Lindholm Reviewed-by: Daniel Kiper --- grub-core/osdep/basic/platform.c | 6 ++++++ grub-core/osdep/linux/platform.c | 22 ++++++++++++++++++++++ include/grub/util/install.h | 3 +++ util/grub-install.c | 2 +- 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/grub-core/osdep/basic/platform.c b/grub-core/osdep/basic/platform.c index 4b5502aeb..a7dafd85a 100644 --- a/grub-core/osdep/basic/platform.c +++ b/grub-core/osdep/basic/platform.c @@ -18,6 +18,12 @@ #include +const char * +grub_install_get_default_arm_platform (void) +{ + return "arm-uboot"; +} + const char * grub_install_get_default_x86_platform (void) { diff --git a/grub-core/osdep/linux/platform.c b/grub-core/osdep/linux/platform.c index 775b6c031..6dee798e3 100644 --- a/grub-core/osdep/linux/platform.c +++ b/grub-core/osdep/linux/platform.c @@ -97,6 +97,28 @@ read_platform_size (void) return ret; } +const char * +grub_install_get_default_arm_platform (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. + */ + grub_util_exec_redirect_all ((const char * []){ "modprobe", "efivars", NULL }, + NULL, NULL, "/dev/null"); + + grub_util_info ("Looking for /sys/firmware/efi .."); + if (is_not_empty_directory ("/sys/firmware/efi")) + { + grub_util_info ("...found"); + return "arm-efi"; + } + + grub_util_info ("... not found"); + return "arm-uboot"; +} + const char * grub_install_get_default_x86_platform (void) { diff --git a/include/grub/util/install.h b/include/grub/util/install.h index b1a00154f..2631b1074 100644 --- a/include/grub/util/install.h +++ b/include/grub/util/install.h @@ -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); diff --git a/util/grub-install.c b/util/grub-install.c index c6c3da331..264f9ecdc 100644 --- a/util/grub-install.c +++ b/util/grub-install.c @@ -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__)