forked from pool/grub2
Accepting request 1105405 from home:michael-chang:grub:2.12rc1
- Implement NV index mode for TPM 2.0 key protector 0001-protectors-Implement-NV-index.patch - Fall back to passphrase mode when the key protector fails to unlock the disk 0002-cryptodisk-Fallback-to-passphrase.patch - Wipe out the cached key cleanly 0003-cryptodisk-wipe-out-the-cached-keys-from-protectors.patch - Make diskfiler to look up cryptodisk devices first 0004-diskfilter-look-up-cryptodisk-devices-first.patch - Version bump to 2.12~rc1 * Added: - grub-2.12~rc1.tar.xz * Removed: - grub-2.06.tar.xz * Patch dropped merged by new version: - grub2-GRUB_CMDLINE_LINUX_RECOVERY-for-recovery-mode.patch - grub2-s390x-02-kexec-module-added-to-emu.patch - grub2-efi-chainloader-root.patch - grub2-Fix-incorrect-netmask-on-ppc64.patch - 0001-osdep-Introduce-include-grub-osdep-major.h-and-use-i.patch - 0002-osdep-linux-hostdisk-Use-stat-instead-of-udevadm-for.patch - 0002-net-read-bracketed-ipv6-addrs-and-port-numbers.patch - grub2-s390x-10-keep-network-at-kexec.patch - 0001-Fix-build-error-in-binutils-2.36.patch - 0001-emu-fix-executable-stack-marking.patch - 0046-squash-verifiers-Move-verifiers-API-to-kernel-image.patch - 0001-30_uefi-firmware-fix-printf-format-with-null-byte.patch - 0001-tpm-Pass-unknown-error-as-non-fatal-but-debug-print-.patch - 0001-Filter-out-POSIX-locale-for-translation.patch OBS-URL: https://build.opensuse.org/request/show/1105405 OBS-URL: https://build.opensuse.org/package/show/Base:System/grub2?expand=0&rev=458
This commit is contained in:
parent
c0d19752a8
commit
8ee92f5194
@ -1,88 +0,0 @@
|
||||
From 47eddcfc6859f269bb3cfaf95d5b33502cafd9ec Mon Sep 17 00:00:00 2001
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Mon, 21 Jun 2021 05:11:18 +0000
|
||||
Subject: [PATCH] 30_uefi-firmware: fix printf format with null byte
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
On a Raspberry Pi 4, the OsIndications variable is set as following
|
||||
|
||||
$ od -An -t u1 /sys/firmware/efi/efivars/OsIndicationsSupported-8be4df61-93ca-11d2-aa0d-00e098032b8c
|
||||
6 0 0 0 0 0 0 0 0 0 0 0
|
||||
|
||||
The fifth byte indicates there's no boot to uefi firmware support as no
|
||||
bit is set. However the /etc/grub.d/30_uefi-firmware mistakenly detects
|
||||
that from the grub-mkconfig output.
|
||||
|
||||
/etc/grub.d/30_uefi-firmware: line 34: warning: command substitution: ignored null byte in input
|
||||
Adding boot menu entry for UEFI Firmware Settings ...
|
||||
|
||||
The warning has dictated that the null byte is ignored from the printf
|
||||
input arguments so that the expression of
|
||||
|
||||
rintf 0x%x \'"$(cat $OS_INDICATIONS | cut -b5)"\')
|
||||
|
||||
becomes
|
||||
|
||||
printf 0x%x \'""\'
|
||||
0x27
|
||||
|
||||
The numeric value of trailing character \' is outputted instead of the
|
||||
null byte.
|
||||
|
||||
From the printf manual, there's description to the synax of formatting
|
||||
the numeric value ouput of a character.
|
||||
|
||||
"If the leading character of a numeric argument is ‘"’ or ‘'’ then its
|
||||
value is the numeric value of the immediately following character. Any
|
||||
remaining characters are silently ignored if the POSIXLY_CORRECT
|
||||
environment variable is set; otherwise, a warning is printed. For
|
||||
example, ‘printf "%d" "'a"’ outputs ‘97’ on hosts that use the ASCII
|
||||
character set, since ‘a’ has the numeric value 97 in ASCII."
|
||||
|
||||
From the descrption the trailing \' appears to be superfluous and should
|
||||
get removed to have correct output.
|
||||
|
||||
printf 0x%x \'""
|
||||
0x0
|
||||
|
||||
In additon to suppress the warning message of ignored null byte in
|
||||
input, we can delete it so an empty string is used.
|
||||
|
||||
To illustrate the problem using echo as example
|
||||
|
||||
printf 0x%x \'"$(echo -e '\x00')"
|
||||
-bash: warning: command substitution: ignored null byte in input
|
||||
0x0
|
||||
|
||||
And here using tr to delete the null character
|
||||
|
||||
printf 0x%x \'"$(echo -e '\x00'| tr -d '\000')"
|
||||
|
||||
The expression above is substituted to
|
||||
|
||||
printf 0x%x \'""
|
||||
0x0
|
||||
|
||||
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
---
|
||||
util/grub.d/30_uefi-firmware.in | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/util/grub.d/30_uefi-firmware.in b/util/grub.d/30_uefi-firmware.in
|
||||
index d344d3883..d069f2727 100644
|
||||
--- a/util/grub.d/30_uefi-firmware.in
|
||||
+++ b/util/grub.d/30_uefi-firmware.in
|
||||
@@ -31,7 +31,7 @@ EFI_GLOBAL_VARIABLE=8be4df61-93ca-11d2-aa0d-00e098032b8c
|
||||
OS_INDICATIONS="$EFI_VARS_DIR/OsIndicationsSupported-$EFI_GLOBAL_VARIABLE"
|
||||
|
||||
if [ -e "$OS_INDICATIONS" ] && \
|
||||
- [ "$(( $(printf 0x%x \'"$(cat $OS_INDICATIONS | cut -b5)"\') & 1 ))" = 1 ]; then
|
||||
+ [ "$(( $(printf 0x%x \'"$(cat $OS_INDICATIONS | cut -b5 | tr -d '\000')") & 1 ))" = 1 ]; then
|
||||
LABEL="UEFI Firmware Settings"
|
||||
|
||||
gettext_printf "Adding boot menu entry for UEFI Firmware Settings ...\n" >&2
|
||||
--
|
||||
2.26.2
|
||||
|
@ -23,20 +23,18 @@ like secure boot, gpg and tpm.
|
||||
4 files changed, 465 insertions(+), 1 deletion(-)
|
||||
create mode 100644 grub-core/loader/arm64/efi/linux.c
|
||||
|
||||
Index: grub-2.06~rc1/grub-core/Makefile.core.def
|
||||
===================================================================
|
||||
--- grub-2.06~rc1.orig/grub-core/Makefile.core.def
|
||||
+++ grub-2.06~rc1/grub-core/Makefile.core.def
|
||||
@@ -1812,7 +1812,7 @@ module = {
|
||||
--- a/grub-core/Makefile.core.def
|
||||
+++ b/grub-core/Makefile.core.def
|
||||
@@ -1854,7 +1854,7 @@
|
||||
arm_coreboot = loader/arm/linux.c;
|
||||
arm_efi = loader/arm64/linux.c;
|
||||
arm_efi = loader/efi/linux.c;
|
||||
arm_uboot = loader/arm/linux.c;
|
||||
- arm64 = loader/arm64/linux.c;
|
||||
- arm64 = loader/efi/linux.c;
|
||||
+ arm64 = loader/arm64/efi/linux.c;
|
||||
riscv32 = loader/riscv/linux.c;
|
||||
riscv64 = loader/riscv/linux.c;
|
||||
emu = loader/emu/linux.c;
|
||||
@@ -1879,7 +1879,7 @@ module = {
|
||||
loongarch64 = loader/efi/linux.c;
|
||||
riscv32 = loader/efi/linux.c;
|
||||
riscv64 = loader/efi/linux.c;
|
||||
@@ -1922,7 +1922,7 @@
|
||||
|
||||
module = {
|
||||
name = linuxefi;
|
||||
@ -45,10 +43,8 @@ Index: grub-2.06~rc1/grub-core/Makefile.core.def
|
||||
enable = i386_efi;
|
||||
enable = x86_64_efi;
|
||||
};
|
||||
Index: grub-2.06~rc1/grub-core/loader/arm64/efi/linux.c
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
+++ grub-2.06~rc1/grub-core/loader/arm64/efi/linux.c
|
||||
+++ b/grub-core/loader/arm64/efi/linux.c
|
||||
@@ -0,0 +1,411 @@
|
||||
+/*
|
||||
+ * GRUB -- GRand Unified Bootloader
|
||||
@ -120,7 +116,7 @@ Index: grub-2.06~rc1/grub-core/loader/arm64/efi/linux.c
|
||||
+
|
||||
+#pragma GCC diagnostic pop
|
||||
+
|
||||
+grub_err_t
|
||||
+static grub_err_t
|
||||
+grub_arch_efi_linux_check_image (struct linux_arch_kernel_header * lh)
|
||||
+{
|
||||
+ if (lh->magic != GRUB_LINUX_ARMXX_MAGIC_SIGNATURE)
|
||||
@ -332,7 +328,7 @@ Index: grub-2.06~rc1/grub-core/loader/arm64/efi/linux.c
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ if (grub_initrd_load (&initrd_ctx, argv, initrd_mem))
|
||||
+ if (grub_initrd_load (&initrd_ctx, initrd_mem))
|
||||
+ goto fail;
|
||||
+
|
||||
+ initrd_start = (grub_addr_t) initrd_mem;
|
||||
@ -461,21 +457,16 @@ Index: grub-2.06~rc1/grub-core/loader/arm64/efi/linux.c
|
||||
+ grub_unregister_command (cmd_linux);
|
||||
+ grub_unregister_command (cmd_initrd);
|
||||
+}
|
||||
Index: grub-2.06~rc1/include/grub/arm/linux.h
|
||||
===================================================================
|
||||
--- grub-2.06~rc1.orig/include/grub/arm/linux.h
|
||||
+++ grub-2.06~rc1/include/grub/arm/linux.h
|
||||
@@ -20,6 +20,7 @@
|
||||
--- a/include/grub/arm/linux.h
|
||||
+++ b/include/grub/arm/linux.h
|
||||
@@ -20,10 +20,22 @@
|
||||
#ifndef GRUB_ARM_LINUX_HEADER
|
||||
#define GRUB_ARM_LINUX_HEADER 1
|
||||
|
||||
+#include <grub/efi/pe32.h>
|
||||
#include "system.h"
|
||||
|
||||
#define GRUB_LINUX_ARM_MAGIC_SIGNATURE 0x016f2818
|
||||
@@ -34,9 +35,17 @@ struct linux_arm_kernel_header {
|
||||
grub_uint32_t hdr_offset;
|
||||
};
|
||||
#include <grub/efi/pe32.h>
|
||||
|
||||
+struct grub_arm_linux_pe_header
|
||||
+{
|
||||
@ -484,29 +475,42 @@ Index: grub-2.06~rc1/include/grub/arm/linux.h
|
||||
+ struct grub_pe32_optional_header opt;
|
||||
+};
|
||||
+
|
||||
#if defined(__arm__)
|
||||
# define GRUB_LINUX_ARMXX_MAGIC_SIGNATURE GRUB_LINUX_ARM_MAGIC_SIGNATURE
|
||||
# define linux_arch_kernel_header linux_arm_kernel_header
|
||||
+#if defined(__arm__)
|
||||
+# define grub_armxx_linux_pe_header grub_arm_linux_pe_header
|
||||
#endif
|
||||
|
||||
+#endif
|
||||
+
|
||||
#if defined GRUB_MACHINE_UBOOT
|
||||
Index: grub-2.06~rc1/include/grub/arm64/linux.h
|
||||
===================================================================
|
||||
--- grub-2.06~rc1.orig/include/grub/arm64/linux.h
|
||||
+++ grub-2.06~rc1/include/grub/arm64/linux.h
|
||||
@@ -20,6 +20,7 @@
|
||||
#define GRUB_ARM64_LINUX_HEADER 1
|
||||
|
||||
#include <grub/types.h>
|
||||
# include <grub/uboot/uboot.h>
|
||||
# define LINUX_ADDRESS (start_of_ram + 0x8000)
|
||||
--- /dev/null
|
||||
+++ b/include/grub/arm64/linux.h
|
||||
@@ -0,0 +1,39 @@
|
||||
+/*
|
||||
+ * GRUB -- GRand Unified Bootloader
|
||||
+ * Copyright (C) 2013 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 <http://www.gnu.org/licenses/>.
|
||||
+ */
|
||||
+
|
||||
+#ifndef GRUB_ARM64_LINUX_HEADER
|
||||
+#define GRUB_ARM64_LINUX_HEADER 1
|
||||
+
|
||||
+#include <grub/types.h>
|
||||
+#include <grub/efi/pe32.h>
|
||||
|
||||
#define GRUB_LINUX_ARM64_MAGIC_SIGNATURE 0x644d5241 /* 'ARM\x64' */
|
||||
|
||||
@@ -38,9 +39,17 @@ struct linux_arm64_kernel_header
|
||||
grub_uint32_t hdr_offset; /* Offset of PE/COFF header */
|
||||
};
|
||||
|
||||
+
|
||||
+#define GRUB_LINUX_ARM64_MAGIC_SIGNATURE 0x644d5241 /* 'ARM\x64' */
|
||||
+
|
||||
+struct grub_arm64_linux_pe_header
|
||||
+{
|
||||
+ grub_uint32_t magic;
|
||||
@ -514,10 +518,9 @@ Index: grub-2.06~rc1/include/grub/arm64/linux.h
|
||||
+ struct grub_pe64_optional_header opt;
|
||||
+};
|
||||
+
|
||||
#if defined(__aarch64__)
|
||||
# define GRUB_LINUX_ARMXX_MAGIC_SIGNATURE GRUB_LINUX_ARM64_MAGIC_SIGNATURE
|
||||
# define linux_arch_kernel_header linux_arm64_kernel_header
|
||||
+#if defined(__aarch64__)
|
||||
+# define GRUB_LINUX_ARMXX_MAGIC_SIGNATURE GRUB_LINUX_ARM64_MAGIC_SIGNATURE
|
||||
+# define grub_armxx_linux_pe_header grub_arm64_linux_pe_header
|
||||
#endif
|
||||
|
||||
#endif /* ! GRUB_ARM64_LINUX_HEADER */
|
||||
+#endif
|
||||
+
|
||||
+#endif /* ! GRUB_ARM64_LINUX_HEADER */
|
||||
|
@ -18,20 +18,18 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
create mode 100644 grub-core/loader/efi/linux.c
|
||||
create mode 100644 include/grub/efi/linux.h
|
||||
|
||||
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
|
||||
index b5328d7a0..46a488131 100644
|
||||
--- a/grub-core/Makefile.core.def
|
||||
+++ b/grub-core/Makefile.core.def
|
||||
@@ -1834,6 +1834,7 @@ module = {
|
||||
riscv64 = loader/riscv/linux.c;
|
||||
@@ -1860,6 +1860,9 @@
|
||||
riscv64 = loader/efi/linux.c;
|
||||
emu = loader/emu/linux.c;
|
||||
common = loader/linux.c;
|
||||
+ efi = loader/efi/linux.c;
|
||||
+ i386_efi = loader/efi/linux_boot.c;
|
||||
+ x86_64_efi = loader/efi/linux_boot.c;
|
||||
+ arm64 = loader/efi/linux_boot.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
diff --git a/grub-core/loader/arm64/efi/linux.c b/grub-core/loader/arm64/efi/linux.c
|
||||
index 87cb2f97c..0ebdc48b7 100644
|
||||
--- a/grub-core/loader/arm64/efi/linux.c
|
||||
+++ b/grub-core/loader/arm64/efi/linux.c
|
||||
@@ -33,6 +33,7 @@
|
||||
@ -42,7 +40,7 @@ index 87cb2f97c..0ebdc48b7 100644
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
@@ -51,40 +52,6 @@ static grub_uint32_t cmdline_size;
|
||||
@@ -51,40 +52,6 @@
|
||||
static grub_addr_t initrd_start;
|
||||
static grub_addr_t initrd_end;
|
||||
|
||||
@ -80,14 +78,82 @@ index 87cb2f97c..0ebdc48b7 100644
|
||||
-
|
||||
-#pragma GCC diagnostic pop
|
||||
-
|
||||
grub_err_t
|
||||
static grub_err_t
|
||||
grub_arch_efi_linux_check_image (struct linux_arch_kernel_header * lh)
|
||||
{
|
||||
diff --git a/grub-core/loader/efi/linux.c b/grub-core/loader/efi/linux.c
|
||||
new file mode 100644
|
||||
index 000000000..442627dc2
|
||||
--- a/grub-core/loader/i386/efi/linux.c
|
||||
+++ b/grub-core/loader/i386/efi/linux.c
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/lib/cmdline.h>
|
||||
#include <grub/efi/efi.h>
|
||||
+#include <grub/efi/linux.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
@@ -40,26 +41,18 @@
|
||||
|
||||
#define BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> 12)
|
||||
|
||||
-typedef void(*handover_func)(void *, grub_efi_system_table_t *, struct linux_kernel_params *);
|
||||
-
|
||||
static grub_err_t
|
||||
grub_linuxefi_boot (void)
|
||||
{
|
||||
- handover_func hf;
|
||||
int offset = 0;
|
||||
|
||||
#ifdef __x86_64__
|
||||
offset = 512;
|
||||
#endif
|
||||
-
|
||||
- hf = (handover_func)((char *)kernel_mem + handover_offset + offset);
|
||||
-
|
||||
asm volatile ("cli");
|
||||
|
||||
- hf (grub_efi_image_handle, grub_efi_system_table, params);
|
||||
-
|
||||
- /* Not reached */
|
||||
- return GRUB_ERR_NONE;
|
||||
+ return grub_efi_linux_boot ((char *)kernel_mem, handover_offset + offset,
|
||||
+ params);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
--- /dev/null
|
||||
+++ b/grub-core/loader/efi/linux.c
|
||||
+++ b/include/grub/efi/linux.h
|
||||
@@ -0,0 +1,29 @@
|
||||
+/*
|
||||
+ * GRUB -- GRand Unified Bootloader
|
||||
+ * Copyright (C) 2014 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 <http://www.gnu.org/licenses/>.
|
||||
+ */
|
||||
+#ifndef GRUB_EFI_LINUX_HEADER
|
||||
+#define GRUB_EFI_LINUX_HEADER 1
|
||||
+
|
||||
+#include <grub/efi/api.h>
|
||||
+#include <grub/err.h>
|
||||
+#include <grub/symbol.h>
|
||||
+
|
||||
+grub_err_t
|
||||
+EXPORT_FUNC(grub_efi_linux_boot) (void *kernel_address, grub_off_t offset,
|
||||
+ void *kernel_param);
|
||||
+
|
||||
+#endif /* ! GRUB_EFI_LINUX_HEADER */
|
||||
--- /dev/null
|
||||
+++ b/grub-core/loader/efi/linux_boot.c
|
||||
@@ -0,0 +1,58 @@
|
||||
+/*
|
||||
+ * GRUB -- GRand Unified Bootloader
|
||||
@ -147,82 +213,3 @@ index 000000000..442627dc2
|
||||
+}
|
||||
+
|
||||
+#pragma GCC diagnostic pop
|
||||
diff --git a/grub-core/loader/i386/efi/linux.c b/grub-core/loader/i386/efi/linux.c
|
||||
index 355ecc9b9..06814cae3 100644
|
||||
--- a/grub-core/loader/i386/efi/linux.c
|
||||
+++ b/grub-core/loader/i386/efi/linux.c
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/lib/cmdline.h>
|
||||
#include <grub/efi/efi.h>
|
||||
+#include <grub/efi/linux.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
@@ -40,26 +41,18 @@ static char *linux_cmdline;
|
||||
|
||||
#define BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> 12)
|
||||
|
||||
-typedef void(*handover_func)(void *, grub_efi_system_table_t *, struct linux_kernel_params *);
|
||||
-
|
||||
static grub_err_t
|
||||
grub_linuxefi_boot (void)
|
||||
{
|
||||
- handover_func hf;
|
||||
int offset = 0;
|
||||
|
||||
#ifdef __x86_64__
|
||||
offset = 512;
|
||||
#endif
|
||||
-
|
||||
- hf = (handover_func)((char *)kernel_mem + handover_offset + offset);
|
||||
-
|
||||
asm volatile ("cli");
|
||||
|
||||
- hf (grub_efi_image_handle, grub_efi_system_table, params);
|
||||
-
|
||||
- /* Not reached */
|
||||
- return GRUB_ERR_NONE;
|
||||
+ return grub_efi_linux_boot ((char *)kernel_mem, handover_offset + offset,
|
||||
+ params);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
diff --git a/include/grub/efi/linux.h b/include/grub/efi/linux.h
|
||||
new file mode 100644
|
||||
index 000000000..887b02fd9
|
||||
--- /dev/null
|
||||
+++ b/include/grub/efi/linux.h
|
||||
@@ -0,0 +1,29 @@
|
||||
+/*
|
||||
+ * GRUB -- GRand Unified Bootloader
|
||||
+ * Copyright (C) 2014 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 <http://www.gnu.org/licenses/>.
|
||||
+ */
|
||||
+#ifndef GRUB_EFI_LINUX_HEADER
|
||||
+#define GRUB_EFI_LINUX_HEADER 1
|
||||
+
|
||||
+#include <grub/efi/api.h>
|
||||
+#include <grub/err.h>
|
||||
+#include <grub/symbol.h>
|
||||
+
|
||||
+grub_err_t
|
||||
+EXPORT_FUNC(grub_efi_linux_boot) (void *kernel_address, grub_off_t offset,
|
||||
+ void *kernel_param);
|
||||
+
|
||||
+#endif /* ! GRUB_EFI_LINUX_HEADER */
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
@ -1,36 +0,0 @@
|
||||
From 87b01d35b4db56778e2d9f99d18656026f818bab Mon Sep 17 00:00:00 2001
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Tue, 26 Oct 2021 13:31:24 +0800
|
||||
Subject: [PATCH] Filter out POSIX locale for translation
|
||||
|
||||
The POSIX locale is default or native operating system's locale
|
||||
identical to the C locale, so no translation to human speaking languages
|
||||
provided.
|
||||
|
||||
For this reason we should filter out LANG=POSIX as well as LANG=C upon
|
||||
generating grub.cfg to avoid looking up for it's gettext's message
|
||||
catalogs that will consequently result in the unpleasant message.
|
||||
|
||||
error: file `/boot/grub/locale/POSIX.gmo' not found
|
||||
|
||||
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
---
|
||||
util/grub.d/00_header.in | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/util/grub.d/00_header.in b/util/grub.d/00_header.in
|
||||
index 57a35a14a..b21caa4bc 100644
|
||||
--- a/util/grub.d/00_header.in
|
||||
+++ b/util/grub.d/00_header.in
|
||||
@@ -250,7 +250,7 @@ EOF
|
||||
EOF
|
||||
|
||||
# Gettext variables and module
|
||||
-if [ "x${LANG}" != "xC" ] && [ "x${LANG}" != "x" ]; then
|
||||
+if [ "x${LANG}" != "xC" ] && [ "x${LANG}" != "xPOSIX" ] && [ "x${LANG}" != "x" ]; then
|
||||
cat << EOF
|
||||
set locale_dir=\$prefix/locale
|
||||
set lang=${grub_lang}
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,47 +0,0 @@
|
||||
From 7801d671905329d28e789082225570fc54fe5784 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Fri, 19 Feb 2021 17:40:43 +0800
|
||||
Subject: [PATCH] Fix build error in binutils 2.36
|
||||
|
||||
The build fails in binutils 2.36
|
||||
|
||||
[ 520s] cat kernel_syms.lst > syminfo.lst.new
|
||||
[ 520s] /usr/lib64/gcc/x86_64-suse-linux/10/../../../../x86_64-suse-linux/bin/ld: section .note.gnu.property VMA [0000000000400158,0000000000400187] overlaps section .bss VMA [000000000000f000,000000000041e1af]
|
||||
|
||||
It is caused by assembler now generates the GNU property notes section
|
||||
by default. Use the assmbler option -mx86-used-note=no to disable the
|
||||
section from being generated to workaround the ensuing linker issue.
|
||||
|
||||
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
---
|
||||
configure.ac | 14 ++++++++++++++
|
||||
1 file changed, 14 insertions(+)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index c39e8379f..a3fb713ad 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -827,6 +827,20 @@ if ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 ) && test "x$p
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow"
|
||||
fi
|
||||
|
||||
+if ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 ); then
|
||||
+ AC_CACHE_CHECK([whether -Wa,-mx86-used-note works], [grub_cv_cc_mx86_used_note], [
|
||||
+ CFLAGS="$TARGET_CFLAGS -Wa,-mx86-used-note=no -Werror"
|
||||
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||
+ [grub_cv_cc_mx86_used_note=yes],
|
||||
+ [grub_cv_cc_mx86_used_note=no])
|
||||
+ ])
|
||||
+
|
||||
+ if test "x$grub_cv_cc_mx86_used_note" = xyes; then
|
||||
+ TARGET_CFLAGS="$TARGET_CFLAGS -Wa,-mx86-used-note=no"
|
||||
+ TARGET_CCASFLAGS="$TARGET_CCASFLAGS -Wa,-mx86-used-note=no"
|
||||
+ fi
|
||||
+fi
|
||||
+
|
||||
# GRUB doesn't use float or doubles at all. Yet some toolchains may decide
|
||||
# that floats are a good fit to run instead of what's written in the code.
|
||||
# Given that floating point unit is disabled (if present to begin with)
|
||||
--
|
||||
2.30.0
|
||||
|
@ -33,11 +33,9 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
util/grub.d/00_header.in | 10 +++++++++-
|
||||
2 files changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/genmoddep.awk b/grub-core/genmoddep.awk
|
||||
index 04c2863e5a..9b64f3ca93 100644
|
||||
--- a/grub-core/genmoddep.awk
|
||||
+++ b/grub-core/genmoddep.awk
|
||||
@@ -96,6 +96,9 @@ END {
|
||||
@@ -98,6 +98,9 @@
|
||||
}
|
||||
modlist = ""
|
||||
while (getline <"video.lst") {
|
||||
@ -47,11 +45,9 @@ index 04c2863e5a..9b64f3ca93 100644
|
||||
modlist = modlist " " $1;
|
||||
}
|
||||
printf "all_video:%s\n", modlist;
|
||||
diff --git a/util/grub.d/00_header.in b/util/grub.d/00_header.in
|
||||
index b21caa4bcb..23671838e9 100644
|
||||
--- a/util/grub.d/00_header.in
|
||||
+++ b/util/grub.d/00_header.in
|
||||
@@ -280,7 +280,15 @@ case x${GRUB_TERMINAL_OUTPUT} in
|
||||
@@ -287,7 +287,15 @@
|
||||
;;
|
||||
x*)
|
||||
cat << EOF
|
||||
@ -68,6 +64,3 @@ index b21caa4bcb..23671838e9 100644
|
||||
EOF
|
||||
;;
|
||||
esac
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
82
0001-Make-grub.cfg-compatible-to-old-binaries.patch
Normal file
82
0001-Make-grub.cfg-compatible-to-old-binaries.patch
Normal file
@ -0,0 +1,82 @@
|
||||
From b8457f2e271917c5c83a4fee286bafedf8c5790c Mon Sep 17 00:00:00 2001
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Tue, 8 Aug 2023 17:57:24 +0800
|
||||
Subject: [PATCH] Make grub.cfg compatible to old binaries
|
||||
|
||||
The new added fwsetup test in the topmost menu is always executed
|
||||
regardless older grub may not be able to handle and thus trapped in a
|
||||
boot loop between grub and fwsetup.
|
||||
|
||||
This in particular is to make sure a smooth transition if grub is rolled
|
||||
back to older release and needs to boot newer snapshots.
|
||||
|
||||
Also removing dashes in the UUID that every version released in the wild
|
||||
can handle.
|
||||
|
||||
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
---
|
||||
util/grub-probe.c | 20 +++++++++++++++++++-
|
||||
util/grub.d/30_uefi-firmware.in | 16 ++++++++++------
|
||||
2 files changed, 29 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/util/grub-probe.c b/util/grub-probe.c
|
||||
index e7efcc268..99c738e44 100644
|
||||
--- a/util/grub-probe.c
|
||||
+++ b/util/grub-probe.c
|
||||
@@ -290,8 +290,26 @@ probe_cryptodisk_uuid (grub_disk_t disk, char delim)
|
||||
}
|
||||
if (disk->dev->id == GRUB_DISK_DEVICE_CRYPTODISK_ID)
|
||||
{
|
||||
+ grub_size_t i, j;
|
||||
const char *uu = grub_util_cryptodisk_get_uuid (disk);
|
||||
- grub_printf ("%s%c", uu, delim);
|
||||
+ grub_size_t len = grub_strlen (uu);
|
||||
+ char *p = grub_malloc (len + 1);
|
||||
+
|
||||
+ /* Removing dash in the UUID string
|
||||
+ * This keeps old grub binary to work with newer config in a system,
|
||||
+ * especially for snapshots. It is a temporary change to make sure smooth
|
||||
+ * transition from 2.06 to 2.12-rc1 and this hunk can be removed
|
||||
+ * after 2.12-rc1 release stablized.
|
||||
+ */
|
||||
+ for (i = 0, j = 0; i < len; i++)
|
||||
+ {
|
||||
+ if (uu[i] != '-')
|
||||
+ p[j++] = uu[i];
|
||||
+ }
|
||||
+ p[j] = '\0';
|
||||
+
|
||||
+ grub_printf ("%s%c", p, delim);
|
||||
+ grub_free (p);
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/util/grub.d/30_uefi-firmware.in b/util/grub.d/30_uefi-firmware.in
|
||||
index 1c2365ddb..96ff112e5 100644
|
||||
--- a/util/grub.d/30_uefi-firmware.in
|
||||
+++ b/util/grub.d/30_uefi-firmware.in
|
||||
@@ -32,11 +32,15 @@ gettext_printf "Adding boot menu entry for UEFI Firmware Settings ...\n" >&2
|
||||
|
||||
cat << EOF
|
||||
if [ "\$grub_platform" = "efi" ]; then
|
||||
- fwsetup --is-supported
|
||||
- if [ "\$?" = 0 ]; then
|
||||
- menuentry '$LABEL' \$menuentry_id_option 'uefi-firmware' {
|
||||
- fwsetup
|
||||
- }
|
||||
- fi
|
||||
+ menuentry '$LABEL' \$menuentry_id_option 'uefi-firmware' {
|
||||
+ fwsetup --is-supported
|
||||
+ if [ "\$?" = 0 ]; then
|
||||
+ fwsetup
|
||||
+ else
|
||||
+ echo "Your firmware doesn't support setup menu entry from a boot loader"
|
||||
+ echo "Press any key to return ..."
|
||||
+ read
|
||||
+ fi
|
||||
+ }
|
||||
fi
|
||||
EOF
|
||||
--
|
||||
2.41.0
|
||||
|
@ -1,47 +0,0 @@
|
||||
From 4e7de0959f3e99824d4a688398958ea022a1d023 Mon Sep 17 00:00:00 2001
|
||||
From: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
|
||||
Date: Sat, 29 Jan 2022 13:36:55 +0100
|
||||
Subject: [PATCH] RISC-V: Adjust -march flags for binutils 2.38
|
||||
|
||||
As of version 2.38 binutils defaults to ISA specification version
|
||||
2019-12-13. This version of the specification has has separated the
|
||||
the csr read/write (csrr*/csrw*) instructions and the fence.i from
|
||||
the I extension and put them into separate Zicsr and Zifencei
|
||||
extensions.
|
||||
|
||||
This implies that we have to adjust the -march flag passed to the
|
||||
compiler accordingly.
|
||||
|
||||
Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
configure.ac | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index af8e2615ce..906eb1cedc 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -866,11 +866,19 @@ if test x"$platform" != xemu ; then
|
||||
CFLAGS="$TARGET_CFLAGS -march=rv32imac -mabi=ilp32 -Werror"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||
[grub_cv_target_cc_soft_float="-march=rv32imac -mabi=ilp32"], [])
|
||||
+ # ISA spec version 20191213 factored out extensions Zicsr and Zifencei
|
||||
+ CFLAGS="$TARGET_CFLAGS -march=rv32imac_zicsr_zifencei -mabi=ilp32 -Werror"
|
||||
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||
+ [grub_cv_target_cc_soft_float="-march=rv32imac_zicsr_zifencei -mabi=ilp32"], [])
|
||||
fi
|
||||
if test "x$target_cpu" = xriscv64; then
|
||||
CFLAGS="$TARGET_CFLAGS -march=rv64imac -mabi=lp64 -Werror"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||
[grub_cv_target_cc_soft_float="-march=rv64imac -mabi=lp64"], [])
|
||||
+ # ISA spec version 20191213 factored out extensions Zicsr and Zifencei
|
||||
+ CFLAGS="$TARGET_CFLAGS -march=rv64imac_zicsr_zifencei -mabi=lp64 -Werror"
|
||||
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||
+ [grub_cv_target_cc_soft_float="-march=rv64imac_zicsr_zifencei -mabi=lp64"], [])
|
||||
fi
|
||||
if test "x$target_cpu" = xia64; then
|
||||
CFLAGS="$TARGET_CFLAGS -mno-inline-float-divide -mno-inline-sqrt -Werror"
|
||||
--
|
||||
2.34.1
|
||||
|
@ -1,56 +0,0 @@
|
||||
From 8a6489818b5d30524092b3b9524aabbfc172a882 Mon Sep 17 00:00:00 2001
|
||||
From: Khem Raj <raj.khem@gmail.com>
|
||||
Date: Thu, 23 Feb 2023 13:15:08 -0800
|
||||
Subject: [PATCH] RISC-V: Handle R_RISCV_CALL_PLT reloc
|
||||
|
||||
GNU assembler starting 2.40 release always generates R_RISCV_CALL_PLT
|
||||
reloc for call in assembler [1], similarly LLVM does not make
|
||||
distinction between R_RISCV_CALL_PLT and R_RISCV_CALL [2].
|
||||
|
||||
Fixes "grub-mkimage: error: relocation 0x13 is not implemented yet.".
|
||||
|
||||
[1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=70f35d72ef04cd23771875c1661c9975044a749c
|
||||
[2] https://reviews.llvm.org/D132530
|
||||
|
||||
Signed-off-by: Khem Raj <raj.khem@gmail.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/kern/riscv/dl.c | 1 +
|
||||
util/grub-mkimagexx.c | 2 ++
|
||||
2 files changed, 3 insertions(+)
|
||||
|
||||
diff --git a/grub-core/kern/riscv/dl.c b/grub-core/kern/riscv/dl.c
|
||||
index f26b12aaa..896653bb4 100644
|
||||
--- a/grub-core/kern/riscv/dl.c
|
||||
+++ b/grub-core/kern/riscv/dl.c
|
||||
@@ -188,6 +188,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
|
||||
break;
|
||||
|
||||
case R_RISCV_CALL:
|
||||
+ case R_RISCV_CALL_PLT:
|
||||
{
|
||||
grub_uint32_t *abs_place = place;
|
||||
grub_ssize_t off = sym_addr - (grub_addr_t) place;
|
||||
diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c
|
||||
index 8ac9248d1..19cec945a 100644
|
||||
--- a/util/grub-mkimagexx.c
|
||||
+++ b/util/grub-mkimagexx.c
|
||||
@@ -1331,6 +1331,7 @@ SUFFIX (relocate_addrs) (Elf_Ehdr *e, struct section_metadata *smd,
|
||||
}
|
||||
break;
|
||||
case R_RISCV_CALL:
|
||||
+ case R_RISCV_CALL_PLT:
|
||||
{
|
||||
grub_uint32_t hi20, lo12;
|
||||
|
||||
@@ -1763,6 +1764,7 @@ translate_relocation_pe (struct translate_context *ctx,
|
||||
case R_RISCV_BRANCH:
|
||||
case R_RISCV_JAL:
|
||||
case R_RISCV_CALL:
|
||||
+ case R_RISCV_CALL_PLT:
|
||||
case R_RISCV_PCREL_HI20:
|
||||
case R_RISCV_PCREL_LO12_I:
|
||||
case R_RISCV_PCREL_LO12_S:
|
||||
--
|
||||
2.39.2
|
||||
|
@ -13,11 +13,9 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
util/grub-mkconfig_lib.in | 3 +-
|
||||
2 files changed, 48 insertions(+), 22 deletions(-)
|
||||
|
||||
diff --git a/util/grub-install.c b/util/grub-install.c
|
||||
index 746a42a04..8d18f2530 100644
|
||||
--- a/util/grub-install.c
|
||||
+++ b/util/grub-install.c
|
||||
@@ -870,6 +870,7 @@ main (int argc, char *argv[])
|
||||
@@ -886,6 +886,7 @@
|
||||
const char *efi_file = NULL;
|
||||
char **grub_devices;
|
||||
grub_fs_t grub_fs;
|
||||
@ -25,7 +23,7 @@ index 746a42a04..8d18f2530 100644
|
||||
grub_device_t grub_dev = NULL;
|
||||
enum grub_install_plat platform;
|
||||
char *grubdir, *device_map;
|
||||
@@ -882,6 +883,8 @@ main (int argc, char *argv[])
|
||||
@@ -898,6 +899,8 @@
|
||||
int efidir_is_mac = 0;
|
||||
int is_prep = 0;
|
||||
const char *pkgdatadir;
|
||||
@ -34,7 +32,7 @@ index 746a42a04..8d18f2530 100644
|
||||
|
||||
grub_util_host_init (&argc, &argv);
|
||||
product_version = xstrdup (PACKAGE_VERSION);
|
||||
@@ -895,9 +898,6 @@ main (int argc, char *argv[])
|
||||
@@ -911,9 +914,6 @@
|
||||
|
||||
grub_util_load_config (&config);
|
||||
|
||||
@ -44,7 +42,7 @@ index 746a42a04..8d18f2530 100644
|
||||
if (!bootloader_id && config.grub_distributor)
|
||||
{
|
||||
char *ptr;
|
||||
@@ -1046,6 +1046,45 @@ main (int argc, char *argv[])
|
||||
@@ -1064,6 +1064,45 @@
|
||||
grub_hostfs_init ();
|
||||
grub_host_init ();
|
||||
|
||||
@ -90,7 +88,7 @@ index 746a42a04..8d18f2530 100644
|
||||
switch (platform)
|
||||
{
|
||||
case GRUB_INSTALL_PLATFORM_I386_EFI:
|
||||
@@ -1410,8 +1449,7 @@ main (int argc, char *argv[])
|
||||
@@ -1454,8 +1493,7 @@
|
||||
debug_image);
|
||||
}
|
||||
|
||||
@ -100,7 +98,7 @@ index 746a42a04..8d18f2530 100644
|
||||
{
|
||||
if (!load_cfg_f)
|
||||
load_cfg_f = grub_util_fopen (load_cfg, "wb");
|
||||
@@ -1624,21 +1662,13 @@ main (int argc, char *argv[])
|
||||
@@ -1669,21 +1707,13 @@
|
||||
|
||||
#ifdef __linux__
|
||||
|
||||
@ -116,16 +114,17 @@ index 746a42a04..8d18f2530 100644
|
||||
-
|
||||
- if (rootdir_path && grub_util_is_directory (rootdir_path))
|
||||
- rootdir_devices = grub_guess_root_devices (rootdir_path);
|
||||
|
||||
-
|
||||
- if (rootdir_devices && rootdir_devices[0])
|
||||
- if (grub_strcmp (rootdir_devices[0], grub_devices[0]) == 0)
|
||||
- subvol = grub_util_get_btrfs_subvol (platdir, &mount_path);
|
||||
+
|
||||
+ if (grub_strcmp (rootdir_devices[0], grub_devices[0]) == 0)
|
||||
+ subvol = grub_util_get_btrfs_subvol (platdir, &mount_path);
|
||||
|
||||
if (subvol && mount_path)
|
||||
{
|
||||
@@ -1663,11 +1693,6 @@ main (int argc, char *argv[])
|
||||
@@ -1708,11 +1738,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
@ -137,11 +136,9 @@ index 746a42a04..8d18f2530 100644
|
||||
free (subvol);
|
||||
free (mount_path);
|
||||
}
|
||||
diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in
|
||||
index 023f54a2d..eab46773b 100644
|
||||
--- a/util/grub-mkconfig_lib.in
|
||||
+++ b/util/grub-mkconfig_lib.in
|
||||
@@ -49,7 +49,8 @@ grub_warn ()
|
||||
@@ -49,7 +49,8 @@
|
||||
|
||||
make_system_path_relative_to_its_root ()
|
||||
{
|
||||
@ -151,6 +148,3 @@ index 023f54a2d..eab46773b 100644
|
||||
"${grub_mkrelpath}" -r "$1"
|
||||
else
|
||||
"${grub_mkrelpath}" "$1"
|
||||
--
|
||||
2.28.0
|
||||
|
||||
|
@ -32,21 +32,18 @@ care must be taken to ensure that:
|
||||
create mode 100644 grub-core/osdep/efi_removable_fallback.c
|
||||
create mode 100644 grub-core/osdep/linux/efi_removable_fallback.c
|
||||
|
||||
diff --git a/Makefile.util.def b/Makefile.util.def
|
||||
index 2eaa3ff68..018874ab5 100644
|
||||
--- a/Makefile.util.def
|
||||
+++ b/Makefile.util.def
|
||||
@@ -652,6 +652,7 @@ program = {
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
@@ -681,6 +681,9 @@
|
||||
common = grub-core/osdep/journaled_fs.c;
|
||||
extra_dist = grub-core/osdep/basic/journaled_fs.c;
|
||||
extra_dist = grub-core/osdep/linux/journaled_fs.c;
|
||||
+ common = grub-core/osdep/efi_removable_fallback.c;
|
||||
+ extra_dist = grub-core/osdep/basic/efi_removable_fallback.c;
|
||||
+ extra_dist = grub-core/osdep/linux/efi_removable_fallback.c;
|
||||
|
||||
ldadd = '$(LIBLZMA)';
|
||||
ldadd = libgrubmods.a;
|
||||
diff --git a/grub-core/osdep/basic/efi_removable_fallback.c b/grub-core/osdep/basic/efi_removable_fallback.c
|
||||
new file mode 100644
|
||||
index 000000000..3f782f764
|
||||
--- /dev/null
|
||||
+++ b/grub-core/osdep/basic/efi_removable_fallback.c
|
||||
@@ -0,0 +1,26 @@
|
||||
@ -76,9 +73,6 @@ index 000000000..3f782f764
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
diff --git a/grub-core/osdep/efi_removable_fallback.c b/grub-core/osdep/efi_removable_fallback.c
|
||||
new file mode 100644
|
||||
index 000000000..615a60831
|
||||
--- /dev/null
|
||||
+++ b/grub-core/osdep/efi_removable_fallback.c
|
||||
@@ -0,0 +1,5 @@
|
||||
@ -87,9 +81,6 @@ index 000000000..615a60831
|
||||
+#else
|
||||
+#include "basic/efi_removable_fallback.c"
|
||||
+#endif
|
||||
diff --git a/grub-core/osdep/linux/efi_removable_fallback.c b/grub-core/osdep/linux/efi_removable_fallback.c
|
||||
new file mode 100644
|
||||
index 000000000..7375fb0c2
|
||||
--- /dev/null
|
||||
+++ b/grub-core/osdep/linux/efi_removable_fallback.c
|
||||
@@ -0,0 +1,151 @@
|
||||
@ -244,11 +235,9 @@ index 000000000..7375fb0c2
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
diff --git a/include/grub/util/install.h b/include/grub/util/install.h
|
||||
index 1541ee233..cedc5f856 100644
|
||||
--- a/include/grub/util/install.h
|
||||
+++ b/include/grub/util/install.h
|
||||
@@ -274,4 +274,7 @@ grub_install_is_short_mbrgap_supported(void);
|
||||
@@ -303,4 +303,7 @@
|
||||
|
||||
int
|
||||
grub_install_sync_fs_journal (const char *path);
|
||||
@ -256,11 +245,9 @@ index 1541ee233..cedc5f856 100644
|
||||
+const char *
|
||||
+grub_install_efi_removable_fallback (const char *efidir, enum grub_install_plat platform);
|
||||
#endif
|
||||
diff --git a/util/grub-install.c b/util/grub-install.c
|
||||
index b37f3ca26..e20b3c6b9 100644
|
||||
--- a/util/grub-install.c
|
||||
+++ b/util/grub-install.c
|
||||
@@ -885,6 +885,7 @@ main (int argc, char *argv[])
|
||||
@@ -901,6 +901,7 @@
|
||||
const char *pkgdatadir;
|
||||
char *rootdir_path;
|
||||
char **rootdir_devices;
|
||||
@ -268,7 +255,7 @@ index b37f3ca26..e20b3c6b9 100644
|
||||
|
||||
grub_util_host_init (&argc, &argv);
|
||||
product_version = xstrdup (PACKAGE_VERSION);
|
||||
@@ -1142,6 +1143,7 @@ main (int argc, char *argv[])
|
||||
@@ -1175,6 +1176,7 @@
|
||||
}
|
||||
if (!efidir)
|
||||
grub_util_error ("%s", _("cannot find EFI directory"));
|
||||
@ -276,7 +263,7 @@ index b37f3ca26..e20b3c6b9 100644
|
||||
efidir_device_names = grub_guess_root_devices (efidir);
|
||||
if (!efidir_device_names || !efidir_device_names[0])
|
||||
grub_util_error (_("cannot find a device for %s (is /dev mounted?)"),
|
||||
@@ -2159,6 +2161,23 @@ main (int argc, char *argv[])
|
||||
@@ -2217,6 +2219,23 @@
|
||||
free (grub_efi_cfg);
|
||||
}
|
||||
}
|
||||
@ -300,6 +287,3 @@ index b37f3ca26..e20b3c6b9 100644
|
||||
if (!removable && update_nvram)
|
||||
{
|
||||
char * efifile_path;
|
||||
--
|
||||
2.26.2
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -25,7 +25,7 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
|
||||
--- a/grub-core/commands/crypttab.c
|
||||
+++ b/grub-core/commands/crypttab.c
|
||||
@@ -3,10 +3,52 @@
|
||||
@@ -3,10 +3,56 @@
|
||||
#include <grub/command.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/i18n.h>
|
||||
@ -41,7 +41,11 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
+grub_err_t
|
||||
+grub_initrd_publish_key (const char *uuid, const char *key, grub_size_t key_len, const char *path)
|
||||
+{
|
||||
+ struct grub_key_publisher *cur = grub_named_list_find (GRUB_AS_NAMED_LIST (kpuber), uuid);
|
||||
+ struct grub_key_publisher *cur = NULL;
|
||||
+
|
||||
+ FOR_LIST_ELEMENTS (cur, kpuber)
|
||||
+ if (grub_uuidcasecmp (cur->name, uuid, sizeof (cur->name)) == 0)
|
||||
+ break;
|
||||
+
|
||||
+ if (!cur)
|
||||
+ cur = grub_zalloc (sizeof (*cur));
|
||||
@ -119,7 +123,7 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
static char
|
||||
hex (grub_uint8_t val)
|
||||
{
|
||||
@@ -423,41 +412,3 @@
|
||||
@@ -436,45 +425,3 @@
|
||||
root = 0;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
@ -127,7 +131,11 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
-grub_err_t
|
||||
-grub_initrd_publish_key (const char *uuid, const char *key, grub_size_t key_len, const char *path)
|
||||
-{
|
||||
- struct grub_key_publisher *cur = grub_named_list_find (GRUB_AS_NAMED_LIST (kpuber), uuid);
|
||||
- struct grub_key_publisher *cur = NULL;
|
||||
-
|
||||
- FOR_LIST_ELEMENTS (cur, kpuber)
|
||||
- if (grub_uuidcasecmp (cur->name, uuid, sizeof (cur->name)) == 0)
|
||||
- break;
|
||||
-
|
||||
- if (!cur)
|
||||
- cur = grub_zalloc (sizeof (*cur));
|
||||
@ -191,7 +199,7 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
@@ -22,6 +22,3 @@
|
||||
grub_err_t
|
||||
grub_initrd_load (struct grub_linux_initrd_context *initrd_ctx,
|
||||
char *argv[], void *target);
|
||||
void *target);
|
||||
-
|
||||
-grub_err_t
|
||||
-grub_initrd_publish_key (const char *uuid, const char *key, grub_size_t key_len, const char *path);
|
||||
|
@ -1,39 +0,0 @@
|
||||
From d2c0426b3f0f91b941037263c83859a46ebb0c4f Mon Sep 17 00:00:00 2001
|
||||
From: Lu Ken <ken.lu@intel.com>
|
||||
Date: Wed, 13 Jul 2022 10:06:10 +0800
|
||||
Subject: [PATCH 1/3] commands/efi/tpm: Refine the status of log event
|
||||
|
||||
1. Use macro GRUB_ERR_NONE instead of hard code 0.
|
||||
2. Keep lowercase of the first char for the status string of log event.
|
||||
|
||||
Signed-off-by: Lu Ken <ken.lu@intel.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/commands/efi/tpm.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/grub-core/commands/efi/tpm.c b/grub-core/commands/efi/tpm.c
|
||||
index f296b8698..19737b462 100644
|
||||
--- a/grub-core/commands/efi/tpm.c
|
||||
+++ b/grub-core/commands/efi/tpm.c
|
||||
@@ -136,13 +136,13 @@ grub_efi_log_event_status (grub_efi_status_t status)
|
||||
switch (status)
|
||||
{
|
||||
case GRUB_EFI_SUCCESS:
|
||||
- return 0;
|
||||
+ return GRUB_ERR_NONE;
|
||||
case GRUB_EFI_DEVICE_ERROR:
|
||||
- return grub_error (GRUB_ERR_IO, N_("Command failed"));
|
||||
+ return grub_error (GRUB_ERR_IO, N_("command failed"));
|
||||
case GRUB_EFI_INVALID_PARAMETER:
|
||||
- return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Invalid parameter"));
|
||||
+ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid parameter"));
|
||||
case GRUB_EFI_BUFFER_TOO_SMALL:
|
||||
- return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Output buffer too small"));
|
||||
+ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("output buffer too small"));
|
||||
case GRUB_EFI_NOT_FOUND:
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("TPM unavailable"));
|
||||
default:
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,33 +0,0 @@
|
||||
From 822f71318a69c150da3ad7df5fe8667dfa6e8069 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Thu, 31 Mar 2022 15:45:35 +0800
|
||||
Subject: [PATCH] crytodisk: fix cryptodisk module looking up
|
||||
|
||||
The error "no cryptodisk module can handle this device" may happen even
|
||||
encrypted disk were correctly formatted and required modules were loaded.
|
||||
|
||||
It is casued by missing break to the loop in which cryptodisk modules are
|
||||
iterated to find the one matching target's disk format. With the break
|
||||
statement, the loop will be always ended with testing last cryptodisk module on
|
||||
the list that may not be able to handle the format of encrypted disk's.
|
||||
|
||||
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
---
|
||||
grub-core/disk/cryptodisk.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c
|
||||
index 00c44773fb..6d22bf871c 100644
|
||||
--- a/grub-core/disk/cryptodisk.c
|
||||
+++ b/grub-core/disk/cryptodisk.c
|
||||
@@ -1021,6 +1021,7 @@ grub_cryptodisk_scan_device_real (const char *name,
|
||||
if (!dev)
|
||||
continue;
|
||||
crd = cr;
|
||||
+ break;
|
||||
}
|
||||
|
||||
if (!dev)
|
||||
--
|
||||
2.34.1
|
||||
|
@ -1,53 +0,0 @@
|
||||
From ebe4ac49e800b18b539564169593ab1c6f163378 Mon Sep 17 00:00:00 2001
|
||||
From: Josselin Poiret via Grub-devel <grub-devel@gnu.org>
|
||||
Date: Tue, 14 Jun 2022 15:47:29 +0200
|
||||
Subject: [PATCH 01/10] devmapper/getroot: Have devmapper recognize LUKS2
|
||||
|
||||
Changes UUID comparisons so that LUKS1 and LUKS2 are both recognized
|
||||
as being LUKS cryptodisks.
|
||||
---
|
||||
grub-core/osdep/devmapper/getroot.c | 11 +++++++----
|
||||
1 file changed, 7 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/grub-core/osdep/devmapper/getroot.c b/grub-core/osdep/devmapper/getroot.c
|
||||
index 9ba5c98655..2bf4264cf0 100644
|
||||
--- a/grub-core/osdep/devmapper/getroot.c
|
||||
+++ b/grub-core/osdep/devmapper/getroot.c
|
||||
@@ -138,7 +138,8 @@ grub_util_get_dm_abstraction (const char *os_dev)
|
||||
grub_free (uuid);
|
||||
return GRUB_DEV_ABSTRACTION_LVM;
|
||||
}
|
||||
- if (strncmp (uuid, "CRYPT-LUKS1-", 12) == 0)
|
||||
+ if (strncmp (uuid, "CRYPT-LUKS1-", sizeof ("CRYPT-LUKS1-") - 1) == 0
|
||||
+ || strncmp (uuid, "CRYPT-LUKS2-", sizeof ("CRYPT-LUKS2-") - 1) == 0)
|
||||
{
|
||||
grub_free (uuid);
|
||||
return GRUB_DEV_ABSTRACTION_LUKS;
|
||||
@@ -179,7 +180,9 @@ grub_util_pull_devmapper (const char *os_dev)
|
||||
grub_util_pull_device (subdev);
|
||||
}
|
||||
}
|
||||
- if (uuid && strncmp (uuid, "CRYPT-LUKS1-", sizeof ("CRYPT-LUKS1-") - 1) == 0
|
||||
+ if (uuid
|
||||
+ && (strncmp (uuid, "CRYPT-LUKS1-", sizeof ("CRYPT-LUKS1-") - 1) == 0
|
||||
+ || strncmp (uuid, "CRYPT-LUKS2-", sizeof ("CRYPT-LUKS2-") - 1) == 0)
|
||||
&& lastsubdev)
|
||||
{
|
||||
char *grdev = grub_util_get_grub_dev (lastsubdev);
|
||||
@@ -253,11 +256,11 @@ grub_util_get_devmapper_grub_dev (const char *os_dev)
|
||||
{
|
||||
char *dash;
|
||||
|
||||
- dash = grub_strchr (uuid + sizeof ("CRYPT-LUKS1-") - 1, '-');
|
||||
+ dash = grub_strchr (uuid + sizeof ("CRYPT-LUKS*-") - 1, '-');
|
||||
if (dash)
|
||||
*dash = 0;
|
||||
grub_dev = grub_xasprintf ("cryptouuid/%s",
|
||||
- uuid + sizeof ("CRYPT-LUKS1-") - 1);
|
||||
+ uuid + sizeof ("CRYPT-LUKS*-") - 1);
|
||||
grub_free (uuid);
|
||||
return grub_dev;
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
@ -0,0 +1,35 @@
|
||||
From 652b221a5eacb1421891c1469608028e2c2f0615 Mon Sep 17 00:00:00 2001
|
||||
From: Glenn Washburn <development@efficientek.com>
|
||||
Date: Fri, 18 Aug 2023 12:27:22 -0500
|
||||
Subject: [PATCH] disk/cryptodisk: Fix missing change when updating to use
|
||||
grub_uuidcasecmp
|
||||
|
||||
This was causing the cryptomount command to return failure even though
|
||||
the crypto device was successfully added. Of course, this meant that any
|
||||
script using the return code would behave unexpectedly.
|
||||
|
||||
Fixes: 3cf2e848bc03 (disk/cryptodisk: Allows UUIDs to be compared in a dash-insensitive manner)
|
||||
|
||||
Suggested-by: Olaf Hering <olaf@aepfle.de>
|
||||
Signed-off-by: Glenn Washburn <development@efficientek.com>
|
||||
---
|
||||
grub-core/disk/cryptodisk.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c
|
||||
index 802b191b2..c79d4125a 100644
|
||||
--- a/grub-core/disk/cryptodisk.c
|
||||
+++ b/grub-core/disk/cryptodisk.c
|
||||
@@ -1323,7 +1323,8 @@ grub_cryptodisk_scan_device (const char *name,
|
||||
dev = grub_cryptodisk_scan_device_real (name, source, cargs);
|
||||
if (dev)
|
||||
{
|
||||
- ret = (cargs->search_uuid != NULL && grub_strcasecmp (cargs->search_uuid, dev->uuid) == 0);
|
||||
+ ret = (cargs->search_uuid != NULL
|
||||
+ && grub_uuidcasecmp (cargs->search_uuid, dev->uuid, sizeof (dev->uuid)) == 0);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
--
|
||||
2.41.0
|
||||
|
@ -1,180 +0,0 @@
|
||||
From 5cc00eac24c7019d9696a859f69b587e11f1621e Mon Sep 17 00:00:00 2001
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Mon, 27 Sep 2021 17:39:56 +0800
|
||||
Subject: [PATCH] disk/diskfilter: Use nodes in logical volume's segment as
|
||||
member device
|
||||
|
||||
Currently the grub_diskfilter_memberlist() function returns all physical
|
||||
volumes added to a volume group to which a logical volume (LV) belongs.
|
||||
However, this is suboptimal as it doesn't fit the intended behavior of
|
||||
returning underlying devices that make up the LV. To give a clear
|
||||
picture, the result should be identical to running commands below to
|
||||
display the logical volumes with underlying physical volumes in use.
|
||||
|
||||
localhost:~ # lvs -o lv_name,vg_name,devices /dev/system/root
|
||||
LV VG Devices
|
||||
root system /dev/vda2(512)
|
||||
|
||||
localhost:~ # lvdisplay --maps /dev/system/root
|
||||
--- Logical volume ---
|
||||
...
|
||||
--- Segments ---
|
||||
Logical extents 0 to 4604:
|
||||
Type linear
|
||||
Physical volume /dev/vda2
|
||||
Physical extents 512 to 5116
|
||||
|
||||
As shown above, we can know system-root LV uses only /dev/vda2 to
|
||||
allocate it's extents, or we can say that /dev/vda2 is the member device
|
||||
comprising the system-root LV.
|
||||
|
||||
It is important to be precise on the member devices, because that helps
|
||||
to avoid pulling in excessive dependency. Let's use an example to
|
||||
demonstrate why it is needed.
|
||||
|
||||
localhost:~ # findmnt /
|
||||
TARGET SOURCE FSTYPE OPTIONS
|
||||
/ /dev/mapper/system-root ext4 rw,relatime
|
||||
|
||||
localhost:~ # pvs
|
||||
PV VG Fmt Attr PSize PFree
|
||||
/dev/mapper/data system lvm2 a-- 1020.00m 0
|
||||
/dev/vda2 system lvm2 a-- 19.99g 0
|
||||
|
||||
localhost:~ # cryptsetup status /dev/mapper/data
|
||||
/dev/mapper/data is active and is in use.
|
||||
type: LUKS1
|
||||
cipher: aes-xts-plain64
|
||||
keysize: 512 bits
|
||||
key location: dm-crypt
|
||||
device: /dev/vdb
|
||||
sector size: 512
|
||||
offset: 4096 sectors
|
||||
size: 2093056 sectors
|
||||
mode: read/write
|
||||
|
||||
localhost:~ # vgs
|
||||
VG #PV #LV #SN Attr VSize VFree
|
||||
system 2 3 0 wz--n- 20.98g 0
|
||||
|
||||
localhost:~ # lvs -o lv_name,vg_name,devices
|
||||
LV VG Devices
|
||||
data system /dev/mapper/data(0)
|
||||
root system /dev/vda2(512)
|
||||
swap system /dev/vda2(0)
|
||||
|
||||
We can learn from above that /dev/mapper/data is an encrypted volume and
|
||||
also gets assigned to volume group "system" as one of it's physical
|
||||
volumes. And also it is not used by root device, /dev/mapper/system-root,
|
||||
for allocating extents, so it shouldn't be taking part in the process of
|
||||
setting up GRUB to access root device.
|
||||
|
||||
However, running grub-install reports error as volume group "system"
|
||||
contains encrypted volume.
|
||||
|
||||
error: attempt to install to encrypted disk without cryptodisk
|
||||
enabled. Set `GRUB_ENABLE_CRYPTODISK=y' in file `/etc/default/grub'.
|
||||
|
||||
Certainly we can enable GRUB_ENABLE_CRYPTODISK=y and move on, but that
|
||||
is not always acceptable since the server may need to be booted unattended.
|
||||
Additionally, typing passphrase for every system startup can be a big
|
||||
hassle of which most users would like to avoid.
|
||||
|
||||
This patch solves the problem by returning exact physical volume, /dev/vda2,
|
||||
rightly used by system-root from the example above, thus grub-install will
|
||||
not error out because the excessive encrypted device to boot the root device
|
||||
is not configured.
|
||||
|
||||
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
Tested-by: Olav Reinert <seroton10@gmail.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/disk/diskfilter.c | 61 ++++++++++++++++++++++++++-----------
|
||||
1 file changed, 44 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/grub-core/disk/diskfilter.c b/grub-core/disk/diskfilter.c
|
||||
index d094f7882..39d74cb86 100644
|
||||
--- a/grub-core/disk/diskfilter.c
|
||||
+++ b/grub-core/disk/diskfilter.c
|
||||
@@ -396,6 +396,8 @@ grub_diskfilter_memberlist (grub_disk_t disk)
|
||||
grub_disk_dev_t p;
|
||||
struct grub_diskfilter_vg *vg;
|
||||
struct grub_diskfilter_lv *lv2 = NULL;
|
||||
+ struct grub_diskfilter_segment *seg;
|
||||
+ unsigned int i, j;
|
||||
|
||||
if (!lv->vg->pvs)
|
||||
return NULL;
|
||||
@@ -427,27 +429,52 @@ grub_diskfilter_memberlist (grub_disk_t disk)
|
||||
}
|
||||
}
|
||||
|
||||
- for (pv = lv->vg->pvs; pv; pv = pv->next)
|
||||
- {
|
||||
- if (!pv->disk)
|
||||
+ for (i = 0, seg = lv->segments; i < lv->segment_count; i++, seg++)
|
||||
+ for (j = 0; j < seg->node_count; ++j)
|
||||
+ if (seg->nodes[j].pv != NULL)
|
||||
{
|
||||
- /* TRANSLATORS: This message kicks in during the detection of
|
||||
- which modules needs to be included in core image. This happens
|
||||
- in the case of degraded RAID and means that autodetection may
|
||||
- fail to include some of modules. It's an installation time
|
||||
- message, not runtime message. */
|
||||
- grub_util_warn (_("Couldn't find physical volume `%s'."
|
||||
- " Some modules may be missing from core image."),
|
||||
- pv->name);
|
||||
- continue;
|
||||
+ pv = seg->nodes[j].pv;
|
||||
+
|
||||
+ if (pv->disk == NULL)
|
||||
+ {
|
||||
+ /*
|
||||
+ * TRANSLATORS: This message kicks in during the detection of
|
||||
+ * which modules needs to be included in core image. This happens
|
||||
+ * in the case of degraded RAID and means that autodetection may
|
||||
+ * fail to include some of modules. It's an installation time
|
||||
+ * message, not runtime message.
|
||||
+ */
|
||||
+ grub_util_warn (_("Couldn't find physical volume `%s'."
|
||||
+ " Some modules may be missing from core image."),
|
||||
+ pv->name);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ for (tmp = list; tmp != NULL; tmp = tmp->next)
|
||||
+ if (!grub_strcmp (tmp->disk->name, pv->disk->name))
|
||||
+ break;
|
||||
+ if (tmp != NULL)
|
||||
+ continue;
|
||||
+
|
||||
+ tmp = grub_malloc (sizeof (*tmp));
|
||||
+ if (tmp == NULL)
|
||||
+ goto fail;
|
||||
+ tmp->disk = pv->disk;
|
||||
+ tmp->next = list;
|
||||
+ list = tmp;
|
||||
}
|
||||
- tmp = grub_malloc (sizeof (*tmp));
|
||||
- tmp->disk = pv->disk;
|
||||
- tmp->next = list;
|
||||
- list = tmp;
|
||||
- }
|
||||
|
||||
return list;
|
||||
+
|
||||
+ fail:
|
||||
+ while (list != NULL)
|
||||
+ {
|
||||
+ tmp = list;
|
||||
+ list = list->next;
|
||||
+ grub_free (tmp);
|
||||
+ }
|
||||
+
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
--
|
||||
2.31.1
|
||||
|
@ -25,11 +25,9 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
grub-core/loader/i386/efi/linux.c | 17 +++++++++++++----
|
||||
3 files changed, 20 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
|
||||
index 6045da47b..3ea9dace0 100644
|
||||
--- a/grub-core/Makefile.core.def
|
||||
+++ b/grub-core/Makefile.core.def
|
||||
@@ -1773,7 +1773,9 @@ module = {
|
||||
@@ -1840,7 +1840,9 @@
|
||||
|
||||
module = {
|
||||
name = linux;
|
||||
@ -40,7 +38,16 @@ index 6045da47b..3ea9dace0 100644
|
||||
i386_xen_pvh = loader/i386/linux.c;
|
||||
xen = loader/i386/xen.c;
|
||||
i386_pc = lib/i386/pc/vesa_modes_table.c;
|
||||
@@ -1852,7 +1854,7 @@ module = {
|
||||
@@ -1856,8 +1858,6 @@
|
||||
loongarch64 = loader/efi/linux.c;
|
||||
riscv32 = loader/efi/linux.c;
|
||||
riscv64 = loader/efi/linux.c;
|
||||
- i386_efi = loader/efi/linux.c;
|
||||
- x86_64_efi = loader/efi/linux.c;
|
||||
emu = loader/emu/linux.c;
|
||||
common = loader/linux.c;
|
||||
};
|
||||
@@ -1922,7 +1922,7 @@
|
||||
|
||||
module = {
|
||||
name = linuxefi;
|
||||
@ -49,22 +56,18 @@ index 6045da47b..3ea9dace0 100644
|
||||
enable = i386_efi;
|
||||
enable = x86_64_efi;
|
||||
};
|
||||
diff --git a/grub-core/gensyminfo.sh.in b/grub-core/gensyminfo.sh.in
|
||||
index 9bc767532..098de9258 100644
|
||||
--- a/grub-core/gensyminfo.sh.in
|
||||
+++ b/grub-core/gensyminfo.sh.in
|
||||
@@ -35,3 +35,6 @@ fi
|
||||
@@ -35,3 +35,6 @@
|
||||
|
||||
# Print all undefined symbols used by module
|
||||
@TARGET_NM@ -u @TARGET_NMFLAGS_MINUS_P@ -p $module | sed "s@^\([^ ]*\).*@undefined $modname \1@g"
|
||||
+
|
||||
+# Specify linuxefi module should load default linux
|
||||
+test "$modname" = "linuxefi" && echo "undefined $modname grub_initrd_init" || true
|
||||
diff --git a/grub-core/loader/i386/efi/linux.c b/grub-core/loader/i386/efi/linux.c
|
||||
index 8017e8c05..3f6d51519 100644
|
||||
--- a/grub-core/loader/i386/efi/linux.c
|
||||
+++ b/grub-core/loader/i386/efi/linux.c
|
||||
@@ -347,20 +347,29 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
@@ -333,20 +333,29 @@
|
||||
}
|
||||
|
||||
static grub_command_t cmd_linux, cmd_initrd;
|
||||
@ -98,6 +101,3 @@ index 8017e8c05..3f6d51519 100644
|
||||
grub_unregister_command (cmd_linux);
|
||||
grub_unregister_command (cmd_initrd);
|
||||
}
|
||||
--
|
||||
2.26.2
|
||||
|
||||
|
@ -1,70 +0,0 @@
|
||||
From 4cc06bef26c3573309086bec4472cc9151b0379e Mon Sep 17 00:00:00 2001
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Mon, 1 Feb 2021 20:14:12 +0800
|
||||
Subject: [PATCH] emu: fix executable stack marking
|
||||
|
||||
The gcc by default assumes executable stack is required if the source
|
||||
object file doesn't have .note.GNU-stack section in place. If any of the
|
||||
source objects doesn't incorporate the GNU-stack note, the resulting
|
||||
program will have executable stack flag set in PT_GNU_STACK program
|
||||
header to instruct program loader or kernel to set up the exeutable
|
||||
stack when program loads to memory.
|
||||
|
||||
Usually the .note.GNU-stack section will be generated by gcc
|
||||
automatically if it finds that executable stack is not required. However
|
||||
it doesn't take care of generating .note.GNU-stack section for those
|
||||
object files built from assembler sources. This leads to unnecessary
|
||||
risk of security of exploiting the executable stack because those
|
||||
assembler sources don't actually require stack to be executable to work.
|
||||
|
||||
The grub-emu and grub-emu-lite are found to flag stack as executable
|
||||
revealed by execstack tool.
|
||||
|
||||
$ mkdir -p build-emu && cd build-emu
|
||||
$ ../configure --with-platform=emu && make
|
||||
$ execstack -q grub-core/grub-emu grub-core/grub-emu-lite
|
||||
X grub-core/grub-emu
|
||||
X grub-core/grub-emu-lite
|
||||
|
||||
This patch will add the missing GNU-stack note to the assembler source
|
||||
used by both utilities, therefore the result doesn't count on gcc
|
||||
default behavior and the executable stack is disabled.
|
||||
|
||||
$ execstack -q grub-core/grub-emu grub-core/grub-emu-lite
|
||||
- grub-core/grub-emu
|
||||
- grub-core/grub-emu-lite
|
||||
|
||||
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
---
|
||||
grub-core/kern/emu/cache_s.S | 5 +++++
|
||||
grub-core/lib/setjmp.S | 4 ++++
|
||||
2 files changed, 9 insertions(+)
|
||||
|
||||
Index: grub-2.04/grub-core/kern/emu/cache_s.S
|
||||
===================================================================
|
||||
--- grub-2.04.orig/grub-core/kern/emu/cache_s.S
|
||||
+++ grub-2.04/grub-core/kern/emu/cache_s.S
|
||||
@@ -2,6 +2,11 @@
|
||||
#error "This source is only meant for grub-emu platform"
|
||||
#endif
|
||||
|
||||
+/* An executable stack is not required for these functions */
|
||||
+#if defined (__linux__) && defined (__ELF__)
|
||||
+.section .note.GNU-stack,"",%progbits
|
||||
+#endif
|
||||
+
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
/* Nothing is necessary. */
|
||||
#elif defined(__sparc__)
|
||||
Index: grub-2.04/grub-core/lib/setjmp.S
|
||||
===================================================================
|
||||
--- grub-2.04.orig/grub-core/lib/setjmp.S
|
||||
+++ grub-2.04/grub-core/lib/setjmp.S
|
||||
@@ -1,3 +1,7 @@
|
||||
+/* An executable stack is not required for these functions */
|
||||
+#if defined (__linux__) && defined (__ELF__)
|
||||
+.section .note.GNU-stack,"",%progbits
|
||||
+#endif
|
||||
#if defined(__i386__)
|
||||
#include "./i386/setjmp.S"
|
||||
#elif defined(__x86_64__)
|
@ -1,33 +0,0 @@
|
||||
From a2606b0cb95f261288c79cafc7295927d868cb04 Mon Sep 17 00:00:00 2001
|
||||
From: Zhang Boyang <zhangboyang.id@gmail.com>
|
||||
Date: Wed, 3 Aug 2022 19:45:33 +0800
|
||||
Subject: [PATCH 01/12] font: Reject glyphs exceeds font->max_glyph_width or
|
||||
font->max_glyph_height
|
||||
|
||||
Check glyph's width and height against limits specified in font's
|
||||
metadata. Reject the glyph (and font) if such limits are exceeded.
|
||||
|
||||
Signed-off-by: Zhang Boyang <zhangboyang.id@gmail.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/font/font.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/font/font.c b/grub-core/font/font.c
|
||||
index d09bb38d8..2f09a4a55 100644
|
||||
--- a/grub-core/font/font.c
|
||||
+++ b/grub-core/font/font.c
|
||||
@@ -760,7 +760,9 @@ grub_font_get_glyph_internal (grub_font_t font, grub_uint32_t code)
|
||||
|| read_be_uint16 (font->file, &height) != 0
|
||||
|| read_be_int16 (font->file, &xoff) != 0
|
||||
|| read_be_int16 (font->file, &yoff) != 0
|
||||
- || read_be_int16 (font->file, &dwidth) != 0)
|
||||
+ || read_be_int16 (font->file, &dwidth) != 0
|
||||
+ || width > font->max_char_width
|
||||
+ || height > font->max_char_height)
|
||||
{
|
||||
remove_font (font);
|
||||
return 0;
|
||||
--
|
||||
2.35.3
|
||||
|
39
0001-font-Try-memdisk-fonts-with-the-same-name.patch
Normal file
39
0001-font-Try-memdisk-fonts-with-the-same-name.patch
Normal file
@ -0,0 +1,39 @@
|
||||
From d02304f70b5b9c79761d8084ab9dfc66d84688e2 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Wed, 30 Nov 2022 17:02:50 +0800
|
||||
Subject: [PATCH] font: Try memdisk fonts with the same name
|
||||
|
||||
---
|
||||
grub-core/font/font.c | 16 +++++++++++++++-
|
||||
1 file changed, 15 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/font/font.c b/grub-core/font/font.c
|
||||
index 18de52562..92ff415bf 100644
|
||||
--- a/grub-core/font/font.c
|
||||
+++ b/grub-core/font/font.c
|
||||
@@ -451,7 +451,21 @@ grub_font_load (const char *filename)
|
||||
#endif
|
||||
|
||||
if (filename[0] == '(' || filename[0] == '/' || filename[0] == '+')
|
||||
- file = grub_buffile_open (filename, GRUB_FILE_TYPE_FONT, 1024);
|
||||
+ {
|
||||
+ char *n = grub_strdup (filename);
|
||||
+ char *p = grub_strrchr (n, '/');
|
||||
+ if (p)
|
||||
+ {
|
||||
+ char *q = grub_strrchr (p, '.');
|
||||
+ if (q)
|
||||
+ *q = 0;
|
||||
+ p++;
|
||||
+ file = try_open_from_prefix ("(memdisk)", p);
|
||||
+ }
|
||||
+ grub_free (n);
|
||||
+ if (!file)
|
||||
+ file = grub_buffile_open (filename, GRUB_FILE_TYPE_FONT, 1024);
|
||||
+ }
|
||||
else
|
||||
{
|
||||
file = try_open_from_prefix ("(memdisk)", filename);
|
||||
--
|
||||
2.41.0
|
||||
|
@ -1,124 +0,0 @@
|
||||
From 149df8b7bb86401693e1f064859de0a8906d97b7 Mon Sep 17 00:00:00 2001
|
||||
From: Qu Wenruo <wqu@suse.com>
|
||||
Date: Thu, 28 Oct 2021 17:44:57 +0800
|
||||
Subject: [PATCH] fs/btrfs: Make extent item iteration to handle gaps
|
||||
|
||||
[BUG]
|
||||
Grub btrfs implementation can't handle two very basic btrfs file
|
||||
layouts:
|
||||
|
||||
1. Mixed inline/regualr extents
|
||||
# mkfs.btrfs -f test.img
|
||||
# mount test.img /mnt/btrfs
|
||||
# xfs_io -f -c "pwrite 0 1k" -c "sync" -c "falloc 0 4k" \
|
||||
-c "pwrite 4k 4k" /mnt/btrfs/file
|
||||
# umount /mnt/btrfs
|
||||
# ./grub-fstest ./grub-fstest --debug=btrfs ~/test.img hex "/file"
|
||||
|
||||
Such mixed inline/regular extents case is not recommended layout,
|
||||
but all existing tools and kernel can handle it without problem
|
||||
|
||||
2. NO_HOLES feature
|
||||
# mkfs.btrfs -f test.img -O no_holes
|
||||
# mount test.img /mnt/btrfs
|
||||
# xfs_io -f -c "pwrite 0 4k" -c "pwrite 8k 4k" /mnt/btrfs/file
|
||||
# umount /mnt/btrfs
|
||||
# ./grub-fstest ./grub-fstest --debug=btrfs ~/test.img hex "/file"
|
||||
|
||||
NO_HOLES feature is going to be the default mkfs feature in the incoming
|
||||
v5.15 release, and kernel has support for it since v4.0.
|
||||
|
||||
[CAUSE]
|
||||
The way GRUB btrfs code iterates through file extents relies on no gap
|
||||
between extents.
|
||||
|
||||
If any gap is hit, then grub btrfs will error out, without any proper
|
||||
reason to help debug the bug.
|
||||
|
||||
This is a bad assumption, since a long long time ago btrfs has a new
|
||||
feature called NO_HOLES to allow btrfs to skip the padding hole extent
|
||||
to reduce metadata usage.
|
||||
|
||||
The NO_HOLES feature is already stable since kernel v4.0 and is going to
|
||||
be the default mkfs feature in the incoming v5.15 btrfs-progs release.
|
||||
|
||||
[FIX]
|
||||
When there is a extent gap, instead of error out, just try next item.
|
||||
|
||||
This is still not ideal, as kernel/progs/U-boot all do the iteration
|
||||
item by item, not relying on the file offset continuity.
|
||||
|
||||
But it will be way more time consuming to correct the whole behavior
|
||||
than starting from scratch to build a proper designed btrfs module for GRUB.
|
||||
|
||||
Signed-off-by: Qu Wenruo <wqu@suse.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/fs/btrfs.c | 35 ++++++++++++++++++++++++++++++++---
|
||||
1 file changed, 32 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c
|
||||
index 9625bdf16..b8625197b 100644
|
||||
--- a/grub-core/fs/btrfs.c
|
||||
+++ b/grub-core/fs/btrfs.c
|
||||
@@ -1506,6 +1506,7 @@ grub_btrfs_extent_read (struct grub_btrfs_data *data,
|
||||
grub_size_t csize;
|
||||
grub_err_t err;
|
||||
grub_off_t extoff;
|
||||
+ struct grub_btrfs_leaf_descriptor desc;
|
||||
if (!data->extent || data->extstart > pos || data->extino != ino
|
||||
|| data->exttree != tree || data->extend <= pos)
|
||||
{
|
||||
@@ -1518,7 +1519,7 @@ grub_btrfs_extent_read (struct grub_btrfs_data *data,
|
||||
key_in.type = GRUB_BTRFS_ITEM_TYPE_EXTENT_ITEM;
|
||||
key_in.offset = grub_cpu_to_le64 (pos);
|
||||
err = lower_bound (data, &key_in, &key_out, tree,
|
||||
- &elemaddr, &elemsize, NULL, 0);
|
||||
+ &elemaddr, &elemsize, &desc, 0);
|
||||
if (err)
|
||||
return -1;
|
||||
if (key_out.object_id != ino
|
||||
@@ -1557,10 +1558,38 @@ grub_btrfs_extent_read (struct grub_btrfs_data *data,
|
||||
PRIxGRUB_UINT64_T "\n",
|
||||
grub_le_to_cpu64 (key_out.offset),
|
||||
grub_le_to_cpu64 (data->extent->size));
|
||||
+ /*
|
||||
+ * The way of extent item iteration is pretty bad, it completely
|
||||
+ * requires all extents are contiguous, which is not ensured.
|
||||
+ *
|
||||
+ * Features like NO_HOLE and mixed inline/regular extents can cause
|
||||
+ * gaps between file extent items.
|
||||
+ *
|
||||
+ * The correct way is to follow kernel/U-boot to iterate item by
|
||||
+ * item, without any assumption on the file offset continuity.
|
||||
+ *
|
||||
+ * Here we just manually skip to next item and re-do the verification.
|
||||
+ *
|
||||
+ * TODO: Rework the whole extent item iteration code, if not the
|
||||
+ * whole btrfs implementation.
|
||||
+ */
|
||||
if (data->extend <= pos)
|
||||
{
|
||||
- grub_error (GRUB_ERR_BAD_FS, "extent not found");
|
||||
- return -1;
|
||||
+ err = next(data, &desc, &elemaddr, &elemsize, &key_out);
|
||||
+ if (err < 0)
|
||||
+ return -1;
|
||||
+ /* No next item for the inode, we hit the end */
|
||||
+ if (err == 0 || key_out.object_id != ino ||
|
||||
+ key_out.type != GRUB_BTRFS_ITEM_TYPE_EXTENT_ITEM)
|
||||
+ return pos - pos0;
|
||||
+
|
||||
+ csize = grub_le_to_cpu64(key_out.offset) - pos;
|
||||
+ if (csize > len)
|
||||
+ csize = len;
|
||||
+ buf += csize;
|
||||
+ pos += csize;
|
||||
+ len -= csize;
|
||||
+ continue;
|
||||
}
|
||||
}
|
||||
csize = data->extend - pos;
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,162 +0,0 @@
|
||||
From b78aca6e1c4f72a6491457e849b76c8e0af77765 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Mon, 13 Dec 2021 14:25:49 +0800
|
||||
Subject: [PATCH 1/2] fs/btrfs: Use full btrfs bootloader area
|
||||
|
||||
Up to now GRUB can only embed to the first 64 KiB before primary
|
||||
superblock of btrfs, effectively limiting the GRUB core size. That
|
||||
could consequently pose restrictions to feature enablement like
|
||||
advanced zstd compression.
|
||||
|
||||
This patch attempts to utilize full unused area reserved by btrfs for
|
||||
the bootloader outlined in the document [1]:
|
||||
|
||||
The first 1MiB on each device is unused with the exception of primary
|
||||
superblock that is on the offset 64KiB and spans 4KiB.
|
||||
|
||||
Apart from that, adjacent sectors to superblock and first block group
|
||||
are not used for embedding in case of overflow and logged access to
|
||||
adjacent sectors could be useful for tracing it up.
|
||||
|
||||
This patch has been tested to provide out of the box support for btrfs
|
||||
zstd compression with which GRUB has been installed to the partition.
|
||||
|
||||
[1] https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs(5)#BOOTLOADER_SUPPORT
|
||||
|
||||
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/fs/btrfs.c | 90 +++++++++++++++++++++++++++++++++++++-------
|
||||
include/grub/disk.h | 2 +
|
||||
2 files changed, 79 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c
|
||||
index 7007463c6..979ba1b28 100644
|
||||
--- a/grub-core/fs/btrfs.c
|
||||
+++ b/grub-core/fs/btrfs.c
|
||||
@@ -2537,6 +2537,33 @@ grub_btrfs_label (grub_device_t device, char **label)
|
||||
}
|
||||
|
||||
#ifdef GRUB_UTIL
|
||||
+
|
||||
+struct embed_region {
|
||||
+ unsigned int start;
|
||||
+ unsigned int secs;
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs(5)#BOOTLOADER_SUPPORT
|
||||
+ * The first 1 MiB on each device is unused with the exception of primary
|
||||
+ * superblock that is on the offset 64 KiB and spans 4 KiB.
|
||||
+ */
|
||||
+
|
||||
+static const struct {
|
||||
+ struct embed_region available;
|
||||
+ struct embed_region used[6];
|
||||
+} btrfs_head = {
|
||||
+ .available = {0, GRUB_DISK_KiB_TO_SECTORS (1024)}, /* The first 1 MiB. */
|
||||
+ .used = {
|
||||
+ {0, 1}, /* boot.S. */
|
||||
+ {GRUB_DISK_KiB_TO_SECTORS (64) - 1, 1}, /* Overflow guard. */
|
||||
+ {GRUB_DISK_KiB_TO_SECTORS (64), GRUB_DISK_KiB_TO_SECTORS (4)}, /* 4 KiB superblock. */
|
||||
+ {GRUB_DISK_KiB_TO_SECTORS (68), 1}, /* Overflow guard. */
|
||||
+ {GRUB_DISK_KiB_TO_SECTORS (1024) - 1, 1}, /* Overflow guard. */
|
||||
+ {0, 0} /* Array terminator. */
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
static grub_err_t
|
||||
grub_btrfs_embed (grub_device_t device __attribute__ ((unused)),
|
||||
unsigned int *nsectors,
|
||||
@@ -2544,25 +2571,62 @@ grub_btrfs_embed (grub_device_t device __attribute__ ((unused)),
|
||||
grub_embed_type_t embed_type,
|
||||
grub_disk_addr_t **sectors)
|
||||
{
|
||||
- unsigned i;
|
||||
+ unsigned int i, j, n = 0;
|
||||
+ const struct embed_region *u;
|
||||
+ grub_disk_addr_t *map;
|
||||
|
||||
if (embed_type != GRUB_EMBED_PCBIOS)
|
||||
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
"BtrFS currently supports only PC-BIOS embedding");
|
||||
|
||||
- if (64 * 2 - 1 < *nsectors)
|
||||
- return grub_error (GRUB_ERR_OUT_OF_RANGE,
|
||||
- N_("your core.img is unusually large. "
|
||||
- "It won't fit in the embedding area"));
|
||||
-
|
||||
- *nsectors = 64 * 2 - 1;
|
||||
- if (*nsectors > max_nsectors)
|
||||
- *nsectors = max_nsectors;
|
||||
- *sectors = grub_calloc (*nsectors, sizeof (**sectors));
|
||||
- if (!*sectors)
|
||||
+ map = grub_calloc (btrfs_head.available.secs, sizeof (*map));
|
||||
+ if (map == NULL)
|
||||
return grub_errno;
|
||||
- for (i = 0; i < *nsectors; i++)
|
||||
- (*sectors)[i] = i + 1;
|
||||
+
|
||||
+ /*
|
||||
+ * Populating the map array so that it can be used to index if a disk
|
||||
+ * address is available to embed:
|
||||
+ * - 0: available,
|
||||
+ * - 1: unavailable.
|
||||
+ */
|
||||
+ for (u = btrfs_head.used; u->secs; ++u)
|
||||
+ {
|
||||
+ unsigned int end = u->start + u->secs;
|
||||
+
|
||||
+ if (end > btrfs_head.available.secs)
|
||||
+ end = btrfs_head.available.secs;
|
||||
+ for (i = u->start; i < end; ++i)
|
||||
+ map[i] = 1;
|
||||
+ }
|
||||
+
|
||||
+ /* Adding up n until it matches total size of available embedding area. */
|
||||
+ for (i = 0; i < btrfs_head.available.secs; ++i)
|
||||
+ if (map[i] == 0)
|
||||
+ n++;
|
||||
+
|
||||
+ if (n < *nsectors)
|
||||
+ {
|
||||
+ grub_free (map);
|
||||
+ return grub_error (GRUB_ERR_OUT_OF_RANGE,
|
||||
+ N_("your core.img is unusually large. "
|
||||
+ "It won't fit in the embedding area"));
|
||||
+ }
|
||||
+
|
||||
+ if (n > max_nsectors)
|
||||
+ n = max_nsectors;
|
||||
+
|
||||
+ /*
|
||||
+ * Populating the array so that it can used to index disk block address for
|
||||
+ * an image file's offset to be embedded on disk (the unit is in sectors):
|
||||
+ * - i: The disk block address relative to btrfs_head.available.start,
|
||||
+ * - j: The offset in image file.
|
||||
+ */
|
||||
+ for (i = 0, j = 0; i < btrfs_head.available.secs && j < n; ++i)
|
||||
+ if (map[i] == 0)
|
||||
+ map[j++] = btrfs_head.available.start + i;
|
||||
+
|
||||
+ *nsectors = n;
|
||||
+ *sectors = map;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
diff --git a/include/grub/disk.h b/include/grub/disk.h
|
||||
index 6d656c431..a10fa3bc7 100644
|
||||
--- a/include/grub/disk.h
|
||||
+++ b/include/grub/disk.h
|
||||
@@ -182,6 +182,8 @@ typedef struct grub_disk_memberlist *grub_disk_memberlist_t;
|
||||
/* Return value of grub_disk_native_sectors() in case disk size is unknown. */
|
||||
#define GRUB_DISK_SIZE_UNKNOWN 0xffffffffffffffffULL
|
||||
|
||||
+#define GRUB_DISK_KiB_TO_SECTORS(x) ((x) << (10 - GRUB_DISK_SECTOR_BITS))
|
||||
+
|
||||
/* Convert sector number from one sector size to another. */
|
||||
static inline grub_disk_addr_t
|
||||
grub_convert_sector (grub_disk_addr_t sector,
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,59 +0,0 @@
|
||||
From 7fd5feff97c4b1f446f8fcf6d37aca0c64e7c763 Mon Sep 17 00:00:00 2001
|
||||
From: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Date: Fri, 11 Jun 2021 21:36:16 +0200
|
||||
Subject: [PATCH] fs/ext2: Ignore checksum seed incompat feature
|
||||
|
||||
This incompat feature is used to denote that the filesystem stored its
|
||||
metadata checksum seed in the superblock. This is used to allow tune2fs
|
||||
changing the UUID on a mounted metdata_csum filesystem without having
|
||||
to rewrite all the disk metadata. However, the GRUB doesn't use the
|
||||
metadata checksum at all. So, it can just ignore this feature if it
|
||||
is enabled. This is consistent with the GRUB filesystem code in general
|
||||
which just does a best effort to access the filesystem's data.
|
||||
|
||||
The checksum seed incompat feature has to be removed from the ignore
|
||||
list if the support for metadata checksum verification is added to the
|
||||
GRUB ext2 driver later.
|
||||
|
||||
Suggested-by: Eric Sandeen <esandeen@redhat.com>
|
||||
Suggested-by: Lukas Czerner <lczerner@redhat.com>
|
||||
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Reviewed-by: Lukas Czerner <lczerner@redhat.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/fs/ext2.c | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/grub-core/fs/ext2.c b/grub-core/fs/ext2.c
|
||||
index e7dd78e66..4953a1591 100644
|
||||
--- a/grub-core/fs/ext2.c
|
||||
+++ b/grub-core/fs/ext2.c
|
||||
@@ -103,6 +103,7 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||
#define EXT4_FEATURE_INCOMPAT_64BIT 0x0080
|
||||
#define EXT4_FEATURE_INCOMPAT_MMP 0x0100
|
||||
#define EXT4_FEATURE_INCOMPAT_FLEX_BG 0x0200
|
||||
+#define EXT4_FEATURE_INCOMPAT_CSUM_SEED 0x2000
|
||||
#define EXT4_FEATURE_INCOMPAT_ENCRYPT 0x10000
|
||||
|
||||
/* The set of back-incompatible features this driver DOES support. Add (OR)
|
||||
@@ -123,10 +124,15 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||
* mmp: Not really back-incompatible - was added as such to
|
||||
* avoid multiple read-write mounts. Safe to ignore for this
|
||||
* RO driver.
|
||||
+ * checksum seed: Not really back-incompatible - was added to allow tools
|
||||
+ * such as tune2fs to change the UUID on a mounted metadata
|
||||
+ * checksummed filesystem. Safe to ignore for now since the
|
||||
+ * driver doesn't support checksum verification. However, it
|
||||
+ * has to be removed from this list if the support is added later.
|
||||
*/
|
||||
#define EXT2_DRIVER_IGNORED_INCOMPAT ( EXT3_FEATURE_INCOMPAT_RECOVER \
|
||||
- | EXT4_FEATURE_INCOMPAT_MMP)
|
||||
-
|
||||
+ | EXT4_FEATURE_INCOMPAT_MMP \
|
||||
+ | EXT4_FEATURE_INCOMPAT_CSUM_SEED)
|
||||
|
||||
#define EXT3_JOURNAL_MAGIC_NUMBER 0xc03b3998U
|
||||
|
||||
--
|
||||
2.40.1
|
||||
|
@ -1,58 +0,0 @@
|
||||
From 2e9fa73a040462b81bfbfe56c0bc7ad2d30b446b Mon Sep 17 00:00:00 2001
|
||||
From: Theodore Ts'o <tytso@mit.edu>
|
||||
Date: Tue, 30 Aug 2022 22:41:59 -0400
|
||||
Subject: [PATCH] fs/ext2: Ignore the large_dir incompat feature
|
||||
|
||||
Recently, ext4 added the large_dir feature, which adds support for
|
||||
a 3 level htree directory support.
|
||||
|
||||
The GRUB supports existing file systems with htree directories by
|
||||
ignoring their existence, and since the index nodes for the hash tree
|
||||
look like deleted directory entries (by design), the GRUB can simply do
|
||||
a brute force O(n) linear search of directories. The same is true for
|
||||
3 level deep htrees indicated by large_dir feature flag.
|
||||
|
||||
Hence, it is safe for the GRUB to ignore the large_dir incompat feature.
|
||||
|
||||
Fixes: https://savannah.gnu.org/bugs/?61606
|
||||
|
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/fs/ext2.c | 10 +++++++++-
|
||||
1 file changed, 9 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/fs/ext2.c b/grub-core/fs/ext2.c
|
||||
index 0989e26e1..e1cc5e62a 100644
|
||||
--- a/grub-core/fs/ext2.c
|
||||
+++ b/grub-core/fs/ext2.c
|
||||
@@ -104,6 +104,7 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||
#define EXT4_FEATURE_INCOMPAT_MMP 0x0100
|
||||
#define EXT4_FEATURE_INCOMPAT_FLEX_BG 0x0200
|
||||
#define EXT4_FEATURE_INCOMPAT_CSUM_SEED 0x2000
|
||||
+#define EXT4_FEATURE_INCOMPAT_LARGEDIR 0x4000 /* >2GB or 3 level htree */
|
||||
#define EXT4_FEATURE_INCOMPAT_ENCRYPT 0x10000
|
||||
|
||||
/* The set of back-incompatible features this driver DOES support. Add (OR)
|
||||
@@ -129,10 +130,17 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||
* checksummed filesystem. Safe to ignore for now since the
|
||||
* driver doesn't support checksum verification. However, it
|
||||
* has to be removed from this list if the support is added later.
|
||||
+ * large_dir: Not back-incompatible given that the GRUB ext2 driver does
|
||||
+ * not implement EXT2_FEATURE_COMPAT_DIR_INDEX. If the GRUB
|
||||
+ * eventually supports the htree feature (aka dir_index)
|
||||
+ * it should support 3 level htrees and then move
|
||||
+ * EXT4_FEATURE_INCOMPAT_LARGEDIR to
|
||||
+ * EXT2_DRIVER_SUPPORTED_INCOMPAT.
|
||||
*/
|
||||
#define EXT2_DRIVER_IGNORED_INCOMPAT ( EXT3_FEATURE_INCOMPAT_RECOVER \
|
||||
| EXT4_FEATURE_INCOMPAT_MMP \
|
||||
- | EXT4_FEATURE_INCOMPAT_CSUM_SEED)
|
||||
+ | EXT4_FEATURE_INCOMPAT_CSUM_SEED \
|
||||
+ | EXT4_FEATURE_INCOMPAT_LARGEDIR)
|
||||
|
||||
#define EXT3_JOURNAL_MAGIC_NUMBER 0xc03b3998U
|
||||
|
||||
--
|
||||
2.40.1
|
||||
|
@ -1,120 +0,0 @@
|
||||
From 7c11f4f3d71c3fc8acff820b1fd449c94095dab9 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>
|
||||
---
|
||||
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 0f524c3a8..e3816d1ec 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
|
||||
{
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,57 +0,0 @@
|
||||
From 1eee02bbf2c11167e94f424846ce1de0b6e7fa8e Mon Sep 17 00:00:00 2001
|
||||
From: Mukesh Kumar Chaurasiya <mchauras@linux.vnet.ibm.com>
|
||||
Date: Fri, 3 Feb 2023 10:10:43 +0530
|
||||
Subject: [PATCH] grub-core: modify sector by sysfs as disk sector
|
||||
|
||||
The disk sector size provided by sysfs file system considers the
|
||||
sector size of 512 irrespective of disk sector size, Thus
|
||||
causing the read by grub to an incorrect offset from what was
|
||||
originally intended.
|
||||
|
||||
Considering the 512 sector size of sysfs data the actual sector
|
||||
needs to be modified corresponding to disk sector size.
|
||||
|
||||
Signed-off-by: Mukesh Kumar Chaurasiya <mchauras@linux.vnet.ibm.com>
|
||||
---
|
||||
grub-core/osdep/linux/hostdisk.c | 15 ++++++++++++---
|
||||
1 file changed, 12 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/grub-core/osdep/linux/hostdisk.c
|
||||
+++ b/grub-core/osdep/linux/hostdisk.c
|
||||
@@ -199,8 +199,15 @@
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
|
||||
+static inline grub_disk_addr_t
|
||||
+transform_sector (grub_disk_t disk, grub_disk_addr_t sector)
|
||||
+{
|
||||
+ return sector >> (disk->log_sector_size - GRUB_DISK_SECTOR_BITS);
|
||||
+}
|
||||
+
|
||||
static int
|
||||
-grub_hostdisk_linux_find_partition (char *dev, grub_disk_addr_t sector)
|
||||
+grub_hostdisk_linux_find_partition (const grub_disk_t disk, char *dev,
|
||||
+ grub_disk_addr_t sector)
|
||||
{
|
||||
size_t len = strlen (dev);
|
||||
const char *format;
|
||||
@@ -265,7 +272,8 @@
|
||||
if (fstat (fd, &st) < 0
|
||||
|| !grub_util_device_is_mapped_stat (&st)
|
||||
|| !grub_util_get_dm_node_linear_info (st.st_rdev, 0, 0, &start))
|
||||
- start = grub_util_find_partition_start_os (real_dev);
|
||||
+ start = transform_sector (disk,
|
||||
+ grub_util_find_partition_start_os (real_dev));
|
||||
/* We don't care about errors here. */
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
|
||||
@@ -346,7 +354,8 @@
|
||||
&& strncmp (dev, "/dev/", 5) == 0)
|
||||
{
|
||||
if (sector >= part_start)
|
||||
- is_partition = grub_hostdisk_linux_find_partition (dev, part_start);
|
||||
+ is_partition = grub_hostdisk_linux_find_partition (disk, dev,
|
||||
+ part_start);
|
||||
else
|
||||
*max = part_start - sector;
|
||||
}
|
@ -10,11 +10,9 @@ Signed-off-by: Michal Suchanek <msuchanek@suse.de>
|
||||
util/grub-install.c | 29 ++++++++++++++++++++++++++---
|
||||
3 files changed, 42 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/grub-core/osdep/linux/platform.c b/grub-core/osdep/linux/platform.c
|
||||
index e28a79dab..2a12ed867 100644
|
||||
--- a/grub-core/osdep/linux/platform.c
|
||||
+++ b/grub-core/osdep/linux/platform.c
|
||||
@@ -154,3 +154,16 @@ grub_install_get_default_x86_platform (void)
|
||||
@@ -154,3 +154,16 @@
|
||||
grub_util_info ("... not found");
|
||||
return "i386-pc";
|
||||
}
|
||||
@ -31,25 +29,21 @@ index e28a79dab..2a12ed867 100644
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
diff --git a/include/grub/util/install.h b/include/grub/util/install.h
|
||||
index c241a2a40..154487b72 100644
|
||||
--- a/include/grub/util/install.h
|
||||
+++ b/include/grub/util/install.h
|
||||
@@ -233,6 +233,9 @@ grub_install_get_default_arm_platform (void);
|
||||
const char *
|
||||
@@ -233,6 +233,9 @@
|
||||
grub_install_get_default_x86_platform (void);
|
||||
|
||||
+int
|
||||
int
|
||||
+grub_install_get_powerpc_secure_boot (void);
|
||||
+
|
||||
int
|
||||
+int
|
||||
grub_install_register_efi (grub_device_t efidir_grub_dev,
|
||||
const char *efifile_path,
|
||||
diff --git a/util/grub-install.c b/util/grub-install.c
|
||||
index a2286b3dd..8fb5ea616 100644
|
||||
const char *efi_distributor);
|
||||
--- a/util/grub-install.c
|
||||
+++ b/util/grub-install.c
|
||||
@@ -321,10 +321,10 @@ static struct argp_option options[] = {
|
||||
@@ -321,10 +321,10 @@
|
||||
{"suse-enable-tpm", OPTION_SUSE_ENABLE_TPM, 0, 0, N_("install TPM modules"), 0},
|
||||
{"suse-force-signed", OPTION_SUSE_FORCE_SIGNED, 0, 0,
|
||||
N_("force installation of signed grub" "%s."
|
||||
@ -62,7 +56,7 @@ index a2286b3dd..8fb5ea616 100644
|
||||
{"debug", OPTION_DEBUG, 0, OPTION_HIDDEN, 0, 2},
|
||||
{"no-floppy", OPTION_NO_FLOPPY, 0, OPTION_HIDDEN, 0, 2},
|
||||
{"debug-image", OPTION_DEBUG_IMAGE, N_("STRING"), OPTION_HIDDEN, 0, 2},
|
||||
@@ -1724,6 +1724,7 @@ main (int argc, char *argv[])
|
||||
@@ -1749,6 +1749,7 @@
|
||||
char mkimage_target[200];
|
||||
const char *core_name = NULL;
|
||||
char *signed_imgfile = NULL;
|
||||
@ -70,7 +64,7 @@ index a2286b3dd..8fb5ea616 100644
|
||||
|
||||
switch (platform)
|
||||
{
|
||||
@@ -1770,11 +1771,33 @@ main (int argc, char *argv[])
|
||||
@@ -1796,11 +1797,33 @@
|
||||
grub_install_get_platform_platform (platform));
|
||||
break;
|
||||
|
||||
@ -105,6 +99,3 @@ index a2286b3dd..8fb5ea616 100644
|
||||
case GRUB_INSTALL_PLATFORM_I386_XEN:
|
||||
case GRUB_INSTALL_PLATFORM_X86_64_XEN:
|
||||
case GRUB_INSTALL_PLATFORM_I386_XEN_PVH:
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
@ -24,11 +24,9 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
util/grub-install.c | 31 ++++++++++++++++++--------
|
||||
5 files changed, 70 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/grub-core/osdep/basic/no_platform.c b/grub-core/osdep/basic/no_platform.c
|
||||
index a173dafe90..dfbdd58e4e 100644
|
||||
--- a/grub-core/osdep/basic/no_platform.c
|
||||
+++ b/grub-core/osdep/basic/no_platform.c
|
||||
@@ -51,3 +51,8 @@ grub_install_zipl (const char *d, int i, int f)
|
||||
@@ -51,3 +51,8 @@
|
||||
grub_util_error ("%s", _("no zIPL routines are available for your platform"));
|
||||
}
|
||||
|
||||
@ -37,11 +35,9 @@ index a173dafe90..dfbdd58e4e 100644
|
||||
+{
|
||||
+ return NULL;
|
||||
+}
|
||||
diff --git a/grub-core/osdep/unix/platform.c b/grub-core/osdep/unix/platform.c
|
||||
index 4df143671a..68186480b2 100644
|
||||
--- a/grub-core/osdep/unix/platform.c
|
||||
+++ b/grub-core/osdep/unix/platform.c
|
||||
@@ -250,3 +250,37 @@ grub_install_zipl (const char *dest, int install, int force)
|
||||
@@ -250,3 +250,37 @@
|
||||
"-z", dest, NULL }))
|
||||
grub_util_error (_("`%s' failed.\n"), PACKAGE"-zipl-setup");
|
||||
}
|
||||
@ -79,11 +75,9 @@ index 4df143671a..68186480b2 100644
|
||||
+
|
||||
+ return buf;
|
||||
+}
|
||||
diff --git a/grub-core/osdep/windows/platform.c b/grub-core/osdep/windows/platform.c
|
||||
index 733c36d72c..1d2e356e6b 100644
|
||||
--- a/grub-core/osdep/windows/platform.c
|
||||
+++ b/grub-core/osdep/windows/platform.c
|
||||
@@ -430,3 +430,9 @@ grub_install_zipl (const char *d, int i, int f)
|
||||
@@ -440,3 +440,9 @@
|
||||
{
|
||||
grub_util_error ("%s", _("no zIPL routines are available for your platform"));
|
||||
}
|
||||
@ -93,25 +87,21 @@ index 733c36d72c..1d2e356e6b 100644
|
||||
+{
|
||||
+ return NULL;
|
||||
+}
|
||||
diff --git a/include/grub/util/install.h b/include/grub/util/install.h
|
||||
index 154487b72b..456955c3d7 100644
|
||||
--- a/include/grub/util/install.h
|
||||
+++ b/include/grub/util/install.h
|
||||
@@ -252,6 +252,9 @@ grub_install_sgi_setup (const char *install_device,
|
||||
@@ -251,6 +251,9 @@
|
||||
void
|
||||
grub_install_zipl (const char *d, int i, int f);
|
||||
|
||||
+char *
|
||||
+grub_install_get_filesystem (const char *path);
|
||||
+
|
||||
int
|
||||
int
|
||||
grub_install_compress_gzip (const char *src, const char *dest);
|
||||
int
|
||||
diff --git a/util/grub-install.c b/util/grub-install.c
|
||||
index 7bc5f84378..213f54a782 100644
|
||||
int
|
||||
--- a/util/grub-install.c
|
||||
+++ b/util/grub-install.c
|
||||
@@ -871,7 +871,6 @@ main (int argc, char *argv[])
|
||||
@@ -887,7 +887,6 @@
|
||||
const char *efi_file = NULL;
|
||||
char **grub_devices;
|
||||
grub_fs_t grub_fs;
|
||||
@ -119,7 +109,7 @@ index 7bc5f84378..213f54a782 100644
|
||||
grub_device_t grub_dev = NULL;
|
||||
enum grub_install_plat platform;
|
||||
char *grubdir, *device_map;
|
||||
@@ -1049,8 +1048,10 @@ main (int argc, char *argv[])
|
||||
@@ -1067,8 +1066,10 @@
|
||||
grub_host_init ();
|
||||
|
||||
{
|
||||
@ -132,7 +122,7 @@ index 7bc5f84378..213f54a782 100644
|
||||
char *t = grub_util_path_concat (2, "/", rootdir);
|
||||
|
||||
rootdir_path = grub_canonicalize_file_name (t);
|
||||
@@ -1071,20 +1072,32 @@ main (int argc, char *argv[])
|
||||
@@ -1089,20 +1090,32 @@
|
||||
rootdir_devices[0]);
|
||||
|
||||
rootdir_grub_dev = grub_device_open (rootdir_grub_devname);
|
||||
@ -171,6 +161,3 @@ index 7bc5f84378..213f54a782 100644
|
||||
}
|
||||
|
||||
switch (platform)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
@ -1,32 +0,0 @@
|
||||
From grub-devel-bounces@gnu.org Thu Aug 25 08:11:08 2022
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Thu, 25 Aug 2022 14:05:01 +0800
|
||||
Subject: [PATCH] grub-install: set point of no return for powerpc-ieee1275
|
||||
install
|
||||
|
||||
The point of no return is used to define a point where no change should
|
||||
be reverted in a wake of fatal error that consequently aborts the
|
||||
process. The powerpc-ieee1275 install apparently missed this point of no
|
||||
return defintion that newly installed modules could be inadvertently
|
||||
reverted after successful image embedding so that boot failure is
|
||||
incurred due to inconsistent state.
|
||||
|
||||
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
[iluceno@suse.de: Backported to SLES-15-SP4]
|
||||
Signed-off-by: Ismael Luceno <iluceno@suse.de>
|
||||
---
|
||||
util/grub-install.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
Index: grub-2.06/util/grub-install.c
|
||||
===================================================================
|
||||
--- grub-2.06.orig/util/grub-install.c
|
||||
+++ grub-2.06/util/grub-install.c
|
||||
@@ -2160,6 +2160,7 @@ main (int argc, char *argv[])
|
||||
{
|
||||
grub_util_error ("%s", _("failed to copy Grub to the PReP partition"));
|
||||
}
|
||||
+ grub_set_install_backup_ponr ();
|
||||
|
||||
if ((signed_grub_mode >= SIGNED_GRUB_FORCE) || ((signed_grub_mode == SIGNED_GRUB_AUTO) && (ppc_sb_state > 0)))
|
||||
{
|
@ -1,44 +0,0 @@
|
||||
From 7a5022ea64fd6af859383a1731632abc8755b8f7 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Thu, 26 Aug 2021 15:52:00 +0800
|
||||
Subject: [PATCH] grub-mkconfig: restore umask for grub.cfg
|
||||
|
||||
Since commit:
|
||||
|
||||
ab2e53c8a grub-mkconfig: Honor a symlink when generating configuration
|
||||
by grub-mkconfig
|
||||
|
||||
has inadvertently discarded umask for creating grub.cfg in the process
|
||||
of grub-mkconfig. The resulting wrong permission (0644) would allow
|
||||
unprivileged users to read grub's configuration file content. This
|
||||
presents a low confidentiality risk as grub.cfg may contain non-secured
|
||||
plain-text passwords.
|
||||
|
||||
This patch restores the missing umask and set the file mode of creation
|
||||
to 0600 preventing unprivileged access.
|
||||
|
||||
Fixes: CVE-2021-3981
|
||||
|
||||
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
util/grub-mkconfig.in | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in
|
||||
index 7f6d961d2..4aca09d8e 100644
|
||||
--- a/util/grub-mkconfig.in
|
||||
+++ b/util/grub-mkconfig.in
|
||||
@@ -351,7 +351,9 @@ and /etc/grub.d/* files or please file a bug report with
|
||||
exit 1
|
||||
else
|
||||
# none of the children aborted with error, install the new grub.cfg
|
||||
+ oldumask=$(umask); umask 077
|
||||
cat ${grub_cfg}.new > ${grub_cfg}
|
||||
+ umask $oldumask
|
||||
rm -f ${grub_cfg}.new
|
||||
# check if default entry need to be corrected for updated distributor version
|
||||
# and/or use fallback entry if default kernel entry removed
|
||||
--
|
||||
2.31.1
|
||||
|
@ -34,11 +34,9 @@ Signed-off-by: Wen Xiong <wenxiong@linux.ibm.com>
|
||||
include/grub/util/ofpath.h | 9 +++++++
|
||||
4 files changed, 63 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/grub-core/osdep/linux/ofpath.c b/grub-core/osdep/linux/ofpath.c
|
||||
index 7d31cfd0f..7129099db 100644
|
||||
--- a/grub-core/osdep/linux/ofpath.c
|
||||
+++ b/grub-core/osdep/linux/ofpath.c
|
||||
@@ -209,7 +209,7 @@ find_obppath (const char *sysfs_path_orig)
|
||||
@@ -209,7 +209,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@ -47,7 +45,7 @@ index 7d31cfd0f..7129099db 100644
|
||||
xrealpath (const char *in)
|
||||
{
|
||||
char *out;
|
||||
@@ -224,7 +224,7 @@ xrealpath (const char *in)
|
||||
@@ -224,7 +224,7 @@
|
||||
return out;
|
||||
}
|
||||
|
||||
@ -56,7 +54,7 @@ index 7d31cfd0f..7129099db 100644
|
||||
block_device_get_sysfs_path_and_link(const char *devicenode)
|
||||
{
|
||||
char *rpath;
|
||||
@@ -535,7 +535,7 @@ of_path_get_nvme_nsid(const char* devname)
|
||||
@@ -535,7 +535,7 @@
|
||||
|
||||
}
|
||||
|
||||
@ -65,8 +63,6 @@ index 7d31cfd0f..7129099db 100644
|
||||
nvme_get_syspath(const char *nvmedev)
|
||||
{
|
||||
char *sysfs_path, *controller_node;
|
||||
diff --git a/grub-core/osdep/unix/platform.c b/grub-core/osdep/unix/platform.c
|
||||
index 1e2961e00..db8fa4b95 100644
|
||||
--- a/grub-core/osdep/unix/platform.c
|
||||
+++ b/grub-core/osdep/unix/platform.c
|
||||
@@ -19,6 +19,7 @@
|
||||
@ -77,7 +73,7 @@ index 1e2961e00..db8fa4b95 100644
|
||||
#include <grub/emu/hostdisk.h>
|
||||
#include <grub/util/misc.h>
|
||||
#include <grub/misc.h>
|
||||
@@ -131,6 +132,51 @@ grub_install_remove_efi_entries_by_distributor (const char *efi_distributor)
|
||||
@@ -131,6 +132,51 @@
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -129,7 +125,7 @@ index 1e2961e00..db8fa4b95 100644
|
||||
int
|
||||
grub_install_register_efi (const grub_disk_t *efidir_grub_disk,
|
||||
const char *efifile_path,
|
||||
@@ -242,6 +288,8 @@ grub_install_register_ieee1275 (int is_prep, const char *install_device,
|
||||
@@ -242,6 +288,8 @@
|
||||
}
|
||||
*ptr = '\0';
|
||||
}
|
||||
@ -138,11 +134,9 @@ index 1e2961e00..db8fa4b95 100644
|
||||
else
|
||||
boot_device = get_ofpathname (install_device);
|
||||
|
||||
diff --git a/include/grub/util/install.h b/include/grub/util/install.h
|
||||
index c144f3e4d..15f24efac 100644
|
||||
--- a/include/grub/util/install.h
|
||||
+++ b/include/grub/util/install.h
|
||||
@@ -240,6 +240,9 @@ grub_install_register_efi (const grub_disk_t *efidir_grub_disk,
|
||||
@@ -241,6 +241,9 @@
|
||||
const char *efi_distributor,
|
||||
const char *force_disk);
|
||||
|
||||
@ -152,11 +146,9 @@ index c144f3e4d..15f24efac 100644
|
||||
void
|
||||
grub_install_register_ieee1275 (int is_prep, const char *install_device,
|
||||
int partno, const char *relpath);
|
||||
diff --git a/include/grub/util/ofpath.h b/include/grub/util/ofpath.h
|
||||
index a0ec30620..5b1f6a56d 100644
|
||||
--- a/include/grub/util/ofpath.h
|
||||
+++ b/include/grub/util/ofpath.h
|
||||
@@ -32,4 +32,13 @@ void find_file(char* filename, char* directory, struct ofpath_files_list_root* r
|
||||
@@ -32,4 +32,13 @@
|
||||
|
||||
char* of_find_fc_host(char* host_wwpn);
|
||||
|
||||
@ -170,6 +162,3 @@ index a0ec30620..5b1f6a56d 100644
|
||||
+
|
||||
+
|
||||
#endif /* ! GRUB_OFPATH_MACHINE_UTIL_HEADER */
|
||||
--
|
||||
2.35.3
|
||||
|
||||
|
@ -1,239 +0,0 @@
|
||||
From f86bd28391e6d92f8084f0b789ba4a8f6d789dfa Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Berger <stefanb@linux.ibm.com>
|
||||
Date: Sun, 15 Mar 2020 12:37:10 -0400
|
||||
Subject: [PATCH 1/2] ibmvtpm: Add support for trusted boot using a vTPM 2.0
|
||||
|
||||
Add support for trusted boot using a vTPM 2.0 on the IBM IEEE1275
|
||||
PowerPC platform. With this patch grub now measures text and binary data
|
||||
into the TPM's PCRs 8 and 9 in the same way as the x86_64 platform
|
||||
does.
|
||||
|
||||
This patch requires Daniel Axtens's patches for claiming more memory.
|
||||
|
||||
For vTPM support to work on PowerVM, system driver levels 1010.30
|
||||
or 1020.00 are required.
|
||||
|
||||
Note: Previous versions of firmware levels with the 2hash-ext-log
|
||||
API call have a bug that, once this API call is invoked, has the
|
||||
effect of disabling the vTPM driver under Linux causing an error
|
||||
message to be displayed in the Linux kernel log. Those users will
|
||||
have to update their machines to the firmware levels mentioned
|
||||
above.
|
||||
|
||||
Cc: Eric Snowberg <eric.snowberg@oracle.com>
|
||||
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
|
||||
---
|
||||
docs/grub.texi | 3 +-
|
||||
grub-core/Makefile.core.def | 7 ++
|
||||
grub-core/commands/ieee1275/ibmvtpm.c | 152 ++++++++++++++++++++++++++
|
||||
include/grub/ieee1275/ieee1275.h | 3 +
|
||||
4 files changed, 164 insertions(+), 1 deletion(-)
|
||||
create mode 100644 grub-core/commands/ieee1275/ibmvtpm.c
|
||||
|
||||
diff --git a/docs/grub.texi b/docs/grub.texi
|
||||
index 4504bcabe..026aacacf 100644
|
||||
--- a/docs/grub.texi
|
||||
+++ b/docs/grub.texi
|
||||
@@ -6204,7 +6204,8 @@ tpm module is loaded. As such it is recommended that the tpm module be built
|
||||
into @file{core.img} in order to avoid a potential gap in measurement between
|
||||
@file{core.img} being loaded and the tpm module being loaded.
|
||||
|
||||
-Measured boot is currently only supported on EFI platforms.
|
||||
+Measured boot is currently only supported on EFI and IBM IEEE1275 PowerPC
|
||||
+platforms.
|
||||
|
||||
@node Lockdown
|
||||
@section Lockdown when booting on a secure setup
|
||||
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
|
||||
index cee596872..54733425c 100644
|
||||
--- a/grub-core/Makefile.core.def
|
||||
+++ b/grub-core/Makefile.core.def
|
||||
@@ -1141,6 +1141,13 @@ module = {
|
||||
enable = powerpc_ieee1275;
|
||||
};
|
||||
|
||||
+module = {
|
||||
+ name = tpm;
|
||||
+ common = commands/tpm.c;
|
||||
+ ieee1275 = commands/ieee1275/ibmvtpm.c;
|
||||
+ enable = powerpc_ieee1275;
|
||||
+};
|
||||
+
|
||||
module = {
|
||||
name = terminal;
|
||||
common = commands/terminal.c;
|
||||
diff --git a/grub-core/commands/ieee1275/ibmvtpm.c b/grub-core/commands/ieee1275/ibmvtpm.c
|
||||
new file mode 100644
|
||||
index 000000000..e68b8448b
|
||||
--- /dev/null
|
||||
+++ b/grub-core/commands/ieee1275/ibmvtpm.c
|
||||
@@ -0,0 +1,152 @@
|
||||
+/*
|
||||
+ * GRUB -- GRand Unified Bootloader
|
||||
+ * Copyright (C) 2021 Free Software Foundation, Inc.
|
||||
+ * Copyright (C) 2021 IBM Corporation
|
||||
+ *
|
||||
+ * 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 <http://www.gnu.org/licenses/>.
|
||||
+ *
|
||||
+ * IBM vTPM support code.
|
||||
+ */
|
||||
+
|
||||
+#include <grub/err.h>
|
||||
+#include <grub/types.h>
|
||||
+#include <grub/tpm.h>
|
||||
+#include <grub/ieee1275/ieee1275.h>
|
||||
+#include <grub/mm.h>
|
||||
+#include <grub/misc.h>
|
||||
+
|
||||
+static grub_ieee1275_ihandle_t tpm_ihandle;
|
||||
+static grub_uint8_t tpm_version;
|
||||
+
|
||||
+#define IEEE1275_IHANDLE_INVALID ((grub_ieee1275_ihandle_t)0)
|
||||
+
|
||||
+static void
|
||||
+tpm_get_tpm_version (void)
|
||||
+{
|
||||
+ grub_ieee1275_phandle_t vtpm;
|
||||
+ char buffer[20];
|
||||
+
|
||||
+ if (!grub_ieee1275_finddevice ("/vdevice/vtpm", &vtpm) &&
|
||||
+ !grub_ieee1275_get_property (vtpm, "compatible", buffer,
|
||||
+ sizeof (buffer), NULL) &&
|
||||
+ !grub_strcmp (buffer, "IBM,vtpm20"))
|
||||
+ tpm_version = 2;
|
||||
+}
|
||||
+
|
||||
+static grub_err_t
|
||||
+tpm_init (void)
|
||||
+{
|
||||
+ static int init_success = 0;
|
||||
+
|
||||
+ if (!init_success)
|
||||
+ {
|
||||
+ if (grub_ieee1275_open ("/vdevice/vtpm", &tpm_ihandle) < 0) {
|
||||
+ tpm_ihandle = IEEE1275_IHANDLE_INVALID;
|
||||
+ return GRUB_ERR_UNKNOWN_DEVICE;
|
||||
+ }
|
||||
+
|
||||
+ init_success = 1;
|
||||
+
|
||||
+ tpm_get_tpm_version ();
|
||||
+ }
|
||||
+
|
||||
+ return GRUB_ERR_NONE;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+ibmvtpm_2hash_ext_log (grub_uint8_t pcrindex,
|
||||
+ grub_uint32_t eventtype,
|
||||
+ const char *description,
|
||||
+ grub_size_t description_size,
|
||||
+ void *buf, grub_size_t size)
|
||||
+{
|
||||
+ struct tpm_2hash_ext_log
|
||||
+ {
|
||||
+ struct grub_ieee1275_common_hdr common;
|
||||
+ grub_ieee1275_cell_t method;
|
||||
+ grub_ieee1275_cell_t ihandle;
|
||||
+ grub_ieee1275_cell_t size;
|
||||
+ grub_ieee1275_cell_t buf;
|
||||
+ grub_ieee1275_cell_t description_size;
|
||||
+ grub_ieee1275_cell_t description;
|
||||
+ grub_ieee1275_cell_t eventtype;
|
||||
+ grub_ieee1275_cell_t pcrindex;
|
||||
+ grub_ieee1275_cell_t catch_result;
|
||||
+ grub_ieee1275_cell_t rc;
|
||||
+ }
|
||||
+ args;
|
||||
+
|
||||
+ INIT_IEEE1275_COMMON (&args.common, "call-method", 8, 2);
|
||||
+ args.method = (grub_ieee1275_cell_t) "2hash-ext-log";
|
||||
+ args.ihandle = tpm_ihandle;
|
||||
+ args.pcrindex = pcrindex;
|
||||
+ args.eventtype = eventtype;
|
||||
+ args.description = (grub_ieee1275_cell_t) description;
|
||||
+ args.description_size = description_size;
|
||||
+ args.buf = (grub_ieee1275_cell_t) buf;
|
||||
+ args.size = (grub_ieee1275_cell_t) size;
|
||||
+
|
||||
+ if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
|
||||
+ return -1;
|
||||
+
|
||||
+ /*
|
||||
+ * catch_result is set if firmware does not support 2hash-ext-log
|
||||
+ * rc is GRUB_IEEE1275_CELL_FALSE (0) on failure
|
||||
+ */
|
||||
+ if ((args.catch_result) || args.rc == GRUB_IEEE1275_CELL_FALSE)
|
||||
+ return -1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static grub_err_t
|
||||
+tpm2_log_event (unsigned char *buf,
|
||||
+ grub_size_t size, grub_uint8_t pcr,
|
||||
+ const char *description)
|
||||
+{
|
||||
+ static int error_displayed = 0;
|
||||
+ int err;
|
||||
+
|
||||
+ err = ibmvtpm_2hash_ext_log (pcr, EV_IPL,
|
||||
+ description,
|
||||
+ grub_strlen(description) + 1,
|
||||
+ buf, size);
|
||||
+ if (err && !error_displayed)
|
||||
+ {
|
||||
+ error_displayed++;
|
||||
+ return grub_error (GRUB_ERR_BAD_DEVICE,
|
||||
+ "2HASH-EXT-LOG failed: Firmware is likely too old.\n");
|
||||
+ }
|
||||
+
|
||||
+ return GRUB_ERR_NONE;
|
||||
+}
|
||||
+
|
||||
+grub_err_t
|
||||
+grub_tpm_measure (unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
|
||||
+ const char *description)
|
||||
+{
|
||||
+ grub_err_t err = tpm_init();
|
||||
+
|
||||
+ /* Absence of a TPM isn't a failure. */
|
||||
+ if (err != GRUB_ERR_NONE)
|
||||
+ return GRUB_ERR_NONE;
|
||||
+
|
||||
+ grub_dprintf ("tpm", "log_event, pcr = %d, size = 0x%" PRIxGRUB_SIZE ", %s\n",
|
||||
+ pcr, size, description);
|
||||
+
|
||||
+ if (tpm_version == 2)
|
||||
+ return tpm2_log_event (buf, size, pcr, description);
|
||||
+
|
||||
+ return GRUB_ERR_NONE;
|
||||
+}
|
||||
diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h
|
||||
index 591f4f12c..8a621af7c 100644
|
||||
--- a/include/grub/ieee1275/ieee1275.h
|
||||
+++ b/include/grub/ieee1275/ieee1275.h
|
||||
@@ -24,6 +24,9 @@
|
||||
#include <grub/types.h>
|
||||
#include <grub/machine/ieee1275.h>
|
||||
|
||||
+#define GRUB_IEEE1275_CELL_FALSE ((grub_ieee1275_cell_t) 0)
|
||||
+#define GRUB_IEEE1275_CELL_TRUE ((grub_ieee1275_cell_t) -1)
|
||||
+
|
||||
struct grub_ieee1275_mem_region
|
||||
{
|
||||
unsigned int start;
|
||||
--
|
||||
2.35.3
|
||||
|
@ -16,11 +16,9 @@ Signed-off-by: Diego Domingos <diegodo@linux.vnet.ibm.com>
|
||||
grub-core/disk/ieee1275/ofdisk.c | 64 +++++++++++++++++---------------
|
||||
1 file changed, 35 insertions(+), 29 deletions(-)
|
||||
|
||||
diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c
|
||||
index 03674cb47..ea7f78ac7 100644
|
||||
--- a/grub-core/disk/ieee1275/ofdisk.c
|
||||
+++ b/grub-core/disk/ieee1275/ofdisk.c
|
||||
@@ -44,7 +44,7 @@ struct ofdisk_hash_ent
|
||||
@@ -44,7 +44,7 @@
|
||||
};
|
||||
|
||||
static grub_err_t
|
||||
@ -29,7 +27,7 @@ index 03674cb47..ea7f78ac7 100644
|
||||
struct ofdisk_hash_ent *op);
|
||||
|
||||
#define OFDISK_HASH_SZ 8
|
||||
@@ -461,6 +461,7 @@ grub_ofdisk_open (const char *name, grub_disk_t disk)
|
||||
@@ -461,6 +461,7 @@
|
||||
grub_ssize_t actual;
|
||||
grub_uint32_t block_size = 0;
|
||||
grub_err_t err;
|
||||
@ -37,7 +35,7 @@ index 03674cb47..ea7f78ac7 100644
|
||||
|
||||
if (grub_strncmp (name, "ieee1275/", sizeof ("ieee1275/") - 1) != 0)
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE,
|
||||
@@ -471,6 +472,35 @@ grub_ofdisk_open (const char *name, grub_disk_t disk)
|
||||
@@ -471,6 +472,35 @@
|
||||
|
||||
grub_dprintf ("disk", "Opening `%s'.\n", devpath);
|
||||
|
||||
@ -73,7 +71,7 @@ index 03674cb47..ea7f78ac7 100644
|
||||
if (grub_ieee1275_finddevice (devpath, &dev))
|
||||
{
|
||||
grub_free (devpath);
|
||||
@@ -491,25 +521,18 @@ grub_ofdisk_open (const char *name, grub_disk_t disk)
|
||||
@@ -491,25 +521,18 @@
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a block device");
|
||||
}
|
||||
|
||||
@ -102,7 +100,7 @@ index 03674cb47..ea7f78ac7 100644
|
||||
if (err)
|
||||
{
|
||||
grub_free (devpath);
|
||||
@@ -532,13 +555,6 @@ grub_ofdisk_open (const char *name, grub_disk_t disk)
|
||||
@@ -528,13 +551,6 @@
|
||||
static void
|
||||
grub_ofdisk_close (grub_disk_t disk)
|
||||
{
|
||||
@ -116,7 +114,7 @@ index 03674cb47..ea7f78ac7 100644
|
||||
disk->data = 0;
|
||||
}
|
||||
|
||||
@@ -685,7 +701,7 @@ grub_ofdisk_init (void)
|
||||
@@ -681,7 +697,7 @@
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
@ -125,7 +123,7 @@ index 03674cb47..ea7f78ac7 100644
|
||||
struct ofdisk_hash_ent *op)
|
||||
{
|
||||
struct size_args_ieee1275
|
||||
@@ -698,16 +714,6 @@ grub_ofdisk_get_block_size (const char *device, grub_uint32_t *block_size,
|
||||
@@ -694,16 +710,6 @@
|
||||
grub_ieee1275_cell_t size2;
|
||||
} args_ieee1275;
|
||||
|
||||
@ -142,6 +140,3 @@ index 03674cb47..ea7f78ac7 100644
|
||||
*block_size = 0;
|
||||
|
||||
if (op->block_size_fails >= 2)
|
||||
--
|
||||
2.26.2
|
||||
|
||||
|
@ -1,82 +0,0 @@
|
||||
From 41589d37934c7e4c464a584939de0137af7a181b Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Axtens <dja@axtens.net>
|
||||
Date: Tue, 20 Jul 2021 17:14:46 -0400
|
||||
Subject: [PATCH 01/23] ieee1275: Drop HEAP_MAX_ADDR and HEAP_MIN_SIZE
|
||||
constants
|
||||
|
||||
The HEAP_MAX_ADDR is confusing. Currently it is set to 32MB, except on
|
||||
ieee1275 on x86, where it is 64MB.
|
||||
|
||||
There is a comment which purports to explain it:
|
||||
|
||||
/* If possible, we will avoid claiming heap above this address, because it
|
||||
seems to cause relocation problems with OSes that link at 4 MiB */
|
||||
|
||||
This doesn't make a lot of sense when the constants are well above 4MB
|
||||
already. It was not always this way. Prior to commit 7b5d0fe4440c
|
||||
(Increase heap limit) in 2010, HEAP_MAX_SIZE and HEAP_MAX_ADDR were
|
||||
indeed 4MB. However, when the constants were increased the comment was
|
||||
left unchanged.
|
||||
|
||||
It's been over a decade. It doesn't seem like we have problems with
|
||||
claims over 4MB on powerpc or x86 ieee1275. The SPARC does things
|
||||
completely differently and never used the constant.
|
||||
|
||||
Drop the constant and the check.
|
||||
|
||||
The only use of HEAP_MIN_SIZE was to potentially override the
|
||||
HEAP_MAX_ADDR check. It is now unused. Remove it too.
|
||||
|
||||
Signed-off-by: Daniel Axtens <dja@axtens.net>
|
||||
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
|
||||
Tested-by: Stefan Berger <stefanb@linux.ibm.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/kern/ieee1275/init.c | 17 -----------------
|
||||
1 file changed, 17 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
|
||||
index 1187492ae..c15d40e55 100644
|
||||
--- a/grub-core/kern/ieee1275/init.c
|
||||
+++ b/grub-core/kern/ieee1275/init.c
|
||||
@@ -45,9 +45,6 @@
|
||||
#include <grub/machine/kernel.h>
|
||||
#endif
|
||||
|
||||
-/* The minimal heap size we can live with. */
|
||||
-#define HEAP_MIN_SIZE (unsigned long) (2 * 1024 * 1024)
|
||||
-
|
||||
/* The maximum heap size we're going to claim */
|
||||
#ifdef __i386__
|
||||
#define HEAP_MAX_SIZE (unsigned long) (64 * 1024 * 1024)
|
||||
@@ -55,14 +52,6 @@
|
||||
#define HEAP_MAX_SIZE (unsigned long) (32 * 1024 * 1024)
|
||||
#endif
|
||||
|
||||
-/* If possible, we will avoid claiming heap above this address, because it
|
||||
- seems to cause relocation problems with OSes that link at 4 MiB */
|
||||
-#ifdef __i386__
|
||||
-#define HEAP_MAX_ADDR (unsigned long) (64 * 1024 * 1024)
|
||||
-#else
|
||||
-#define HEAP_MAX_ADDR (unsigned long) (32 * 1024 * 1024)
|
||||
-#endif
|
||||
-
|
||||
extern char _start[];
|
||||
extern char _end[];
|
||||
|
||||
@@ -184,12 +173,6 @@ heap_init (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
|
||||
if (*total + len > HEAP_MAX_SIZE)
|
||||
len = HEAP_MAX_SIZE - *total;
|
||||
|
||||
- /* Avoid claiming anything above HEAP_MAX_ADDR, if possible. */
|
||||
- if ((addr < HEAP_MAX_ADDR) && /* if it's too late, don't bother */
|
||||
- (addr + len > HEAP_MAX_ADDR) && /* if it wasn't available anyway, don't bother */
|
||||
- (*total + (HEAP_MAX_ADDR - addr) > HEAP_MIN_SIZE)) /* only limit ourselves when we can afford to */
|
||||
- len = HEAP_MAX_ADDR - addr;
|
||||
-
|
||||
/* In theory, firmware should already prevent this from happening by not
|
||||
listing our own image in /memory/available. The check below is intended
|
||||
as a safeguard in case that doesn't happen. However, it doesn't protect
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,46 +0,0 @@
|
||||
From d44e0a892621a744e9a64e17ed5676470ef4f023 Mon Sep 17 00:00:00 2001
|
||||
From: Wen Xiong <wenxiong@linux.ibm.com>
|
||||
Date: Mon, 20 Feb 2023 15:58:14 -0500
|
||||
Subject: [PATCH 1/2] ieee1275: Further increase initially allocated heap from
|
||||
1/3 to 1/2
|
||||
|
||||
The memory increase to 1/3 of 391MB (~127MB) was still insufficient
|
||||
to boot the kernel and initrd of the SuSE distribution:
|
||||
|
||||
initrd 2023-Jan-18 04:27 114.9M
|
||||
linux 2023-Jan-17 05:23 45.9M
|
||||
|
||||
Therefore, further increase the initially allocated heap to 1/2
|
||||
of 391MB to ~191MB, which now allows to boot the system from an
|
||||
ISO.
|
||||
|
||||
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
|
||||
---
|
||||
grub-core/kern/ieee1275/init.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
|
||||
index 2a2409d45..e1dbff86a 100644
|
||||
--- a/grub-core/kern/ieee1275/init.c
|
||||
+++ b/grub-core/kern/ieee1275/init.c
|
||||
@@ -47,7 +47,7 @@
|
||||
#include <grub/lockdown.h>
|
||||
|
||||
/* The maximum heap size we're going to claim. Not used by sparc.
|
||||
- We allocate 1/3 of the available memory under 4G, up to this limit. */
|
||||
+ We allocate 1/2 of the available memory under 4G, up to this limit. */
|
||||
#ifdef __i386__
|
||||
#define HEAP_MAX_SIZE (unsigned long) (64 * 1024 * 1024)
|
||||
#else // __powerpc__
|
||||
@@ -417,7 +417,7 @@ grub_claim_heap (void)
|
||||
|
||||
grub_machine_mmap_iterate (heap_size, &total);
|
||||
|
||||
- total = total / 3;
|
||||
+ total = total / 2;
|
||||
if (total > HEAP_MAX_SIZE)
|
||||
total = HEAP_MAX_SIZE;
|
||||
|
||||
--
|
||||
2.39.1
|
||||
|
@ -1,49 +0,0 @@
|
||||
From 41965e194599af42e77bcf2462bd9c0db2823b16 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Berger <stefanb@linux.ibm.com>
|
||||
Date: Tue, 1 Nov 2022 11:06:03 -0400
|
||||
Subject: [PATCH] ieee1275: Increase initially allocated heap from 1/4 to 1/3
|
||||
|
||||
The patch 'ieee1275: claim more memory' (commit 910676645d) states:
|
||||
|
||||
"[...] This leaves us 381MB. 1/4 of 381MB is ~95MB. That should be enough
|
||||
to verify a 30MB vmlinux and should eave plenty of space to load Linux
|
||||
and the initrd."
|
||||
|
||||
As it turns out the memory limit of ~95MB is insufficient for the FADUMP
|
||||
use case as described here:
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=2139000#c1
|
||||
|
||||
Adjust the current memory limitation by increasing the allocation to
|
||||
1/3 of 381 MB, so ~127MB.
|
||||
|
||||
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
|
||||
---
|
||||
grub-core/kern/ieee1275/init.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
|
||||
index 0bacc2348..f75a36493 100644
|
||||
--- a/grub-core/kern/ieee1275/init.c
|
||||
+++ b/grub-core/kern/ieee1275/init.c
|
||||
@@ -47,7 +47,7 @@
|
||||
#include <grub/lockdown.h>
|
||||
|
||||
/* The maximum heap size we're going to claim. Not used by sparc.
|
||||
- We allocate 1/4 of the available memory under 4G, up to this limit. */
|
||||
+ We allocate 1/3 of the available memory under 4G, up to this limit. */
|
||||
#ifdef __i386__
|
||||
#define HEAP_MAX_SIZE (unsigned long) (64 * 1024 * 1024)
|
||||
#else // __powerpc__
|
||||
@@ -415,7 +415,7 @@ grub_claim_heap (void)
|
||||
|
||||
grub_machine_mmap_iterate (heap_size, &total);
|
||||
|
||||
- total = total / 4;
|
||||
+ total = total / 3;
|
||||
if (total > HEAP_MAX_SIZE)
|
||||
total = HEAP_MAX_SIZE;
|
||||
|
||||
--
|
||||
2.35.3
|
||||
|
@ -17,8 +17,6 @@ Signed-off-by: Mukesh Kumar Chaurasiya <mchauras@linux.vnet.ibm.com>
|
||||
grub-core/disk/ieee1275/ofdisk.c | 65 +++++++++++++++++++++++++++++++-
|
||||
1 file changed, 63 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c
|
||||
index c6cba0c8a..f4183a531 100644
|
||||
--- a/grub-core/disk/ieee1275/ofdisk.c
|
||||
+++ b/grub-core/disk/ieee1275/ofdisk.c
|
||||
@@ -24,6 +24,9 @@
|
||||
@ -31,7 +29,7 @@ index c6cba0c8a..f4183a531 100644
|
||||
|
||||
static char *last_devpath;
|
||||
static grub_ieee1275_ihandle_t last_ihandle;
|
||||
@@ -452,7 +455,7 @@ compute_dev_path (const char *name)
|
||||
@@ -783,7 +786,7 @@
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
@ -40,7 +38,7 @@ index c6cba0c8a..f4183a531 100644
|
||||
{
|
||||
grub_ieee1275_phandle_t dev;
|
||||
char *devpath;
|
||||
@@ -525,6 +528,41 @@ grub_ofdisk_open (const char *name, grub_disk_t disk)
|
||||
@@ -879,6 +882,41 @@
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -82,7 +80,7 @@ index c6cba0c8a..f4183a531 100644
|
||||
static void
|
||||
grub_ofdisk_close (grub_disk_t disk)
|
||||
{
|
||||
@@ -568,7 +606,7 @@ grub_ofdisk_prepare (grub_disk_t disk, grub_disk_addr_t sector)
|
||||
@@ -915,7 +953,7 @@
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
@ -91,11 +89,10 @@ index c6cba0c8a..f4183a531 100644
|
||||
grub_size_t size, char *buf)
|
||||
{
|
||||
grub_err_t err;
|
||||
@@ -587,6 +625,29 @@ grub_ofdisk_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
return 0;
|
||||
@@ -935,6 +973,29 @@
|
||||
}
|
||||
|
||||
+static grub_err_t
|
||||
static grub_err_t
|
||||
+grub_ofdisk_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
+ grub_size_t size, char *buf)
|
||||
+{
|
||||
@ -118,9 +115,7 @@ index c6cba0c8a..f4183a531 100644
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
static grub_err_t
|
||||
+static grub_err_t
|
||||
grub_ofdisk_write (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
grub_size_t size, const char *buf)
|
||||
--
|
||||
2.39.2
|
||||
|
||||
{
|
||||
|
@ -39,11 +39,9 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
util/grub-install.c | 107 ++++++++++++++++++++++++++--
|
||||
8 files changed, 171 insertions(+), 37 deletions(-)
|
||||
|
||||
diff --git a/grub-core/disk/diskfilter.c b/grub-core/disk/diskfilter.c
|
||||
index 39d74cb867..de0c02cf94 100644
|
||||
--- a/grub-core/disk/diskfilter.c
|
||||
+++ b/grub-core/disk/diskfilter.c
|
||||
@@ -159,8 +159,8 @@ scan_disk_partition_iter (grub_disk_t disk, grub_partition_t p, void *data)
|
||||
@@ -159,8 +159,8 @@
|
||||
for (m = arr->pvs; m; m = m->next)
|
||||
if (m->disk && m->disk->id == disk->id
|
||||
&& m->disk->dev->id == disk->dev->id
|
||||
@ -54,8 +52,8 @@ index 39d74cb867..de0c02cf94 100644
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1330,19 +1330,23 @@ insert_array (grub_disk_t disk, const struct grub_diskfilter_pv_id *id,
|
||||
? (grub_memcmp (pv->id.uuid, id->uuid, id->uuidlen) == 0)
|
||||
@@ -1340,19 +1340,23 @@
|
||||
? (grub_memcmp (pv->id.uuid, id->uuid, id->uuidlen) == 0)
|
||||
: (pv->id.id == id->id))
|
||||
{
|
||||
+ char *part_name = NULL;
|
||||
@ -85,7 +83,7 @@ index 39d74cb867..de0c02cf94 100644
|
||||
|
||||
#ifdef GRUB_UTIL
|
||||
{
|
||||
@@ -1359,7 +1363,6 @@ insert_array (grub_disk_t disk, const struct grub_diskfilter_pv_id *id,
|
||||
@@ -1369,7 +1373,6 @@
|
||||
#endif
|
||||
if (start_sector != (grub_uint64_t)-1)
|
||||
pv->start_sector = start_sector;
|
||||
@ -93,7 +91,7 @@ index 39d74cb867..de0c02cf94 100644
|
||||
/* Add the device to the array. */
|
||||
for (lv = array->lvs; lv; lv = lv->next)
|
||||
if (!lv->became_readable_at && lv->fullname && is_lv_readable (lv, 0))
|
||||
@@ -1447,8 +1450,8 @@ grub_diskfilter_get_pv_from_disk (grub_disk_t disk,
|
||||
@@ -1457,8 +1460,8 @@
|
||||
{
|
||||
if (pv->disk && pv->disk->id == disk->id
|
||||
&& pv->disk->dev->id == disk->dev->id
|
||||
@ -104,11 +102,9 @@ index 39d74cb867..de0c02cf94 100644
|
||||
{
|
||||
if (vg_out)
|
||||
*vg_out = vg;
|
||||
diff --git a/grub-core/disk/mdraid1x_linux.c b/grub-core/disk/mdraid1x_linux.c
|
||||
index 38444b02c7..a2aafb69fb 100644
|
||||
--- a/grub-core/disk/mdraid1x_linux.c
|
||||
+++ b/grub-core/disk/mdraid1x_linux.c
|
||||
@@ -208,6 +208,9 @@ grub_mdraid_detect (grub_disk_t disk,
|
||||
@@ -208,6 +208,9 @@
|
||||
grub_le_to_cpu32 (sb.chunksize),
|
||||
grub_le_to_cpu32 (sb.layout),
|
||||
grub_le_to_cpu32 (sb.level));
|
||||
@ -118,11 +114,9 @@ index 38444b02c7..a2aafb69fb 100644
|
||||
|
||||
return array;
|
||||
}
|
||||
diff --git a/grub-core/osdep/basic/no_platform.c b/grub-core/osdep/basic/no_platform.c
|
||||
index dfbdd58e4e..37b9570dbc 100644
|
||||
--- a/grub-core/osdep/basic/no_platform.c
|
||||
+++ b/grub-core/osdep/basic/no_platform.c
|
||||
@@ -33,7 +33,8 @@ grub_install_register_ieee1275 (int is_prep, const char *install_device,
|
||||
@@ -33,7 +33,8 @@
|
||||
void
|
||||
grub_install_register_efi (grub_device_t efidir_grub_dev,
|
||||
const char *efifile_path,
|
||||
@ -132,11 +126,9 @@ index dfbdd58e4e..37b9570dbc 100644
|
||||
{
|
||||
grub_util_error ("%s", _("no EFI routines are available for your platform"));
|
||||
}
|
||||
diff --git a/grub-core/osdep/unix/platform.c b/grub-core/osdep/unix/platform.c
|
||||
index 68186480b2..c7cf74c677 100644
|
||||
--- a/grub-core/osdep/unix/platform.c
|
||||
+++ b/grub-core/osdep/unix/platform.c
|
||||
@@ -132,15 +132,14 @@ grub_install_remove_efi_entries_by_distributor (const char *efi_distributor)
|
||||
@@ -132,15 +132,14 @@
|
||||
}
|
||||
|
||||
int
|
||||
@ -157,7 +149,7 @@ index 68186480b2..c7cf74c677 100644
|
||||
|
||||
if (grub_util_exec_redirect_null ((const char * []){ "efibootmgr", "--version", NULL }))
|
||||
{
|
||||
@@ -158,22 +157,50 @@ grub_install_register_efi (grub_device_t efidir_grub_dev,
|
||||
@@ -158,22 +157,50 @@
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@ -194,7 +186,7 @@ index 68186480b2..c7cf74c677 100644
|
||||
+ ret = grub_util_exec ((const char * []){ "efibootmgr", "-q",
|
||||
"-c", "-d", efidir_disk,
|
||||
"-p", efidir_part_str, "-w",
|
||||
- "-L", efi_distributor, "-l",
|
||||
- "-L", efi_distributor, "-l",
|
||||
+ "-L", new_efi_distributor ? : efi_distributor, "-l",
|
||||
efifile_path, NULL });
|
||||
- else
|
||||
@ -203,7 +195,7 @@ index 68186480b2..c7cf74c677 100644
|
||||
+ ret = grub_util_exec ((const char * []){ "efibootmgr",
|
||||
"-c", "-d", efidir_disk,
|
||||
"-p", efidir_part_str, "-w",
|
||||
- "-L", efi_distributor, "-l",
|
||||
- "-L", efi_distributor, "-l",
|
||||
+ "-L", new_efi_distributor ? : efi_distributor, "-l",
|
||||
efifile_path, NULL });
|
||||
- free (efidir_part_str);
|
||||
@ -217,11 +209,9 @@ index 68186480b2..c7cf74c677 100644
|
||||
}
|
||||
|
||||
void
|
||||
diff --git a/grub-core/osdep/windows/platform.c b/grub-core/osdep/windows/platform.c
|
||||
index 1d2e356e6b..3517803251 100644
|
||||
--- a/grub-core/osdep/windows/platform.c
|
||||
+++ b/grub-core/osdep/windows/platform.c
|
||||
@@ -204,7 +204,8 @@ set_efi_variable_bootn (grub_uint16_t n, void *in, grub_size_t len)
|
||||
@@ -204,7 +204,8 @@
|
||||
int
|
||||
grub_install_register_efi (grub_device_t efidir_grub_dev,
|
||||
const char *efifile_path,
|
||||
@ -231,11 +221,9 @@ index 1d2e356e6b..3517803251 100644
|
||||
{
|
||||
grub_uint16_t *boot_order, *new_boot_order;
|
||||
grub_uint16_t *distributor16;
|
||||
diff --git a/include/grub/diskfilter.h b/include/grub/diskfilter.h
|
||||
index 8deb1a8c30..94ed8673d7 100644
|
||||
--- a/include/grub/diskfilter.h
|
||||
+++ b/include/grub/diskfilter.h
|
||||
@@ -49,6 +49,7 @@ struct grub_diskfilter_vg {
|
||||
@@ -49,6 +49,7 @@
|
||||
|
||||
#ifdef GRUB_UTIL
|
||||
struct grub_diskfilter *driver;
|
||||
@ -243,7 +231,7 @@ index 8deb1a8c30..94ed8673d7 100644
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -66,8 +67,6 @@ struct grub_diskfilter_pv {
|
||||
@@ -66,8 +67,6 @@
|
||||
/* Optional. */
|
||||
char *name;
|
||||
grub_disk_t disk;
|
||||
@ -252,11 +240,9 @@ index 8deb1a8c30..94ed8673d7 100644
|
||||
grub_disk_addr_t start_sector; /* Sector number where the data area starts. */
|
||||
struct grub_diskfilter_pv *next;
|
||||
/* Optional. */
|
||||
diff --git a/include/grub/util/install.h b/include/grub/util/install.h
|
||||
index 456955c3d7..9f9e0b2ac1 100644
|
||||
--- a/include/grub/util/install.h
|
||||
+++ b/include/grub/util/install.h
|
||||
@@ -237,9 +237,10 @@ int
|
||||
@@ -236,9 +236,10 @@
|
||||
grub_install_get_powerpc_secure_boot (void);
|
||||
|
||||
int
|
||||
@ -269,11 +255,9 @@ index 456955c3d7..9f9e0b2ac1 100644
|
||||
|
||||
void
|
||||
grub_install_register_ieee1275 (int is_prep, const char *install_device,
|
||||
diff --git a/util/grub-install.c b/util/grub-install.c
|
||||
index 213f54a782..0cabc79119 100644
|
||||
--- a/util/grub-install.c
|
||||
+++ b/util/grub-install.c
|
||||
@@ -1694,6 +1694,40 @@ main (int argc, char *argv[])
|
||||
@@ -1719,6 +1719,40 @@
|
||||
}
|
||||
}
|
||||
prefix_drive = xasprintf ("(%s)", grub_drives[0]);
|
||||
@ -314,7 +298,7 @@ index 213f54a782..0cabc79119 100644
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
@@ -2232,9 +2266,13 @@ main (int argc, char *argv[])
|
||||
@@ -2258,9 +2292,13 @@
|
||||
{
|
||||
/* Try to make this image bootable using the EFI Boot Manager, if available. */
|
||||
int ret;
|
||||
@ -330,7 +314,7 @@ index 213f54a782..0cabc79119 100644
|
||||
if (ret)
|
||||
grub_util_error (_("efibootmgr failed to register the boot entry: %s"),
|
||||
strerror (ret));
|
||||
@@ -2287,7 +2325,11 @@ main (int argc, char *argv[])
|
||||
@@ -2314,7 +2352,11 @@
|
||||
{
|
||||
char * efifile_path;
|
||||
char * part;
|
||||
@ -342,7 +326,7 @@ index 213f54a782..0cabc79119 100644
|
||||
|
||||
/* Try to make this image bootable using the EFI Boot Manager, if available. */
|
||||
if (!efi_distributor || efi_distributor[0] == '\0')
|
||||
@@ -2304,8 +2346,65 @@ main (int argc, char *argv[])
|
||||
@@ -2331,8 +2373,65 @@
|
||||
efidir_grub_dev->disk->name,
|
||||
(part ? ",": ""), (part ? : ""));
|
||||
grub_free (part);
|
||||
@ -410,6 +394,3 @@ index 213f54a782..0cabc79119 100644
|
||||
if (ret)
|
||||
grub_util_error (_("efibootmgr failed to register the boot entry: %s"),
|
||||
strerror (ret));
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
@ -1,32 +0,0 @@
|
||||
From 3e08d9afd273b5dade84fec5f7f17113c47b6b75 Mon Sep 17 00:00:00 2001
|
||||
From: Gary Lin <glin@suse.com>
|
||||
Date: Fri, 2 Sep 2022 11:26:39 +0800
|
||||
Subject: [PATCH 1/2] kern/efi/mm: Enlarge the default heap size
|
||||
|
||||
The default heap size (0x100000, 1MB) is not enough for the
|
||||
openSUSE/SUSE theme, and the additional dynamical allocation of memory
|
||||
regions significantly slows down the loading of the grub2 menu theme.
|
||||
This commit increases the default heap size to 0x2000000, 32MB, and this
|
||||
should be enough to cover the theme files.
|
||||
|
||||
Signed-off-by: Gary Lin <glin@suse.com>
|
||||
---
|
||||
grub-core/kern/efi/mm.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c
|
||||
index 48380d3..70d3e3d 100644
|
||||
--- a/grub-core/kern/efi/mm.c
|
||||
+++ b/grub-core/kern/efi/mm.c
|
||||
@@ -39,7 +39,7 @@
|
||||
#define MEMORY_MAP_SIZE 0x3000
|
||||
|
||||
/* The default heap size for GRUB itself in bytes. */
|
||||
-#define DEFAULT_HEAP_SIZE 0x100000
|
||||
+#define DEFAULT_HEAP_SIZE 0x2000000
|
||||
|
||||
static void *finish_mmap_buf = 0;
|
||||
static grub_efi_uintn_t finish_mmap_size = 0;
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,50 +0,0 @@
|
||||
From 10f3a89078f9a6da7104e0978e385362e16af971 Mon Sep 17 00:00:00 2001
|
||||
From: Avnish Chouhan <avnish@linux.vnet.ibm.com>
|
||||
Date: Mon, 27 Mar 2023 12:25:39 +0530
|
||||
Subject: [PATCH 1/2] kern/ieee1275/init: Convert plain numbers to constants in
|
||||
Vec5
|
||||
|
||||
This patch converts the plain numbers used in Vec5 properties to constants.
|
||||
|
||||
1. LPAR: Client program supports logical partitioning and
|
||||
associated hcall()s.
|
||||
2. SPLPAR: Client program supports the Shared
|
||||
Processor LPAR Option.
|
||||
3. CMO: Enables the Cooperative Memory Over-commitment Option.
|
||||
4. MAX_CPU: Defines maximum number of CPUs supported.
|
||||
|
||||
Signed-off-by: Avnish Chouhan <avnish@linux.vnet.ibm.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/kern/ieee1275/init.c | 8 +++++++-
|
||||
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
|
||||
index e1dbff86a..eaa25d0db 100644
|
||||
--- a/grub-core/kern/ieee1275/init.c
|
||||
+++ b/grub-core/kern/ieee1275/init.c
|
||||
@@ -61,6 +61,12 @@ extern char _end[];
|
||||
grub_addr_t grub_ieee1275_original_stack;
|
||||
#endif
|
||||
|
||||
+#define LPAR 0x80
|
||||
+#define SPLPAR 0x40
|
||||
+#define BYTE2 (LPAR | SPLPAR)
|
||||
+#define CMO 0x80
|
||||
+#define MAX_CPU 256
|
||||
+
|
||||
void
|
||||
grub_exit (void)
|
||||
{
|
||||
@@ -378,7 +384,7 @@ grub_ieee1275_ibm_cas (void)
|
||||
.vec4 = 0x0001, /* set required minimum capacity % to the lowest value */
|
||||
.vec5_size = 1 + sizeof (struct option_vector5) - 2,
|
||||
.vec5 = {
|
||||
- 0, 192, 0, 128, 0, 0, 0, 0, 256
|
||||
+ 0, BYTE2, 0, CMO, 0, 0, 0, 0, MAX_CPU
|
||||
}
|
||||
};
|
||||
|
||||
--
|
||||
2.39.2
|
||||
|
@ -11,11 +11,9 @@ as stage1 that can be too old to load updated modules.
|
||||
include/grub/mm.h | 32 +++++++++++++++++++++++++++++++-
|
||||
2 files changed, 31 insertions(+), 29 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/mm.c b/grub-core/kern/mm.c
|
||||
index f2822a836..dacdaa239 100644
|
||||
--- a/grub-core/kern/mm.c
|
||||
+++ b/grub-core/kern/mm.c
|
||||
@@ -60,14 +60,10 @@
|
||||
@@ -63,14 +63,10 @@
|
||||
|
||||
#include <config.h>
|
||||
#include <grub/mm.h>
|
||||
@ -30,7 +28,7 @@ index f2822a836..dacdaa239 100644
|
||||
|
||||
#ifdef MM_DEBUG
|
||||
# undef grub_calloc
|
||||
@@ -377,30 +373,6 @@ grub_memalign (grub_size_t align, grub_size_t size)
|
||||
@@ -553,30 +549,6 @@
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -61,11 +59,9 @@ index f2822a836..dacdaa239 100644
|
||||
/* Allocate SIZE bytes and return the pointer. */
|
||||
void *
|
||||
grub_malloc (grub_size_t size)
|
||||
diff --git a/include/grub/mm.h b/include/grub/mm.h
|
||||
index 9c38dd3ca..1754635e7 100644
|
||||
--- a/include/grub/mm.h
|
||||
+++ b/include/grub/mm.h
|
||||
@@ -29,7 +29,6 @@
|
||||
@@ -47,7 +47,6 @@
|
||||
#endif
|
||||
|
||||
void grub_mm_init_region (void *addr, grub_size_t size);
|
||||
@ -73,7 +69,7 @@ index 9c38dd3ca..1754635e7 100644
|
||||
void *EXPORT_FUNC(grub_malloc) (grub_size_t size);
|
||||
void *EXPORT_FUNC(grub_zalloc) (grub_size_t size);
|
||||
void EXPORT_FUNC(grub_free) (void *ptr);
|
||||
@@ -37,6 +36,37 @@ void *EXPORT_FUNC(grub_realloc) (void *ptr, grub_size_t size);
|
||||
@@ -55,6 +54,37 @@
|
||||
#ifndef GRUB_MACHINE_EMU
|
||||
void *EXPORT_FUNC(grub_memalign) (grub_size_t align, grub_size_t size);
|
||||
#endif
|
||||
@ -111,6 +107,3 @@ index 9c38dd3ca..1754635e7 100644
|
||||
|
||||
void grub_mm_check_real (const char *file, int line);
|
||||
#define grub_mm_check() grub_mm_check_real (GRUB_FILE, __LINE__);
|
||||
--
|
||||
2.26.2
|
||||
|
||||
|
@ -1,339 +0,0 @@
|
||||
From 88d0ba220763f99c6c98e44918435cdceef56ed7 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
||||
Date: Tue, 5 Jan 2021 13:12:39 -0800
|
||||
Subject: [PATCH] libc-config: merge from glibc
|
||||
|
||||
Use a better way of keeping glibc <sys/cdefs.h> and gnulib
|
||||
lib/cdefs.h mostly in sync, by using lib/cdefs.h only on platforms
|
||||
where <sys/cdefs.h> does not work well enough for Gnulib.
|
||||
* lib/cdefs.h: Go back to using _SYS_CDEFS_H rather than
|
||||
_GL_DEFS_H as an include guard.
|
||||
(__THROW, __THROWNL, __NTH, __NTHNL):
|
||||
Define to noexcept for C++11 and later.
|
||||
(__glibc_objsize, __glibc_objsize0): New, for _FORTIFY_SOURCE=3.
|
||||
(__warndecl): Remove.
|
||||
(__attribute_copy__): New macro, for GCC 9 support.
|
||||
(__LDBL_REDIR, __LDBL_REDIR_DECL, __LDBL_REDIR1)
|
||||
(__LDBL_REDIR1_DECL, __LDBL_REDIR1_NTH, __REDIRECT_NTH_LDBL)
|
||||
(__REDIRECT_LDBL, __LDBL_REDIR_NTH):
|
||||
Redirections for IEEE long double on powerpc64le.
|
||||
(__LDBL_REDIR2_DECL): New macro.
|
||||
(__attr_access): New macro, for GCC 10 bounds checking.
|
||||
(__attribute_returns_twice__): New macro, for setjmp etc.
|
||||
* lib/libc-config.h: Include <cdefs.h> only if __glibc_likely is
|
||||
undefined. The following changes apply only if __glibc_likely
|
||||
is not defined.
|
||||
(__LDBL_REDIR2_DECL, __attr_access, __attribute_returns_twice__)
|
||||
(__glibc_clang_has_attribute, __glibc_clang_has_extension)
|
||||
(__glibc_objsize, __glibc_objsize0):
|
||||
Undef these new (or newer) <cdefs.h> macros.
|
||||
(__P, __PMT, __always_inline): Do not undef, since cdefs.h does that.
|
||||
(__glibc_likely): Do not undef, since this is inside
|
||||
ifndef __glibc_likely.
|
||||
(__warndecl): Do not undef; no longer defined.
|
||||
---
|
||||
ChangeLog | 32 +++++++++++++++
|
||||
grub-core/lib/gnulib/cdefs.h | 99 ++++++++++++++++++++++++++++++++++++++++-------
|
||||
grub-core/lib/gnulib/libc-config.h | 51 +++++++++++++-----------
|
||||
3 files changed, 147 insertions(+), 35 deletions(-)
|
||||
|
||||
diff --git a/grub-core/lib/gnulib/cdefs.h b/grub-core/lib/gnulib/cdefs.h
|
||||
index 4b696590c..71813d635 100644
|
||||
--- a/grub-core/lib/gnulib/cdefs.h
|
||||
+++ b/grub-core/lib/gnulib/cdefs.h
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
/* The GNU libc does not support any K&R compilers or the traditional mode
|
||||
of ISO C compilers anymore. Check for some of the combinations not
|
||||
- anymore supported. */
|
||||
+ supported anymore. */
|
||||
#if defined __GNUC__ && !defined __STDC__
|
||||
# error "You need a ISO C conforming compiler to use the glibc headers"
|
||||
#endif
|
||||
@@ -47,7 +47,7 @@
|
||||
# endif
|
||||
|
||||
/* GCC can always grok prototypes. For C++ programs we add throw()
|
||||
- to help it optimize the function calls. But this works only with
|
||||
+ to help it optimize the function calls. But this only works with
|
||||
gcc 2.8.x and egcs. For gcc 3.2 and up we even mark C functions
|
||||
as non-throwing using a function attribute since programs can use
|
||||
the -fexceptions options for C code as well. */
|
||||
@@ -58,10 +58,14 @@
|
||||
# define __NTHNL(fct) __attribute__ ((__nothrow__)) fct
|
||||
# else
|
||||
# if defined __cplusplus && __GNUC_PREREQ (2,8)
|
||||
-# define __THROW throw ()
|
||||
-# define __THROWNL throw ()
|
||||
-# define __NTH(fct) __LEAF_ATTR fct throw ()
|
||||
-# define __NTHNL(fct) fct throw ()
|
||||
+# if __cplusplus >= 201103L
|
||||
+# define __THROW noexcept (true)
|
||||
+# else
|
||||
+# define __THROW throw ()
|
||||
+# endif
|
||||
+# define __THROWNL __THROW
|
||||
+# define __NTH(fct) __LEAF_ATTR fct __THROW
|
||||
+# define __NTHNL(fct) fct __THROW
|
||||
# else
|
||||
# define __THROW
|
||||
# define __THROWNL
|
||||
@@ -123,14 +127,20 @@
|
||||
#define __bos(ptr) __builtin_object_size (ptr, __USE_FORTIFY_LEVEL > 1)
|
||||
#define __bos0(ptr) __builtin_object_size (ptr, 0)
|
||||
|
||||
+/* Use __builtin_dynamic_object_size at _FORTIFY_SOURCE=3 when available. */
|
||||
+#if __USE_FORTIFY_LEVEL == 3 && __glibc_clang_prereq (9, 0)
|
||||
+# define __glibc_objsize0(__o) __builtin_dynamic_object_size (__o, 0)
|
||||
+# define __glibc_objsize(__o) __builtin_dynamic_object_size (__o, 1)
|
||||
+#else
|
||||
+# define __glibc_objsize0(__o) __bos0 (__o)
|
||||
+# define __glibc_objsize(__o) __bos (__o)
|
||||
+#endif
|
||||
+
|
||||
#if __GNUC_PREREQ (4,3)
|
||||
-# define __warndecl(name, msg) \
|
||||
- extern void name (void) __attribute__((__warning__ (msg)))
|
||||
# define __warnattr(msg) __attribute__((__warning__ (msg)))
|
||||
# define __errordecl(name, msg) \
|
||||
extern void name (void) __attribute__((__error__ (msg)))
|
||||
#else
|
||||
-# define __warndecl(name, msg) extern void name (void)
|
||||
# define __warnattr(msg)
|
||||
# define __errordecl(name, msg) extern void name (void)
|
||||
#endif
|
||||
@@ -256,8 +266,8 @@
|
||||
/* Since version 4.5, gcc also allows one to specify the message printed
|
||||
when a deprecated function is used. clang claims to be gcc 4.2, but
|
||||
may also support this feature. */
|
||||
-#if __GNUC_PREREQ (4,5) || \
|
||||
- __glibc_clang_has_extension (__attribute_deprecated_with_message__)
|
||||
+#if __GNUC_PREREQ (4,5) \
|
||||
+ || __glibc_clang_has_extension (__attribute_deprecated_with_message__)
|
||||
# define __attribute_deprecated_msg__(msg) \
|
||||
__attribute__ ((__deprecated__ (msg)))
|
||||
#else
|
||||
@@ -434,6 +444,16 @@
|
||||
# define __attribute_nonstring__
|
||||
#endif
|
||||
|
||||
+/* Undefine (also defined in libc-symbols.h). */
|
||||
+#undef __attribute_copy__
|
||||
+#if __GNUC_PREREQ (9, 0)
|
||||
+/* Copies attributes from the declaration or type referenced by
|
||||
+ the argument. */
|
||||
+# define __attribute_copy__(arg) __attribute__ ((__copy__ (arg)))
|
||||
+#else
|
||||
+# define __attribute_copy__(arg)
|
||||
+#endif
|
||||
+
|
||||
#if (!defined _Static_assert && !defined __cplusplus \
|
||||
&& (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
|
||||
&& (!__GNUC_PREREQ (4, 6) || defined __STRICT_ANSI__))
|
||||
@@ -449,7 +469,37 @@
|
||||
# include <bits/long-double.h>
|
||||
#endif
|
||||
|
||||
-#if defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH
|
||||
+#if __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
|
||||
+# ifdef __REDIRECT
|
||||
+
|
||||
+/* Alias name defined automatically. */
|
||||
+# define __LDBL_REDIR(name, proto) ... unused__ldbl_redir
|
||||
+# define __LDBL_REDIR_DECL(name) \
|
||||
+ extern __typeof (name) name __asm (__ASMNAME ("__" #name "ieee128"));
|
||||
+
|
||||
+/* Alias name defined automatically, with leading underscores. */
|
||||
+# define __LDBL_REDIR2_DECL(name) \
|
||||
+ extern __typeof (__##name) __##name \
|
||||
+ __asm (__ASMNAME ("__" #name "ieee128"));
|
||||
+
|
||||
+/* Alias name defined manually. */
|
||||
+# define __LDBL_REDIR1(name, proto, alias) ... unused__ldbl_redir1
|
||||
+# define __LDBL_REDIR1_DECL(name, alias) \
|
||||
+ extern __typeof (name) name __asm (__ASMNAME (#alias));
|
||||
+
|
||||
+# define __LDBL_REDIR1_NTH(name, proto, alias) \
|
||||
+ __REDIRECT_NTH (name, proto, alias)
|
||||
+# define __REDIRECT_NTH_LDBL(name, proto, alias) \
|
||||
+ __LDBL_REDIR1_NTH (name, proto, __##alias##ieee128)
|
||||
+
|
||||
+/* Unused. */
|
||||
+# define __REDIRECT_LDBL(name, proto, alias) ... unused__redirect_ldbl
|
||||
+# define __LDBL_REDIR_NTH(name, proto) ... unused__ldbl_redir_nth
|
||||
+
|
||||
+# else
|
||||
+_Static_assert (0, "IEEE 128-bits long double requires redirection on this platform");
|
||||
+# endif
|
||||
+#elif defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH
|
||||
# define __LDBL_COMPAT 1
|
||||
# ifdef __REDIRECT
|
||||
# define __LDBL_REDIR1(name, proto, alias) __REDIRECT (name, proto, alias)
|
||||
@@ -458,6 +508,8 @@
|
||||
# define __LDBL_REDIR1_NTH(name, proto, alias) __REDIRECT_NTH (name, proto, alias)
|
||||
# define __LDBL_REDIR_NTH(name, proto) \
|
||||
__LDBL_REDIR1_NTH (name, proto, __nldbl_##name)
|
||||
+# define __LDBL_REDIR2_DECL(name) \
|
||||
+ extern __typeof (__##name) __##name __asm (__ASMNAME ("__nldbl___" #name));
|
||||
# define __LDBL_REDIR1_DECL(name, alias) \
|
||||
extern __typeof (name) name __asm (__ASMNAME (#alias));
|
||||
# define __LDBL_REDIR_DECL(name) \
|
||||
@@ -468,11 +520,13 @@
|
||||
__LDBL_REDIR1_NTH (name, proto, __nldbl_##alias)
|
||||
# endif
|
||||
#endif
|
||||
-#if !defined __LDBL_COMPAT || !defined __REDIRECT
|
||||
+#if (!defined __LDBL_COMPAT && __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 0) \
|
||||
+ || !defined __REDIRECT
|
||||
# define __LDBL_REDIR1(name, proto, alias) name proto
|
||||
# define __LDBL_REDIR(name, proto) name proto
|
||||
# define __LDBL_REDIR1_NTH(name, proto, alias) name proto __THROW
|
||||
# define __LDBL_REDIR_NTH(name, proto) name proto __THROW
|
||||
+# define __LDBL_REDIR2_DECL(name)
|
||||
# define __LDBL_REDIR_DECL(name)
|
||||
# ifdef __REDIRECT
|
||||
# define __REDIRECT_LDBL(name, proto, alias) __REDIRECT (name, proto, alias)
|
||||
@@ -511,4 +565,23 @@
|
||||
# define __HAVE_GENERIC_SELECTION 0
|
||||
#endif
|
||||
|
||||
+#if __GNUC_PREREQ (10, 0)
|
||||
+/* Designates a 1-based positional argument ref-index of pointer type
|
||||
+ that can be used to access size-index elements of the pointed-to
|
||||
+ array according to access mode, or at least one element when
|
||||
+ size-index is not provided:
|
||||
+ access (access-mode, <ref-index> [, <size-index>]) */
|
||||
+#define __attr_access(x) __attribute__ ((__access__ x))
|
||||
+#else
|
||||
+# define __attr_access(x)
|
||||
+#endif
|
||||
+
|
||||
+/* Specify that a function such as setjmp or vfork may return
|
||||
+ twice. */
|
||||
+#if __GNUC_PREREQ (4, 1)
|
||||
+# define __attribute_returns_twice__ __attribute__ ((__returns_twice__))
|
||||
+#else
|
||||
+# define __attribute_returns_twice__ /* Ignore. */
|
||||
+#endif
|
||||
+
|
||||
#endif /* sys/cdefs.h */
|
||||
diff --git a/grub-core/lib/gnulib/libc-config.h b/grub-core/lib/gnulib/libc-config.h
|
||||
index f24fbfa6a..5a0b69685 100644
|
||||
--- a/grub-core/lib/gnulib/libc-config.h
|
||||
+++ b/grub-core/lib/gnulib/libc-config.h
|
||||
@@ -62,21 +62,24 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
-
|
||||
-/* Prepare to include <cdefs.h>, which is our copy of glibc
|
||||
- <sys/cdefs.h>. */
|
||||
+#ifndef __glibc_likely
|
||||
+/* <sys/cdefs.h> either does not exist, or predates glibc commit
|
||||
+ 2012-12-28T06:33:01Z!siddhesh@redhat.com
|
||||
+ (91998e449e0ce758db55aecf2abc3ee510fcbc8f)
|
||||
+ and so does not suffice for Gnulib. Prepare to include <cdefs.h>,
|
||||
+ which is Gnulib's copy of a more-recent glibc <sys/cdefs.h>. */
|
||||
|
||||
/* Define _FEATURES_H so that <cdefs.h> does not include <features.h>. */
|
||||
-#ifndef _FEATURES_H
|
||||
-# define _FEATURES_H 1
|
||||
-#endif
|
||||
+# ifndef _FEATURES_H
|
||||
+# define _FEATURES_H 1
|
||||
+# endif
|
||||
/* Define __WORDSIZE so that <cdefs.h> does not attempt to include
|
||||
nonexistent files. Make it a syntax error, since Gnulib does not
|
||||
use __WORDSIZE now, and if Gnulib uses it later the syntax error
|
||||
will let us know that __WORDSIZE needs configuring. */
|
||||
-#ifndef __WORDSIZE
|
||||
-# define __WORDSIZE %%%
|
||||
-#endif
|
||||
+# ifndef __WORDSIZE
|
||||
+# define __WORDSIZE %%%
|
||||
+# endif
|
||||
/* Undef the macros unconditionally defined by our copy of glibc
|
||||
<sys/cdefs.h>, so that they do not clash with any system-defined
|
||||
versions. */
|
||||
@@ -92,14 +95,13 @@
|
||||
#undef __LDBL_REDIR1
|
||||
#undef __LDBL_REDIR1_DECL
|
||||
#undef __LDBL_REDIR1_NTH
|
||||
+#undef __LDBL_REDIR2_DECL
|
||||
#undef __LDBL_REDIR_DECL
|
||||
#undef __LDBL_REDIR_NTH
|
||||
#undef __LEAF
|
||||
#undef __LEAF_ATTR
|
||||
#undef __NTH
|
||||
#undef __NTHNL
|
||||
-#undef __P
|
||||
-#undef __PMT
|
||||
#undef __REDIRECT
|
||||
#undef __REDIRECT_LDBL
|
||||
#undef __REDIRECT_NTH
|
||||
@@ -108,7 +110,7 @@
|
||||
#undef __STRING
|
||||
#undef __THROW
|
||||
#undef __THROWNL
|
||||
-#undef __always_inline
|
||||
+#undef __attr_access
|
||||
#undef __attribute__
|
||||
#undef __attribute_alloc_size__
|
||||
#undef __attribute_artificial__
|
||||
@@ -121,6 +123,7 @@
|
||||
#undef __attribute_noinline__
|
||||
#undef __attribute_nonstring__
|
||||
#undef __attribute_pure__
|
||||
+#undef __attribute_returns_twice__
|
||||
#undef __attribute_used__
|
||||
#undef __attribute_warn_unused_result__
|
||||
#undef __bos
|
||||
@@ -132,10 +135,13 @@
|
||||
#undef __flexarr
|
||||
#undef __fortify_function
|
||||
#undef __glibc_c99_flexarr_available
|
||||
+#undef __glibc_clang_has_attribute
|
||||
+#undef __glibc_clang_has_builtin
|
||||
#undef __glibc_clang_has_extension
|
||||
-#undef __glibc_likely
|
||||
#undef __glibc_macro_warning
|
||||
#undef __glibc_macro_warning1
|
||||
+#undef __glibc_objsize
|
||||
+#undef __glibc_objsize0
|
||||
#undef __glibc_unlikely
|
||||
#undef __inline
|
||||
#undef __ptr_t
|
||||
@@ -144,20 +150,21 @@
|
||||
#undef __va_arg_pack
|
||||
#undef __va_arg_pack_len
|
||||
#undef __warnattr
|
||||
-#undef __warndecl
|
||||
|
||||
/* Include our copy of glibc <sys/cdefs.h>. */
|
||||
-#include <cdefs.h>
|
||||
+# include <cdefs.h>
|
||||
|
||||
/* <cdefs.h> __inline is too pessimistic for non-GCC. */
|
||||
-#undef __inline
|
||||
-#ifndef HAVE___INLINE
|
||||
-# if 199901 <= __STDC_VERSION__ || defined inline
|
||||
-# define __inline inline
|
||||
-# else
|
||||
-# define __inline
|
||||
+# undef __inline
|
||||
+# ifndef HAVE___INLINE
|
||||
+# if 199901 <= __STDC_VERSION__ || defined inline
|
||||
+# define __inline inline
|
||||
+# else
|
||||
+# define __inline
|
||||
+# endif
|
||||
# endif
|
||||
-#endif
|
||||
+
|
||||
+#endif /* defined __glibc_likely */
|
||||
|
||||
|
||||
/* A substitute for glibc <libc-symbols.h>, good enough for Gnulib. */
|
||||
--
|
||||
2.34.1
|
||||
|
@ -1,146 +0,0 @@
|
||||
From 1dcab5bf3843abc997f7e7dba32e5dbcb9bf66b2 Mon Sep 17 00:00:00 2001
|
||||
From: Gary Lin <glin@suse.com>
|
||||
Date: Fri, 25 Nov 2022 15:37:35 +0800
|
||||
Subject: [PATCH 1/2] loader/linux: Ensure the newc pathname is NULL-terminated
|
||||
|
||||
Per "man 5 cpio", the namesize in the cpio header includes the trailing
|
||||
NUL byte of the pathname and the pathname is followed by NUL bytes, but
|
||||
the current implementation ignores the trailing NUL byte when making
|
||||
the newc header. Although make_header() tries to pad the pathname string,
|
||||
the padding won't happen when strlen(name) + sizeof(struct newc_head)
|
||||
is a multiple of 4, and the non-NULL-terminated pathname may lead to
|
||||
unexpected results.
|
||||
|
||||
Assume that a file is created with 'echo -n aaaa > /boot/test12' and
|
||||
loaded by grub2:
|
||||
|
||||
linux /boot/vmlinuz
|
||||
initrd newc:test12:/boot/test12 /boot/initrd
|
||||
|
||||
The initrd command eventually invoked grub_initrd_load() and sent
|
||||
't''e''s''t''1''2' to make_header() to generate the header:
|
||||
|
||||
00000070 30 37 30 37 30 31 33 30 31 43 41 30 44 45 30 30 |070701301CA0DE00|
|
||||
00000080 30 30 38 31 41 34 30 30 30 30 30 33 45 38 30 30 |0081A4000003E800|
|
||||
00000090 30 30 30 30 36 34 30 30 30 30 30 30 30 31 36 33 |0000640000000163|
|
||||
000000a0 37 36 45 34 35 32 30 30 30 30 30 30 30 34 30 30 |76E4520000000400|
|
||||
000000b0 30 30 30 30 30 38 30 30 30 30 30 30 31 33 30 30 |0000080000001300|
|
||||
000000c0 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 |0000000000000000|
|
||||
000000d0 30 30 30 30 30 36 30 30 30 30 30 30 30 30 74 65 |00000600000000te|
|
||||
^namesize
|
||||
000000e0 73 74 31 32 61 61 61 61 30 37 30 37 30 31 30 30 |st12aaaa07070100|
|
||||
^^ end of the pathname
|
||||
|
||||
Since strlen("test12") + sizeof(struct newc_head) is 116 = 29 * 4,
|
||||
make_header() didn't pad the pathname, and the file content followed
|
||||
"test12" immediately. This violates the cpio format and may trigger such
|
||||
error during linux boot:
|
||||
|
||||
Initramfs unpacking failed: ZSTD-compressed data is trunc
|
||||
|
||||
To avoid the potential problems, this commit counts the trailing NUL byte
|
||||
in when calling make_header() and adjusts the initrd size accordingly.
|
||||
|
||||
Now the header becomes
|
||||
|
||||
00000070 30 37 30 37 30 31 33 30 31 43 41 30 44 45 30 30 |070701301CA0DE00|
|
||||
00000080 30 30 38 31 41 34 30 30 30 30 30 33 45 38 30 30 |0081A4000003E800|
|
||||
00000090 30 30 30 30 36 34 30 30 30 30 30 30 30 31 36 33 |0000640000000163|
|
||||
000000a0 37 36 45 34 35 32 30 30 30 30 30 30 30 34 30 30 |76E4520000000400|
|
||||
000000b0 30 30 30 30 30 38 30 30 30 30 30 30 31 33 30 30 |0000080000001300|
|
||||
000000c0 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 |0000000000000000|
|
||||
000000d0 30 30 30 30 30 37 30 30 30 30 30 30 30 30 74 65 |00000700000000te|
|
||||
^namesize
|
||||
000000e0 73 74 31 32 00 00 00 00 61 61 61 61 30 37 30 37 |st12....aaaa0707|
|
||||
^^ end of the pathname
|
||||
|
||||
Besides the trailing NUL byte, make_header() pads 3 more NUL bytes, and
|
||||
the user can safely read the pathname without a further check.
|
||||
|
||||
To conform to the cpio format, the headers for "TRAILER!!!" are also
|
||||
adjusted to include the trailing NUL byte, not ignore it.
|
||||
|
||||
Signed-off-by: Gary Lin <glin@suse.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/loader/linux.c | 25 ++++++++++++++++++-------
|
||||
1 file changed, 18 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/grub-core/loader/linux.c b/grub-core/loader/linux.c
|
||||
index 8f0fad805..e4018e65e 100644
|
||||
--- a/grub-core/loader/linux.c
|
||||
+++ b/grub-core/loader/linux.c
|
||||
@@ -130,12 +130,23 @@ insert_dir (const char *name, struct dir **root,
|
||||
n->name = grub_strndup (cb, ce - cb);
|
||||
if (ptr)
|
||||
{
|
||||
+ /*
|
||||
+ * Create the substring with the trailing NUL byte
|
||||
+ * to be included in the cpio header.
|
||||
+ */
|
||||
+ char *tmp_name = grub_strndup (name, ce - name);
|
||||
+ if (!tmp_name) {
|
||||
+ grub_free (n->name);
|
||||
+ grub_free (n);
|
||||
+ return grub_errno;
|
||||
+ }
|
||||
grub_dprintf ("linux", "Creating directory %s, %s\n", name, ce);
|
||||
- ptr = make_header (ptr, name, ce - name,
|
||||
+ ptr = make_header (ptr, tmp_name, ce - name + 1,
|
||||
040777, 0);
|
||||
+ grub_free (tmp_name);
|
||||
}
|
||||
if (grub_add (*size,
|
||||
- ALIGN_UP ((ce - (char *) name)
|
||||
+ ALIGN_UP ((ce - (char *) name + 1)
|
||||
+ sizeof (struct newc_head), 4),
|
||||
size))
|
||||
{
|
||||
@@ -260,7 +271,7 @@ grub_initrd_init (int argc, char *argv[],
|
||||
grub_initrd_close (initrd_ctx);
|
||||
return grub_errno;
|
||||
}
|
||||
- name_len = grub_strlen (initrd_ctx->components[i].newc_name);
|
||||
+ name_len = grub_strlen (initrd_ctx->components[i].newc_name) + 1;
|
||||
if (grub_add (initrd_ctx->size,
|
||||
ALIGN_UP (sizeof (struct newc_head) + name_len, 4),
|
||||
&initrd_ctx->size) ||
|
||||
@@ -274,7 +285,7 @@ grub_initrd_init (int argc, char *argv[],
|
||||
{
|
||||
if (grub_add (initrd_ctx->size,
|
||||
ALIGN_UP (sizeof (struct newc_head)
|
||||
- + sizeof ("TRAILER!!!") - 1, 4),
|
||||
+ + sizeof ("TRAILER!!!"), 4),
|
||||
&initrd_ctx->size))
|
||||
goto overflow;
|
||||
free_dir (root);
|
||||
@@ -302,7 +313,7 @@ grub_initrd_init (int argc, char *argv[],
|
||||
initrd_ctx->size = ALIGN_UP (initrd_ctx->size, 4);
|
||||
if (grub_add (initrd_ctx->size,
|
||||
ALIGN_UP (sizeof (struct newc_head)
|
||||
- + sizeof ("TRAILER!!!") - 1, 4),
|
||||
+ + sizeof ("TRAILER!!!"), 4),
|
||||
&initrd_ctx->size))
|
||||
goto overflow;
|
||||
free_dir (root);
|
||||
@@ -378,7 +389,7 @@ grub_initrd_load (struct grub_linux_initrd_context *initrd_ctx,
|
||||
}
|
||||
else if (newc)
|
||||
{
|
||||
- ptr = make_header (ptr, "TRAILER!!!", sizeof ("TRAILER!!!") - 1,
|
||||
+ ptr = make_header (ptr, "TRAILER!!!", sizeof ("TRAILER!!!"),
|
||||
0, 0);
|
||||
free_dir (root);
|
||||
root = 0;
|
||||
@@ -406,7 +417,7 @@ grub_initrd_load (struct grub_linux_initrd_context *initrd_ctx,
|
||||
{
|
||||
grub_memset (ptr, 0, ALIGN_UP_OVERHEAD (cursize, 4));
|
||||
ptr += ALIGN_UP_OVERHEAD (cursize, 4);
|
||||
- ptr = make_header (ptr, "TRAILER!!!", sizeof ("TRAILER!!!") - 1, 0, 0);
|
||||
+ ptr = make_header (ptr, "TRAILER!!!", sizeof ("TRAILER!!!"), 0, 0);
|
||||
}
|
||||
free_dir (root);
|
||||
root = 0;
|
||||
--
|
||||
2.39.2
|
||||
|
@ -1,31 +0,0 @@
|
||||
From 8eae4c33a32d9951641e289d2809a92a223b1642 Mon Sep 17 00:00:00 2001
|
||||
From: Glenn Washburn <development@efficientek.com>
|
||||
Date: Thu, 9 Dec 2021 11:14:50 -0600
|
||||
Subject: [PATCH 01/14] luks2: Add debug message to align with luks and geli
|
||||
modules
|
||||
|
||||
Signed-off-by: Glenn Washburn <development@efficientek.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/disk/luks2.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/disk/luks2.c b/grub-core/disk/luks2.c
|
||||
index 371a53b837..fea196dd4a 100644
|
||||
--- a/grub-core/disk/luks2.c
|
||||
+++ b/grub-core/disk/luks2.c
|
||||
@@ -370,7 +370,10 @@ luks2_scan (grub_disk_t disk, const char *check_uuid, int check_boot)
|
||||
uuid[j] = '\0';
|
||||
|
||||
if (check_uuid && grub_strcasecmp (check_uuid, uuid) != 0)
|
||||
- return NULL;
|
||||
+ {
|
||||
+ grub_dprintf ("luks2", "%s != %s\n", uuid, check_uuid);
|
||||
+ return NULL;
|
||||
+ }
|
||||
|
||||
cryptodisk = grub_zalloc (sizeof (*cryptodisk));
|
||||
if (!cryptodisk)
|
||||
--
|
||||
2.34.1
|
||||
|
@ -1,86 +0,0 @@
|
||||
From a0fcb7f7075901aa12079c39a534837755652d9d Mon Sep 17 00:00:00 2001
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Wed, 16 Mar 2022 14:17:32 +0800
|
||||
Subject: [PATCH 1/3] mkimage: Fix dangling pointer may be used error
|
||||
|
||||
The warning is real as long as dangling pointer to 'tmp_' may be used if
|
||||
o32 and o64 are both null. However that is not going to happen and can
|
||||
be ignored safely because the PE_OHDR is being used in a context that
|
||||
either o32 or o64 must have been properly initialized. Sadly compiler
|
||||
seems not to always optimize that unused _tmp away so explicit
|
||||
suppression remain needed here.
|
||||
|
||||
../util/mkimage.c: In function 'grub_install_generate_image':
|
||||
../util/mkimage.c:1422:41: error: dangling pointer to 'tmp_' may be used [-Werror=dangling-pointer=]
|
||||
1422 | PE_OHDR (o32, o64, header_size) = grub_host_to_target32 (header_size);
|
||||
../util/mkimage.c:857:28: note: 'tmp_' declared here
|
||||
857 | __typeof__((o64)->field) tmp_; \
|
||||
| ^~~~
|
||||
|
||||
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
---
|
||||
util/mkimage.c | 21 +++++++++++++++++++++
|
||||
1 file changed, 21 insertions(+)
|
||||
|
||||
diff --git a/util/mkimage.c b/util/mkimage.c
|
||||
index 5a8021a213..659824c140 100644
|
||||
--- a/util/mkimage.c
|
||||
+++ b/util/mkimage.c
|
||||
@@ -1419,6 +1419,10 @@ grub_install_generate_image (const char *dir, const char *prefix,
|
||||
section = (struct grub_pe32_section_table *)(o64 + 1);
|
||||
}
|
||||
|
||||
+#if __GNUC__ >= 12
|
||||
+#pragma GCC diagnostic push
|
||||
+#pragma GCC diagnostic ignored "-Wdangling-pointer"
|
||||
+#endif
|
||||
PE_OHDR (o32, o64, header_size) = grub_host_to_target32 (header_size);
|
||||
PE_OHDR (o32, o64, entry_addr) = grub_host_to_target32 (layout.start_address);
|
||||
PE_OHDR (o32, o64, image_base) = 0;
|
||||
@@ -1438,6 +1442,9 @@ grub_install_generate_image (const char *dir, const char *prefix,
|
||||
/* The sections. */
|
||||
PE_OHDR (o32, o64, code_base) = grub_host_to_target32 (vma);
|
||||
PE_OHDR (o32, o64, code_size) = grub_host_to_target32 (layout.exec_size);
|
||||
+#if __GNUC__ >= 12
|
||||
+#pragma GCC diagnostic pop
|
||||
+#endif
|
||||
section = init_pe_section (image_target, section, ".text",
|
||||
&vma, layout.exec_size,
|
||||
image_target->section_align,
|
||||
@@ -1447,10 +1454,17 @@ grub_install_generate_image (const char *dir, const char *prefix,
|
||||
GRUB_PE32_SCN_MEM_READ);
|
||||
|
||||
scn_size = ALIGN_UP (layout.kernel_size - layout.exec_size, GRUB_PE32_FILE_ALIGNMENT);
|
||||
+#if __GNUC__ >= 12
|
||||
+#pragma GCC diagnostic push
|
||||
+#pragma GCC diagnostic ignored "-Wdangling-pointer"
|
||||
+#endif
|
||||
/* ALIGN_UP (sbat_size, GRUB_PE32_FILE_ALIGNMENT) is done earlier. */
|
||||
PE_OHDR (o32, o64, data_size) = grub_host_to_target32 (scn_size + sbat_size +
|
||||
ALIGN_UP (total_module_size,
|
||||
GRUB_PE32_FILE_ALIGNMENT));
|
||||
+#if __GNUC__ >= 12
|
||||
+#pragma GCC diagnostic pop
|
||||
+#endif
|
||||
|
||||
section = init_pe_section (image_target, section, ".data",
|
||||
&vma, scn_size, image_target->section_align,
|
||||
@@ -1481,8 +1495,15 @@ grub_install_generate_image (const char *dir, const char *prefix,
|
||||
}
|
||||
|
||||
scn_size = layout.reloc_size;
|
||||
+#if __GNUC__ >= 12
|
||||
+#pragma GCC diagnostic push
|
||||
+#pragma GCC diagnostic ignored "-Wdangling-pointer"
|
||||
+#endif
|
||||
PE_OHDR (o32, o64, base_relocation_table.rva) = grub_host_to_target32 (vma);
|
||||
PE_OHDR (o32, o64, base_relocation_table.size) = grub_host_to_target32 (scn_size);
|
||||
+#if __GNUC__ >= 12
|
||||
+#pragma GCC diagnostic pop
|
||||
+#endif
|
||||
memcpy (pe_img + raw_data, layout.reloc_section, scn_size);
|
||||
init_pe_section (image_target, section, ".reloc",
|
||||
&vma, scn_size, image_target->section_align,
|
||||
--
|
||||
2.34.1
|
||||
|
@ -1,133 +0,0 @@
|
||||
From 23bca58a68264657f176885c3564d07c9938b7f6 Mon Sep 17 00:00:00 2001
|
||||
From: Patrick Steinhardt <ps@pks.im>
|
||||
Date: Thu, 21 Apr 2022 15:24:18 +1000
|
||||
Subject: [PATCH 1/5] mm: Allow dynamically requesting additional memory
|
||||
regions
|
||||
|
||||
Currently, all platforms will set up their heap on initialization of the
|
||||
platform code. While this works mostly fine, it poses some limitations
|
||||
on memory management on us. Most notably, allocating big chunks of
|
||||
memory in the gigabyte range would require us to pre-request this many
|
||||
bytes from the firmware and add it to the heap from the beginning on
|
||||
some platforms like EFI. As this isn't needed for most configurations,
|
||||
it is inefficient and may even negatively impact some usecases when,
|
||||
e.g., chainloading. Nonetheless, allocating big chunks of memory is
|
||||
required sometimes, where one example is the upcoming support for the
|
||||
Argon2 key derival function in LUKS2.
|
||||
|
||||
In order to avoid pre-allocating big chunks of memory, this commit
|
||||
implements a runtime mechanism to add more pages to the system. When
|
||||
a given allocation cannot be currently satisfied, we'll call a given
|
||||
callback set up by the platform's own memory management subsystem,
|
||||
asking it to add a memory area with at least "n" bytes. If this
|
||||
succeeds, we retry searching for a valid memory region, which should
|
||||
now succeed.
|
||||
|
||||
If this fails, we try asking for "n" bytes, possibly spread across
|
||||
multiple regions, in hopes that region merging means that we end up
|
||||
with enough memory for things to work out.
|
||||
|
||||
Signed-off-by: Patrick Steinhardt <ps@pks.im>
|
||||
Signed-off-by: Daniel Axtens <dja@axtens.net>
|
||||
Tested-by: Stefan Berger <stefanb@linux.ibm.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
Tested-by: Patrick Steinhardt <ps@pks.im>
|
||||
---
|
||||
grub-core/kern/mm.c | 30 ++++++++++++++++++++++++++++++
|
||||
include/grub/mm.h | 18 ++++++++++++++++++
|
||||
2 files changed, 48 insertions(+)
|
||||
|
||||
diff --git a/grub-core/kern/mm.c b/grub-core/kern/mm.c
|
||||
index 5c0a624..0bd9f75 100644
|
||||
--- a/grub-core/kern/mm.c
|
||||
+++ b/grub-core/kern/mm.c
|
||||
@@ -28,6 +28,9 @@
|
||||
- multiple regions may be used as free space. They may not be
|
||||
contiguous.
|
||||
|
||||
+ - if existing regions are insufficient to satisfy an allocation, a new
|
||||
+ region can be requested from firmware.
|
||||
+
|
||||
Regions are managed by a singly linked list, and the meta information is
|
||||
stored in the beginning of each region. Space after the meta information
|
||||
is used to allocate memory.
|
||||
@@ -77,6 +80,7 @@
|
||||
|
||||
|
||||
grub_mm_region_t grub_mm_base;
|
||||
+grub_mm_add_region_func_t grub_mm_add_region_fn;
|
||||
|
||||
/* Get a header from the pointer PTR, and set *P and *R to a pointer
|
||||
to the header and a pointer to its region, respectively. PTR must
|
||||
@@ -364,6 +368,32 @@ grub_memalign (grub_size_t align, grub_size_t size)
|
||||
goto again;
|
||||
#endif
|
||||
|
||||
+ case 1:
|
||||
+ /* Request additional pages, contiguous */
|
||||
+ count++;
|
||||
+
|
||||
+ if (grub_mm_add_region_fn != NULL &&
|
||||
+ grub_mm_add_region_fn (size, GRUB_MM_ADD_REGION_CONSECUTIVE) == GRUB_ERR_NONE)
|
||||
+ goto again;
|
||||
+
|
||||
+ /* fallthrough */
|
||||
+
|
||||
+ case 2:
|
||||
+ /* Request additional pages, anything at all */
|
||||
+ count++;
|
||||
+
|
||||
+ if (grub_mm_add_region_fn != NULL)
|
||||
+ {
|
||||
+ /*
|
||||
+ * Try again even if this fails, in case it was able to partially
|
||||
+ * satisfy the request
|
||||
+ */
|
||||
+ grub_mm_add_region_fn (size, GRUB_MM_ADD_REGION_NONE);
|
||||
+ goto again;
|
||||
+ }
|
||||
+
|
||||
+ /* fallthrough */
|
||||
+
|
||||
default:
|
||||
break;
|
||||
}
|
||||
diff --git a/include/grub/mm.h b/include/grub/mm.h
|
||||
index 1754635..67faebf 100644
|
||||
--- a/include/grub/mm.h
|
||||
+++ b/include/grub/mm.h
|
||||
@@ -20,6 +20,7 @@
|
||||
#ifndef GRUB_MM_H
|
||||
#define GRUB_MM_H 1
|
||||
|
||||
+#include <grub/err.h>
|
||||
#include <grub/types.h>
|
||||
#include <grub/symbol.h>
|
||||
#include <config.h>
|
||||
@@ -28,6 +29,23 @@
|
||||
# define NULL ((void *) 0)
|
||||
#endif
|
||||
|
||||
+#define GRUB_MM_ADD_REGION_NONE 0
|
||||
+#define GRUB_MM_ADD_REGION_CONSECUTIVE (1 << 0)
|
||||
+
|
||||
+/*
|
||||
+ * Function used to request memory regions of `grub_size_t` bytes. The second
|
||||
+ * parameter is a bitfield of `GRUB_MM_ADD_REGION` flags.
|
||||
+ */
|
||||
+typedef grub_err_t (*grub_mm_add_region_func_t) (grub_size_t, unsigned int);
|
||||
+
|
||||
+/*
|
||||
+ * Set this function pointer to enable adding memory-regions at runtime in case
|
||||
+ * a memory allocation cannot be satisfied with existing regions.
|
||||
+ */
|
||||
+#ifndef GRUB_MACHINE_EMU
|
||||
+extern grub_mm_add_region_func_t EXPORT_VAR(grub_mm_add_region_fn);
|
||||
+#endif
|
||||
+
|
||||
void grub_mm_init_region (void *addr, grub_size_t size);
|
||||
void *EXPORT_FUNC(grub_malloc) (grub_size_t size);
|
||||
void *EXPORT_FUNC(grub_zalloc) (grub_size_t size);
|
||||
--
|
||||
2.35.3
|
||||
|
@ -27,11 +27,9 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
grub-core/disk/ieee1275/ofdisk.c | 11 +++++++++--
|
||||
1 file changed, 9 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c
|
||||
index 258a6e3891..410f4b849f 100644
|
||||
--- a/grub-core/disk/ieee1275/ofdisk.c
|
||||
+++ b/grub-core/disk/ieee1275/ofdisk.c
|
||||
@@ -491,10 +491,11 @@ grub_ofdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
|
||||
@@ -491,10 +491,11 @@
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
@ -42,10 +40,10 @@ index 258a6e3891..410f4b849f 100644
|
||||
- scan ();
|
||||
+ if (pull == GRUB_DISK_PULL_REMOVABLE)
|
||||
+ scan ();
|
||||
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE (ofdisk_hash); i++)
|
||||
{
|
||||
@@ -532,6 +533,12 @@ grub_ofdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
|
||||
@@ -532,6 +533,12 @@
|
||||
if (!ent->is_boot && ent->is_removable)
|
||||
continue;
|
||||
|
||||
@ -58,6 +56,3 @@ index 258a6e3891..410f4b849f 100644
|
||||
if (hook (ent->grub_shortest, hook_data))
|
||||
return 1;
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
@ -1,158 +0,0 @@
|
||||
From e94b4f23277f7572aacbbeae50b8927e03be148a Mon Sep 17 00:00:00 2001
|
||||
From: Petr Vorel <pvorel@suse.cz>
|
||||
Date: Thu, 15 Jul 2021 17:35:27 +0200
|
||||
Subject: [PATCH 1/2] osdep: Introduce include/grub/osdep/major.h and use it
|
||||
|
||||
... to factor out fix for glibc 2.25 introduced in 7a5b301e3 (build: Use
|
||||
AC_HEADER_MAJOR to find device macros).
|
||||
|
||||
Note: Once glibc 2.25 is old enough and this fix is not needed also
|
||||
AC_HEADER_MAJOR in configure.ac should be removed.
|
||||
|
||||
Signed-off-by: Petr Vorel <pvorel@suse.cz>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
[ upstream status: e94b4f232 ("osdep: Introduce include/grub/osdep/major.h and use it") ]
|
||||
---
|
||||
configure.ac | 2 +-
|
||||
grub-core/osdep/devmapper/getroot.c | 7 +-----
|
||||
grub-core/osdep/devmapper/hostdisk.c | 7 +-----
|
||||
grub-core/osdep/linux/getroot.c | 7 +-----
|
||||
grub-core/osdep/unix/getroot.c | 7 +-----
|
||||
include/grub/osdep/major.h | 33 ++++++++++++++++++++++++++++
|
||||
6 files changed, 38 insertions(+), 25 deletions(-)
|
||||
create mode 100644 include/grub/osdep/major.h
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index b025e1e84..bee28dbeb 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -424,7 +424,7 @@ AC_CHECK_HEADERS(sys/param.h sys/mount.h sys/mnttab.h limits.h)
|
||||
|
||||
# glibc 2.25 still includes sys/sysmacros.h in sys/types.h but emits deprecation
|
||||
# warning which causes compilation failure later with -Werror. So use -Werror here
|
||||
-# as well to force proper sys/sysmacros.h detection.
|
||||
+# as well to force proper sys/sysmacros.h detection. Used in include/grub/osdep/major.h.
|
||||
SAVED_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$HOST_CFLAGS -Werror"
|
||||
AC_HEADER_MAJOR
|
||||
diff --git a/grub-core/osdep/devmapper/getroot.c b/grub-core/osdep/devmapper/getroot.c
|
||||
index a13a39c96..9ba5c9865 100644
|
||||
--- a/grub-core/osdep/devmapper/getroot.c
|
||||
+++ b/grub-core/osdep/devmapper/getroot.c
|
||||
@@ -40,12 +40,7 @@
|
||||
#include <limits.h>
|
||||
#endif
|
||||
|
||||
-#if defined(MAJOR_IN_MKDEV)
|
||||
-#include <sys/mkdev.h>
|
||||
-#elif defined(MAJOR_IN_SYSMACROS)
|
||||
-#include <sys/sysmacros.h>
|
||||
-#endif
|
||||
-
|
||||
+#include <grub/osdep/major.h>
|
||||
#include <libdevmapper.h>
|
||||
|
||||
#include <grub/types.h>
|
||||
diff --git a/grub-core/osdep/devmapper/hostdisk.c b/grub-core/osdep/devmapper/hostdisk.c
|
||||
index a8afc0c94..c8053728b 100644
|
||||
--- a/grub-core/osdep/devmapper/hostdisk.c
|
||||
+++ b/grub-core/osdep/devmapper/hostdisk.c
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <grub/misc.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/list.h>
|
||||
+#include <grub/osdep/major.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -24,12 +25,6 @@
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
|
||||
-#if defined(MAJOR_IN_MKDEV)
|
||||
-#include <sys/mkdev.h>
|
||||
-#elif defined(MAJOR_IN_SYSMACROS)
|
||||
-#include <sys/sysmacros.h>
|
||||
-#endif
|
||||
-
|
||||
#ifdef HAVE_DEVICE_MAPPER
|
||||
# include <libdevmapper.h>
|
||||
|
||||
diff --git a/grub-core/osdep/linux/getroot.c b/grub-core/osdep/linux/getroot.c
|
||||
index 001b818fe..cd588588e 100644
|
||||
--- a/grub-core/osdep/linux/getroot.c
|
||||
+++ b/grub-core/osdep/linux/getroot.c
|
||||
@@ -35,12 +35,7 @@
|
||||
#include <limits.h>
|
||||
#endif
|
||||
|
||||
-#if defined(MAJOR_IN_MKDEV)
|
||||
-#include <sys/mkdev.h>
|
||||
-#elif defined(MAJOR_IN_SYSMACROS)
|
||||
-#include <sys/sysmacros.h>
|
||||
-#endif
|
||||
-
|
||||
+#include <grub/osdep/major.h>
|
||||
#include <grub/types.h>
|
||||
#include <sys/ioctl.h> /* ioctl */
|
||||
#include <sys/mount.h>
|
||||
diff --git a/grub-core/osdep/unix/getroot.c b/grub-core/osdep/unix/getroot.c
|
||||
index 46d7116c6..74f69116d 100644
|
||||
--- a/grub-core/osdep/unix/getroot.c
|
||||
+++ b/grub-core/osdep/unix/getroot.c
|
||||
@@ -51,12 +51,7 @@
|
||||
#endif /* ! FLOPPY_MAJOR */
|
||||
#endif
|
||||
|
||||
-#include <sys/types.h>
|
||||
-#if defined(MAJOR_IN_MKDEV)
|
||||
-#include <sys/mkdev.h>
|
||||
-#elif defined(MAJOR_IN_SYSMACROS)
|
||||
-#include <sys/sysmacros.h>
|
||||
-#endif
|
||||
+#include <grub/osdep/major.h>
|
||||
|
||||
#if defined(HAVE_LIBZFS) && defined(HAVE_LIBNVPAIR)
|
||||
# include <grub/util/libzfs.h>
|
||||
diff --git a/include/grub/osdep/major.h b/include/grub/osdep/major.h
|
||||
new file mode 100644
|
||||
index 000000000..84a9159af
|
||||
--- /dev/null
|
||||
+++ b/include/grub/osdep/major.h
|
||||
@@ -0,0 +1,33 @@
|
||||
+/*
|
||||
+ * GRUB -- GRand Unified Bootloader
|
||||
+ * Copyright (C) 2021 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 <http://www.gnu.org/licenses/>.
|
||||
+ *
|
||||
+ * Fix for glibc 2.25 which is deprecating the namespace pollution of
|
||||
+ * sys/types.h injecting major(), minor(), and makedev() into the
|
||||
+ * compilation environment.
|
||||
+ */
|
||||
+
|
||||
+#ifndef GRUB_OSDEP_MAJOR_H
|
||||
+#define GRUB_OSDEP_MAJOR_H 1
|
||||
+
|
||||
+#include <sys/types.h>
|
||||
+
|
||||
+#ifdef MAJOR_IN_MKDEV
|
||||
+# include <sys/mkdev.h>
|
||||
+#elif defined (MAJOR_IN_SYSMACROS)
|
||||
+# include <sys/sysmacros.h>
|
||||
+#endif
|
||||
+#endif /* GRUB_OSDEP_MAJOR_H */
|
||||
--
|
||||
2.32.0
|
||||
|
@ -1,113 +0,0 @@
|
||||
From 91c9ff5515821fa579961a4c3a411a29384fbfd6 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Axtens <dja@axtens.net>
|
||||
Date: Fri, 8 Apr 2022 12:35:28 +1000
|
||||
Subject: [PATCH] powerpc: do CAS in a more compatible way
|
||||
|
||||
I wrongly assumed that the most compatible way to perform CAS
|
||||
negotiation was to only set the minimum number of vectors required
|
||||
to ask for more memory. It turns out that this messes up booting
|
||||
if the minimum VP capacity would be less than the default 10% in
|
||||
vector 4.
|
||||
|
||||
Linux configures the minimum capacity to be 1%, so copy it for that
|
||||
and for vector 3 which we now need to specify as well.
|
||||
|
||||
Signed-off-by: Daniel Axtens <dja@axtens.net>
|
||||
---
|
||||
grub-core/kern/ieee1275/init.c | 54 +++++++++++++++++++---------------
|
||||
1 file changed, 31 insertions(+), 23 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
|
||||
index d77d896043..7d7178d3e1 100644
|
||||
--- a/grub-core/kern/ieee1275/init.c
|
||||
+++ b/grub-core/kern/ieee1275/init.c
|
||||
@@ -298,33 +298,37 @@ grub_ieee1275_total_mem (grub_uint64_t *total)
|
||||
|
||||
/* Based on linux - arch/powerpc/kernel/prom_init.c */
|
||||
struct option_vector2 {
|
||||
- grub_uint8_t byte1;
|
||||
- grub_uint16_t reserved;
|
||||
- grub_uint32_t real_base;
|
||||
- grub_uint32_t real_size;
|
||||
- grub_uint32_t virt_base;
|
||||
- grub_uint32_t virt_size;
|
||||
- grub_uint32_t load_base;
|
||||
- grub_uint32_t min_rma;
|
||||
- grub_uint32_t min_load;
|
||||
- grub_uint8_t min_rma_percent;
|
||||
- grub_uint8_t max_pft_size;
|
||||
+ grub_uint8_t byte1;
|
||||
+ grub_uint16_t reserved;
|
||||
+ grub_uint32_t real_base;
|
||||
+ grub_uint32_t real_size;
|
||||
+ grub_uint32_t virt_base;
|
||||
+ grub_uint32_t virt_size;
|
||||
+ grub_uint32_t load_base;
|
||||
+ grub_uint32_t min_rma;
|
||||
+ grub_uint32_t min_load;
|
||||
+ grub_uint8_t min_rma_percent;
|
||||
+ grub_uint8_t max_pft_size;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pvr_entry {
|
||||
- grub_uint32_t mask;
|
||||
- grub_uint32_t entry;
|
||||
+ grub_uint32_t mask;
|
||||
+ grub_uint32_t entry;
|
||||
};
|
||||
|
||||
struct cas_vector {
|
||||
- struct {
|
||||
- struct pvr_entry terminal;
|
||||
- } pvr_list;
|
||||
- grub_uint8_t num_vecs;
|
||||
- grub_uint8_t vec1_size;
|
||||
- grub_uint8_t vec1;
|
||||
- grub_uint8_t vec2_size;
|
||||
- struct option_vector2 vec2;
|
||||
+ struct {
|
||||
+ struct pvr_entry terminal;
|
||||
+ } pvr_list;
|
||||
+ grub_uint8_t num_vecs;
|
||||
+ grub_uint8_t vec1_size;
|
||||
+ grub_uint8_t vec1;
|
||||
+ grub_uint8_t vec2_size;
|
||||
+ struct option_vector2 vec2;
|
||||
+ grub_uint8_t vec3_size;
|
||||
+ grub_uint16_t vec3;
|
||||
+ grub_uint8_t vec4_size;
|
||||
+ grub_uint16_t vec4;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* Call ibm,client-architecture-support to try to get more RMA.
|
||||
@@ -345,13 +349,17 @@ grub_ieee1275_ibm_cas (void)
|
||||
} args;
|
||||
struct cas_vector vector = {
|
||||
.pvr_list = { { 0x00000000, 0xffffffff } }, /* any processor */
|
||||
- .num_vecs = 2 - 1,
|
||||
+ .num_vecs = 4 - 1,
|
||||
.vec1_size = 0,
|
||||
.vec1 = 0x80, /* ignore */
|
||||
.vec2_size = 1 + sizeof(struct option_vector2) - 2,
|
||||
.vec2 = {
|
||||
0, 0, -1, -1, -1, -1, -1, 512, -1, 0, 48
|
||||
},
|
||||
+ .vec3_size = 2 - 1,
|
||||
+ .vec3 = 0x00e0, // ask for FP + VMX + DFP but don't halt if unsatisfied
|
||||
+ .vec4_size = 2 - 1,
|
||||
+ .vec4 = 0x0001, // set required minimum capacity % to the lowest value
|
||||
};
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "call-method", 3, 2);
|
||||
@@ -364,7 +372,7 @@ grub_ieee1275_ibm_cas (void)
|
||||
args.ihandle = root;
|
||||
args.cas_addr = (grub_ieee1275_cell_t)&vector;
|
||||
|
||||
- grub_printf("Calling ibm,client-architecture-support...");
|
||||
+ grub_printf("Calling ibm,client-architecture-support from grub...");
|
||||
IEEE1275_CALL_ENTRY_FN (&args);
|
||||
grub_printf("done\n");
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
@ -26,11 +26,9 @@ Signed-off-by: Gary Lin <glin@suse.com>
|
||||
create mode 100644 grub-core/kern/protectors.c
|
||||
create mode 100644 include/grub/protector.h
|
||||
|
||||
diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am
|
||||
index 80e7a83ed..79d17a3d2 100644
|
||||
--- a/grub-core/Makefile.am
|
||||
+++ b/grub-core/Makefile.am
|
||||
@@ -90,6 +90,7 @@ endif
|
||||
@@ -90,6 +90,7 @@
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/mm.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/parser.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/partition.h
|
||||
@ -38,11 +36,9 @@ index 80e7a83ed..79d17a3d2 100644
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/stack_protector.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/term.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/time.h
|
||||
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
|
||||
index d83c9f7b6..0335d9add 100644
|
||||
--- a/grub-core/Makefile.core.def
|
||||
+++ b/grub-core/Makefile.core.def
|
||||
@@ -144,6 +144,7 @@ kernel = {
|
||||
@@ -149,6 +149,7 @@
|
||||
common = kern/misc.c;
|
||||
common = kern/parser.c;
|
||||
common = kern/partition.c;
|
||||
@ -50,9 +46,6 @@ index d83c9f7b6..0335d9add 100644
|
||||
common = kern/rescue_parser.c;
|
||||
common = kern/rescue_reader.c;
|
||||
common = kern/term.c;
|
||||
diff --git a/grub-core/kern/protectors.c b/grub-core/kern/protectors.c
|
||||
new file mode 100644
|
||||
index 000000000..5ee059565
|
||||
--- /dev/null
|
||||
+++ b/grub-core/kern/protectors.c
|
||||
@@ -0,0 +1,75 @@
|
||||
@ -131,9 +124,6 @@ index 000000000..5ee059565
|
||||
+
|
||||
+ return kp->recover_key (key, key_size);
|
||||
+}
|
||||
diff --git a/include/grub/protector.h b/include/grub/protector.h
|
||||
new file mode 100644
|
||||
index 000000000..3d9f69bce
|
||||
--- /dev/null
|
||||
+++ b/include/grub/protector.h
|
||||
@@ -0,0 +1,48 @@
|
||||
@ -185,6 +175,3 @@ index 000000000..3d9f69bce
|
||||
+ grub_size_t *key_size);
|
||||
+
|
||||
+#endif /* ! GRUB_PROTECTOR_HEADER */
|
||||
--
|
||||
2.35.3
|
||||
|
||||
|
80
0001-protectors-Implement-NV-index.patch
Normal file
80
0001-protectors-Implement-NV-index.patch
Normal file
@ -0,0 +1,80 @@
|
||||
From c3efb4ecbe91b63c127b92122dad3fa53d4efc69 Mon Sep 17 00:00:00 2001
|
||||
From: Patrick Colp <patrick.colp@oracle.com>
|
||||
Date: Mon, 31 Jul 2023 07:01:45 -0700
|
||||
Subject: [PATCH 1/4] protectors: Implement NV index
|
||||
|
||||
Currently with the TPM2 protector, only SRK mode is supported and
|
||||
NV index support is just a stub. Implement the NV index option.
|
||||
|
||||
Note: This only extends support on the unseal path. grub2_protect
|
||||
has not been updated. tpm2-tools can be used to insert a key into
|
||||
the NV index.
|
||||
|
||||
An example of inserting a key using tpm2-tools:
|
||||
|
||||
# Get random key.
|
||||
tpm2_getrandom 32 > key.dat
|
||||
|
||||
# Create primary object.
|
||||
tpm2_createprimary -C o -g sha256 -G rsa -c primary.ctx
|
||||
|
||||
# Create policy object. `pcrs.dat` contains the PCR values to seal against.
|
||||
tpm2_startauthsession -S session.dat
|
||||
tpm2_policypcr -S session.dat -l sha256:7,11 -f pcrs.dat -L policy.dat
|
||||
tpm2_flushcontext session.dat
|
||||
|
||||
# Seal key into TPM.
|
||||
cat key.dat | tpm2_create -C primary.ctx -u key.pub -r key.priv -L policy.dat -i-
|
||||
tpm2_load -C primary.ctx -u key.pub -r key.priv -n sealing.name -c sealing.ctx
|
||||
tpm2_evictcontrol -C o -c sealing.ctx 0x81000000
|
||||
|
||||
Then to unseal the key in grub, add this to grub.cfg:
|
||||
|
||||
tpm2_key_protector_init --mode=nv --nvindex=0x81000000 --pcrs=7,11
|
||||
cryptomount -u <UUID> --protector tpm2
|
||||
|
||||
Signed-off-by: Patrick Colp <patrick.colp@oracle.com>
|
||||
---
|
||||
grub-core/tpm2/module.c | 25 ++++++++++++++++++++-----
|
||||
1 file changed, 20 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/grub-core/tpm2/module.c b/grub-core/tpm2/module.c
|
||||
index 5274296b7..d3a64187a 100644
|
||||
--- a/grub-core/tpm2/module.c
|
||||
+++ b/grub-core/tpm2/module.c
|
||||
@@ -757,12 +757,27 @@ static grub_err_t
|
||||
grub_tpm2_protector_nv_recover (const struct grub_tpm2_protector_context *ctx,
|
||||
grub_uint8_t **key, grub_size_t *key_size)
|
||||
{
|
||||
- (void)ctx;
|
||||
- (void)key;
|
||||
- (void)key_size;
|
||||
+ TPM_HANDLE sealed_handle = ctx->nv;
|
||||
+ tpm2key_policy_t policy_seq = NULL;
|
||||
+ grub_err_t err;
|
||||
+
|
||||
+ /* Create a basic policy sequence based on the given PCR selection */
|
||||
+ err = grub_tpm2_protector_simple_policy_seq (ctx, &policy_seq);
|
||||
+ if (err != GRUB_ERR_NONE)
|
||||
+ goto exit;
|
||||
+
|
||||
+ err = grub_tpm2_protector_unseal (policy_seq, sealed_handle, key, key_size);
|
||||
+
|
||||
+ /* Pop error messages on success */
|
||||
+ if (err == GRUB_ERR_NONE)
|
||||
+ while (grub_error_pop ());
|
||||
+
|
||||
+exit:
|
||||
+ TPM2_FlushContext (sealed_handle);
|
||||
|
||||
- return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
- N_("NV Index mode is not implemented yet"));
|
||||
+ grub_tpm2key_free_policy_seq (policy_seq);
|
||||
+
|
||||
+ return err;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
--
|
||||
2.35.3
|
||||
|
@ -16,11 +16,9 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
util/grub.d/20_linux_xen.in | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
|
||||
index 7f3e79b09..00e351802 100644
|
||||
--- a/util/grub.d/10_linux.in
|
||||
+++ b/util/grub.d/10_linux.in
|
||||
@@ -307,7 +307,7 @@ while [ "x$list" != "x" ] ; do
|
||||
@@ -351,7 +351,7 @@
|
||||
fi
|
||||
|
||||
config=
|
||||
@ -29,11 +27,9 @@ index 7f3e79b09..00e351802 100644
|
||||
if test -e "${i}" ; then
|
||||
config="${i}"
|
||||
break
|
||||
diff --git a/util/grub.d/20_linux_xen.in b/util/grub.d/20_linux_xen.in
|
||||
index 8813435b7..318b6d320 100644
|
||||
--- a/util/grub.d/20_linux_xen.in
|
||||
+++ b/util/grub.d/20_linux_xen.in
|
||||
@@ -304,7 +304,7 @@ for i in /boot/vmlinu[xz]-* /vmlinu[xz]-* /boot/kernel-*; do
|
||||
@@ -307,7 +307,7 @@
|
||||
version=$(echo $basename | sed -e "s,^[^0-9]*-,,g")
|
||||
dirname=$(dirname $i)
|
||||
config=
|
||||
@ -42,6 +38,3 @@ index 8813435b7..318b6d320 100644
|
||||
if test -e "${j}" ; then
|
||||
config="${j}"
|
||||
break
|
||||
--
|
||||
2.33.0
|
||||
|
||||
|
@ -1,29 +0,0 @@
|
||||
From 2cecb472ffba4dbc534f4ce3346a453762371c52 Mon Sep 17 00:00:00 2001
|
||||
From: Mathieu Trudel-Lapierre <mathieu.tl@gmail.com>
|
||||
Date: Fri, 25 Oct 2019 10:27:54 -0400
|
||||
Subject: [PATCH] tpm: Pass unknown error as non-fatal, but debug print the
|
||||
error we got
|
||||
|
||||
Signed-off-by: Mathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>
|
||||
Patch-Name: ubuntu-tpm-unknown-error-non-fatal.patch
|
||||
---
|
||||
grub-core/commands/efi/tpm.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/commands/efi/tpm.c b/grub-core/commands/efi/tpm.c
|
||||
index a97d85368..1e399a964 100644
|
||||
--- a/grub-core/commands/efi/tpm.c
|
||||
+++ b/grub-core/commands/efi/tpm.c
|
||||
@@ -145,7 +145,8 @@ grub_efi_log_event_status (grub_efi_status_t status)
|
||||
case GRUB_EFI_NOT_FOUND:
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("TPM unavailable"));
|
||||
default:
|
||||
- return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("Unknown TPM error"));
|
||||
+ grub_dprintf("tpm", "Unknown TPM error: %" PRIdGRUB_SSIZE, status);
|
||||
+ return 0;
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,686 +0,0 @@
|
||||
From efa2ddca2c7167e98f12e9ad8963e9201fa87e75 Mon Sep 17 00:00:00 2001
|
||||
From: Elyes Haouas <ehaouas@noos.fr>
|
||||
Date: Fri, 4 Mar 2022 07:42:13 +0100
|
||||
Subject: [PATCH 01/32] video: Remove trailing whitespaces
|
||||
|
||||
Signed-off-by: Elyes Haouas <ehaouas@noos.fr>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/video/bochs.c | 2 +-
|
||||
grub-core/video/capture.c | 2 +-
|
||||
grub-core/video/cirrus.c | 4 ++--
|
||||
grub-core/video/coreboot/cbfb.c | 2 +-
|
||||
grub-core/video/efi_gop.c | 22 +++++++++----------
|
||||
grub-core/video/fb/fbblit.c | 8 +++----
|
||||
grub-core/video/fb/video_fb.c | 10 ++++-----
|
||||
grub-core/video/i386/pc/vbe.c | 34 ++++++++++++++---------------
|
||||
grub-core/video/i386/pc/vga.c | 6 ++---
|
||||
grub-core/video/ieee1275.c | 4 ++--
|
||||
grub-core/video/radeon_fuloong2e.c | 6 ++---
|
||||
grub-core/video/radeon_yeeloong3a.c | 6 ++---
|
||||
grub-core/video/readers/png.c | 2 +-
|
||||
grub-core/video/readers/tga.c | 2 +-
|
||||
grub-core/video/sis315_init.c | 2 +-
|
||||
grub-core/video/sis315pro.c | 8 +++----
|
||||
grub-core/video/sm712.c | 10 ++++-----
|
||||
grub-core/video/video.c | 8 +++----
|
||||
18 files changed, 69 insertions(+), 69 deletions(-)
|
||||
|
||||
diff --git a/grub-core/video/bochs.c b/grub-core/video/bochs.c
|
||||
index 30ea1bd828..edc651697a 100644
|
||||
--- a/grub-core/video/bochs.c
|
||||
+++ b/grub-core/video/bochs.c
|
||||
@@ -212,7 +212,7 @@ find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
|
||||
|
||||
if (((class >> 16) & 0xffff) != 0x0300 || pciid != 0x11111234)
|
||||
return 0;
|
||||
-
|
||||
+
|
||||
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
|
||||
framebuffer.base = grub_pci_read (addr) & GRUB_PCI_ADDR_MEM_MASK;
|
||||
if (!framebuffer.base)
|
||||
diff --git a/grub-core/video/capture.c b/grub-core/video/capture.c
|
||||
index 4d3195e017..c653d89f91 100644
|
||||
--- a/grub-core/video/capture.c
|
||||
+++ b/grub-core/video/capture.c
|
||||
@@ -92,7 +92,7 @@ grub_video_capture_start (const struct grub_video_mode_info *mode_info,
|
||||
framebuffer.ptr = grub_calloc (framebuffer.mode_info.height, framebuffer.mode_info.pitch);
|
||||
if (!framebuffer.ptr)
|
||||
return grub_errno;
|
||||
-
|
||||
+
|
||||
err = grub_video_fb_create_render_target_from_pointer (&framebuffer.render_target,
|
||||
&framebuffer.mode_info,
|
||||
framebuffer.ptr);
|
||||
diff --git a/grub-core/video/cirrus.c b/grub-core/video/cirrus.c
|
||||
index e2149e8ced..f5542ccdc6 100644
|
||||
--- a/grub-core/video/cirrus.c
|
||||
+++ b/grub-core/video/cirrus.c
|
||||
@@ -354,11 +354,11 @@ grub_video_cirrus_setup (unsigned int width, unsigned int height,
|
||||
grub_uint8_t sr_ext = 0, hidden_dac = 0;
|
||||
|
||||
grub_vga_set_geometry (&config, grub_vga_cr_write);
|
||||
-
|
||||
+
|
||||
grub_vga_gr_write (GRUB_VGA_GR_MODE_256_COLOR | GRUB_VGA_GR_MODE_READ_MODE1,
|
||||
GRUB_VGA_GR_MODE);
|
||||
grub_vga_gr_write (GRUB_VGA_GR_GR6_GRAPHICS_MODE, GRUB_VGA_GR_GR6);
|
||||
-
|
||||
+
|
||||
grub_vga_sr_write (GRUB_VGA_SR_MEMORY_MODE_NORMAL, GRUB_VGA_SR_MEMORY_MODE);
|
||||
|
||||
grub_vga_cr_write ((config.pitch >> CIRRUS_CR_EXTENDED_DISPLAY_PITCH_SHIFT)
|
||||
diff --git a/grub-core/video/coreboot/cbfb.c b/grub-core/video/coreboot/cbfb.c
|
||||
index 9af81fa5b0..986003c516 100644
|
||||
--- a/grub-core/video/coreboot/cbfb.c
|
||||
+++ b/grub-core/video/coreboot/cbfb.c
|
||||
@@ -106,7 +106,7 @@ grub_video_cbfb_setup (unsigned int width, unsigned int height,
|
||||
|
||||
grub_video_fb_set_palette (0, GRUB_VIDEO_FBSTD_NUMCOLORS,
|
||||
grub_video_fbstd_colors);
|
||||
-
|
||||
+
|
||||
return err;
|
||||
}
|
||||
|
||||
diff --git a/grub-core/video/efi_gop.c b/grub-core/video/efi_gop.c
|
||||
index 5a37385398..cdf0e100fa 100644
|
||||
--- a/grub-core/video/efi_gop.c
|
||||
+++ b/grub-core/video/efi_gop.c
|
||||
@@ -273,7 +273,7 @@ grub_video_gop_iterate (int (*hook) (const struct grub_video_mode_info *info, vo
|
||||
grub_efi_status_t status;
|
||||
struct grub_efi_gop_mode_info *info = NULL;
|
||||
struct grub_video_mode_info mode_info;
|
||||
-
|
||||
+
|
||||
status = efi_call_4 (gop->query_mode, gop, mode, &size, &info);
|
||||
|
||||
if (status)
|
||||
@@ -402,7 +402,7 @@ again:
|
||||
found = 1;
|
||||
}
|
||||
}
|
||||
-
|
||||
+
|
||||
if (!found)
|
||||
{
|
||||
unsigned mode;
|
||||
@@ -411,7 +411,7 @@ again:
|
||||
{
|
||||
grub_efi_uintn_t size;
|
||||
grub_efi_status_t status;
|
||||
-
|
||||
+
|
||||
status = efi_call_4 (gop->query_mode, gop, mode, &size, &info);
|
||||
if (status)
|
||||
{
|
||||
@@ -489,11 +489,11 @@ again:
|
||||
framebuffer.ptr = (void *) (grub_addr_t) gop->mode->fb_base;
|
||||
framebuffer.offscreen
|
||||
= grub_malloc (framebuffer.mode_info.height
|
||||
- * framebuffer.mode_info.width
|
||||
+ * framebuffer.mode_info.width
|
||||
* sizeof (struct grub_efi_gop_blt_pixel));
|
||||
|
||||
buffer = framebuffer.offscreen;
|
||||
-
|
||||
+
|
||||
if (!buffer)
|
||||
{
|
||||
grub_dprintf ("video", "GOP: couldn't allocate shadow\n");
|
||||
@@ -502,11 +502,11 @@ again:
|
||||
&framebuffer.mode_info);
|
||||
buffer = framebuffer.ptr;
|
||||
}
|
||||
-
|
||||
+
|
||||
grub_dprintf ("video", "GOP: initialising FB @ %p %dx%dx%d\n",
|
||||
framebuffer.ptr, framebuffer.mode_info.width,
|
||||
framebuffer.mode_info.height, framebuffer.mode_info.bpp);
|
||||
-
|
||||
+
|
||||
err = grub_video_fb_create_render_target_from_pointer
|
||||
(&framebuffer.render_target, &framebuffer.mode_info, buffer);
|
||||
|
||||
@@ -515,15 +515,15 @@ again:
|
||||
grub_dprintf ("video", "GOP: Couldn't create FB target\n");
|
||||
return err;
|
||||
}
|
||||
-
|
||||
+
|
||||
err = grub_video_fb_set_active_render_target (framebuffer.render_target);
|
||||
-
|
||||
+
|
||||
if (err)
|
||||
{
|
||||
grub_dprintf ("video", "GOP: Couldn't set FB target\n");
|
||||
return err;
|
||||
}
|
||||
-
|
||||
+
|
||||
err = grub_video_fb_set_palette (0, GRUB_VIDEO_FBSTD_NUMCOLORS,
|
||||
grub_video_fbstd_colors);
|
||||
|
||||
@@ -531,7 +531,7 @@ again:
|
||||
grub_dprintf ("video", "GOP: Couldn't set palette\n");
|
||||
else
|
||||
grub_dprintf ("video", "GOP: Success\n");
|
||||
-
|
||||
+
|
||||
return err;
|
||||
}
|
||||
|
||||
diff --git a/grub-core/video/fb/fbblit.c b/grub-core/video/fb/fbblit.c
|
||||
index d55924837d..1010ef3930 100644
|
||||
--- a/grub-core/video/fb/fbblit.c
|
||||
+++ b/grub-core/video/fb/fbblit.c
|
||||
@@ -466,7 +466,7 @@ grub_video_fbblit_replace_24bit_indexa (struct grub_video_fbblit_info *dst,
|
||||
for (i = 0; i < width; i++)
|
||||
{
|
||||
register grub_uint32_t col;
|
||||
- if (*srcptr == 0xf0)
|
||||
+ if (*srcptr == 0xf0)
|
||||
col = palette[16];
|
||||
else
|
||||
col = palette[*srcptr & 0xf];
|
||||
@@ -478,7 +478,7 @@ grub_video_fbblit_replace_24bit_indexa (struct grub_video_fbblit_info *dst,
|
||||
*dstptr++ = col >> 0;
|
||||
*dstptr++ = col >> 8;
|
||||
*dstptr++ = col >> 16;
|
||||
-#endif
|
||||
+#endif
|
||||
srcptr++;
|
||||
}
|
||||
|
||||
@@ -651,7 +651,7 @@ grub_video_fbblit_blend_24bit_indexa (struct grub_video_fbblit_info *dst,
|
||||
for (i = 0; i < width; i++)
|
||||
{
|
||||
register grub_uint32_t col;
|
||||
- if (*srcptr != 0xf0)
|
||||
+ if (*srcptr != 0xf0)
|
||||
{
|
||||
col = palette[*srcptr & 0xf];
|
||||
#ifdef GRUB_CPU_WORDS_BIGENDIAN
|
||||
@@ -662,7 +662,7 @@ grub_video_fbblit_blend_24bit_indexa (struct grub_video_fbblit_info *dst,
|
||||
*dstptr++ = col >> 0;
|
||||
*dstptr++ = col >> 8;
|
||||
*dstptr++ = col >> 16;
|
||||
-#endif
|
||||
+#endif
|
||||
}
|
||||
else
|
||||
dstptr += 3;
|
||||
diff --git a/grub-core/video/fb/video_fb.c b/grub-core/video/fb/video_fb.c
|
||||
index ae6b89f9ae..fa4ebde260 100644
|
||||
--- a/grub-core/video/fb/video_fb.c
|
||||
+++ b/grub-core/video/fb/video_fb.c
|
||||
@@ -754,7 +754,7 @@ grub_video_fb_unmap_color_int (struct grub_video_fbblit_info * source,
|
||||
*alpha = 0;
|
||||
return;
|
||||
}
|
||||
-
|
||||
+
|
||||
/* If we have an out-of-bounds color, return transparent black. */
|
||||
if (color > 255)
|
||||
{
|
||||
@@ -1141,7 +1141,7 @@ grub_video_fb_scroll (grub_video_color_t color, int dx, int dy)
|
||||
/* If everything is aligned on 32-bit use 32-bit copy. */
|
||||
if ((grub_addr_t) grub_video_fb_get_video_ptr (&target, src_x, src_y)
|
||||
% sizeof (grub_uint32_t) == 0
|
||||
- && (grub_addr_t) grub_video_fb_get_video_ptr (&target, dst_x, dst_y)
|
||||
+ && (grub_addr_t) grub_video_fb_get_video_ptr (&target, dst_x, dst_y)
|
||||
% sizeof (grub_uint32_t) == 0
|
||||
&& linelen % sizeof (grub_uint32_t) == 0
|
||||
&& linedelta % sizeof (grub_uint32_t) == 0)
|
||||
@@ -1155,7 +1155,7 @@ grub_video_fb_scroll (grub_video_color_t color, int dx, int dy)
|
||||
else if ((grub_addr_t) grub_video_fb_get_video_ptr (&target, src_x, src_y)
|
||||
% sizeof (grub_uint16_t) == 0
|
||||
&& (grub_addr_t) grub_video_fb_get_video_ptr (&target,
|
||||
- dst_x, dst_y)
|
||||
+ dst_x, dst_y)
|
||||
% sizeof (grub_uint16_t) == 0
|
||||
&& linelen % sizeof (grub_uint16_t) == 0
|
||||
&& linedelta % sizeof (grub_uint16_t) == 0)
|
||||
@@ -1170,7 +1170,7 @@ grub_video_fb_scroll (grub_video_color_t color, int dx, int dy)
|
||||
{
|
||||
grub_uint8_t *src, *dst;
|
||||
DO_SCROLL
|
||||
- }
|
||||
+ }
|
||||
}
|
||||
|
||||
/* 4. Fill empty space with specified color. In this implementation
|
||||
@@ -1615,7 +1615,7 @@ grub_video_fb_setup (unsigned int mode_type, unsigned int mode_mask,
|
||||
framebuffer.render_target = framebuffer.back_target;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
-
|
||||
+
|
||||
mode_info->mode_type &= ~(GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED
|
||||
| GRUB_VIDEO_MODE_TYPE_UPDATING_SWAP);
|
||||
|
||||
diff --git a/grub-core/video/i386/pc/vbe.c b/grub-core/video/i386/pc/vbe.c
|
||||
index 8c8cbf07eb..8b72810f85 100644
|
||||
--- a/grub-core/video/i386/pc/vbe.c
|
||||
+++ b/grub-core/video/i386/pc/vbe.c
|
||||
@@ -219,7 +219,7 @@ grub_vbe_disable_mtrr (int mtrr)
|
||||
}
|
||||
|
||||
/* Call VESA BIOS 0x4f09 to set palette data, return status. */
|
||||
-static grub_vbe_status_t
|
||||
+static grub_vbe_status_t
|
||||
grub_vbe_bios_set_palette_data (grub_uint32_t color_count,
|
||||
grub_uint32_t start_index,
|
||||
struct grub_vbe_palette_data *palette_data)
|
||||
@@ -237,7 +237,7 @@ grub_vbe_bios_set_palette_data (grub_uint32_t color_count,
|
||||
}
|
||||
|
||||
/* Call VESA BIOS 0x4f00 to get VBE Controller Information, return status. */
|
||||
-grub_vbe_status_t
|
||||
+grub_vbe_status_t
|
||||
grub_vbe_bios_get_controller_info (struct grub_vbe_info_block *ci)
|
||||
{
|
||||
struct grub_bios_int_registers regs;
|
||||
@@ -251,7 +251,7 @@ grub_vbe_bios_get_controller_info (struct grub_vbe_info_block *ci)
|
||||
}
|
||||
|
||||
/* Call VESA BIOS 0x4f01 to get VBE Mode Information, return status. */
|
||||
-grub_vbe_status_t
|
||||
+grub_vbe_status_t
|
||||
grub_vbe_bios_get_mode_info (grub_uint32_t mode,
|
||||
struct grub_vbe_mode_info_block *mode_info)
|
||||
{
|
||||
@@ -285,7 +285,7 @@ grub_vbe_bios_set_mode (grub_uint32_t mode,
|
||||
}
|
||||
|
||||
/* Call VESA BIOS 0x4f03 to return current VBE Mode, return status. */
|
||||
-grub_vbe_status_t
|
||||
+grub_vbe_status_t
|
||||
grub_vbe_bios_get_mode (grub_uint32_t *mode)
|
||||
{
|
||||
struct grub_bios_int_registers regs;
|
||||
@@ -298,7 +298,7 @@ grub_vbe_bios_get_mode (grub_uint32_t *mode)
|
||||
return regs.eax & 0xffff;
|
||||
}
|
||||
|
||||
-grub_vbe_status_t
|
||||
+grub_vbe_status_t
|
||||
grub_vbe_bios_getset_dac_palette_width (int set, int *dac_mask_size)
|
||||
{
|
||||
struct grub_bios_int_registers regs;
|
||||
@@ -346,7 +346,7 @@ grub_vbe_bios_get_memory_window (grub_uint32_t window,
|
||||
}
|
||||
|
||||
/* Call VESA BIOS 0x4f06 to set scanline length (in bytes), return status. */
|
||||
-grub_vbe_status_t
|
||||
+grub_vbe_status_t
|
||||
grub_vbe_bios_set_scanline_length (grub_uint32_t length)
|
||||
{
|
||||
struct grub_bios_int_registers regs;
|
||||
@@ -354,14 +354,14 @@ grub_vbe_bios_set_scanline_length (grub_uint32_t length)
|
||||
regs.ecx = length;
|
||||
regs.eax = 0x4f06;
|
||||
/* BL = 2, Set Scan Line in Bytes. */
|
||||
- regs.ebx = 0x0002;
|
||||
+ regs.ebx = 0x0002;
|
||||
regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT;
|
||||
grub_bios_interrupt (0x10, ®s);
|
||||
return regs.eax & 0xffff;
|
||||
}
|
||||
|
||||
/* Call VESA BIOS 0x4f06 to return scanline length (in bytes), return status. */
|
||||
-grub_vbe_status_t
|
||||
+grub_vbe_status_t
|
||||
grub_vbe_bios_get_scanline_length (grub_uint32_t *length)
|
||||
{
|
||||
struct grub_bios_int_registers regs;
|
||||
@@ -377,7 +377,7 @@ grub_vbe_bios_get_scanline_length (grub_uint32_t *length)
|
||||
}
|
||||
|
||||
/* Call VESA BIOS 0x4f07 to set display start, return status. */
|
||||
-static grub_vbe_status_t
|
||||
+static grub_vbe_status_t
|
||||
grub_vbe_bios_set_display_start (grub_uint32_t x, grub_uint32_t y)
|
||||
{
|
||||
struct grub_bios_int_registers regs;
|
||||
@@ -390,7 +390,7 @@ grub_vbe_bios_set_display_start (grub_uint32_t x, grub_uint32_t y)
|
||||
regs.edx = y;
|
||||
regs.eax = 0x4f07;
|
||||
/* BL = 80h, Set Display Start during Vertical Retrace. */
|
||||
- regs.ebx = 0x0080;
|
||||
+ regs.ebx = 0x0080;
|
||||
regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT;
|
||||
grub_bios_interrupt (0x10, ®s);
|
||||
|
||||
@@ -401,7 +401,7 @@ grub_vbe_bios_set_display_start (grub_uint32_t x, grub_uint32_t y)
|
||||
}
|
||||
|
||||
/* Call VESA BIOS 0x4f07 to get display start, return status. */
|
||||
-grub_vbe_status_t
|
||||
+grub_vbe_status_t
|
||||
grub_vbe_bios_get_display_start (grub_uint32_t *x,
|
||||
grub_uint32_t *y)
|
||||
{
|
||||
@@ -419,7 +419,7 @@ grub_vbe_bios_get_display_start (grub_uint32_t *x,
|
||||
}
|
||||
|
||||
/* Call VESA BIOS 0x4f0a. */
|
||||
-grub_vbe_status_t
|
||||
+grub_vbe_status_t
|
||||
grub_vbe_bios_get_pm_interface (grub_uint16_t *segment, grub_uint16_t *offset,
|
||||
grub_uint16_t *length)
|
||||
{
|
||||
@@ -896,7 +896,7 @@ vbe2videoinfo (grub_uint32_t mode,
|
||||
case GRUB_VBE_MEMORY_MODEL_YUV:
|
||||
mode_info->mode_type |= GRUB_VIDEO_MODE_TYPE_YUV;
|
||||
break;
|
||||
-
|
||||
+
|
||||
case GRUB_VBE_MEMORY_MODEL_DIRECT_COLOR:
|
||||
mode_info->mode_type |= GRUB_VIDEO_MODE_TYPE_RGB;
|
||||
break;
|
||||
@@ -923,10 +923,10 @@ vbe2videoinfo (grub_uint32_t mode,
|
||||
break;
|
||||
case 8:
|
||||
mode_info->bytes_per_pixel = 1;
|
||||
- break;
|
||||
+ break;
|
||||
case 4:
|
||||
mode_info->bytes_per_pixel = 0;
|
||||
- break;
|
||||
+ break;
|
||||
}
|
||||
|
||||
if (controller_info.version >= 0x300)
|
||||
@@ -976,7 +976,7 @@ grub_video_vbe_iterate (int (*hook) (const struct grub_video_mode_info *info, vo
|
||||
|
||||
static grub_err_t
|
||||
grub_video_vbe_setup (unsigned int width, unsigned int height,
|
||||
- grub_video_mode_type_t mode_type,
|
||||
+ grub_video_mode_type_t mode_type,
|
||||
grub_video_mode_type_t mode_mask)
|
||||
{
|
||||
grub_uint16_t *p;
|
||||
@@ -1208,7 +1208,7 @@ grub_video_vbe_print_adapter_specific_info (void)
|
||||
controller_info.version & 0xFF,
|
||||
controller_info.oem_software_rev >> 8,
|
||||
controller_info.oem_software_rev & 0xFF);
|
||||
-
|
||||
+
|
||||
/* The total_memory field is in 64 KiB units. */
|
||||
grub_printf_ (N_(" total memory: %d KiB\n"),
|
||||
(controller_info.total_memory << 6));
|
||||
diff --git a/grub-core/video/i386/pc/vga.c b/grub-core/video/i386/pc/vga.c
|
||||
index b2f776c997..50d0b5e028 100644
|
||||
--- a/grub-core/video/i386/pc/vga.c
|
||||
+++ b/grub-core/video/i386/pc/vga.c
|
||||
@@ -48,7 +48,7 @@ static struct
|
||||
int back_page;
|
||||
} framebuffer;
|
||||
|
||||
-static unsigned char
|
||||
+static unsigned char
|
||||
grub_vga_set_mode (unsigned char mode)
|
||||
{
|
||||
struct grub_bios_int_registers regs;
|
||||
@@ -182,10 +182,10 @@ grub_video_vga_setup (unsigned int width, unsigned int height,
|
||||
|
||||
is_target = 1;
|
||||
err = grub_video_fb_set_active_render_target (framebuffer.render_target);
|
||||
-
|
||||
+
|
||||
if (err)
|
||||
return err;
|
||||
-
|
||||
+
|
||||
err = grub_video_fb_set_palette (0, GRUB_VIDEO_FBSTD_NUMCOLORS,
|
||||
grub_video_fbstd_colors);
|
||||
|
||||
diff --git a/grub-core/video/ieee1275.c b/grub-core/video/ieee1275.c
|
||||
index b8e4b3feb3..0a89fa334d 100644
|
||||
--- a/grub-core/video/ieee1275.c
|
||||
+++ b/grub-core/video/ieee1275.c
|
||||
@@ -234,7 +234,7 @@ grub_video_ieee1275_setup (unsigned int width, unsigned int height,
|
||||
/* TODO. */
|
||||
return grub_error (GRUB_ERR_IO, "can't set mode %dx%d", width, height);
|
||||
}
|
||||
-
|
||||
+
|
||||
err = grub_video_ieee1275_fill_mode_info (dev, &framebuffer.mode_info);
|
||||
if (err)
|
||||
{
|
||||
@@ -261,7 +261,7 @@ grub_video_ieee1275_setup (unsigned int width, unsigned int height,
|
||||
|
||||
grub_video_ieee1275_set_palette (0, framebuffer.mode_info.number_of_colors,
|
||||
grub_video_fbstd_colors);
|
||||
-
|
||||
+
|
||||
return err;
|
||||
}
|
||||
|
||||
diff --git a/grub-core/video/radeon_fuloong2e.c b/grub-core/video/radeon_fuloong2e.c
|
||||
index b4da34b5ee..40917acb76 100644
|
||||
--- a/grub-core/video/radeon_fuloong2e.c
|
||||
+++ b/grub-core/video/radeon_fuloong2e.c
|
||||
@@ -75,7 +75,7 @@ find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
|
||||
if (((class >> 16) & 0xffff) != GRUB_PCI_CLASS_SUBCLASS_VGA
|
||||
|| pciid != 0x515a1002)
|
||||
return 0;
|
||||
-
|
||||
+
|
||||
*found = 1;
|
||||
|
||||
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
|
||||
@@ -139,7 +139,7 @@ grub_video_radeon_fuloong2e_setup (unsigned int width, unsigned int height,
|
||||
framebuffer.mapped = 1;
|
||||
|
||||
/* Prevent garbage from appearing on the screen. */
|
||||
- grub_memset (framebuffer.ptr, 0x55,
|
||||
+ grub_memset (framebuffer.ptr, 0x55,
|
||||
framebuffer.mode_info.height * framebuffer.mode_info.pitch);
|
||||
|
||||
#ifndef TEST
|
||||
@@ -152,7 +152,7 @@ grub_video_radeon_fuloong2e_setup (unsigned int width, unsigned int height,
|
||||
return err;
|
||||
|
||||
err = grub_video_fb_set_active_render_target (framebuffer.render_target);
|
||||
-
|
||||
+
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
diff --git a/grub-core/video/radeon_yeeloong3a.c b/grub-core/video/radeon_yeeloong3a.c
|
||||
index 52614feb69..48631c1815 100644
|
||||
--- a/grub-core/video/radeon_yeeloong3a.c
|
||||
+++ b/grub-core/video/radeon_yeeloong3a.c
|
||||
@@ -74,7 +74,7 @@ find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
|
||||
if (((class >> 16) & 0xffff) != GRUB_PCI_CLASS_SUBCLASS_VGA
|
||||
|| pciid != 0x96151002)
|
||||
return 0;
|
||||
-
|
||||
+
|
||||
*found = 1;
|
||||
|
||||
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
|
||||
@@ -137,7 +137,7 @@ grub_video_radeon_yeeloong3a_setup (unsigned int width, unsigned int height,
|
||||
#endif
|
||||
|
||||
/* Prevent garbage from appearing on the screen. */
|
||||
- grub_memset (framebuffer.ptr, 0,
|
||||
+ grub_memset (framebuffer.ptr, 0,
|
||||
framebuffer.mode_info.height * framebuffer.mode_info.pitch);
|
||||
|
||||
#ifndef TEST
|
||||
@@ -150,7 +150,7 @@ grub_video_radeon_yeeloong3a_setup (unsigned int width, unsigned int height,
|
||||
return err;
|
||||
|
||||
err = grub_video_fb_set_active_render_target (framebuffer.render_target);
|
||||
-
|
||||
+
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
diff --git a/grub-core/video/readers/png.c b/grub-core/video/readers/png.c
|
||||
index 0157ff7420..54dfedf435 100644
|
||||
--- a/grub-core/video/readers/png.c
|
||||
+++ b/grub-core/video/readers/png.c
|
||||
@@ -916,7 +916,7 @@ grub_png_convert_image (struct grub_png_data *data)
|
||||
}
|
||||
return;
|
||||
}
|
||||
-
|
||||
+
|
||||
if (data->is_gray)
|
||||
{
|
||||
switch (data->bpp)
|
||||
diff --git a/grub-core/video/readers/tga.c b/grub-core/video/readers/tga.c
|
||||
index 7cb9d1d2a0..a9ec3a1b6e 100644
|
||||
--- a/grub-core/video/readers/tga.c
|
||||
+++ b/grub-core/video/readers/tga.c
|
||||
@@ -127,7 +127,7 @@ tga_load_palette (struct tga_data *data)
|
||||
|
||||
if (len > sizeof (data->palette))
|
||||
len = sizeof (data->palette);
|
||||
-
|
||||
+
|
||||
if (grub_file_read (data->file, &data->palette, len)
|
||||
!= (grub_ssize_t) len)
|
||||
return grub_errno;
|
||||
diff --git a/grub-core/video/sis315_init.c b/grub-core/video/sis315_init.c
|
||||
index ae5c1419c1..09c3c7bbea 100644
|
||||
--- a/grub-core/video/sis315_init.c
|
||||
+++ b/grub-core/video/sis315_init.c
|
||||
@@ -1,4 +1,4 @@
|
||||
-static const struct { grub_uint8_t reg; grub_uint8_t val; } sr_dump [] =
|
||||
+static const struct { grub_uint8_t reg; grub_uint8_t val; } sr_dump [] =
|
||||
{
|
||||
{ 0x28, 0x81 },
|
||||
{ 0x2a, 0x00 },
|
||||
diff --git a/grub-core/video/sis315pro.c b/grub-core/video/sis315pro.c
|
||||
index 22a0c85a64..4d2f9999a9 100644
|
||||
--- a/grub-core/video/sis315pro.c
|
||||
+++ b/grub-core/video/sis315pro.c
|
||||
@@ -103,7 +103,7 @@ find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
|
||||
if (((class >> 16) & 0xffff) != GRUB_PCI_CLASS_SUBCLASS_VGA
|
||||
|| pciid != GRUB_SIS315PRO_PCIID)
|
||||
return 0;
|
||||
-
|
||||
+
|
||||
*found = 1;
|
||||
|
||||
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
|
||||
@@ -218,7 +218,7 @@ grub_video_sis315pro_setup (unsigned int width, unsigned int height,
|
||||
|
||||
#ifndef TEST
|
||||
/* Prevent garbage from appearing on the screen. */
|
||||
- grub_memset (framebuffer.ptr, 0,
|
||||
+ grub_memset (framebuffer.ptr, 0,
|
||||
framebuffer.mode_info.height * framebuffer.mode_info.pitch);
|
||||
grub_arch_sync_dma_caches (framebuffer.ptr,
|
||||
framebuffer.mode_info.height
|
||||
@@ -231,7 +231,7 @@ grub_video_sis315pro_setup (unsigned int width, unsigned int height,
|
||||
| GRUB_VGA_IO_MISC_EXTERNAL_CLOCK_0
|
||||
| GRUB_VGA_IO_MISC_28MHZ
|
||||
| GRUB_VGA_IO_MISC_ENABLE_VRAM_ACCESS
|
||||
- | GRUB_VGA_IO_MISC_COLOR,
|
||||
+ | GRUB_VGA_IO_MISC_COLOR,
|
||||
GRUB_VGA_IO_MISC_WRITE + GRUB_MACHINE_PCI_IO_BASE);
|
||||
|
||||
grub_vga_sr_write (0x86, 5);
|
||||
@@ -335,7 +335,7 @@ grub_video_sis315pro_setup (unsigned int width, unsigned int height,
|
||||
{
|
||||
if (read_sis_cmd (0x5) != 0xa1)
|
||||
write_sis_cmd (0x86, 0x5);
|
||||
-
|
||||
+
|
||||
write_sis_cmd (read_sis_cmd (0x20) | 0xa1, 0x20);
|
||||
write_sis_cmd (read_sis_cmd (0x1e) | 0xda, 0x1e);
|
||||
|
||||
diff --git a/grub-core/video/sm712.c b/grub-core/video/sm712.c
|
||||
index 10c46eb654..65f59f84b1 100644
|
||||
--- a/grub-core/video/sm712.c
|
||||
+++ b/grub-core/video/sm712.c
|
||||
@@ -167,7 +167,7 @@ enum
|
||||
GRUB_SM712_CR_SHADOW_VGA_VBLANK_START = 0x46,
|
||||
GRUB_SM712_CR_SHADOW_VGA_VBLANK_END = 0x47,
|
||||
GRUB_SM712_CR_SHADOW_VGA_VRETRACE_START = 0x48,
|
||||
- GRUB_SM712_CR_SHADOW_VGA_VRETRACE_END = 0x49,
|
||||
+ GRUB_SM712_CR_SHADOW_VGA_VRETRACE_END = 0x49,
|
||||
GRUB_SM712_CR_SHADOW_VGA_OVERFLOW = 0x4a,
|
||||
GRUB_SM712_CR_SHADOW_VGA_CELL_HEIGHT = 0x4b,
|
||||
GRUB_SM712_CR_SHADOW_VGA_HDISPLAY_END = 0x4c,
|
||||
@@ -375,7 +375,7 @@ find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
|
||||
if (((class >> 16) & 0xffff) != GRUB_PCI_CLASS_SUBCLASS_VGA
|
||||
|| pciid != GRUB_SM712_PCIID)
|
||||
return 0;
|
||||
-
|
||||
+
|
||||
*found = 1;
|
||||
|
||||
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
|
||||
@@ -471,7 +471,7 @@ grub_video_sm712_setup (unsigned int width, unsigned int height,
|
||||
|
||||
#if !defined (TEST) && !defined(GENINIT)
|
||||
/* Prevent garbage from appearing on the screen. */
|
||||
- grub_memset ((void *) framebuffer.cached_ptr, 0,
|
||||
+ grub_memset ((void *) framebuffer.cached_ptr, 0,
|
||||
framebuffer.mode_info.height * framebuffer.mode_info.pitch);
|
||||
#endif
|
||||
|
||||
@@ -482,7 +482,7 @@ grub_video_sm712_setup (unsigned int width, unsigned int height,
|
||||
grub_sm712_sr_write (0x2, 0x6b);
|
||||
grub_sm712_write_reg (0, GRUB_VGA_IO_PIXEL_MASK);
|
||||
grub_sm712_sr_write (GRUB_VGA_SR_RESET_ASYNC, GRUB_VGA_SR_RESET);
|
||||
- grub_sm712_write_reg (GRUB_VGA_IO_MISC_NEGATIVE_VERT_POLARITY
|
||||
+ grub_sm712_write_reg (GRUB_VGA_IO_MISC_NEGATIVE_VERT_POLARITY
|
||||
| GRUB_VGA_IO_MISC_NEGATIVE_HORIZ_POLARITY
|
||||
| GRUB_VGA_IO_MISC_UPPER_64K
|
||||
| GRUB_VGA_IO_MISC_EXTERNAL_CLOCK_0
|
||||
@@ -694,7 +694,7 @@ grub_video_sm712_setup (unsigned int width, unsigned int height,
|
||||
for (i = 0; i < ARRAY_SIZE (dda_lookups); i++)
|
||||
grub_sm712_write_dda_lookup (i, dda_lookups[i].compare, dda_lookups[i].dda,
|
||||
dda_lookups[i].vcentering);
|
||||
-
|
||||
+
|
||||
/* Undocumented */
|
||||
grub_sm712_cr_write (0, 0x9c);
|
||||
grub_sm712_cr_write (0, 0x9d);
|
||||
diff --git a/grub-core/video/video.c b/grub-core/video/video.c
|
||||
index 983424107c..8937da745d 100644
|
||||
--- a/grub-core/video/video.c
|
||||
+++ b/grub-core/video/video.c
|
||||
@@ -491,13 +491,13 @@ parse_modespec (const char *current_mode, int *width, int *height, int *depth)
|
||||
current_mode);
|
||||
|
||||
param++;
|
||||
-
|
||||
+
|
||||
*width = grub_strtoul (value, 0, 0);
|
||||
if (grub_errno != GRUB_ERR_NONE)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||
N_("invalid video mode specification `%s'"),
|
||||
current_mode);
|
||||
-
|
||||
+
|
||||
/* Find height value. */
|
||||
value = param;
|
||||
param = grub_strchr(param, 'x');
|
||||
@@ -513,13 +513,13 @@ parse_modespec (const char *current_mode, int *width, int *height, int *depth)
|
||||
{
|
||||
/* We have optional color depth value. */
|
||||
param++;
|
||||
-
|
||||
+
|
||||
*height = grub_strtoul (value, 0, 0);
|
||||
if (grub_errno != GRUB_ERR_NONE)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||
N_("invalid video mode specification `%s'"),
|
||||
current_mode);
|
||||
-
|
||||
+
|
||||
/* Convert color depth value. */
|
||||
value = param;
|
||||
*depth = grub_strtoul (value, 0, 0);
|
||||
--
|
||||
2.34.1
|
||||
|
@ -0,0 +1,83 @@
|
||||
From 6c06378c1bf6ae21788427e62ab0011b7f1bc2f0 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Fri, 25 Nov 2022 16:11:24 +0800
|
||||
Subject: [PATCH] xen_boot: add missing grub_arch_efi_linux_load_image_header
|
||||
|
||||
The new xen_boot module has used grub_arch_efi_linux_load_image_header
|
||||
exported by grub-core/loader/arm64/linux.c. It is not a problem for
|
||||
upstream but many downstream projects may not use it and take
|
||||
grub-core/loader/arm64/efi/linux.c as a replacement as PE entry is the
|
||||
preferred way in combination with shim loader.
|
||||
|
||||
This patch did a trivial workaround just adding back the dropped
|
||||
defintion to the xen_boot itself.
|
||||
|
||||
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
---
|
||||
grub-core/loader/arm64/xen_boot.c | 50 +++++++++++++++++++++++++++++++
|
||||
1 file changed, 50 insertions(+)
|
||||
|
||||
diff --git a/grub-core/loader/arm64/xen_boot.c b/grub-core/loader/arm64/xen_boot.c
|
||||
index 26e1472c9..b82a2db89 100644
|
||||
--- a/grub-core/loader/arm64/xen_boot.c
|
||||
+++ b/grub-core/loader/arm64/xen_boot.c
|
||||
@@ -84,6 +84,56 @@ static int loaded;
|
||||
static struct xen_boot_binary *xen_hypervisor;
|
||||
static struct xen_boot_binary *module_head;
|
||||
|
||||
+/* The function is exported by grub-core/loader/arm64/linux.c that is not built
|
||||
+ * because we use PE entry provided by grub-core/loader/arm64/efi/linux.c
|
||||
+ */
|
||||
+static bool initrd_use_loadfile2 = false;
|
||||
+
|
||||
+grub_err_t
|
||||
+grub_arch_efi_linux_load_image_header (grub_file_t file,
|
||||
+ struct linux_arch_kernel_header * lh)
|
||||
+{
|
||||
+ grub_file_seek (file, 0);
|
||||
+ if (grub_file_read (file, lh, sizeof (*lh)) < (grub_ssize_t) sizeof (*lh))
|
||||
+ return grub_error(GRUB_ERR_FILE_READ_ERROR, "failed to read Linux image header");
|
||||
+
|
||||
+ if ((lh->code0 & 0xffff) != GRUB_PE32_MAGIC)
|
||||
+ return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
+ N_("plain image kernel not supported - rebuild with CONFIG_(U)EFI_STUB enabled"));
|
||||
+
|
||||
+ grub_dprintf ("linux", "UEFI stub kernel:\n");
|
||||
+ grub_dprintf ("linux", "PE/COFF header @ %08x\n", lh->hdr_offset);
|
||||
+
|
||||
+ /*
|
||||
+ * The PE/COFF spec permits the COFF header to appear anywhere in the file, so
|
||||
+ * we need to double check whether it was where we expected it, and if not, we
|
||||
+ * must load it from the correct offset into the pe_image_header field of
|
||||
+ * struct linux_arch_kernel_header.
|
||||
+ */
|
||||
+ if ((grub_uint8_t *) lh + lh->hdr_offset != (grub_uint8_t *) &lh->pe_image_header)
|
||||
+ {
|
||||
+ if (grub_file_seek (file, lh->hdr_offset) == (grub_off_t) -1
|
||||
+ || grub_file_read (file, &lh->pe_image_header,
|
||||
+ sizeof (struct grub_pe_image_header))
|
||||
+ != sizeof (struct grub_pe_image_header))
|
||||
+ return grub_error (GRUB_ERR_FILE_READ_ERROR, "failed to read COFF image header");
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Linux kernels built for any architecture are guaranteed to support the
|
||||
+ * LoadFile2 based initrd loading protocol if the image version is >= 1.
|
||||
+ */
|
||||
+ if (lh->pe_image_header.optional_header.major_image_version >= 1)
|
||||
+ initrd_use_loadfile2 = true;
|
||||
+ else
|
||||
+ initrd_use_loadfile2 = false;
|
||||
+
|
||||
+ grub_dprintf ("linux", "LoadFile2 initrd loading %sabled\n",
|
||||
+ initrd_use_loadfile2 ? "en" : "dis");
|
||||
+
|
||||
+ return GRUB_ERR_NONE;
|
||||
+}
|
||||
+
|
||||
static __inline grub_addr_t
|
||||
xen_boot_address_align (grub_addr_t start, grub_size_t align)
|
||||
{
|
||||
--
|
||||
2.41.0
|
||||
|
@ -49,7 +49,7 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
};
|
||||
|
||||
|
||||
@@ -78,6 +79,8 @@
|
||||
@@ -86,6 +87,8 @@
|
||||
if (data->in_chunk_len == 2)
|
||||
{
|
||||
data->chunk_rem = grub_strtoul (ptr, 0, 16);
|
||||
|
@ -12,15 +12,12 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
include/grub/disk.h | 3 +++
|
||||
2 files changed, 21 insertions(+)
|
||||
|
||||
diff --git a/grub-core/lib/disk.c b/grub-core/lib/disk.c
|
||||
index b4eb064a81..08e24485f0 100644
|
||||
--- a/grub-core/lib/disk.c
|
||||
+++ b/grub-core/lib/disk.c
|
||||
@@ -51,6 +51,24 @@ grub_disk_cache_invalidate (unsigned long dev_id, unsigned long disk_id,
|
||||
}
|
||||
@@ -52,6 +52,24 @@
|
||||
}
|
||||
|
||||
+grub_err_t
|
||||
grub_err_t
|
||||
+grub_disk_write_tail (grub_disk_t disk, grub_size_t size, const void *buf)
|
||||
+{
|
||||
+ grub_partition_t part;
|
||||
@ -38,14 +35,13 @@ index b4eb064a81..08e24485f0 100644
|
||||
+ return grub_disk_write (disk, sector, offset, size, buf);
|
||||
+}
|
||||
+
|
||||
grub_err_t
|
||||
+grub_err_t
|
||||
grub_disk_write (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
grub_off_t offset, grub_size_t size, const void *buf)
|
||||
diff --git a/include/grub/disk.h b/include/grub/disk.h
|
||||
index f95aca929a..6d656c4315 100644
|
||||
{
|
||||
--- a/include/grub/disk.h
|
||||
+++ b/include/grub/disk.h
|
||||
@@ -232,6 +232,9 @@ grub_err_t EXPORT_FUNC(grub_disk_read) (grub_disk_t disk,
|
||||
@@ -252,6 +252,9 @@
|
||||
grub_off_t offset,
|
||||
grub_size_t size,
|
||||
void *buf);
|
||||
@ -55,6 +51,3 @@ index f95aca929a..6d656c4315 100644
|
||||
grub_err_t grub_disk_write (grub_disk_t disk,
|
||||
grub_disk_addr_t sector,
|
||||
grub_off_t offset,
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
@ -24,11 +24,9 @@ Signed-off-by: Peter Jones <pjones@redhat.com>
|
||||
include/grub/arm64/linux.h | 1 +
|
||||
3 files changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/loader/arm64/efi/linux.c b/grub-core/loader/arm64/efi/linux.c
|
||||
index 4da49a182..87cb2f97c 100644
|
||||
--- a/grub-core/loader/arm64/efi/linux.c
|
||||
+++ b/grub-core/loader/arm64/efi/linux.c
|
||||
@@ -376,7 +376,7 @@ parse_pe_header (void *kernel, grub_uint64_t *total_size,
|
||||
@@ -376,7 +376,7 @@
|
||||
|
||||
pe = (void *)((unsigned long)kernel + lh->hdr_offset);
|
||||
|
||||
@ -37,30 +35,23 @@ index 4da49a182..87cb2f97c 100644
|
||||
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 b582f67f6..966a5074f 100644
|
||||
--- a/include/grub/arm/linux.h
|
||||
+++ b/include/grub/arm/linux.h
|
||||
@@ -44,6 +44,7 @@ struct grub_arm_linux_pe_header
|
||||
@@ -33,6 +33,7 @@
|
||||
};
|
||||
|
||||
#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 de99d39c0..b4b91473a 100644
|
||||
|
||||
--- a/include/grub/arm64/linux.h
|
||||
+++ b/include/grub/arm64/linux.h
|
||||
@@ -48,6 +48,7 @@ struct grub_arm64_linux_pe_header
|
||||
@@ -33,6 +33,7 @@
|
||||
|
||||
#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
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
|
@ -1,533 +0,0 @@
|
||||
From 04de53cb4adc0ae6429b0715c3f1dd8a62ff9a0f Mon Sep 17 00:00:00 2001
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Wed, 16 Mar 2022 17:05:01 +0800
|
||||
Subject: [PATCH 2/3] Fix -Werror=array-bounds array subscript 0 is outside
|
||||
array bounds
|
||||
|
||||
The grub is failing to build with gcc-12 in many places like this:
|
||||
|
||||
In function 'init_cbfsdisk',
|
||||
inlined from 'grub_mod_init' at ../../grub-core/fs/cbfs.c:391:3:
|
||||
../../grub-core/fs/cbfs.c:345:7: error: array subscript 0 is outside array bounds of 'grub_uint32_t[0]' {aka 'unsigned int[]'} [-Werror=array-bounds]
|
||||
345 | ptr = *(grub_uint32_t *) 0xfffffffc;
|
||||
| ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This is caused by gcc regression in 11/12 [1]. In a nut shell, the
|
||||
warning is about detected invalid accesses at non-zero offsets to null
|
||||
pointers. Since hardwired constant address is treated as NULL plus an
|
||||
offset in the same underlying code, the warning is therefore triggered.
|
||||
|
||||
Instead of inserting #pragma all over the places where literal pointers
|
||||
are accessed to avoid diagnosing array-bounds, we can try to borrow the
|
||||
idea from linux kernel that the absolute_pointer macro [2][3] is used to
|
||||
disconnect a pointer using literal address from it's original object,
|
||||
hence gcc won't be able to make assumptions on the boundary while doing
|
||||
pointer arithmetic. With that we can greatly reduce the code we have to
|
||||
cover up by making initial literal pointer assignment to use the new
|
||||
wrapper but not having to track everywhere literal pointers are
|
||||
accessed. This also makes code looks cleaner.
|
||||
|
||||
[1]
|
||||
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578
|
||||
[2]
|
||||
https://elixir.bootlin.com/linux/v5.16.14/source/include/linux/compiler.h#L180
|
||||
[3]
|
||||
https://elixir.bootlin.com/linux/v5.16.14/source/include/linux/compiler-gcc.h#L31
|
||||
|
||||
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
---
|
||||
grub-core/bus/cs5536.c | 4 ++--
|
||||
grub-core/commands/acpi.c | 4 ++--
|
||||
grub-core/commands/efi/loadbios.c | 9 +++++----
|
||||
grub-core/commands/i386/pc/drivemap.c | 9 ++++++---
|
||||
grub-core/commands/i386/pc/sendkey.c | 12 ++++++------
|
||||
grub-core/disk/i386/pc/biosdisk.c | 4 ++--
|
||||
grub-core/fs/cbfs.c | 2 +-
|
||||
grub-core/kern/i386/pc/acpi.c | 4 ++--
|
||||
grub-core/kern/i386/pc/mmap.c | 2 +-
|
||||
grub-core/loader/i386/multiboot_mbi.c | 2 +-
|
||||
grub-core/loader/multiboot_mbi2.c | 4 ++--
|
||||
grub-core/mmap/i386/pc/mmap.c | 26 +++++++++++++-------------
|
||||
grub-core/net/drivers/i386/pc/pxe.c | 12 ++++++------
|
||||
grub-core/term/i386/pc/console.c | 5 ++---
|
||||
grub-core/term/i386/pc/vga_text.c | 6 +++---
|
||||
grub-core/term/ns8250.c | 7 ++++++-
|
||||
grub-core/video/i386/pc/vbe.c | 6 +++---
|
||||
include/grub/compiler.h | 11 +++++++++++
|
||||
18 files changed, 74 insertions(+), 55 deletions(-)
|
||||
|
||||
diff --git a/grub-core/bus/cs5536.c b/grub-core/bus/cs5536.c
|
||||
index bb9aa27e5b..bccaeeeccb 100644
|
||||
--- a/grub-core/bus/cs5536.c
|
||||
+++ b/grub-core/bus/cs5536.c
|
||||
@@ -331,8 +331,8 @@ grub_cs5536_init_geode (grub_pci_device_t dev)
|
||||
|
||||
{
|
||||
volatile grub_uint32_t *oc;
|
||||
- oc = grub_pci_device_map_range (dev, 0x05022000,
|
||||
- GRUB_CS5536_USB_OPTION_REGS_SIZE);
|
||||
+ oc = grub_absolute_pointer (grub_pci_device_map_range (dev, 0x05022000,
|
||||
+ GRUB_CS5536_USB_OPTION_REGS_SIZE));
|
||||
|
||||
oc[GRUB_CS5536_USB_OPTION_REG_UOCMUX] =
|
||||
(oc[GRUB_CS5536_USB_OPTION_REG_UOCMUX]
|
||||
diff --git a/grub-core/commands/acpi.c b/grub-core/commands/acpi.c
|
||||
index 1215f2a62e..4721730b39 100644
|
||||
--- a/grub-core/commands/acpi.c
|
||||
+++ b/grub-core/commands/acpi.c
|
||||
@@ -168,7 +168,7 @@ grub_acpi_create_ebda (void)
|
||||
struct grub_acpi_rsdp_v10 *v1;
|
||||
struct grub_acpi_rsdp_v20 *v2;
|
||||
|
||||
- ebda = (grub_uint8_t *) (grub_addr_t) ((*((grub_uint16_t *)0x40e)) << 4);
|
||||
+ ebda = (grub_uint8_t *) (grub_addr_t) ((*((grub_uint16_t *)grub_absolute_pointer(0x40e))) << 4);
|
||||
grub_dprintf ("acpi", "EBDA @%p\n", ebda);
|
||||
if (ebda)
|
||||
ebda_kb_len = *(grub_uint16_t *) ebda;
|
||||
@@ -298,7 +298,7 @@ grub_acpi_create_ebda (void)
|
||||
*target = 0;
|
||||
|
||||
grub_dprintf ("acpi", "Switching EBDA\n");
|
||||
- (*((grub_uint16_t *) 0x40e)) = ((grub_addr_t) targetebda) >> 4;
|
||||
+ (*((grub_uint16_t *) grub_absolute_pointer(0x40e))) = ((grub_addr_t) targetebda) >> 4;
|
||||
grub_dprintf ("acpi", "EBDA switched\n");
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
diff --git a/grub-core/commands/efi/loadbios.c b/grub-core/commands/efi/loadbios.c
|
||||
index 5c7725f8bd..574e410466 100644
|
||||
--- a/grub-core/commands/efi/loadbios.c
|
||||
+++ b/grub-core/commands/efi/loadbios.c
|
||||
@@ -46,7 +46,7 @@ enable_rom_area (void)
|
||||
grub_uint32_t *rom_ptr;
|
||||
grub_pci_device_t dev = { .bus = 0, .device = 0, .function = 0};
|
||||
|
||||
- rom_ptr = (grub_uint32_t *) VBIOS_ADDR;
|
||||
+ rom_ptr = grub_absolute_pointer (VBIOS_ADDR);
|
||||
if (*rom_ptr != BLANK_MEM)
|
||||
{
|
||||
grub_puts_ (N_("ROM image is present."));
|
||||
@@ -96,8 +96,8 @@ fake_bios_data (int use_rom)
|
||||
void *acpi, *smbios;
|
||||
grub_uint16_t *ebda_seg_ptr, *low_mem_ptr;
|
||||
|
||||
- ebda_seg_ptr = (grub_uint16_t *) EBDA_SEG_ADDR;
|
||||
- low_mem_ptr = (grub_uint16_t *) LOW_MEM_ADDR;
|
||||
+ ebda_seg_ptr = grub_absolute_pointer (EBDA_SEG_ADDR);
|
||||
+ low_mem_ptr = grub_absolute_pointer (LOW_MEM_ADDR);
|
||||
if ((*ebda_seg_ptr) || (*low_mem_ptr))
|
||||
return;
|
||||
|
||||
@@ -132,7 +132,8 @@ fake_bios_data (int use_rom)
|
||||
*ebda_seg_ptr = FAKE_EBDA_SEG;
|
||||
*low_mem_ptr = (FAKE_EBDA_SEG >> 6);
|
||||
|
||||
- *((grub_uint16_t *) (FAKE_EBDA_SEG << 4)) = 640 - *low_mem_ptr;
|
||||
+ /* *((grub_uint16_t *) (FAKE_EBDA_SEG << 4)) = 640 - *low_mem_ptr; */
|
||||
+ *((grub_uint16_t *) (grub_absolute_pointer (FAKE_EBDA_SEG << 4))) = 640 - *low_mem_ptr;
|
||||
|
||||
if (acpi)
|
||||
grub_memcpy ((char *) ((FAKE_EBDA_SEG << 4) + 16), acpi, 1024 - 16);
|
||||
diff --git a/grub-core/commands/i386/pc/drivemap.c b/grub-core/commands/i386/pc/drivemap.c
|
||||
index 7f7f2d41c0..6a4d923613 100644
|
||||
--- a/grub-core/commands/i386/pc/drivemap.c
|
||||
+++ b/grub-core/commands/i386/pc/drivemap.c
|
||||
@@ -31,9 +31,6 @@
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
-/* Real mode IVT slot (seg:off far pointer) for interrupt 0x13. */
|
||||
-static grub_uint32_t *const int13slot = (grub_uint32_t *) (4 * 0x13);
|
||||
-
|
||||
/* Remember to update enum opt_idxs accordingly. */
|
||||
static const struct grub_arg_option options[] = {
|
||||
/* TRANSLATORS: In this file "mapping" refers to a change GRUB makes so if
|
||||
@@ -280,6 +277,9 @@ install_int13_handler (int noret __attribute__ ((unused)))
|
||||
grub_uint8_t *handler_base = 0;
|
||||
/* Address of the map within the deployed bundle. */
|
||||
int13map_node_t *handler_map;
|
||||
+ /* Real mode IVT slot (seg:off far pointer) for interrupt 0x13. */
|
||||
+ grub_uint32_t *int13slot = (grub_uint32_t *) grub_absolute_pointer (4 * 0x13);
|
||||
+
|
||||
|
||||
int i;
|
||||
int entries = 0;
|
||||
@@ -354,6 +354,9 @@ install_int13_handler (int noret __attribute__ ((unused)))
|
||||
static grub_err_t
|
||||
uninstall_int13_handler (void)
|
||||
{
|
||||
+ /* Real mode IVT slot (seg:off far pointer) for interrupt 0x13. */
|
||||
+ grub_uint32_t *int13slot = (grub_uint32_t *) grub_absolute_pointer (4 * 0x13);
|
||||
+
|
||||
if (! grub_drivemap_oldhandler)
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
diff --git a/grub-core/commands/i386/pc/sendkey.c b/grub-core/commands/i386/pc/sendkey.c
|
||||
index 26d9acd3de..532a66497f 100644
|
||||
--- a/grub-core/commands/i386/pc/sendkey.c
|
||||
+++ b/grub-core/commands/i386/pc/sendkey.c
|
||||
@@ -216,12 +216,12 @@ static grub_err_t
|
||||
grub_sendkey_postboot (void)
|
||||
{
|
||||
/* For convention: pointer to flags. */
|
||||
- grub_uint32_t *flags = (grub_uint32_t *) 0x417;
|
||||
+ grub_uint32_t *flags = grub_absolute_pointer (0x417);
|
||||
|
||||
*flags = oldflags;
|
||||
|
||||
- *((char *) 0x41a) = 0x1e;
|
||||
- *((char *) 0x41c) = 0x1e;
|
||||
+ *((char *) grub_absolute_pointer (0x41a)) = 0x1e;
|
||||
+ *((char *) grub_absolute_pointer (0x41c)) = 0x1e;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
@@ -231,13 +231,13 @@ static grub_err_t
|
||||
grub_sendkey_preboot (int noret __attribute__ ((unused)))
|
||||
{
|
||||
/* For convention: pointer to flags. */
|
||||
- grub_uint32_t *flags = (grub_uint32_t *) 0x417;
|
||||
+ grub_uint32_t *flags = grub_absolute_pointer (0x417);
|
||||
|
||||
oldflags = *flags;
|
||||
|
||||
/* Set the sendkey. */
|
||||
- *((char *) 0x41a) = 0x1e;
|
||||
- *((char *) 0x41c) = keylen + 0x1e;
|
||||
+ *((char *) grub_absolute_pointer (0x41a)) = 0x1e;
|
||||
+ *((char *) grub_absolute_pointer (0x41c)) = keylen + 0x1e;
|
||||
grub_memcpy ((char *) 0x41e, sendkey, 0x20);
|
||||
|
||||
/* Transform "any ctrl" to "right ctrl" flag. */
|
||||
diff --git a/grub-core/disk/i386/pc/biosdisk.c b/grub-core/disk/i386/pc/biosdisk.c
|
||||
index 8ca250c77b..89746ed940 100644
|
||||
--- a/grub-core/disk/i386/pc/biosdisk.c
|
||||
+++ b/grub-core/disk/i386/pc/biosdisk.c
|
||||
@@ -367,7 +367,7 @@ grub_biosdisk_open (const char *name, grub_disk_t disk)
|
||||
if (version)
|
||||
{
|
||||
struct grub_biosdisk_drp *drp
|
||||
- = (struct grub_biosdisk_drp *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
|
||||
+ = (struct grub_biosdisk_drp *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR);
|
||||
|
||||
/* Clear out the DRP. */
|
||||
grub_memset (drp, 0, sizeof (*drp));
|
||||
@@ -654,7 +654,7 @@ grub_disk_biosdisk_fini (void)
|
||||
GRUB_MOD_INIT(biosdisk)
|
||||
{
|
||||
struct grub_biosdisk_cdrp *cdrp
|
||||
- = (struct grub_biosdisk_cdrp *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
|
||||
+ = (struct grub_biosdisk_cdrp *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR);
|
||||
grub_uint8_t boot_drive;
|
||||
|
||||
if (grub_disk_firmware_is_tainted)
|
||||
diff --git a/grub-core/fs/cbfs.c b/grub-core/fs/cbfs.c
|
||||
index 581215ef18..8ab7106afb 100644
|
||||
--- a/grub-core/fs/cbfs.c
|
||||
+++ b/grub-core/fs/cbfs.c
|
||||
@@ -342,7 +342,7 @@ init_cbfsdisk (void)
|
||||
grub_uint32_t ptr;
|
||||
struct cbfs_header *head;
|
||||
|
||||
- ptr = *(grub_uint32_t *) 0xfffffffc;
|
||||
+ ptr = *((grub_uint32_t *) grub_absolute_pointer (0xfffffffc));
|
||||
head = (struct cbfs_header *) (grub_addr_t) ptr;
|
||||
grub_dprintf ("cbfs", "head=%p\n", head);
|
||||
|
||||
diff --git a/grub-core/kern/i386/pc/acpi.c b/grub-core/kern/i386/pc/acpi.c
|
||||
index 297f5d05f3..0a69eba7b5 100644
|
||||
--- a/grub-core/kern/i386/pc/acpi.c
|
||||
+++ b/grub-core/kern/i386/pc/acpi.c
|
||||
@@ -27,7 +27,7 @@ grub_machine_acpi_get_rsdpv1 (void)
|
||||
grub_uint8_t *ebda, *ptr;
|
||||
|
||||
grub_dprintf ("acpi", "Looking for RSDP. Scanning EBDA\n");
|
||||
- ebda = (grub_uint8_t *) ((* ((grub_uint16_t *) 0x40e)) << 4);
|
||||
+ ebda = (grub_uint8_t *) ((* ((grub_uint16_t *) grub_absolute_pointer (0x40e))) << 4);
|
||||
ebda_len = * (grub_uint16_t *) ebda;
|
||||
if (! ebda_len) /* FIXME do we really need this check? */
|
||||
goto scan_bios;
|
||||
@@ -55,7 +55,7 @@ grub_machine_acpi_get_rsdpv2 (void)
|
||||
grub_uint8_t *ebda, *ptr;
|
||||
|
||||
grub_dprintf ("acpi", "Looking for RSDP. Scanning EBDA\n");
|
||||
- ebda = (grub_uint8_t *) ((* ((grub_uint16_t *) 0x40e)) << 4);
|
||||
+ ebda = (grub_uint8_t *) ((* ((grub_uint16_t *) grub_absolute_pointer (0x40e))) << 4);
|
||||
ebda_len = * (grub_uint16_t *) ebda;
|
||||
if (! ebda_len) /* FIXME do we really need this check? */
|
||||
goto scan_bios;
|
||||
diff --git a/grub-core/kern/i386/pc/mmap.c b/grub-core/kern/i386/pc/mmap.c
|
||||
index c0c3c35858..a4a1a75af4 100644
|
||||
--- a/grub-core/kern/i386/pc/mmap.c
|
||||
+++ b/grub-core/kern/i386/pc/mmap.c
|
||||
@@ -143,7 +143,7 @@ grub_machine_mmap_iterate (grub_memory_hook_t hook, void *hook_data)
|
||||
{
|
||||
grub_uint32_t cont = 0;
|
||||
struct grub_machine_mmap_entry *entry
|
||||
- = (struct grub_machine_mmap_entry *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
|
||||
+ = (struct grub_machine_mmap_entry *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR);
|
||||
int e820_works = 0;
|
||||
|
||||
while (1)
|
||||
diff --git a/grub-core/loader/i386/multiboot_mbi.c b/grub-core/loader/i386/multiboot_mbi.c
|
||||
index a67d9d0a80..434e694ffb 100644
|
||||
--- a/grub-core/loader/i386/multiboot_mbi.c
|
||||
+++ b/grub-core/loader/i386/multiboot_mbi.c
|
||||
@@ -293,7 +293,7 @@ fill_vbe_info (struct multiboot_info *mbi, grub_uint8_t *ptrorig,
|
||||
struct grub_vbe_mode_info_block *mode_info;
|
||||
#if GRUB_MACHINE_HAS_VBE
|
||||
grub_vbe_status_t status;
|
||||
- void *scratch = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
|
||||
+ void *scratch = grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR);
|
||||
|
||||
status = grub_vbe_bios_get_controller_info (scratch);
|
||||
if (status != GRUB_VBE_STATUS_OK)
|
||||
diff --git a/grub-core/loader/multiboot_mbi2.c b/grub-core/loader/multiboot_mbi2.c
|
||||
index 9a943d7bdd..2ad210e7f9 100644
|
||||
--- a/grub-core/loader/multiboot_mbi2.c
|
||||
+++ b/grub-core/loader/multiboot_mbi2.c
|
||||
@@ -504,7 +504,7 @@ static void
|
||||
fill_vbe_tag (struct multiboot_tag_vbe *tag)
|
||||
{
|
||||
grub_vbe_status_t status;
|
||||
- void *scratch = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
|
||||
+ void *scratch = grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR);
|
||||
|
||||
tag->type = MULTIBOOT_TAG_TYPE_VBE;
|
||||
tag->size = 0;
|
||||
@@ -577,7 +577,7 @@ retrieve_video_parameters (grub_properly_aligned_t **ptrorig)
|
||||
#if defined (GRUB_MACHINE_PCBIOS)
|
||||
{
|
||||
grub_vbe_status_t status;
|
||||
- void *scratch = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
|
||||
+ void *scratch = grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR);
|
||||
status = grub_vbe_bios_get_mode (scratch);
|
||||
vbe_mode = *(grub_uint32_t *) scratch;
|
||||
if (status != GRUB_VBE_STATUS_OK)
|
||||
diff --git a/grub-core/mmap/i386/pc/mmap.c b/grub-core/mmap/i386/pc/mmap.c
|
||||
index 6ab4f67309..b9c5b0a002 100644
|
||||
--- a/grub-core/mmap/i386/pc/mmap.c
|
||||
+++ b/grub-core/mmap/i386/pc/mmap.c
|
||||
@@ -80,13 +80,13 @@ preboot (int noreturn __attribute__ ((unused)))
|
||||
= min (grub_mmap_get_post64 (), 0xfc000000ULL) >> 16;
|
||||
|
||||
/* Correct BDA. */
|
||||
- *((grub_uint16_t *) 0x413) = grub_mmap_get_lower () >> 10;
|
||||
+ *((grub_uint16_t *) grub_absolute_pointer (0x413)) = grub_mmap_get_lower () >> 10;
|
||||
|
||||
/* Save old interrupt handlers. */
|
||||
- grub_machine_mmaphook_int12offset = *((grub_uint16_t *) 0x48);
|
||||
- grub_machine_mmaphook_int12segment = *((grub_uint16_t *) 0x4a);
|
||||
- grub_machine_mmaphook_int15offset = *((grub_uint16_t *) 0x54);
|
||||
- grub_machine_mmaphook_int15segment = *((grub_uint16_t *) 0x56);
|
||||
+ grub_machine_mmaphook_int12offset = *((grub_uint16_t *) grub_absolute_pointer (0x48));
|
||||
+ grub_machine_mmaphook_int12segment = *((grub_uint16_t *) grub_absolute_pointer (0x4a));
|
||||
+ grub_machine_mmaphook_int15offset = *((grub_uint16_t *) grub_absolute_pointer (0x54));
|
||||
+ grub_machine_mmaphook_int15segment = *((grub_uint16_t *) grub_absolute_pointer (0x56));
|
||||
|
||||
grub_dprintf ("mmap", "hooktarget = %p\n", hooktarget);
|
||||
|
||||
@@ -94,11 +94,11 @@ preboot (int noreturn __attribute__ ((unused)))
|
||||
grub_memcpy (hooktarget, &grub_machine_mmaphook_start,
|
||||
&grub_machine_mmaphook_end - &grub_machine_mmaphook_start);
|
||||
|
||||
- *((grub_uint16_t *) 0x4a) = ((grub_addr_t) hooktarget) >> 4;
|
||||
- *((grub_uint16_t *) 0x56) = ((grub_addr_t) hooktarget) >> 4;
|
||||
- *((grub_uint16_t *) 0x48) = &grub_machine_mmaphook_int12
|
||||
+ *((grub_uint16_t *) grub_absolute_pointer (0x4a)) = ((grub_addr_t) hooktarget) >> 4;
|
||||
+ *((grub_uint16_t *) grub_absolute_pointer (0x56)) = ((grub_addr_t) hooktarget) >> 4;
|
||||
+ *((grub_uint16_t *) grub_absolute_pointer (0x48)) = &grub_machine_mmaphook_int12
|
||||
- &grub_machine_mmaphook_start;
|
||||
- *((grub_uint16_t *) 0x54) = &grub_machine_mmaphook_int15
|
||||
+ *((grub_uint16_t *) grub_absolute_pointer (0x54)) = &grub_machine_mmaphook_int15
|
||||
- &grub_machine_mmaphook_start;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
@@ -108,10 +108,10 @@ static grub_err_t
|
||||
preboot_rest (void)
|
||||
{
|
||||
/* Restore old interrupt handlers. */
|
||||
- *((grub_uint16_t *) 0x48) = grub_machine_mmaphook_int12offset;
|
||||
- *((grub_uint16_t *) 0x4a) = grub_machine_mmaphook_int12segment;
|
||||
- *((grub_uint16_t *) 0x54) = grub_machine_mmaphook_int15offset;
|
||||
- *((grub_uint16_t *) 0x56) = grub_machine_mmaphook_int15segment;
|
||||
+ *((grub_uint16_t *) grub_absolute_pointer (0x48)) = grub_machine_mmaphook_int12offset;
|
||||
+ *((grub_uint16_t *) grub_absolute_pointer (0x4a)) = grub_machine_mmaphook_int12segment;
|
||||
+ *((grub_uint16_t *) grub_absolute_pointer (0x54)) = grub_machine_mmaphook_int15offset;
|
||||
+ *((grub_uint16_t *) grub_absolute_pointer (0x56)) = grub_machine_mmaphook_int15segment;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
diff --git a/grub-core/net/drivers/i386/pc/pxe.c b/grub-core/net/drivers/i386/pc/pxe.c
|
||||
index 3f4152d036..313ed250e8 100644
|
||||
--- a/grub-core/net/drivers/i386/pc/pxe.c
|
||||
+++ b/grub-core/net/drivers/i386/pc/pxe.c
|
||||
@@ -174,7 +174,7 @@ grub_pxe_recv (struct grub_net_card *dev __attribute__ ((unused)))
|
||||
grub_uint8_t *ptr, *end;
|
||||
struct grub_net_buff *buf;
|
||||
|
||||
- isr = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
|
||||
+ isr = (void *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR);
|
||||
|
||||
if (!in_progress)
|
||||
{
|
||||
@@ -256,11 +256,11 @@ grub_pxe_send (struct grub_net_card *dev __attribute__ ((unused)),
|
||||
struct grub_pxe_undi_tbd *tbd;
|
||||
char *buf;
|
||||
|
||||
- trans = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
|
||||
+ trans = (void *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR);
|
||||
grub_memset (trans, 0, sizeof (*trans));
|
||||
- tbd = (void *) (GRUB_MEMORY_MACHINE_SCRATCH_ADDR + 128);
|
||||
+ tbd = (void *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR + 128);
|
||||
grub_memset (tbd, 0, sizeof (*tbd));
|
||||
- buf = (void *) (GRUB_MEMORY_MACHINE_SCRATCH_ADDR + 256);
|
||||
+ buf = (void *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR + 256);
|
||||
grub_memcpy (buf, pack->data, pack->tail - pack->data);
|
||||
|
||||
trans->tbd = SEGOFS ((grub_addr_t) tbd);
|
||||
@@ -287,7 +287,7 @@ static grub_err_t
|
||||
grub_pxe_open (struct grub_net_card *dev __attribute__ ((unused)))
|
||||
{
|
||||
struct grub_pxe_undi_open *ou;
|
||||
- ou = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
|
||||
+ ou = (void *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR);
|
||||
grub_memset (ou, 0, sizeof (*ou));
|
||||
ou->pkt_filter = 4;
|
||||
grub_pxe_call (GRUB_PXENV_UNDI_OPEN, ou, pxe_rm_entry);
|
||||
@@ -382,7 +382,7 @@ GRUB_MOD_INIT(pxe)
|
||||
if (! pxenv)
|
||||
return;
|
||||
|
||||
- ui = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
|
||||
+ ui = (void *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR);
|
||||
grub_memset (ui, 0, sizeof (*ui));
|
||||
grub_pxe_call (GRUB_PXENV_UNDI_GET_INFORMATION, ui, pxe_rm_entry);
|
||||
|
||||
diff --git a/grub-core/term/i386/pc/console.c b/grub-core/term/i386/pc/console.c
|
||||
index f6142a2dea..d70ee4af05 100644
|
||||
--- a/grub-core/term/i386/pc/console.c
|
||||
+++ b/grub-core/term/i386/pc/console.c
|
||||
@@ -238,12 +238,11 @@ grub_console_getkey (struct grub_term_input *term __attribute__ ((unused)))
|
||||
return (regs.eax & 0xff) + (('a' - 1) | GRUB_TERM_CTRL);
|
||||
}
|
||||
|
||||
-static const struct grub_machine_bios_data_area *bios_data_area =
|
||||
- (struct grub_machine_bios_data_area *) GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR;
|
||||
-
|
||||
static int
|
||||
grub_console_getkeystatus (struct grub_term_input *term __attribute__ ((unused)))
|
||||
{
|
||||
+ const struct grub_machine_bios_data_area *bios_data_area =
|
||||
+ (struct grub_machine_bios_data_area *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR);
|
||||
/* conveniently GRUB keystatus is modelled after BIOS one. */
|
||||
return bios_data_area->keyboard_flag_lower & ~0x80;
|
||||
}
|
||||
diff --git a/grub-core/term/i386/pc/vga_text.c b/grub-core/term/i386/pc/vga_text.c
|
||||
index 88fecc5ea5..669d06fad7 100644
|
||||
--- a/grub-core/term/i386/pc/vga_text.c
|
||||
+++ b/grub-core/term/i386/pc/vga_text.c
|
||||
@@ -45,15 +45,15 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||
static struct grub_term_coordinate grub_curr_pos;
|
||||
|
||||
#ifdef __mips__
|
||||
-#define VGA_TEXT_SCREEN ((grub_uint16_t *) 0xb00b8000)
|
||||
+#define VGA_TEXT_SCREEN ((grub_uint16_t *) grub_absolute_pointer (0xb00b8000))
|
||||
#define cr_read grub_vga_cr_read
|
||||
#define cr_write grub_vga_cr_write
|
||||
#elif defined (MODE_MDA)
|
||||
-#define VGA_TEXT_SCREEN ((grub_uint16_t *) 0xb0000)
|
||||
+#define VGA_TEXT_SCREEN ((grub_uint16_t *) grub_absolute_pointer (0xb0000))
|
||||
#define cr_read grub_vga_cr_bw_read
|
||||
#define cr_write grub_vga_cr_bw_write
|
||||
#else
|
||||
-#define VGA_TEXT_SCREEN ((grub_uint16_t *) 0xb8000)
|
||||
+#define VGA_TEXT_SCREEN ((grub_uint16_t *) grub_absolute_pointer (0xb8000))
|
||||
#define cr_read grub_vga_cr_read
|
||||
#define cr_write grub_vga_cr_write
|
||||
#endif
|
||||
diff --git a/grub-core/term/ns8250.c b/grub-core/term/ns8250.c
|
||||
index 39809d0423..622670d179 100644
|
||||
--- a/grub-core/term/ns8250.c
|
||||
+++ b/grub-core/term/ns8250.c
|
||||
@@ -28,7 +28,6 @@
|
||||
|
||||
#ifdef GRUB_MACHINE_PCBIOS
|
||||
#include <grub/machine/memory.h>
|
||||
-static const unsigned short *serial_hw_io_addr = (const unsigned short *) GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR;
|
||||
#define GRUB_SERIAL_PORT_NUM 4
|
||||
#else
|
||||
#include <grub/machine/serial.h>
|
||||
@@ -237,6 +236,9 @@ static struct grub_serial_port com_ports[GRUB_SERIAL_PORT_NUM];
|
||||
void
|
||||
grub_ns8250_init (void)
|
||||
{
|
||||
+#ifdef GRUB_MACHINE_PCBIOS
|
||||
+ const unsigned short *serial_hw_io_addr = (const unsigned short *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR);
|
||||
+#endif
|
||||
unsigned i;
|
||||
for (i = 0; i < GRUB_SERIAL_PORT_NUM; i++)
|
||||
if (serial_hw_io_addr[i])
|
||||
@@ -272,6 +274,9 @@ grub_ns8250_init (void)
|
||||
grub_port_t
|
||||
grub_ns8250_hw_get_port (const unsigned int unit)
|
||||
{
|
||||
+#ifdef GRUB_MACHINE_PCBIOS
|
||||
+ const unsigned short *serial_hw_io_addr = (const unsigned short *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR);
|
||||
+#endif
|
||||
if (unit < GRUB_SERIAL_PORT_NUM
|
||||
&& !(dead_ports & (1 << unit)))
|
||||
return serial_hw_io_addr[unit];
|
||||
diff --git a/grub-core/video/i386/pc/vbe.c b/grub-core/video/i386/pc/vbe.c
|
||||
index 68700ecda1..8c8cbf07eb 100644
|
||||
--- a/grub-core/video/i386/pc/vbe.c
|
||||
+++ b/grub-core/video/i386/pc/vbe.c
|
||||
@@ -514,7 +514,7 @@ grub_vbe_probe (struct grub_vbe_info_block *info_block)
|
||||
|
||||
/* Use low memory scratch area as temporary storage
|
||||
for VESA BIOS call. */
|
||||
- vbe_ib = (struct grub_vbe_info_block *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
|
||||
+ vbe_ib = (struct grub_vbe_info_block *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR);
|
||||
|
||||
/* Prepare info block. */
|
||||
grub_memset (vbe_ib, 0, sizeof (*vbe_ib));
|
||||
@@ -574,7 +574,7 @@ grub_vbe_get_preferred_mode (unsigned int *width, unsigned int *height)
|
||||
|
||||
/* Use low memory scratch area as temporary storage for VESA BIOS calls. */
|
||||
flat_panel_info = (struct grub_vbe_flat_panel_info *)
|
||||
- (GRUB_MEMORY_MACHINE_SCRATCH_ADDR + sizeof (struct grub_video_edid_info));
|
||||
+ grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR + sizeof (struct grub_video_edid_info));
|
||||
|
||||
if (controller_info.version >= 0x200
|
||||
&& (grub_vbe_bios_get_ddc_capabilities (&ddc_level) & 0xff)
|
||||
@@ -676,7 +676,7 @@ grub_vbe_set_video_mode (grub_uint32_t vbe_mode,
|
||||
== GRUB_VBE_MEMORY_MODEL_PACKED_PIXEL)
|
||||
{
|
||||
struct grub_vbe_palette_data *palette
|
||||
- = (struct grub_vbe_palette_data *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
|
||||
+ = (struct grub_vbe_palette_data *) grub_absolute_pointer (GRUB_MEMORY_MACHINE_SCRATCH_ADDR);
|
||||
unsigned i;
|
||||
|
||||
/* Make sure that the BIOS can reach the palette. */
|
||||
diff --git a/include/grub/compiler.h b/include/grub/compiler.h
|
||||
index 8f3be3ae70..e159f0e292 100644
|
||||
--- a/include/grub/compiler.h
|
||||
+++ b/include/grub/compiler.h
|
||||
@@ -56,4 +56,15 @@
|
||||
# define CLANG_PREREQ(maj,min) 0
|
||||
#endif
|
||||
|
||||
+#if defined(__GNUC__)
|
||||
+# define grub_absolute_pointer(val) \
|
||||
+({ \
|
||||
+ unsigned long __ptr; \
|
||||
+ __asm__ ("" : "=r"(__ptr) : "0"((void *)(val))); \
|
||||
+ (void *) (__ptr); \
|
||||
+})
|
||||
+#else
|
||||
+# define grub_absolute_pointer(val) ((void *)(val))
|
||||
+#endif
|
||||
+
|
||||
#endif /* ! GRUB_COMPILER_HEADER */
|
||||
--
|
||||
2.34.1
|
||||
|
@ -16,11 +16,9 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
util/grub-editenv.c | 2 +-
|
||||
3 files changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c
|
||||
index 979ba1b28..7017248d1 100644
|
||||
--- a/grub-core/fs/btrfs.c
|
||||
+++ b/grub-core/fs/btrfs.c
|
||||
@@ -2551,7 +2551,7 @@ struct embed_region {
|
||||
@@ -2637,7 +2637,7 @@
|
||||
|
||||
static const struct {
|
||||
struct embed_region available;
|
||||
@ -29,7 +27,7 @@ index 979ba1b28..7017248d1 100644
|
||||
} btrfs_head = {
|
||||
.available = {0, GRUB_DISK_KiB_TO_SECTORS (1024)}, /* The first 1 MiB. */
|
||||
.used = {
|
||||
@@ -2559,6 +2559,7 @@ static const struct {
|
||||
@@ -2645,6 +2645,7 @@
|
||||
{GRUB_DISK_KiB_TO_SECTORS (64) - 1, 1}, /* Overflow guard. */
|
||||
{GRUB_DISK_KiB_TO_SECTORS (64), GRUB_DISK_KiB_TO_SECTORS (4)}, /* 4 KiB superblock. */
|
||||
{GRUB_DISK_KiB_TO_SECTORS (68), 1}, /* Overflow guard. */
|
||||
@ -37,22 +35,18 @@ index 979ba1b28..7017248d1 100644
|
||||
{GRUB_DISK_KiB_TO_SECTORS (1024) - 1, 1}, /* Overflow guard. */
|
||||
{0, 0} /* Array terminator. */
|
||||
}
|
||||
diff --git a/include/grub/fs.h b/include/grub/fs.h
|
||||
index 026bc3bb8..4c380e334 100644
|
||||
--- a/include/grub/fs.h
|
||||
+++ b/include/grub/fs.h
|
||||
@@ -128,4 +128,6 @@ grub_fs_unregister (grub_fs_t fs)
|
||||
@@ -128,4 +128,6 @@
|
||||
|
||||
grub_fs_t EXPORT_FUNC(grub_fs_probe) (grub_device_t device);
|
||||
|
||||
+#define ENV_BTRFS_OFFSET (256)
|
||||
+
|
||||
#endif /* ! GRUB_FS_HEADER */
|
||||
diff --git a/util/grub-editenv.c b/util/grub-editenv.c
|
||||
index a02d3f2a6..af30aabe7 100644
|
||||
--- a/util/grub-editenv.c
|
||||
+++ b/util/grub-editenv.c
|
||||
@@ -128,7 +128,7 @@ struct fs_envblk_spec {
|
||||
@@ -128,7 +128,7 @@
|
||||
int offset;
|
||||
int size;
|
||||
} fs_envblk_spec[] = {
|
||||
@ -61,6 +55,3 @@ index a02d3f2a6..af30aabe7 100644
|
||||
{ NULL, 0, 0 }
|
||||
};
|
||||
|
||||
--
|
||||
2.35.3
|
||||
|
||||
|
@ -14,11 +14,9 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
grub-core/loader/linux.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/loader/linux.c b/grub-core/loader/linux.c
|
||||
index e4018e65e..fc71a78d7 100644
|
||||
--- a/grub-core/loader/linux.c
|
||||
+++ b/grub-core/loader/linux.c
|
||||
@@ -32,6 +32,7 @@ struct grub_linux_initrd_component
|
||||
@@ -32,6 +32,7 @@
|
||||
char *buf;
|
||||
char *newc_name;
|
||||
grub_off_t size;
|
||||
@ -26,7 +24,7 @@ index e4018e65e..fc71a78d7 100644
|
||||
};
|
||||
|
||||
struct dir
|
||||
@@ -202,6 +203,7 @@ grub_initrd_component (const char *buf, int bufsz, const char *newc_name,
|
||||
@@ -203,6 +204,7 @@
|
||||
grub_memcpy (comp->buf, buf, bufsz);
|
||||
initrd_ctx->nfiles++;
|
||||
comp->size = bufsz;
|
||||
@ -34,7 +32,7 @@ index e4018e65e..fc71a78d7 100644
|
||||
if (grub_add (initrd_ctx->size, comp->size,
|
||||
&initrd_ctx->size))
|
||||
goto overflow;
|
||||
@@ -271,6 +273,7 @@ grub_initrd_init (int argc, char *argv[],
|
||||
@@ -272,6 +274,7 @@
|
||||
grub_initrd_close (initrd_ctx);
|
||||
return grub_errno;
|
||||
}
|
||||
@ -42,7 +40,7 @@ index e4018e65e..fc71a78d7 100644
|
||||
name_len = grub_strlen (initrd_ctx->components[i].newc_name) + 1;
|
||||
if (grub_add (initrd_ctx->size,
|
||||
ALIGN_UP (sizeof (struct newc_head) + name_len, 4),
|
||||
@@ -372,6 +375,7 @@ grub_initrd_load (struct grub_linux_initrd_context *initrd_ctx,
|
||||
@@ -374,6 +377,7 @@
|
||||
if (initrd_ctx->components[i].newc_name)
|
||||
{
|
||||
grub_size_t dir_size;
|
||||
@ -50,7 +48,7 @@ index e4018e65e..fc71a78d7 100644
|
||||
|
||||
if (insert_dir (initrd_ctx->components[i].newc_name, &root, ptr,
|
||||
&dir_size))
|
||||
@@ -383,7 +387,7 @@ grub_initrd_load (struct grub_linux_initrd_context *initrd_ctx,
|
||||
@@ -385,7 +389,7 @@
|
||||
ptr += dir_size;
|
||||
ptr = make_header (ptr, initrd_ctx->components[i].newc_name,
|
||||
grub_strlen (initrd_ctx->components[i].newc_name) + 1,
|
||||
@ -59,6 +57,3 @@ index e4018e65e..fc71a78d7 100644
|
||||
initrd_ctx->components[i].size);
|
||||
newc = 1;
|
||||
}
|
||||
--
|
||||
2.39.2
|
||||
|
||||
|
@ -13,11 +13,9 @@ make sure they exist.
|
||||
grub-core/loader/arm64/efi/linux.c | 16 +++++++++++++++-
|
||||
1 file changed, 15 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/loader/arm64/efi/linux.c b/grub-core/loader/arm64/efi/linux.c
|
||||
index d81a6d843..98c4f038b 100644
|
||||
--- a/grub-core/loader/arm64/efi/linux.c
|
||||
+++ b/grub-core/loader/arm64/efi/linux.c
|
||||
@@ -126,7 +126,21 @@ finalize_params_linux (void)
|
||||
@@ -99,7 +99,21 @@
|
||||
|
||||
node = grub_fdt_find_subnode (fdt, 0, "chosen");
|
||||
if (node < 0)
|
||||
@ -40,6 +38,3 @@ index d81a6d843..98c4f038b 100644
|
||||
|
||||
if (node < 1)
|
||||
goto failure;
|
||||
--
|
||||
2.26.2
|
||||
|
||||
|
@ -14,29 +14,25 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
grub-core/lib/cmdline.c | 3 +++
|
||||
2 files changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
|
||||
index c413267a0..6045da47b 100644
|
||||
--- a/grub-core/Makefile.core.def
|
||||
+++ b/grub-core/Makefile.core.def
|
||||
@@ -1790,7 +1790,6 @@ module = {
|
||||
riscv64 = loader/riscv/linux.c;
|
||||
@@ -1860,7 +1860,6 @@
|
||||
x86_64_efi = loader/efi/linux.c;
|
||||
emu = loader/emu/linux.c;
|
||||
common = loader/linux.c;
|
||||
- common = lib/cmdline.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -2518,3 +2517,8 @@ module = {
|
||||
common = commands/i386/wrmsr.c;
|
||||
enable = x86;
|
||||
@@ -2611,3 +2610,8 @@
|
||||
efi = commands/bli.c;
|
||||
enable = efi;
|
||||
};
|
||||
+
|
||||
+module = {
|
||||
+ name = cmdline;
|
||||
+ common = lib/cmdline.c;
|
||||
+};
|
||||
diff --git a/grub-core/lib/cmdline.c b/grub-core/lib/cmdline.c
|
||||
index ed0b149dc..bd392e30f 100644
|
||||
--- a/grub-core/lib/cmdline.c
|
||||
+++ b/grub-core/lib/cmdline.c
|
||||
@@ -19,6 +19,9 @@
|
||||
@ -49,6 +45,3 @@ index ed0b149dc..bd392e30f 100644
|
||||
|
||||
static unsigned int check_arg (char *c, int *has_space)
|
||||
{
|
||||
--
|
||||
2.26.2
|
||||
|
||||
|
@ -1,40 +0,0 @@
|
||||
From 1f41f020f73131574cd7aee4e0e09d4c56277d1e Mon Sep 17 00:00:00 2001
|
||||
From: Lu Ken <ken.lu@intel.com>
|
||||
Date: Wed, 13 Jul 2022 10:06:11 +0800
|
||||
Subject: [PATCH 2/3] commands/efi/tpm: Use grub_strcpy() instead of
|
||||
grub_memcpy()
|
||||
|
||||
The event description is a string, so using grub_strcpy() is cleaner than
|
||||
using grub_memcpy().
|
||||
|
||||
Signed-off-by: Lu Ken <ken.lu@intel.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/commands/efi/tpm.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/grub-core/commands/efi/tpm.c b/grub-core/commands/efi/tpm.c
|
||||
index 19737b462..e032617d8 100644
|
||||
--- a/grub-core/commands/efi/tpm.c
|
||||
+++ b/grub-core/commands/efi/tpm.c
|
||||
@@ -177,7 +177,7 @@ grub_tpm1_log_event (grub_efi_handle_t tpm_handle, unsigned char *buf,
|
||||
event->PCRIndex = pcr;
|
||||
event->EventType = EV_IPL;
|
||||
event->EventSize = grub_strlen (description) + 1;
|
||||
- grub_memcpy (event->Event, description, event->EventSize);
|
||||
+ grub_strcpy ((char *) event->Event, description);
|
||||
|
||||
algorithm = TCG_ALG_SHA;
|
||||
status = efi_call_7 (tpm->log_extend_event, tpm, (grub_addr_t) buf, (grub_uint64_t) size,
|
||||
@@ -299,7 +299,7 @@ grub_tpm2_log_event (grub_efi_handle_t tpm_handle, unsigned char *buf,
|
||||
event->Header.EventType = EV_IPL;
|
||||
event->Size =
|
||||
sizeof (*event) - sizeof (event->Event) + grub_strlen (description) + 1;
|
||||
- grub_memcpy (event->Event, description, grub_strlen (description) + 1);
|
||||
+ grub_strcpy ((char *) event->Event, description);
|
||||
|
||||
status = efi_call_5 (tpm->hash_log_extend_event, tpm, 0, (grub_addr_t) buf,
|
||||
(grub_uint64_t) size, event);
|
||||
--
|
||||
2.35.3
|
||||
|
41
0002-cryptodisk-Fallback-to-passphrase.patch
Normal file
41
0002-cryptodisk-Fallback-to-passphrase.patch
Normal file
@ -0,0 +1,41 @@
|
||||
From 7cc578baf26986c2badce998125b429a2aeb4d33 Mon Sep 17 00:00:00 2001
|
||||
From: Patrick Colp <patrick.colp@oracle.com>
|
||||
Date: Sun, 30 Jul 2023 12:58:18 -0700
|
||||
Subject: [PATCH 2/4] cryptodisk: Fallback to passphrase
|
||||
|
||||
If a protector is specified, but it fails to unlock the disk, fall back
|
||||
to asking for the passphrase. However, an error was set indicating that
|
||||
the protector(s) failed. Later code (e.g., LUKS code) fails as
|
||||
`grub_errno` is now set. Print the existing errors out first, before
|
||||
proceeding with the passphrase.
|
||||
|
||||
Signed-off-by: Patrick Colp <patrick.colp@oracle.com>
|
||||
---
|
||||
grub-core/disk/cryptodisk.c | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c
|
||||
index 6620fca00..cf37a0934 100644
|
||||
--- a/grub-core/disk/cryptodisk.c
|
||||
+++ b/grub-core/disk/cryptodisk.c
|
||||
@@ -1191,11 +1191,16 @@ grub_cryptodisk_scan_device_real (const char *name,
|
||||
source->name, source->partition != NULL ? "," : "",
|
||||
part != NULL ? part : N_("UNKNOWN"), dev->uuid);
|
||||
grub_free (part);
|
||||
- goto error;
|
||||
}
|
||||
|
||||
if (!cargs->key_len)
|
||||
{
|
||||
+ if (grub_errno)
|
||||
+ {
|
||||
+ grub_print_error ();
|
||||
+ grub_errno = GRUB_ERR_NONE;
|
||||
+ }
|
||||
+
|
||||
/* Get the passphrase from the user, if no key data. */
|
||||
askpass = 1;
|
||||
part = grub_partition_get_name (source->partition);
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,187 +0,0 @@
|
||||
From 4ace73cc192bc63a00f4208b34981a6d91947811 Mon Sep 17 00:00:00 2001
|
||||
From: Glenn Washburn <development@efficientek.com>
|
||||
Date: Thu, 9 Dec 2021 11:14:51 -0600
|
||||
Subject: [PATCH 02/14] cryptodisk: Refactor to discard have_it global
|
||||
|
||||
The global "have_it" was never used by the crypto-backends, but was used to
|
||||
determine if a crypto-backend successfully mounted a cryptodisk with a given
|
||||
UUID. This is not needed however, because grub_device_iterate() will return
|
||||
1 if and only if grub_cryptodisk_scan_device() returns 1. And
|
||||
grub_cryptodisk_scan_device() will now only return 1 if a search_uuid has
|
||||
been specified and a cryptodisk was successfully setup by a crypto-backend or
|
||||
a cryptodisk of the requested UUID is already open.
|
||||
|
||||
To implement this grub_cryptodisk_scan_device_real() is modified to return
|
||||
a cryptodisk or NULL on failure and having the appropriate grub_errno set to
|
||||
indicated failure. Note that grub_cryptodisk_scan_device_real() will fail now
|
||||
with a new errno GRUB_ERR_BAD_MODULE when none of the cryptodisk backend
|
||||
modules succeed in identifying the source disk.
|
||||
|
||||
With this change grub_device_iterate() will return 1 when a crypto device is
|
||||
successfully decrypted or when the source device has already been successfully
|
||||
opened. Prior to this change, trying to mount an already successfully opened
|
||||
device would trigger an error with the message "no such cryptodisk found",
|
||||
which is at best misleading. The mount should silently succeed in this case,
|
||||
which is what happens with this patch.
|
||||
|
||||
Signed-off-by: Glenn Washburn <development@efficientek.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/disk/cryptodisk.c | 56 +++++++++++++++++++++++--------------
|
||||
1 file changed, 35 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c
|
||||
index 90f82b2d39..9df3d310fe 100644
|
||||
--- a/grub-core/disk/cryptodisk.c
|
||||
+++ b/grub-core/disk/cryptodisk.c
|
||||
@@ -983,7 +983,7 @@ grub_util_cryptodisk_get_uuid (grub_disk_t disk)
|
||||
|
||||
#endif
|
||||
|
||||
-static int check_boot, have_it;
|
||||
+static int check_boot;
|
||||
static char *search_uuid;
|
||||
|
||||
static void
|
||||
@@ -995,7 +995,7 @@ cryptodisk_close (grub_cryptodisk_t dev)
|
||||
grub_free (dev);
|
||||
}
|
||||
|
||||
-static grub_err_t
|
||||
+static grub_cryptodisk_t
|
||||
grub_cryptodisk_scan_device_real (const char *name, grub_disk_t source)
|
||||
{
|
||||
grub_err_t err;
|
||||
@@ -1005,13 +1005,13 @@ grub_cryptodisk_scan_device_real (const char *name, grub_disk_t source)
|
||||
dev = grub_cryptodisk_get_by_source_disk (source);
|
||||
|
||||
if (dev)
|
||||
- return GRUB_ERR_NONE;
|
||||
+ return dev;
|
||||
|
||||
FOR_CRYPTODISK_DEVS (cr)
|
||||
{
|
||||
dev = cr->scan (source, search_uuid, check_boot);
|
||||
if (grub_errno)
|
||||
- return grub_errno;
|
||||
+ return NULL;
|
||||
if (!dev)
|
||||
continue;
|
||||
|
||||
@@ -1019,16 +1019,16 @@ grub_cryptodisk_scan_device_real (const char *name, grub_disk_t source)
|
||||
if (err)
|
||||
{
|
||||
cryptodisk_close (dev);
|
||||
- return err;
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
grub_cryptodisk_insert (dev, name, source);
|
||||
|
||||
- have_it = 1;
|
||||
-
|
||||
- return GRUB_ERR_NONE;
|
||||
+ return dev;
|
||||
}
|
||||
- return GRUB_ERR_NONE;
|
||||
+
|
||||
+ grub_error (GRUB_ERR_BAD_MODULE, "no cryptodisk module can handle this device");
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
#ifdef GRUB_UTIL
|
||||
@@ -1082,8 +1082,10 @@ static int
|
||||
grub_cryptodisk_scan_device (const char *name,
|
||||
void *data __attribute__ ((unused)))
|
||||
{
|
||||
- grub_err_t err;
|
||||
+ int ret = 0;
|
||||
grub_disk_t source;
|
||||
+ grub_cryptodisk_t dev;
|
||||
+ grub_errno = GRUB_ERR_NONE;
|
||||
|
||||
/* Try to open disk. */
|
||||
source = grub_disk_open (name);
|
||||
@@ -1093,13 +1095,26 @@ grub_cryptodisk_scan_device (const char *name,
|
||||
return 0;
|
||||
}
|
||||
|
||||
- err = grub_cryptodisk_scan_device_real (name, source);
|
||||
+ dev = grub_cryptodisk_scan_device_real (name, source);
|
||||
+ if (dev)
|
||||
+ {
|
||||
+ ret = (search_uuid != NULL && grub_strcasecmp (search_uuid, dev->uuid) == 0);
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
|
||||
- grub_disk_close (source);
|
||||
-
|
||||
- if (err)
|
||||
+ /*
|
||||
+ * Do not print error when err is GRUB_ERR_BAD_MODULE to avoid many unhelpful
|
||||
+ * error messages.
|
||||
+ */
|
||||
+ if (grub_errno == GRUB_ERR_BAD_MODULE)
|
||||
+ grub_error_pop ();
|
||||
+
|
||||
+ if (grub_errno != GRUB_ERR_NONE)
|
||||
grub_print_error ();
|
||||
- return have_it && search_uuid ? 1 : 0;
|
||||
+
|
||||
+ cleanup:
|
||||
+ grub_disk_close (source);
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
@@ -1110,9 +1125,9 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
if (argc < 1 && !state[1].set && !state[2].set)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "device name required");
|
||||
|
||||
- have_it = 0;
|
||||
if (state[0].set)
|
||||
{
|
||||
+ int found_uuid;
|
||||
grub_cryptodisk_t dev;
|
||||
|
||||
dev = grub_cryptodisk_get_by_uuid (args[0]);
|
||||
@@ -1125,10 +1140,10 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
|
||||
check_boot = state[2].set;
|
||||
search_uuid = args[0];
|
||||
- grub_device_iterate (&grub_cryptodisk_scan_device, NULL);
|
||||
+ found_uuid = grub_device_iterate (&grub_cryptodisk_scan_device, NULL);
|
||||
search_uuid = NULL;
|
||||
|
||||
- if (!have_it)
|
||||
+ if (!found_uuid)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such cryptodisk found");
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
@@ -1142,7 +1157,6 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
}
|
||||
else
|
||||
{
|
||||
- grub_err_t err;
|
||||
grub_disk_t disk;
|
||||
grub_cryptodisk_t dev;
|
||||
char *diskname;
|
||||
@@ -1178,13 +1192,13 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
- err = grub_cryptodisk_scan_device_real (diskname, disk);
|
||||
+ dev = grub_cryptodisk_scan_device_real (diskname, disk);
|
||||
|
||||
grub_disk_close (disk);
|
||||
if (disklast)
|
||||
*disklast = ')';
|
||||
|
||||
- return err;
|
||||
+ return (dev == NULL) ? grub_errno : GRUB_ERR_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
@ -1,127 +0,0 @@
|
||||
From a25627c13b7e1e6998a14b5dd23b04b28465d737 Mon Sep 17 00:00:00 2001
|
||||
From: Josselin Poiret via Grub-devel <grub-devel@gnu.org>
|
||||
Date: Tue, 14 Jun 2022 15:47:30 +0200
|
||||
Subject: [PATCH 02/10] devmapper/getroot: Set up cheated LUKS2 cryptodisk
|
||||
mount from DM parameters
|
||||
|
||||
This lets a LUKS2 cryptodisk have its cipher and hash filled out,
|
||||
otherwise they wouldn't be initialized if cheat mounted.
|
||||
---
|
||||
grub-core/osdep/devmapper/getroot.c | 91 +++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 90 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/grub-core/osdep/devmapper/getroot.c
|
||||
+++ b/grub-core/osdep/devmapper/getroot.c
|
||||
@@ -51,6 +51,8 @@
|
||||
#include <grub/emu/misc.h>
|
||||
#include <grub/emu/hostdisk.h>
|
||||
|
||||
+#include <grub/cryptodisk.h>
|
||||
+
|
||||
static int
|
||||
grub_util_open_dm (const char *os_dev, struct dm_tree **tree,
|
||||
struct dm_tree_node **node)
|
||||
@@ -186,7 +188,6 @@
|
||||
&& lastsubdev)
|
||||
{
|
||||
char *grdev = grub_util_get_grub_dev (lastsubdev);
|
||||
- dm_tree_free (tree);
|
||||
if (grdev)
|
||||
{
|
||||
grub_err_t err;
|
||||
@@ -194,7 +195,95 @@
|
||||
if (err)
|
||||
grub_util_error (_("can't mount encrypted volume `%s': %s"),
|
||||
lastsubdev, grub_errmsg);
|
||||
+ if (strncmp (uuid, "CRYPT-LUKS2-", sizeof ("CRYPT-LUKS2-") - 1) == 0)
|
||||
+ {
|
||||
+ /* set LUKS2 cipher from dm parameters, since it is not
|
||||
+ * possible to determine the correct one without
|
||||
+ * unlocking, as there might be multiple segments.
|
||||
+ */
|
||||
+ grub_disk_t source;
|
||||
+ grub_cryptodisk_t cryptodisk;
|
||||
+ grub_uint64_t start, length;
|
||||
+ char *target_type;
|
||||
+ char *params;
|
||||
+ const char *name;
|
||||
+ char *cipher, *cipher_mode;
|
||||
+ struct dm_task *dmt;
|
||||
+ char *seek_head, *c;
|
||||
+ unsigned int remaining;
|
||||
+
|
||||
+ source = grub_disk_open (grdev);
|
||||
+ cryptodisk = grub_cryptodisk_get_by_source_disk (source);
|
||||
+ grub_disk_close (source);
|
||||
+
|
||||
+ name = dm_tree_node_get_name (node);
|
||||
+
|
||||
+ grub_util_info ("populating parameters of cryptomount `%s' from DM device `%s'",
|
||||
+ uuid, name);
|
||||
+
|
||||
+ dmt = dm_task_create (DM_DEVICE_TABLE);
|
||||
+ if (dmt == 0)
|
||||
+ grub_util_error (_("can't create dm task DM_DEVICE_TABLE"));
|
||||
+ if (dm_task_set_name (dmt, name) == 0)
|
||||
+ grub_util_error (_("can't set dm task name to `%s'"), name);
|
||||
+ if (dm_task_run (dmt) == 0)
|
||||
+ grub_util_error (_("can't run dm task for `%s'"), name);
|
||||
+ /* dm_get_next_target doesn't have any error modes, everything has
|
||||
+ * been handled by dm_task_run.
|
||||
+ */
|
||||
+ dm_get_next_target (dmt, NULL, &start, &length,
|
||||
+ &target_type, ¶ms);
|
||||
+ if (strncmp (target_type, "crypt", sizeof ("crypt")) != 0)
|
||||
+ grub_util_error (_("dm target of type `%s' is not `crypt'"),
|
||||
+ target_type);
|
||||
+
|
||||
+ /* dm target parameters for dm-crypt is
|
||||
+ * <cipher> <key> <iv_offset> <device path> <offset> [<#opt_params> <opt_param1> ...]
|
||||
+ */
|
||||
+ c = params;
|
||||
+ remaining = grub_strlen (c);
|
||||
+
|
||||
+ /* first, get the cipher name from the cipher */
|
||||
+ if (!(seek_head = grub_memchr (c, '-', remaining)))
|
||||
+ grub_util_error (_("can't get cipher from dm-crypt parameters `%s'"),
|
||||
+ params);
|
||||
+ cipher = grub_strndup (c, seek_head - c);
|
||||
+ remaining -= seek_head - c + 1;
|
||||
+ c = seek_head + 1;
|
||||
+
|
||||
+ /* now, the cipher mode */
|
||||
+ if (!(seek_head = grub_memchr (c, ' ', remaining)))
|
||||
+ grub_util_error (_("can't get cipher mode from dm-crypt parameters `%s'"),
|
||||
+ params);
|
||||
+ cipher_mode = grub_strndup (c, seek_head - c);
|
||||
+ remaining -= seek_head - c + 1;
|
||||
+ c = seek_head + 1;
|
||||
+
|
||||
+ err = grub_cryptodisk_setcipher (cryptodisk, cipher, cipher_mode);
|
||||
+ if (err)
|
||||
+ {
|
||||
+ grub_util_error (_("can't set cipher of cryptodisk `%s' to `%s' with mode `%s'"),
|
||||
+ uuid, cipher, cipher_mode);
|
||||
+ }
|
||||
+
|
||||
+ grub_free (cipher);
|
||||
+ grub_free (cipher_mode);
|
||||
+
|
||||
+ /* This is the only hash usable by PBKDF2, and we don't
|
||||
+ * have Argon2 support yet, so set it by default,
|
||||
+ * otherwise grub-probe would miss the required
|
||||
+ * abstraction
|
||||
+ */
|
||||
+ cryptodisk->hash = grub_crypto_lookup_md_by_name ("sha256");
|
||||
+ if (cryptodisk->hash == 0)
|
||||
+ {
|
||||
+ grub_util_error (_("can't lookup hash sha256 by name"));
|
||||
+ }
|
||||
+
|
||||
+ dm_task_destroy (dmt);
|
||||
+ }
|
||||
}
|
||||
+ dm_tree_free (tree);
|
||||
grub_free (grdev);
|
||||
}
|
||||
else
|
@ -17,7 +17,7 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
|
||||
--- a/grub-core/commands/crypttab.c
|
||||
+++ b/grub-core/commands/crypttab.c
|
||||
@@ -49,6 +49,22 @@
|
||||
@@ -53,6 +53,22 @@
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
@ -50,7 +50,7 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
@@ -477,6 +478,7 @@
|
||||
@@ -478,6 +479,7 @@
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1,113 +0,0 @@
|
||||
From 84c4323c004b495993a3d0dbfa94d8675ae06f03 Mon Sep 17 00:00:00 2001
|
||||
From: Zhang Boyang <zhangboyang.id@gmail.com>
|
||||
Date: Fri, 5 Aug 2022 00:51:20 +0800
|
||||
Subject: [PATCH 02/12] font: Fix size overflow in
|
||||
grub_font_get_glyph_internal()
|
||||
|
||||
The length of memory allocation and file read may overflow. This patch
|
||||
fixes the problem by using safemath macros.
|
||||
|
||||
There is a lot of code repetition like "(x * y + 7) / 8". It is unsafe
|
||||
if overflow happens. This patch introduces grub_video_bitmap_calc_1bpp_bufsz().
|
||||
It is safe replacement for such code. It has safemath-like prototype.
|
||||
|
||||
This patch also introduces grub_cast(value, pointer), it casts value to
|
||||
typeof(*pointer) then store the value to *pointer. It returns true when
|
||||
overflow occurs or false if there is no overflow. The semantics of arguments
|
||||
and return value are designed to be consistent with other safemath macros.
|
||||
|
||||
Signed-off-by: Zhang Boyang <zhangboyang.id@gmail.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/font/font.c | 17 +++++++++++++----
|
||||
include/grub/bitmap.h | 18 ++++++++++++++++++
|
||||
include/grub/safemath.h | 2 ++
|
||||
3 files changed, 33 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/grub-core/font/font.c b/grub-core/font/font.c
|
||||
index 2f09a4a55..6a3fbebbd 100644
|
||||
--- a/grub-core/font/font.c
|
||||
+++ b/grub-core/font/font.c
|
||||
@@ -739,7 +739,8 @@ grub_font_get_glyph_internal (grub_font_t font, grub_uint32_t code)
|
||||
grub_int16_t xoff;
|
||||
grub_int16_t yoff;
|
||||
grub_int16_t dwidth;
|
||||
- int len;
|
||||
+ grub_ssize_t len;
|
||||
+ grub_size_t sz;
|
||||
|
||||
if (index_entry->glyph)
|
||||
/* Return cached glyph. */
|
||||
@@ -768,9 +769,17 @@ grub_font_get_glyph_internal (grub_font_t font, grub_uint32_t code)
|
||||
return 0;
|
||||
}
|
||||
|
||||
- len = (width * height + 7) / 8;
|
||||
- glyph = grub_malloc (sizeof (struct grub_font_glyph) + len);
|
||||
- if (!glyph)
|
||||
+ /* Calculate real struct size of current glyph. */
|
||||
+ if (grub_video_bitmap_calc_1bpp_bufsz (width, height, &len) ||
|
||||
+ grub_add (sizeof (struct grub_font_glyph), len, &sz))
|
||||
+ {
|
||||
+ remove_font (font);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ /* Allocate and initialize the glyph struct. */
|
||||
+ glyph = grub_malloc (sz);
|
||||
+ if (glyph == NULL)
|
||||
{
|
||||
remove_font (font);
|
||||
return 0;
|
||||
diff --git a/include/grub/bitmap.h b/include/grub/bitmap.h
|
||||
index 5728f8ca3..0d9603f61 100644
|
||||
--- a/include/grub/bitmap.h
|
||||
+++ b/include/grub/bitmap.h
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <grub/symbol.h>
|
||||
#include <grub/types.h>
|
||||
#include <grub/video.h>
|
||||
+#include <grub/safemath.h>
|
||||
|
||||
struct grub_video_bitmap
|
||||
{
|
||||
@@ -79,6 +80,23 @@ grub_video_bitmap_get_height (struct grub_video_bitmap *bitmap)
|
||||
return bitmap->mode_info.height;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Calculate and store the size of data buffer of 1bit bitmap in result.
|
||||
+ * Equivalent to "*result = (width * height + 7) / 8" if no overflow occurs.
|
||||
+ * Return true when overflow occurs or false if there is no overflow.
|
||||
+ * This function is intentionally implemented as a macro instead of
|
||||
+ * an inline function. Although a bit awkward, it preserves data types for
|
||||
+ * safemath macros and reduces macro side effects as much as possible.
|
||||
+ *
|
||||
+ * XXX: Will report false overflow if width * height > UINT64_MAX.
|
||||
+ */
|
||||
+#define grub_video_bitmap_calc_1bpp_bufsz(width, height, result) \
|
||||
+({ \
|
||||
+ grub_uint64_t _bitmap_pixels; \
|
||||
+ grub_mul ((width), (height), &_bitmap_pixels) ? 1 : \
|
||||
+ grub_cast (_bitmap_pixels / GRUB_CHAR_BIT + !!(_bitmap_pixels % GRUB_CHAR_BIT), (result)); \
|
||||
+})
|
||||
+
|
||||
void EXPORT_FUNC (grub_video_bitmap_get_mode_info) (struct grub_video_bitmap *bitmap,
|
||||
struct grub_video_mode_info *mode_info);
|
||||
|
||||
diff --git a/include/grub/safemath.h b/include/grub/safemath.h
|
||||
index c17b89bba..bb0f826de 100644
|
||||
--- a/include/grub/safemath.h
|
||||
+++ b/include/grub/safemath.h
|
||||
@@ -30,6 +30,8 @@
|
||||
#define grub_sub(a, b, res) __builtin_sub_overflow(a, b, res)
|
||||
#define grub_mul(a, b, res) __builtin_mul_overflow(a, b, res)
|
||||
|
||||
+#define grub_cast(a, res) grub_add ((a), 0, (res))
|
||||
+
|
||||
#else
|
||||
#error gcc 5.1 or newer or clang 3.8 or newer is required
|
||||
#endif
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,242 +0,0 @@
|
||||
From 7f2590e8715b634ffea9cb7b538ac076d86fab40 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Axtens <dja@axtens.net>
|
||||
Date: Wed, 15 Apr 2020 23:28:29 +1000
|
||||
Subject: [PATCH 02/23] ieee1275: claim more memory
|
||||
|
||||
On powerpc-ieee1275, we are running out of memory trying to verify
|
||||
anything. This is because:
|
||||
|
||||
- we have to load an entire file into memory to verify it. This is
|
||||
extremely difficult to change with appended signatures.
|
||||
- We only have 32MB of heap.
|
||||
- Distro kernels are now often around 30MB.
|
||||
|
||||
So we want to claim more memory from OpenFirmware for our heap.
|
||||
|
||||
There are some complications:
|
||||
|
||||
- The grub mm code isn't the only thing that will make claims on
|
||||
memory from OpenFirmware:
|
||||
|
||||
* PFW/SLOF will have claimed some for their own use.
|
||||
|
||||
* The ieee1275 loader will try to find other bits of memory that we
|
||||
haven't claimed to place the kernel and initrd when we go to boot.
|
||||
|
||||
* Once we load Linux, it will also try to claim memory. It claims
|
||||
memory without any reference to /memory/available, it just starts
|
||||
at min(top of RMO, 768MB) and works down. So we need to avoid this
|
||||
area. See arch/powerpc/kernel/prom_init.c as of v5.11.
|
||||
|
||||
- The smallest amount of memory a ppc64 KVM guest can have is 256MB.
|
||||
It doesn't work with distro kernels but can work with custom kernels.
|
||||
We should maintain support for that. (ppc32 can boot with even less,
|
||||
and we shouldn't break that either.)
|
||||
|
||||
- Even if a VM has more memory, the memory OpenFirmware makes available
|
||||
as Real Memory Area can be restricted. A freshly created LPAR on a
|
||||
PowerVM machine is likely to have only 256MB available to OpenFirmware
|
||||
even if it has many gigabytes of memory allocated.
|
||||
|
||||
EFI systems will attempt to allocate 1/4th of the available memory,
|
||||
clamped to between 1M and 1600M. That seems like a good sort of
|
||||
approach, we just need to figure out if 1/4 is the right fraction
|
||||
for us.
|
||||
|
||||
We don't know in advance how big the kernel and initrd are going to be,
|
||||
which makes figuring out how much memory we can take a bit tricky.
|
||||
|
||||
To figure out how much memory we should leave unused, I looked at:
|
||||
|
||||
- an Ubuntu 20.04.1 ppc64le pseries KVM guest:
|
||||
vmlinux: ~30MB
|
||||
initrd: ~50MB
|
||||
|
||||
- a RHEL8.2 ppc64le pseries KVM guest:
|
||||
vmlinux: ~30MB
|
||||
initrd: ~30MB
|
||||
|
||||
Ubuntu VMs struggle to boot with just 256MB under SLOF.
|
||||
RHEL likewise has a higher minimum supported memory figure.
|
||||
So lets first consider a distro kernel and 512MB of addressible memory.
|
||||
(This is the default case for anything booting under PFW.) Say we lose
|
||||
131MB to PFW (based on some tests). This leaves us 381MB. 1/4 of 381MB
|
||||
is ~95MB. That should be enough to verify a 30MB vmlinux and should
|
||||
leave plenty of space to load Linux and the initrd.
|
||||
|
||||
If we consider 256MB of RMA under PFW, we have just 125MB remaining. 1/4
|
||||
of that is a smidge under 32MB, which gives us very poor odds of verifying
|
||||
a distro-sized kernel. However, if we need 80MB just to put the kernel
|
||||
and initrd in memory, we can't claim any more than 45MB anyway. So 1/4
|
||||
will do. We'll come back to this later.
|
||||
|
||||
grub is always built as a 32-bit binary, even if it's loading a ppc64
|
||||
kernel. So we can't address memory beyond 4GB. This gives a natural cap
|
||||
of 1GB for powerpc-ieee1275.
|
||||
|
||||
Also apply this 1/4 approach to i386-ieee1275, but keep the 32MB cap.
|
||||
|
||||
make check still works for both i386 and powerpc and I've booted
|
||||
powerpc grub with this change under SLOF and PFW.
|
||||
|
||||
Signed-off-by: Daniel Axtens <dja@axtens.net>
|
||||
---
|
||||
docs/grub-dev.texi | 6 ++-
|
||||
grub-core/kern/ieee1275/init.c | 70 ++++++++++++++++++++++++++++------
|
||||
2 files changed, 62 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/docs/grub-dev.texi b/docs/grub-dev.texi
|
||||
index 6c629a23e..c11f1ac46 100644
|
||||
--- a/docs/grub-dev.texi
|
||||
+++ b/docs/grub-dev.texi
|
||||
@@ -1047,7 +1047,9 @@ space is limited to 4GiB. GRUB allocates pages from EFI for its heap, at most
|
||||
1.6 GiB.
|
||||
|
||||
On i386-ieee1275 and powerpc-ieee1275 GRUB uses same stack as IEEE1275.
|
||||
-It allocates at most 32MiB for its heap.
|
||||
+
|
||||
+On i386-ieee1275, GRUB allocates at most 32MiB for its heap. On
|
||||
+powerpc-ieee1275, GRUB allocates up to 1GiB.
|
||||
|
||||
On sparc64-ieee1275 stack is 256KiB and heap is 2MiB.
|
||||
|
||||
@@ -1075,7 +1077,7 @@ In short:
|
||||
@item i386-qemu @tab 60 KiB @tab < 4 GiB
|
||||
@item *-efi @tab ? @tab < 1.6 GiB
|
||||
@item i386-ieee1275 @tab ? @tab < 32 MiB
|
||||
-@item powerpc-ieee1275 @tab ? @tab < 32 MiB
|
||||
+@item powerpc-ieee1275 @tab ? @tab < 1 GiB
|
||||
@item sparc64-ieee1275 @tab 256KiB @tab 2 MiB
|
||||
@item arm-uboot @tab 256KiB @tab 2 MiB
|
||||
@item mips(el)-qemu_mips @tab 2MiB @tab 253 MiB
|
||||
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
|
||||
index c15d40e55..d661a8da5 100644
|
||||
--- a/grub-core/kern/ieee1275/init.c
|
||||
+++ b/grub-core/kern/ieee1275/init.c
|
||||
@@ -45,11 +45,12 @@
|
||||
#include <grub/machine/kernel.h>
|
||||
#endif
|
||||
|
||||
-/* The maximum heap size we're going to claim */
|
||||
+/* The maximum heap size we're going to claim. Not used by sparc.
|
||||
+ We allocate 1/4 of the available memory under 4G, up to this limit. */
|
||||
#ifdef __i386__
|
||||
#define HEAP_MAX_SIZE (unsigned long) (64 * 1024 * 1024)
|
||||
-#else
|
||||
-#define HEAP_MAX_SIZE (unsigned long) (32 * 1024 * 1024)
|
||||
+#else // __powerpc__
|
||||
+#define HEAP_MAX_SIZE (unsigned long) (1 * 1024 * 1024 * 1024)
|
||||
#endif
|
||||
|
||||
extern char _start[];
|
||||
@@ -146,16 +147,45 @@ grub_claim_heap (void)
|
||||
+ GRUB_KERNEL_MACHINE_STACK_SIZE), 0x200000);
|
||||
}
|
||||
#else
|
||||
-/* Helper for grub_claim_heap. */
|
||||
+/* Helper for grub_claim_heap on powerpc. */
|
||||
+static int
|
||||
+heap_size (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
|
||||
+ void *data)
|
||||
+{
|
||||
+ grub_uint32_t total = *(grub_uint32_t *)data;
|
||||
+
|
||||
+ if (type != GRUB_MEMORY_AVAILABLE)
|
||||
+ return 0;
|
||||
+
|
||||
+ /* Do not consider memory beyond 4GB */
|
||||
+ if (addr > 0xffffffffUL)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (addr + len > 0xffffffffUL)
|
||||
+ len = 0xffffffffUL - addr;
|
||||
+
|
||||
+ total += len;
|
||||
+ *(grub_uint32_t *)data = total;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int
|
||||
heap_init (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
|
||||
void *data)
|
||||
{
|
||||
- unsigned long *total = data;
|
||||
+ grub_uint32_t total = *(grub_uint32_t *)data;
|
||||
|
||||
if (type != GRUB_MEMORY_AVAILABLE)
|
||||
return 0;
|
||||
|
||||
+ /* Do not consider memory beyond 4GB */
|
||||
+ if (addr > 0xffffffffUL)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (addr + len > 0xffffffffUL)
|
||||
+ len = 0xffffffffUL - addr;
|
||||
+
|
||||
if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_PRE1_5M_CLAIM))
|
||||
{
|
||||
if (addr + len <= 0x180000)
|
||||
@@ -169,10 +199,6 @@ heap_init (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
|
||||
}
|
||||
len -= 1; /* Required for some firmware. */
|
||||
|
||||
- /* Never exceed HEAP_MAX_SIZE */
|
||||
- if (*total + len > HEAP_MAX_SIZE)
|
||||
- len = HEAP_MAX_SIZE - *total;
|
||||
-
|
||||
/* In theory, firmware should already prevent this from happening by not
|
||||
listing our own image in /memory/available. The check below is intended
|
||||
as a safeguard in case that doesn't happen. However, it doesn't protect
|
||||
@@ -184,6 +210,18 @@ heap_init (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
|
||||
len = 0;
|
||||
}
|
||||
|
||||
+ /* If this block contains 0x30000000 (768MB), do not claim below that.
|
||||
+ Linux likes to claim memory at min(RMO top, 768MB) and works down
|
||||
+ without reference to /memory/available. */
|
||||
+ if ((addr < 0x30000000) && ((addr + len) > 0x30000000))
|
||||
+ {
|
||||
+ len = len - (0x30000000 - addr);
|
||||
+ addr = 0x30000000;
|
||||
+ }
|
||||
+
|
||||
+ if (len > total)
|
||||
+ len = total;
|
||||
+
|
||||
if (len)
|
||||
{
|
||||
grub_err_t err;
|
||||
@@ -192,10 +230,12 @@ heap_init (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
|
||||
if (err)
|
||||
return err;
|
||||
grub_mm_init_region ((void *) (grub_addr_t) addr, len);
|
||||
+ total -= len;
|
||||
}
|
||||
|
||||
- *total += len;
|
||||
- if (*total >= HEAP_MAX_SIZE)
|
||||
+ *(grub_uint32_t *)data = total;
|
||||
+
|
||||
+ if (total == 0)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
@@ -204,7 +244,13 @@ heap_init (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
|
||||
static void
|
||||
grub_claim_heap (void)
|
||||
{
|
||||
- unsigned long total = 0;
|
||||
+ grub_uint32_t total = 0;
|
||||
+
|
||||
+ grub_machine_mmap_iterate (heap_size, &total);
|
||||
+
|
||||
+ total = total / 4;
|
||||
+ if (total > HEAP_MAX_SIZE)
|
||||
+ total = HEAP_MAX_SIZE;
|
||||
|
||||
if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_FORCE_CLAIM))
|
||||
heap_init (GRUB_IEEE1275_STATIC_HEAP_START, GRUB_IEEE1275_STATIC_HEAP_LEN,
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,83 +0,0 @@
|
||||
From 03056f35a73258fa68a809fba4aeab654ff35734 Mon Sep 17 00:00:00 2001
|
||||
From: Diego Domingos <diegodo@linux.vnet.ibm.com>
|
||||
Date: Thu, 25 Aug 2022 11:37:56 -0400
|
||||
Subject: [PATCH] ieee1275: implement vec5 for cas negotiation
|
||||
|
||||
As a legacy support, if the vector 5 is not implemented, Power Hypervisor will
|
||||
consider the max CPUs as 64 instead 256 currently supported during
|
||||
client-architecture-support negotiation.
|
||||
|
||||
This patch implements the vector 5 and set the MAX CPUs to 256 while setting the
|
||||
others values to 0 (default).
|
||||
|
||||
Signed-off-by: Diego Domingos <diegodo@linux.vnet.ibm.com>
|
||||
Acked-by: Daniel Axtens <dja@axtens.net>
|
||||
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
|
||||
Signed-off-by: Avnish Chouhan <avnish@linux.vnet.ibm.com>
|
||||
---
|
||||
grub-core/kern/ieee1275/init.c | 28 ++++++++++++++++++++++++----
|
||||
1 file changed, 24 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
|
||||
index 7d7178d3e..0e902ff62 100644
|
||||
--- a/grub-core/kern/ieee1275/init.c
|
||||
+++ b/grub-core/kern/ieee1275/init.c
|
||||
@@ -311,7 +311,21 @@ struct option_vector2 {
|
||||
grub_uint8_t max_pft_size;
|
||||
} __attribute__((packed));
|
||||
|
||||
-struct pvr_entry {
|
||||
+struct option_vector5
|
||||
+{
|
||||
+ grub_uint8_t byte1;
|
||||
+ grub_uint8_t byte2;
|
||||
+ grub_uint8_t byte3;
|
||||
+ grub_uint8_t cmo;
|
||||
+ grub_uint8_t associativity;
|
||||
+ grub_uint8_t bin_opts;
|
||||
+ grub_uint8_t micro_checkpoint;
|
||||
+ grub_uint8_t reserved0;
|
||||
+ grub_uint32_t max_cpus;
|
||||
+} GRUB_PACKED;
|
||||
+
|
||||
+struct pvr_entry
|
||||
+{
|
||||
grub_uint32_t mask;
|
||||
grub_uint32_t entry;
|
||||
};
|
||||
@@ -329,7 +343,9 @@ struct cas_vector {
|
||||
grub_uint16_t vec3;
|
||||
grub_uint8_t vec4_size;
|
||||
grub_uint16_t vec4;
|
||||
-} __attribute__((packed));
|
||||
+ grub_uint8_t vec5_size;
|
||||
+ struct option_vector5 vec5;
|
||||
+} GRUB_PACKED;
|
||||
|
||||
/* Call ibm,client-architecture-support to try to get more RMA.
|
||||
We ask for 512MB which should be enough to verify a distro kernel.
|
||||
@@ -349,7 +365,7 @@ grub_ieee1275_ibm_cas (void)
|
||||
} args;
|
||||
struct cas_vector vector = {
|
||||
.pvr_list = { { 0x00000000, 0xffffffff } }, /* any processor */
|
||||
- .num_vecs = 4 - 1,
|
||||
+ .num_vecs = 5 - 1,
|
||||
.vec1_size = 0,
|
||||
.vec1 = 0x80, /* ignore */
|
||||
.vec2_size = 1 + sizeof(struct option_vector2) - 2,
|
||||
@@ -359,7 +375,11 @@ grub_ieee1275_ibm_cas (void)
|
||||
.vec3_size = 2 - 1,
|
||||
.vec3 = 0x00e0, // ask for FP + VMX + DFP but don't halt if unsatisfied
|
||||
.vec4_size = 2 - 1,
|
||||
- .vec4 = 0x0001, // set required minimum capacity % to the lowest value
|
||||
+ .vec4 = 0x0001, /* set required minimum capacity % to the lowest value */
|
||||
+ .vec5_size = 1 + sizeof (struct option_vector5) - 2,
|
||||
+ .vec5 = {
|
||||
+ 0, 192, 0, 128, 0, 0, 0, 0, 256
|
||||
+ }
|
||||
};
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "call-method", 3, 2);
|
||||
--
|
||||
2.39.1
|
||||
|
@ -1,106 +0,0 @@
|
||||
From 834cb2ca9ed2d9d7a6926e598accdfe280b615da Mon Sep 17 00:00:00 2001
|
||||
From: Patrick Steinhardt <ps@pks.im>
|
||||
Date: Thu, 21 Apr 2022 15:24:19 +1000
|
||||
Subject: [PATCH 2/5] kern/efi/mm: Always request a fixed number of pages on
|
||||
init
|
||||
|
||||
When initializing the EFI memory subsystem, we will by default request
|
||||
a quarter of the available memory, bounded by a minimum/maximum value.
|
||||
Given that we're about to extend the EFI memory system to dynamically
|
||||
request additional pages from the firmware as required, this scaling of
|
||||
requested memory based on available memory will not make a lot of sense
|
||||
anymore.
|
||||
|
||||
Remove this logic as a preparatory patch such that we'll instead defer
|
||||
to the runtime memory allocator. Note that ideally, we'd want to change
|
||||
this after dynamic requesting of pages has been implemented for the EFI
|
||||
platform. But because we'll need to split up initialization of the
|
||||
memory subsystem and the request of pages from the firmware, we'd have
|
||||
to duplicate quite some logic at first only to remove it afterwards
|
||||
again. This seems quite pointless, so we instead have patches slightly
|
||||
out of order.
|
||||
|
||||
Signed-off-by: Patrick Steinhardt <ps@pks.im>
|
||||
Signed-off-by: Daniel Axtens <dja@axtens.net>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
Tested-by: Patrick Steinhardt <ps@pks.im>
|
||||
---
|
||||
grub-core/kern/efi/mm.c | 35 +++--------------------------------
|
||||
1 file changed, 3 insertions(+), 32 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c
|
||||
index 67a691d..2874522 100644
|
||||
--- a/grub-core/kern/efi/mm.c
|
||||
+++ b/grub-core/kern/efi/mm.c
|
||||
@@ -38,9 +38,8 @@
|
||||
a multiplier of 4KB. */
|
||||
#define MEMORY_MAP_SIZE 0x3000
|
||||
|
||||
-/* The minimum and maximum heap size for GRUB itself. */
|
||||
-#define MIN_HEAP_SIZE 0x100000
|
||||
-#define MAX_HEAP_SIZE (1600 * 0x100000)
|
||||
+/* The default heap size for GRUB itself in bytes. */
|
||||
+#define DEFAULT_HEAP_SIZE 0x100000
|
||||
|
||||
static void *finish_mmap_buf = 0;
|
||||
static grub_efi_uintn_t finish_mmap_size = 0;
|
||||
@@ -514,23 +513,6 @@ filter_memory_map (grub_efi_memory_descriptor_t *memory_map,
|
||||
return filtered_desc;
|
||||
}
|
||||
|
||||
-/* Return the total number of pages. */
|
||||
-static grub_efi_uint64_t
|
||||
-get_total_pages (grub_efi_memory_descriptor_t *memory_map,
|
||||
- grub_efi_uintn_t desc_size,
|
||||
- grub_efi_memory_descriptor_t *memory_map_end)
|
||||
-{
|
||||
- grub_efi_memory_descriptor_t *desc;
|
||||
- grub_efi_uint64_t total = 0;
|
||||
-
|
||||
- for (desc = memory_map;
|
||||
- desc < memory_map_end;
|
||||
- desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size))
|
||||
- total += desc->num_pages;
|
||||
-
|
||||
- return total;
|
||||
-}
|
||||
-
|
||||
/* Add memory regions. */
|
||||
static void
|
||||
add_memory_regions (grub_efi_memory_descriptor_t *memory_map,
|
||||
@@ -619,8 +601,6 @@ grub_efi_mm_init (void)
|
||||
grub_efi_memory_descriptor_t *filtered_memory_map_end;
|
||||
grub_efi_uintn_t map_size;
|
||||
grub_efi_uintn_t desc_size;
|
||||
- grub_efi_uint64_t total_pages;
|
||||
- grub_efi_uint64_t required_pages;
|
||||
int mm_status;
|
||||
|
||||
/* Prepare a memory region to store two memory maps. */
|
||||
@@ -660,22 +640,13 @@ grub_efi_mm_init (void)
|
||||
filtered_memory_map_end = filter_memory_map (memory_map, filtered_memory_map,
|
||||
desc_size, memory_map_end);
|
||||
|
||||
- /* By default, request a quarter of the available memory. */
|
||||
- total_pages = get_total_pages (filtered_memory_map, desc_size,
|
||||
- filtered_memory_map_end);
|
||||
- required_pages = (total_pages >> 2);
|
||||
- if (required_pages < BYTES_TO_PAGES (MIN_HEAP_SIZE))
|
||||
- required_pages = BYTES_TO_PAGES (MIN_HEAP_SIZE);
|
||||
- else if (required_pages > BYTES_TO_PAGES (MAX_HEAP_SIZE))
|
||||
- required_pages = BYTES_TO_PAGES (MAX_HEAP_SIZE);
|
||||
-
|
||||
/* Sort the filtered descriptors, so that GRUB can allocate pages
|
||||
from smaller regions. */
|
||||
sort_memory_map (filtered_memory_map, desc_size, filtered_memory_map_end);
|
||||
|
||||
/* Allocate memory regions for GRUB's memory management. */
|
||||
add_memory_regions (filtered_memory_map, desc_size,
|
||||
- filtered_memory_map_end, required_pages);
|
||||
+ filtered_memory_map_end, BYTES_TO_PAGES (DEFAULT_HEAP_SIZE));
|
||||
|
||||
#if 0
|
||||
/* For debug. */
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,129 +0,0 @@
|
||||
From 6c9a76053006f7532d9fb3e0e80eb11ebd80df98 Mon Sep 17 00:00:00 2001
|
||||
From: Avnish Chouhan <avnish@linux.vnet.ibm.com>
|
||||
Date: Mon, 27 Mar 2023 12:25:40 +0530
|
||||
Subject: [PATCH 2/2] kern/ieee1275/init: Extended support in Vec5
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This patch enables multiple options in Vec5 which are required and
|
||||
solves the boot issues seen on some machines which are looking for
|
||||
these specific options.
|
||||
|
||||
1. LPAR: Client program supports logical partitioning and
|
||||
associated hcall()s.
|
||||
2. SPLPAR: Client program supports the Shared
|
||||
Processor LPAR Option.
|
||||
3. DYN_RCON_MEM: Client program supports the
|
||||
“ibm,dynamic-reconfiguration-memory” property and it may be
|
||||
presented in the device tree.
|
||||
4. LARGE_PAGES: Client supports pages larger than 4 KB.
|
||||
5. DONATE_DCPU_CLS: Client supports donating dedicated processor cycles.
|
||||
6. PCI_EXP: Client supports PCI Express implementations
|
||||
utilizing Message Signaled Interrupts (MSIs).
|
||||
|
||||
7. CMOC: Enables the Cooperative Memory Over-commitment Option.
|
||||
8. EXT_CMO: Enables the Extended Cooperative Memory Over-commit Option.
|
||||
|
||||
9. ASSOC_REF: Enables “ibm,associativity” and
|
||||
“ibm,associativity-reference-points” properties.
|
||||
10. AFFINITY: Enables Platform Resource Reassignment Notification.
|
||||
11. NUMA: Supports NUMA Distance Lookup Table Option.
|
||||
|
||||
12. HOTPLUG_INTRPT: Supports Hotplug Interrupts.
|
||||
13. HPT_RESIZE: Enable Hash Page Table Resize Option.
|
||||
|
||||
14. MAX_CPU: Defines maximum number of CPUs supported.
|
||||
|
||||
15. PFO_HWRNG: Supports Random Number Generator.
|
||||
16. PFO_HW_COMP: Supports Compression Engine.
|
||||
17. PFO_ENCRYPT: Supports Encryption Engine.
|
||||
|
||||
18. SUB_PROCESSORS: Supports Sub-Processors.
|
||||
|
||||
19. DY_MEM_V2: Client program supports the “ibm,dynamic-memory-v2” property in the
|
||||
“ibm,dynamic-reconfiguration-memory” node and it may be presented in the device tree.
|
||||
20. DRC_INFO: Client program supports the “ibm,drc-info” property definition and it may be
|
||||
presented in the device tree.
|
||||
|
||||
Signed-off-by: Avnish Chouhan <avnish@linux.vnet.ibm.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/kern/ieee1275/init.c | 47 +++++++++++++++++++++++++++++-----
|
||||
1 file changed, 41 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
|
||||
index eaa25d0db..00f892ebe 100644
|
||||
--- a/grub-core/kern/ieee1275/init.c
|
||||
+++ b/grub-core/kern/ieee1275/init.c
|
||||
@@ -61,11 +61,41 @@ extern char _end[];
|
||||
grub_addr_t grub_ieee1275_original_stack;
|
||||
#endif
|
||||
|
||||
-#define LPAR 0x80
|
||||
-#define SPLPAR 0x40
|
||||
-#define BYTE2 (LPAR | SPLPAR)
|
||||
-#define CMO 0x80
|
||||
-#define MAX_CPU 256
|
||||
+/* Options vector5 properties. */
|
||||
+
|
||||
+#define LPAR 0x80
|
||||
+#define SPLPAR 0x40
|
||||
+#define DYN_RCON_MEM 0x20
|
||||
+#define LARGE_PAGES 0x10
|
||||
+#define DONATE_DCPU_CLS 0x02
|
||||
+#define PCI_EXP 0x01
|
||||
+#define BYTE2 (LPAR | SPLPAR | DYN_RCON_MEM | LARGE_PAGES | DONATE_DCPU_CLS | PCI_EXP)
|
||||
+
|
||||
+#define CMOC 0x80
|
||||
+#define EXT_CMO 0x40
|
||||
+#define CMO (CMOC | EXT_CMO)
|
||||
+
|
||||
+#define ASSOC_REF 0x80
|
||||
+#define AFFINITY 0x40
|
||||
+#define NUMA 0x20
|
||||
+#define ASSOCIATIVITY (ASSOC_REF | AFFINITY | NUMA)
|
||||
+
|
||||
+#define HOTPLUG_INTRPT 0x04
|
||||
+#define HPT_RESIZE 0x01
|
||||
+#define BIN_OPTS (HOTPLUG_INTRPT | HPT_RESIZE)
|
||||
+
|
||||
+#define MAX_CPU 256
|
||||
+
|
||||
+#define PFO_HWRNG 0x80000000
|
||||
+#define PFO_HW_COMP 0x40000000
|
||||
+#define PFO_ENCRYPT 0x20000000
|
||||
+#define PLATFORM_FACILITIES (PFO_HWRNG | PFO_HW_COMP | PFO_ENCRYPT)
|
||||
+
|
||||
+#define SUB_PROCESSORS 1
|
||||
+
|
||||
+#define DY_MEM_V2 0x80
|
||||
+#define DRC_INFO 0x40
|
||||
+#define BYTE22 (DY_MEM_V2 | DRC_INFO)
|
||||
|
||||
void
|
||||
grub_exit (void)
|
||||
@@ -328,6 +358,11 @@ struct option_vector5
|
||||
grub_uint8_t micro_checkpoint;
|
||||
grub_uint8_t reserved0;
|
||||
grub_uint32_t max_cpus;
|
||||
+ grub_uint16_t base_papr;
|
||||
+ grub_uint16_t mem_reference;
|
||||
+ grub_uint32_t platform_facilities;
|
||||
+ grub_uint8_t sub_processors;
|
||||
+ grub_uint8_t byte22;
|
||||
} GRUB_PACKED;
|
||||
|
||||
struct pvr_entry
|
||||
@@ -384,7 +419,7 @@ grub_ieee1275_ibm_cas (void)
|
||||
.vec4 = 0x0001, /* set required minimum capacity % to the lowest value */
|
||||
.vec5_size = 1 + sizeof (struct option_vector5) - 2,
|
||||
.vec5 = {
|
||||
- 0, BYTE2, 0, CMO, 0, 0, 0, 0, MAX_CPU
|
||||
+ 0, BYTE2, 0, CMO, ASSOCIATIVITY, BIN_OPTS, 0, 0, MAX_CPU, 0, 0, PLATFORM_FACILITIES, SUB_PROCESSORS, BYTE22
|
||||
}
|
||||
};
|
||||
|
||||
--
|
||||
2.39.2
|
||||
|
@ -1,125 +0,0 @@
|
||||
From c111176648717645284865e15d7c6713cf29e982 Mon Sep 17 00:00:00 2001
|
||||
From: Chris Coulson <chris.coulson@canonical.com>
|
||||
Date: Tue, 5 Apr 2022 10:02:04 +0100
|
||||
Subject: [PATCH 02/32] loader/efi/chainloader: Simplify the loader state
|
||||
|
||||
The chainloader command retains the source buffer and device path passed
|
||||
to LoadImage(), requiring the unload hook passed to grub_loader_set() to
|
||||
free them. It isn't required to retain this state though - they aren't
|
||||
required by StartImage() or anything else in the boot hook, so clean them
|
||||
up before grub_cmd_chainloader() finishes.
|
||||
|
||||
Signed-off-by: Chris Coulson <chris.coulson@canonical.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/loader/efi/chainloader.c | 37 ++++++++++++++++--------------
|
||||
1 file changed, 20 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/grub-core/loader/efi/chainloader.c b/grub-core/loader/efi/chainloader.c
|
||||
index 625f1d26da..1ec09a166c 100644
|
||||
--- a/grub-core/loader/efi/chainloader.c
|
||||
+++ b/grub-core/loader/efi/chainloader.c
|
||||
@@ -53,12 +53,8 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
static grub_dl_t my_mod;
|
||||
|
||||
-static grub_efi_physical_address_t address;
|
||||
-static grub_efi_uintn_t pages;
|
||||
static grub_ssize_t fsize;
|
||||
-static grub_efi_device_path_t *file_path;
|
||||
static grub_efi_handle_t image_handle;
|
||||
-static grub_efi_char16_t *cmdline;
|
||||
static grub_ssize_t cmdline_len;
|
||||
static grub_efi_handle_t dev_handle;
|
||||
|
||||
@@ -70,16 +66,16 @@ static grub_efi_status_t (*entry_point) (grub_efi_handle_t image_handle, grub_e
|
||||
static grub_err_t
|
||||
grub_chainloader_unload (void)
|
||||
{
|
||||
+ grub_efi_loaded_image_t *loaded_image;
|
||||
grub_efi_boot_services_t *b;
|
||||
|
||||
+ loaded_image = grub_efi_get_loaded_image (image_handle);
|
||||
+ if (loaded_image != NULL)
|
||||
+ grub_free (loaded_image->load_options);
|
||||
+
|
||||
b = grub_efi_system_table->boot_services;
|
||||
efi_call_1 (b->unload_image, image_handle);
|
||||
- efi_call_2 (b->free_pages, address, pages);
|
||||
|
||||
- grub_free (file_path);
|
||||
- grub_free (cmdline);
|
||||
- cmdline = 0;
|
||||
- file_path = 0;
|
||||
dev_handle = 0;
|
||||
|
||||
grub_dl_unref (my_mod);
|
||||
@@ -158,7 +154,7 @@ make_file_path (grub_efi_device_path_t *dp, const char *filename)
|
||||
char *dir_start;
|
||||
char *dir_end;
|
||||
grub_size_t size;
|
||||
- grub_efi_device_path_t *d;
|
||||
+ grub_efi_device_path_t *d, *file_path;
|
||||
|
||||
dir_start = grub_strchr (filename, ')');
|
||||
if (! dir_start)
|
||||
@@ -641,10 +637,13 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
|
||||
grub_efi_status_t status;
|
||||
grub_efi_boot_services_t *b;
|
||||
grub_device_t dev = 0;
|
||||
- grub_efi_device_path_t *dp = 0;
|
||||
+ grub_efi_device_path_t *dp = NULL, *file_path = NULL;
|
||||
grub_efi_loaded_image_t *loaded_image;
|
||||
char *filename;
|
||||
void *boot_image = 0;
|
||||
+ grub_efi_physical_address_t address = 0;
|
||||
+ grub_efi_uintn_t pages = 0;
|
||||
+ grub_efi_char16_t *cmdline = NULL;
|
||||
|
||||
if (argc == 0)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||
@@ -652,10 +651,6 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
|
||||
- /* Initialize some global variables. */
|
||||
- address = 0;
|
||||
- image_handle = 0;
|
||||
- file_path = 0;
|
||||
dev_handle = 0;
|
||||
|
||||
b = grub_efi_system_table->boot_services;
|
||||
@@ -857,6 +852,10 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
|
||||
grub_file_close (file);
|
||||
grub_device_close (dev);
|
||||
|
||||
+ /* We're finished with the source image buffer and file path now. */
|
||||
+ efi_call_2 (b->free_pages, address, pages);
|
||||
+ grub_free (file_path);
|
||||
+
|
||||
grub_loader_set (grub_chainloader_boot, grub_chainloader_unload, 0);
|
||||
return 0;
|
||||
|
||||
@@ -868,13 +867,17 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
|
||||
if (file)
|
||||
grub_file_close (file);
|
||||
|
||||
+ grub_free (cmdline);
|
||||
grub_free (file_path);
|
||||
|
||||
if (address)
|
||||
efi_call_2 (b->free_pages, address, pages);
|
||||
|
||||
- if (cmdline)
|
||||
- grub_free (cmdline);
|
||||
+ if (image_handle != NULL)
|
||||
+ {
|
||||
+ efi_call_1 (b->unload_image, image_handle);
|
||||
+ image_handle = NULL;
|
||||
+ }
|
||||
|
||||
grub_dl_unref (my_mod);
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
@ -1,68 +0,0 @@
|
||||
From 4284d40799aaf5aab11c690f232ce0a191dcfbdb Mon Sep 17 00:00:00 2001
|
||||
From: Gary Lin <glin@suse.com>
|
||||
Date: Fri, 16 Sep 2022 10:59:55 +0800
|
||||
Subject: [PATCH 2/2] mm: Defer the disk cache invalidation
|
||||
|
||||
When the heap memory is used up, the memory management code invalidates
|
||||
the disk caches first and then requests the additional memory regioins.
|
||||
Although this could minimize the memory usage, it hurts the loading time
|
||||
since the disk caches may always miss.
|
||||
|
||||
This patch defers the disk cache invalidation to avoid the possible
|
||||
delays.
|
||||
|
||||
Signen-off-by: Gary Lin <glin@suse.com>
|
||||
---
|
||||
grub-core/kern/mm.c | 22 +++++++---------------
|
||||
1 file changed, 7 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/mm.c b/grub-core/kern/mm.c
|
||||
index 0bd9f75..5280e8c 100644
|
||||
--- a/grub-core/kern/mm.c
|
||||
+++ b/grub-core/kern/mm.c
|
||||
@@ -355,20 +355,6 @@ grub_memalign (grub_size_t align, grub_size_t size)
|
||||
switch (count)
|
||||
{
|
||||
case 0:
|
||||
- /* Invalidate disk caches. */
|
||||
- grub_disk_cache_invalidate_all ();
|
||||
- count++;
|
||||
- goto again;
|
||||
-
|
||||
-#if 0
|
||||
- case 1:
|
||||
- /* Unload unneeded modules. */
|
||||
- grub_dl_unload_unneeded ();
|
||||
- count++;
|
||||
- goto again;
|
||||
-#endif
|
||||
-
|
||||
- case 1:
|
||||
/* Request additional pages, contiguous */
|
||||
count++;
|
||||
|
||||
@@ -378,7 +364,7 @@ grub_memalign (grub_size_t align, grub_size_t size)
|
||||
|
||||
/* fallthrough */
|
||||
|
||||
- case 2:
|
||||
+ case 1:
|
||||
/* Request additional pages, anything at all */
|
||||
count++;
|
||||
|
||||
@@ -394,6 +380,12 @@ grub_memalign (grub_size_t align, grub_size_t size)
|
||||
|
||||
/* fallthrough */
|
||||
|
||||
+ case 2:
|
||||
+ /* Invalidate disk caches. */
|
||||
+ grub_disk_cache_invalidate_all ();
|
||||
+ count++;
|
||||
+ goto again;
|
||||
+
|
||||
default:
|
||||
break;
|
||||
}
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,246 +0,0 @@
|
||||
From 4a00be0176a459fa6e199f2709eabbe8dc0d7979 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Fri, 29 Jul 2016 17:41:38 +0800
|
||||
Subject: [PATCH 2/8] net: read bracketed ipv6 addrs and port numbers
|
||||
|
||||
From: Aaron Miller <aaronmiller@fb.com>
|
||||
|
||||
Allow specifying port numbers for http and tftp paths, and allow ipv6 addresses
|
||||
to be recognized with brackets around them, which is required to specify a port
|
||||
number
|
||||
---
|
||||
grub-core/net/http.c | 21 ++++++++++---
|
||||
grub-core/net/net.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++---
|
||||
grub-core/net/tftp.c | 6 +++-
|
||||
include/grub/net.h | 1 +
|
||||
4 files changed, 104 insertions(+), 10 deletions(-)
|
||||
|
||||
Index: grub-2.06~rc1/grub-core/net/http.c
|
||||
===================================================================
|
||||
--- grub-2.06~rc1.orig/grub-core/net/http.c
|
||||
+++ grub-2.06~rc1/grub-core/net/http.c
|
||||
@@ -312,12 +312,14 @@ http_establish (struct grub_file *file,
|
||||
int i;
|
||||
struct grub_net_buff *nb;
|
||||
grub_err_t err;
|
||||
+ char* server = file->device->net->server;
|
||||
+ int port = file->device->net->port;
|
||||
|
||||
nb = grub_netbuff_alloc (GRUB_NET_TCP_RESERVE_SIZE
|
||||
+ sizeof ("GET ") - 1
|
||||
+ grub_strlen (data->filename)
|
||||
+ sizeof (" HTTP/1.1\r\nHost: ") - 1
|
||||
- + grub_strlen (file->device->net->server)
|
||||
+ + grub_strlen (server) + sizeof (":XXXXXXXXXX")
|
||||
+ sizeof ("\r\nUser-Agent: " PACKAGE_STRING
|
||||
"\r\n") - 1
|
||||
+ sizeof ("Range: bytes=XXXXXXXXXXXXXXXXXXXX"
|
||||
@@ -356,7 +358,7 @@ http_establish (struct grub_file *file,
|
||||
sizeof (" HTTP/1.1\r\nHost: ") - 1);
|
||||
|
||||
ptr = nb->tail;
|
||||
- err = grub_netbuff_put (nb, grub_strlen (file->device->net->server));
|
||||
+ err = grub_netbuff_put (nb, grub_strlen (server));
|
||||
if (err)
|
||||
{
|
||||
grub_netbuff_free (nb);
|
||||
@@ -365,6 +367,15 @@ http_establish (struct grub_file *file,
|
||||
grub_memcpy (ptr, file->device->net->server,
|
||||
grub_strlen (file->device->net->server));
|
||||
|
||||
+ if (port)
|
||||
+ {
|
||||
+ ptr = nb->tail;
|
||||
+ grub_snprintf ((char *) ptr,
|
||||
+ sizeof (":XXXXXXXXXX"),
|
||||
+ ":%d",
|
||||
+ port);
|
||||
+ }
|
||||
+
|
||||
ptr = nb->tail;
|
||||
err = grub_netbuff_put (nb,
|
||||
sizeof ("\r\nUser-Agent: " PACKAGE_STRING "\r\n")
|
||||
@@ -390,8 +401,10 @@ http_establish (struct grub_file *file,
|
||||
grub_netbuff_put (nb, 2);
|
||||
grub_memcpy (ptr, "\r\n", 2);
|
||||
|
||||
- data->sock = grub_net_tcp_open (file->device->net->server,
|
||||
- HTTP_PORT, http_receive,
|
||||
+ grub_dprintf ("http", "opening path %s on host %s TCP port %d\n",
|
||||
+ data->filename, server, port ? port : HTTP_PORT);
|
||||
+ data->sock = grub_net_tcp_open (server,
|
||||
+ port ? port : HTTP_PORT, http_receive,
|
||||
http_err, NULL,
|
||||
file);
|
||||
if (!data->sock)
|
||||
Index: grub-2.06~rc1/grub-core/net/net.c
|
||||
===================================================================
|
||||
--- grub-2.06~rc1.orig/grub-core/net/net.c
|
||||
+++ grub-2.06~rc1/grub-core/net/net.c
|
||||
@@ -442,6 +442,12 @@ parse_ip6 (const char *val, grub_uint64_
|
||||
grub_uint16_t newip[8];
|
||||
const char *ptr = val;
|
||||
int word, quaddot = -1;
|
||||
+ int bracketed = 0;
|
||||
+
|
||||
+ if (ptr[0] == '[') {
|
||||
+ bracketed = 1;
|
||||
+ ptr++;
|
||||
+ }
|
||||
|
||||
if (ptr[0] == ':' && ptr[1] != ':')
|
||||
return 0;
|
||||
@@ -480,6 +486,9 @@ parse_ip6 (const char *val, grub_uint64_
|
||||
grub_memset (&newip[quaddot], 0, (7 - word) * sizeof (newip[0]));
|
||||
}
|
||||
grub_memcpy (ip, newip, 16);
|
||||
+ if (bracketed && *ptr == ']') {
|
||||
+ ptr++;
|
||||
+ }
|
||||
if (rest)
|
||||
*rest = ptr;
|
||||
return 1;
|
||||
@@ -1265,8 +1274,10 @@ grub_net_open_real (const char *name)
|
||||
{
|
||||
grub_net_app_level_t proto;
|
||||
const char *protname, *server;
|
||||
+ char *host;
|
||||
grub_size_t protnamelen;
|
||||
int try;
|
||||
+ int port = 0;
|
||||
|
||||
if (grub_strncmp (name, "pxe:", sizeof ("pxe:") - 1) == 0)
|
||||
{
|
||||
@@ -1304,6 +1315,72 @@ grub_net_open_real (const char *name)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+ char* port_start;
|
||||
+ /* ipv6 or port specified? */
|
||||
+ if ((port_start = grub_strchr (server, ':')))
|
||||
+ {
|
||||
+ char* ipv6_begin;
|
||||
+ if((ipv6_begin = grub_strchr (server, '[')))
|
||||
+ {
|
||||
+ char* ipv6_end = grub_strchr (server, ']');
|
||||
+ if(!ipv6_end)
|
||||
+ {
|
||||
+ grub_error (GRUB_ERR_NET_BAD_ADDRESS,
|
||||
+ N_("mismatched [ in address"));
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ /* port number after bracketed ipv6 addr */
|
||||
+ if(ipv6_end[1] == ':')
|
||||
+ {
|
||||
+ port = grub_strtoul (ipv6_end + 2, NULL, 10);
|
||||
+ if(port > 65535)
|
||||
+ {
|
||||
+ grub_error (GRUB_ERR_NET_BAD_ADDRESS,
|
||||
+ N_("bad port number"));
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ }
|
||||
+ host = grub_strndup (ipv6_begin, (ipv6_end - ipv6_begin) + 1);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ if (grub_strchr (port_start + 1, ':'))
|
||||
+ {
|
||||
+ int iplen = grub_strlen (server);
|
||||
+ /* bracket bare ipv6 addrs */
|
||||
+ host = grub_malloc (iplen + 3);
|
||||
+ if(!host)
|
||||
+ {
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ host[0] = '[';
|
||||
+ grub_memcpy (host + 1, server, iplen);
|
||||
+ host[iplen + 1] = ']';
|
||||
+ host[iplen + 2] = '\0';
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ /* hostname:port or ipv4:port */
|
||||
+ port = grub_strtol (port_start + 1, NULL, 10);
|
||||
+ if(port > 65535)
|
||||
+ {
|
||||
+ grub_error (GRUB_ERR_NET_BAD_ADDRESS,
|
||||
+ N_("bad port number"));
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ host = grub_strndup (server, port_start - server);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ host = grub_strdup (server);
|
||||
+ }
|
||||
+ if (!host)
|
||||
+ {
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
for (try = 0; try < 2; try++)
|
||||
{
|
||||
FOR_NET_APP_LEVEL (proto)
|
||||
@@ -1313,14 +1390,13 @@ grub_net_open_real (const char *name)
|
||||
{
|
||||
grub_net_t ret = grub_zalloc (sizeof (*ret));
|
||||
if (!ret)
|
||||
- return NULL;
|
||||
- ret->protocol = proto;
|
||||
- ret->server = grub_strdup (server);
|
||||
- if (!ret->server)
|
||||
{
|
||||
- grub_free (ret);
|
||||
+ grub_free (host);
|
||||
return NULL;
|
||||
}
|
||||
+ ret->protocol = proto;
|
||||
+ ret->port = port;
|
||||
+ ret->server = host;
|
||||
ret->fs = &grub_net_fs;
|
||||
return ret;
|
||||
}
|
||||
Index: grub-2.06~rc1/grub-core/net/tftp.c
|
||||
===================================================================
|
||||
--- grub-2.06~rc1.orig/grub-core/net/tftp.c
|
||||
+++ grub-2.06~rc1/grub-core/net/tftp.c
|
||||
@@ -295,6 +295,7 @@ tftp_open (struct grub_file *file, const
|
||||
grub_err_t err;
|
||||
grub_uint8_t *nbd;
|
||||
grub_net_network_level_address_t addr;
|
||||
+ int port = file->device->net->port;
|
||||
|
||||
data = grub_zalloc (sizeof (*data));
|
||||
if (!data)
|
||||
@@ -361,12 +362,15 @@ tftp_open (struct grub_file *file, const
|
||||
err = grub_net_resolve_address (file->device->net->server, &addr);
|
||||
if (err)
|
||||
{
|
||||
+ grub_dprintf ("tftp", "file_size is %llu, block_size is %llu\n",
|
||||
+ (unsigned long long)data->file_size,
|
||||
+ (unsigned long long)data->block_size);
|
||||
grub_free (data);
|
||||
return err;
|
||||
}
|
||||
|
||||
data->sock = grub_net_udp_open (addr,
|
||||
- TFTP_SERVER_PORT, tftp_receive,
|
||||
+ port ? port : TFTP_SERVER_PORT, tftp_receive,
|
||||
file);
|
||||
if (!data->sock)
|
||||
{
|
||||
Index: grub-2.06~rc1/include/grub/net.h
|
||||
===================================================================
|
||||
--- grub-2.06~rc1.orig/include/grub/net.h
|
||||
+++ grub-2.06~rc1/include/grub/net.h
|
||||
@@ -270,6 +270,7 @@ typedef struct grub_net
|
||||
{
|
||||
char *server;
|
||||
char *name;
|
||||
+ int port;
|
||||
grub_net_app_level_t protocol;
|
||||
grub_net_packets_t packs;
|
||||
grub_off_t offset;
|
@ -1,98 +0,0 @@
|
||||
From 1ea4e5ef09c06552402bf676ce262a661372f08d Mon Sep 17 00:00:00 2001
|
||||
From: Jeff Mahoney <jeffm@suse.com>
|
||||
Date: Thu, 15 Jul 2021 17:35:28 +0200
|
||||
Subject: [PATCH 2/2] osdep/linux/hostdisk: Use stat() instead of udevadm for
|
||||
partition lookup
|
||||
|
||||
The sysfs_partition_path() calls udevadm to resolve the sysfs path for
|
||||
a block device. That can be accomplished by stating the device node
|
||||
and using the major/minor to follow the symlinks in /sys/dev/block/.
|
||||
|
||||
This cuts the execution time of grub-mkconfig to somewhere near 55% on
|
||||
system without LVM (which uses libdevmapper instead sysfs_partition_path()).
|
||||
|
||||
Remove udevadm call as it does not help us more than calling stat() directly.
|
||||
|
||||
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
|
||||
Signed-off-by: Petr Vorel <pvorel@suse.cz>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
[ upstream status: 1ea4e5ef0 ("osdep/linux/hostdisk: Use stat() instead of udevadm for partition lookup")
|
||||
---
|
||||
grub-core/osdep/linux/hostdisk.c | 52 ++++----------------------------
|
||||
1 file changed, 6 insertions(+), 46 deletions(-)
|
||||
|
||||
diff --git a/grub-core/osdep/linux/hostdisk.c b/grub-core/osdep/linux/hostdisk.c
|
||||
index da62f924e..d3326d095 100644
|
||||
--- a/grub-core/osdep/linux/hostdisk.c
|
||||
+++ b/grub-core/osdep/linux/hostdisk.c
|
||||
@@ -31,6 +31,7 @@
|
||||
#include <grub/misc.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/list.h>
|
||||
+#include <grub/osdep/major.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -98,54 +99,13 @@ grub_util_get_fd_size_os (grub_util_fd_t fd, const char *name, unsigned *log_sec
|
||||
static char *
|
||||
sysfs_partition_path (const char *dev, const char *entry)
|
||||
{
|
||||
- const char *argv[7];
|
||||
- int fd;
|
||||
- pid_t pid;
|
||||
- FILE *udevadm;
|
||||
- char *buf = NULL;
|
||||
- size_t len = 0;
|
||||
- char *path = NULL;
|
||||
-
|
||||
- argv[0] = "udevadm";
|
||||
- argv[1] = "info";
|
||||
- argv[2] = "--query";
|
||||
- argv[3] = "path";
|
||||
- argv[4] = "--name";
|
||||
- argv[5] = dev;
|
||||
- argv[6] = NULL;
|
||||
-
|
||||
- pid = grub_util_exec_pipe (argv, &fd);
|
||||
-
|
||||
- if (!pid)
|
||||
- return NULL;
|
||||
-
|
||||
- /* Parent. Read udevadm's output. */
|
||||
- udevadm = fdopen (fd, "r");
|
||||
- if (!udevadm)
|
||||
- {
|
||||
- grub_util_warn (_("Unable to open stream from %s: %s"),
|
||||
- "udevadm", strerror (errno));
|
||||
- close (fd);
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- if (getline (&buf, &len, udevadm) > 0)
|
||||
- {
|
||||
- char *newline;
|
||||
-
|
||||
- newline = strchr (buf, '\n');
|
||||
- if (newline)
|
||||
- *newline = '\0';
|
||||
- path = xasprintf ("/sys%s/%s", buf, entry);
|
||||
- }
|
||||
+ struct stat st;
|
||||
|
||||
-out:
|
||||
- if (udevadm)
|
||||
- fclose (udevadm);
|
||||
- waitpid (pid, NULL, 0);
|
||||
- free (buf);
|
||||
+ if (stat (dev, &st) == 0 && S_ISBLK (st.st_mode))
|
||||
+ return xasprintf ("/sys/dev/block/%u:%u/%s",
|
||||
+ major (st.st_rdev), minor (st.st_rdev), entry);
|
||||
|
||||
- return path;
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
--
|
||||
2.32.0
|
||||
|
@ -1,128 +0,0 @@
|
||||
From e5bba1012e34597215684aa948bbc30093faa750 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Fri, 7 Oct 2022 13:37:10 +0800
|
||||
Subject: [PATCH 2/2] tpm: Disable tpm verifier if tpm is not present
|
||||
|
||||
This helps to prevent out of memory error when reading large files via
|
||||
disabling tpm device as verifier has to read all content into memory in
|
||||
one chunk to measure the hash and extend to tpm.
|
||||
|
||||
For ibmvtpm driver support this change here would be needed. It helps to
|
||||
prevent much memory consuming tpm subsystem from being activated when no
|
||||
vtpm device present.
|
||||
|
||||
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
|
||||
---
|
||||
grub-core/commands/efi/tpm.c | 37 +++++++++++++++++++++++++++
|
||||
grub-core/commands/ieee1275/ibmvtpm.c | 16 +++++++-----
|
||||
grub-core/commands/tpm.c | 4 +++
|
||||
include/grub/tpm.h | 1 +
|
||||
4 files changed, 52 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/grub-core/commands/efi/tpm.c
|
||||
+++ b/grub-core/commands/efi/tpm.c
|
||||
@@ -397,3 +397,40 @@
|
||||
|
||||
return result;
|
||||
}
|
||||
+
|
||||
+int
|
||||
+grub_tpm_present (void)
|
||||
+{
|
||||
+ grub_efi_handle_t tpm_handle;
|
||||
+ grub_efi_uint8_t protocol_version;
|
||||
+
|
||||
+ if (!grub_tpm_handle_find (&tpm_handle, &protocol_version))
|
||||
+ return 0;
|
||||
+
|
||||
+ if (protocol_version == 1)
|
||||
+ {
|
||||
+ grub_efi_tpm_protocol_t *tpm;
|
||||
+
|
||||
+ tpm = grub_efi_open_protocol (tpm_handle, &tpm_guid,
|
||||
+ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
|
||||
+ if (!tpm)
|
||||
+ {
|
||||
+ grub_dprintf ("tpm", "Cannot open TPM protocol\n");
|
||||
+ return 0;
|
||||
+ }
|
||||
+ return grub_tpm1_present (tpm);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ grub_efi_tpm2_protocol_t *tpm;
|
||||
+
|
||||
+ tpm = grub_efi_open_protocol (tpm_handle, &tpm2_guid,
|
||||
+ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
|
||||
+ if (!tpm)
|
||||
+ {
|
||||
+ grub_dprintf ("tpm", "Cannot open TPM protocol\n");
|
||||
+ return 0;
|
||||
+ }
|
||||
+ return grub_tpm2_present (tpm);
|
||||
+ }
|
||||
+}
|
||||
--- a/grub-core/commands/ieee1275/ibmvtpm.c
|
||||
+++ b/grub-core/commands/ieee1275/ibmvtpm.c
|
||||
@@ -136,12 +136,6 @@
|
||||
grub_tpm_measure (unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
|
||||
const char *description)
|
||||
{
|
||||
- grub_err_t err = tpm_init();
|
||||
-
|
||||
- /* Absence of a TPM isn't a failure. */
|
||||
- if (err != GRUB_ERR_NONE)
|
||||
- return GRUB_ERR_NONE;
|
||||
-
|
||||
grub_dprintf ("tpm", "log_event, pcr = %d, size = 0x%" PRIxGRUB_SIZE ", %s\n",
|
||||
pcr, size, description);
|
||||
|
||||
@@ -150,3 +144,13 @@
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
+
|
||||
+int
|
||||
+grub_tpm_present (void)
|
||||
+{
|
||||
+ /*
|
||||
+ * Call tpm_init() 'late' rather than from GRUB_MOD_INIT() so that device nodes
|
||||
+ * can be found.
|
||||
+ */
|
||||
+ return tpm_init() == GRUB_ERR_NONE;
|
||||
+}
|
||||
--- a/grub-core/commands/tpm.c
|
||||
+++ b/grub-core/commands/tpm.c
|
||||
@@ -311,16 +311,19 @@
|
||||
|
||||
GRUB_MOD_INIT (tpm)
|
||||
{
|
||||
- grub_verifier_register (&grub_tpm_verifier);
|
||||
-
|
||||
cmd = grub_register_extcmd ("tpm_record_pcrs", grub_tpm_record_pcrs, 0,
|
||||
N_("LIST_OF_PCRS"),
|
||||
N_("Snapshot one or more PCR values and record them in an EFI variable."),
|
||||
grub_tpm_record_pcrs_options);
|
||||
+ if (!grub_tpm_present())
|
||||
+ return;
|
||||
+ grub_verifier_register (&grub_tpm_verifier);
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI (tpm)
|
||||
{
|
||||
- grub_verifier_unregister (&grub_tpm_verifier);
|
||||
grub_unregister_extcmd (cmd);
|
||||
+ if (!grub_tpm_present())
|
||||
+ return;
|
||||
+ grub_verifier_unregister (&grub_tpm_verifier);
|
||||
}
|
||||
--- a/include/grub/tpm.h
|
||||
+++ b/include/grub/tpm.h
|
||||
@@ -44,5 +44,6 @@
|
||||
grub_uint8_t pcr, const char *description);
|
||||
struct grub_tpm_digest *grub_tpm_read_pcr (grub_uint8_t index, const char *algo);
|
||||
void grub_tpm_digest_free (struct grub_tpm_digest *d);
|
||||
+int grub_tpm_present (void);
|
||||
|
||||
#endif
|
@ -55,9 +55,6 @@ Signed-off-by: Gary Lin <glin@suse.com>
|
||||
create mode 100644 include/grub/tpm2/tcg2.h
|
||||
create mode 100644 include/grub/tpm2/tpm2.h
|
||||
|
||||
diff --git a/grub-core/tpm2/buffer.c b/grub-core/tpm2/buffer.c
|
||||
new file mode 100644
|
||||
index 000000000..cb9f29497
|
||||
--- /dev/null
|
||||
+++ b/grub-core/tpm2/buffer.c
|
||||
@@ -0,0 +1,145 @@
|
||||
@ -206,9 +203,6 @@ index 000000000..cb9f29497
|
||||
+ buffer->offset += sizeof (tmp);
|
||||
+ *value = grub_be_to_cpu32 (tmp);
|
||||
+}
|
||||
diff --git a/grub-core/tpm2/mu.c b/grub-core/tpm2/mu.c
|
||||
new file mode 100644
|
||||
index 000000000..1617f37cd
|
||||
--- /dev/null
|
||||
+++ b/grub-core/tpm2/mu.c
|
||||
@@ -0,0 +1,807 @@
|
||||
@ -1019,9 +1013,6 @@ index 000000000..1617f37cd
|
||||
+ for (grub_uint32_t i = 0; i < digest->count; i++)
|
||||
+ grub_tpm2_mu_TPM2B_DIGEST_Unmarshal (buf, &digest->digests[i]);
|
||||
+}
|
||||
diff --git a/grub-core/tpm2/tcg2.c b/grub-core/tpm2/tcg2.c
|
||||
new file mode 100644
|
||||
index 000000000..d350e3a24
|
||||
--- /dev/null
|
||||
+++ b/grub-core/tpm2/tcg2.c
|
||||
@@ -0,0 +1,143 @@
|
||||
@ -1064,7 +1055,7 @@ index 000000000..d350e3a24
|
||||
+ if (has_caps)
|
||||
+ goto exit;
|
||||
+
|
||||
+ status = efi_call_2 (protocol->get_capability, protocol, &caps);
|
||||
+ status = protocol->get_capability (protocol, &caps);
|
||||
+ if (status != GRUB_EFI_SUCCESS || !caps.TPMPresentFlag)
|
||||
+ return GRUB_ERR_FILE_NOT_FOUND;
|
||||
+
|
||||
@ -1082,7 +1073,7 @@ index 000000000..d350e3a24
|
||||
+static grub_err_t
|
||||
+grub_tcg2_get_protocol (grub_efi_tpm2_protocol_t **protocol)
|
||||
+{
|
||||
+ static grub_efi_guid_t tpm2_guid = EFI_TPM2_GUID;
|
||||
+ static grub_guid_t tpm2_guid = EFI_TPM2_GUID;
|
||||
+ static grub_efi_tpm2_protocol_t *tpm2_protocol = NULL;
|
||||
+
|
||||
+ int tpm2;
|
||||
@ -1161,16 +1152,13 @@ index 000000000..d350e3a24
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ status = efi_call_5 (protocol->submit_command, protocol, input_size, input,
|
||||
+ status = protocol->submit_command (protocol, input_size, input,
|
||||
+ output_size, output);
|
||||
+ if (status != GRUB_EFI_SUCCESS)
|
||||
+ return GRUB_ERR_INVALID_COMMAND;
|
||||
+
|
||||
+ return GRUB_ERR_NONE;
|
||||
+}
|
||||
diff --git a/grub-core/tpm2/tpm2.c b/grub-core/tpm2/tpm2.c
|
||||
new file mode 100644
|
||||
index 000000000..d67699a24
|
||||
--- /dev/null
|
||||
+++ b/grub-core/tpm2/tpm2.c
|
||||
@@ -0,0 +1,761 @@
|
||||
@ -1935,9 +1923,6 @@ index 000000000..d67699a24
|
||||
+
|
||||
+ return TPM_RC_SUCCESS;
|
||||
+}
|
||||
diff --git a/include/grub/tpm2/buffer.h b/include/grub/tpm2/buffer.h
|
||||
new file mode 100644
|
||||
index 000000000..87dcd8d6c
|
||||
--- /dev/null
|
||||
+++ b/include/grub/tpm2/buffer.h
|
||||
@@ -0,0 +1,65 @@
|
||||
@ -2006,9 +1991,6 @@ index 000000000..87dcd8d6c
|
||||
+grub_tpm2_buffer_unpack_u32 (grub_tpm2_buffer_t buffer, grub_uint32_t* value);
|
||||
+
|
||||
+#endif /* ! GRUB_TPM2_BUFFER_HEADER */
|
||||
diff --git a/include/grub/tpm2/internal/functions.h b/include/grub/tpm2/internal/functions.h
|
||||
new file mode 100644
|
||||
index 000000000..9380f26a2
|
||||
--- /dev/null
|
||||
+++ b/include/grub/tpm2/internal/functions.h
|
||||
@@ -0,0 +1,117 @@
|
||||
@ -2129,9 +2111,6 @@ index 000000000..9380f26a2
|
||||
+ TPMS_AUTH_RESPONSE *authResponse);
|
||||
+
|
||||
+#endif /* ! GRUB_TPM2_INTERNAL_FUNCTIONS_HEADER */
|
||||
diff --git a/include/grub/tpm2/internal/structs.h b/include/grub/tpm2/internal/structs.h
|
||||
new file mode 100644
|
||||
index 000000000..72d71eb70
|
||||
--- /dev/null
|
||||
+++ b/include/grub/tpm2/internal/structs.h
|
||||
@@ -0,0 +1,675 @@
|
||||
@ -2810,9 +2789,6 @@ index 000000000..72d71eb70
|
||||
+typedef struct TPMT_TK_CREATION TPMT_TK_CREATION;
|
||||
+
|
||||
+#endif /* ! GRUB_TPM2_INTERNAL_STRUCTS_HEADER */
|
||||
diff --git a/include/grub/tpm2/internal/types.h b/include/grub/tpm2/internal/types.h
|
||||
new file mode 100644
|
||||
index 000000000..9714f75d4
|
||||
--- /dev/null
|
||||
+++ b/include/grub/tpm2/internal/types.h
|
||||
@@ -0,0 +1,372 @@
|
||||
@ -3188,9 +3164,6 @@ index 000000000..9714f75d4
|
||||
+typedef TPM_HANDLE TPMI_DH_PERSISTENT;
|
||||
+
|
||||
+#endif /* ! GRUB_TPM2_INTERNAL_TYPES_HEADER */
|
||||
diff --git a/include/grub/tpm2/mu.h b/include/grub/tpm2/mu.h
|
||||
new file mode 100644
|
||||
index 000000000..c545976db
|
||||
--- /dev/null
|
||||
+++ b/include/grub/tpm2/mu.h
|
||||
@@ -0,0 +1,292 @@
|
||||
@ -3486,9 +3459,6 @@ index 000000000..c545976db
|
||||
+ TPML_DIGEST* digest);
|
||||
+
|
||||
+#endif /* ! GRUB_TPM2_MU_HEADER */
|
||||
diff --git a/include/grub/tpm2/tcg2.h b/include/grub/tpm2/tcg2.h
|
||||
new file mode 100644
|
||||
index 000000000..553b3fd93
|
||||
--- /dev/null
|
||||
+++ b/include/grub/tpm2/tcg2.h
|
||||
@@ -0,0 +1,34 @@
|
||||
@ -3526,9 +3496,6 @@ index 000000000..553b3fd93
|
||||
+ grub_uint8_t *output);
|
||||
+
|
||||
+#endif /* ! GRUB_TPM2_TCG2_HEADER */
|
||||
diff --git a/include/grub/tpm2/tpm2.h b/include/grub/tpm2/tpm2.h
|
||||
new file mode 100644
|
||||
index 000000000..cfdc9edcd
|
||||
--- /dev/null
|
||||
+++ b/include/grub/tpm2/tpm2.h
|
||||
@@ -0,0 +1,34 @@
|
||||
@ -3566,6 +3533,3 @@ index 000000000..cfdc9edcd
|
||||
+} TPM2_SEALED_KEY;
|
||||
+
|
||||
+#endif /* ! GRUB_TPM2_TPM2_HEADER */
|
||||
--
|
||||
2.35.3
|
||||
|
||||
|
@ -12,44 +12,9 @@ Signed-off-by: Peter Jones <pjones@redhat.com>
|
||||
include/grub/i386/linux.h | 7 +-
|
||||
3 files changed, 97 insertions(+), 48 deletions(-)
|
||||
|
||||
diff --git a/grub-core/loader/efi/linux.c b/grub-core/loader/efi/linux.c
|
||||
index 442627dc2..9265cf420 100644
|
||||
--- a/grub-core/loader/efi/linux.c
|
||||
+++ b/grub-core/loader/efi/linux.c
|
||||
@@ -30,11 +30,16 @@
|
||||
typedef void (*handover_func) (void *, grub_efi_system_table_t *, void *);
|
||||
|
||||
grub_err_t
|
||||
-grub_efi_linux_boot (void *kernel_addr, grub_off_t offset,
|
||||
+grub_efi_linux_boot (void *kernel_addr, grub_off_t handover_offset,
|
||||
void *kernel_params)
|
||||
{
|
||||
grub_efi_loaded_image_t *loaded_image = NULL;
|
||||
handover_func hf;
|
||||
+ int offset = 0;
|
||||
+
|
||||
+#ifdef __x86_64__
|
||||
+ offset = 512;
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* Since the EFI loader is not calling the LoadImage() and StartImage()
|
||||
@@ -48,8 +53,8 @@ grub_efi_linux_boot (void *kernel_addr, grub_off_t offset,
|
||||
grub_dprintf ("linux", "Loaded Image base address could not be set\n");
|
||||
|
||||
grub_dprintf ("linux", "kernel_addr: %p handover_offset: %p params: %p\n",
|
||||
- kernel_addr, (void *)(grub_efi_uintn_t)offset, kernel_params);
|
||||
- hf = (handover_func)((char *)kernel_addr + offset);
|
||||
+ kernel_addr, (void *)(grub_efi_uintn_t)handover_offset, kernel_params);
|
||||
+ hf = (handover_func)((char *)kernel_addr + handover_offset + offset);
|
||||
hf (grub_efi_image_handle, grub_efi_system_table, kernel_params);
|
||||
|
||||
return GRUB_ERR_BUG;
|
||||
diff --git a/grub-core/loader/i386/efi/linux.c b/grub-core/loader/i386/efi/linux.c
|
||||
index 1e09c88ab..0b3d20875 100644
|
||||
--- a/grub-core/loader/i386/efi/linux.c
|
||||
+++ b/grub-core/loader/i386/efi/linux.c
|
||||
@@ -44,14 +44,10 @@ static char *linux_cmdline;
|
||||
@@ -44,14 +44,10 @@
|
||||
static grub_err_t
|
||||
grub_linuxefi_boot (void)
|
||||
{
|
||||
@ -66,7 +31,7 @@ index 1e09c88ab..0b3d20875 100644
|
||||
params);
|
||||
}
|
||||
|
||||
@@ -147,14 +143,20 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||
@@ -147,14 +143,20 @@
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
@ -89,7 +54,7 @@ index 1e09c88ab..0b3d20875 100644
|
||||
grub_err_t err;
|
||||
|
||||
grub_dl_ref (my_mod);
|
||||
@@ -185,45 +187,79 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
@@ -185,45 +187,79 @@
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@ -104,14 +69,12 @@ index 1e09c88ab..0b3d20875 100644
|
||||
}
|
||||
|
||||
- grub_memset (params, 0, 16384);
|
||||
-
|
||||
- grub_memcpy (&lh, kernel, sizeof (lh));
|
||||
-
|
||||
- if (lh.boot_flag != grub_cpu_to_le16 (0xaa55))
|
||||
+ grub_dprintf ("linux", "params = %p\n", params);
|
||||
+
|
||||
|
||||
- grub_memcpy (&lh, kernel, sizeof (lh));
|
||||
+ grub_memset (params, 0, sizeof(*params));
|
||||
+
|
||||
|
||||
- if (lh.boot_flag != grub_cpu_to_le16 (0xaa55))
|
||||
+ setup_header_end_offset = *((grub_uint8_t *)kernel + 0x201);
|
||||
+ grub_dprintf ("linux", "copying %lu bytes from %p to %p\n",
|
||||
+ MIN((grub_size_t)0x202+setup_header_end_offset,
|
||||
@ -164,7 +127,7 @@ index 1e09c88ab..0b3d20875 100644
|
||||
+ goto fail;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
|
||||
+#if defined(__i386__)
|
||||
+ if ((lh->xloadflags & LINUX_XLF_KERNEL_64) &&
|
||||
+ !(lh->xloadflags & LINUX_XLF_EFI_HANDOVER_32))
|
||||
@ -174,14 +137,14 @@ index 1e09c88ab..0b3d20875 100644
|
||||
+ goto fail;
|
||||
+ }
|
||||
+#endif
|
||||
|
||||
+
|
||||
+ grub_dprintf ("linux", "setting up cmdline\n");
|
||||
+ linux_cmdline = grub_efi_allocate_pages_max(0x3fffffff,
|
||||
+ BYTES_TO_PAGES(lh->cmdline_size + 1));
|
||||
if (!linux_cmdline)
|
||||
{
|
||||
grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("can't allocate cmdline"));
|
||||
@@ -233,27 +269,26 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
@@ -233,27 +269,26 @@
|
||||
grub_memcpy (linux_cmdline, LINUX_IMAGE, sizeof (LINUX_IMAGE));
|
||||
err = grub_create_loader_cmdline (argc, argv,
|
||||
linux_cmdline + sizeof (LINUX_IMAGE) - 1,
|
||||
@ -220,7 +183,7 @@ index 1e09c88ab..0b3d20875 100644
|
||||
|
||||
if (!kernel_mem)
|
||||
{
|
||||
@@ -261,21 +296,23 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
@@ -261,21 +296,23 @@
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@ -254,7 +217,7 @@ index 1e09c88ab..0b3d20875 100644
|
||||
|
||||
fail:
|
||||
|
||||
@@ -291,8 +328,10 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
@@ -291,8 +328,10 @@
|
||||
loaded = 0;
|
||||
}
|
||||
|
||||
@ -267,11 +230,9 @@ index 1e09c88ab..0b3d20875 100644
|
||||
|
||||
if (kernel_mem && !loaded)
|
||||
grub_efi_free_pages((grub_efi_physical_address_t)(grub_addr_t)kernel_mem, BYTES_TO_PAGES(kernel_size));
|
||||
diff --git a/include/grub/i386/linux.h b/include/grub/i386/linux.h
|
||||
index eddf9251d..25ef52c04 100644
|
||||
--- a/include/grub/i386/linux.h
|
||||
+++ b/include/grub/i386/linux.h
|
||||
@@ -138,7 +138,12 @@ struct linux_i386_kernel_header
|
||||
@@ -138,7 +138,12 @@
|
||||
grub_uint32_t kernel_alignment;
|
||||
grub_uint8_t relocatable;
|
||||
grub_uint8_t min_alignment;
|
||||
@ -285,6 +246,34 @@ index eddf9251d..25ef52c04 100644
|
||||
grub_uint32_t cmdline_size;
|
||||
grub_uint32_t hardware_subarch;
|
||||
grub_uint64_t hardware_subarch_data;
|
||||
--
|
||||
2.31.1
|
||||
|
||||
--- a/grub-core/loader/efi/linux_boot.c
|
||||
+++ b/grub-core/loader/efi/linux_boot.c
|
||||
@@ -30,11 +30,16 @@
|
||||
typedef void (*handover_func) (void *, grub_efi_system_table_t *, void *);
|
||||
|
||||
grub_err_t
|
||||
-grub_efi_linux_boot (void *kernel_addr, grub_off_t offset,
|
||||
+grub_efi_linux_boot (void *kernel_addr, grub_off_t handover_offset,
|
||||
void *kernel_params)
|
||||
{
|
||||
grub_efi_loaded_image_t *loaded_image = NULL;
|
||||
handover_func hf;
|
||||
+ int offset = 0;
|
||||
+
|
||||
+#ifdef __x86_64__
|
||||
+ offset = 512;
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* Since the EFI loader is not calling the LoadImage() and StartImage()
|
||||
@@ -48,8 +53,8 @@
|
||||
grub_dprintf ("linux", "Loaded Image base address could not be set\n");
|
||||
|
||||
grub_dprintf ("linux", "kernel_addr: %p handover_offset: %p params: %p\n",
|
||||
- kernel_addr, (void *)(grub_efi_uintn_t)offset, kernel_params);
|
||||
- hf = (handover_func)((char *)kernel_addr + offset);
|
||||
+ kernel_addr, (void *)(grub_efi_uintn_t)handover_offset, kernel_params);
|
||||
+ hf = (handover_func)((char *)kernel_addr + handover_offset + offset);
|
||||
hf (grub_efi_image_handle, grub_efi_system_table, kernel_params);
|
||||
|
||||
return GRUB_ERR_BUG;
|
||||
|
@ -10,11 +10,9 @@ Signed-off-by: Peter Jones <pjones@redhat.com>
|
||||
include/grub/err.h | 5 ++++-
|
||||
3 files changed, 29 insertions(+), 6 deletions(-)
|
||||
|
||||
Index: grub-2.06~rc1/grub-core/kern/err.c
|
||||
===================================================================
|
||||
--- grub-2.06~rc1.orig/grub-core/kern/err.c
|
||||
+++ grub-2.06~rc1/grub-core/kern/err.c
|
||||
@@ -33,15 +33,24 @@ static struct grub_error_saved grub_erro
|
||||
--- a/grub-core/kern/err.c
|
||||
+++ b/grub-core/kern/err.c
|
||||
@@ -33,15 +33,24 @@
|
||||
static int grub_error_stack_pos;
|
||||
static int grub_error_stack_assert;
|
||||
|
||||
@ -41,11 +39,9 @@ Index: grub-2.06~rc1/grub-core/kern/err.c
|
||||
va_end (ap);
|
||||
|
||||
return n;
|
||||
Index: grub-2.06~rc1/include/grub/err.h
|
||||
===================================================================
|
||||
--- grub-2.06~rc1.orig/include/grub/err.h
|
||||
+++ grub-2.06~rc1/include/grub/err.h
|
||||
@@ -85,8 +85,11 @@ struct grub_error_saved
|
||||
--- a/include/grub/err.h
|
||||
+++ b/include/grub/err.h
|
||||
@@ -86,8 +86,11 @@
|
||||
extern grub_err_t EXPORT_VAR(grub_errno);
|
||||
extern char EXPORT_VAR(grub_errmsg)[GRUB_MAX_ERRMSG];
|
||||
|
||||
|
@ -19,10 +19,8 @@ V1:
|
||||
include/grub/net.h | 72 ++++
|
||||
3 files changed, 1018 insertions(+), 1 deletion(-)
|
||||
|
||||
Index: grub-2.06/grub-core/net/bootp.c
|
||||
===================================================================
|
||||
--- grub-2.06.orig/grub-core/net/bootp.c
|
||||
+++ grub-2.06/grub-core/net/bootp.c
|
||||
--- a/grub-core/net/bootp.c
|
||||
+++ b/grub-core/net/bootp.c
|
||||
@@ -24,6 +24,98 @@
|
||||
#include <grub/net/netbuff.h>
|
||||
#include <grub/net/udp.h>
|
||||
@ -122,7 +120,7 @@ Index: grub-2.06/grub-core/net/bootp.c
|
||||
|
||||
struct grub_dhcp_discover_options
|
||||
{
|
||||
@@ -607,6 +699,578 @@ out:
|
||||
@@ -610,6 +702,578 @@
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -701,7 +699,7 @@ Index: grub-2.06/grub-core/net/bootp.c
|
||||
/*
|
||||
* This is called directly from net/ip.c:handle_dgram(), because those
|
||||
* BOOTP/DHCP packets are a bit special due to their improper
|
||||
@@ -675,6 +1339,77 @@ grub_net_process_dhcp (struct grub_net_b
|
||||
@@ -678,6 +1342,77 @@
|
||||
}
|
||||
}
|
||||
|
||||
@ -779,7 +777,7 @@ Index: grub-2.06/grub-core/net/bootp.c
|
||||
static grub_err_t
|
||||
grub_cmd_dhcpopt (struct grub_command *cmd __attribute__ ((unused)),
|
||||
int argc, char **args)
|
||||
@@ -900,7 +1635,174 @@ grub_cmd_bootp (struct grub_command *cmd
|
||||
@@ -903,7 +1638,174 @@
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -955,7 +953,7 @@ Index: grub-2.06/grub-core/net/bootp.c
|
||||
|
||||
void
|
||||
grub_bootp_init (void)
|
||||
@@ -914,6 +1816,9 @@ grub_bootp_init (void)
|
||||
@@ -917,6 +1819,9 @@
|
||||
cmd_getdhcp = grub_register_command ("net_get_dhcp_option", grub_cmd_dhcpopt,
|
||||
N_("VAR INTERFACE NUMBER DESCRIPTION"),
|
||||
N_("retrieve DHCP option and save it into VAR. If VAR is - then print the value."));
|
||||
@ -965,17 +963,15 @@ Index: grub-2.06/grub-core/net/bootp.c
|
||||
}
|
||||
|
||||
void
|
||||
@@ -922,4 +1827,5 @@ grub_bootp_fini (void)
|
||||
@@ -925,4 +1830,5 @@
|
||||
grub_unregister_command (cmd_getdhcp);
|
||||
grub_unregister_command (cmd_bootp);
|
||||
grub_unregister_command (cmd_dhcp);
|
||||
+ grub_unregister_command (cmd_bootp6);
|
||||
}
|
||||
Index: grub-2.06/grub-core/net/ip.c
|
||||
===================================================================
|
||||
--- grub-2.06.orig/grub-core/net/ip.c
|
||||
+++ grub-2.06/grub-core/net/ip.c
|
||||
@@ -239,6 +239,45 @@ handle_dgram (struct grub_net_buff *nb,
|
||||
--- a/grub-core/net/ip.c
|
||||
+++ b/grub-core/net/ip.c
|
||||
@@ -240,6 +240,45 @@
|
||||
{
|
||||
struct udphdr *udph;
|
||||
udph = (struct udphdr *) nb->data;
|
||||
@ -1021,11 +1017,9 @@ Index: grub-2.06/grub-core/net/ip.c
|
||||
if (proto == GRUB_NET_IP_UDP && grub_be_to_cpu16 (udph->dst) == 68)
|
||||
{
|
||||
const struct grub_net_bootp_packet *bootp;
|
||||
Index: grub-2.06/include/grub/net.h
|
||||
===================================================================
|
||||
--- grub-2.06.orig/include/grub/net.h
|
||||
+++ grub-2.06/include/grub/net.h
|
||||
@@ -448,6 +448,66 @@ struct grub_net_bootp_packet
|
||||
--- a/include/grub/net.h
|
||||
+++ b/include/grub/net.h
|
||||
@@ -450,6 +450,66 @@
|
||||
grub_uint8_t vendor[0];
|
||||
} GRUB_PACKED;
|
||||
|
||||
@ -1092,7 +1086,7 @@ Index: grub-2.06/include/grub/net.h
|
||||
#define GRUB_NET_BOOTP_RFC1048_MAGIC_0 0x63
|
||||
#define GRUB_NET_BOOTP_RFC1048_MAGIC_1 0x82
|
||||
#define GRUB_NET_BOOTP_RFC1048_MAGIC_2 0x53
|
||||
@@ -483,6 +543,14 @@ grub_net_configure_by_dhcp_ack (const ch
|
||||
@@ -485,6 +545,14 @@
|
||||
grub_size_t size,
|
||||
int is_def, char **device, char **path);
|
||||
|
||||
@ -1107,7 +1101,7 @@ Index: grub-2.06/include/grub/net.h
|
||||
grub_err_t
|
||||
grub_net_add_ipv4_local (struct grub_net_network_level_interface *inf,
|
||||
int mask);
|
||||
@@ -491,6 +559,10 @@ void
|
||||
@@ -493,6 +561,10 @@
|
||||
grub_net_process_dhcp (struct grub_net_buff *nb,
|
||||
struct grub_net_network_level_interface *iface);
|
||||
|
||||
|
@ -1,161 +0,0 @@
|
||||
From 8bb57923d39f00b6f850cf6138ff5973cfd0d25f Mon Sep 17 00:00:00 2001
|
||||
From: Chris Coulson <chris.coulson@canonical.com>
|
||||
Date: Tue, 5 Apr 2022 10:58:28 +0100
|
||||
Subject: [PATCH 03/32] commands/boot: Add API to pass context to loader
|
||||
|
||||
Loaders rely on global variables for saving context which is consumed
|
||||
in the boot hook and freed in the unload hook. In the case where a loader
|
||||
command is executed twice, calling grub_loader_set() a second time executes
|
||||
the unload hook, but in some cases this runs when the loader's global
|
||||
context has already been updated, resulting in the updated context being
|
||||
freed and potential use-after-free bugs when the boot hook is subsequently
|
||||
called.
|
||||
|
||||
This adds a new API, grub_loader_set_ex(), which allows a loader to specify
|
||||
context that is passed to its boot and unload hooks. This is an alternative
|
||||
to requiring that loaders call grub_loader_unset() before mutating their
|
||||
global context.
|
||||
|
||||
Signed-off-by: Chris Coulson <chris.coulson@canonical.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/commands/boot.c | 66 ++++++++++++++++++++++++++++++++++-----
|
||||
include/grub/loader.h | 5 +++
|
||||
2 files changed, 63 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/grub-core/commands/boot.c b/grub-core/commands/boot.c
|
||||
index bbca81e947..61514788e2 100644
|
||||
--- a/grub-core/commands/boot.c
|
||||
+++ b/grub-core/commands/boot.c
|
||||
@@ -27,10 +27,20 @@
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
-static grub_err_t (*grub_loader_boot_func) (void);
|
||||
-static grub_err_t (*grub_loader_unload_func) (void);
|
||||
+static grub_err_t (*grub_loader_boot_func) (void *context);
|
||||
+static grub_err_t (*grub_loader_unload_func) (void *context);
|
||||
+static void *grub_loader_context;
|
||||
static int grub_loader_flags;
|
||||
|
||||
+struct grub_simple_loader_hooks
|
||||
+{
|
||||
+ grub_err_t (*boot) (void);
|
||||
+ grub_err_t (*unload) (void);
|
||||
+};
|
||||
+
|
||||
+/* Don't heap allocate this to avoid making grub_loader_set() fallible. */
|
||||
+static struct grub_simple_loader_hooks simple_loader_hooks;
|
||||
+
|
||||
struct grub_preboot
|
||||
{
|
||||
grub_err_t (*preboot_func) (int);
|
||||
@@ -44,6 +54,29 @@ static int grub_loader_loaded;
|
||||
static struct grub_preboot *preboots_head = 0,
|
||||
*preboots_tail = 0;
|
||||
|
||||
+static grub_err_t
|
||||
+grub_simple_boot_hook (void *context)
|
||||
+{
|
||||
+ struct grub_simple_loader_hooks *hooks;
|
||||
+
|
||||
+ hooks = (struct grub_simple_loader_hooks *) context;
|
||||
+ return hooks->boot ();
|
||||
+}
|
||||
+
|
||||
+static grub_err_t
|
||||
+grub_simple_unload_hook (void *context)
|
||||
+{
|
||||
+ struct grub_simple_loader_hooks *hooks;
|
||||
+ grub_err_t ret;
|
||||
+
|
||||
+ hooks = (struct grub_simple_loader_hooks *) context;
|
||||
+
|
||||
+ ret = hooks->unload ();
|
||||
+ grub_memset (hooks, 0, sizeof (*hooks));
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
int
|
||||
grub_loader_is_loaded (void)
|
||||
{
|
||||
@@ -110,28 +143,45 @@ grub_loader_unregister_preboot_hook (struct grub_preboot *hnd)
|
||||
}
|
||||
|
||||
void
|
||||
-grub_loader_set (grub_err_t (*boot) (void),
|
||||
- grub_err_t (*unload) (void),
|
||||
- int flags)
|
||||
+grub_loader_set_ex (grub_err_t (*boot) (void *context),
|
||||
+ grub_err_t (*unload) (void *context),
|
||||
+ void *context,
|
||||
+ int flags)
|
||||
{
|
||||
if (grub_loader_loaded && grub_loader_unload_func)
|
||||
- grub_loader_unload_func ();
|
||||
+ grub_loader_unload_func (grub_loader_context);
|
||||
|
||||
grub_loader_boot_func = boot;
|
||||
grub_loader_unload_func = unload;
|
||||
+ grub_loader_context = context;
|
||||
grub_loader_flags = flags;
|
||||
|
||||
grub_loader_loaded = 1;
|
||||
}
|
||||
|
||||
+void
|
||||
+grub_loader_set (grub_err_t (*boot) (void),
|
||||
+ grub_err_t (*unload) (void),
|
||||
+ int flags)
|
||||
+{
|
||||
+ grub_loader_set_ex (grub_simple_boot_hook,
|
||||
+ grub_simple_unload_hook,
|
||||
+ &simple_loader_hooks,
|
||||
+ flags);
|
||||
+
|
||||
+ simple_loader_hooks.boot = boot;
|
||||
+ simple_loader_hooks.unload = unload;
|
||||
+}
|
||||
+
|
||||
void
|
||||
grub_loader_unset(void)
|
||||
{
|
||||
if (grub_loader_loaded && grub_loader_unload_func)
|
||||
- grub_loader_unload_func ();
|
||||
+ grub_loader_unload_func (grub_loader_context);
|
||||
|
||||
grub_loader_boot_func = 0;
|
||||
grub_loader_unload_func = 0;
|
||||
+ grub_loader_context = 0;
|
||||
|
||||
grub_loader_loaded = 0;
|
||||
}
|
||||
@@ -158,7 +208,7 @@ grub_loader_boot (void)
|
||||
return err;
|
||||
}
|
||||
}
|
||||
- err = (grub_loader_boot_func) ();
|
||||
+ err = (grub_loader_boot_func) (grub_loader_context);
|
||||
|
||||
for (cur = preboots_tail; cur; cur = cur->prev)
|
||||
if (! err)
|
||||
diff --git a/include/grub/loader.h b/include/grub/loader.h
|
||||
index b208642821..97f2310545 100644
|
||||
--- a/include/grub/loader.h
|
||||
+++ b/include/grub/loader.h
|
||||
@@ -40,6 +40,11 @@ void EXPORT_FUNC (grub_loader_set) (grub_err_t (*boot) (void),
|
||||
grub_err_t (*unload) (void),
|
||||
int flags);
|
||||
|
||||
+void EXPORT_FUNC (grub_loader_set_ex) (grub_err_t (*boot) (void *context),
|
||||
+ grub_err_t (*unload) (void *context),
|
||||
+ void *context,
|
||||
+ int flags);
|
||||
+
|
||||
/* Unset current loader, if any. */
|
||||
void EXPORT_FUNC (grub_loader_unset) (void);
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
@ -1,32 +0,0 @@
|
||||
From 86fe3bbbf75e62387cc9842654fd6c852e9457a6 Mon Sep 17 00:00:00 2001
|
||||
From: Glenn Washburn <development@efficientek.com>
|
||||
Date: Thu, 9 Dec 2021 11:14:52 -0600
|
||||
Subject: [PATCH 03/14] cryptodisk: Return failure in cryptomount when no
|
||||
cryptodisk modules are loaded
|
||||
|
||||
This displays an error notifying the user that they'll want to load
|
||||
a backend module to make cryptomount useful.
|
||||
|
||||
Signed-off-by: Glenn Washburn <development@efficientek.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/disk/cryptodisk.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c
|
||||
index 9df3d310fe..27491871a5 100644
|
||||
--- a/grub-core/disk/cryptodisk.c
|
||||
+++ b/grub-core/disk/cryptodisk.c
|
||||
@@ -1125,6 +1125,9 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
if (argc < 1 && !state[1].set && !state[2].set)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "device name required");
|
||||
|
||||
+ if (grub_cryptodisk_list == NULL)
|
||||
+ return grub_error (GRUB_ERR_BAD_MODULE, "no cryptodisk modules loaded");
|
||||
+
|
||||
if (state[0].set)
|
||||
{
|
||||
int found_uuid;
|
||||
--
|
||||
2.34.1
|
||||
|
@ -0,0 +1,36 @@
|
||||
From 64494ffc442a5de05b237ad48d27c70d22849a44 Mon Sep 17 00:00:00 2001
|
||||
From: Gary Lin <glin@suse.com>
|
||||
Date: Thu, 3 Aug 2023 15:52:52 +0800
|
||||
Subject: [PATCH 3/4] cryptodisk: wipe out the cached keys from protectors
|
||||
|
||||
An attacker may insert a malicious disk with the same crypto UUID and
|
||||
trick grub2 to mount the fake root. Even though the key from the key
|
||||
protector fails to unlock the fake root, it's not wiped out cleanly so
|
||||
the attacker could dump the memory to retrieve the secret key. To defend
|
||||
such attack, wipe out the cached key when we don't need it.
|
||||
|
||||
Signed-off-by: Gary Lin <glin@suse.com>
|
||||
---
|
||||
grub-core/disk/cryptodisk.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c
|
||||
index cf37a0934..f42437f4e 100644
|
||||
--- a/grub-core/disk/cryptodisk.c
|
||||
+++ b/grub-core/disk/cryptodisk.c
|
||||
@@ -1348,7 +1348,11 @@ grub_cryptodisk_clear_key_cache (struct grub_cryptomount_args *cargs)
|
||||
return;
|
||||
|
||||
for (i = 0; cargs->protectors[i]; i++)
|
||||
- grub_free (cargs->key_cache[i].key);
|
||||
+ {
|
||||
+ if (cargs->key_cache[i].key)
|
||||
+ grub_memset (cargs->key_cache[i].key, 0, cargs->key_cache[i].key_len);
|
||||
+ grub_free (cargs->key_cache[i].key);
|
||||
+ }
|
||||
|
||||
grub_free (cargs->key_cache);
|
||||
}
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,71 +0,0 @@
|
||||
From 5b694a13545224c2d21afc3e94831be1bcc85770 Mon Sep 17 00:00:00 2001
|
||||
From: Fabian Vogt <fvogt@suse.de>
|
||||
Date: Tue, 14 Jun 2022 15:55:21 +0200
|
||||
Subject: [PATCH 03/10] disk/cryptodisk: When cheatmounting, use the sector
|
||||
info of the cheat device
|
||||
|
||||
When using grub-probe with cryptodisk, the mapped block device from the host
|
||||
is used directly instead of decrypting the source device in GRUB code.
|
||||
In that case, the sector size and count of the host device needs to be used.
|
||||
This is especially important when using luks2, which does not assign
|
||||
total_sectors and log_sector_size when scanning, but only later when the
|
||||
segments in the JSON area are evaluated. With an unset log_sector_size,
|
||||
grub_open_device complains.
|
||||
|
||||
This fixes grub-probe failing with
|
||||
"error: sector sizes of 1 bytes aren't supported yet."
|
||||
|
||||
Signed-off-by: Fabian Vogt <fvogt@suse.de>
|
||||
---
|
||||
grub-core/disk/cryptodisk.c | 20 ++++++++++++++++++--
|
||||
1 file changed, 18 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c
|
||||
index 6d22bf871c..ae8790f10f 100644
|
||||
--- a/grub-core/disk/cryptodisk.c
|
||||
+++ b/grub-core/disk/cryptodisk.c
|
||||
@@ -698,16 +698,31 @@ grub_cryptodisk_open (const char *name, grub_disk_t disk)
|
||||
if (!dev)
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "No such device");
|
||||
|
||||
- disk->log_sector_size = dev->log_sector_size;
|
||||
-
|
||||
#ifdef GRUB_UTIL
|
||||
if (dev->cheat)
|
||||
{
|
||||
+ grub_uint64_t cheat_dev_size;
|
||||
+ unsigned int cheat_log_sector_size;
|
||||
+
|
||||
if (!GRUB_UTIL_FD_IS_VALID (dev->cheat_fd))
|
||||
dev->cheat_fd = grub_util_fd_open (dev->cheat, GRUB_UTIL_FD_O_RDONLY);
|
||||
if (!GRUB_UTIL_FD_IS_VALID (dev->cheat_fd))
|
||||
return grub_error (GRUB_ERR_IO, N_("cannot open `%s': %s"),
|
||||
dev->cheat, grub_util_fd_strerror ());
|
||||
+
|
||||
+ /* Use the sector size and count of the cheat device */
|
||||
+ cheat_dev_size = grub_util_get_fd_size (dev->cheat_fd, dev->cheat, &cheat_log_sector_size);
|
||||
+ if (cheat_dev_size == -1)
|
||||
+ {
|
||||
+ const char *errmsg = grub_util_fd_strerror ();
|
||||
+ grub_util_fd_close (dev->cheat_fd);
|
||||
+ dev->cheat_fd = GRUB_UTIL_FD_INVALID;
|
||||
+ return grub_error (GRUB_ERR_IO, N_("failed to query size of device `%s': %s"),
|
||||
+ dev->cheat, errmsg);
|
||||
+ }
|
||||
+
|
||||
+ dev->log_sector_size = cheat_log_sector_size;
|
||||
+ dev->total_sectors = cheat_dev_size >> cheat_log_sector_size;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -721,6 +736,7 @@ grub_cryptodisk_open (const char *name, grub_disk_t disk)
|
||||
}
|
||||
|
||||
disk->data = dev;
|
||||
+ disk->log_sector_size = dev->log_sector_size;
|
||||
disk->total_sectors = dev->total_sectors;
|
||||
disk->max_agglomerate = GRUB_DISK_MAX_MAX_AGGLOMERATE;
|
||||
disk->id = dev->id;
|
||||
--
|
||||
2.34.1
|
||||
|
@ -1,260 +0,0 @@
|
||||
From 029c952f37dedb086c85bfb5fbc0de15cd4dbf0f Mon Sep 17 00:00:00 2001
|
||||
From: Lu Ken <ken.lu@intel.com>
|
||||
Date: Wed, 13 Jul 2022 10:06:12 +0800
|
||||
Subject: [PATCH 3/3] efi/tpm: Add EFI_CC_MEASUREMENT_PROTOCOL support
|
||||
|
||||
The EFI_CC_MEASUREMENT_PROTOCOL abstracts the measurement for virtual firmware
|
||||
in confidential computing environment. It is similar to the EFI_TCG2_PROTOCOL.
|
||||
It was proposed by Intel and ARM and approved by UEFI organization.
|
||||
|
||||
It is defined in Intel GHCI specification: https://cdrdv2.intel.com/v1/dl/getContent/726790 .
|
||||
The EDKII header file is available at https://github.com/tianocore/edk2/blob/master/MdePkg/Include/Protocol/CcMeasurement.h .
|
||||
|
||||
Signed-off-by: Lu Ken <ken.lu@intel.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/commands/efi/tpm.c | 48 +++++++++++
|
||||
include/grub/efi/cc.h | 151 +++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 199 insertions(+)
|
||||
create mode 100644 include/grub/efi/cc.h
|
||||
|
||||
diff --git a/grub-core/commands/efi/tpm.c b/grub-core/commands/efi/tpm.c
|
||||
index e032617d8..630fd8a82 100644
|
||||
--- a/grub-core/commands/efi/tpm.c
|
||||
+++ b/grub-core/commands/efi/tpm.c
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/efi/api.h>
|
||||
#include <grub/efi/efi.h>
|
||||
+#include <grub/efi/cc.h>
|
||||
#include <grub/efi/tpm.h>
|
||||
#include <grub/tpm2/tpm2.h>
|
||||
#include <grub/mm.h>
|
||||
@@ -32,6 +33,7 @@ typedef TCG_PCR_EVENT grub_tpm_event_t;
|
||||
|
||||
static grub_efi_guid_t tpm_guid = EFI_TPM_GUID;
|
||||
static grub_efi_guid_t tpm2_guid = EFI_TPM2_GUID;
|
||||
+static grub_efi_guid_t cc_measurement_guid = GRUB_EFI_CC_MEASUREMENT_PROTOCOL_GUID;
|
||||
|
||||
static grub_efi_handle_t *grub_tpm_handle;
|
||||
static grub_uint8_t grub_tpm_version;
|
||||
@@ -308,6 +310,50 @@ grub_tpm2_log_event (grub_efi_handle_t tpm_handle, unsigned char *buf,
|
||||
return grub_efi_log_event_status (status);
|
||||
}
|
||||
|
||||
+static void
|
||||
+grub_cc_log_event (unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
|
||||
+ const char *description)
|
||||
+{
|
||||
+ grub_efi_cc_event_t *event;
|
||||
+ grub_efi_status_t status;
|
||||
+ grub_efi_cc_protocol_t *cc;
|
||||
+ grub_efi_cc_mr_index_t mr;
|
||||
+
|
||||
+ cc = grub_efi_locate_protocol (&cc_measurement_guid, NULL);
|
||||
+ if (cc == NULL)
|
||||
+ return;
|
||||
+
|
||||
+ status = efi_call_3 (cc->map_pcr_to_mr_index, cc, pcr, &mr);
|
||||
+ if (status != GRUB_EFI_SUCCESS)
|
||||
+ {
|
||||
+ grub_efi_log_event_status (status);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ event = grub_zalloc (sizeof (grub_efi_cc_event_t) +
|
||||
+ grub_strlen (description) + 1);
|
||||
+ if (event == NULL)
|
||||
+ {
|
||||
+ grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("cannot allocate CC event buffer"));
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ event->Header.HeaderSize = sizeof (grub_efi_cc_event_header_t);
|
||||
+ event->Header.HeaderVersion = GRUB_EFI_CC_EVENT_HEADER_VERSION;
|
||||
+ event->Header.MrIndex = mr;
|
||||
+ event->Header.EventType = EV_IPL;
|
||||
+ event->Size = sizeof (*event) + grub_strlen (description) + 1;
|
||||
+ grub_strcpy ((char *) event->Event, description);
|
||||
+
|
||||
+ status = efi_call_5 (cc->hash_log_extend_event, cc, 0,
|
||||
+ (grub_efi_physical_address_t)(grub_addr_t) buf,
|
||||
+ (grub_efi_uint64_t) size, event);
|
||||
+ grub_free (event);
|
||||
+
|
||||
+ if (status != GRUB_EFI_SUCCESS)
|
||||
+ grub_efi_log_event_status (status);
|
||||
+}
|
||||
+
|
||||
grub_err_t
|
||||
grub_tpm_measure (unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
|
||||
const char *description)
|
||||
@@ -315,6 +361,8 @@ grub_tpm_measure (unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
|
||||
grub_efi_handle_t tpm_handle;
|
||||
grub_efi_uint8_t protocol_version;
|
||||
|
||||
+ grub_cc_log_event(buf, size, pcr, description);
|
||||
+
|
||||
if (!grub_tpm_handle_find (&tpm_handle, &protocol_version))
|
||||
return 0;
|
||||
|
||||
diff --git a/include/grub/efi/cc.h b/include/grub/efi/cc.h
|
||||
new file mode 100644
|
||||
index 000000000..896030689
|
||||
--- /dev/null
|
||||
+++ b/include/grub/efi/cc.h
|
||||
@@ -0,0 +1,151 @@
|
||||
+/*
|
||||
+ * GRUB -- GRand Unified Bootloader
|
||||
+ * Copyright (C) 2022 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 <http://www.gnu.org/licenses/>.
|
||||
+ */
|
||||
+
|
||||
+#ifndef GRUB_EFI_CC_H
|
||||
+#define GRUB_EFI_CC_H 1
|
||||
+
|
||||
+#include <grub/efi/api.h>
|
||||
+#include <grub/efi/efi.h>
|
||||
+#include <grub/err.h>
|
||||
+
|
||||
+#define GRUB_EFI_CC_MEASUREMENT_PROTOCOL_GUID \
|
||||
+ { 0x96751a3d, 0x72f4, 0x41a6, \
|
||||
+ { 0xa7, 0x94, 0xed, 0x5d, 0x0e, 0x67, 0xae, 0x6b } \
|
||||
+ };
|
||||
+
|
||||
+struct grub_efi_cc_version
|
||||
+{
|
||||
+ grub_efi_uint8_t Major;
|
||||
+ grub_efi_uint8_t Minor;
|
||||
+};
|
||||
+typedef struct grub_efi_cc_version grub_efi_cc_version_t;
|
||||
+
|
||||
+/* EFI_CC Type/SubType definition. */
|
||||
+#define GRUB_EFI_CC_TYPE_NONE 0
|
||||
+#define GRUB_EFI_CC_TYPE_SEV 1
|
||||
+#define GRUB_EFI_CC_TYPE_TDX 2
|
||||
+
|
||||
+struct grub_efi_cc_type
|
||||
+{
|
||||
+ grub_efi_uint8_t Type;
|
||||
+ grub_efi_uint8_t SubType;
|
||||
+};
|
||||
+typedef struct grub_efi_cc_type grub_efi_cc_type_t;
|
||||
+
|
||||
+typedef grub_efi_uint32_t grub_efi_cc_event_log_bitmap_t;
|
||||
+typedef grub_efi_uint32_t grub_efi_cc_event_log_format_t;
|
||||
+typedef grub_efi_uint32_t grub_efi_cc_event_algorithm_bitmap_t;
|
||||
+typedef grub_efi_uint32_t grub_efi_cc_mr_index_t;
|
||||
+
|
||||
+/* Intel TDX measure register index. */
|
||||
+#define GRUB_TDX_MR_INDEX_MRTD 0
|
||||
+#define GRUB_TDX_MR_INDEX_RTMR0 1
|
||||
+#define GRUB_TDX_MR_INDEX_RTMR1 2
|
||||
+#define GRUB_TDX_MR_INDEX_RTMR2 3
|
||||
+#define GRUB_TDX_MR_INDEX_RTMR3 4
|
||||
+
|
||||
+#define GRUB_EFI_CC_EVENT_LOG_FORMAT_TCG_2 0x00000002
|
||||
+#define GRUB_EFI_CC_BOOT_HASH_ALG_SHA384 0x00000004
|
||||
+#define GRUB_EFI_CC_EVENT_HEADER_VERSION 1
|
||||
+
|
||||
+struct grub_efi_cc_event_header
|
||||
+{
|
||||
+ /* Size of the event header itself (sizeof(EFI_TD_EVENT_HEADER)). */
|
||||
+ grub_efi_uint32_t HeaderSize;
|
||||
+
|
||||
+ /*
|
||||
+ * Header version. For this version of this specification,
|
||||
+ * the value shall be 1.
|
||||
+ */
|
||||
+ grub_efi_uint16_t HeaderVersion;
|
||||
+
|
||||
+ /* Index of the MR that shall be extended. */
|
||||
+ grub_efi_cc_mr_index_t MrIndex;
|
||||
+
|
||||
+ /* Type of the event that shall be extended (and optionally logged). */
|
||||
+ grub_efi_uint32_t EventType;
|
||||
+} GRUB_PACKED;
|
||||
+typedef struct grub_efi_cc_event_header grub_efi_cc_event_header_t;
|
||||
+
|
||||
+struct grub_efi_cc_event
|
||||
+{
|
||||
+ /* Total size of the event including the Size component, the header and the Event data. */
|
||||
+ grub_efi_uint32_t Size;
|
||||
+ grub_efi_cc_event_header_t Header;
|
||||
+ grub_efi_uint8_t Event[0];
|
||||
+} GRUB_PACKED;
|
||||
+typedef struct grub_efi_cc_event grub_efi_cc_event_t;
|
||||
+
|
||||
+struct grub_efi_cc_boot_service_capability
|
||||
+{
|
||||
+ /* Allocated size of the structure. */
|
||||
+ grub_efi_uint8_t Size;
|
||||
+
|
||||
+ /*
|
||||
+ * Version of the grub_efi_cc_boot_service_capability_t structure itself.
|
||||
+ * For this version of the protocol, the Major version shall be set to 1
|
||||
+ * and the Minor version shall be set to 1.
|
||||
+ */
|
||||
+ grub_efi_cc_version_t StructureVersion;
|
||||
+
|
||||
+ /*
|
||||
+ * Version of the EFI TD protocol.
|
||||
+ * For this version of the protocol, the Major version shall be set to 1
|
||||
+ * and the Minor version shall be set to 1.
|
||||
+ */
|
||||
+ grub_efi_cc_version_t ProtocolVersion;
|
||||
+
|
||||
+ /* Supported hash algorithms. */
|
||||
+ grub_efi_cc_event_algorithm_bitmap_t HashAlgorithmBitmap;
|
||||
+
|
||||
+ /* Bitmap of supported event log formats. */
|
||||
+ grub_efi_cc_event_log_bitmap_t SupportedEventLogs;
|
||||
+
|
||||
+ /* Indicates the CC type. */
|
||||
+ grub_efi_cc_type_t CcType;
|
||||
+};
|
||||
+typedef struct grub_efi_cc_boot_service_capability grub_efi_cc_boot_service_capability_t;
|
||||
+
|
||||
+struct grub_efi_cc_protocol
|
||||
+{
|
||||
+ grub_efi_status_t
|
||||
+ (*get_capability) (struct grub_efi_cc_protocol *this,
|
||||
+ grub_efi_cc_boot_service_capability_t *ProtocolCapability);
|
||||
+
|
||||
+ grub_efi_status_t
|
||||
+ (*get_event_log) (struct grub_efi_cc_protocol *this,
|
||||
+ grub_efi_cc_event_log_format_t EventLogFormat,
|
||||
+ grub_efi_physical_address_t *EventLogLocation,
|
||||
+ grub_efi_physical_address_t *EventLogLastEntry,
|
||||
+ grub_efi_boolean_t *EventLogTruncated);
|
||||
+
|
||||
+ grub_efi_status_t
|
||||
+ (*hash_log_extend_event) (struct grub_efi_cc_protocol *this,
|
||||
+ grub_efi_uint64_t Flags,
|
||||
+ grub_efi_physical_address_t DataToHash,
|
||||
+ grub_efi_uint64_t DataToHashLen,
|
||||
+ grub_efi_cc_event_t *EfiCcEvent);
|
||||
+
|
||||
+ grub_efi_status_t
|
||||
+ (*map_pcr_to_mr_index) (struct grub_efi_cc_protocol *this,
|
||||
+ grub_efi_uint32_t PcrIndex,
|
||||
+ grub_efi_cc_mr_index_t *MrIndex);
|
||||
+};
|
||||
+typedef struct grub_efi_cc_protocol grub_efi_cc_protocol_t;
|
||||
+
|
||||
+#endif
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,81 +0,0 @@
|
||||
From a63cbda5bbfa4696c97dc8231e7b81aedaef2fc7 Mon Sep 17 00:00:00 2001
|
||||
From: Zhang Boyang <zhangboyang.id@gmail.com>
|
||||
Date: Fri, 5 Aug 2022 01:58:27 +0800
|
||||
Subject: [PATCH 03/12] font: Fix several integer overflows in
|
||||
grub_font_construct_glyph()
|
||||
|
||||
This patch fixes several integer overflows in grub_font_construct_glyph().
|
||||
Glyphs of invalid size, zero or leading to an overflow, are rejected.
|
||||
The inconsistency between "glyph" and "max_glyph_size" when grub_malloc()
|
||||
returns NULL is fixed too.
|
||||
|
||||
Fixes: CVE-2022-2601
|
||||
|
||||
Reported-by: Zhang Boyang <zhangboyang.id@gmail.com>
|
||||
Signed-off-by: Zhang Boyang <zhangboyang.id@gmail.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/font/font.c | 29 +++++++++++++++++------------
|
||||
1 file changed, 17 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/grub-core/font/font.c b/grub-core/font/font.c
|
||||
index 6a3fbebbd..1fa181d4c 100644
|
||||
--- a/grub-core/font/font.c
|
||||
+++ b/grub-core/font/font.c
|
||||
@@ -1517,6 +1517,7 @@ grub_font_construct_glyph (grub_font_t hinted_font,
|
||||
struct grub_video_signed_rect bounds;
|
||||
static struct grub_font_glyph *glyph = 0;
|
||||
static grub_size_t max_glyph_size = 0;
|
||||
+ grub_size_t cur_glyph_size;
|
||||
|
||||
ensure_comb_space (glyph_id);
|
||||
|
||||
@@ -1533,29 +1534,33 @@ grub_font_construct_glyph (grub_font_t hinted_font,
|
||||
if (!glyph_id->ncomb && !glyph_id->attributes)
|
||||
return main_glyph;
|
||||
|
||||
- if (max_glyph_size < sizeof (*glyph) + (bounds.width * bounds.height + GRUB_CHAR_BIT - 1) / GRUB_CHAR_BIT)
|
||||
+ if (grub_video_bitmap_calc_1bpp_bufsz (bounds.width, bounds.height, &cur_glyph_size) ||
|
||||
+ grub_add (sizeof (*glyph), cur_glyph_size, &cur_glyph_size))
|
||||
+ return main_glyph;
|
||||
+
|
||||
+ if (max_glyph_size < cur_glyph_size)
|
||||
{
|
||||
grub_free (glyph);
|
||||
- max_glyph_size = (sizeof (*glyph) + (bounds.width * bounds.height + GRUB_CHAR_BIT - 1) / GRUB_CHAR_BIT) * 2;
|
||||
- if (max_glyph_size < 8)
|
||||
- max_glyph_size = 8;
|
||||
- glyph = grub_malloc (max_glyph_size);
|
||||
+ if (grub_mul (cur_glyph_size, 2, &max_glyph_size))
|
||||
+ max_glyph_size = 0;
|
||||
+ glyph = max_glyph_size > 0 ? grub_malloc (max_glyph_size) : NULL;
|
||||
}
|
||||
if (!glyph)
|
||||
{
|
||||
+ max_glyph_size = 0;
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
return main_glyph;
|
||||
}
|
||||
|
||||
- grub_memset (glyph, 0, sizeof (*glyph)
|
||||
- + (bounds.width * bounds.height
|
||||
- + GRUB_CHAR_BIT - 1) / GRUB_CHAR_BIT);
|
||||
+ grub_memset (glyph, 0, cur_glyph_size);
|
||||
|
||||
glyph->font = main_glyph->font;
|
||||
- glyph->width = bounds.width;
|
||||
- glyph->height = bounds.height;
|
||||
- glyph->offset_x = bounds.x;
|
||||
- glyph->offset_y = bounds.y;
|
||||
+ if (bounds.width == 0 || bounds.height == 0 ||
|
||||
+ grub_cast (bounds.width, &glyph->width) ||
|
||||
+ grub_cast (bounds.height, &glyph->height) ||
|
||||
+ grub_cast (bounds.x, &glyph->offset_x) ||
|
||||
+ grub_cast (bounds.y, &glyph->offset_y))
|
||||
+ return main_glyph;
|
||||
|
||||
if (glyph_id->attributes & GRUB_UNICODE_GLYPH_ATTRIBUTE_MIRROR)
|
||||
grub_font_blit_glyph_mirror (glyph, main_glyph,
|
||||
--
|
||||
2.35.3
|
||||
|
@ -22,8 +22,6 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
util/grub-install.c | 38 ++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 41 insertions(+)
|
||||
|
||||
diff --git a/include/grub/lib/envblk.h b/include/grub/lib/envblk.h
|
||||
index 83f3fcf841..d01927bcf7 100644
|
||||
--- a/include/grub/lib/envblk.h
|
||||
+++ b/include/grub/lib/envblk.h
|
||||
@@ -24,6 +24,9 @@
|
||||
@ -36,8 +34,6 @@ index 83f3fcf841..d01927bcf7 100644
|
||||
struct grub_envblk
|
||||
{
|
||||
char *buf;
|
||||
diff --git a/util/grub-install.c b/util/grub-install.c
|
||||
index 8fb5ea616b..7bc5f84378 100644
|
||||
--- a/util/grub-install.c
|
||||
+++ b/util/grub-install.c
|
||||
@@ -43,6 +43,7 @@
|
||||
@ -48,10 +44,10 @@ index 8fb5ea616b..7bc5f84378 100644
|
||||
|
||||
#include <string.h>
|
||||
|
||||
@@ -2112,6 +2113,43 @@ main (int argc, char *argv[])
|
||||
{
|
||||
grub_util_error ("%s", _("failed to copy Grub to the PReP partition"));
|
||||
}
|
||||
@@ -2138,6 +2139,43 @@
|
||||
if (write_to_disk (ins_dev, imgfile))
|
||||
grub_util_error ("%s", _("failed to copy Grub to the PReP partition"));
|
||||
grub_set_install_backup_ponr ();
|
||||
+
|
||||
+ if ((signed_grub_mode >= SIGNED_GRUB_FORCE) || ((signed_grub_mode == SIGNED_GRUB_AUTO) && (ppc_sb_state > 0)))
|
||||
+ {
|
||||
@ -92,6 +88,3 @@ index 8fb5ea616b..7bc5f84378 100644
|
||||
grub_device_close (ins_dev);
|
||||
if (update_nvram)
|
||||
grub_install_register_ieee1275 (1, grub_util_get_os_disk (install_device),
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
@ -1,263 +0,0 @@
|
||||
From bbfcae1cd408c4922ddcefc0528bfe19da845c90 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Axtens <dja@axtens.net>
|
||||
Date: Fri, 16 Apr 2021 11:48:46 +1000
|
||||
Subject: [PATCH 03/23] ieee1275: request memory with
|
||||
ibm,client-architecture-support
|
||||
|
||||
On PowerVM, the first time we boot a Linux partition, we may only get
|
||||
256MB of real memory area, even if the partition has more memory.
|
||||
|
||||
This isn't really enough. Fortunately, the Power Architecture Platform
|
||||
Reference (PAPR) defines a method we can call to ask for more memory.
|
||||
This is part of the broad and powerful ibm,client-architecture-support
|
||||
(CAS) method.
|
||||
|
||||
CAS can do an enormous amount of things on a PAPR platform: as well as
|
||||
asking for memory, you can set the supported processor level, the interrupt
|
||||
controller, hash vs radix mmu, and so on. We want to touch as little of
|
||||
this as possible because we don't want to step on the toes of the future OS.
|
||||
|
||||
If:
|
||||
|
||||
- we are running under what we think is PowerVM (compatible property of /
|
||||
begins with "IBM"), and
|
||||
|
||||
- the full amount of RMA is less than 512MB (as determined by the reg
|
||||
property of /memory)
|
||||
|
||||
then call CAS as follows: (refer to the Linux on Power Architecture
|
||||
Reference, LoPAR, which is public, at B.5.2.3):
|
||||
|
||||
- Use the "any" PVR value and supply 2 option vectors.
|
||||
|
||||
- Set option vector 1 (PowerPC Server Processor Architecture Level)
|
||||
to "ignore".
|
||||
|
||||
- Set option vector 2 with default or Linux-like options, including a
|
||||
min-rma-size of 512MB.
|
||||
|
||||
This will cause a CAS reboot and the partition will restart with 512MB
|
||||
of RMA. Grub will notice the 512MB and not call CAS again.
|
||||
|
||||
(A partition can be configured with only 256MB of memory, which would
|
||||
mean this request couldn't be satisfied, but PFW refuses to load with
|
||||
only 256MB of memory, so it's a bit moot. SLOF will run fine with 256MB,
|
||||
but we will never call CAS under qemu/SLOF because /compatible won't
|
||||
begin with "IBM".)
|
||||
|
||||
One of the first things Linux does while still running under OpenFirmware
|
||||
is to call CAS with a much fuller set of options (including asking for
|
||||
512MB of memory). This includes a much more restrictive set of PVR values
|
||||
and processor support levels, and this will induce another reboot. On this
|
||||
reboot grub will again notice the higher RMA, and not call CAS. We will get
|
||||
to Linux, Linux will call CAS but because the values are now set for Linux
|
||||
this will not induce another CAS reboot and we will finally boot.
|
||||
|
||||
On all subsequent boots, everything will be configured with 512MB of RMA
|
||||
and all the settings Linux likes, so there will be no further CAS reboots.
|
||||
|
||||
(phyp is super sticky with the RMA size - it persists even on cold boots.
|
||||
So if you've ever booted Linux in a partition, you'll probably never have
|
||||
grub call CAS. It'll only ever fire the first time a partition loads grub,
|
||||
or if you deliberately lower the amount of memory your partition has below
|
||||
512MB.)
|
||||
|
||||
Signed-off-by: Daniel Axtens <dja@axtens.net>
|
||||
---
|
||||
grub-core/kern/ieee1275/cmain.c | 3 +
|
||||
grub-core/kern/ieee1275/init.c | 140 +++++++++++++++++++++++++++++++
|
||||
include/grub/ieee1275/ieee1275.h | 8 +-
|
||||
3 files changed, 150 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/grub-core/kern/ieee1275/cmain.c b/grub-core/kern/ieee1275/cmain.c
|
||||
index e9a184657..ee63c7b71 100644
|
||||
--- a/grub-core/kern/ieee1275/cmain.c
|
||||
+++ b/grub-core/kern/ieee1275/cmain.c
|
||||
@@ -127,6 +127,9 @@ grub_ieee1275_find_options (void)
|
||||
break;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ if (grub_strncmp (tmp, "IBM,", 4) == 0)
|
||||
+ grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_CAN_TRY_CAS_FOR_MORE_MEMORY);
|
||||
}
|
||||
|
||||
if (is_smartfirmware)
|
||||
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
|
||||
index d661a8da5..446201165 100644
|
||||
--- a/grub-core/kern/ieee1275/init.c
|
||||
+++ b/grub-core/kern/ieee1275/init.c
|
||||
@@ -241,11 +241,151 @@ heap_init (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/* How much memory does OF believe it has? (regardless of whether
|
||||
+ it's accessible or not) */
|
||||
+static grub_err_t
|
||||
+grub_ieee1275_total_mem (grub_uint64_t *total)
|
||||
+{
|
||||
+ grub_ieee1275_phandle_t root;
|
||||
+ grub_ieee1275_phandle_t memory;
|
||||
+ grub_uint32_t reg[4];
|
||||
+ grub_ssize_t reg_size;
|
||||
+ grub_uint32_t address_cells = 1;
|
||||
+ grub_uint32_t size_cells = 1;
|
||||
+ grub_uint64_t size;
|
||||
+
|
||||
+ /* If we fail to get to the end, report 0. */
|
||||
+ *total = 0;
|
||||
+
|
||||
+ /* Determine the format of each entry in `reg'. */
|
||||
+ grub_ieee1275_finddevice ("/", &root);
|
||||
+ grub_ieee1275_get_integer_property (root, "#address-cells", &address_cells,
|
||||
+ sizeof address_cells, 0);
|
||||
+ grub_ieee1275_get_integer_property (root, "#size-cells", &size_cells,
|
||||
+ sizeof size_cells, 0);
|
||||
+
|
||||
+ if (size_cells > address_cells)
|
||||
+ address_cells = size_cells;
|
||||
+
|
||||
+ /* Load `/memory/reg'. */
|
||||
+ if (grub_ieee1275_finddevice ("/memory", &memory))
|
||||
+ return grub_error (GRUB_ERR_UNKNOWN_DEVICE,
|
||||
+ "couldn't find /memory node");
|
||||
+ if (grub_ieee1275_get_integer_property (memory, "reg", reg,
|
||||
+ sizeof reg, ®_size))
|
||||
+ return grub_error (GRUB_ERR_UNKNOWN_DEVICE,
|
||||
+ "couldn't examine /memory/reg property");
|
||||
+ if (reg_size < 0 || (grub_size_t) reg_size > sizeof (reg))
|
||||
+ return grub_error (GRUB_ERR_UNKNOWN_DEVICE,
|
||||
+ "/memory response buffer exceeded");
|
||||
+
|
||||
+ if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_BROKEN_ADDRESS_CELLS))
|
||||
+ {
|
||||
+ address_cells = 1;
|
||||
+ size_cells = 1;
|
||||
+ }
|
||||
+
|
||||
+ /* Decode only the size */
|
||||
+ size = reg[address_cells];
|
||||
+ if (size_cells == 2)
|
||||
+ size = (size << 32) | reg[address_cells + 1];
|
||||
+
|
||||
+ *total = size;
|
||||
+
|
||||
+ return grub_errno;
|
||||
+}
|
||||
+
|
||||
+/* Based on linux - arch/powerpc/kernel/prom_init.c */
|
||||
+struct option_vector2 {
|
||||
+ grub_uint8_t byte1;
|
||||
+ grub_uint16_t reserved;
|
||||
+ grub_uint32_t real_base;
|
||||
+ grub_uint32_t real_size;
|
||||
+ grub_uint32_t virt_base;
|
||||
+ grub_uint32_t virt_size;
|
||||
+ grub_uint32_t load_base;
|
||||
+ grub_uint32_t min_rma;
|
||||
+ grub_uint32_t min_load;
|
||||
+ grub_uint8_t min_rma_percent;
|
||||
+ grub_uint8_t max_pft_size;
|
||||
+} __attribute__((packed));
|
||||
+
|
||||
+struct pvr_entry {
|
||||
+ grub_uint32_t mask;
|
||||
+ grub_uint32_t entry;
|
||||
+};
|
||||
+
|
||||
+struct cas_vector {
|
||||
+ struct {
|
||||
+ struct pvr_entry terminal;
|
||||
+ } pvr_list;
|
||||
+ grub_uint8_t num_vecs;
|
||||
+ grub_uint8_t vec1_size;
|
||||
+ grub_uint8_t vec1;
|
||||
+ grub_uint8_t vec2_size;
|
||||
+ struct option_vector2 vec2;
|
||||
+} __attribute__((packed));
|
||||
+
|
||||
+/* Call ibm,client-architecture-support to try to get more RMA.
|
||||
+ We ask for 512MB which should be enough to verify a distro kernel.
|
||||
+ We ignore most errors: if we don't succeed we'll proceed with whatever
|
||||
+ memory we have. */
|
||||
+static void
|
||||
+grub_ieee1275_ibm_cas (void)
|
||||
+{
|
||||
+ int rc;
|
||||
+ grub_ieee1275_ihandle_t root;
|
||||
+ struct cas_args {
|
||||
+ struct grub_ieee1275_common_hdr common;
|
||||
+ grub_ieee1275_cell_t method;
|
||||
+ grub_ieee1275_ihandle_t ihandle;
|
||||
+ grub_ieee1275_cell_t cas_addr;
|
||||
+ grub_ieee1275_cell_t result;
|
||||
+ } args;
|
||||
+ struct cas_vector vector = {
|
||||
+ .pvr_list = { { 0x00000000, 0xffffffff } }, /* any processor */
|
||||
+ .num_vecs = 2 - 1,
|
||||
+ .vec1_size = 0,
|
||||
+ .vec1 = 0x80, /* ignore */
|
||||
+ .vec2_size = 1 + sizeof(struct option_vector2) - 2,
|
||||
+ .vec2 = {
|
||||
+ 0, 0, -1, -1, -1, -1, -1, 512, -1, 0, 48
|
||||
+ },
|
||||
+ };
|
||||
+
|
||||
+ INIT_IEEE1275_COMMON (&args.common, "call-method", 3, 2);
|
||||
+ args.method = (grub_ieee1275_cell_t)"ibm,client-architecture-support";
|
||||
+ rc = grub_ieee1275_open("/", &root);
|
||||
+ if (rc) {
|
||||
+ grub_error (GRUB_ERR_IO, "could not open root when trying to call CAS");
|
||||
+ return;
|
||||
+ }
|
||||
+ args.ihandle = root;
|
||||
+ args.cas_addr = (grub_ieee1275_cell_t)&vector;
|
||||
+
|
||||
+ grub_printf("Calling ibm,client-architecture-support...");
|
||||
+ IEEE1275_CALL_ENTRY_FN (&args);
|
||||
+ grub_printf("done\n");
|
||||
+
|
||||
+ grub_ieee1275_close(root);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
grub_claim_heap (void)
|
||||
{
|
||||
grub_uint32_t total = 0;
|
||||
|
||||
+ if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_CAN_TRY_CAS_FOR_MORE_MEMORY))
|
||||
+ {
|
||||
+ grub_uint64_t rma_size;
|
||||
+ grub_err_t err;
|
||||
+
|
||||
+ err = grub_ieee1275_total_mem (&rma_size);
|
||||
+ /* if we have an error, don't call CAS, just hope for the best */
|
||||
+ if (!err && rma_size < (512 * 1024 * 1024))
|
||||
+ grub_ieee1275_ibm_cas();
|
||||
+ }
|
||||
+
|
||||
grub_machine_mmap_iterate (heap_size, &total);
|
||||
|
||||
total = total / 4;
|
||||
diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h
|
||||
index debb7086a..591f4f12c 100644
|
||||
--- a/include/grub/ieee1275/ieee1275.h
|
||||
+++ b/include/grub/ieee1275/ieee1275.h
|
||||
@@ -155,7 +155,13 @@ enum grub_ieee1275_flag
|
||||
|
||||
GRUB_IEEE1275_FLAG_RAW_DEVNAMES,
|
||||
|
||||
- GRUB_IEEE1275_FLAG_DISABLE_VIDEO_SUPPORT
|
||||
+ GRUB_IEEE1275_FLAG_DISABLE_VIDEO_SUPPORT,
|
||||
+
|
||||
+ /* On PFW, the first time we boot a Linux partition, we may only get 256MB
|
||||
+ of real memory area, even if the partition has more memory. Set this flag
|
||||
+ if we think we're running under PFW. Then, if this flag is set, and the
|
||||
+ RMA is only 256MB in size, try asking for more with CAS. */
|
||||
+ GRUB_IEEE1275_FLAG_CAN_TRY_CAS_FOR_MORE_MEMORY,
|
||||
};
|
||||
|
||||
extern int EXPORT_FUNC(grub_ieee1275_test_flag) (enum grub_ieee1275_flag flag);
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,86 +0,0 @@
|
||||
From b4500ff77efe3b36256fae1e456ded65fd77cf04 Mon Sep 17 00:00:00 2001
|
||||
From: Patrick Steinhardt <ps@pks.im>
|
||||
Date: Thu, 21 Apr 2022 15:24:20 +1000
|
||||
Subject: [PATCH 3/5] kern/efi/mm: Extract function to add memory regions
|
||||
|
||||
In preparation of support for runtime-allocating additional memory
|
||||
region, this patch extracts the function to retrieve the EFI memory
|
||||
map and add a subset of it to GRUB's own memory regions.
|
||||
|
||||
Signed-off-by: Patrick Steinhardt <ps@pks.im>
|
||||
Signed-off-by: Daniel Axtens <dja@axtens.net>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
Tested-by: Patrick Steinhardt <ps@pks.im>
|
||||
---
|
||||
grub-core/kern/efi/mm.c | 21 +++++++++++++++------
|
||||
1 file changed, 15 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c
|
||||
index 2874522..087272f 100644
|
||||
--- a/grub-core/kern/efi/mm.c
|
||||
+++ b/grub-core/kern/efi/mm.c
|
||||
@@ -592,8 +592,8 @@ print_memory_map (grub_efi_memory_descriptor_t *memory_map,
|
||||
}
|
||||
#endif
|
||||
|
||||
-void
|
||||
-grub_efi_mm_init (void)
|
||||
+static grub_err_t
|
||||
+grub_efi_mm_add_regions (grub_size_t required_bytes)
|
||||
{
|
||||
grub_efi_memory_descriptor_t *memory_map;
|
||||
grub_efi_memory_descriptor_t *memory_map_end;
|
||||
@@ -606,7 +606,7 @@ grub_efi_mm_init (void)
|
||||
/* Prepare a memory region to store two memory maps. */
|
||||
memory_map = grub_efi_allocate_any_pages (2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE));
|
||||
if (! memory_map)
|
||||
- grub_fatal ("cannot allocate memory");
|
||||
+ return grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate memory for memory map");
|
||||
|
||||
/* Obtain descriptors for available memory. */
|
||||
map_size = MEMORY_MAP_SIZE;
|
||||
@@ -624,14 +624,14 @@ grub_efi_mm_init (void)
|
||||
|
||||
memory_map = grub_efi_allocate_any_pages (2 * BYTES_TO_PAGES (map_size));
|
||||
if (! memory_map)
|
||||
- grub_fatal ("cannot allocate memory");
|
||||
+ return grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate memory for new memory map");
|
||||
|
||||
mm_status = grub_efi_get_memory_map (&map_size, memory_map, 0,
|
||||
&desc_size, 0);
|
||||
}
|
||||
|
||||
if (mm_status < 0)
|
||||
- grub_fatal ("cannot get memory map");
|
||||
+ return grub_error (GRUB_ERR_OUT_OF_MEMORY, "error fetching memory map from EFI");
|
||||
|
||||
memory_map_end = NEXT_MEMORY_DESCRIPTOR (memory_map, map_size);
|
||||
|
||||
@@ -646,7 +646,7 @@ grub_efi_mm_init (void)
|
||||
|
||||
/* Allocate memory regions for GRUB's memory management. */
|
||||
add_memory_regions (filtered_memory_map, desc_size,
|
||||
- filtered_memory_map_end, BYTES_TO_PAGES (DEFAULT_HEAP_SIZE));
|
||||
+ filtered_memory_map_end, BYTES_TO_PAGES (required_bytes));
|
||||
|
||||
#if 0
|
||||
/* For debug. */
|
||||
@@ -664,6 +664,15 @@ grub_efi_mm_init (void)
|
||||
/* Release the memory maps. */
|
||||
grub_efi_free_pages ((grub_addr_t) memory_map,
|
||||
2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE));
|
||||
+
|
||||
+ return GRUB_ERR_NONE;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+grub_efi_mm_init (void)
|
||||
+{
|
||||
+ if (grub_efi_mm_add_regions (DEFAULT_HEAP_SIZE) != GRUB_ERR_NONE)
|
||||
+ grub_fatal ("%s", grub_errmsg);
|
||||
}
|
||||
|
||||
#if defined (__aarch64__) || defined (__arm__) || defined (__riscv)
|
||||
--
|
||||
2.35.3
|
||||
|
@ -133,15 +133,12 @@ Signed-off-by: Gary Lin <glin@suse.com>
|
||||
create mode 100644 include/grub/tpm2/internal/args.h
|
||||
create mode 100644 include/grub/tpm2/tpm2key.h
|
||||
|
||||
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
|
||||
index 0335d9add..4a8ff26a8 100644
|
||||
--- a/grub-core/Makefile.core.def
|
||||
+++ b/grub-core/Makefile.core.def
|
||||
@@ -2525,6 +2525,19 @@ module = {
|
||||
enable = efi;
|
||||
@@ -2599,6 +2599,19 @@
|
||||
};
|
||||
|
||||
+module = {
|
||||
module = {
|
||||
+ name = tpm2;
|
||||
+ common = tpm2/args.c;
|
||||
+ common = tpm2/buffer.c;
|
||||
@ -154,12 +151,10 @@ index 0335d9add..4a8ff26a8 100644
|
||||
+ enable = efi;
|
||||
+};
|
||||
+
|
||||
module = {
|
||||
+module = {
|
||||
name = tr;
|
||||
common = commands/tr.c;
|
||||
diff --git a/grub-core/tpm2/args.c b/grub-core/tpm2/args.c
|
||||
new file mode 100644
|
||||
index 000000000..0113f64a8
|
||||
};
|
||||
--- /dev/null
|
||||
+++ b/grub-core/tpm2/args.c
|
||||
@@ -0,0 +1,131 @@
|
||||
@ -294,9 +289,6 @@ index 000000000..0113f64a8
|
||||
+
|
||||
+ return GRUB_ERR_NONE;
|
||||
+}
|
||||
diff --git a/grub-core/tpm2/module.c b/grub-core/tpm2/module.c
|
||||
new file mode 100644
|
||||
index 000000000..5274296b7
|
||||
--- /dev/null
|
||||
+++ b/grub-core/tpm2/module.c
|
||||
@@ -0,0 +1,1033 @@
|
||||
@ -1333,9 +1325,6 @@ index 000000000..5274296b7
|
||||
+ grub_unregister_extcmd (grub_tpm2_protector_clear_cmd);
|
||||
+ grub_unregister_extcmd (grub_tpm2_protector_init_cmd);
|
||||
+}
|
||||
diff --git a/grub-core/tpm2/tpm2key.asn b/grub-core/tpm2/tpm2key.asn
|
||||
new file mode 100644
|
||||
index 000000000..e3b6a03e0
|
||||
--- /dev/null
|
||||
+++ b/grub-core/tpm2/tpm2key.asn
|
||||
@@ -0,0 +1,31 @@
|
||||
@ -1370,9 +1359,6 @@ index 000000000..e3b6a03e0
|
||||
+}
|
||||
+
|
||||
+END
|
||||
diff --git a/grub-core/tpm2/tpm2key.c b/grub-core/tpm2/tpm2key.c
|
||||
new file mode 100644
|
||||
index 000000000..62f6d865b
|
||||
--- /dev/null
|
||||
+++ b/grub-core/tpm2/tpm2key.c
|
||||
@@ -0,0 +1,440 @@
|
||||
@ -1816,9 +1802,6 @@ index 000000000..62f6d865b
|
||||
+ grub_free (authpol);
|
||||
+ }
|
||||
+}
|
||||
diff --git a/grub-core/tpm2/tpm2key_asn1_tab.c b/grub-core/tpm2/tpm2key_asn1_tab.c
|
||||
new file mode 100644
|
||||
index 000000000..551fc46ec
|
||||
--- /dev/null
|
||||
+++ b/grub-core/tpm2/tpm2key_asn1_tab.c
|
||||
@@ -0,0 +1,41 @@
|
||||
@ -1863,9 +1846,6 @@ index 000000000..551fc46ec
|
||||
+ { "privkey", 7, NULL },
|
||||
+ { NULL, 0, NULL }
|
||||
+};
|
||||
diff --git a/include/grub/tpm2/internal/args.h b/include/grub/tpm2/internal/args.h
|
||||
new file mode 100644
|
||||
index 000000000..df3341913
|
||||
--- /dev/null
|
||||
+++ b/include/grub/tpm2/internal/args.h
|
||||
@@ -0,0 +1,39 @@
|
||||
@ -1908,9 +1888,6 @@ index 000000000..df3341913
|
||||
+grub_tpm2_protector_parse_tpm_handle (const char *value, TPM_HANDLE *handle);
|
||||
+
|
||||
+#endif /* ! GRUB_TPM2_INTERNAL_ARGS_HEADER */
|
||||
diff --git a/include/grub/tpm2/tpm2key.h b/include/grub/tpm2/tpm2key.h
|
||||
new file mode 100644
|
||||
index 000000000..df46203e3
|
||||
--- /dev/null
|
||||
+++ b/include/grub/tpm2/tpm2key.h
|
||||
@@ -0,0 +1,83 @@
|
||||
@ -1997,6 +1974,3 @@ index 000000000..df46203e3
|
||||
+grub_tpm2key_free_authpolicy_seq (tpm2key_authpolicy_t authpol_seq);
|
||||
+
|
||||
+#endif /* GRUB_TPM2_TPM2KEY_HEADER */
|
||||
--
|
||||
2.35.3
|
||||
|
||||
|
@ -1,51 +0,0 @@
|
||||
From 0b1b1666ecd98d577cb72b3f4acdbe3af2e86a84 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Chang <mchang@suse.com>
|
||||
Date: Wed, 16 Mar 2022 17:59:30 +0800
|
||||
Subject: [PATCH 3/3] reed_solomon: Fix array subscript 0 is outside array
|
||||
bounds
|
||||
|
||||
The grub_absolute_pointer() is a compound expression that can only work
|
||||
within a function. We are out of luck here when the pointer variables
|
||||
require global definition due to ATTRIBUTE_TEXT that have to use fully
|
||||
initialized global definition because of the way linkers work.
|
||||
|
||||
static gf_single_t * const gf_powx ATTRIBUTE_TEXT = (void *) 0x100000;
|
||||
|
||||
For the reason given above, use gcc diagnostic pragmas to suppress the
|
||||
array-bounds warning.
|
||||
|
||||
Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
---
|
||||
grub-core/lib/reed_solomon.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/grub-core/lib/reed_solomon.c b/grub-core/lib/reed_solomon.c
|
||||
index 467305b46a..817db6a234 100644
|
||||
--- a/grub-core/lib/reed_solomon.c
|
||||
+++ b/grub-core/lib/reed_solomon.c
|
||||
@@ -102,6 +102,11 @@ static gf_single_t errvals[256];
|
||||
static gf_single_t eqstat[65536 + 256];
|
||||
#endif
|
||||
|
||||
+#if __GNUC__ == 12
|
||||
+#pragma GCC diagnostic push
|
||||
+#pragma GCC diagnostic ignored "-Warray-bounds"
|
||||
+#endif
|
||||
+
|
||||
static gf_single_t
|
||||
gf_mul (gf_single_t a, gf_single_t b)
|
||||
{
|
||||
@@ -319,6 +324,10 @@ decode_block (gf_single_t *ptr, grub_size_t s,
|
||||
}
|
||||
}
|
||||
|
||||
+#if __GNUC__ == 12
|
||||
+#pragma GCC diagnostic pop
|
||||
+#endif
|
||||
+
|
||||
#if !defined (STANDALONE)
|
||||
static void
|
||||
encode_block (gf_single_t *ptr, grub_size_t s,
|
||||
--
|
||||
2.34.1
|
||||
|
@ -51,8 +51,6 @@ Platform Reference (PAPR).
|
||||
util/mkimage.c | 13 +++++++------
|
||||
6 files changed, 76 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/include/grub/util/install.h b/include/grub/util/install.h
|
||||
index 9e83e1339..0b2e8a06d 100644
|
||||
--- a/include/grub/util/install.h
|
||||
+++ b/include/grub/util/install.h
|
||||
@@ -67,6 +67,9 @@
|
||||
@ -65,7 +63,7 @@ index 9e83e1339..0b2e8a06d 100644
|
||||
{ "verbose", 'v', 0, 0, \
|
||||
N_("print verbose messages."), 1 }
|
||||
|
||||
@@ -129,7 +132,8 @@ enum grub_install_options {
|
||||
@@ -130,7 +133,8 @@
|
||||
GRUB_INSTALL_OPTIONS_INSTALL_CORE_COMPRESS,
|
||||
GRUB_INSTALL_OPTIONS_DTB,
|
||||
GRUB_INSTALL_OPTIONS_SBAT,
|
||||
@ -75,7 +73,7 @@ index 9e83e1339..0b2e8a06d 100644
|
||||
};
|
||||
|
||||
extern char *grub_install_source_directory;
|
||||
@@ -189,7 +193,7 @@ grub_install_generate_image (const char *dir, const char *prefix,
|
||||
@@ -190,7 +194,7 @@
|
||||
size_t npubkeys,
|
||||
char *config_path,
|
||||
const struct grub_install_image_target_desc *image_target,
|
||||
@ -84,11 +82,9 @@ index 9e83e1339..0b2e8a06d 100644
|
||||
grub_compression_t comp, const char *dtb_file,
|
||||
const char *sbat_path, const int disable_shim_lock);
|
||||
|
||||
diff --git a/include/grub/util/mkimage.h b/include/grub/util/mkimage.h
|
||||
index 3819a6744..6f1da89b9 100644
|
||||
--- a/include/grub/util/mkimage.h
|
||||
+++ b/include/grub/util/mkimage.h
|
||||
@@ -51,12 +51,12 @@ grub_mkimage_load_image64 (const char *kernel_path,
|
||||
@@ -51,12 +51,12 @@
|
||||
const struct grub_install_image_target_desc *image_target);
|
||||
void
|
||||
grub_mkimage_generate_elf32 (const struct grub_install_image_target_desc *image_target,
|
||||
@ -103,11 +99,9 @@ index 3819a6744..6f1da89b9 100644
|
||||
Elf64_Addr target_addr,
|
||||
struct grub_mkimage_layout *layout);
|
||||
|
||||
diff --git a/util/grub-install-common.c b/util/grub-install-common.c
|
||||
index c6c561292..954df20eb 100644
|
||||
--- a/util/grub-install-common.c
|
||||
+++ b/util/grub-install-common.c
|
||||
@@ -461,10 +461,12 @@ static size_t npubkeys;
|
||||
@@ -466,10 +466,12 @@
|
||||
static char *sbat;
|
||||
static int disable_shim_lock;
|
||||
static grub_compression_t compression;
|
||||
@ -119,8 +113,8 @@ index c6c561292..954df20eb 100644
|
||||
+ const char *end;
|
||||
switch (key)
|
||||
{
|
||||
case 'C':
|
||||
@@ -562,6 +564,12 @@ grub_install_parse (int key, char *arg)
|
||||
case GRUB_INSTALL_OPTIONS_INSTALL_CORE_COMPRESS:
|
||||
@@ -567,6 +569,12 @@
|
||||
grub_util_error (_("Unrecognized compression `%s'"), arg);
|
||||
case GRUB_INSTALL_OPTIONS_GRUB_MKIMAGE:
|
||||
return 1;
|
||||
@ -133,7 +127,7 @@ index c6c561292..954df20eb 100644
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -661,10 +669,11 @@ grub_install_make_image_wrap_file (const char *dir, const char *prefix,
|
||||
@@ -666,10 +674,11 @@
|
||||
" --output '%s' "
|
||||
" --dtb '%s' "
|
||||
"--sbat '%s' "
|
||||
@ -147,7 +141,7 @@ index c6c561292..954df20eb 100644
|
||||
disable_shim_lock ? "--disable-shim-lock" : "", s);
|
||||
free (s);
|
||||
|
||||
@@ -675,7 +684,7 @@ grub_install_make_image_wrap_file (const char *dir, const char *prefix,
|
||||
@@ -680,7 +689,7 @@
|
||||
grub_install_generate_image (dir, prefix, fp, outname,
|
||||
modules.entries, memdisk_path,
|
||||
pubkeys, npubkeys, config_path, tgt,
|
||||
@ -156,11 +150,9 @@ index c6c561292..954df20eb 100644
|
||||
disable_shim_lock);
|
||||
while (dc--)
|
||||
grub_install_pop_module ();
|
||||
diff --git a/util/grub-mkimage.c b/util/grub-mkimage.c
|
||||
index c0d559937..d01eaeb84 100644
|
||||
--- a/util/grub-mkimage.c
|
||||
+++ b/util/grub-mkimage.c
|
||||
@@ -84,6 +84,7 @@ static struct argp_option options[] = {
|
||||
@@ -84,6 +84,7 @@
|
||||
{"sbat", 's', N_("FILE"), 0, N_("SBAT metadata"), 0},
|
||||
{"disable-shim-lock", GRUB_INSTALL_OPTIONS_DISABLE_SHIM_LOCK, 0, 0, N_("disable shim_lock verifier"), 0},
|
||||
{"verbose", 'v', 0, 0, N_("print verbose messages."), 0},
|
||||
@ -168,7 +160,7 @@ index c0d559937..d01eaeb84 100644
|
||||
{ 0, 0, 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
@@ -128,6 +129,7 @@ struct arguments
|
||||
@@ -128,6 +129,7 @@
|
||||
char *sbat;
|
||||
int note;
|
||||
int disable_shim_lock;
|
||||
@ -176,7 +168,7 @@ index c0d559937..d01eaeb84 100644
|
||||
const struct grub_install_image_target_desc *image_target;
|
||||
grub_compression_t comp;
|
||||
};
|
||||
@@ -138,6 +140,7 @@ argp_parser (int key, char *arg, struct argp_state *state)
|
||||
@@ -138,6 +140,7 @@
|
||||
/* Get the input argument from argp_parse, which we
|
||||
know is a pointer to our arguments structure. */
|
||||
struct arguments *arguments = state->input;
|
||||
@ -184,7 +176,7 @@ index c0d559937..d01eaeb84 100644
|
||||
|
||||
switch (key)
|
||||
{
|
||||
@@ -170,6 +173,13 @@ argp_parser (int key, char *arg, struct argp_state *state)
|
||||
@@ -170,6 +173,13 @@
|
||||
arguments->note = 1;
|
||||
break;
|
||||
|
||||
@ -198,7 +190,7 @@ index c0d559937..d01eaeb84 100644
|
||||
case 'm':
|
||||
if (arguments->memdisk)
|
||||
free (arguments->memdisk);
|
||||
@@ -324,6 +334,7 @@ main (int argc, char *argv[])
|
||||
@@ -324,6 +334,7 @@
|
||||
arguments.memdisk, arguments.pubkeys,
|
||||
arguments.npubkeys, arguments.config,
|
||||
arguments.image_target, arguments.note,
|
||||
@ -206,11 +198,9 @@ index c0d559937..d01eaeb84 100644
|
||||
arguments.comp, arguments.dtb,
|
||||
arguments.sbat, arguments.disable_shim_lock);
|
||||
|
||||
diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c
|
||||
index d78fa3e53..393119486 100644
|
||||
--- a/util/grub-mkimagexx.c
|
||||
+++ b/util/grub-mkimagexx.c
|
||||
@@ -84,6 +84,15 @@ struct grub_ieee1275_note
|
||||
@@ -85,6 +85,15 @@
|
||||
struct grub_ieee1275_note_desc descriptor;
|
||||
};
|
||||
|
||||
@ -226,7 +216,7 @@ index d78fa3e53..393119486 100644
|
||||
#define GRUB_XEN_NOTE_NAME "Xen"
|
||||
|
||||
struct fixup_block_list
|
||||
@@ -207,7 +216,7 @@ grub_arm_reloc_jump24 (grub_uint32_t *target, Elf32_Addr sym_addr)
|
||||
@@ -208,7 +217,7 @@
|
||||
|
||||
void
|
||||
SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc *image_target,
|
||||
@ -235,7 +225,7 @@ index d78fa3e53..393119486 100644
|
||||
Elf_Addr target_addr,
|
||||
struct grub_mkimage_layout *layout)
|
||||
{
|
||||
@@ -221,6 +230,12 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc
|
||||
@@ -222,6 +231,12 @@
|
||||
int shnum = 4;
|
||||
int string_size = sizeof (".text") + sizeof ("mods") + 1;
|
||||
|
||||
@ -248,7 +238,7 @@ index d78fa3e53..393119486 100644
|
||||
if (image_target->id != IMAGE_LOONGSON_ELF)
|
||||
phnum += 2;
|
||||
|
||||
@@ -484,6 +499,28 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc
|
||||
@@ -485,6 +500,28 @@
|
||||
phdr->p_offset = grub_host_to_target32 (header_size + program_size);
|
||||
}
|
||||
|
||||
@ -277,11 +267,9 @@ index d78fa3e53..393119486 100644
|
||||
{
|
||||
char *str_start = (elf_img + sizeof (*ehdr) + phnum * sizeof (*phdr)
|
||||
+ shnum * sizeof (*shdr));
|
||||
diff --git a/util/mkimage.c b/util/mkimage.c
|
||||
index a26cf76f7..d2cb33883 100644
|
||||
--- a/util/mkimage.c
|
||||
+++ b/util/mkimage.c
|
||||
@@ -869,8 +869,9 @@ grub_install_generate_image (const char *dir, const char *prefix,
|
||||
@@ -885,8 +885,9 @@
|
||||
char *memdisk_path, char **pubkey_paths,
|
||||
size_t npubkeys, char *config_path,
|
||||
const struct grub_install_image_target_desc *image_target,
|
||||
@ -293,7 +281,7 @@ index a26cf76f7..d2cb33883 100644
|
||||
{
|
||||
char *kernel_img, *core_img;
|
||||
size_t total_module_size, core_size;
|
||||
@@ -1773,11 +1774,11 @@ grub_install_generate_image (const char *dir, const char *prefix,
|
||||
@@ -1810,11 +1811,11 @@
|
||||
else
|
||||
target_addr = image_target->link_addr;
|
||||
if (image_target->voidp_sizeof == 4)
|
||||
@ -309,6 +297,3 @@ index a26cf76f7..d2cb33883 100644
|
||||
}
|
||||
break;
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
@ -27,7 +27,7 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
|
||||
--- a/grub-core/Makefile.core.def
|
||||
+++ b/grub-core/Makefile.core.def
|
||||
@@ -2624,3 +2624,9 @@
|
||||
@@ -2673,3 +2673,9 @@
|
||||
common = lib/libtasn1_wrap/tests/Test_strings.c;
|
||||
common = lib/libtasn1_wrap/wrap_tests.c;
|
||||
};
|
||||
@ -99,7 +99,7 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
+ if (grub_disk_read (dev->disk, p->offset, p->index,
|
||||
+ sizeof (gptdata), &gptdata) == 0)
|
||||
+ {
|
||||
+ const grub_gpt_part_guid_t template = {
|
||||
+ const grub_guid_t template = {
|
||||
+ grub_cpu_to_le32_compile_time (0x9e1a2d38),
|
||||
+ grub_cpu_to_le16_compile_time (0xc612),
|
||||
+ grub_cpu_to_le16_compile_time (0x4316),
|
||||
|
@ -33,11 +33,9 @@ Signed-off-by: Peter Jones <pjones@redhat.com>
|
||||
include/grub/x86_64/efi/memory.h | 4 +++-
|
||||
7 files changed, 28 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c
|
||||
index 4ff75a8ce..67a691d89 100644
|
||||
--- a/grub-core/kern/efi/mm.c
|
||||
+++ b/grub-core/kern/efi/mm.c
|
||||
@@ -122,7 +122,7 @@ grub_efi_allocate_pages_max (grub_efi_physical_address_t max,
|
||||
@@ -121,7 +121,7 @@
|
||||
grub_efi_boot_services_t *b;
|
||||
grub_efi_physical_address_t address = max;
|
||||
|
||||
@ -46,7 +44,7 @@ index 4ff75a8ce..67a691d89 100644
|
||||
return 0;
|
||||
|
||||
b = grub_efi_system_table->boot_services;
|
||||
@@ -480,7 +480,7 @@ filter_memory_map (grub_efi_memory_descriptor_t *memory_map,
|
||||
@@ -481,7 +481,7 @@
|
||||
{
|
||||
if (desc->type == GRUB_EFI_CONVENTIONAL_MEMORY
|
||||
#if 1
|
||||
@ -55,7 +53,7 @@ index 4ff75a8ce..67a691d89 100644
|
||||
#endif
|
||||
&& desc->physical_start + PAGES_TO_BYTES (desc->num_pages) > 0x100000
|
||||
&& desc->num_pages != 0)
|
||||
@@ -498,9 +498,9 @@ filter_memory_map (grub_efi_memory_descriptor_t *memory_map,
|
||||
@@ -499,9 +499,9 @@
|
||||
#if 1
|
||||
if (BYTES_TO_PAGES (filtered_desc->physical_start)
|
||||
+ filtered_desc->num_pages
|
||||
@ -67,8 +65,6 @@ index 4ff75a8ce..67a691d89 100644
|
||||
- BYTES_TO_PAGES (filtered_desc->physical_start));
|
||||
#endif
|
||||
|
||||
diff --git a/grub-core/loader/i386/efi/linux.c b/grub-core/loader/i386/efi/linux.c
|
||||
index 0b3d20875..f3abbd025 100644
|
||||
--- a/grub-core/loader/i386/efi/linux.c
|
||||
+++ b/grub-core/loader/i386/efi/linux.c
|
||||
@@ -27,6 +27,7 @@
|
||||
@ -79,7 +75,7 @@ index 0b3d20875..f3abbd025 100644
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
@@ -102,8 +103,9 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||
@@ -102,8 +103,9 @@
|
||||
size += ALIGN_UP (grub_file_size (files[i]), 4);
|
||||
}
|
||||
|
||||
@ -91,7 +87,7 @@ index 0b3d20875..f3abbd025 100644
|
||||
if (!initrd_mem)
|
||||
{
|
||||
grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("can't allocate initrd"));
|
||||
@@ -187,8 +189,11 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
@@ -187,8 +189,11 @@
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@ -104,7 +100,7 @@ index 0b3d20875..f3abbd025 100644
|
||||
if (! params)
|
||||
{
|
||||
grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate kernel parameters");
|
||||
@@ -258,8 +263,11 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
@@ -258,8 +263,11 @@
|
||||
#endif
|
||||
|
||||
grub_dprintf ("linux", "setting up cmdline\n");
|
||||
@ -118,7 +114,7 @@ index 0b3d20875..f3abbd025 100644
|
||||
if (!linux_cmdline)
|
||||
{
|
||||
grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("can't allocate cmdline"));
|
||||
@@ -285,11 +293,12 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||
@@ -285,11 +293,12 @@
|
||||
|
||||
kernel_mem = grub_efi_allocate_pages_max(lh->pref_address,
|
||||
BYTES_TO_PAGES(lh->init_size));
|
||||
@ -134,8 +130,6 @@ index 0b3d20875..f3abbd025 100644
|
||||
if (!kernel_mem)
|
||||
{
|
||||
grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("can't allocate kernel"));
|
||||
diff --git a/include/grub/arm/efi/memory.h b/include/grub/arm/efi/memory.h
|
||||
index 2c64918e3..a4c2ec835 100644
|
||||
--- a/include/grub/arm/efi/memory.h
|
||||
+++ b/include/grub/arm/efi/memory.h
|
||||
@@ -2,5 +2,6 @@
|
||||
@ -145,8 +139,6 @@ index 2c64918e3..a4c2ec835 100644
|
||||
+#define GRUB_EFI_MAX_ALLOCATION_ADDRESS GRUB_EFI_MAX_USABLE_ADDRESS
|
||||
|
||||
#endif /* ! GRUB_MEMORY_CPU_HEADER */
|
||||
diff --git a/include/grub/arm64/efi/memory.h b/include/grub/arm64/efi/memory.h
|
||||
index c6cb32417..acb61dca4 100644
|
||||
--- a/include/grub/arm64/efi/memory.h
|
||||
+++ b/include/grub/arm64/efi/memory.h
|
||||
@@ -2,5 +2,6 @@
|
||||
@ -156,8 +148,6 @@ index c6cb32417..acb61dca4 100644
|
||||
+#define GRUB_EFI_MAX_ALLOCATION_ADDRESS GRUB_EFI_MAX_USABLE_ADDRESS
|
||||
|
||||
#endif /* ! GRUB_MEMORY_CPU_HEADER */
|
||||
diff --git a/include/grub/i386/efi/memory.h b/include/grub/i386/efi/memory.h
|
||||
index 2c64918e3..a4c2ec835 100644
|
||||
--- a/include/grub/i386/efi/memory.h
|
||||
+++ b/include/grub/i386/efi/memory.h
|
||||
@@ -2,5 +2,6 @@
|
||||
@ -167,8 +157,6 @@ index 2c64918e3..a4c2ec835 100644
|
||||
+#define GRUB_EFI_MAX_ALLOCATION_ADDRESS GRUB_EFI_MAX_USABLE_ADDRESS
|
||||
|
||||
#endif /* ! GRUB_MEMORY_CPU_HEADER */
|
||||
diff --git a/include/grub/ia64/efi/memory.h b/include/grub/ia64/efi/memory.h
|
||||
index 2c64918e3..a4c2ec835 100644
|
||||
--- a/include/grub/ia64/efi/memory.h
|
||||
+++ b/include/grub/ia64/efi/memory.h
|
||||
@@ -2,5 +2,6 @@
|
||||
@ -178,8 +166,6 @@ index 2c64918e3..a4c2ec835 100644
|
||||
+#define GRUB_EFI_MAX_ALLOCATION_ADDRESS GRUB_EFI_MAX_USABLE_ADDRESS
|
||||
|
||||
#endif /* ! GRUB_MEMORY_CPU_HEADER */
|
||||
diff --git a/include/grub/x86_64/efi/memory.h b/include/grub/x86_64/efi/memory.h
|
||||
index 46e9145a3..e81cfb322 100644
|
||||
--- a/include/grub/x86_64/efi/memory.h
|
||||
+++ b/include/grub/x86_64/efi/memory.h
|
||||
@@ -2,9 +2,11 @@
|
||||
@ -195,6 +181,3 @@ index 46e9145a3..e81cfb322 100644
|
||||
#endif
|
||||
|
||||
#endif /* ! GRUB_MEMORY_CPU_HEADER */
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
@ -77,11 +77,9 @@ Signed-off-by: Michael Chang <mchang@suse.com>
|
||||
grub-core/loader/arm64/efi/linux.c | 78 ++++++++++++++++++++++--------
|
||||
2 files changed, 84 insertions(+), 27 deletions(-)
|
||||
|
||||
diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c
|
||||
index 15595a46e..324e1dca0 100644
|
||||
--- a/grub-core/kern/efi/mm.c
|
||||
+++ b/grub-core/kern/efi/mm.c
|
||||
@@ -154,6 +154,7 @@ grub_efi_allocate_pages_real (grub_efi_physical_address_t address,
|
||||
@@ -153,6 +153,7 @@
|
||||
{
|
||||
grub_efi_status_t status;
|
||||
grub_efi_boot_services_t *b;
|
||||
@ -89,12 +87,12 @@ index 15595a46e..324e1dca0 100644
|
||||
|
||||
/* Limit the memory access to less than 4GB for 32-bit platforms. */
|
||||
if (address > GRUB_EFI_MAX_USABLE_ADDRESS)
|
||||
@@ -165,19 +166,22 @@ grub_efi_allocate_pages_real (grub_efi_physical_address_t address,
|
||||
@@ -169,19 +170,22 @@
|
||||
}
|
||||
|
||||
b = grub_efi_system_table->boot_services;
|
||||
- status = efi_call_4 (b->allocate_pages, alloctype, memtype, pages, &address);
|
||||
+ status = efi_call_4 (b->allocate_pages, alloctype, memtype, pages, &ret);
|
||||
- status = b->allocate_pages (alloctype, memtype, pages, &address);
|
||||
+ status = b->allocate_pages (alloctype, memtype, pages, &ret);
|
||||
if (status != GRUB_EFI_SUCCESS)
|
||||
{
|
||||
+ grub_dprintf ("efi",
|
||||
@ -110,13 +108,13 @@ index 15595a46e..324e1dca0 100644
|
||||
/* Uggh, the address 0 was allocated... This is too annoying,
|
||||
so reallocate another one. */
|
||||
- address = GRUB_EFI_MAX_USABLE_ADDRESS;
|
||||
- status = efi_call_4 (b->allocate_pages, alloctype, memtype, pages, &address);
|
||||
- status = b->allocate_pages (alloctype, memtype, pages, &address);
|
||||
+ ret = address;
|
||||
+ status = efi_call_4 (b->allocate_pages, alloctype, memtype, pages, &ret);
|
||||
+ status = b->allocate_pages (alloctype, memtype, pages, &ret);
|
||||
grub_efi_free_pages (0, pages);
|
||||
if (status != GRUB_EFI_SUCCESS)
|
||||
{
|
||||
@@ -186,9 +190,9 @@ grub_efi_allocate_pages_real (grub_efi_physical_address_t address,
|
||||
@@ -190,9 +194,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
@ -128,7 +126,7 @@ index 15595a46e..324e1dca0 100644
|
||||
}
|
||||
|
||||
void *
|
||||
@@ -699,8 +703,21 @@ grub_efi_get_ram_base(grub_addr_t *base_addr)
|
||||
@@ -711,8 +715,21 @@
|
||||
for (desc = memory_map, *base_addr = GRUB_EFI_MAX_USABLE_ADDRESS;
|
||||
(grub_addr_t) desc < ((grub_addr_t) memory_map + memory_map_size);
|
||||
desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size))
|
||||
@ -152,11 +150,9 @@ index 15595a46e..324e1dca0 100644
|
||||
|
||||
grub_free(memory_map);
|
||||
|
||||
diff --git a/grub-core/loader/arm64/efi/linux.c b/grub-core/loader/arm64/efi/linux.c
|
||||
index 98c4f038b..4d084950a 100644
|
||||
--- a/grub-core/loader/arm64/efi/linux.c
|
||||
+++ b/grub-core/loader/arm64/efi/linux.c
|
||||
@@ -116,13 +116,15 @@ finalize_params_linux (void)
|
||||
@@ -89,13 +89,15 @@
|
||||
{
|
||||
grub_efi_loaded_image_t *loaded_image = NULL;
|
||||
int node, retval, len;
|
||||
@ -175,7 +171,7 @@ index 98c4f038b..4d084950a 100644
|
||||
|
||||
node = grub_fdt_find_subnode (fdt, 0, "chosen");
|
||||
if (node < 0)
|
||||
@@ -133,17 +135,26 @@ finalize_params_linux (void)
|
||||
@@ -106,17 +108,26 @@
|
||||
*/
|
||||
retval = grub_fdt_set_prop32(fdt, 0, "#address-cells", 2);
|
||||
if (retval)
|
||||
@ -205,7 +201,7 @@ index 98c4f038b..4d084950a 100644
|
||||
|
||||
/* Set initrd info */
|
||||
if (initrd_start && initrd_end > initrd_start)
|
||||
@@ -154,15 +165,26 @@ finalize_params_linux (void)
|
||||
@@ -127,15 +138,26 @@
|
||||
retval = grub_fdt_set_prop64 (fdt, node, "linux,initrd-start",
|
||||
initrd_start);
|
||||
if (retval)
|
||||
@ -236,7 +232,7 @@ index 98c4f038b..4d084950a 100644
|
||||
|
||||
grub_dprintf ("linux", "Installed/updated FDT configuration table @ %p\n",
|
||||
fdt);
|
||||
@@ -170,14 +192,20 @@ finalize_params_linux (void)
|
||||
@@ -143,14 +165,20 @@
|
||||
/* Convert command line to UCS-2 */
|
||||
loaded_image = grub_efi_get_loaded_image (grub_efi_image_handle);
|
||||
if (!loaded_image)
|
||||
@ -259,7 +255,7 @@ index 98c4f038b..4d084950a 100644
|
||||
|
||||
loaded_image->load_options_size =
|
||||
2 * grub_utf8_to_utf16 (loaded_image->load_options, len,
|
||||
@@ -187,7 +215,7 @@ finalize_params_linux (void)
|
||||
@@ -160,7 +188,7 @@
|
||||
|
||||
failure:
|
||||
grub_fdt_unload();
|
||||
@ -268,7 +264,7 @@ index 98c4f038b..4d084950a 100644
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -272,16 +300,28 @@ grub_linux_unload (void)
|
||||
@@ -246,16 +274,28 @@
|
||||
static void *
|
||||
allocate_initrd_mem (int initrd_pages)
|
||||
{
|
||||
@ -303,6 +299,3 @@ index 98c4f038b..4d084950a 100644
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
--
|
||||
2.26.2
|
||||
|
||||
|
@ -1,58 +0,0 @@
|
||||
From f41488d0e361a34f4d3f8fb6c92729a2901a5c76 Mon Sep 17 00:00:00 2001
|
||||
From: Glenn Washburn <development@efficientek.com>
|
||||
Date: Thu, 9 Dec 2021 11:14:53 -0600
|
||||
Subject: [PATCH 04/14] cryptodisk: Improve error messaging in cryptomount
|
||||
invocations
|
||||
|
||||
Update such that "cryptomount -u UUID" will not print two error messages
|
||||
when an invalid passphrase is given and the most relevant error message
|
||||
will be displayed.
|
||||
|
||||
Signed-off-by: Glenn Washburn <development@efficientek.com>
|
||||
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||||
---
|
||||
grub-core/disk/cryptodisk.c | 21 +++++++++++++++++----
|
||||
1 file changed, 17 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c
|
||||
index 27491871a5..3a896c6634 100644
|
||||
--- a/grub-core/disk/cryptodisk.c
|
||||
+++ b/grub-core/disk/cryptodisk.c
|
||||
@@ -1109,7 +1109,10 @@ grub_cryptodisk_scan_device (const char *name,
|
||||
if (grub_errno == GRUB_ERR_BAD_MODULE)
|
||||
grub_error_pop ();
|
||||
|
||||
- if (grub_errno != GRUB_ERR_NONE)
|
||||
+ if (search_uuid != NULL)
|
||||
+ /* Push error onto stack to save for cryptomount. */
|
||||
+ grub_error_push ();
|
||||
+ else
|
||||
grub_print_error ();
|
||||
|
||||
cleanup:
|
||||
@@ -1146,9 +1149,19 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
found_uuid = grub_device_iterate (&grub_cryptodisk_scan_device, NULL);
|
||||
search_uuid = NULL;
|
||||
|
||||
- if (!found_uuid)
|
||||
- return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such cryptodisk found");
|
||||
- return GRUB_ERR_NONE;
|
||||
+ if (found_uuid)
|
||||
+ return GRUB_ERR_NONE;
|
||||
+ else if (grub_errno == GRUB_ERR_NONE)
|
||||
+ {
|
||||
+ /*
|
||||
+ * Try to pop the next error on the stack. If there is not one, then
|
||||
+ * no device matched the given UUID.
|
||||
+ */
|
||||
+ grub_error_pop ();
|
||||
+ if (grub_errno == GRUB_ERR_NONE)
|
||||
+ return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such cryptodisk found");
|
||||
+ }
|
||||
+ return grub_errno;
|
||||
}
|
||||
else if (state[1].set || (argc == 0 && state[2].set))
|
||||
{
|
||||
--
|
||||
2.34.1
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user