From: Peter Jones <pjo...@redhat.com> This allows setting GRUB variables before any user interaction or GRUB script can run. It is primarily intended to be used to turn on early debugging.
Signed-off-by: Peter Jones <pjo...@redhat.com> Replace grub_efi_guid_t -> grub_guid_t Signed-off-by: Glenn Washburn <developm...@efficientek.com> --- grub-core/Makefile.core.def | 1 + grub-core/kern/efi/init.c | 31 +++++++++++++++++++++++++++++++ include/grub/efi/efi.h | 5 +++++ 3 files changed, 37 insertions(+) diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def index 063ef5dd7801..5699736dad20 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def @@ -219,6 +219,7 @@ kernel = { efi = kern/efi/acpi.c; efi = kern/efi/sb.c; efi = kern/lockdown.c; + efi = lib/envblk.c; i386_coreboot = kern/i386/pc/acpi.c; i386_multiboot = kern/i386/pc/acpi.c; i386_coreboot = kern/acpi.c; diff --git a/grub-core/kern/efi/init.c b/grub-core/kern/efi/init.c index 1637077e1e96..2da6036129a1 100644 --- a/grub-core/kern/efi/init.c +++ b/grub-core/kern/efi/init.c @@ -28,8 +28,11 @@ #include <grub/env.h> #include <grub/mm.h> #include <grub/kernel.h> + #include <grub/stack_protector.h> +#include <grub/lib/envblk.h> + #ifdef GRUB_STACK_PROTECTOR static grub_efi_char16_t stack_chk_fail_msg[] = @@ -94,6 +97,31 @@ grub_stack_protector_init (void) grub_addr_t grub_modbase; +/* Helper for grub_efi_env_init */ +static int +set_var (const char *name, const char *value, + void *whitelist __attribute__((__unused__))) +{ + grub_env_set (name, value); + return 0; +} + +static void +grub_efi_env_init (void) +{ + grub_guid_t efi_grub_guid = GRUB_EFI_GRUB_VARIABLE_GUID; + struct grub_envblk envblk_s = { NULL, 0 }; + grub_envblk_t envblk = &envblk_s; + + grub_efi_get_variable ("GRUB_ENV", &efi_grub_guid, &envblk_s.size, + (void **) &envblk_s.buf); + if (envblk_s.buf == NULL || envblk_s.size < 1) + return; + + grub_envblk_iterate (envblk, NULL, set_var); + grub_free (envblk_s.buf); +} + void grub_efi_init (void) { @@ -105,6 +133,9 @@ grub_efi_init (void) /* Initialize the memory management system. */ grub_efi_mm_init (); + /* Populate environment with variables from EFI envblk, if it exists. */ + grub_efi_env_init (); + /* * Lockdown the GRUB and register the shim_lock verifier * if the UEFI Secure Boot is enabled. diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h index a5cd99e5afa9..3edf44dbda49 100644 --- a/include/grub/efi/efi.h +++ b/include/grub/efi/efi.h @@ -25,6 +25,11 @@ #include <grub/efi/api.h> #include <grub/efi/pe32.h> +#define GRUB_EFI_GRUB_VARIABLE_GUID \ + { 0x91376aff, 0xcba6, 0x42be, \ + { 0x94, 0x9d, 0x06, 0xfd, 0xe8, 0x11, 0x28, 0xe8 } \ + } + #define GRUB_LINUX_ARM_MAGIC_SIGNATURE 0x016f2818 struct linux_arch_kernel_header { -- 2.34.1 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel