Fetch the repository succeeded.
This action will force synchronization from src-anolis-os/grub2, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Javier Martinez Canillas <javierm@redhat.com>
Date: Fri, 2 Feb 2018 11:36:29 +0100
Subject: [PATCH] Enable blscfg command for the emu platform
Allow grub-emu to call a blscfg command. This may be useful for platforms
that don't support GRUB, so grub-emu can be used to parse the BLS configs
and kexec a new kernel using that information.
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
---
grub-core/Makefile.core.def | 1 +
grub-core/commands/blscfg.c | 46 +++++++++++++++++++++++++++++++++++----------
2 files changed, 37 insertions(+), 10 deletions(-)
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
index 96ccb4021..e52d77688 100644
--- a/grub-core/Makefile.core.def
+++ b/grub-core/Makefile.core.def
@@ -777,6 +777,7 @@ module = {
common = commands/blscfg.c;
enable = efi;
enable = i386_pc;
+ enable = emu;
};
module = {
diff --git a/grub-core/commands/blscfg.c b/grub-core/commands/blscfg.c
index 86796c8cd..e0b65534a 100644
--- a/grub-core/commands/blscfg.c
+++ b/grub-core/commands/blscfg.c
@@ -37,7 +37,12 @@ GRUB_MOD_LICENSE ("GPLv3+");
#include "loadenv.h"
#define GRUB_BLS_CONFIG_PATH "/loader/entries/"
+#ifdef GRUB_MACHINE_EMU
+#define GRUB_BOOT_DEVICE "/boot"
+#else
#define GRUB_BOOT_DEVICE "($root)"
+#endif
+
#ifdef GRUB_MACHINE_EFI
#define GRUB_LINUX_CMD "linuxefi"
#define GRUB_INITRD_CMD "initrdefi"
@@ -46,6 +51,13 @@ GRUB_MOD_LICENSE ("GPLv3+");
#define GRUB_INITRD_CMD "initrd"
#endif
+enum
+ {
+ PLATFORM_EFI,
+ PLATFORM_EMU,
+ PLATFORM_BIOS,
+ };
+
#define grub_free(x) ({grub_dprintf("blscfg", "%s freeing %p\n", __func__, x); grub_free(x); })
struct keyval
@@ -641,7 +653,7 @@ finish:
struct find_entry_info {
grub_device_t dev;
grub_fs_t fs;
- int efi;
+ int platform;
};
/*
@@ -668,13 +680,16 @@ static int find_entry (const char *filename,
!grub_strcmp (filename, ".."))
return 0;
- if (info->efi && !grub_strcasecmp (filename, "boot"))
+ if (info->platform == PLATFORM_EFI && !grub_strcasecmp (filename, "boot"))
return 0;
saved_env_buf = grub_malloc (512);
// set a default blsdir
- if (info->efi)
+ if (info->platform == PLATFORM_EMU)
+ default_blsdir = grub_xasprintf ("%s%s", GRUB_BOOT_DEVICE,
+ GRUB_BLS_CONFIG_PATH);
+ else if (info->platform == PLATFORM_EFI)
default_blsdir = grub_xasprintf ("/EFI/%s%s", filename,
GRUB_BLS_CONFIG_PATH);
else
@@ -686,7 +701,7 @@ static int find_entry (const char *filename,
/*
* try to load a grubenv from /EFI/wherever/grubenv
*/
- if (info->efi)
+ if (info->platform == PLATFORM_EFI)
grubenv_path = grub_xasprintf ("(%s)/EFI/%s/grubenv", devid, filename);
else
grubenv_path = grub_xasprintf ("(%s)/grub2/grubenv", devid);
@@ -740,7 +755,7 @@ static int find_entry (const char *filename,
goto finish;
grub_dprintf ("blscfg", "blsdir: \"%s\"\n", blsdir);
- if (blsdir[0] != '/' && info->efi)
+ if (blsdir[0] != '/' && info->platform == PLATFORM_EFI)
blsdir = grub_xasprintf ("/EFI/%s/%s/", filename, blsdir);
else
blsdir = grub_strdup (blsdir);
@@ -818,15 +833,21 @@ grub_cmd_blscfg (grub_extcmd_context_t ctxt UNUSED,
{
.dev = NULL,
.fs = NULL,
- .efi = 0,
+ .platform = PLATFORM_BIOS,
};
grub_dprintf ("blscfg", "finding boot\n");
+
+#ifdef GRUB_MACHINE_EMU
+ devid = "host";
+ grub_env_set ("boot", devid);
+#else
devid = grub_env_get ("boot");
if (!devid)
return grub_error (GRUB_ERR_FILE_NOT_FOUND,
N_("variable `%s' isn't set"), "boot");
+#endif
grub_dprintf ("blscfg", "opening %s\n", devid);
dev = grub_device_open (devid);
@@ -844,11 +865,16 @@ grub_cmd_blscfg (grub_extcmd_context_t ctxt UNUSED,
info.dev = dev;
info.fs = fs;
#ifdef GRUB_MACHINE_EFI
- info.efi = 1;
+ info.platform = PLATFORM_EFI;
grub_dprintf ("blscfg", "scanning /EFI/\n");
r = fs->dir (dev, "/EFI/", find_entry, &info);
+#elif GRUB_MACHINE_EMU
+ info.platform = PLATFORM_EMU;
+ grub_dprintf ("blscfg", "scanning %s%s\n", GRUB_BOOT_DEVICE,
+ GRUB_BLS_CONFIG_PATH);
+ r = fs->dir (dev, "/boot/loader/",
+ find_entry, &info);
#else
- info.efi = 0;
grub_dprintf ("blscfg", "scanning %s\n", GRUB_BLS_CONFIG_PATH);
r = fs->dir (dev, "/", find_entry, &info);
#endif
@@ -863,7 +889,7 @@ finish:
static grub_extcmd_t cmd;
static grub_extcmd_t oldcmd;
-GRUB_MOD_INIT(bls)
+GRUB_MOD_INIT(blscfg)
{
grub_dprintf("blscfg", "%s got here\n", __func__);
cmd = grub_register_extcmd ("blscfg",
@@ -880,7 +906,7 @@ GRUB_MOD_INIT(bls)
NULL);
}
-GRUB_MOD_FINI(bls)
+GRUB_MOD_FINI(blscfg)
{
grub_unregister_extcmd (cmd);
grub_unregister_extcmd (oldcmd);
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。