grub2 rebuild
This commit is contained in:
@@ -22,7 +22,7 @@ def setup():
|
||||
|
||||
pisitools.dosed('util/grub-mkconfig.in', 'GRUB_DISABLE_OS_PROBER="true"', 'GRUB_DISABLE_OS_PROBER="false"')
|
||||
#shelltools.system("./linguas.sh")
|
||||
#shelltools.system("./autogen.sh")
|
||||
shelltools.system("./bootstrap")
|
||||
autotools.configure("--disable-werror \
|
||||
--with-grubdir=grub2 \
|
||||
--program-transform-name='s,grub,grub2,'\
|
||||
@@ -34,7 +34,7 @@ def setup():
|
||||
|
||||
shelltools.copytree("../grub-%s" % (get.srcVERSION().replace("_", "~")), "../grub-%s-efi" % get.srcVERSION())
|
||||
shelltools.cd("../grub-%s-efi" % get.srcVERSION())
|
||||
#shelltools.system("./autogen.sh")
|
||||
shelltools.system("./bootstrap")
|
||||
autotools.configure("--disable-werror \
|
||||
--with-grubdir=grub2 \
|
||||
--program-transform-name='s,grub,grub2,'\
|
||||
@@ -84,7 +84,7 @@ def install():
|
||||
|
||||
autotools.rawInstall("DESTDIR=%s" % get.installDIR())
|
||||
|
||||
pisitools.dodoc("ABOUT-NLS", "AUTHORS", "BUGS", "ChangeLog", "COPYING", "TODO", "README")
|
||||
pisitools.dodoc("ABOUT-NLS", "AUTHORS", "BUGS", "COPYING", "TODO", "README")
|
||||
|
||||
shelltools.cd("../grub-%s-efi" % get.srcVERSION())
|
||||
|
||||
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Date: Fri, 11 Jun 2021 12:10:45 +0200
|
||||
Subject: [PATCH] Revert "templates: Fix user-facing typo with an incorrect use
|
||||
of "it's""
|
||||
|
||||
This reverts commit 722737630889607c3b5761f1f5a48f1674cd2821.
|
||||
---
|
||||
util/grub.d/30_os-prober.in | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/util/grub.d/30_os-prober.in b/util/grub.d/30_os-prober.in
|
||||
index 5984e92d291..94622481284 100644
|
||||
--- a/util/grub.d/30_os-prober.in
|
||||
+++ b/util/grub.d/30_os-prober.in
|
||||
@@ -36,7 +36,7 @@ if ! command -v os-prober > /dev/null || ! command -v linux-boot-prober > /dev/n
|
||||
exit 0
|
||||
fi
|
||||
|
||||
-grub_warn "$(gettext_printf "os-prober will be executed to detect other bootable partitions.\nIts output will be used to detect bootable binaries on them and create new boot entries.")"
|
||||
+grub_warn "$(gettext_printf "os-prober will be executed to detect other bootable partitions.\nIt's output will be used to detect bootable binaries on them and create new boot entries.")"
|
||||
|
||||
OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`"
|
||||
if [ -z "${OSPROBED}" ] ; then
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Date: Fri, 11 Jun 2021 12:10:54 +0200
|
||||
Subject: [PATCH] Revert "templates: Properly disable the os-prober by default"
|
||||
|
||||
This reverts commit 54e0a1bbf1e9106901a557195bb35e5e20fb3925.
|
||||
---
|
||||
util/grub-mkconfig.in | 5 +----
|
||||
util/grub.d/30_os-prober.in | 8 ++++----
|
||||
2 files changed, 5 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in
|
||||
index f8cbb8d7a2b..d3e879b8e5c 100644
|
||||
--- a/util/grub-mkconfig.in
|
||||
+++ b/util/grub-mkconfig.in
|
||||
@@ -140,9 +140,6 @@ GRUB_DEVICE_PARTUUID="`${grub_probe} --device ${GRUB_DEVICE} --target=partuuid 2
|
||||
GRUB_DEVICE_BOOT="`${grub_probe} --target=device /boot`"
|
||||
GRUB_DEVICE_BOOT_UUID="`${grub_probe} --device ${GRUB_DEVICE_BOOT} --target=fs_uuid 2> /dev/null`" || true
|
||||
|
||||
-# Disable os-prober by default due to security reasons.
|
||||
-GRUB_DISABLE_OS_PROBER="true"
|
||||
-
|
||||
# Filesystem for the device containing our userland. Used for stuff like
|
||||
# choosing Hurd filesystem module.
|
||||
GRUB_FS="`${grub_probe} --device ${GRUB_DEVICE} --target=fs 2> /dev/null || echo unknown`"
|
||||
@@ -204,7 +201,6 @@ export GRUB_DEVICE \
|
||||
GRUB_DEVICE_PARTUUID \
|
||||
GRUB_DEVICE_BOOT \
|
||||
GRUB_DEVICE_BOOT_UUID \
|
||||
- GRUB_DISABLE_OS_PROBER \
|
||||
GRUB_FS \
|
||||
GRUB_FONT \
|
||||
GRUB_PRELOAD_MODULES \
|
||||
@@ -246,6 +242,7 @@ export GRUB_DEFAULT \
|
||||
GRUB_BACKGROUND \
|
||||
GRUB_THEME \
|
||||
GRUB_GFXPAYLOAD_LINUX \
|
||||
+ GRUB_DISABLE_OS_PROBER \
|
||||
GRUB_INIT_TUNE \
|
||||
GRUB_SAVEDEFAULT \
|
||||
GRUB_ENABLE_CRYPTODISK \
|
||||
diff --git a/util/grub.d/30_os-prober.in b/util/grub.d/30_os-prober.in
|
||||
index 94622481284..80685b15f4d 100644
|
||||
--- a/util/grub.d/30_os-prober.in
|
||||
+++ b/util/grub.d/30_os-prober.in
|
||||
@@ -26,8 +26,8 @@ export TEXTDOMAINDIR="@localedir@"
|
||||
|
||||
. "$pkgdatadir/grub-mkconfig_lib"
|
||||
|
||||
-if [ "x${GRUB_DISABLE_OS_PROBER}" = "xtrue" ]; then
|
||||
- grub_warn "$(gettext_printf "os-prober will not be executed to detect other bootable partitions.\nSystems on them will not be added to the GRUB boot configuration.\nCheck GRUB_DISABLE_OS_PROBER documentation entry.")"
|
||||
+if [ "x${GRUB_DISABLE_OS_PROBER}" = "xfalse" ]; then
|
||||
+ gettext_printf "os-prober will not be executed to detect other bootable partitions.\nSystems on them will not be added to the GRUB boot configuration.\nCheck GRUB_DISABLE_OS_PROBER documentation entry.\n"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
@@ -36,12 +36,12 @@ if ! command -v os-prober > /dev/null || ! command -v linux-boot-prober > /dev/n
|
||||
exit 0
|
||||
fi
|
||||
|
||||
-grub_warn "$(gettext_printf "os-prober will be executed to detect other bootable partitions.\nIt's output will be used to detect bootable binaries on them and create new boot entries.")"
|
||||
-
|
||||
OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`"
|
||||
if [ -z "${OSPROBED}" ] ; then
|
||||
# empty os-prober output, nothing doing
|
||||
exit 0
|
||||
+else
|
||||
+ grub_warn "$(gettext_printf "os-prober was executed to detect other bootable partitions.\nIt's output will be used to detect bootable binaries on them and create new boot entries.")"
|
||||
fi
|
||||
|
||||
osx_entry() {
|
||||
@@ -0,0 +1,70 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Date: Fri, 11 Jun 2021 12:10:58 +0200
|
||||
Subject: [PATCH] Revert "templates: Disable the os-prober by default"
|
||||
|
||||
This reverts commit e346414725a70e5c74ee87ca14e580c66f517666.
|
||||
---
|
||||
docs/grub.texi | 18 ++++++++----------
|
||||
util/grub.d/30_os-prober.in | 5 +----
|
||||
2 files changed, 9 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/docs/grub.texi b/docs/grub.texi
|
||||
index f8b4b3b21a7..69f08d289f9 100644
|
||||
--- a/docs/grub.texi
|
||||
+++ b/docs/grub.texi
|
||||
@@ -1519,13 +1519,10 @@ boot sequence. If you have problems, set this option to @samp{text} and
|
||||
GRUB will tell Linux to boot in normal text mode.
|
||||
|
||||
@item GRUB_DISABLE_OS_PROBER
|
||||
-The @command{grub-mkconfig} has a feature to use the external
|
||||
-@command{os-prober} program to discover other operating systems installed on
|
||||
-the same machine and generate appropriate menu entries for them. It is disabled
|
||||
-by default since automatic and silent execution of @command{os-prober}, and
|
||||
-creating boot entries based on that data, is a potential attack vector. Set
|
||||
-this option to @samp{false} to enable this feature in the
|
||||
-@command{grub-mkconfig} command.
|
||||
+Normally, @command{grub-mkconfig} will try to use the external
|
||||
+@command{os-prober} program, if installed, to discover other operating
|
||||
+systems installed on the same system and generate appropriate menu entries
|
||||
+for them. Set this option to @samp{true} to disable this.
|
||||
|
||||
@item GRUB_OS_PROBER_SKIP_LIST
|
||||
List of space-separated FS UUIDs of filesystems to be ignored from os-prober
|
||||
@@ -1853,9 +1850,10 @@ than zero; otherwise 0.
|
||||
@section Multi-boot manual config
|
||||
|
||||
Currently autogenerating config files for multi-boot environments depends on
|
||||
-os-prober and has several shortcomings. Due to that it is disabled by default.
|
||||
-It is advised to use the power of GRUB syntax and do it yourself. A possible
|
||||
-configuration is detailed here, feel free to adjust to your needs.
|
||||
+os-prober and has several shortcomings. While fixing it is scheduled for the
|
||||
+next release, meanwhile you can make use of the power of GRUB syntax and do it
|
||||
+yourself. A possible configuration is detailed here, feel free to adjust to your
|
||||
+needs.
|
||||
|
||||
First create a separate GRUB partition, big enough to hold GRUB. Some of the
|
||||
following entries show how to load OS installer images from this same partition,
|
||||
diff --git a/util/grub.d/30_os-prober.in b/util/grub.d/30_os-prober.in
|
||||
index 80685b15f4d..1b91c102f35 100644
|
||||
--- a/util/grub.d/30_os-prober.in
|
||||
+++ b/util/grub.d/30_os-prober.in
|
||||
@@ -26,8 +26,7 @@ export TEXTDOMAINDIR="@localedir@"
|
||||
|
||||
. "$pkgdatadir/grub-mkconfig_lib"
|
||||
|
||||
-if [ "x${GRUB_DISABLE_OS_PROBER}" = "xfalse" ]; then
|
||||
- gettext_printf "os-prober will not be executed to detect other bootable partitions.\nSystems on them will not be added to the GRUB boot configuration.\nCheck GRUB_DISABLE_OS_PROBER documentation entry.\n"
|
||||
+if [ "x${GRUB_DISABLE_OS_PROBER}" = "xtrue" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
@@ -40,8 +39,6 @@ OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`"
|
||||
if [ -z "${OSPROBED}" ] ; then
|
||||
# empty os-prober output, nothing doing
|
||||
exit 0
|
||||
-else
|
||||
- grub_warn "$(gettext_printf "os-prober was executed to detect other bootable partitions.\nIt's output will be used to detect bootable binaries on them and create new boot entries.")"
|
||||
fi
|
||||
|
||||
osx_entry() {
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Date: Tue, 6 Jul 2021 00:38:40 +0200
|
||||
Subject: [PATCH] templates: Check for EFI at runtime instead of config
|
||||
generation time
|
||||
|
||||
The 30_uefi-firmware template checks if an OsIndicationsSupported UEFI var
|
||||
exists and EFI_OS_INDICATIONS_BOOT_TO_FW_UI bit is set, to decide whether
|
||||
a "fwsetup" menu entry would be added or not to the GRUB menu.
|
||||
|
||||
But this has the problem that it will only work if the configuration file
|
||||
was created on an UEFI machine that supports booting to a firmware UI.
|
||||
|
||||
This for example doesn't support creating GRUB config files when executing
|
||||
on systems that support both UEFI and legacy BIOS booting. Since creating
|
||||
the config file from legacy BIOS wouldn't allow to access the firmware UI.
|
||||
|
||||
To prevent this, make the template to unconditionally create the grub.cfg
|
||||
snippet but check at runtime if was booted through UEFI to decide if this
|
||||
entry should be added. That way it won't be added when booting with BIOS.
|
||||
|
||||
There's no need to check if EFI_OS_INDICATIONS_BOOT_TO_FW_UI bit is set,
|
||||
since that's already done by the "fwsetup" command when is executed.
|
||||
|
||||
Resolves: rhbz#1823864
|
||||
|
||||
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
|
||||
---
|
||||
util/grub.d/30_uefi-firmware.in | 21 ++++++++-------------
|
||||
1 file changed, 8 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/util/grub.d/30_uefi-firmware.in b/util/grub.d/30_uefi-firmware.in
|
||||
index d344d3883d7..b6041b55e2a 100644
|
||||
--- a/util/grub.d/30_uefi-firmware.in
|
||||
+++ b/util/grub.d/30_uefi-firmware.in
|
||||
@@ -26,19 +26,14 @@ export TEXTDOMAINDIR="@localedir@"
|
||||
|
||||
. "$pkgdatadir/grub-mkconfig_lib"
|
||||
|
||||
-EFI_VARS_DIR=/sys/firmware/efi/efivars
|
||||
-EFI_GLOBAL_VARIABLE=8be4df61-93ca-11d2-aa0d-00e098032b8c
|
||||
-OS_INDICATIONS="$EFI_VARS_DIR/OsIndicationsSupported-$EFI_GLOBAL_VARIABLE"
|
||||
+LABEL="UEFI Firmware Settings"
|
||||
|
||||
-if [ -e "$OS_INDICATIONS" ] && \
|
||||
- [ "$(( $(printf 0x%x \'"$(cat $OS_INDICATIONS | cut -b5)"\') & 1 ))" = 1 ]; then
|
||||
- LABEL="UEFI Firmware Settings"
|
||||
+gettext_printf "Adding boot menu entry for UEFI Firmware Settings ...\n" >&2
|
||||
|
||||
- gettext_printf "Adding boot menu entry for UEFI Firmware Settings ...\n" >&2
|
||||
-
|
||||
- cat << EOF
|
||||
-menuentry '$LABEL' \$menuentry_id_option 'uefi-firmware' {
|
||||
- fwsetup
|
||||
-}
|
||||
-EOF
|
||||
+cat << EOF
|
||||
+if [ "\$grub_platform" = "efi" ]; then
|
||||
+ menuentry '$LABEL' \$menuentry_id_option 'uefi-firmware' {
|
||||
+ fwsetup
|
||||
+ }
|
||||
fi
|
||||
+EOF
|
||||
+92
@@ -0,0 +1,92 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Date: Tue, 6 Jul 2021 01:10:18 +0200
|
||||
Subject: [PATCH] efi: Print an error if boot to firmware setup is not
|
||||
supported
|
||||
|
||||
The "fwsetup" command is only registered if the firmware supports booting
|
||||
to the firmware setup UI. But it could be possible that the GRUB config
|
||||
already contains a "fwsetup" entry, because it was generated in a machine
|
||||
that has support for this feature.
|
||||
|
||||
To prevent users getting a "can't find command `fwsetup`" error if it is
|
||||
not supported by the firmware, let's just always register the command but
|
||||
print a more accurate message if the firmware doesn't support this option.
|
||||
|
||||
Resolves: rhbz#1823864
|
||||
|
||||
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
|
||||
---
|
||||
grub-core/commands/efi/efifwsetup.c | 43 ++++++++++++++++++++-----------------
|
||||
1 file changed, 23 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/grub-core/commands/efi/efifwsetup.c b/grub-core/commands/efi/efifwsetup.c
|
||||
index eaca0328388..328c45e82e0 100644
|
||||
--- a/grub-core/commands/efi/efifwsetup.c
|
||||
+++ b/grub-core/commands/efi/efifwsetup.c
|
||||
@@ -27,6 +27,25 @@
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
+static grub_efi_boolean_t
|
||||
+efifwsetup_is_supported (void)
|
||||
+{
|
||||
+ grub_efi_uint64_t *os_indications_supported = NULL;
|
||||
+ grub_size_t oi_size = 0;
|
||||
+ grub_efi_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID;
|
||||
+
|
||||
+ grub_efi_get_variable ("OsIndicationsSupported", &global, &oi_size,
|
||||
+ (void **) &os_indications_supported);
|
||||
+
|
||||
+ if (!os_indications_supported)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (*os_indications_supported & GRUB_EFI_OS_INDICATIONS_BOOT_TO_FW_UI)
|
||||
+ return 1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static grub_err_t
|
||||
grub_cmd_fwsetup (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc __attribute__ ((unused)),
|
||||
@@ -38,6 +57,10 @@ grub_cmd_fwsetup (grub_command_t cmd __attribute__ ((unused)),
|
||||
grub_size_t oi_size;
|
||||
grub_efi_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID;
|
||||
|
||||
+ if (!efifwsetup_is_supported ())
|
||||
+ return grub_error (GRUB_ERR_INVALID_COMMAND,
|
||||
+ N_("Reboot to firmware setup is not supported"));
|
||||
+
|
||||
grub_efi_get_variable ("OsIndications", &global, &oi_size,
|
||||
(void **) &old_os_indications);
|
||||
|
||||
@@ -56,28 +79,8 @@ grub_cmd_fwsetup (grub_command_t cmd __attribute__ ((unused)),
|
||||
|
||||
static grub_command_t cmd = NULL;
|
||||
|
||||
-static grub_efi_boolean_t
|
||||
-efifwsetup_is_supported (void)
|
||||
-{
|
||||
- grub_efi_uint64_t *os_indications_supported = NULL;
|
||||
- grub_size_t oi_size = 0;
|
||||
- grub_efi_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID;
|
||||
-
|
||||
- grub_efi_get_variable ("OsIndicationsSupported", &global, &oi_size,
|
||||
- (void **) &os_indications_supported);
|
||||
-
|
||||
- if (!os_indications_supported)
|
||||
- return 0;
|
||||
-
|
||||
- if (*os_indications_supported & GRUB_EFI_OS_INDICATIONS_BOOT_TO_FW_UI)
|
||||
- return 1;
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
GRUB_MOD_INIT (efifwsetup)
|
||||
{
|
||||
- if (efifwsetup_is_supported ())
|
||||
cmd = grub_register_command ("fwsetup", grub_cmd_fwsetup, NULL,
|
||||
N_("Reboot into firmware setup menu."));
|
||||
|
||||
@@ -0,0 +1,189 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Date: Mon, 2 Aug 2021 23:10:01 +1000
|
||||
Subject: [PATCH] arm64: Fix EFI loader kernel image allocation
|
||||
|
||||
We are currently allocating just enough memory for the file size,
|
||||
which means that the kernel BSS is in limbo (and not even zeroed).
|
||||
|
||||
We are also not honoring the alignment specified in the image
|
||||
PE header.
|
||||
|
||||
This makes us use the PE optional header in which the kernel puts the
|
||||
actual size it needs, including BSS, and make sure we clear it, and
|
||||
honors the specified alignment for the image.
|
||||
|
||||
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
---
|
||||
grub-core/loader/arm64/linux.c | 100 +++++++++++++++++++++++++++--------------
|
||||
1 file changed, 66 insertions(+), 34 deletions(-)
|
||||
|
||||
diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c
|
||||
index 47f8cf0d84b..4a252d5e7e9 100644
|
||||
--- a/grub-core/loader/arm64/linux.c
|
||||
+++ b/grub-core/loader/arm64/linux.c
|
||||
@@ -41,6 +41,8 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||
static grub_dl_t my_mod;
|
||||
static int loaded;
|
||||
|
||||
+static void *kernel_alloc_addr;
|
||||
+static grub_uint32_t kernel_alloc_pages;
|
||||
static void *kernel_addr;
|
||||
static grub_uint64_t kernel_size;
|
||||
static grub_uint32_t handover_offset;
|
||||
@@ -204,9 +206,8 @@ grub_linux_unload (void)
|
||||
GRUB_EFI_BYTES_TO_PAGES (initrd_end - initrd_start));
|
||||
initrd_start = initrd_end = 0;
|
||||
grub_free (linux_args);
|
||||
- if (kernel_addr)
|
||||
- grub_efi_free_pages ((grub_addr_t) kernel_addr,
|
||||
- GRUB_EFI_BYTES_TO_PAGES (kernel_size));
|
||||
+ if (kernel_alloc_addr)
|
||||
+ grub_efi_free_pages ((grub_addr_t) kernel_alloc_addr, kernel_alloc_pages);
|
||||
grub_fdt_unload ();
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
@@ -311,14 +312,35 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
+static grub_err_t
|
||||
+parse_pe_header (void *kernel, grub_uint64_t *total_size,
|
||||
+ grub_uint32_t *entry_offset,
|
||||
+ grub_uint32_t *alignment)
|
||||
+{
|
||||
+ struct linux_arch_kernel_header *lh = kernel;
|
||||
+ struct grub_armxx_linux_pe_header *pe;
|
||||
+
|
||||
+ pe = (void *)((unsigned long)kernel + lh->hdr_offset);
|
||||
+
|
||||
+ if (pe->opt.magic != GRUB_PE32_PE64_MAGIC)
|
||||
+ return grub_error(GRUB_ERR_BAD_OS, "Invalid PE optional header magic");
|
||||
+
|
||||
+ *total_size = pe->opt.image_size;
|
||||
+ *entry_offset = pe->opt.entry_addr;
|
||||
+ *alignment = pe->opt.section_alignment;
|
||||
+
|
||||
+ return GRUB_ERR_NONE;
|
||||
+}
|
||||
+
|
||||
static grub_err_t
|
||||
grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc, char *argv[])
|
||||
{
|
||||
grub_file_t file = 0;
|
||||
- struct linux_arch_kernel_header lh;
|
||||
- struct grub_armxx_linux_pe_header *pe;
|
||||
grub_err_t err;
|
||||
+ grub_off_t filelen;
|
||||
+ grub_uint32_t align;
|
||||
+ void *kernel = NULL;
|
||||
int rc;
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
@@ -333,40 +355,24 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
if (!file)
|
||||
goto fail;
|
||||
|
||||
- kernel_size = grub_file_size (file);
|
||||
-
|
||||
- if (grub_file_read (file, &lh, sizeof (lh)) < (long) sizeof (lh))
|
||||
- return grub_errno;
|
||||
-
|
||||
- if (grub_arch_efi_linux_check_image (&lh) != GRUB_ERR_NONE)
|
||||
- goto fail;
|
||||
-
|
||||
- grub_loader_unset();
|
||||
-
|
||||
- grub_dprintf ("linux", "kernel file size: %lld\n", (long long) kernel_size);
|
||||
- kernel_addr = grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (kernel_size));
|
||||
- grub_dprintf ("linux", "kernel numpages: %lld\n",
|
||||
- (long long) GRUB_EFI_BYTES_TO_PAGES (kernel_size));
|
||||
- if (!kernel_addr)
|
||||
+ filelen = grub_file_size (file);
|
||||
+ kernel = grub_malloc(filelen);
|
||||
+ if (!kernel)
|
||||
{
|
||||
- grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
|
||||
+ grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("cannot allocate kernel load buffer"));
|
||||
goto fail;
|
||||
}
|
||||
|
||||
- grub_file_seek (file, 0);
|
||||
- if (grub_file_read (file, kernel_addr, kernel_size)
|
||||
- < (grub_int64_t) kernel_size)
|
||||
+ if (grub_file_read (file, kernel, filelen) < (grub_ssize_t)filelen)
|
||||
{
|
||||
- if (!grub_errno)
|
||||
- grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"), argv[0]);
|
||||
+ grub_error (GRUB_ERR_FILE_READ_ERROR, N_("Can't read kernel %s"),
|
||||
+ argv[0]);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
- grub_dprintf ("linux", "kernel @ %p\n", kernel_addr);
|
||||
-
|
||||
if (grub_efi_get_secureboot () == GRUB_EFI_SECUREBOOT_MODE_ENABLED)
|
||||
{
|
||||
- rc = grub_linuxefi_secure_validate (kernel_addr, kernel_size);
|
||||
+ rc = grub_linuxefi_secure_validate (kernel, filelen);
|
||||
if (rc <= 0)
|
||||
{
|
||||
grub_error (GRUB_ERR_INVALID_COMMAND,
|
||||
@@ -375,8 +381,32 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
}
|
||||
}
|
||||
|
||||
- pe = (void *)((unsigned long)kernel_addr + lh.hdr_offset);
|
||||
- handover_offset = pe->opt.entry_addr;
|
||||
+ if (grub_arch_efi_linux_check_image (kernel) != GRUB_ERR_NONE)
|
||||
+ goto fail;
|
||||
+ if (parse_pe_header (kernel, &kernel_size, &handover_offset, &align) != GRUB_ERR_NONE)
|
||||
+ goto fail;
|
||||
+ grub_dprintf ("linux", "kernel mem size : %lld\n", (long long) kernel_size);
|
||||
+ grub_dprintf ("linux", "kernel entry offset : %d\n", handover_offset);
|
||||
+ grub_dprintf ("linux", "kernel alignment : 0x%x\n", align);
|
||||
+
|
||||
+ grub_loader_unset();
|
||||
+
|
||||
+ kernel_alloc_pages = GRUB_EFI_BYTES_TO_PAGES (kernel_size + align - 1);
|
||||
+ kernel_alloc_addr = grub_efi_allocate_any_pages (kernel_alloc_pages);
|
||||
+ grub_dprintf ("linux", "kernel numpages: %d\n", kernel_alloc_pages);
|
||||
+ if (!kernel_alloc_addr)
|
||||
+ {
|
||||
+ grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
|
||||
+ goto fail;
|
||||
+ }
|
||||
+ kernel_addr = (void *)ALIGN_UP((grub_uint64_t)kernel_alloc_addr, align);
|
||||
+
|
||||
+ grub_dprintf ("linux", "kernel @ %p\n", kernel_addr);
|
||||
+ grub_memcpy (kernel_addr, kernel, grub_min(filelen, kernel_size));
|
||||
+ if (kernel_size > filelen)
|
||||
+ grub_memset ((char *)kernel_addr + filelen, 0, kernel_size - filelen);
|
||||
+ grub_free(kernel);
|
||||
+ kernel = NULL;
|
||||
|
||||
cmdline_size = grub_loader_cmdline_size (argc, argv) + sizeof (LINUX_IMAGE);
|
||||
linux_args = grub_malloc (cmdline_size);
|
||||
@@ -400,6 +430,9 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
}
|
||||
|
||||
fail:
|
||||
+ if (kernel)
|
||||
+ grub_free (kernel);
|
||||
+
|
||||
if (file)
|
||||
grub_file_close (file);
|
||||
|
||||
@@ -412,9 +445,8 @@ fail:
|
||||
if (linux_args && !loaded)
|
||||
grub_free (linux_args);
|
||||
|
||||
- if (kernel_addr && !loaded)
|
||||
- grub_efi_free_pages ((grub_addr_t) kernel_addr,
|
||||
- GRUB_EFI_BYTES_TO_PAGES (kernel_size));
|
||||
+ if (kernel_alloc_addr && !loaded)
|
||||
+ grub_efi_free_pages ((grub_addr_t) kernel_alloc_addr, kernel_alloc_pages);
|
||||
|
||||
return grub_errno;
|
||||
}
|
||||
+123
@@ -0,0 +1,123 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Date: Mon, 30 Aug 2021 12:31:18 +0200
|
||||
Subject: [PATCH] normal/main: Discover the device to read the config from as a
|
||||
fallback
|
||||
|
||||
The GRUB core.img is generated locally, when this is done the grub2-probe
|
||||
tool figures out the device and partition that needs to be read to parse
|
||||
the GRUB configuration file.
|
||||
|
||||
But in some cases the core.img can't be generated on the host and instead
|
||||
has to be done at package build time. For example, if needs to get signed
|
||||
with a key that's only available on the package building infrastructure.
|
||||
|
||||
If that's the case, the prefix variable won't have a device and partition
|
||||
but only a directory path. So there's no way for GRUB to know from which
|
||||
device has to read the configuration file.
|
||||
|
||||
To allow GRUB to continue working on that scenario, fallback to iterating
|
||||
over all the available devices, if reading the config failed when using
|
||||
the prefix and fw_path variables.
|
||||
|
||||
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
|
||||
---
|
||||
grub-core/normal/main.c | 58 +++++++++++++++++++++++++++++++++++++++++++------
|
||||
1 file changed, 51 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c
|
||||
index 4ebdbd228d4..b72fe3d653c 100644
|
||||
--- a/grub-core/normal/main.c
|
||||
+++ b/grub-core/normal/main.c
|
||||
@@ -337,18 +337,13 @@ grub_enter_normal_mode (const char *config)
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
-grub_try_normal (const char *variable)
|
||||
+grub_try_normal_prefix (const char *prefix)
|
||||
{
|
||||
char *config;
|
||||
- const char *prefix;
|
||||
grub_err_t err = GRUB_ERR_FILE_NOT_FOUND;
|
||||
const char *net_search_cfg;
|
||||
int disable_net_search = 0;
|
||||
|
||||
- prefix = grub_env_get (variable);
|
||||
- if (!prefix)
|
||||
- return GRUB_ERR_FILE_NOT_FOUND;
|
||||
-
|
||||
net_search_cfg = grub_env_get ("feature_net_search_cfg");
|
||||
if (net_search_cfg && net_search_cfg[0] == 'n')
|
||||
disable_net_search = 1;
|
||||
@@ -362,7 +357,7 @@ grub_try_normal (const char *variable)
|
||||
config = grub_malloc (config_len);
|
||||
|
||||
if (! config)
|
||||
- return GRUB_ERR_FILE_NOT_FOUND;
|
||||
+ return err;
|
||||
|
||||
grub_snprintf (config, config_len, "%s/grub.cfg", prefix);
|
||||
err = grub_net_search_config_file (config);
|
||||
@@ -391,6 +386,53 @@ grub_try_normal (const char *variable)
|
||||
return err;
|
||||
}
|
||||
|
||||
+static int
|
||||
+grub_try_normal_dev (const char *name, void *data)
|
||||
+{
|
||||
+ grub_err_t err;
|
||||
+ const char *prefix = grub_xasprintf ("(%s)%s", name, (char *)data);
|
||||
+
|
||||
+ if (!prefix)
|
||||
+ return 0;
|
||||
+
|
||||
+ err = grub_try_normal_prefix (prefix);
|
||||
+ if (err == GRUB_ERR_NONE)
|
||||
+ return 1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static grub_err_t
|
||||
+grub_try_normal_discover (void)
|
||||
+{
|
||||
+ char *prefix = grub_env_get ("prefix");
|
||||
+ grub_err_t err = GRUB_ERR_FILE_NOT_FOUND;
|
||||
+
|
||||
+ if (!prefix)
|
||||
+ return err;
|
||||
+
|
||||
+ if (grub_device_iterate (grub_try_normal_dev, (void *)prefix))
|
||||
+ return GRUB_ERR_NONE;
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static grub_err_t
|
||||
+grub_try_normal (const char *variable)
|
||||
+{
|
||||
+ grub_err_t err = GRUB_ERR_FILE_NOT_FOUND;
|
||||
+ const char *prefix;
|
||||
+
|
||||
+ if (!variable)
|
||||
+ return err;
|
||||
+
|
||||
+ prefix = grub_env_get (variable);
|
||||
+ if (!prefix)
|
||||
+ return err;
|
||||
+
|
||||
+ return grub_try_normal_prefix (prefix);
|
||||
+}
|
||||
+
|
||||
/* Enter normal mode from rescue mode. */
|
||||
static grub_err_t
|
||||
grub_cmd_normal (struct grub_command *cmd __attribute__ ((unused)),
|
||||
@@ -405,6 +447,8 @@ grub_cmd_normal (struct grub_command *cmd __attribute__ ((unused)),
|
||||
err = grub_try_normal ("fw_path");
|
||||
if (err == GRUB_ERR_FILE_NOT_FOUND)
|
||||
err = grub_try_normal ("prefix");
|
||||
+ if (err == GRUB_ERR_FILE_NOT_FOUND)
|
||||
+ err = grub_try_normal_discover ();
|
||||
if (err == GRUB_ERR_FILE_NOT_FOUND)
|
||||
grub_enter_normal_mode (0);
|
||||
}
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Axtens <dja@axtens.net>
|
||||
Date: Mon, 19 Jul 2021 14:35:55 +1000
|
||||
Subject: [PATCH] powerpc: adjust setting of prefix for signed binary case
|
||||
|
||||
On RHEL-signed powerpc grub, we sign a grub with -p /grub2 and expect
|
||||
that there's a boot partition.
|
||||
|
||||
Unfortunately grub_set_prefix_and_root tries to convert this to
|
||||
($fwdevice)/grub2. This ends up being (ieee1275/disk)/grub2 and that
|
||||
falls apart pretty quickly - there's no file-system on ieee1275/disk,
|
||||
and it makes the search routine try things like
|
||||
(ieee1275/disk,msdos2)(ieee1275/disk)/grub2 which also doesn't work.
|
||||
|
||||
Detect if we would be about to create (ieee1275/disk)/path and don't:
|
||||
preserve a prefix of /path instead and hope the search later finds us.
|
||||
|
||||
Related: rhbz#1899864
|
||||
|
||||
Signed-off-by: Daniel Axtens <dja@axtens.net>
|
||||
---
|
||||
grub-core/kern/main.c | 38 +++++++++++++++++++++++++++++++++-----
|
||||
1 file changed, 33 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/main.c b/grub-core/kern/main.c
|
||||
index b573be6650d..58d35be253f 100644
|
||||
--- a/grub-core/kern/main.c
|
||||
+++ b/grub-core/kern/main.c
|
||||
@@ -216,13 +216,41 @@ grub_set_prefix_and_root (void)
|
||||
if (device)
|
||||
{
|
||||
char *prefix_set;
|
||||
-
|
||||
- prefix_set = grub_xasprintf ("(%s)%s", device, path ? : "");
|
||||
- if (prefix_set)
|
||||
+
|
||||
+#ifdef __powerpc__
|
||||
+ /* We have to be careful here on powerpc-ieee1275 + signed grub. We
|
||||
+ will have signed something with a prefix that doesn't have a device
|
||||
+ because we cannot know in advance what partition we're on.
|
||||
+
|
||||
+ We will have had !device earlier, so we will have set device=fwdevice
|
||||
+ However, we want to make sure we do not end up setting prefix to be
|
||||
+ ($fwdevice)/path, because we will then end up trying to boot or search
|
||||
+ based on a prefix of (ieee1275/disk)/path, which will not work because
|
||||
+ it's missing a partition.
|
||||
+
|
||||
+ Also:
|
||||
+ - You can end up with a device with an FS directly on it, without
|
||||
+ a partition, e.g. ieee1275/cdrom.
|
||||
+
|
||||
+ - powerpc-ieee1275 + grub-install sets e.g. prefix=(,gpt2)/path,
|
||||
+ which will have now been extended to device=$fwdisk,partition
|
||||
+ and path=/path
|
||||
+
|
||||
+ So we only need to act if device = ieee1275/disk exactly.
|
||||
+ */
|
||||
+ if (grub_strncmp (device, "ieee1275/disk", 14) == 0)
|
||||
+ grub_env_set ("prefix", path);
|
||||
+ else
|
||||
+#endif
|
||||
{
|
||||
- grub_env_set ("prefix", prefix_set);
|
||||
- grub_free (prefix_set);
|
||||
+ prefix_set = grub_xasprintf ("(%s)%s", device, path ? : "");
|
||||
+ if (prefix_set)
|
||||
+ {
|
||||
+ grub_env_set ("prefix", prefix_set);
|
||||
+ grub_free (prefix_set);
|
||||
+ }
|
||||
}
|
||||
+
|
||||
grub_env_set ("root", device);
|
||||
}
|
||||
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Axtens <dja@axtens.net>
|
||||
Date: Mon, 16 Aug 2021 16:01:47 +1000
|
||||
Subject: [PATCH] powerpc: fix prefix + signed grub special case for PowerVM
|
||||
|
||||
Mea culpa: when testing the PowerPC special case for signed grub, I
|
||||
assumed qemu and PowerVM would behave identically. This was wrong, and
|
||||
with hindsight a pretty dumb error.
|
||||
|
||||
This fixes it. This time, I am actually testing on PowerVM.
|
||||
|
||||
Signed-off-by: Daniel Axtens <dja@axtens.net>
|
||||
---
|
||||
grub-core/kern/main.c | 15 +++++++++++++--
|
||||
1 file changed, 13 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/main.c b/grub-core/kern/main.c
|
||||
index 58d35be253f..3fc34014726 100644
|
||||
--- a/grub-core/kern/main.c
|
||||
+++ b/grub-core/kern/main.c
|
||||
@@ -236,9 +236,20 @@ grub_set_prefix_and_root (void)
|
||||
which will have now been extended to device=$fwdisk,partition
|
||||
and path=/path
|
||||
|
||||
- So we only need to act if device = ieee1275/disk exactly.
|
||||
+ - PowerVM will give us device names like
|
||||
+ ieee1275//vdevice/v-scsi@3000006c/disk@8100000000000000
|
||||
+ and we don't want to try to encode some sort of truth table about
|
||||
+ what sorts of paths represent disks with partition tables and those
|
||||
+ without partition tables.
|
||||
+
|
||||
+ So we act unless there is a comma in the device, which would indicate
|
||||
+ a partition has already been specified.
|
||||
+
|
||||
+ (If we only have a path, the code in normal to discover config files
|
||||
+ will try both without partitions and then with any partitions so we
|
||||
+ will cover both CDs and HDs.)
|
||||
*/
|
||||
- if (grub_strncmp (device, "ieee1275/disk", 14) == 0)
|
||||
+ if (grub_strchr (device, ',') == NULL)
|
||||
grub_env_set ("prefix", path);
|
||||
else
|
||||
#endif
|
||||
@@ -0,0 +1,63 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Jones <pjones@redhat.com>
|
||||
Date: Thu, 9 Sep 2021 10:59:28 -0400
|
||||
Subject: [PATCH] Arm: check for the PE magic for the compiled arch
|
||||
|
||||
In "arm64: Fix EFI loader kernel image allocation", Ben fixed the kernel
|
||||
alignment to match the alignment given in the PE header. In doing so, a
|
||||
check for valid PE magic was added, which was hard-coded to the value
|
||||
seen on Aarch64 (GRUB_PE32_PE64_MAGIC).
|
||||
|
||||
Unfortunately, this code is shared between 64-bit and 32-bit, and so
|
||||
that value broke 32-bit Arm systems.
|
||||
|
||||
This patch adds a constant definition for GRUB_PE32_PEXX_MAGIC, which is
|
||||
either GRUB_PE32_PE64_MAGIC or GRUB_PE32_PE32_MAGIC, depending on which
|
||||
platform is being built, and uses it in the header magic check.
|
||||
|
||||
Resolves: rhbz#2000756
|
||||
|
||||
Signed-off-by: Peter Jones <pjones@redhat.com>
|
||||
---
|
||||
grub-core/loader/arm64/linux.c | 2 +-
|
||||
include/grub/arm/linux.h | 1 +
|
||||
include/grub/arm64/linux.h | 1 +
|
||||
3 files changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c
|
||||
index 4a252d5e7e9..f18d90bd749 100644
|
||||
--- a/grub-core/loader/arm64/linux.c
|
||||
+++ b/grub-core/loader/arm64/linux.c
|
||||
@@ -322,7 +322,7 @@ parse_pe_header (void *kernel, grub_uint64_t *total_size,
|
||||
|
||||
pe = (void *)((unsigned long)kernel + lh->hdr_offset);
|
||||
|
||||
- if (pe->opt.magic != GRUB_PE32_PE64_MAGIC)
|
||||
+ if (pe->opt.magic != GRUB_PE32_PEXX_MAGIC)
|
||||
return grub_error(GRUB_ERR_BAD_OS, "Invalid PE optional header magic");
|
||||
|
||||
*total_size = pe->opt.image_size;
|
||||
diff --git a/include/grub/arm/linux.h b/include/grub/arm/linux.h
|
||||
index b582f67f661..966a5074f53 100644
|
||||
--- a/include/grub/arm/linux.h
|
||||
+++ b/include/grub/arm/linux.h
|
||||
@@ -44,6 +44,7 @@ struct grub_arm_linux_pe_header
|
||||
|
||||
#if defined(__arm__)
|
||||
# define GRUB_LINUX_ARMXX_MAGIC_SIGNATURE GRUB_LINUX_ARM_MAGIC_SIGNATURE
|
||||
+# define GRUB_PE32_PEXX_MAGIC GRUB_PE32_PE32_MAGIC
|
||||
# define linux_arch_kernel_header linux_arm_kernel_header
|
||||
# define grub_armxx_linux_pe_header grub_arm_linux_pe_header
|
||||
#endif
|
||||
diff --git a/include/grub/arm64/linux.h b/include/grub/arm64/linux.h
|
||||
index ea030312df3..422bf2bf24b 100644
|
||||
--- a/include/grub/arm64/linux.h
|
||||
+++ b/include/grub/arm64/linux.h
|
||||
@@ -48,6 +48,7 @@ struct grub_arm64_linux_pe_header
|
||||
|
||||
#if defined(__aarch64__)
|
||||
# define GRUB_LINUX_ARMXX_MAGIC_SIGNATURE GRUB_LINUX_ARM64_MAGIC_SIGNATURE
|
||||
+# define GRUB_PE32_PEXX_MAGIC GRUB_PE32_PE64_MAGIC
|
||||
# define linux_arch_kernel_header linux_arm64_kernel_header
|
||||
# define grub_armxx_linux_pe_header grub_arm64_linux_pe_header
|
||||
#endif
|
||||
+118
@@ -0,0 +1,118 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Erwan Velu <erwanaliasr1@gmail.com>
|
||||
Date: Wed, 25 Aug 2021 15:31:52 +0200
|
||||
Subject: [PATCH] fs/xfs: Fix unreadable filesystem with v4 superblock
|
||||
|
||||
The commit 8b1e5d193 (fs/xfs: Add bigtime incompat feature support)
|
||||
introduced the bigtime support by adding some features in v3 inodes.
|
||||
This change extended grub_xfs_inode struct by 76 bytes but also changed
|
||||
the computation of XFS_V2_INODE_SIZE and XFS_V3_INODE_SIZE. Prior this
|
||||
commit, XFS_V2_INODE_SIZE was 100 bytes. After the commit it's 84 bytes
|
||||
XFS_V2_INODE_SIZE becomes 16 bytes too small.
|
||||
|
||||
As a result, the data structures aren't properly aligned and the GRUB
|
||||
generates "attempt to read or write outside of partition" errors when
|
||||
trying to read the XFS filesystem:
|
||||
|
||||
GNU GRUB version 2.11
|
||||
....
|
||||
grub> set debug=efi,gpt,xfs
|
||||
grub> insmod part_gpt
|
||||
grub> ls (hd0,gpt1)/
|
||||
partmap/gpt.c:93: Read a valid GPT header
|
||||
partmap/gpt.c:115: GPT entry 0: start=4096, length=1953125
|
||||
fs/xfs.c:931: Reading sb
|
||||
fs/xfs.c:270: Validating superblock
|
||||
fs/xfs.c:295: XFS v4 superblock detected
|
||||
fs/xfs.c:962: Reading root ino 128
|
||||
fs/xfs.c:515: Reading inode (128) - 64, 0
|
||||
fs/xfs.c:515: Reading inode (739521961424144223) - 344365866970255880, 3840
|
||||
error: attempt to read or write outside of partition.
|
||||
|
||||
This commit change the XFS_V2_INODE_SIZE computation by subtracting 76
|
||||
bytes instead of 92 bytes from the actual size of grub_xfs_inode struct.
|
||||
This 76 bytes value comes from added members:
|
||||
20 grub_uint8_t unused5
|
||||
1 grub_uint64_t flags2
|
||||
48 grub_uint8_t unused6
|
||||
|
||||
This patch explicitly splits the v2 and v3 parts of the structure.
|
||||
The unused4 is still ending of the v2 structures and the v3 starts
|
||||
at unused5. Thanks to this we will avoid future corruptions of v2
|
||||
or v3 inodes.
|
||||
|
||||
The XFS_V2_INODE_SIZE is returning to its expected size and the
|
||||
filesystem is back to a readable state:
|
||||
|
||||
GNU GRUB version 2.11
|
||||
....
|
||||
grub> set debug=efi,gpt,xfs
|
||||
grub> insmod part_gpt
|
||||
grub> ls (hd0,gpt1)/
|
||||
partmap/gpt.c:93: Read a valid GPT header
|
||||
partmap/gpt.c:115: GPT entry 0: start=4096, length=1953125
|
||||
fs/xfs.c:931: Reading sb
|
||||
fs/xfs.c:270: Validating superblock
|
||||
fs/xfs.c:295: XFS v4 superblock detected
|
||||
fs/xfs.c:962: Reading root ino 128
|
||||
fs/xfs.c:515: Reading inode (128) - 64, 0
|
||||
fs/xfs.c:515: Reading inode (128) - 64, 0
|
||||
fs/xfs.c:931: Reading sb
|
||||
fs/xfs.c:270: Validating superblock
|
||||
fs/xfs.c:295: XFS v4 superblock detected
|
||||
fs/xfs.c:962: Reading root ino 128
|
||||
fs/xfs.c:515: Reading inode (128) - 64, 0
|
||||
fs/xfs.c:515: Reading inode (128) - 64, 0
|
||||
fs/xfs.c:515: Reading inode (128) - 64, 0
|
||||
fs/xfs.c:515: Reading inode (131) - 64, 768
|
||||
efi/ fs/xfs.c:515: Reading inode (3145856) - 1464904, 0
|
||||
grub2/ fs/xfs.c:515: Reading inode (132) - 64, 1024
|
||||
grub/ fs/xfs.c:515: Reading inode (139) - 64, 2816
|
||||
grub>
|
||||
|
||||
Fixes: 8b1e5d193 (fs/xfs: Add bigtime incompat feature support)
|
||||
|
||||
Signed-off-by: Erwan Velu <e.velu@criteo.com>
|
||||
Tested-by: Carlos Maiolino <cmaiolino@redhat.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
(cherry picked from commit a4b495520e4dc41a896a8b916a64eda9970c50ea)
|
||||
---
|
||||
grub-core/fs/xfs.c | 14 ++++++++++----
|
||||
1 file changed, 10 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/grub-core/fs/xfs.c b/grub-core/fs/xfs.c
|
||||
index 0f524c3a8a6..e3816d1ec4a 100644
|
||||
--- a/grub-core/fs/xfs.c
|
||||
+++ b/grub-core/fs/xfs.c
|
||||
@@ -192,6 +192,11 @@ struct grub_xfs_time_legacy
|
||||
grub_uint32_t nanosec;
|
||||
} GRUB_PACKED;
|
||||
|
||||
+/*
|
||||
+ * The struct grub_xfs_inode layout was taken from the
|
||||
+ * struct xfs_dinode_core which is described here:
|
||||
+ * https://mirrors.edge.kernel.org/pub/linux/utils/fs/xfs/docs/xfs_filesystem_structure.pdf
|
||||
+ */
|
||||
struct grub_xfs_inode
|
||||
{
|
||||
grub_uint8_t magic[2];
|
||||
@@ -208,14 +213,15 @@ struct grub_xfs_inode
|
||||
grub_uint32_t nextents;
|
||||
grub_uint16_t unused3;
|
||||
grub_uint8_t fork_offset;
|
||||
- grub_uint8_t unused4[37];
|
||||
+ grub_uint8_t unused4[17]; /* Last member of inode v2. */
|
||||
+ grub_uint8_t unused5[20]; /* First member of inode v3. */
|
||||
grub_uint64_t flags2;
|
||||
- grub_uint8_t unused5[48];
|
||||
+ grub_uint8_t unused6[48]; /* Last member of inode v3. */
|
||||
} GRUB_PACKED;
|
||||
|
||||
#define XFS_V3_INODE_SIZE sizeof(struct grub_xfs_inode)
|
||||
-/* Size of struct grub_xfs_inode until fork_offset (included). */
|
||||
-#define XFS_V2_INODE_SIZE (XFS_V3_INODE_SIZE - 92)
|
||||
+/* Size of struct grub_xfs_inode v2, up to unused4 member included. */
|
||||
+#define XFS_V2_INODE_SIZE (XFS_V3_INODE_SIZE - 76)
|
||||
|
||||
struct grub_xfs_dirblock_tail
|
||||
{
|
||||
@@ -0,0 +1,48 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Robbie Harwood <rharwood@redhat.com>
|
||||
Date: Tue, 12 Oct 2021 12:34:23 -0400
|
||||
Subject: [PATCH] Print module name on license check failure
|
||||
|
||||
At the very least, this will make it easier to track down the problem
|
||||
module - or, if something else has gone wrong, provide more information
|
||||
for debugging.
|
||||
|
||||
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
|
||||
---
|
||||
grub-core/kern/dl.c | 10 ++++++----
|
||||
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/dl.c b/grub-core/kern/dl.c
|
||||
index 9557254035e..f3044945742 100644
|
||||
--- a/grub-core/kern/dl.c
|
||||
+++ b/grub-core/kern/dl.c
|
||||
@@ -528,14 +528,16 @@ grub_dl_find_section_index (Elf_Ehdr *e, const char *name)
|
||||
Be sure to understand your license obligations.
|
||||
*/
|
||||
static grub_err_t
|
||||
-grub_dl_check_license (Elf_Ehdr *e)
|
||||
+grub_dl_check_license (grub_dl_t mod, Elf_Ehdr *e)
|
||||
{
|
||||
Elf_Shdr *s = grub_dl_find_section (e, ".module_license");
|
||||
if (s && (grub_strcmp ((char *) e + s->sh_offset, "LICENSE=GPLv3") == 0
|
||||
|| grub_strcmp ((char *) e + s->sh_offset, "LICENSE=GPLv3+") == 0
|
||||
|| grub_strcmp ((char *) e + s->sh_offset, "LICENSE=GPLv2+") == 0))
|
||||
return GRUB_ERR_NONE;
|
||||
- return grub_error (GRUB_ERR_BAD_MODULE, "incompatible license");
|
||||
+ return grub_error (GRUB_ERR_BAD_MODULE,
|
||||
+ "incompatible license in module %s: %s", mod->name,
|
||||
+ (char *) e + s->sh_offset);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
@@ -743,8 +745,8 @@ grub_dl_load_core_noinit (void *addr, grub_size_t size)
|
||||
constitutes linking) and GRUB core being licensed under GPLv3+.
|
||||
Be sure to understand your license obligations.
|
||||
*/
|
||||
- if (grub_dl_check_license (e)
|
||||
- || grub_dl_resolve_name (mod, e)
|
||||
+ if (grub_dl_resolve_name (mod, e)
|
||||
+ || grub_dl_check_license (mod, e)
|
||||
|| grub_dl_resolve_dependencies (mod, e)
|
||||
|| grub_dl_load_segments (mod, e)
|
||||
|| grub_dl_resolve_symbols (mod, e)
|
||||
@@ -0,0 +1,106 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Axtens <dja@axtens.net>
|
||||
Date: Fri, 22 Oct 2021 09:53:15 +1100
|
||||
Subject: [PATCH] powerpc-ieee1275: load grub at 4MB, not 2MB
|
||||
|
||||
This was first reported under PFW but reproduces under SLOF.
|
||||
|
||||
- The core.elf was 2126152 = 0x207148 bytes in size with the following
|
||||
program headers (per readelf):
|
||||
|
||||
Entry point 0x200000
|
||||
There are 4 program headers, starting at offset 52
|
||||
|
||||
Program Headers:
|
||||
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
|
||||
LOAD 0x000160 0x00200000 0x00200000 0x21f98 0x2971c RWE 0x8
|
||||
GNU_STACK 0x0220f8 0x00000000 0x00000000 0x00000 0x00000 RWE 0x4
|
||||
LOAD 0x0220f8 0x00232000 0x00232000 0x1e4e50 0x1e4e50 RWE 0x4
|
||||
NOTE 0x206f48 0x00000000 0x00000000 0x00200 0x00000 R 0x4
|
||||
|
||||
- SLOF places the ELF file at 0x4000 (after the reserved space for
|
||||
interrupt handlers etc.) upwards. The image was 2126152 = 0x207148
|
||||
bytes in size, so it runs from 0x4000 - 0x20b148. We'll call 0x4000 the
|
||||
load address.
|
||||
|
||||
0x0 0x4000 0x20b148
|
||||
|----------|--------------|
|
||||
| reserved | ELF contents |
|
||||
|
||||
- SLOF then copies the first LOAD program header (for .text). That runs
|
||||
for 0x21f98 bytes. It runs from
|
||||
(load addr + 0x160) to (load addr + 0x160 + 0x21f98)
|
||||
= 0x4160 to 0x260f8
|
||||
and we copy it to 0x200000 to 0x221f98. This overwrites the end of the
|
||||
image:
|
||||
|
||||
0x0 0x4000 0x200000 0x221f98
|
||||
|----------|------------|---------------|
|
||||
| reserved | ELF cont.. | .text section |
|
||||
|
||||
- SLOF zeros the bss up to PhysAddr + MemSize = 0x22971c
|
||||
|
||||
0x0 0x4000 0x200000 0x221f98 0x22971c
|
||||
|----------|------------|---------------|--------|
|
||||
| reserved | ELF cont.. | .text section | bss 0s |
|
||||
|
||||
- SLOF then goes to fulfil the next LOAD header (for mods), which is
|
||||
for 0x1e4e50 bytes. We copy from
|
||||
(load addr + 0x220f8) to (load addr + 0x220f8 + 0x1e4e50)
|
||||
= 0x260f8 to 0x20af48
|
||||
and we copy it to 0x232000 to 0x416e50:
|
||||
|
||||
0x0 0x4000 0x200000 0x221f98 0x22971c
|
||||
|----------|------------|---------------|--------|
|
||||
| reserved | ELF cont.. | .text section | bss 0s |
|
||||
|-------------|
|
||||
| copied area |
|
||||
0x260f8 0x20af48
|
||||
|
||||
This goes poorly:
|
||||
|
||||
0x0 0x4000 0x200000 0x221f98 0x22971c 0x232000 0x40bf08 0x416e50
|
||||
|----------|------------|---------------|--------|-----|-----------|-------------|
|
||||
| reserved | ELF cont.. | .text section | bss 0s | pad | some mods | .text start |
|
||||
|
||||
This matches the observations on the running system - 0x40bf08 was where
|
||||
the contents of memory no longer matched the contents of the ELF file.
|
||||
|
||||
This was reported as a license verification failure on SLOF as the
|
||||
last module's .module_license section fell past where the corruption
|
||||
began.
|
||||
|
||||
Signed-off-by: Daniel Axtens <dja@axtens.net>
|
||||
[rharwood@redhat.com: trim very detailed commit message]
|
||||
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
|
||||
---
|
||||
grub-core/Makefile.core.def | 2 +-
|
||||
include/grub/offsets.h | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
|
||||
index 3f3459b2c70..6b00eb55575 100644
|
||||
--- a/grub-core/Makefile.core.def
|
||||
+++ b/grub-core/Makefile.core.def
|
||||
@@ -89,7 +89,7 @@ kernel = {
|
||||
i386_xen_pvh_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x100000';
|
||||
|
||||
mips_loongson_ldflags = '-Wl,-Ttext,0x80200000';
|
||||
- powerpc_ieee1275_ldflags = '-Wl,-Ttext,0x200000';
|
||||
+ powerpc_ieee1275_ldflags = '-Wl,-Ttext,0x400000';
|
||||
sparc64_ieee1275_ldflags = '-Wl,-Ttext,0x4400';
|
||||
mips_arc_ldflags = '-Wl,-Ttext,$(TARGET_LINK_ADDR)';
|
||||
mips_qemu_mips_ldflags = '-Wl,-Ttext,0x80200000';
|
||||
diff --git a/include/grub/offsets.h b/include/grub/offsets.h
|
||||
index 871e1cd4c38..69211aa798b 100644
|
||||
--- a/include/grub/offsets.h
|
||||
+++ b/include/grub/offsets.h
|
||||
@@ -63,7 +63,7 @@
|
||||
#define GRUB_KERNEL_SPARC64_IEEE1275_LINK_ADDR 0x4400
|
||||
|
||||
#define GRUB_KERNEL_POWERPC_IEEE1275_LINK_ALIGN 4
|
||||
-#define GRUB_KERNEL_POWERPC_IEEE1275_LINK_ADDR 0x200000
|
||||
+#define GRUB_KERNEL_POWERPC_IEEE1275_LINK_ADDR 0x400000
|
||||
|
||||
#define GRUB_KERNEL_MIPS_LOONGSON_LINK_ADDR 0x80200000
|
||||
|
||||
@@ -7,24 +7,22 @@ Subject: [PATCH] 00_header: add GRUB_COLOR_* variables
|
||||
util/grub.d/00_header.in | 8 ++++++++
|
||||
2 files changed, 10 insertions(+)
|
||||
|
||||
diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in
|
||||
index f8cbb8d7a..1189d95f9 100644
|
||||
--- a/util/grub-mkconfig.in
|
||||
+++ b/util/grub-mkconfig.in
|
||||
@@ -246,6 +246,8 @@ export GRUB_DEFAULT \
|
||||
diff -Nuar a/util/grub-mkconfig.in b/util/grub-mkconfig.in
|
||||
--- a/util/grub-mkconfig.in 2021-11-05 18:53:16.118969000 +0300
|
||||
+++ b/util/grub-mkconfig.in 2021-11-05 20:03:25.603871159 +0300
|
||||
@@ -243,6 +243,8 @@
|
||||
GRUB_BACKGROUND \
|
||||
GRUB_THEME \
|
||||
GRUB_GFXPAYLOAD_LINUX \
|
||||
+ GRUB_COLOR_NORMAL \
|
||||
+ GRUB_COLOR_HIGHLIGHT \
|
||||
GRUB_DISABLE_OS_PROBER \
|
||||
GRUB_INIT_TUNE \
|
||||
GRUB_SAVEDEFAULT \
|
||||
GRUB_ENABLE_CRYPTODISK \
|
||||
diff --git a/util/grub.d/00_header.in b/util/grub.d/00_header.in
|
||||
index 93a90233e..c5955df00 100644
|
||||
--- a/util/grub.d/00_header.in
|
||||
+++ b/util/grub.d/00_header.in
|
||||
@@ -125,6 +125,14 @@ cat <<EOF
|
||||
diff -Nuar a/util/grub.d/00_header.in b/util/grub.d/00_header.in
|
||||
--- a/util/grub.d/00_header.in 2021-11-05 18:53:15.816969000 +0300
|
||||
+++ b/util/grub.d/00_header.in 2021-11-05 20:06:00.698859968 +0300
|
||||
@@ -125,6 +125,14 @@
|
||||
|
||||
EOF
|
||||
|
||||
@@ -39,3 +37,4 @@ index 93a90233e..c5955df00 100644
|
||||
serial=0;
|
||||
gfxterm=0;
|
||||
for x in ${GRUB_TERMINAL_INPUT} ${GRUB_TERMINAL_OUTPUT}; do
|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
--- grub-2.02~beta2.orig/util/grub.d/10_linux.in 2013-12-24 18:45:34.000000000 +0200
|
||||
+++ grub-2.02~beta2/util/grub.d/10_linux.in 2016-04-28 19:10:54.268739535 +0300
|
||||
diff -Nuar a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
|
||||
--- a/util/grub.d/10_linux.in 2021-11-02 18:53:12.000000000 +0300
|
||||
+++ b/util/grub.d/10_linux.in 2021-11-05 17:31:18.256241704 +0300
|
||||
@@ -29,7 +29,13 @@
|
||||
CLASS="--class gnu-linux --class gnu --class os"
|
||||
|
||||
|
||||
if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
|
||||
- OS=GNU/Linux
|
||||
+ if [ -f "/etc/pisilinux-release" ] ; then
|
||||
@@ -15,9 +16,9 @@
|
||||
else
|
||||
OS="${GRUB_DISTRIBUTOR} GNU/Linux"
|
||||
CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}"
|
||||
@@ -186,7 +192,8 @@
|
||||
|
||||
initrd=
|
||||
@@ -216,7 +222,8 @@
|
||||
|
||||
initrd_real=
|
||||
for i in "initrd.img-${version}" "initrd-${version}.img" "initrd-${version}.gz" \
|
||||
- "initrd-${version}" "initramfs-${version}.img" \
|
||||
+ "initrd-${version}" "initramfs-${version}.img" "initramfs-fallback-${version}.img"\
|
||||
|
||||
@@ -12,12 +12,13 @@
|
||||
<IsA>app:gui</IsA>
|
||||
<Summary>GNU GRUB is a Multiboot boot loader.</Summary>
|
||||
<Description>GNU GRUB (short for GNU GRand Unified Bootloader) is a boot loader package from the GNU Project.</Description>
|
||||
<Archive sha1sum="c9f93f1e195ec7a5a21d36a13b469788c0b29f0f" type="tarxz">http://ftp.gnu.org/gnu/grub/grub-2.06.tar.xz</Archive>
|
||||
<Archive sha1sum="aa62465ad119a328662af87c969a3e7ca1f81e1d" type="zip">https://sourceforge.net/projects/pisilinux/files/source/grub-2.06.zip</Archive>
|
||||
<!-- <Archive sha1sum="4ec712aced1c2b4cb6cd1cbd83fc2154249d6977" type="tarxz" target="grub-2.06/grub-extras">https://sourceforge.net/projects/pisilinux/files/source/grub2_extras_915resolution_r10.tar.xz</Archive> -->
|
||||
<Archive sha1sum="c22f624573ee2c81c54324943e4d6c4a3a8b5cdc" type="gz">https://ftp.gnu.org/gnu/unifont/unifont-13.0.06/unifont-13.0.06.bdf.gz</Archive>
|
||||
<!-- <Archive sha1sum="30797ba7a86fc32213b9ae994c9fa45f37d01170" type="gz">http://ftp.gnu.org/gnu/unifont/unifont-6.3.20131217/unifont-6.3.20131217.bdf.gz</Archive> -->
|
||||
<Archive sha1sum="2977a0150526f3a13b116be8ae2ac5cbe9760f98" type="targz" target="grub-2.06/themes">https://github.com/sebo28/Vimix/archive/v0.1.tar.gz</Archive>
|
||||
<BuildDependencies>
|
||||
<Dependency>git</Dependency>
|
||||
<Dependency>autogen</Dependency>
|
||||
<Dependency>binutils</Dependency>
|
||||
<Dependency>bison</Dependency>
|
||||
@@ -43,13 +44,27 @@
|
||||
<Package>grub</Package>
|
||||
</Replaces>
|
||||
<Patches>
|
||||
<Patch level="1">gfxpayload.patch</Patch>
|
||||
<Patch level="1">grub-2.02_beta2-KERNEL_GLOBS.patch</Patch>
|
||||
<Patch level="1">mkconfig-fix.patch</Patch>
|
||||
<Patch level="1">pisi_name_and_initramfs.patch</Patch>
|
||||
<Patch level="1">gfxpayload.patch</Patch> -->
|
||||
<Patch level="1">grub-2.02_beta2-KERNEL_GLOBS.patch</Patch> -->
|
||||
<!-- <Patch level="1">mkconfig-fix.patch</Patch> -->
|
||||
<Patch>pisi_name_and_initramfs.patch</Patch>
|
||||
|
||||
<Patch level="1">grub-2.06-test-words.patch</Patch>
|
||||
<Patch level="1">grub-mkconfig_lib.patch</Patch>
|
||||
<!-- <Patch level="1">grub-mkconfig_lib.patch</Patch> -->
|
||||
|
||||
<Patch level="1">0001-Revert-templates-Fix-user-facing-typo-with-an-incorr.patch</Patch>
|
||||
<Patch level="1">0002-Revert-templates-Properly-disable-the-os-prober-by-d.patch</Patch>
|
||||
<Patch level="1">0003-Revert-templates-Disable-the-os-prober-by-default.patch</Patch>
|
||||
<Patch level="1">0202-templates-Check-for-EFI-at-runtime-instead-of-config.patch</Patch>
|
||||
<Patch level="1">0203-efi-Print-an-error-if-boot-to-firmware-setup-is-not-.patch</Patch>
|
||||
<!-- <Patch level="1">0204-arm64-Fix-EFI-loader-kernel-image-allocation.patch</Patch> -->
|
||||
<!-- <Patch level="1">0205-normal-main-Discover-the-device-to-read-the-config-f.patch</Patch> -->
|
||||
<Patch level="1">0206-powerpc-adjust-setting-of-prefix-for-signed-binary-c.patch</Patch>
|
||||
<Patch level="1">0207-powerpc-fix-prefix-signed-grub-special-case-for-Powe.patch</Patch>
|
||||
<!-- <Patch level="1">0208-Arm-check-for-the-PE-magic-for-the-compiled-arch.patch</Patch> -->
|
||||
<!-- <Patch level="1">0209-fs-xfs-Fix-unreadable-filesystem-with-v4-superblock.patch</Patch> -->
|
||||
<!-- <Patch level="1">0210-Print-module-name-on-license-check-failure.patch</Patch> -->
|
||||
<Patch level="1">0211-powerpc-ieee1275-load-grub-at-4MB-not-2MB.patch</Patch>
|
||||
<!-- <Patch level="1">Allow_GRUB_to_mount_ext234_filesystems_that_have_the_encryption_feature.patch</Patch> -->
|
||||
<!-- <Patch level="1">tsc-Change-default-tsc-calibration-method-to-pmtimer-on-EFI-systems.patch</Patch> -->
|
||||
<!-- <Patch level="1">intel-ucode.patch</Patch> -->
|
||||
@@ -95,6 +110,13 @@
|
||||
</Package>
|
||||
|
||||
<History>
|
||||
<Update release="22">
|
||||
<Date>2021-11-11</Date>
|
||||
<Version>2.06</Version>
|
||||
<Comment>Version bump.</Comment>
|
||||
<Name>Mustafa Cinasal</Name>
|
||||
<Email>muscnsl@gmail.com</Email>
|
||||
</Update>
|
||||
<Update release="21">
|
||||
<Date>2021-08-22</Date>
|
||||
<Version>2.06</Version>
|
||||
|
||||
Reference in New Issue
Block a user