From f50976357c2ff8d5da2091db9db81da32b5b65ef Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Fri, 28 Oct 2016 10:58:29 -0400 Subject: [PATCH] add bls stuff Signed-off-by: Peter Jones --- ...-blscfg-include-some-IDs-and-indices.patch | 86 +++ ...bls_import-command-know-to-search-en.patch | 531 ++++++++++++++++++ ...fig-able-to-output-BLS-based-config-.patch | 125 +++++ grub.patches | 3 + grub2.spec | 12 +- 5 files changed, 753 insertions(+), 4 deletions(-) create mode 100644 0001-Make-blscfg-include-some-IDs-and-indices.patch create mode 100644 0001-blscfg-make-the-bls_import-command-know-to-search-en.patch create mode 100644 0002-Make-grub2-mkconfig-able-to-output-BLS-based-config-.patch diff --git a/0001-Make-blscfg-include-some-IDs-and-indices.patch b/0001-Make-blscfg-include-some-IDs-and-indices.patch new file mode 100644 index 0000000..2e10fe8 --- /dev/null +++ b/0001-Make-blscfg-include-some-IDs-and-indices.patch @@ -0,0 +1,86 @@ +From 3f2d8bc3a052c7ab6f89a7684ac93b0f8401a6b5 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Fri, 28 Oct 2016 10:55:56 -0400 +Subject: [PATCH] Make blscfg include some IDs and indices + +Signed-off-by: Peter Jones +--- + grub-core/commands/blscfg.c | 27 +++++++++++++++++++++++---- + 1 file changed, 23 insertions(+), 4 deletions(-) + +diff --git a/grub-core/commands/blscfg.c b/grub-core/commands/blscfg.c +index af838d2..2a16858 100644 +--- a/grub-core/commands/blscfg.c ++++ b/grub-core/commands/blscfg.c +@@ -56,6 +56,9 @@ static int parse_entry ( + grub_file_t f = NULL; + grub_off_t sz; + char *title = NULL, *options = NULL, *clinux = NULL, *initrd = NULL, *src = NULL; ++ char *id = NULL; ++ char *class[] = { NULL, NULL }; ++ char **classes = class[0]; + const char *args[2] = { NULL, NULL }; + const char *dirname = (const char *)data; + const char *devid = grub_env_get ("boot"); +@@ -120,6 +123,20 @@ static int parse_entry ( + if (!initrd) + goto finish; + } ++ else if (grub_strncmp (buf, "id ", 3) == 0) ++ { ++ grub_free (id); ++ id = grub_strdup (buf + 3); ++ if (!id) ++ goto finish; ++ } ++ else if (grub_strncmp (buf, "index ", 6) == 0) ++ { ++ grub_free (class[0]); ++ class[0] = grub_strdup (buf + 6); ++ if (!class[0]) ++ goto finish; ++ } + + grub_free(buf); + } +@@ -141,7 +158,7 @@ static int parse_entry ( + GRUB_BOOT_DEVICE, clinux, options ? " " : "", options ? options : "", + initrd ? GRUB_INITRD_CMD " " : "", initrd ? GRUB_BOOT_DEVICE : "", initrd ? initrd : "", initrd ? "\n" : ""); + +- grub_normal_add_menu_entry (1, args, NULL, NULL, "bls", NULL, NULL, src, 0); ++ grub_normal_add_menu_entry (1, args, classes, id, "bls", NULL, NULL, src, 0); + + finish: + grub_free (p); +@@ -150,6 +167,8 @@ finish: + grub_free (clinux); + grub_free (initrd); + grub_free (src); ++ grub_free (id); ++ grub_free (class[0]); + + if (f) + grub_file_close (f); +@@ -333,7 +352,7 @@ finish: + #endif + + static grub_err_t +-grub_cmd_bls_import (grub_extcmd_context_t ctxt __attribute__ ((unused)), ++grub_cmd_blscfg (grub_extcmd_context_t ctxt __attribute__ ((unused)), + int argc __attribute__ ((unused)), + char **args __attribute__ ((unused))) + { +@@ -384,8 +403,8 @@ static grub_extcmd_t cmd; + + GRUB_MOD_INIT(bls) + { +- cmd = grub_register_extcmd ("bls_import", +- grub_cmd_bls_import, ++ cmd = grub_register_extcmd ("blscfg", ++ grub_cmd_blscfg, + 0, + NULL, + N_("Import Boot Loader Specification snippets."), +-- +2.9.3 + diff --git a/0001-blscfg-make-the-bls_import-command-know-to-search-en.patch b/0001-blscfg-make-the-bls_import-command-know-to-search-en.patch new file mode 100644 index 0000000..b0f929c --- /dev/null +++ b/0001-blscfg-make-the-bls_import-command-know-to-search-en.patch @@ -0,0 +1,531 @@ +From 00857b7fb451f2abf9e97229aef537dab3d56f6e Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Mon, 24 Oct 2016 14:51:06 -0400 +Subject: [PATCH 1/2] blscfg: make the bls_import command know to search env + files for blsdir + +This makes it so when you do "bls_import" on EFI systems, it searches +/EFI/*/ directories for a grubenv, and if it finds it, temporarily +merges that environment into grub's env. + +Once that is done, if there's a variable named "blsdir", it looks there +for BLS config files. If that is absent, it tries to load them from +/EFI/$DIR/loader/entries/ +--- + grub-core/commands/blscfg.c | 219 ++++++++++++++++++++++++++++++++++++++++--- + grub-core/commands/loadenv.c | 77 +-------------- + grub-core/commands/loadenv.h | 93 ++++++++++++++++++ + include/grub/compiler.h | 2 + + 4 files changed, 305 insertions(+), 86 deletions(-) + create mode 100644 grub-core/commands/loadenv.h + +diff --git a/grub-core/commands/blscfg.c b/grub-core/commands/blscfg.c +index 4274aca..af838d2 100644 +--- a/grub-core/commands/blscfg.c ++++ b/grub-core/commands/blscfg.c +@@ -30,25 +30,26 @@ + #include + #include + #include ++#include + + GRUB_MOD_LICENSE ("GPLv3+"); + ++#include "loadenv.h" ++ ++#define GRUB_BLS_CONFIG_PATH "/loader/entries/" ++#define GRUB_BOOT_DEVICE "($root)" + #ifdef GRUB_MACHINE_EFI + #define GRUB_LINUX_CMD "linuxefi" + #define GRUB_INITRD_CMD "initrdefi" +-#define GRUB_BLS_CONFIG_PATH "/EFI/fedora/loader/entries/" +-#define GRUB_BOOT_DEVICE "($boot)" + #else + #define GRUB_LINUX_CMD "linux" + #define GRUB_INITRD_CMD "initrd" +-#define GRUB_BLS_CONFIG_PATH "/loader/entries/" +-#define GRUB_BOOT_DEVICE "($root)" + #endif + + static int parse_entry ( + const char *filename, +- const struct grub_dirhook_info *info __attribute__ ((unused)), +- void *data __attribute__ ((unused))) ++ const struct grub_dirhook_info *info UNUSED, ++ void *data) + { + grub_size_t n; + char *p; +@@ -56,6 +57,10 @@ static int parse_entry ( + grub_off_t sz; + char *title = NULL, *options = NULL, *clinux = NULL, *initrd = NULL, *src = NULL; + const char *args[2] = { NULL, NULL }; ++ const char *dirname = (const char *)data; ++ const char *devid = grub_env_get ("boot"); ++ ++ grub_dprintf ("blscfg", "filename: \"%s\"\n", filename); + + if (filename[0] == '.') + return 0; +@@ -67,12 +72,14 @@ static int parse_entry ( + if (grub_strcmp (filename + n - 5, ".conf") != 0) + return 0; + +- p = grub_xasprintf (GRUB_BLS_CONFIG_PATH "%s", filename); ++ p = grub_xasprintf ("(%s)%s/%s", devid, dirname, filename); ++ grub_dprintf ("blscfg", "entry path: \"%s\"\n", p); + + f = grub_file_open (p); + if (!f) + goto finish; + ++ grub_dprintf ("blscfg", "getting size\n"); + sz = grub_file_size (f); + if (sz == GRUB_FILE_SIZE_UNKNOWN || sz > 1024*1024) + goto finish; +@@ -119,12 +126,13 @@ static int parse_entry ( + + if (!linux) + { +- grub_printf ("Skipping file %s with no 'linux' key.", p); ++ grub_dprintf ("blscfg", "Skipping file %s with no 'linux' key.", p); + goto finish; + } + + args[0] = title ? title : filename; + ++ grub_dprintf("blscfg", "adding menu entry for \"%s\"\n", clinux); + src = grub_xasprintf ("load_video\n" + "set gfx_payload=keep\n" + "insmod gzio\n" +@@ -149,6 +157,181 @@ finish: + return 0; + } + ++#ifdef GRUB_MACHINE_EFI ++static grub_envblk_t saved_env = NULL; ++ ++static int ++save_var (const char *name, const char *value, void *whitelist UNUSED) ++{ ++ const char *val = grub_env_get (name); ++ grub_dprintf("blscfg", "saving \"%s\"\n", name); ++ ++ if (val) ++ grub_envblk_set (saved_env, name, value); ++ ++ return 0; ++} ++ ++static int ++unset_var (const char *name, const char *value UNUSED, void *whitelist) ++{ ++ grub_dprintf("blscfg", "restoring \"%s\"\n", name); ++ if (! whitelist) ++ { ++ grub_env_unset (name); ++ return 0; ++ } ++ ++ if (test_whitelist_membership (name, ++ (const grub_env_whitelist_t *) whitelist)) ++ grub_env_unset (name); ++ ++ return 0; ++} ++ ++struct find_entry_info { ++ grub_device_t dev; ++ grub_fs_t fs; ++}; ++ ++/* ++ * filename: if the directory is /EFI/something/ , filename is "something" ++ * info: unused ++ * data: the filesystem object the file is on. ++ */ ++static int find_entry (const char *filename, ++ const struct grub_dirhook_info *dirhook_info UNUSED, ++ void *data) ++{ ++ struct find_entry_info *info = (struct find_entry_info *)data; ++ grub_file_t f = NULL; ++ char *grubenv_path = NULL; ++ grub_envblk_t env = NULL; ++ char *default_blsdir = NULL; ++ const char *blsdir = NULL; ++ char *saved_env_buf = NULL; ++ grub_size_t l; ++ int r = 0; ++ const char *devid = grub_env_get ("boot"); ++ ++ if (!grub_strcmp (filename, ".") || ++ !grub_strcmp (filename, "..") || ++ !grub_strcasecmp (filename, "boot")) ++ return 0; ++ ++ saved_env_buf = grub_malloc (512); ++ ++ // set a default blsdir ++ default_blsdir = grub_xasprintf ("/EFI/%s%s", filename, ++ GRUB_BLS_CONFIG_PATH); ++ grub_env_set ("blsdir", default_blsdir); ++ grub_dprintf ("blscfg", "default_blsdir: \"%s\"\n", default_blsdir); ++ ++ /* ++ * try to load a grubenv from /EFI/wherever/grubenv ++ */ ++ grubenv_path = grub_xasprintf ("(%s)/EFI/%s/grubenv", devid, filename); ++ grub_dprintf ("blscfg", "looking for \"%s\"\n", grubenv_path); ++ f = grub_file_open (grubenv_path); ++ ++ grub_dprintf ("blscfg", "%s it\n", f ? "found" : "did not find"); ++ grub_free (grubenv_path); ++ if (f) ++ { ++ grub_off_t sz; ++ ++ grub_dprintf ("blscfg", "getting size\n"); ++ sz = grub_file_size (f); ++ if (sz == GRUB_FILE_SIZE_UNKNOWN || sz > 1024*1024) ++ goto finish; ++ ++ grub_dprintf ("blscfg", "reading env\n"); ++ env = read_envblk_file (f); ++ if (!env) ++ goto finish; ++ grub_dprintf ("blscfg", "read env file\n"); ++ ++ grub_memset (saved_env_buf, '#', 512); ++ grub_memcpy (saved_env_buf, GRUB_ENVBLK_SIGNATURE, ++ sizeof (GRUB_ENVBLK_SIGNATURE)); ++ grub_dprintf ("blscfg", "saving env\n"); ++ saved_env = grub_envblk_open (saved_env_buf, 512); ++ if (!saved_env) ++ goto finish; ++ ++ // save everything listed in "env" with values from our existing grub env ++ grub_envblk_iterate (env, NULL, save_var); ++ // set everything from our loaded grubenv into the real grub env ++ grub_envblk_iterate (env, NULL, set_var); ++ } ++ else ++ { ++ grub_err_t e; ++ grub_dprintf ("blscfg", "no such file\n"); ++ do ++ { ++ e = grub_error_pop(); ++ } while (e); ++ ++ } ++ ++ blsdir = grub_env_get ("blsdir"); ++ if (!blsdir) ++ goto finish; ++ ++ grub_dprintf ("blscfg", "blsdir: \"%s\"\n", blsdir); ++ if (blsdir[0] != '/') ++ blsdir = grub_xasprintf ("/EFI/%s/%s/", filename, blsdir); ++ else ++ blsdir = grub_strdup (blsdir); ++ ++ if (!blsdir) ++ goto finish; ++ ++ grub_dprintf ("blscfg", "blsdir: \"%s\"\n", blsdir); ++ r = info->fs->dir (info->dev, blsdir, parse_entry, (char *)blsdir); ++ if (r != 0) { ++ grub_dprintf ("blscfg", "parse_entry returned error\n"); ++ grub_err_t e; ++ do ++ { ++ e = grub_error_pop(); ++ } while (e); ++ } ++ ++finish: ++ grub_free (blsdir); ++ ++ grub_env_unset ("blsdir"); ++ ++ if (saved_env) ++ { ++ // remove everything from the real environment that's defined in env ++ grub_envblk_iterate (env, NULL, unset_var); ++ ++ // re-set the things from our original environment ++ grub_envblk_iterate (saved_env, NULL, set_var); ++ grub_envblk_close (saved_env); ++ saved_env = NULL; ++ } ++ else if (saved_env_buf) ++ { ++ // if we have a saved environment, grub_envblk_close() freed this. ++ grub_free (saved_env_buf); ++ } ++ ++ if (env) ++ grub_envblk_close (env); ++ ++ if (f) ++ grub_file_close (f); ++ ++ grub_free (default_blsdir); ++ ++ return 0; ++} ++#endif ++ + static grub_err_t + grub_cmd_bls_import (grub_extcmd_context_t ctxt __attribute__ ((unused)), + int argc __attribute__ ((unused)), +@@ -158,15 +341,22 @@ grub_cmd_bls_import (grub_extcmd_context_t ctxt __attribute__ ((unused)), + grub_device_t dev; + static grub_err_t r; + const char *devid; ++#ifdef GRUB_MACHINE_EFI ++ struct find_entry_info info; ++#endif + +- devid = grub_env_get ("root"); ++ grub_dprintf ("blscfg", "finding boot\n"); ++ devid = grub_env_get ("boot"); + if (!devid) +- return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("variable `%s' isn't set"), "root"); ++ return grub_error (GRUB_ERR_FILE_NOT_FOUND, ++ N_("variable `%s' isn't set"), "boot"); + ++ grub_dprintf ("blscfg", "opening %s\n", devid); + dev = grub_device_open (devid); + if (!dev) + return grub_errno; + ++ grub_dprintf ("blscfg", "probing fs\n"); + fs = grub_fs_probe (dev); + if (!fs) + { +@@ -174,7 +364,14 @@ grub_cmd_bls_import (grub_extcmd_context_t ctxt __attribute__ ((unused)), + goto finish; + } + +- r = fs->dir (dev, GRUB_BLS_CONFIG_PATH, parse_entry, NULL); ++#ifdef GRUB_MACHINE_EFI ++ info.dev = dev; ++ info.fs = fs; ++ grub_dprintf ("blscfg", "scanning /EFI/\n"); ++ r = fs->dir (dev, "/EFI/", find_entry, &info); ++#else ++ r = fs->dir (dev, GRUB_BLS_CONFIG_PATH, parse_entry, GRUB_BLS_CONFIG_PATH); ++#endif + + finish: + if (dev) +diff --git a/grub-core/commands/loadenv.c b/grub-core/commands/loadenv.c +index acd93d1..91c9945 100644 +--- a/grub-core/commands/loadenv.c ++++ b/grub-core/commands/loadenv.c +@@ -28,6 +28,8 @@ + #include + #include + ++#include "loadenv.h" ++ + GRUB_MOD_LICENSE ("GPLv3+"); + + static const struct grub_arg_option options[] = +@@ -84,81 +86,6 @@ open_envblk_file (char *filename, int untrusted) + return file; + } + +-static grub_envblk_t +-read_envblk_file (grub_file_t file) +-{ +- grub_off_t offset = 0; +- char *buf; +- grub_size_t size = grub_file_size (file); +- grub_envblk_t envblk; +- +- buf = grub_malloc (size); +- if (! buf) +- return 0; +- +- while (size > 0) +- { +- grub_ssize_t ret; +- +- ret = grub_file_read (file, buf + offset, size); +- if (ret <= 0) +- { +- grub_free (buf); +- return 0; +- } +- +- size -= ret; +- offset += ret; +- } +- +- envblk = grub_envblk_open (buf, offset); +- if (! envblk) +- { +- grub_free (buf); +- grub_error (GRUB_ERR_BAD_FILE_TYPE, "invalid environment block"); +- return 0; +- } +- +- return envblk; +-} +- +-struct grub_env_whitelist +-{ +- grub_size_t len; +- char **list; +-}; +-typedef struct grub_env_whitelist grub_env_whitelist_t; +- +-static int +-test_whitelist_membership (const char* name, +- const grub_env_whitelist_t* whitelist) +-{ +- grub_size_t i; +- +- for (i = 0; i < whitelist->len; i++) +- if (grub_strcmp (name, whitelist->list[i]) == 0) +- return 1; /* found it */ +- +- return 0; /* not found */ +-} +- +-/* Helper for grub_cmd_load_env. */ +-static int +-set_var (const char *name, const char *value, void *whitelist) +-{ +- if (! whitelist) +- { +- grub_env_set (name, value); +- return 0; +- } +- +- if (test_whitelist_membership (name, +- (const grub_env_whitelist_t *) whitelist)) +- grub_env_set (name, value); +- +- return 0; +-} +- + static grub_err_t + grub_cmd_load_env (grub_extcmd_context_t ctxt, int argc, char **args) + { +diff --git a/grub-core/commands/loadenv.h b/grub-core/commands/loadenv.h +new file mode 100644 +index 0000000..952f461 +--- /dev/null ++++ b/grub-core/commands/loadenv.h +@@ -0,0 +1,93 @@ ++/* loadenv.c - command to load/save environment variable. */ ++/* ++ * GRUB -- GRand Unified Bootloader ++ * Copyright (C) 2008,2009,2010 Free Software Foundation, Inc. ++ * ++ * GRUB is free software: you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation, either version 3 of the License, or ++ * (at your option) any later version. ++ * ++ * GRUB is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with GRUB. If not, see . ++ */ ++ ++static grub_envblk_t UNUSED ++read_envblk_file (grub_file_t file) ++{ ++ grub_off_t offset = 0; ++ char *buf; ++ grub_size_t size = grub_file_size (file); ++ grub_envblk_t envblk; ++ ++ buf = grub_malloc (size); ++ if (! buf) ++ return 0; ++ ++ while (size > 0) ++ { ++ grub_ssize_t ret; ++ ++ ret = grub_file_read (file, buf + offset, size); ++ if (ret <= 0) ++ { ++ grub_free (buf); ++ return 0; ++ } ++ ++ size -= ret; ++ offset += ret; ++ } ++ ++ envblk = grub_envblk_open (buf, offset); ++ if (! envblk) ++ { ++ grub_free (buf); ++ grub_error (GRUB_ERR_BAD_FILE_TYPE, "invalid environment block"); ++ return 0; ++ } ++ ++ return envblk; ++} ++ ++struct grub_env_whitelist ++{ ++ grub_size_t len; ++ char **list; ++}; ++typedef struct grub_env_whitelist grub_env_whitelist_t; ++ ++static int UNUSED ++test_whitelist_membership (const char* name, ++ const grub_env_whitelist_t* whitelist) ++{ ++ grub_size_t i; ++ ++ for (i = 0; i < whitelist->len; i++) ++ if (grub_strcmp (name, whitelist->list[i]) == 0) ++ return 1; /* found it */ ++ ++ return 0; /* not found */ ++} ++ ++/* Helper for grub_cmd_load_env. */ ++static int UNUSED ++set_var (const char *name, const char *value, void *whitelist) ++{ ++ if (! whitelist) ++ { ++ grub_env_set (name, value); ++ return 0; ++ } ++ ++ if (test_whitelist_membership (name, ++ (const grub_env_whitelist_t *) whitelist)) ++ grub_env_set (name, value); ++ ++ return 0; ++} +diff --git a/include/grub/compiler.h b/include/grub/compiler.h +index c9e1d7a..9859ff4 100644 +--- a/include/grub/compiler.h ++++ b/include/grub/compiler.h +@@ -48,4 +48,6 @@ + # define WARN_UNUSED_RESULT + #endif + ++#define UNUSED __attribute__((__unused__)) ++ + #endif /* ! GRUB_COMPILER_HEADER */ +-- +2.9.3 + diff --git a/0002-Make-grub2-mkconfig-able-to-output-BLS-based-config-.patch b/0002-Make-grub2-mkconfig-able-to-output-BLS-based-config-.patch new file mode 100644 index 0000000..bfa7a92 --- /dev/null +++ b/0002-Make-grub2-mkconfig-able-to-output-BLS-based-config-.patch @@ -0,0 +1,125 @@ +From 7d96844d560e9a4ce14f785abbb4b9d25ee49987 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 25 Oct 2016 13:26:38 -0400 +Subject: [PATCH 2/2] Make grub2-mkconfig able to output BLS based config file + +Signed-off-by: Peter Jones +--- + util/grub-mkconfig.in | 3 ++- + util/grub-mkconfig_lib.in | 24 +++++++++++++++--------- + util/grub.d/10_linux.in | 20 ++++++++++++++++++++ + 3 files changed, 37 insertions(+), 10 deletions(-) + +diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in +index e32de5e..0e0475d 100644 +--- a/util/grub-mkconfig.in ++++ b/util/grub-mkconfig.in +@@ -239,7 +239,8 @@ export GRUB_DEFAULT \ + GRUB_BADRAM \ + GRUB_OS_PROBER_SKIP_LIST \ + GRUB_DISABLE_SUBMENU \ +- GRUB_DEFAULT_DTB ++ GRUB_DEFAULT_DTB \ ++ GRUB_ENABLE_BLSCFG + + if test "x${grub_cfg}" != "x"; then + rm -f "${grub_cfg}.new" +diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in +index 9c410ea..54b3576 100644 +--- a/util/grub-mkconfig_lib.in ++++ b/util/grub-mkconfig_lib.in +@@ -123,10 +123,16 @@ EOF + + prepare_grub_to_access_device () + { ++ local device=$1 && shift ++ if [ "$#" -gt 0 ]; then ++ local variable=$1 && shift ++ else ++ local variable=root ++ fi + old_ifs="$IFS" + IFS=' + ' +- partmap="`"${grub_probe}" --device $@ --target=partmap`" ++ partmap="`"${grub_probe}" --device ${device} --target=partmap`" + for module in ${partmap} ; do + case "${module}" in + netbsd | openbsd) +@@ -137,34 +143,34 @@ prepare_grub_to_access_device () + done + + # Abstraction modules aren't auto-loaded. +- abstraction="`"${grub_probe}" --device $@ --target=abstraction`" ++ abstraction="`"${grub_probe}" --device ${device} --target=abstraction`" + for module in ${abstraction} ; do + echo "insmod ${module}" + done + +- fs="`"${grub_probe}" --device $@ --target=fs`" ++ fs="`"${grub_probe}" --device ${device} --target=fs`" + for module in ${fs} ; do + echo "insmod ${module}" + done + + if [ x$GRUB_ENABLE_CRYPTODISK = xy ]; then +- for uuid in `"${grub_probe}" --device $@ --target=cryptodisk_uuid`; do ++ for uuid in `"${grub_probe}" --device ${device} --target=cryptodisk_uuid`; do + echo "cryptomount -u $uuid" + done + fi + + # If there's a filesystem UUID that GRUB is capable of identifying, use it; + # otherwise set root as per value in device.map. +- fs_hint="`"${grub_probe}" --device $@ --target=compatibility_hint`" ++ fs_hint="`"${grub_probe}" --device ${device} --target=compatibility_hint`" + if [ "x$fs_hint" != x ]; then + echo "set root='$fs_hint'" + fi +- if [ "x$GRUB_DISABLE_UUID" != "xtrue" ] && fs_uuid="`"${grub_probe}" --device $@ --target=fs_uuid 2> /dev/null`" ; then +- hints="`"${grub_probe}" --device $@ --target=hints_string 2> /dev/null`" || hints= ++ if [ "x$GRUB_DISABLE_UUID" != "xtrue" ] && fs_uuid="`"${grub_probe}" --device ${device} --target=fs_uuid 2> /dev/null`" ; then ++ hints="`"${grub_probe}" --device ${device} --target=hints_string 2> /dev/null`" || hints= + echo "if [ x\$feature_platform_search_hint = xy ]; then" +- echo " search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}" ++ echo " search --no-floppy --fs-uuid --set=${variable} ${hints} ${fs_uuid}" + echo "else" +- echo " search --no-floppy --fs-uuid --set=root ${fs_uuid}" ++ echo " search --no-floppy --fs-uuid --set=${variable} ${fs_uuid}" + echo "fi" + fi + IFS="$old_ifs" +diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in +index 0c5b227..8d31b1d 100644 +--- a/util/grub.d/10_linux.in ++++ b/util/grub.d/10_linux.in +@@ -105,6 +105,26 @@ linux_entry () + if [ -z "$boot_device_id" ]; then + boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")" + fi ++ ++ if [ "x${GRUB_ENABLE_BLSCFG}" = "xtrue" ]; then ++ if [ x$dirname = x/ ]; then ++ if [ -z "${prepare_root_cache}" ]; then ++ prepare_grub_to_access_device ${GRUB_DEVICE} ++ fi ++ else ++ if [ -z "${prepare_boot_cache}" ]; then ++ prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} ++ fi ++ fi ++ ++ bootefi_device="`${grub_probe} --target=device /boot/efi/`" ++ prepare_grub_to_access_device ${bootefi_device} boot ++ ++ echo bls_import ++ ++ exit 0 ++ fi ++ + if [ x$type != xsimple ] ; then + case $type in + recovery) +-- +2.9.3 + diff --git a/grub.patches b/grub.patches index 0ad7ae5..a3ec724 100644 --- a/grub.patches +++ b/grub.patches @@ -86,3 +86,6 @@ Patch0084: 0084-linuxefi-fix-double-free-on-verification-failure.patch Patch0085: 0085-fix-machine-type-test-in-30_os-prober.in.patch Patch0086: 0086-ppc64le-has-no-separate-boot-mount-1261926.patch Patch0087: 0087-Add-grub-get-kernel-settings-and-use-it-in-10_linux.patch +Patch0088: 0001-blscfg-make-the-bls_import-command-know-to-search-en.patch +Patch0089: 0002-Make-grub2-mkconfig-able-to-output-BLS-based-config-.patch +Patch0090: 0001-Make-blscfg-include-some-IDs-and-indices.patch diff --git a/grub2.spec b/grub2.spec index 6e66e49..933dc64 100644 --- a/grub2.spec +++ b/grub2.spec @@ -45,7 +45,7 @@ Name: grub2 Epoch: 1 Version: 2.02 -Release: 0.36%{?dist} +Release: 0.36%{?dist}.bls2 Summary: Bootloader with support for Linux, Multiboot and more Group: System Environment/Base @@ -225,7 +225,7 @@ cd grub-efi-%{tarversion} --disable-werror make %{?_smp_mflags} -GRUB_MODULES=" all_video boot btrfs cat chain configfile echo \ +GRUB_MODULES=" all_video blscfg boot btrfs cat chain configfile echo \ efifwsetup efinet ext2 fat font gfxmenu gfxterm gzio halt \ hfsplus iso9660 jpeg loadenv loopback lvm mdraid09 mdraid1x \ minicmd normal part_apple part_msdos part_gpt \ @@ -334,7 +334,6 @@ cp -a $RPM_BUILD_ROOT%{_datarootdir}/locale/en\@quot $RPM_BUILD_ROOT%{_datarootd mv $RPM_BUILD_ROOT%{_infodir}/grub.info $RPM_BUILD_ROOT%{_infodir}/%{name}.info mv $RPM_BUILD_ROOT%{_infodir}/grub-dev.info $RPM_BUILD_ROOT%{_infodir}/%{name}-dev.info rm $RPM_BUILD_ROOT%{_infodir}/dir - # Defaults mkdir ${RPM_BUILD_ROOT}%{_sysconfdir}/default touch ${RPM_BUILD_ROOT}%{_sysconfdir}/default/grub @@ -342,6 +341,8 @@ mkdir ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig ln -sf %{_sysconfdir}/default/grub \ ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig/grub +./grub-editenv ${RPM_BUILD_ROOT}/boot/efi/EFI/%{efidir}/grubenv create +truncate -s 512 ${RPM_BUILD_ROOT}/boot/efi/EFI/%{efidir}/grubenv cd .. %find_lang grub @@ -364,9 +365,11 @@ cat << EOF > ${RPM_BUILD_ROOT}%{_sysconfdir}/prelink.conf.d/grub2.conf -b /usr/sbin/grub2-sparc64-setup EOF -%ifarch %{efiarchs} mkdir -p boot/efi/EFI/%{efidir}/ ln -s /boot/efi/EFI/%{efidir}/grubenv boot/grub2/grubenv + +%ifarch %{efiarchs} +mkdir -p boot/efi/EFI/%{efidir}/loader/entries/ %endif # Don't run debuginfo on all the grub modules and whatnot; it just @@ -467,6 +470,7 @@ fi %defattr(-,root,root,-) %config(noreplace) %{_sysconfdir}/%{name}-efi.cfg %attr(0755,root,root)/boot/efi/EFI/%{efidir} +%attr(0755,root,root)/boot/efi/EFI/%{efidir}/loader/entries/ %attr(0755,root,root)/boot/efi/EFI/%{efidir}/fonts %ghost %config(noreplace) /boot/efi/EFI/%{efidir}/grub.cfg %doc grub-%{tarversion}/COPYING