File 0002-grubbls-Add-automatic-fwsetup-menu-entry.patch of Package grub2
From a70961a2e3d615502a72cff8255be4894cb581b2 Mon Sep 17 00:00:00 2001
From: Michael Chang <mchang@suse.com>
Date: Thu, 27 Nov 2025 12:14:30 +0800
Subject: [PATCH 2/2] grubbls: Add automatic fwsetup menu entry
Similar to the auto-firmware option in loader.conf, this patch adds
support for automatically generating the menu entry that allows users to
reboot into the firmware interface instead of the OS. The entry is
labeled "UEFI Firmware Settings", the same label used in today's GRUB
menu.
The feature is enabled by default. To disable it, one can set
blscfg_auto_firmware=n in the GRUB environment variable.
grub2-editenv /boot/efi/EFI/opensuse/grubenv set \
blscfg_auto_firmware=n
Signed-off-by: Michael Chang <mchang@suse.com>
---
grub-core/commands/efi/efifwsetup.c | 32 ++++++++++++++++++++++++++++-
grub-core/normal/main.c | 12 +++++++++++
2 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/grub-core/commands/efi/efifwsetup.c b/grub-core/commands/efi/efifwsetup.c
index 704f9d352..489c649cc 100644
--- a/grub-core/commands/efi/efifwsetup.c
+++ b/grub-core/commands/efi/efifwsetup.c
@@ -24,6 +24,7 @@
#include <grub/efi/efi.h>
#include <grub/command.h>
#include <grub/i18n.h>
+#include <grub/normal.h>
GRUB_MOD_LICENSE ("GPLv3+");
@@ -65,7 +66,7 @@ grub_cmd_fwsetup (grub_command_t cmd __attribute__ ((unused)),
return GRUB_ERR_BUG;
}
-static grub_command_t cmd = NULL;
+static grub_command_t cmd = NULL, cmd_fwsetup_auto = NULL;
static grub_efi_boolean_t
efifwsetup_is_supported (void)
@@ -89,14 +90,43 @@ efifwsetup_is_supported (void)
return ret;
}
+static grub_err_t
+grub_cmd_efifwsetup_auto (grub_command_t command __attribute__ ((unused)),
+ int argc __attribute__ ((unused)),
+ char **args __attribute__ ((unused)))
+{
+ const char *argv[] = { "UEFI Firmware Settings" };
+
+ if (efifwsetup_is_supported () == false)
+ return GRUB_ERR_NONE;
+
+ grub_normal_add_menu_entry (1,
+ argv,
+ NULL,
+ "uefi-firmware",
+ NULL,
+ NULL,
+ NULL,
+ "fwsetup\n",
+ 0,
+ 0,
+ NULL,
+ NULL);
+ return GRUB_ERR_NONE;
+}
+
GRUB_MOD_INIT (efifwsetup)
{
cmd = grub_register_command ("fwsetup", grub_cmd_fwsetup, NULL,
N_("Reboot into firmware setup menu."));
+ cmd_fwsetup_auto = grub_register_command ("efifwsetup_auto", grub_cmd_efifwsetup_auto,
+ NULL, N_("Show UEFI fwsetup menu automatically."));
}
GRUB_MOD_FINI (efifwsetup)
{
if (cmd)
grub_unregister_command (cmd);
+ if (cmd_fwsetup_auto != NULL)
+ grub_unregister_command (cmd_fwsetup_auto);
}
diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c
index c848e51a2..f960b518c 100644
--- a/grub-core/normal/main.c
+++ b/grub-core/normal/main.c
@@ -373,6 +373,17 @@ bls_set_terminal (const char *type)
grub_device_close (dev);
}
+static void
+bls_auto_firmware (void)
+{
+ const char *val = grub_env_get ("blscfg_auto_firmware");
+
+ if (val && (val[0] == '0' || val[0] == 'n'))
+ return;
+
+ grub_parser_execute ((char *) "efifwsetup_auto\n");
+}
+
static grub_menu_t
read_blscfg (void)
{
@@ -389,6 +400,7 @@ read_blscfg (void)
bls_set_terminal (NULL);
grub_parser_execute ((char *)"blscfg\n");
+ bls_auto_firmware ();
return newmenu;
}
--
2.51.1