SHA256
1
0
forked from pool/grub2
Dominique Leuenberger 2019-10-23 06:48:57 +00:00 committed by Git OBS Bridge
parent e5c6623c14
commit e774d7b0f3
71 changed files with 5095 additions and 791 deletions

View File

@ -0,0 +1,46 @@
From 2f06e09673e48f6a91486a8ad38f45c160d537fe Mon Sep 17 00:00:00 2001
From: "mike.travis@hpe.com" <mike.travis@hpe.com>
Date: Wed, 28 Mar 2018 11:42:18 -0500
Subject: Fix PCIe LER when GRUB2 accesses non-enabled MMIO data from VGA
A GPU inserted into a PCIe I/O slot disappears during system startup.
The problem centers around GRUB and a specific VGA init function in
efi_uga.c. This causes an LER (link error recorvery) because the MMIO
memory has not been enabled before attempting access.
The fix is to add the same coding used in other VGA drivers, specifically
to add a check to insure that it is indeed a VGA controller. And then
enable the MMIO address space with the specific bits.
Signed-off-by: Mike Travis <mike.travis@hpe.com>
---
grub-core/video/efi_uga.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/grub-core/video/efi_uga.c b/grub-core/video/efi_uga.c
index 464ede874..32ef7efbc 100644
--- a/grub-core/video/efi_uga.c
+++ b/grub-core/video/efi_uga.c
@@ -95,9 +95,18 @@ find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
{
struct find_framebuf_ctx *ctx = data;
grub_pci_address_t addr;
+ grub_pci_address_t rcaddr;
+ grub_uint32_t subclass;
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
- if (grub_pci_read (addr) >> 24 == 0x3)
+ subclass = (grub_pci_read (addr) >> 16) & 0xffff;
+ if (subclass != GRUB_PCI_CLASS_SUBCLASS_VGA)
+ return 0;
+
+ /* Enable MEM address spaces */
+ rcaddr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
+ grub_pci_write_word (rcaddr, grub_pci_read_word (rcaddr) | GRUB_PCI_COMMAND_MEM_ENABLED);
+
{
int i;
--
2.13.6

View File

@ -0,0 +1,67 @@
From 721f75ff7de467717658d2de9c20bbb18145790a Mon Sep 17 00:00:00 2001
From: Michael Chang <mchang@suse.com>
Date: Mon, 26 Mar 2018 16:52:34 +0800
Subject: Fix packed-not-aligned error on GCC 8
When building with GCC 8, there are several errors regarding packed-not-aligned.
./include/grub/gpt_partition.h:79:1: error: alignment 1 of 'struct grub_gpt_partentry' is less than 8 [-Werror=packed-not-aligned]
This patch tries to fix the build error by cleaning up the ambiguity of placing
aligned structure in a packed one. In "struct grub_btrfs_time" and "struct
grub_gpt_part_type", the aligned attribute seems to be superfluous, and also
has to be packed, to ensure the structure is bit-to-bit mapped to the format
laid on disk. I think we could blame to copy and paste error here for the
mistake. In "struct efi_variable", we have to use grub_efi_packed_guid_t, as
the name suggests. :)
Signed-off-by: Michael Chang <mchang@suse.com>
Tested-by: Michael Chang <mchang@suse.com>
---
grub-core/fs/btrfs.c | 2 +-
include/grub/efiemu/runtime.h | 2 +-
include/grub/gpt_partition.h | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c
index 4849c1ceb..be195448d 100644
--- a/grub-core/fs/btrfs.c
+++ b/grub-core/fs/btrfs.c
@@ -175,7 +175,7 @@ struct grub_btrfs_time
{
grub_int64_t sec;
grub_uint32_t nanosec;
-} __attribute__ ((aligned (4)));
+} GRUB_PACKED;
struct grub_btrfs_inode
{
diff --git a/include/grub/efiemu/runtime.h b/include/grub/efiemu/runtime.h
index 9b6b729f4..36d2dedf4 100644
--- a/include/grub/efiemu/runtime.h
+++ b/include/grub/efiemu/runtime.h
@@ -29,7 +29,7 @@ struct grub_efiemu_ptv_rel
struct efi_variable
{
- grub_efi_guid_t guid;
+ grub_efi_packed_guid_t guid;
grub_uint32_t namelen;
grub_uint32_t size;
grub_efi_uint32_t attributes;
diff --git a/include/grub/gpt_partition.h b/include/grub/gpt_partition.h
index 1b32f6725..9668a68c3 100644
--- a/include/grub/gpt_partition.h
+++ b/include/grub/gpt_partition.h
@@ -28,7 +28,7 @@ struct grub_gpt_part_type
grub_uint16_t data2;
grub_uint16_t data3;
grub_uint8_t data4[8];
-} __attribute__ ((aligned(8)));
+} GRUB_PACKED;
typedef struct grub_gpt_part_type grub_gpt_part_type_t;
#define GRUB_GPT_PARTITION_TYPE_EMPTY \
--
2.13.6

View File

@ -23,10 +23,6 @@ V3:
* Finish HTTP transaction in one go
* Fix bsc#1076132
V4
* Add fs_ prefix with upstream commit
ad4bfeec5 Change fs functions to add fs_ prefix
---
grub-core/Makefile.core.def | 18 +
grub-core/io/bufio.c | 2 +-
@ -57,19 +53,30 @@ V4
create mode 100644 include/grub/efi/http.h
create mode 100644 include/grub/net/efi.h
Index: grub-2.04~rc1/grub-core/Makefile.core.def
===================================================================
--- grub-2.04~rc1.orig/grub-core/Makefile.core.def
+++ grub-2.04~rc1/grub-core/Makefile.core.def
@@ -1854,7 +1854,6 @@ module = {
module = {
name = linuxefi;
efi = loader/i386/efi/linux.c;
- efi = lib/cmdline.c;
enable = i386_efi;
enable = x86_64_efi;
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
index a65c27f7f..e93c77255 100644
--- a/grub-core/Makefile.core.def
+++ b/grub-core/Makefile.core.def
@@ -2167,6 +2167,18 @@ module = {
};
@@ -2283,6 +2282,12 @@ module = {
module = {
+ name = efi_netfs;
+ common = net/efi/efi_netfs.c;
+ common = net/efi/net.c;
+ common = net/efi/http.c;
+ common = net/efi/pxe.c;
+ common = net/efi/ip4_config.c;
+ common = net/efi/ip6_config.c;
+ common = net/efi/dhcp.c;
+ enable = efi;
+};
+
+module = {
name = net;
common = net/net.c;
common = net/dns.c;
@@ -2179,6 +2191,12 @@ module = {
common = net/ethernet.c;
common = net/arp.c;
common = net/netbuff.c;
@ -82,11 +89,11 @@ Index: grub-2.04~rc1/grub-core/Makefile.core.def
};
module = {
Index: grub-2.04~rc1/grub-core/io/bufio.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/io/bufio.c
+++ grub-2.04~rc1/grub-core/io/bufio.c
@@ -139,7 +139,7 @@ grub_bufio_read (grub_file_t file, char
diff --git a/grub-core/io/bufio.c b/grub-core/io/bufio.c
index 22438277d..d0b0f71b6 100644
--- a/grub-core/io/bufio.c
+++ b/grub-core/io/bufio.c
@@ -132,7 +132,7 @@ grub_bufio_read (grub_file_t file, char *buf, grub_size_t len)
return res;
/* Need to read some more. */
@ -95,11 +102,11 @@ Index: grub-2.04~rc1/grub-core/io/bufio.c
/* Now read between file->offset + res and bufio->buffer_at. */
if (file->offset + res < next_buf)
{
Index: grub-2.04~rc1/grub-core/kern/efi/efi.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/kern/efi/efi.c
+++ grub-2.04~rc1/grub-core/kern/efi/efi.c
@@ -722,7 +722,7 @@ grub_efi_print_device_path (grub_efi_dev
diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c
index d467785fc..0ceaa487c 100644
--- a/grub-core/kern/efi/efi.c
+++ b/grub-core/kern/efi/efi.c
@@ -672,7 +672,7 @@ grub_efi_print_device_path (grub_efi_device_path_t *dp)
{
grub_efi_ipv4_device_path_t *ipv4
= (grub_efi_ipv4_device_path_t *) dp;
@ -108,7 +115,7 @@ Index: grub-2.04~rc1/grub-core/kern/efi/efi.c
(unsigned) ipv4->local_ip_address[0],
(unsigned) ipv4->local_ip_address[1],
(unsigned) ipv4->local_ip_address[2],
@@ -735,33 +735,60 @@ grub_efi_print_device_path (grub_efi_dev
@@ -685,33 +685,60 @@ grub_efi_print_device_path (grub_efi_device_path_t *dp)
(unsigned) ipv4->remote_port,
(unsigned) ipv4->protocol,
(unsigned) ipv4->static_ip_address);
@ -186,7 +193,7 @@ Index: grub-2.04~rc1/grub-core/kern/efi/efi.c
}
break;
case GRUB_EFI_INFINIBAND_DEVICE_PATH_SUBTYPE:
@@ -801,6 +828,39 @@ grub_efi_print_device_path (grub_efi_dev
@@ -751,6 +778,39 @@ grub_efi_print_device_path (grub_efi_device_path_t *dp)
dump_vendor_path ("Messaging",
(grub_efi_vendor_device_path_t *) dp);
break;
@ -226,10 +233,10 @@ Index: grub-2.04~rc1/grub-core/kern/efi/efi.c
default:
grub_printf ("/UnknownMessaging(%x)", (unsigned) subtype);
break;
Index: grub-2.04~rc1/grub-core/net/drivers/efi/efinet.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/net/drivers/efi/efinet.c
+++ grub-2.04~rc1/grub-core/net/drivers/efi/efinet.c
diff --git a/grub-core/net/drivers/efi/efinet.c b/grub-core/net/drivers/efi/efinet.c
index 82a28fb6e..f189209ba 100644
--- a/grub-core/net/drivers/efi/efinet.c
+++ b/grub-core/net/drivers/efi/efinet.c
@@ -24,6 +24,7 @@
#include <grub/efi/efi.h>
#include <grub/i18n.h>
@ -238,7 +245,7 @@ Index: grub-2.04~rc1/grub-core/net/drivers/efi/efinet.c
GRUB_MOD_LICENSE ("GPLv3+");
@@ -481,6 +482,17 @@ grub_efinet_create_dhcp_ack_from_device_
@@ -481,6 +482,17 @@ grub_efinet_create_dhcp_ack_from_device_path (grub_efi_device_path_t *dp, int *u
ldp = grub_efi_find_last_device_path (ddp);
@ -256,7 +263,7 @@ Index: grub-2.04~rc1/grub-core/net/drivers/efi/efinet.c
if (GRUB_EFI_DEVICE_PATH_TYPE (ldp) != GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE
|| (GRUB_EFI_DEVICE_PATH_SUBTYPE (ldp) != GRUB_EFI_IPV4_DEVICE_PATH_SUBTYPE
&& GRUB_EFI_DEVICE_PATH_SUBTYPE (ldp) != GRUB_EFI_IPV6_DEVICE_PATH_SUBTYPE))
@@ -744,6 +756,7 @@ grub_efi_net_config_real (grub_efi_handl
@@ -744,6 +756,7 @@ grub_efi_net_config_real (grub_efi_handle_t hnd, char **device,
if (GRUB_EFI_DEVICE_PATH_TYPE (ldp) != GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE
|| (GRUB_EFI_DEVICE_PATH_SUBTYPE (ldp) != GRUB_EFI_IPV4_DEVICE_PATH_SUBTYPE
&& GRUB_EFI_DEVICE_PATH_SUBTYPE (ldp) != GRUB_EFI_IPV6_DEVICE_PATH_SUBTYPE
@ -264,7 +271,7 @@ Index: grub-2.04~rc1/grub-core/net/drivers/efi/efinet.c
&& GRUB_EFI_DEVICE_PATH_SUBTYPE (ldp) != GRUB_EFI_URI_DEVICE_PATH_SUBTYPE))
continue;
dup_dp = grub_efi_duplicate_device_path (dp);
@@ -759,6 +772,15 @@ grub_efi_net_config_real (grub_efi_handl
@@ -759,6 +772,15 @@ grub_efi_net_config_real (grub_efi_handle_t hnd, char **device,
}
dup_ldp = grub_efi_find_last_device_path (dup_dp);
@ -280,7 +287,7 @@ Index: grub-2.04~rc1/grub-core/net/drivers/efi/efinet.c
dup_ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
dup_ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
dup_ldp->length = sizeof (*dup_ldp);
@@ -816,6 +838,9 @@ grub_efi_net_config_real (grub_efi_handl
@@ -816,6 +838,9 @@ grub_efi_net_config_real (grub_efi_handle_t hnd, char **device,
GRUB_MOD_INIT(efinet)
{
@ -298,10 +305,11 @@ Index: grub-2.04~rc1/grub-core/net/drivers/efi/efinet.c
+ grub_efi_net_config = NULL;
}
Index: grub-2.04~rc1/grub-core/net/efi/dhcp.c
===================================================================
diff --git a/grub-core/net/efi/dhcp.c b/grub-core/net/efi/dhcp.c
new file mode 100644
index 000000000..dbef63d8c
--- /dev/null
+++ grub-2.04~rc1/grub-core/net/efi/dhcp.c
+++ b/grub-core/net/efi/dhcp.c
@@ -0,0 +1,397 @@
+#include <grub/mm.h>
+#include <grub/command.h>
@ -700,10 +708,74 @@ Index: grub-2.04~rc1/grub-core/net/efi/dhcp.c
+
+grub_command_func_t grub_efi_net_bootp = grub_cmd_efi_bootp;
+grub_command_func_t grub_efi_net_bootp6 = grub_cmd_efi_bootp6;
Index: grub-2.04~rc1/grub-core/net/efi/http.c
===================================================================
diff --git a/grub-core/net/efi/efi_netfs.c b/grub-core/net/efi/efi_netfs.c
new file mode 100644
index 000000000..ef371d885
--- /dev/null
+++ grub-2.04~rc1/grub-core/net/efi/http.c
+++ b/grub-core/net/efi/efi_netfs.c
@@ -0,0 +1,57 @@
+#include <grub/dl.h>
+#include <grub/env.h>
+#define EFI_NET_CMD_PREFIX "net_efi"
+#include <grub/net/efi.h>
+
+GRUB_MOD_LICENSE ("GPLv3+");
+
+static grub_command_t cmd_efi_lsroutes;
+static grub_command_t cmd_efi_lscards;
+static grub_command_t cmd_efi_lsaddrs;
+static grub_command_t cmd_efi_addaddr;
+static grub_command_t cmd_efi_bootp;
+static grub_command_t cmd_efi_bootp6;
+
+static int initialized;
+
+GRUB_MOD_INIT(efi_netfs)
+{
+ if (grub_net_open)
+ return;
+
+ if (grub_efi_net_fs_init ())
+ {
+ cmd_efi_lsroutes = grub_register_command ("net_efi_ls_routes", grub_efi_net_list_routes,
+ "", N_("list network routes"));
+ cmd_efi_lscards = grub_register_command ("net_efi_ls_cards", grub_efi_net_list_cards,
+ "", N_("list network cards"));
+ cmd_efi_lsaddrs = grub_register_command ("net_efi_ls_addr", grub_efi_net_list_addrs,
+ "", N_("list network addresses"));
+ cmd_efi_addaddr = grub_register_command ("net_efi_add_addr", grub_efi_net_add_addr,
+ N_("SHORTNAME CARD ADDRESS [HWADDRESS]"),
+ N_("Add a network address."));
+ cmd_efi_bootp = grub_register_command ("net_efi_bootp", grub_efi_net_bootp,
+ N_("[CARD]"),
+ N_("perform a bootp autoconfiguration"));
+ cmd_efi_bootp6 = grub_register_command ("net_efi_bootp6", grub_efi_net_bootp6,
+ N_("[CARD]"),
+ N_("perform a bootp autoconfiguration"));
+ initialized = 1;
+ }
+}
+
+GRUB_MOD_FINI(efi_netfs)
+{
+ if (initialized)
+ {
+ grub_unregister_command (cmd_efi_lsroutes);
+ grub_unregister_command (cmd_efi_lscards);
+ grub_unregister_command (cmd_efi_lsaddrs);
+ grub_unregister_command (cmd_efi_addaddr);
+ grub_unregister_command (cmd_efi_bootp);
+ grub_unregister_command (cmd_efi_bootp6);
+ grub_efi_net_fs_fini ();
+ initialized = 0;
+ return;
+ }
+}
diff --git a/grub-core/net/efi/http.c b/grub-core/net/efi/http.c
new file mode 100644
index 000000000..3f61fd2fa
--- /dev/null
+++ b/grub-core/net/efi/http.c
@@ -0,0 +1,419 @@
+
+#include <grub/efi/api.h>
@ -1124,10 +1196,11 @@ Index: grub-2.04~rc1/grub-core/net/efi/http.c
+ .read = grub_efihttp_read,
+ .close = grub_efihttp_close
+ };
Index: grub-2.04~rc1/grub-core/net/efi/ip4_config.c
===================================================================
diff --git a/grub-core/net/efi/ip4_config.c b/grub-core/net/efi/ip4_config.c
new file mode 100644
index 000000000..b711a5d94
--- /dev/null
+++ grub-2.04~rc1/grub-core/net/efi/ip4_config.c
+++ b/grub-core/net/efi/ip4_config.c
@@ -0,0 +1,398 @@
+
+#include <grub/efi/api.h>
@ -1527,10 +1600,11 @@ Index: grub-2.04~rc1/grub-core/net/efi/ip4_config.c
+ .set_gateway = grub_efi_ip4_interface_set_gateway,
+ .set_dns = grub_efi_ip4_interface_set_dns
+ };
Index: grub-2.04~rc1/grub-core/net/efi/ip6_config.c
===================================================================
diff --git a/grub-core/net/efi/ip6_config.c b/grub-core/net/efi/ip6_config.c
new file mode 100644
index 000000000..017c4d05b
--- /dev/null
+++ grub-2.04~rc1/grub-core/net/efi/ip6_config.c
+++ b/grub-core/net/efi/ip6_config.c
@@ -0,0 +1,422 @@
+#include <grub/efi/api.h>
+#include <grub/efi/efi.h>
@ -1954,10 +2028,11 @@ Index: grub-2.04~rc1/grub-core/net/efi/ip6_config.c
+ .set_gateway = grub_efi_ip6_interface_set_gateway,
+ .set_dns = grub_efi_ip6_interface_set_dns
+ };
Index: grub-2.04~rc1/grub-core/net/efi/net.c
===================================================================
diff --git a/grub-core/net/efi/net.c b/grub-core/net/efi/net.c
new file mode 100644
index 000000000..0bac343b4
--- /dev/null
+++ grub-2.04~rc1/grub-core/net/efi/net.c
+++ b/grub-core/net/efi/net.c
@@ -0,0 +1,1428 @@
+#include <grub/net.h>
+#include <grub/env.h>
@ -3252,13 +3327,13 @@ Index: grub-2.04~rc1/grub-core/net/efi/net.c
+static struct grub_fs grub_efi_netfs =
+ {
+ .name = "efi netfs",
+ .fs_dir = grub_efi_netfs_dir,
+ .fs_open = grub_efi_netfs_open,
+ .fs_read = grub_efi_netfs_read,
+ .fs_close = grub_efi_netfs_close,
+ .fs_label = NULL,
+ .fs_uuid = NULL,
+ .fs_mtime = NULL,
+ .dir = grub_efi_netfs_dir,
+ .open = grub_efi_netfs_open,
+ .read = grub_efi_netfs_read,
+ .close = grub_efi_netfs_close,
+ .label = NULL,
+ .uuid = NULL,
+ .mtime = NULL,
+ };
+
+int
@ -3387,10 +3462,11 @@ Index: grub-2.04~rc1/grub-core/net/efi/net.c
+ grub_net_open = NULL;
+ grub_fs_unregister (&grub_efi_netfs);
+}
Index: grub-2.04~rc1/grub-core/net/efi/pxe.c
===================================================================
diff --git a/grub-core/net/efi/pxe.c b/grub-core/net/efi/pxe.c
new file mode 100644
index 000000000..4b6b48cb1
--- /dev/null
+++ grub-2.04~rc1/grub-core/net/efi/pxe.c
+++ b/grub-core/net/efi/pxe.c
@@ -0,0 +1,424 @@
+
+#include <grub/efi/api.h>
@ -3816,10 +3892,10 @@ Index: grub-2.04~rc1/grub-core/net/efi/pxe.c
+ .close = pxe_close
+ };
+
Index: grub-2.04~rc1/grub-core/net/net.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/net/net.c
+++ grub-2.04~rc1/grub-core/net/net.c
diff --git a/grub-core/net/net.c b/grub-core/net/net.c
index 5cc0d2f3b..02bbe956b 100644
--- a/grub-core/net/net.c
+++ b/grub-core/net/net.c
@@ -32,6 +32,9 @@
#include <grub/loader.h>
#include <grub/bufio.h>
@ -3830,7 +3906,7 @@ Index: grub-2.04~rc1/grub-core/net/net.c
GRUB_MOD_LICENSE ("GPLv3+");
@@ -1817,8 +1820,49 @@ static grub_command_t cmd_addaddr, cmd_d
@@ -1817,8 +1820,49 @@ static grub_command_t cmd_addaddr, cmd_deladdr, cmd_addroute, cmd_delroute;
static grub_command_t cmd_lsroutes, cmd_lscards;
static grub_command_t cmd_lsaddr, cmd_slaac;
@ -3926,11 +4002,11 @@ Index: grub-2.04~rc1/grub-core/net/net.c
+ init_mode = INIT_MODE_NONE;
+#endif
}
Index: grub-2.04~rc1/include/grub/efi/api.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/efi/api.h
+++ grub-2.04~rc1/include/grub/efi/api.h
@@ -588,6 +588,23 @@ typedef grub_uint16_t grub_efi_ipv6_addr
diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h
index 99ba068e3..cfedd7895 100644
--- a/include/grub/efi/api.h
+++ b/include/grub/efi/api.h
@@ -588,6 +588,23 @@ typedef grub_uint16_t grub_efi_ipv6_address_t[8];
typedef grub_uint8_t grub_efi_ip_address_t[8] __attribute__ ((aligned(4)));
typedef grub_efi_uint64_t grub_efi_physical_address_t;
typedef grub_efi_uint64_t grub_efi_virtual_address_t;
@ -4003,7 +4079,7 @@ Index: grub-2.04~rc1/include/grub/efi/api.h
struct grub_efi_open_protocol_information_entry
{
grub_efi_handle_t agent_handle;
@@ -1473,23 +1518,28 @@ typedef struct grub_efi_simple_text_outp
@@ -1473,23 +1518,28 @@ typedef struct grub_efi_simple_text_output_interface grub_efi_simple_text_output
typedef grub_uint8_t grub_efi_pxe_packet_t[1472];
@ -4175,12 +4251,13 @@ Index: grub-2.04~rc1/include/grub/efi/api.h
+typedef struct grub_efi_ip6_config_manual_address grub_efi_ip6_config_manual_address_t;
+
#if (GRUB_TARGET_SIZEOF_VOID_P == 4) || defined (__ia64__) \
|| defined (__aarch64__) || defined (__MINGW64__) || defined (__CYGWIN__) \
|| defined(__riscv)
Index: grub-2.04~rc1/include/grub/efi/dhcp.h
===================================================================
|| defined (__aarch64__) || defined (__MINGW64__) || defined (__CYGWIN__)
diff --git a/include/grub/efi/dhcp.h b/include/grub/efi/dhcp.h
new file mode 100644
index 000000000..fdb88eb81
--- /dev/null
+++ grub-2.04~rc1/include/grub/efi/dhcp.h
+++ b/include/grub/efi/dhcp.h
@@ -0,0 +1,343 @@
+#ifndef GRUB_EFI_DHCP_HEADER
+#define GRUB_EFI_DHCP_HEADER 1
@ -4525,10 +4602,11 @@ Index: grub-2.04~rc1/include/grub/efi/dhcp.h
+};
+
+#endif /* ! GRUB_EFI_DHCP_HEADER */
Index: grub-2.04~rc1/include/grub/efi/http.h
===================================================================
diff --git a/include/grub/efi/http.h b/include/grub/efi/http.h
new file mode 100644
index 000000000..c5e9a89f5
--- /dev/null
+++ grub-2.04~rc1/include/grub/efi/http.h
+++ b/include/grub/efi/http.h
@@ -0,0 +1,215 @@
+/*
+ * GRUB -- GRand Unified Bootloader
@ -4745,10 +4823,11 @@ Index: grub-2.04~rc1/include/grub/efi/http.h
+typedef struct grub_efi_http grub_efi_http_t;
+
+#endif /* !GRUB_EFI_HTTP_HEADER */
Index: grub-2.04~rc1/include/grub/net/efi.h
===================================================================
diff --git a/include/grub/net/efi.h b/include/grub/net/efi.h
new file mode 100644
index 000000000..de90d223e
--- /dev/null
+++ grub-2.04~rc1/include/grub/net/efi.h
+++ b/include/grub/net/efi.h
@@ -0,0 +1,144 @@
+#ifndef GRUB_NET_EFI_HEADER
+#define GRUB_NET_EFI_HEADER 1
@ -4894,3 +4973,88 @@ Index: grub-2.04~rc1/include/grub/net/efi.h
+extern grub_command_func_t grub_efi_net_bootp6;
+
+#endif /* ! GRUB_NET_EFI_HEADER */
diff --git a/util/grub-mknetdir.c b/util/grub-mknetdir.c
index 82073d5cc..ae31271bb 100644
--- a/util/grub-mknetdir.c
+++ b/util/grub-mknetdir.c
@@ -32,13 +32,15 @@
static char *rootdir = NULL, *subdir = NULL;
static char *debug_image = NULL;
+static char efi_netfs = 0;
enum
{
OPTION_NET_DIRECTORY = 0x301,
OPTION_SUBDIR,
OPTION_DEBUG,
- OPTION_DEBUG_IMAGE
+ OPTION_DEBUG_IMAGE,
+ OPTION_DEBUG_EFI_NETFS
};
static struct argp_option options[] = {
@@ -49,6 +51,7 @@ static struct argp_option options[] = {
0, N_("relative subdirectory on network server"), 2},
{"debug", OPTION_DEBUG, 0, OPTION_HIDDEN, 0, 2},
{"debug-image", OPTION_DEBUG_IMAGE, N_("STRING"), OPTION_HIDDEN, 0, 2},
+ {"debug-efi-netfs", OPTION_DEBUG_EFI_NETFS, 0, OPTION_HIDDEN, 0, 2},
{0, 0, 0, 0, 0, 0}
};
@@ -67,6 +70,9 @@ argp_parser (int key, char *arg, struct argp_state *state)
free (subdir);
subdir = xstrdup (arg);
return 0;
+ case OPTION_DEBUG_EFI_NETFS:
+ efi_netfs = 1;
+ return 0;
/* This is an undocumented feature... */
case OPTION_DEBUG:
verbosity++;
@@ -82,7 +88,6 @@ argp_parser (int key, char *arg, struct argp_state *state)
}
}
-
struct argp argp = {
options, argp_parser, NULL,
"\v"N_("Prepares GRUB network boot images at net_directory/subdir "
@@ -92,7 +97,7 @@ struct argp argp = {
static char *base;
-static const struct
+static struct
{
const char *mkimage_target;
const char *netmodule;
@@ -154,6 +159,7 @@ process_input_dir (const char *input_dir, enum grub_install_plat platform)
grub_install_push_module (targets[platform].netmodule);
output = grub_util_path_concat_ext (2, grubdir, "core", targets[platform].ext);
+
grub_install_make_image_wrap (input_dir, prefix, output,
0, load_cfg,
targets[platform].mkimage_target, 0);
@@ -190,7 +196,16 @@ main (int argc, char *argv[])
grub_install_mkdir_p (base);
- grub_install_push_module ("tftp");
+ if (!efi_netfs)
+ {
+ grub_install_push_module ("tftp");
+ grub_install_push_module ("http");
+ }
+ else
+ {
+ targets[GRUB_INSTALL_PLATFORM_I386_EFI].netmodule = "efi_netfs";
+ targets[GRUB_INSTALL_PLATFORM_X86_64_EFI].netmodule = "efi_netfs";
+ }
if (!grub_install_source_directory)
{
--
2.13.6

View File

@ -0,0 +1,75 @@
From 7ea474c68847757d4c67ffc67f7d714b77c41578 Mon Sep 17 00:00:00 2001
From: Michael Chang <mchang@suse.com>
Date: Thu, 11 Apr 2019 17:14:02 +0800
Subject: [PATCH 1/8] cpio: Disable gcc9 -Waddress-of-packed-member
Disable the -Wadress-of-packaed-member diagnostic for the
grub_cpio_find_file function since the result is found to be false
postive. Any pointers to member of the 'struct head hd' is aligned even
if the structure is packed without paddings.
[ 59s] In file included from ../grub-core/fs/cpio.c:51:
[ 59s] ../grub-core/fs/cpio_common.c: In function 'grub_cpio_find_file':
[ 59s] ../grub-core/fs/cpio_common.c:58:31: error: taking address of packed member of 'struct head' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 59s] 58 | data->size = read_number (hd.filesize, ARRAY_SIZE (hd.filesize));
[ 59s] | ~~^~~~~~~~~
[ 59s] ../grub-core/fs/cpio_common.c:60:29: error: taking address of packed member of 'struct head' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 59s] 60 | *mtime = read_number (hd.mtime, ARRAY_SIZE (hd.mtime));
[ 59s] | ~~^~~~~~
[ 59s] ../grub-core/fs/cpio_common.c:61:28: error: taking address of packed member of 'struct head' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 59s] 61 | modeval = read_number (hd.mode, ARRAY_SIZE (hd.mode));
[ 59s] | ~~^~~~~
[ 59s] ../grub-core/fs/cpio_common.c:62:29: error: taking address of packed member of 'struct head' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 59s] 62 | namesize = read_number (hd.namesize, ARRAY_SIZE (hd.namesize));
[ 59s] | ~~^~~~~~~~~
[ 59s] In file included from ../grub-core/fs/cpio_be.c:51:
[ 59s] ../grub-core/fs/cpio_common.c: In function 'grub_cpio_find_file':
[ 59s] ../grub-core/fs/cpio_common.c:58:31: error: taking address of packed member of 'struct head' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 59s] 58 | data->size = read_number (hd.filesize, ARRAY_SIZE (hd.filesize));
[ 59s] | ~~^~~~~~~~~
[ 59s] ../grub-core/fs/cpio_common.c:60:29: error: taking address of packed member of 'struct head' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 59s] 60 | *mtime = read_number (hd.mtime, ARRAY_SIZE (hd.mtime));
[ 59s] | ~~^~~~~~
[ 59s] ../grub-core/fs/cpio_common.c:61:28: error: taking address of packed member of 'struct head' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 59s] 61 | modeval = read_number (hd.mode, ARRAY_SIZE (hd.mode));
[ 59s] | ~~^~~~~
[ 59s] ../grub-core/fs/cpio_common.c:62:29: error: taking address of packed member of 'struct head' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 59s] 62 | namesize = read_number (hd.namesize, ARRAY_SIZE (hd.namesize));
[ 59s] | ~~^~~~~~~~~
Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
---
grub-core/fs/cpio_common.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/grub-core/fs/cpio_common.c b/grub-core/fs/cpio_common.c
index ed134d931..4e885d623 100644
--- a/grub-core/fs/cpio_common.c
+++ b/grub-core/fs/cpio_common.c
@@ -36,6 +36,11 @@ struct grub_archelp_data
grub_off_t size;
};
+#if __GNUC__ >= 9
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Waddress-of-packed-member"
+#endif
+
static grub_err_t
grub_cpio_find_file (struct grub_archelp_data *data, char **name,
grub_int32_t *mtime, grub_uint32_t *mode)
@@ -96,6 +101,10 @@ grub_cpio_find_file (struct grub_archelp_data *data, char **name,
return GRUB_ERR_NONE;
}
+#if __GNUC__ >= 9
+#pragma GCC diagnostic pop
+#endif
+
static char *
grub_cpio_get_link_target (struct grub_archelp_data *data)
{
--
2.16.4

View File

@ -0,0 +1,37 @@
From 0155e49166494624e9fb6ef113ed2c16d4accbb3 Mon Sep 17 00:00:00 2001
From: Michael Chang <mchang@suse.com>
Date: Fri, 29 Jul 2016 17:41:27 +0800
Subject: [PATCH 1/8] misc: fix invalid character recongition in strto*l
From: Aaron Miller <aaronmiller@fb.com>
Would previously allow digits larger than the base and didn't check that
subtracting the difference from 0-9 to lowercase letters for characters
larger than 9 didn't result in a value lower than 9, which allowed the
parses: ` = 9, _ = 8, ^ = 7, ] = 6, \ = 5, and [ = 4
---
grub-core/kern/misc.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c
index d1a54df..3a14d67 100644
--- a/grub-core/kern/misc.c
+++ b/grub-core/kern/misc.c
@@ -394,9 +394,13 @@ grub_strtoull (const char *str, char **end, int base)
if (digit > 9)
{
digit += '0' - 'a' + 10;
- if (digit >= (unsigned long) base)
+ /* digit <= 9 check is needed to keep chars larger than
+ '9' but less than 'a' from being read as numbers */
+ if (digit >= (unsigned long) base || digit <= 9)
break;
}
+ if (digit >= (unsigned long) base)
+ break;
found = 1;
--
2.6.6

View File

@ -0,0 +1,36 @@
From ddd47864e98cb32a718075bab4462dc56919ec6c Mon Sep 17 00:00:00 2001
From: Julian Andres Klode <julian.klode@canonical.com>
Date: Mon, 3 Sep 2018 10:09:15 +0200
Subject: [PATCH] ofnet: Initialize structs in bootpath parser
Code later on checks if variables inside the struct are
0 to see if they have been set, like if there were addresses
in the bootpath.
The variables were not initialized however, so the check
might succeed with uninitialized data, and a new interface
with random addresses and the same name is added. This causes
$net_default_mac to point to the random one, so, for example,
using that variable to load per-mac config files fails.
Bug-Ubuntu: https://bugs.launchpad.net/bugs/1785859
Signed-off-by: Julian Andres Klode <julian.klode@canonical.com>
---
grub-core/net/drivers/ieee1275/ofnet.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Index: grub-2.02/grub-core/net/drivers/ieee1275/ofnet.c
===================================================================
--- grub-2.02.orig/grub-core/net/drivers/ieee1275/ofnet.c
+++ grub-2.02/grub-core/net/drivers/ieee1275/ofnet.c
@@ -153,8 +153,8 @@ grub_ieee1275_parse_bootpath (const char
char *comma_char = 0;
char *equal_char = 0;
grub_size_t field_counter = 0;
- grub_net_network_level_address_t client_addr, gateway_addr, subnet_mask;
- grub_net_link_level_address_t hw_addr;
+ grub_net_network_level_address_t client_addr = {}, gateway_addr = {}, subnet_mask = {};
+ grub_net_link_level_address_t hw_addr = {};
grub_net_interface_flags_t flags = 0;
struct grub_net_network_level_interface *inter = NULL;
grub_uint32_t vlantag = 0;

View File

@ -0,0 +1,785 @@
From 866eb2103187d84f2e02c262cfdd1a388acfec15 Mon Sep 17 00:00:00 2001
From: Matthew Garrett <mjg59@coreos.com>
Date: Tue, 14 Jul 2015 17:06:35 -0700
Subject: [PATCH 01/11] Core TPM support
Add support for performing basic TPM measurements. Right now this only
supports extending PCRs statically and only on UEFI and BIOS systems, but
will measure all modules as they're loaded.
---
grub-core/Makefile.am | 1 +
grub-core/Makefile.core.def | 3 +
grub-core/kern/dl.c | 3 +
grub-core/kern/efi/tpm.c | 282 +++++++++++++++++++++++++++++++++++++++++++
grub-core/kern/i386/pc/tpm.c | 132 ++++++++++++++++++++
grub-core/kern/tpm.c | 19 +++
include/grub/efi/tpm.h | 153 +++++++++++++++++++++++
include/grub/tpm.h | 89 ++++++++++++++
8 files changed, 682 insertions(+)
create mode 100644 grub-core/kern/efi/tpm.c
create mode 100644 grub-core/kern/i386/pc/tpm.c
create mode 100644 grub-core/kern/tpm.c
create mode 100644 include/grub/efi/tpm.h
create mode 100644 include/grub/tpm.h
Index: grub-2.02~beta3/grub-core/Makefile.am
===================================================================
--- grub-2.02~beta3.orig/grub-core/Makefile.am
+++ grub-2.02~beta3/grub-core/Makefile.am
@@ -92,6 +92,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/inc
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/time.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/mm_private.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/net.h
+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/tpm.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/memory.h
if COND_i386_pc
Index: grub-2.02~beta3/grub-core/Makefile.core.def
===================================================================
--- grub-2.02~beta3.orig/grub-core/Makefile.core.def
+++ grub-2.02~beta3/grub-core/Makefile.core.def
@@ -126,6 +126,7 @@ kernel = {
common = kern/rescue_parser.c;
common = kern/rescue_reader.c;
common = kern/term.c;
+ common = kern/tpm.c;
noemu = kern/compiler-rt.c;
noemu = kern/mm.c;
@@ -173,6 +174,7 @@ kernel = {
efi = term/efi/console.c;
efi = kern/acpi.c;
efi = kern/efi/acpi.c;
+ efi = kern/efi/tpm.c;
i386_coreboot = kern/i386/pc/acpi.c;
i386_multiboot = kern/i386/pc/acpi.c;
i386_coreboot = kern/acpi.c;
@@ -217,6 +219,7 @@ kernel = {
i386_pc = kern/i386/pc/init.c;
i386_pc = kern/i386/pc/mmap.c;
+ i386_pc = kern/i386/pc/tpm.c;
i386_pc = term/i386/pc/console.c;
i386_qemu = bus/pci.c;
Index: grub-2.02~beta3/grub-core/kern/dl.c
===================================================================
--- grub-2.02~beta3.orig/grub-core/kern/dl.c
+++ grub-2.02~beta3/grub-core/kern/dl.c
@@ -32,6 +32,7 @@
#include <grub/env.h>
#include <grub/cache.h>
#include <grub/i18n.h>
+#include <grub/tpm.h>
/* Platforms where modules are in a readonly area of memory. */
#if defined(GRUB_MACHINE_QEMU)
@@ -729,6 +730,8 @@ grub_dl_load_file (const char *filename)
opens of the same device. */
grub_file_close (file);
+ grub_tpm_measure(core, size, GRUB_BINARY_PCR, "grub_module", filename);
+
mod = grub_dl_load_core (core, size);
grub_free (core);
if (! mod)
Index: grub-2.02~beta3/grub-core/kern/efi/tpm.c
===================================================================
--- /dev/null
+++ grub-2.02~beta3/grub-core/kern/efi/tpm.c
@@ -0,0 +1,282 @@
+#include <grub/err.h>
+#include <grub/i18n.h>
+#include <grub/efi/api.h>
+#include <grub/efi/efi.h>
+#include <grub/efi/tpm.h>
+#include <grub/mm.h>
+#include <grub/tpm.h>
+#include <grub/term.h>
+
+static grub_efi_guid_t tpm_guid = EFI_TPM_GUID;
+static grub_efi_guid_t tpm2_guid = EFI_TPM2_GUID;
+
+static grub_efi_boolean_t grub_tpm_present(grub_efi_tpm_protocol_t *tpm)
+{
+ grub_efi_status_t status;
+ TCG_EFI_BOOT_SERVICE_CAPABILITY caps;
+ grub_uint32_t flags;
+ grub_efi_physical_address_t eventlog, lastevent;
+
+ caps.Size = (grub_uint8_t)sizeof(caps);
+
+ status = efi_call_5(tpm->status_check, tpm, &caps, &flags, &eventlog,
+ &lastevent);
+
+ if (status != GRUB_EFI_SUCCESS || caps.TPMDeactivatedFlag
+ || !caps.TPMPresentFlag)
+ return 0;
+
+ return 1;
+}
+
+static grub_efi_boolean_t grub_tpm2_present(grub_efi_tpm2_protocol_t *tpm)
+{
+ grub_efi_status_t status;
+ EFI_TCG2_BOOT_SERVICE_CAPABILITY caps;
+
+ caps.Size = (grub_uint8_t)sizeof(caps);
+
+ status = efi_call_2(tpm->get_capability, tpm, &caps);
+
+ if (status != GRUB_EFI_SUCCESS || !caps.TPMPresentFlag)
+ return 0;
+
+ return 1;
+}
+
+static grub_efi_boolean_t grub_tpm_handle_find(grub_efi_handle_t *tpm_handle,
+ grub_efi_uint8_t *protocol_version)
+{
+ grub_efi_handle_t *handles;
+ grub_efi_uintn_t num_handles;
+
+ handles = grub_efi_locate_handle (GRUB_EFI_BY_PROTOCOL, &tpm_guid, NULL,
+ &num_handles);
+ if (handles && num_handles > 0) {
+ *tpm_handle = handles[0];
+ *protocol_version = 1;
+ return 1;
+ }
+
+ handles = grub_efi_locate_handle (GRUB_EFI_BY_PROTOCOL, &tpm2_guid, NULL,
+ &num_handles);
+ if (handles && num_handles > 0) {
+ *tpm_handle = handles[0];
+ *protocol_version = 2;
+ return 1;
+ }
+
+ return 0;
+}
+
+static grub_err_t
+grub_tpm1_execute(grub_efi_handle_t tpm_handle,
+ PassThroughToTPM_InputParamBlock *inbuf,
+ PassThroughToTPM_OutputParamBlock *outbuf)
+{
+ grub_efi_status_t status;
+ grub_efi_tpm_protocol_t *tpm;
+ grub_uint32_t inhdrsize = sizeof(*inbuf) - sizeof(inbuf->TPMOperandIn);
+ grub_uint32_t outhdrsize = sizeof(*outbuf) - sizeof(outbuf->TPMOperandOut);
+
+ tpm = grub_efi_open_protocol (tpm_handle, &tpm_guid,
+ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+
+ if (!grub_tpm_present(tpm))
+ return 0;
+
+ /* UEFI TPM protocol takes the raw operand block, no param block header */
+ status = efi_call_5 (tpm->pass_through_to_tpm, tpm,
+ inbuf->IPBLength - inhdrsize, inbuf->TPMOperandIn,
+ outbuf->OPBLength - outhdrsize, outbuf->TPMOperandOut);
+
+ switch (status) {
+ case GRUB_EFI_SUCCESS:
+ return 0;
+ case GRUB_EFI_DEVICE_ERROR:
+ return grub_error (GRUB_ERR_IO, N_("Command failed"));
+ case GRUB_EFI_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"));
+ 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"));
+ }
+}
+
+static grub_err_t
+grub_tpm2_execute(grub_efi_handle_t tpm_handle,
+ PassThroughToTPM_InputParamBlock *inbuf,
+ PassThroughToTPM_OutputParamBlock *outbuf)
+{
+ grub_efi_status_t status;
+ grub_efi_tpm2_protocol_t *tpm;
+ grub_uint32_t inhdrsize = sizeof(*inbuf) - sizeof(inbuf->TPMOperandIn);
+ grub_uint32_t outhdrsize = sizeof(*outbuf) - sizeof(outbuf->TPMOperandOut);
+
+ tpm = grub_efi_open_protocol (tpm_handle, &tpm2_guid,
+ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+
+ if (!grub_tpm2_present(tpm))
+ return 0;
+
+ /* UEFI TPM protocol takes the raw operand block, no param block header */
+ status = efi_call_5 (tpm->submit_command, tpm,
+ inbuf->IPBLength - inhdrsize, inbuf->TPMOperandIn,
+ outbuf->OPBLength - outhdrsize, outbuf->TPMOperandOut);
+
+ switch (status) {
+ case GRUB_EFI_SUCCESS:
+ return 0;
+ case GRUB_EFI_DEVICE_ERROR:
+ return grub_error (GRUB_ERR_IO, N_("Command failed"));
+ case GRUB_EFI_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"));
+ 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_err_t
+grub_tpm_execute(PassThroughToTPM_InputParamBlock *inbuf,
+ PassThroughToTPM_OutputParamBlock *outbuf)
+{
+ grub_efi_handle_t tpm_handle;
+ grub_uint8_t protocol_version;
+
+ /* It's not a hard failure for there to be no TPM */
+ if (!grub_tpm_handle_find(&tpm_handle, &protocol_version))
+ return 0;
+
+ if (protocol_version == 1) {
+ return grub_tpm1_execute(tpm_handle, inbuf, outbuf);
+ } else {
+ return grub_tpm2_execute(tpm_handle, inbuf, outbuf);
+ }
+}
+
+typedef struct {
+ grub_uint32_t pcrindex;
+ grub_uint32_t eventtype;
+ grub_uint8_t digest[20];
+ grub_uint32_t eventsize;
+ grub_uint8_t event[1];
+} Event;
+
+
+static grub_err_t
+grub_tpm1_log_event(grub_efi_handle_t tpm_handle, unsigned char *buf,
+ grub_size_t size, grub_uint8_t pcr,
+ const char *description)
+{
+ Event *event;
+ grub_efi_status_t status;
+ grub_efi_tpm_protocol_t *tpm;
+ grub_efi_physical_address_t lastevent;
+ grub_uint32_t algorithm;
+ grub_uint32_t eventnum = 0;
+
+ tpm = grub_efi_open_protocol (tpm_handle, &tpm_guid,
+ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+
+ if (!grub_tpm_present(tpm))
+ return 0;
+
+ event = grub_zalloc(sizeof (Event) + grub_strlen(description) + 1);
+ if (!event)
+ return grub_error (GRUB_ERR_OUT_OF_MEMORY,
+ N_("cannot allocate TPM event buffer"));
+
+ event->pcrindex = pcr;
+ event->eventtype = EV_IPL;
+ event->eventsize = grub_strlen(description) + 1;
+ grub_memcpy(event->event, description, event->eventsize);
+
+ algorithm = TCG_ALG_SHA;
+ status = efi_call_7 (tpm->log_extend_event, tpm, buf, (grub_uint64_t) size,
+ algorithm, event, &eventnum, &lastevent);
+
+ switch (status) {
+ case GRUB_EFI_SUCCESS:
+ return 0;
+ case GRUB_EFI_DEVICE_ERROR:
+ return grub_error (GRUB_ERR_IO, N_("Command failed"));
+ case GRUB_EFI_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"));
+ 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"));
+ }
+}
+
+static grub_err_t
+grub_tpm2_log_event(grub_efi_handle_t tpm_handle, unsigned char *buf,
+ grub_size_t size, grub_uint8_t pcr,
+ const char *description)
+{
+ EFI_TCG2_EVENT *event;
+ grub_efi_status_t status;
+ grub_efi_tpm2_protocol_t *tpm;
+
+ tpm = grub_efi_open_protocol (tpm_handle, &tpm2_guid,
+ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+
+ if (!grub_tpm2_present(tpm))
+ return 0;
+
+ event = grub_zalloc(sizeof (EFI_TCG2_EVENT) + grub_strlen(description) + 1);
+ if (!event)
+ return grub_error (GRUB_ERR_OUT_OF_MEMORY,
+ N_("cannot allocate TPM event buffer"));
+
+ event->Header.HeaderSize = sizeof(EFI_TCG2_EVENT_HEADER);
+ event->Header.HeaderVersion = 1;
+ event->Header.PCRIndex = pcr;
+ 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);
+
+ status = efi_call_5 (tpm->hash_log_extend_event, tpm, 0, buf,
+ (grub_uint64_t) size, event);
+
+ switch (status) {
+ case GRUB_EFI_SUCCESS:
+ return 0;
+ case GRUB_EFI_DEVICE_ERROR:
+ return grub_error (GRUB_ERR_IO, N_("Command failed"));
+ case GRUB_EFI_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"));
+ 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_err_t
+grub_tpm_log_event(unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
+ const char *description)
+{
+ 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) {
+ return grub_tpm1_log_event(tpm_handle, buf, size, pcr, description);
+ } else {
+ return grub_tpm2_log_event(tpm_handle, buf, size, pcr, description);
+ }
+}
Index: grub-2.02~beta3/grub-core/kern/i386/pc/tpm.c
===================================================================
--- /dev/null
+++ grub-2.02~beta3/grub-core/kern/i386/pc/tpm.c
@@ -0,0 +1,132 @@
+#include <grub/err.h>
+#include <grub/i18n.h>
+#include <grub/mm.h>
+#include <grub/tpm.h>
+#include <grub/misc.h>
+#include <grub/i386/pc/int.h>
+
+#define TCPA_MAGIC 0x41504354
+
+int tpm_present(void);
+
+int tpm_present(void)
+{
+ struct grub_bios_int_registers regs;
+
+ regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT;
+ regs.eax = 0xbb00;
+ regs.ebx = TCPA_MAGIC;
+ grub_bios_interrupt (0x1a, &regs);
+
+ if (regs.eax == 0)
+ return 1;
+
+ return 0;
+}
+
+grub_err_t
+grub_tpm_execute(PassThroughToTPM_InputParamBlock *inbuf,
+ PassThroughToTPM_OutputParamBlock *outbuf)
+{
+ struct grub_bios_int_registers regs;
+ grub_addr_t inaddr, outaddr;
+
+ if (!tpm_present())
+ return 0;
+
+ inaddr = (grub_addr_t) inbuf;
+ outaddr = (grub_addr_t) outbuf;
+ regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT;
+ regs.eax = 0xbb02;
+ regs.ebx = TCPA_MAGIC;
+ regs.ecx = 0;
+ regs.edx = 0;
+ regs.es = (inaddr & 0xffff0000) >> 4;
+ regs.edi = inaddr & 0xffff;
+ regs.ds = outaddr >> 4;
+ regs.esi = outaddr & 0xf;
+
+ grub_bios_interrupt (0x1a, &regs);
+
+ if (regs.eax)
+ return grub_error (GRUB_ERR_IO, N_("TPM error %x\n"), regs.eax);
+
+ return 0;
+}
+
+typedef struct {
+ grub_uint32_t pcrindex;
+ grub_uint32_t eventtype;
+ grub_uint8_t digest[20];
+ grub_uint32_t eventdatasize;
+ grub_uint8_t event[0];
+} GRUB_PACKED Event;
+
+typedef struct {
+ grub_uint16_t ipblength;
+ grub_uint16_t reserved;
+ grub_uint32_t hashdataptr;
+ grub_uint32_t hashdatalen;
+ grub_uint32_t pcr;
+ grub_uint32_t reserved2;
+ grub_uint32_t logdataptr;
+ grub_uint32_t logdatalen;
+} GRUB_PACKED EventIncoming;
+
+typedef struct {
+ grub_uint16_t opblength;
+ grub_uint16_t reserved;
+ grub_uint32_t eventnum;
+ grub_uint8_t hashvalue[20];
+} GRUB_PACKED EventOutgoing;
+
+grub_err_t
+grub_tpm_log_event(unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
+ const char *description)
+{
+ struct grub_bios_int_registers regs;
+ EventIncoming incoming;
+ EventOutgoing outgoing;
+ Event *event;
+ grub_uint32_t datalength;
+
+ if (!tpm_present())
+ return 0;
+
+ datalength = grub_strlen(description);
+ event = grub_zalloc(datalength + sizeof(Event));
+ if (!event)
+ return grub_error (GRUB_ERR_OUT_OF_MEMORY,
+ N_("cannot allocate TPM event buffer"));
+
+ event->pcrindex = pcr;
+ event->eventtype = 0x0d;
+ event->eventdatasize = grub_strlen(description);
+ grub_memcpy(event->event, description, datalength);
+
+ incoming.ipblength = sizeof(incoming);
+ incoming.hashdataptr = (grub_uint32_t)buf;
+ incoming.hashdatalen = size;
+ incoming.pcr = pcr;
+ incoming.logdataptr = (grub_uint32_t)event;
+ incoming.logdatalen = datalength + sizeof(Event);
+
+ regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT;
+ regs.eax = 0xbb01;
+ regs.ebx = TCPA_MAGIC;
+ regs.ecx = 0;
+ regs.edx = 0;
+ regs.es = (((grub_addr_t) &incoming) & 0xffff0000) >> 4;
+ regs.edi = ((grub_addr_t) &incoming) & 0xffff;
+ regs.ds = (((grub_addr_t) &outgoing) & 0xffff0000) >> 4;
+ regs.esi = ((grub_addr_t) &outgoing) & 0xffff;
+
+ grub_bios_interrupt (0x1a, &regs);
+
+ grub_free(event);
+
+ if (regs.eax)
+ return grub_error (GRUB_ERR_IO, N_("TPM error %x\n"), regs.eax);
+
+ return 0;
+}
Index: grub-2.02~beta3/grub-core/kern/tpm.c
===================================================================
--- /dev/null
+++ grub-2.02~beta3/grub-core/kern/tpm.c
@@ -0,0 +1,19 @@
+#include <grub/err.h>
+#include <grub/i18n.h>
+#include <grub/misc.h>
+#include <grub/mm.h>
+#include <grub/tpm.h>
+#include <grub/term.h>
+
+grub_err_t
+grub_tpm_measure (unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
+ const char *kind, const char *description)
+{
+ grub_err_t ret;
+ char *desc = grub_xasprintf("%s %s", kind, description);
+ if (!desc)
+ return GRUB_ERR_OUT_OF_MEMORY;
+ ret = grub_tpm_log_event(buf, size, pcr, description);
+ grub_free(desc);
+ return ret;
+}
Index: grub-2.02~beta3/include/grub/efi/tpm.h
===================================================================
--- /dev/null
+++ grub-2.02~beta3/include/grub/efi/tpm.h
@@ -0,0 +1,153 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2015 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_TPM_HEADER
+#define GRUB_EFI_TPM_HEADER 1
+
+#define EFI_TPM_GUID {0xf541796d, 0xa62e, 0x4954, {0xa7, 0x75, 0x95, 0x84, 0xf6, 0x1b, 0x9c, 0xdd }};
+#define EFI_TPM2_GUID {0x607f766c, 0x7455, 0x42be, {0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f }};
+
+typedef struct {
+ grub_efi_uint8_t Major;
+ grub_efi_uint8_t Minor;
+ grub_efi_uint8_t RevMajor;
+ grub_efi_uint8_t RevMinor;
+} TCG_VERSION;
+
+typedef struct _TCG_EFI_BOOT_SERVICE_CAPABILITY {
+ grub_efi_uint8_t Size; /// Size of this structure.
+ TCG_VERSION StructureVersion;
+ TCG_VERSION ProtocolSpecVersion;
+ grub_efi_uint8_t HashAlgorithmBitmap; /// Hash algorithms .
+ char TPMPresentFlag; /// 00h = TPM not present.
+ char TPMDeactivatedFlag; /// 01h = TPM currently deactivated.
+} TCG_EFI_BOOT_SERVICE_CAPABILITY;
+
+typedef struct {
+ grub_efi_uint32_t PCRIndex;
+ grub_efi_uint32_t EventType;
+ grub_efi_uint8_t digest[20];
+ grub_efi_uint32_t EventSize;
+ grub_efi_uint8_t Event[1];
+} TCG_PCR_EVENT;
+
+struct grub_efi_tpm_protocol
+{
+ grub_efi_status_t (*status_check) (struct grub_efi_tpm_protocol *this,
+ TCG_EFI_BOOT_SERVICE_CAPABILITY *ProtocolCapability,
+ grub_efi_uint32_t *TCGFeatureFlags,
+ grub_efi_physical_address_t *EventLogLocation,
+ grub_efi_physical_address_t *EventLogLastEntry);
+ grub_efi_status_t (*hash_all) (struct grub_efi_tpm_protocol *this,
+ grub_efi_uint8_t *HashData,
+ grub_efi_uint64_t HashLen,
+ grub_efi_uint32_t AlgorithmId,
+ grub_efi_uint64_t *HashedDataLen,
+ grub_efi_uint8_t **HashedDataResult);
+ grub_efi_status_t (*log_event) (struct grub_efi_tpm_protocol *this,
+ TCG_PCR_EVENT *TCGLogData,
+ grub_efi_uint32_t *EventNumber,
+ grub_efi_uint32_t Flags);
+ grub_efi_status_t (*pass_through_to_tpm) (struct grub_efi_tpm_protocol *this,
+ grub_efi_uint32_t TpmInputParameterBlockSize,
+ grub_efi_uint8_t *TpmInputParameterBlock,
+ grub_efi_uint32_t TpmOutputParameterBlockSize,
+ grub_efi_uint8_t *TpmOutputParameterBlock);
+ grub_efi_status_t (*log_extend_event) (struct grub_efi_tpm_protocol *this,
+ grub_efi_physical_address_t HashData,
+ grub_efi_uint64_t HashDataLen,
+ grub_efi_uint32_t AlgorithmId,
+ TCG_PCR_EVENT *TCGLogData,
+ grub_efi_uint32_t *EventNumber,
+ grub_efi_physical_address_t *EventLogLastEntry);
+};
+
+typedef struct grub_efi_tpm_protocol grub_efi_tpm_protocol_t;
+
+typedef grub_efi_uint32_t EFI_TCG2_EVENT_LOG_BITMAP;
+typedef grub_efi_uint32_t EFI_TCG2_EVENT_LOG_FORMAT;
+typedef grub_efi_uint32_t EFI_TCG2_EVENT_ALGORITHM_BITMAP;
+
+typedef struct tdEFI_TCG2_VERSION {
+ grub_efi_uint8_t Major;
+ grub_efi_uint8_t Minor;
+} GRUB_PACKED EFI_TCG2_VERSION;
+
+typedef struct tdEFI_TCG2_BOOT_SERVICE_CAPABILITY {
+ grub_efi_uint8_t Size;
+ EFI_TCG2_VERSION StructureVersion;
+ EFI_TCG2_VERSION ProtocolVersion;
+ EFI_TCG2_EVENT_ALGORITHM_BITMAP HashAlgorithmBitmap;
+ EFI_TCG2_EVENT_LOG_BITMAP SupportedEventLogs;
+ grub_efi_boolean_t TPMPresentFlag;
+ grub_efi_uint16_t MaxCommandSize;
+ grub_efi_uint16_t MaxResponseSize;
+ grub_efi_uint32_t ManufacturerID;
+ grub_efi_uint32_t NumberOfPcrBanks;
+ EFI_TCG2_EVENT_ALGORITHM_BITMAP ActivePcrBanks;
+} EFI_TCG2_BOOT_SERVICE_CAPABILITY;
+
+typedef grub_efi_uint32_t TCG_PCRINDEX;
+typedef grub_efi_uint32_t TCG_EVENTTYPE;
+
+typedef struct tdEFI_TCG2_EVENT_HEADER {
+ grub_efi_uint32_t HeaderSize;
+ grub_efi_uint16_t HeaderVersion;
+ TCG_PCRINDEX PCRIndex;
+ TCG_EVENTTYPE EventType;
+} GRUB_PACKED EFI_TCG2_EVENT_HEADER;
+
+typedef struct tdEFI_TCG2_EVENT {
+ grub_efi_uint32_t Size;
+ EFI_TCG2_EVENT_HEADER Header;
+ grub_efi_uint8_t Event[1];
+} GRUB_PACKED EFI_TCG2_EVENT;
+
+struct grub_efi_tpm2_protocol
+{
+ grub_efi_status_t (*get_capability) (struct grub_efi_tpm2_protocol *this,
+ EFI_TCG2_BOOT_SERVICE_CAPABILITY *ProtocolCapability);
+ grub_efi_status_t (*get_event_log) (struct grub_efi_tpm2_protocol *this,
+ EFI_TCG2_EVENT_LOG_FORMAT 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_tpm2_protocol *this,
+ grub_efi_uint64_t Flags,
+ grub_efi_physical_address_t *DataToHash,
+ grub_efi_uint64_t DataToHashLen,
+ EFI_TCG2_EVENT *EfiTcgEvent);
+ grub_efi_status_t (*submit_command) (struct grub_efi_tpm2_protocol *this,
+ grub_efi_uint32_t InputParameterBlockSize,
+ grub_efi_uint8_t *InputParameterBlock,
+ grub_efi_uint32_t OutputParameterBlockSize,
+ grub_efi_uint8_t *OutputParameterBlock);
+ grub_efi_status_t (*get_active_pcr_blanks) (struct grub_efi_tpm2_protocol *this,
+ grub_efi_uint32_t *ActivePcrBanks);
+ grub_efi_status_t (*set_active_pcr_banks) (struct grub_efi_tpm2_protocol *this,
+ grub_efi_uint32_t ActivePcrBanks);
+ grub_efi_status_t (*get_result_of_set_active_pcr_banks) (struct grub_efi_tpm2_protocol *this,
+ grub_efi_uint32_t *OperationPresent,
+ grub_efi_uint32_t *Response);
+};
+
+typedef struct grub_efi_tpm2_protocol grub_efi_tpm2_protocol_t;
+
+#define TCG_ALG_SHA 0x00000004
+
+#endif
Index: grub-2.02~beta3/include/grub/tpm.h
===================================================================
--- /dev/null
+++ grub-2.02~beta3/include/grub/tpm.h
@@ -0,0 +1,89 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2015 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_TPM_HEADER
+#define GRUB_TPM_HEADER 1
+
+#define SHA1_DIGEST_SIZE 20
+
+#define TPM_BASE 0x0
+#define TPM_SUCCESS TPM_BASE
+#define TPM_AUTHFAIL (TPM_BASE + 0x1)
+#define TPM_BADINDEX (TPM_BASE + 0x2)
+
+#define GRUB_ASCII_PCR 8
+#define GRUB_BINARY_PCR 9
+
+#define TPM_TAG_RQU_COMMAND 0x00C1
+#define TPM_ORD_Extend 0x14
+
+#define EV_IPL 0x0d
+
+/* TCG_PassThroughToTPM Input Parameter Block */
+typedef struct {
+ grub_uint16_t IPBLength;
+ grub_uint16_t Reserved1;
+ grub_uint16_t OPBLength;
+ grub_uint16_t Reserved2;
+ grub_uint8_t TPMOperandIn[1];
+} GRUB_PACKED PassThroughToTPM_InputParamBlock;
+
+/* TCG_PassThroughToTPM Output Parameter Block */
+typedef struct {
+ grub_uint16_t OPBLength;
+ grub_uint16_t Reserved;
+ grub_uint8_t TPMOperandOut[1];
+} GRUB_PACKED PassThroughToTPM_OutputParamBlock;
+
+typedef struct {
+ grub_uint16_t tag;
+ grub_uint32_t paramSize;
+ grub_uint32_t ordinal;
+ grub_uint32_t pcrNum;
+ grub_uint8_t inDigest[SHA1_DIGEST_SIZE]; /* The 160 bit value representing the event to be recorded. */
+} GRUB_PACKED ExtendIncoming;
+
+/* TPM_Extend Outgoing Operand */
+typedef struct {
+ grub_uint16_t tag;
+ grub_uint32_t paramSize;
+ grub_uint32_t returnCode;
+ grub_uint8_t outDigest[SHA1_DIGEST_SIZE]; /* The PCR value after execution of the command. */
+} GRUB_PACKED ExtendOutgoing;
+
+grub_err_t EXPORT_FUNC(grub_tpm_measure) (unsigned char *buf, grub_size_t size,
+ grub_uint8_t pcr, const char *kind,
+ const char *description);
+#if defined (GRUB_MACHINE_EFI) || defined (GRUB_MACHINE_PCBIOS)
+grub_err_t grub_tpm_execute(PassThroughToTPM_InputParamBlock *inbuf,
+ PassThroughToTPM_OutputParamBlock *outbuf);
+grub_err_t grub_tpm_log_event(unsigned char *buf, grub_size_t size,
+ grub_uint8_t pcr, const char *description);
+#else
+static inline grub_err_t grub_tpm_execute(PassThroughToTPM_InputParamBlock *inbuf,
+ PassThroughToTPM_OutputParamBlock *outbuf) { return 0; };
+static inline grub_err_t grub_tpm_log_event(unsigned char *buf,
+ grub_size_t size,
+ grub_uint8_t pcr,
+ const char *description)
+{
+ return 0;
+};
+#endif
+
+#endif

View File

@ -0,0 +1,29 @@
From 446794de8da4329ea532cbee4ca877bcafd0e534 Mon Sep 17 00:00:00 2001
From: "David E. Box" <david.e.box@linux.intel.com>
Date: Fri, 15 Sep 2017 15:37:05 -0700
Subject: [PATCH] tsc: Change default tsc calibration method to pmtimer on EFI
systems
On efi systems, make pmtimer based tsc calibration the default over the
pit. This prevents Grub from hanging on Intel SoC systems that power gate
the pit.
Signed-off-by: David E. Box <david.e.box@linux.intel.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
---
grub-core/kern/i386/tsc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: grub-2.02/grub-core/kern/i386/tsc.c
===================================================================
--- grub-2.02.orig/grub-core/kern/i386/tsc.c
+++ grub-2.02/grub-core/kern/i386/tsc.c
@@ -68,7 +68,7 @@ grub_tsc_init (void)
#ifdef GRUB_MACHINE_XEN
(void) (grub_tsc_calibrate_from_xen () || calibrate_tsc_hardcode());
#elif defined (GRUB_MACHINE_EFI)
- (void) (grub_tsc_calibrate_from_pit () || grub_tsc_calibrate_from_pmtimer () || grub_tsc_calibrate_from_efi() || calibrate_tsc_hardcode());
+ (void) (grub_tsc_calibrate_from_pmtimer () || grub_tsc_calibrate_from_pit () || grub_tsc_calibrate_from_efi() || calibrate_tsc_hardcode());
#elif defined (GRUB_MACHINE_COREBOOT)
(void) (grub_tsc_calibrate_from_pmtimer () || grub_tsc_calibrate_from_pit () || calibrate_tsc_hardcode());
#else

View File

@ -0,0 +1,57 @@
From cda0a857dd7a27cd5d621747464bfe71e8727fff Mon Sep 17 00:00:00 2001
From: Daniel Kiper <daniel.kiper@oracle.com>
Date: Tue, 29 May 2018 16:16:02 +0200
Subject: [PATCH] xfs: Accept filesystem with sparse inodes
The sparse inode metadata format became a mkfs.xfs default in
xfsprogs-4.16.0, and such filesystems are now rejected by grub as
containing an incompatible feature.
In essence, this feature allows xfs to allocate inodes into fragmented
freespace. (Without this feature, if xfs could not allocate contiguous
space for 64 new inodes, inode creation would fail.)
In practice, the disk format change is restricted to the inode btree,
which as far as I can tell is not used by grub. If all you're doing
today is parsing a directory, reading an inode number, and converting
that inode number to a disk location, then ignoring this feature
should be fine, so I've added it to XFS_SB_FEAT_INCOMPAT_SUPPORTED
I did some brief testing of this patch by hacking up the regression
tests to completely fragment freespace on the test xfs filesystem, and
then write a large-ish number of inodes to consume any existing
contiguous 64-inode chunk. This way any files the grub tests add and
traverse would be in such a fragmented inode allocation. Tests passed,
but I'm not sure how to cleanly integrate that into the test harness.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
Tested-by: Chris Murphy <lists@colorremedies.com>
---
grub-core/fs/xfs.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
Index: grub-2.02/grub-core/fs/xfs.c
===================================================================
--- grub-2.02.orig/grub-core/fs/xfs.c
+++ grub-2.02/grub-core/fs/xfs.c
@@ -79,9 +79,18 @@ GRUB_MOD_LICENSE ("GPLv3+");
#define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1) /* sparse inode chunks */
#define XFS_SB_FEAT_INCOMPAT_META_UUID (1 << 2) /* metadata UUID */
-/* We do not currently verify metadata UUID so it is safe to read such filesystem */
+/*
+ * Directory entries with ftype are explicitly handled by GRUB code.
+ *
+ * We do not currently read the inode btrees, so it is safe to read filesystems
+ * with the XFS_SB_FEAT_INCOMPAT_SPINODES feature.
+ *
+ * We do not currently verify metadata UUID, so it is safe to read filesystems
+ * with the XFS_SB_FEAT_INCOMPAT_META_UUID feature.
+ */
#define XFS_SB_FEAT_INCOMPAT_SUPPORTED \
(XFS_SB_FEAT_INCOMPAT_FTYPE | \
+ XFS_SB_FEAT_INCOMPAT_SPINODES | \
XFS_SB_FEAT_INCOMPAT_META_UUID)
struct grub_xfs_sblock

View File

@ -0,0 +1,360 @@
From d17c80ca8de35f8cb06175965d428bdabbda3c19 Mon Sep 17 00:00:00 2001
From: Paulo Flabiano Smorigo <pfsmorigo@linux.vnet.ibm.com>
Date: Mon, 30 Jun 2014 10:37:08 -0300
Subject: [PATCH 2/2] Add Virtual LAN support.
This patch adds support for virtual LAN (VLAN) tagging. VLAN tagging allows
multiple VLANs in a bridged network to share the same physical network link
but maintain isolation:
http://en.wikipedia.org/wiki/IEEE_802.1Q
---
ChangeLog | 17 ++++++++++++
grub-core/net/arp.c | 10 +++++--
grub-core/net/drivers/ieee1275/ofnet.c | 20 +++++++++++++-
grub-core/net/ethernet.c | 49 ++++++++++++++++++++++++++++++----
grub-core/net/ip.c | 31 ++++++++++++++-------
include/grub/net.h | 9 +++++++
include/grub/net/arp.h | 5 ++--
include/grub/net/ip.h | 3 ++-
8 files changed, 124 insertions(+), 20 deletions(-)
Index: grub-2.02~beta3/grub-core/net/arp.c
===================================================================
--- grub-2.02~beta3.orig/grub-core/net/arp.c 2016-02-28 19:23:27.060877621 +0300
+++ grub-2.02~beta3/grub-core/net/arp.c 2016-02-28 19:23:27.056877621 +0300
@@ -111,8 +111,8 @@
}
grub_err_t
-grub_net_arp_receive (struct grub_net_buff *nb,
- struct grub_net_card *card)
+grub_net_arp_receive (struct grub_net_buff *nb, struct grub_net_card *card,
+ grub_uint16_t vlantag_vid)
{
struct arppkt *arp_packet = (struct arppkt *) nb->data;
grub_net_network_level_address_t sender_addr, target_addr;
@@ -138,6 +138,12 @@
FOR_NET_NETWORK_LEVEL_INTERFACES (inf)
{
+ /* Check vlantag id */
+ if (inf->card == card &&
+ ((inf->vlantag.set && vlantag_vid != inf->vlantag.vid) ||
+ (!inf->vlantag.set && vlantag_vid != 0)))
+ continue;
+
/* Am I the protocol address target? */
if (grub_net_addr_cmp (&inf->address, &target_addr) == 0
&& arp_packet->op == grub_cpu_to_be16_compile_time (ARP_REQUEST))
Index: grub-2.02~beta3/grub-core/net/drivers/ieee1275/ofnet.c
===================================================================
--- grub-2.02~beta3.orig/grub-core/net/drivers/ieee1275/ofnet.c 2016-02-28 19:23:27.060877621 +0300
+++ grub-2.02~beta3/grub-core/net/drivers/ieee1275/ofnet.c 2016-02-28 19:24:47.004878566 +0300
@@ -147,11 +147,11 @@
char *comma_char = 0;
char *equal_char = 0;
grub_size_t field_counter = 0;
-
grub_net_network_level_address_t client_addr, gateway_addr, subnet_mask;
grub_net_link_level_address_t hw_addr;
grub_net_interface_flags_t flags = 0;
struct grub_net_network_level_interface *inter = NULL;
+ grub_uint32_t vlantag = 0;
hw_addr.type = GRUB_NET_LINK_LEVEL_PROTOCOL_ETHERNET;
@@ -169,6 +169,18 @@
*equal_char = 0;
grub_env_set_net_property ((*card)->name, args, equal_char + 1,
grub_strlen(equal_char + 1));
+
+ if ((grub_strcmp (args, "vtag") == 0) &&
+ (grub_strlen (equal_char + 1) > 4))
+ {
+ vlantag = grub_strtoul (equal_char + 1, 0, 16) & 0xffff;
+ if (grub_errno == GRUB_ERR_BAD_NUMBER)
+ {
+ vlantag = 0;
+ grub_errno = GRUB_ERR_NONE;
+ }
+ }
+
*equal_char = '=';
}
else
@@ -207,6 +219,12 @@
hw_addr.mac, sizeof(hw_addr.mac), 0);
inter = grub_net_add_addr ((*card)->name, *card, &client_addr, &hw_addr,
flags);
+ if (vlantag > 0)
+ {
+ inter->vlantag.set = 1;
+ inter->vlantag.vid = vlantag & 0xfff;
+ }
+
grub_net_add_ipv4_local (inter,
__builtin_ctz (~grub_le_to_cpu32 (subnet_mask.ipv4)));
}
Index: grub-2.02~beta3/grub-core/net/ethernet.c
===================================================================
--- grub-2.02~beta3.orig/grub-core/net/ethernet.c 2016-02-28 19:23:27.060877621 +0300
+++ grub-2.02~beta3/grub-core/net/ethernet.c 2016-02-28 19:23:27.056877621 +0300
@@ -18,6 +18,7 @@
#include <grub/misc.h>
#include <grub/mm.h>
+#include <grub/env.h>
#include <grub/net/ethernet.h>
#include <grub/net/ip.h>
#include <grub/net/arp.h>
@@ -56,10 +57,16 @@
{
struct etherhdr *eth;
grub_err_t err;
+ grub_uint8_t etherhdr_size;
- COMPILE_TIME_ASSERT (sizeof (*eth) < GRUB_NET_MAX_LINK_HEADER_SIZE);
+ etherhdr_size = sizeof (*eth);
+ COMPILE_TIME_ASSERT (sizeof (*eth) + 4 < GRUB_NET_MAX_LINK_HEADER_SIZE);
- err = grub_netbuff_push (nb, sizeof (*eth));
+ /* Increase ethernet header in case of vlantag */
+ if (inf->vlantag.set)
+ etherhdr_size += 4;
+
+ err = grub_netbuff_push (nb, etherhdr_size);
if (err)
return err;
eth = (struct etherhdr *) nb->data;
@@ -76,6 +83,21 @@
return err;
inf->card->opened = 1;
}
+
+ /* Check and add a vlan-tag if needed. */
+ if (inf->vlantag.set)
+ {
+ grub_uint32_t vlantag;
+ vlantag = grub_cpu_to_be32 ((VLANTAG_IDENTIFIER << 16) | inf->vlantag.vid);
+
+ /* Move eth type to the right */
+ grub_memcpy ((char *) nb->data + etherhdr_size - 2,
+ (char *) nb->data + etherhdr_size - 6, 2);
+
+ /* Add the tag in the middle */
+ grub_memcpy ((char *) nb->data + etherhdr_size - 6, &vlantag, 4);
+ }
+
return inf->card->driver->send (inf->card, nb);
}
@@ -90,10 +112,26 @@
grub_net_link_level_address_t hwaddress;
grub_net_link_level_address_t src_hwaddress;
grub_err_t err;
+ grub_uint8_t etherhdr_size = sizeof (*eth);
+ grub_uint16_t vlantag_vid = 0;
+
+ /* Check if a vlan-tag is present. If so, the ethernet header is 4 bytes */
+ /* longer than the original one. The vlantag id is extracted and the header */
+ /* is reseted to the original size. */
+ if (grub_get_unaligned16 (nb->data + etherhdr_size - 2) ==
+ grub_cpu_to_be16_compile_time (VLANTAG_IDENTIFIER))
+ {
+ vlantag_vid = grub_be_to_cpu16 (grub_get_unaligned16 (nb->data +
+ etherhdr_size)) & 0x1fff;
+ etherhdr_size += 4;
+ /* Move eth type to the original position */
+ grub_memcpy((char *) nb->data + etherhdr_size - 6,
+ (char *) nb->data + etherhdr_size - 2, 2);
+ }
eth = (struct etherhdr *) nb->data;
type = grub_be_to_cpu16 (eth->type);
- err = grub_netbuff_pull (nb, sizeof (*eth));
+ err = grub_netbuff_pull (nb, etherhdr_size);
if (err)
return err;
@@ -121,13 +159,14 @@
{
/* ARP packet. */
case GRUB_NET_ETHERTYPE_ARP:
- grub_net_arp_receive (nb, card);
+ grub_net_arp_receive (nb, card, vlantag_vid);
grub_netbuff_free (nb);
return GRUB_ERR_NONE;
/* IP packet. */
case GRUB_NET_ETHERTYPE_IP:
case GRUB_NET_ETHERTYPE_IP6:
- return grub_net_recv_ip_packets (nb, card, &hwaddress, &src_hwaddress);
+ return grub_net_recv_ip_packets (nb, card, &hwaddress, &src_hwaddress,
+ vlantag_vid);
}
grub_netbuff_free (nb);
return GRUB_ERR_NONE;
Index: grub-2.02~beta3/grub-core/net/ip.c
===================================================================
--- grub-2.02~beta3.orig/grub-core/net/ip.c 2016-02-28 19:23:27.060877621 +0300
+++ grub-2.02~beta3/grub-core/net/ip.c 2016-02-28 19:23:27.056877621 +0300
@@ -228,12 +228,13 @@
grub_net_ip_protocol_t proto,
const grub_net_network_level_address_t *source,
const grub_net_network_level_address_t *dest,
+ grub_uint16_t vlantag_vid,
grub_uint8_t ttl)
{
struct grub_net_network_level_interface *inf = NULL;
grub_err_t err;
int multicast = 0;
-
+
/* DHCP needs special treatment since we don't know IP yet. */
{
struct udphdr *udph;
@@ -293,6 +294,13 @@
&& grub_net_addr_cmp (&inf->address, dest) == 0
&& grub_net_hwaddr_cmp (&inf->hwaddress, hwaddress) == 0)
break;
+
+ /* Check vlantag id */
+ if (inf->card == card &&
+ ((inf->vlantag.set && vlantag_vid != inf->vlantag.vid) ||
+ (!inf->vlantag.set && vlantag_vid != 0)))
+ continue;
+
/* Solicited node multicast. */
if (inf->card == card
&& inf->address.type == GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV6
@@ -381,7 +389,8 @@
grub_net_recv_ip4_packets (struct grub_net_buff *nb,
struct grub_net_card *card,
const grub_net_link_level_address_t *hwaddress,
- const grub_net_link_level_address_t *src_hwaddress)
+ const grub_net_link_level_address_t *src_hwaddress,
+ grub_uint16_t vlantag_vid)
{
struct iphdr *iph = (struct iphdr *) nb->data;
grub_err_t err;
@@ -456,7 +465,7 @@
dest.ipv4 = iph->dest;
return handle_dgram (nb, card, src_hwaddress, hwaddress, iph->protocol,
- &source, &dest, iph->ttl);
+ &source, &dest, vlantag_vid, iph->ttl);
}
for (prev = &reassembles, rsm = *prev; rsm; prev = &rsm->next, rsm = *prev)
@@ -592,7 +601,7 @@
dest.ipv4 = dst;
return handle_dgram (ret, card, src_hwaddress,
- hwaddress, proto, &source, &dest,
+ hwaddress, proto, &source, &dest, vlantag_vid,
ttl);
}
}
@@ -650,7 +659,8 @@
grub_net_recv_ip6_packets (struct grub_net_buff *nb,
struct grub_net_card *card,
const grub_net_link_level_address_t *hwaddress,
- const grub_net_link_level_address_t *src_hwaddress)
+ const grub_net_link_level_address_t *src_hwaddress,
+ grub_uint16_t vlantag_vid)
{
struct ip6hdr *iph = (struct ip6hdr *) nb->data;
grub_err_t err;
@@ -701,21 +711,24 @@
grub_memcpy (dest.ipv6, &iph->dest, sizeof (dest.ipv6));
return handle_dgram (nb, card, src_hwaddress, hwaddress, iph->protocol,
- &source, &dest, iph->ttl);
+ &source, &dest, vlantag_vid, iph->ttl);
}
grub_err_t
grub_net_recv_ip_packets (struct grub_net_buff *nb,
struct grub_net_card *card,
const grub_net_link_level_address_t *hwaddress,
- const grub_net_link_level_address_t *src_hwaddress)
+ const grub_net_link_level_address_t *src_hwaddress,
+ grub_uint16_t vlantag_vid)
{
struct iphdr *iph = (struct iphdr *) nb->data;
if ((iph->verhdrlen >> 4) == 4)
- return grub_net_recv_ip4_packets (nb, card, hwaddress, src_hwaddress);
+ return grub_net_recv_ip4_packets (nb, card, hwaddress, src_hwaddress,
+ vlantag_vid);
if ((iph->verhdrlen >> 4) == 6)
- return grub_net_recv_ip6_packets (nb, card, hwaddress, src_hwaddress);
+ return grub_net_recv_ip6_packets (nb, card, hwaddress, src_hwaddress,
+ vlantag_vid);
grub_dprintf ("net", "Bad IP version: %d\n", (iph->verhdrlen >> 4));
grub_netbuff_free (nb);
return GRUB_ERR_NONE;
Index: grub-2.02~beta3/include/grub/net.h
===================================================================
--- grub-2.02~beta3.orig/include/grub/net.h 2016-02-28 19:23:27.060877621 +0300
+++ grub-2.02~beta3/include/grub/net.h 2016-02-28 19:23:27.056877621 +0300
@@ -280,6 +280,12 @@
extern grub_net_t (*EXPORT_VAR (grub_net_open)) (const char *name);
+struct grub_net_vlantag
+{
+ grub_uint8_t set;
+ grub_uint16_t vid;
+};
+
struct grub_net_network_level_interface
{
struct grub_net_network_level_interface *next;
@@ -291,6 +297,7 @@
grub_net_interface_flags_t flags;
struct grub_net_bootp_packet *dhcp_ack;
grub_size_t dhcp_acklen;
+ struct grub_net_vlantag vlantag;
void *data;
};
@@ -561,4 +568,6 @@
#define GRUB_NET_INTERVAL 400
#define GRUB_NET_INTERVAL_ADDITION 20
+#define VLANTAG_IDENTIFIER 0x8100
+
#endif /* ! GRUB_NET_HEADER */
Index: grub-2.02~beta3/include/grub/net/arp.h
===================================================================
--- grub-2.02~beta3.orig/include/grub/net/arp.h 2016-02-28 19:23:27.060877621 +0300
+++ grub-2.02~beta3/include/grub/net/arp.h 2016-02-28 19:23:27.056877621 +0300
@@ -22,10 +22,11 @@
#include <grub/net.h>
extern grub_err_t grub_net_arp_receive (struct grub_net_buff *nb,
- struct grub_net_card *card);
+ struct grub_net_card *card,
+ grub_uint16_t vlantag_vid);
grub_err_t
grub_net_arp_send_request (struct grub_net_network_level_interface *inf,
- const grub_net_network_level_address_t *proto_addr);
+ const grub_net_network_level_address_t *proto_addr);
#endif
Index: grub-2.02~beta3/include/grub/net/ip.h
===================================================================
--- grub-2.02~beta3.orig/include/grub/net/ip.h 2016-02-28 19:23:27.060877621 +0300
+++ grub-2.02~beta3/include/grub/net/ip.h 2016-02-28 19:23:27.056877621 +0300
@@ -48,7 +48,8 @@
grub_net_recv_ip_packets (struct grub_net_buff *nb,
struct grub_net_card *card,
const grub_net_link_level_address_t *hwaddress,
- const grub_net_link_level_address_t *src_hwaddress);
+ const grub_net_link_level_address_t *src_hwaddress,
+ grub_uint16_t vlantag_vid);
grub_err_t
grub_net_send_ip_packet (struct grub_net_network_level_interface *inf,

View File

@ -0,0 +1,55 @@
From 4f4128defdec0958f7a38736e2c9be2368a5a6da Mon Sep 17 00:00:00 2001
From: Michael Chang <mchang@suse.com>
Date: Thu, 11 Apr 2019 17:14:03 +0800
Subject: [PATCH 2/8] jfs: Disable gcc9 -Waddress-of-packed-member
Disable the -Wadress-of-packaed-member diagnostic for the
grub_jfs_getent function since the result is found to be false postive.
The leaf is read into memory as continous chunks in size of 32 bytes and
the pointer to its base is aligned, which also guarentee its member
leaf->namepart is aligned.
[ 60s] ../grub-core/fs/jfs.c: In function 'grub_jfs_getent':
[ 60s] ../grub-core/fs/jfs.c:557:44: error: taking address of packed member of 'struct grub_jfs_leaf_dirent' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 60s] 557 | le_to_cpu16_copy (filename + strpos, leaf->namepart, len < diro->data->namecomponentlen ? len
[ 60s] | ~~~~^~~~~~~~~~
[ 60s] ../grub-core/fs/jfs.c:570:48: error: taking address of packed member of 'struct grub_jfs_leaf_next_dirent' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 60s] 570 | le_to_cpu16_copy (filename + strpos, next_leaf->namepart, len < 15 ? len : 15);
[ 60s] | ~~~~~~~~~^~~~~~~~~~
[ 60s] cc1: all warnings being treated as errors
Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
---
grub-core/fs/jfs.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/grub-core/fs/jfs.c b/grub-core/fs/jfs.c
index 09bc5608d..d5a6d6527 100644
--- a/grub-core/fs/jfs.c
+++ b/grub-core/fs/jfs.c
@@ -505,6 +505,10 @@ le_to_cpu16_copy (grub_uint16_t *out, grub_uint16_t *in, grub_size_t len)
*out++ = grub_le_to_cpu16 (*in++);
}
+#if __GNUC__ >= 9
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Waddress-of-packed-member"
+#endif
/* Read in the next dirent from the directory described by DIRO. */
static grub_err_t
@@ -582,6 +586,9 @@ grub_jfs_getent (struct grub_jfs_diropen *diro)
return 0;
}
+#if __GNUC__ >= 9
+#pragma GCC diagnostic pop
+#endif
/* Read LEN bytes from the file described by DATA starting with byte
POS. Return the amount of read bytes in READ. */
--
2.16.4

View File

@ -0,0 +1,39 @@
From b3afe6ad07192d3f38875e30b57a785ac3b1ea27 Mon Sep 17 00:00:00 2001
From: Matthew Garrett <mjg59@coreos.com>
Date: Thu, 16 Jul 2015 15:22:34 -0700
Subject: [PATCH 02/11] Measure kernel + initrd
Measure the kernel and initrd when loaded on UEFI systems
---
grub-core/loader/i386/efi/linux.c | 4 ++++
1 file changed, 4 insertions(+)
Index: grub-2.02~beta3/grub-core/loader/i386/efi/linux.c
===================================================================
--- grub-2.02~beta3.orig/grub-core/loader/i386/efi/linux.c
+++ grub-2.02~beta3/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/tpm.h>
GRUB_MOD_LICENSE ("GPLv3+");
@@ -162,6 +163,7 @@ grub_cmd_initrd (grub_command_t cmd __at
argv[i]);
goto fail;
}
+ grub_tpm_measure (ptr, cursize, GRUB_BINARY_PCR, "grub_linuxefi", "Initrd");
ptr += cursize;
grub_memset (ptr, 0, ALIGN_UP_OVERHEAD (cursize, 4));
ptr += ALIGN_UP_OVERHEAD (cursize, 4);
@@ -217,6 +219,8 @@ grub_cmd_linux (grub_command_t cmd __att
goto fail;
}
+ grub_tpm_measure (kernel, filelen, GRUB_BINARY_PCR, "grub_linuxefi", "Kernel");
+
if (! grub_linuxefi_secure_validate (kernel, filelen))
{
grub_error (GRUB_ERR_INVALID_COMMAND, N_("%s has invalid signature"), argv[0]);

View File

@ -14,10 +14,10 @@ Signed-off-by: Ken Lin <ken.lin@hpe.com>
include/grub/net.h | 72 ++++
3 files changed, 1018 insertions(+), 1 deletion(-)
Index: grub-2.04~rc1/grub-core/net/bootp.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/net/bootp.c
+++ grub-2.04~rc1/grub-core/net/bootp.c
diff --git a/grub-core/net/bootp.c b/grub-core/net/bootp.c
index 189551a..81173b4 100644
--- 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>
@ -115,10 +115,10 @@ Index: grub-2.04~rc1/grub-core/net/bootp.c
+ return 1;
+}
struct grub_dhcp_discover_options
{
@@ -563,6 +655,578 @@ out:
return err;
static void
parse_dhcp_vendor (const char *name, const void *vend, int limit, int *mask)
@@ -266,6 +358,578 @@ grub_net_configure_by_dhcp_ack (const char *name,
return inter;
}
+/* The default netbuff size for sending DHCPv6 packets which should be
@ -693,10 +693,10 @@ Index: grub-2.04~rc1/grub-core/net/bootp.c
+ return inf;
+}
+
/*
* This is called directly from net/ip.c:handle_dgram(), because those
* BOOTP/DHCP packets are a bit special due to their improper
@@ -631,6 +1295,77 @@ grub_net_process_dhcp (struct grub_net_b
void
grub_net_process_dhcp (struct grub_net_buff *nb,
struct grub_net_card *card)
@@ -298,6 +962,77 @@ grub_net_process_dhcp (struct grub_net_buff *nb,
}
}
@ -774,11 +774,11 @@ Index: grub-2.04~rc1/grub-core/net/bootp.c
static char
hexdigit (grub_uint8_t val)
{
@@ -864,7 +1599,174 @@ grub_cmd_bootp (struct grub_command *cmd
@@ -578,7 +1313,174 @@ grub_cmd_bootp (struct grub_command *cmd __attribute__ ((unused)),
return err;
}
-static grub_command_t cmd_getdhcp, cmd_bootp, cmd_dhcp;
-static grub_command_t cmd_getdhcp, cmd_bootp;
+static grub_err_t
+grub_cmd_bootp6 (struct grub_command *cmd __attribute__ ((unused)),
+ int argc, char **args)
@ -946,11 +946,11 @@ Index: grub-2.04~rc1/grub-core/net/bootp.c
+ return err;
+}
+
+static grub_command_t cmd_getdhcp, cmd_bootp, cmd_dhcp, cmd_bootp6;
+static grub_command_t cmd_getdhcp, cmd_bootp, cmd_bootp6;
void
grub_bootp_init (void)
@@ -878,6 +1780,9 @@ grub_bootp_init (void)
@@ -589,6 +1491,9 @@ grub_bootp_init (void)
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."));
@ -960,17 +960,17 @@ Index: grub-2.04~rc1/grub-core/net/bootp.c
}
void
@@ -886,4 +1791,5 @@ grub_bootp_fini (void)
@@ -596,4 +1501,5 @@ grub_bootp_fini (void)
{
grub_unregister_command (cmd_getdhcp);
grub_unregister_command (cmd_bootp);
grub_unregister_command (cmd_dhcp);
+ grub_unregister_command (cmd_bootp6);
}
Index: grub-2.04~rc1/grub-core/net/ip.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/net/ip.c
+++ grub-2.04~rc1/grub-core/net/ip.c
@@ -239,6 +239,45 @@ handle_dgram (struct grub_net_buff *nb,
diff --git a/grub-core/net/ip.c b/grub-core/net/ip.c
index 8c56baa..2a239b5 100644
--- a/grub-core/net/ip.c
+++ b/grub-core/net/ip.c
@@ -238,6 +238,45 @@ handle_dgram (struct grub_net_buff *nb,
{
struct udphdr *udph;
udph = (struct udphdr *) nb->data;
@ -1016,11 +1016,11 @@ Index: grub-2.04~rc1/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.04~rc1/include/grub/net.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/net.h
+++ grub-2.04~rc1/include/grub/net.h
@@ -448,6 +448,66 @@ struct grub_net_bootp_packet
diff --git a/include/grub/net.h b/include/grub/net.h
index ccc169c..38a3973 100644
--- a/include/grub/net.h
+++ b/include/grub/net.h
@@ -442,6 +442,66 @@ struct grub_net_bootp_packet
grub_uint8_t vendor[0];
} GRUB_PACKED;
@ -1087,7 +1087,7 @@ Index: grub-2.04~rc1/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
@@ -481,6 +541,14 @@ grub_net_configure_by_dhcp_ack (const ch
@@ -468,6 +528,14 @@ grub_net_configure_by_dhcp_ack (const char *name,
grub_size_t size,
int is_def, char **device, char **path);
@ -1102,9 +1102,9 @@ Index: grub-2.04~rc1/include/grub/net.h
grub_err_t
grub_net_add_ipv4_local (struct grub_net_network_level_interface *inf,
int mask);
@@ -489,6 +557,10 @@ void
@@ -476,6 +544,10 @@ void
grub_net_process_dhcp (struct grub_net_buff *nb,
struct grub_net_network_level_interface *iface);
struct grub_net_card *card);
+grub_err_t
+grub_net_process_dhcp6 (struct grub_net_buff *nb,
@ -1113,3 +1113,6 @@ Index: grub-2.04~rc1/include/grub/net.h
int
grub_net_hwaddr_cmp (const grub_net_link_level_address_t *a,
const grub_net_link_level_address_t *b);
--
2.6.6

View File

@ -0,0 +1,37 @@
From 0e49748fad8e036d9875785e57c577214e699941 Mon Sep 17 00:00:00 2001
From: Michael Chang <mchang@suse.com>
Date: Thu, 11 Apr 2019 17:14:04 +0800
Subject: [PATCH 3/8] hfs: Fix gcc9 error -Waddress-of-packed-member
Simply adds the missing packed attribute to 'struct grub_hfs_extent'.
[ 83s] ../grub-core/fs/hfs.c: In function 'grub_hfs_iterate_records':
[ 83s] ../grub-core/fs/hfs.c:699:9: error: taking address of packed member of 'struct grub_hfs_sblock' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 83s] 699 | ? (&data->sblock.catalog_recs)
[ 83s] | ~^~~~~~~~~~~~~~~~~~~~~~~~~~~
[ 83s] ../grub-core/fs/hfs.c:700:9: error: taking address of packed member of 'struct grub_hfs_sblock' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 83s] 700 | : (&data->sblock.extent_recs));
[ 83s] | ~^~~~~~~~~~~~~~~~~~~~~~~~~~
Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
---
include/grub/hfs.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/grub/hfs.h b/include/grub/hfs.h
index d935f5005..e27993c42 100644
--- a/include/grub/hfs.h
+++ b/include/grub/hfs.h
@@ -29,7 +29,7 @@ struct grub_hfs_extent
/* The first physical block. */
grub_uint16_t first_block;
grub_uint16_t count;
-};
+} GRUB_PACKED;
/* HFS stores extents in groups of 3. */
typedef struct grub_hfs_extent grub_hfs_datarecord_t[3];
--
2.16.4

View File

@ -0,0 +1,179 @@
From e12373683b894f22c2e35dc3732440a4e9053d61 Mon Sep 17 00:00:00 2001
From: Matthew Garrett <mjg59@coreos.com>
Date: Sun, 9 Aug 2015 15:48:51 -0700
Subject: [PATCH 03/11] Add BIOS boot measurement
Measure the on-disk grub core on BIOS systems - unlike UEFI, the firmware
can't do this stage for us.
---
grub-core/boot/i386/pc/boot.S | 30 +++++++++++++++++++++++++-
grub-core/boot/i386/pc/diskboot.S | 44 +++++++++++++++++++++++++++++++++++++++
2 files changed, 73 insertions(+), 1 deletion(-)
diff --git a/grub-core/boot/i386/pc/boot.S b/grub-core/boot/i386/pc/boot.S
index 2bd0b2d..4c63247 100644
--- a/grub-core/boot/i386/pc/boot.S
+++ b/grub-core/boot/i386/pc/boot.S
@@ -24,11 +24,14 @@
* defines for the code go here
*/
+#define TPM 1
+
/* Print message string */
#define MSG(x) movw $x, %si; call LOCAL(message)
#define ERR(x) movw $x, %si; jmp LOCAL(error_message)
.macro floppy
+#ifndef TPM
part_start:
LOCAL(probe_values):
@@ -85,6 +88,7 @@ fd_probe_error_string: .asciz "Floppy"
movb MACRO_DOLLAR(79), %ch
jmp LOCAL(final_init)
+#endif
.endm
.macro scratch
@@ -255,6 +259,7 @@ real_start:
/* set %si to the disk address packet */
movw $disk_address_packet, %si
+#ifndef TPM
/* check if LBA is supported */
movb $0x41, %ah
movw $0x55aa, %bx
@@ -274,6 +279,7 @@ real_start:
andw $1, %cx
jz LOCAL(chs_mode)
+#endif
LOCAL(lba_mode):
xorw %ax, %ax
@@ -317,6 +323,9 @@ LOCAL(lba_mode):
jmp LOCAL(copy_buffer)
LOCAL(chs_mode):
+#ifdef TPM
+ jmp LOCAL(general_error)
+#else
/*
* Determine the hard disk geometry from the BIOS!
* We do this first, so that LS-120 IDE floppies work correctly.
@@ -428,7 +437,7 @@ setup_sectors:
jc LOCAL(read_error)
movw %es, %bx
-
+#endif /* TPM */
LOCAL(copy_buffer):
/*
* We need to save %cx and %si because the startup code in
@@ -451,6 +460,25 @@ LOCAL(copy_buffer):
popw %ds
popa
+#ifdef TPM
+ pusha
+
+ movw $0xBB00, %ax /* TCG_StatusCheck */
+ int $0x1A
+ test %eax, %eax
+ jnz boot /* No TPM or TPM deactivated */
+
+ movw $0xBB07, %ax /* TCG_CompactHashLogExtendEvent */
+ movw $GRUB_BOOT_MACHINE_KERNEL_ADDR, %di
+ xorl %esi, %esi
+ movl $0x41504354, %ebx /* TCPA */
+ movl $0x200, %ecx /* Measure 512 bytes */
+ movl $0x8, %edx /* PCR 8 */
+ int $0x1A
+
+ popa
+#endif
+boot:
/* boot kernel */
jmp *(LOCAL(kernel_address))
diff --git a/grub-core/boot/i386/pc/diskboot.S b/grub-core/boot/i386/pc/diskboot.S
index 1ee4cf5..3a324ea 100644
--- a/grub-core/boot/i386/pc/diskboot.S
+++ b/grub-core/boot/i386/pc/diskboot.S
@@ -19,6 +19,8 @@
#include <grub/symbol.h>
#include <grub/machine/boot.h>
+#define TPM 1
+
/*
* defines for the code go here
*/
@@ -58,6 +60,21 @@ _start:
/* this sets up for the first run through "bootloop" */
movw $LOCAL(firstlist), %di
+#ifdef TPM
+ /* clear EAX to remove potential garbage */
+ xorl %eax, %eax
+ /* 8(%di) = number of sectors to read */
+ movw 8(%di), %ax
+
+ /* Multiply number of sectors to read with 512 bytes. EAX is 32bit
+ * which is large enough to hold values of up to 4GB. I doubt there
+ * will ever be a core.img larger than that. ;-) */
+ shll $9, %eax
+
+ /* write result to bytes_to_measure var */
+ movl %eax, bytes_to_measure
+#endif
+
/* save the sector number of the second sector in %ebp */
movl (%di), %ebp
@@ -295,6 +312,29 @@ LOCAL(copy_buffer):
/* END OF MAIN LOOP */
LOCAL(bootit):
+#ifdef TPM
+ pusha
+ movw $0xBB07, %ax /* TCG_CompactHashLogExtendEvent */
+
+ movw $0x0, %bx
+ movw %bx, %es
+
+ /* We've already measured the first 512 bytes, now measure the rest */
+ xorl %edi, %edi
+ movw $(GRUB_BOOT_MACHINE_KERNEL_ADDR + 0x200), %di
+
+ movl $0x41504354, %ebx /* EBX = "TCPA" */
+
+ /* %ecx = The length, in bytes, of the buffer to measure */
+ movl $bytes_to_measure, %esi
+ movl (%esi), %ecx
+ xorl %esi, %esi
+ movl $0x9, %edx /* PCR 9 */
+
+ int $0x1A
+
+ popa
+#endif
/* print a newline */
MSG(notification_done)
popw %dx /* this makes sure %dl is our "boot" drive */
@@ -329,6 +369,10 @@ geometry_error_string: .asciz "Geom"
read_error_string: .asciz "Read"
general_error_string: .asciz " Error"
+#ifdef TPM
+bytes_to_measure: .long 0
+#endif
+
/*
* message: write the string pointed to by %si
*
--
1.8.5.6

View File

@ -0,0 +1,148 @@
From 621024090b7729c8c698c8ab916d792846d20818 Mon Sep 17 00:00:00 2001
From: Michael Chang <mchang@suse.com>
Date: Thu, 11 Apr 2019 17:14:05 +0800
Subject: [PATCH 4/8] hfsplus: Fix gcc9 error with -Waddress-of-packed-member
The catkey->name could be unaligned since the address of 'void* record'
is calculated as offset in bytes to a malloc buffer.
The fix is using aligned buffer allocated by grub_malloc for holding
the UTF16 string copied from catkey->name. And use that buffer as
argument for grub_utf16_to_utf8 to convert to UTF8 strings.
In addition, using a new copy of buffer rather than catkey->name itself
for processing the endianess conversion, we can also get rid of the hunk
restoring byte order of catkey->name to what it was previously.
[ 59s] ../grub-core/fs/hfsplus.c: In function 'list_nodes':
[ 59s] ../grub-core/fs/hfsplus.c:738:57: error: taking address of packed member of 'struct grub_hfsplus_catkey' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 59s] 738 | *grub_utf16_to_utf8 ((grub_uint8_t *) filename, catkey->name,
[ 59s] | ~~~~~~^~~~~~
[ 59s] ../grub-core/fs/hfsplus.c: In function 'grub_hfsplus_label':
[ 59s] ../grub-core/fs/hfsplus.c:1019:57: error: taking address of packed member of 'struct grub_hfsplus_catkey' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 59s] 1019 | *grub_utf16_to_utf8 ((grub_uint8_t *) (*label), catkey->name,
[ 59s] | ~~~~~~^~~~~~
Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
---
grub-core/fs/hfsplus.c | 57 +++++++++++++++++++++++++++++++++++---------------
1 file changed, 40 insertions(+), 17 deletions(-)
diff --git a/grub-core/fs/hfsplus.c b/grub-core/fs/hfsplus.c
index 73ae95fbc..54786bb1c 100644
--- a/grub-core/fs/hfsplus.c
+++ b/grub-core/fs/hfsplus.c
@@ -661,6 +661,7 @@ list_nodes (void *record, void *hook_arg)
char *filename;
int i;
struct grub_fshelp_node *node;
+ grub_uint16_t *keyname;
struct grub_hfsplus_catfile *fileinfo;
enum grub_fshelp_filetype type = GRUB_FSHELP_UNKNOWN;
struct list_nodes_ctx *ctx = hook_arg;
@@ -719,32 +720,34 @@ list_nodes (void *record, void *hook_arg)
if (! filename)
return 0;
+ keyname = grub_malloc (grub_be_to_cpu16 (catkey->namelen) * sizeof (*keyname));
+ if (!keyname)
+ {
+ grub_free (filename);
+ return 0;
+ }
+
/* Make sure the byte order of the UTF16 string is correct. */
for (i = 0; i < grub_be_to_cpu16 (catkey->namelen); i++)
{
- catkey->name[i] = grub_be_to_cpu16 (catkey->name[i]);
+ keyname[i] = grub_be_to_cpu16 (catkey->name[i]);
- if (catkey->name[i] == '/')
- catkey->name[i] = ':';
+ if (keyname[i] == '/')
+ keyname[i] = ':';
/* If the name is obviously invalid, skip this node. */
- if (catkey->name[i] == 0)
+ if (keyname[i] == 0)
{
+ grub_free (keyname);
grub_free (filename);
return 0;
}
}
- *grub_utf16_to_utf8 ((grub_uint8_t *) filename, catkey->name,
+ *grub_utf16_to_utf8 ((grub_uint8_t *) filename, keyname,
grub_be_to_cpu16 (catkey->namelen)) = '\0';
- /* Restore the byte order to what it was previously. */
- for (i = 0; i < grub_be_to_cpu16 (catkey->namelen); i++)
- {
- if (catkey->name[i] == ':')
- catkey->name[i] = '/';
- catkey->name[i] = grub_be_to_cpu16 (catkey->name[i]);
- }
+ grub_free (keyname);
/* hfs+ is case insensitive. */
if (! ctx->dir->data->case_sensitive)
@@ -975,6 +978,7 @@ grub_hfsplus_label (grub_device_t device, char **label)
grub_disk_t disk = device->disk;
struct grub_hfsplus_catkey *catkey;
int i, label_len;
+ grub_uint16_t *label_name;
struct grub_hfsplus_key_internal intern;
struct grub_hfsplus_btnode *node = NULL;
grub_disk_addr_t ptr = 0;
@@ -1003,22 +1007,41 @@ grub_hfsplus_label (grub_device_t device, char **label)
grub_hfsplus_btree_recptr (&data->catalog_tree, node, ptr);
label_len = grub_be_to_cpu16 (catkey->namelen);
+ label_name = grub_malloc (label_len * sizeof (*label_name));
+ if (!label_name)
+ {
+ grub_free (node);
+ grub_free (data);
+ return grub_errno;
+ }
+
for (i = 0; i < label_len; i++)
{
- catkey->name[i] = grub_be_to_cpu16 (catkey->name[i]);
+ label_name[i] = grub_be_to_cpu16 (catkey->name[i]);
/* If the name is obviously invalid, skip this node. */
- if (catkey->name[i] == 0)
- return 0;
+ if (label_name[i] == 0)
+ {
+ grub_free (label_name);
+ grub_free (node);
+ grub_free (data);
+ return 0;
+ }
}
*label = grub_malloc (label_len * GRUB_MAX_UTF8_PER_UTF16 + 1);
if (! *label)
- return grub_errno;
+ {
+ grub_free (label_name);
+ grub_free (node);
+ grub_free (data);
+ return grub_errno;
+ }
- *grub_utf16_to_utf8 ((grub_uint8_t *) (*label), catkey->name,
+ *grub_utf16_to_utf8 ((grub_uint8_t *) (*label), label_name,
label_len) = '\0';
+ grub_free (label_name);
grub_free (node);
grub_free (data);
--
2.16.4

View File

@ -0,0 +1,104 @@
From 9f12cf163e56d3b5f03c8a5da94dc501032312eb Mon Sep 17 00:00:00 2001
From: Matthew Garrett <mjg59@coreos.com>
Date: Sun, 9 Aug 2015 16:12:39 -0700
Subject: [PATCH 04/11] Rework linux command
We want a single buffer that contains the entire kernel image in order to
perform a TPM measurement. Allocate one and copy the entire kernel into it
before pulling out the individual blocks later on.
---
grub-core/loader/i386/linux.c | 34 +++++++++++++++++++++-------------
1 file changed, 21 insertions(+), 13 deletions(-)
Index: grub-2.02~rc1/grub-core/loader/i386/linux.c
===================================================================
--- grub-2.02~rc1.orig/grub-core/loader/i386/linux.c
+++ grub-2.02~rc1/grub-core/loader/i386/linux.c
@@ -680,12 +680,13 @@ grub_cmd_linux (grub_command_t cmd __att
grub_file_t file = 0;
struct linux_kernel_header lh;
grub_uint8_t setup_sects;
- grub_size_t real_size, prot_size, prot_file_size;
+ grub_size_t real_size, prot_size, prot_file_size, kernel_offset;
grub_ssize_t len;
int i;
grub_size_t align, min_align;
int relocatable;
grub_uint64_t preferred_address = GRUB_LINUX_BZIMAGE_ADDR;
+ grub_uint8_t *kernel = NULL;
grub_dl_ref (my_mod);
@@ -699,7 +700,15 @@ grub_cmd_linux (grub_command_t cmd __att
if (! file)
goto fail;
- if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh))
+ len = grub_file_size (file);
+ kernel = grub_malloc (len);
+ if (!kernel)
+ {
+ grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("cannot allocate kernel buffer"));
+ goto fail;
+ }
+
+ if (grub_file_read (file, kernel, len) != len)
{
if (!grub_errno)
grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
@@ -707,6 +716,9 @@ grub_cmd_linux (grub_command_t cmd __att
goto fail;
}
+ grub_memcpy (&lh, kernel, sizeof (lh));
+ kernel_offset = sizeof (lh);
+
if (lh.boot_flag != grub_cpu_to_le16_compile_time (0xaa55))
{
grub_error (GRUB_ERR_BAD_OS, "invalid magic number");
@@ -806,13 +818,9 @@ grub_cmd_linux (grub_command_t cmd __att
linux_params.ps_mouse = linux_params.padding10 = 0;
len = sizeof (linux_params) - sizeof (lh);
- if (grub_file_read (file, (char *) &linux_params + sizeof (lh), len) != len)
- {
- if (!grub_errno)
- grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
- argv[0]);
- goto fail;
- }
+
+ grub_memcpy ((char *)&linux_params + sizeof (lh), kernel + kernel_offset, len);
+ kernel_offset += len;
linux_params.type_of_loader = GRUB_LINUX_BOOT_LOADER_TYPE;
@@ -871,7 +879,7 @@ grub_cmd_linux (grub_command_t cmd __att
/* The other parameters are filled when booting. */
- grub_file_seek (file, real_size + GRUB_DISK_SECTOR_SIZE);
+ kernel_offset = real_size + GRUB_DISK_SECTOR_SIZE;
grub_dprintf ("linux", "bzImage, setup=0x%x, size=0x%x\n",
(unsigned) real_size, (unsigned) prot_size);
@@ -1016,9 +1024,7 @@ grub_cmd_linux (grub_command_t cmd __att
- (sizeof (LINUX_IMAGE) - 1));
len = prot_file_size;
- if (grub_file_read (file, prot_mode_mem, len) != len && !grub_errno)
- grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
- argv[0]);
+ grub_memcpy (prot_mode_mem, kernel + kernel_offset, len);
if (grub_errno == GRUB_ERR_NONE)
{
@@ -1029,6 +1035,8 @@ grub_cmd_linux (grub_command_t cmd __att
fail:
+ grub_free (kernel);
+
if (file)
grub_file_close (file);

View File

@ -0,0 +1,52 @@
From 0b1bf3932f1b1700d3c8a997e4850fb9a013569d Mon Sep 17 00:00:00 2001
From: Michael Chang <mchang@suse.com>
Date: Thu, 11 Apr 2019 17:14:06 +0800
Subject: [PATCH 5/8] acpi: Fix gcc9 error -Waddress-of-packed-member
Simply adds the missing packed attribute to 'struct grub_acpi_madt'.
[ 233s] ../../grub-core/commands/lsacpi.c: In function 'disp_acpi_xsdt_table':
[ 233s] ../../grub-core/commands/lsacpi.c:201:27: error: converting a packed 'struct grub_acpi_table_header' pointer (alignment 1) to a 'struct grub_acpi_madt' pointer (alignment 4) may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 233s] 201 | disp_madt_table ((struct grub_acpi_madt *) t);
[ 233s] | ^~~~~~~~~~~~~~
[ 233s] In file included from ../../grub-core/commands/lsacpi.c:23:
[ 233s] ../../include/grub/acpi.h:50:8: note: defined here
[ 233s] 50 | struct grub_acpi_table_header
[ 233s] | ^~~~~~~~~~~~~~~~~~~~~~
[ 233s] ../../include/grub/acpi.h:90:8: note: defined here
[ 233s] 90 | struct grub_acpi_madt
[ 233s] | ^~~~~~~~~~~~~~
[ 233s] ../../grub-core/commands/lsacpi.c: In function 'disp_acpi_rsdt_table':
[ 233s] ../../grub-core/commands/lsacpi.c:225:27: error: converting a packed 'struct grub_acpi_table_header' pointer (alignment 1) to a 'struct grub_acpi_madt' pointer (alignment 4) may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 233s] 225 | disp_madt_table ((struct grub_acpi_madt *) t);
[ 233s] | ^~~~~~~~~~~~~~
[ 233s] In file included from ../../grub-core/commands/lsacpi.c:23:
[ 233s] ../../include/grub/acpi.h:50:8: note: defined here
[ 233s] 50 | struct grub_acpi_table_header
[ 233s] | ^~~~~~~~~~~~~~~~~~~~~~
[ 233s] ../../include/grub/acpi.h:90:8: note: defined here
[ 233s] 90 | struct grub_acpi_madt
[ 233s] | ^~~~~~~~~~~~~~
Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
---
include/grub/acpi.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/grub/acpi.h b/include/grub/acpi.h
index 66148f684..84f49487d 100644
--- a/include/grub/acpi.h
+++ b/include/grub/acpi.h
@@ -93,7 +93,7 @@ struct grub_acpi_madt
grub_uint32_t lapic_addr;
grub_uint32_t flags;
struct grub_acpi_madt_entry_header entries[0];
-};
+} GRUB_PACKED;
enum
{
--
2.16.4

View File

@ -0,0 +1,101 @@
From f8f66cdcb66dba05353887b3be0d715d54efdea8 Mon Sep 17 00:00:00 2001
From: Matthew Garrett <mjg59@coreos.com>
Date: Sun, 9 Aug 2015 16:20:58 -0700
Subject: [PATCH 05/11] Rework linux16 command
We want a single buffer that contains the entire kernel image in order to
perform a TPM measurement. Allocate one and copy the entire kernel int it
before pulling out the individual blocks later on.
---
grub-core/loader/i386/pc/linux.c | 34 +++++++++++++++++++++-------------
1 file changed, 21 insertions(+), 13 deletions(-)
diff --git a/grub-core/loader/i386/pc/linux.c b/grub-core/loader/i386/pc/linux.c
index a293b17..1ac9cd1 100644
--- a/grub-core/loader/i386/pc/linux.c
+++ b/grub-core/loader/i386/pc/linux.c
@@ -123,13 +123,14 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
grub_file_t file = 0;
struct linux_kernel_header lh;
grub_uint8_t setup_sects;
- grub_size_t real_size;
+ grub_size_t real_size, kernel_offset = 0;
grub_ssize_t len;
int i;
char *grub_linux_prot_chunk;
int grub_linux_is_bzimage;
grub_addr_t grub_linux_prot_target;
grub_err_t err;
+ grub_uint8_t *kernel = NULL;
grub_dl_ref (my_mod);
@@ -143,7 +144,15 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
if (! file)
goto fail;
- if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh))
+ len = grub_file_size (file);
+ kernel = grub_malloc (len);
+ if (!kernel)
+ {
+ grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("cannot allocate kernel buffer"));
+ goto fail;
+ }
+
+ if (grub_file_read (file, kernel, len) != len)
{
if (!grub_errno)
grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
@@ -151,6 +160,9 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
goto fail;
}
+ grub_memcpy (&lh, kernel, sizeof (lh));
+ kernel_offset = sizeof (lh);
+
if (lh.boot_flag != grub_cpu_to_le16_compile_time (0xaa55))
{
grub_error (GRUB_ERR_BAD_OS, "invalid magic number");
@@ -314,13 +326,9 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
grub_memmove (grub_linux_real_chunk, &lh, sizeof (lh));
len = real_size + GRUB_DISK_SECTOR_SIZE - sizeof (lh);
- if (grub_file_read (file, grub_linux_real_chunk + sizeof (lh), len) != len)
- {
- if (!grub_errno)
- grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
- argv[0]);
- goto fail;
- }
+ grub_memcpy (grub_linux_real_chunk + sizeof (lh), kernel + kernel_offset,
+ len);
+ kernel_offset += len;
if (lh.header != grub_cpu_to_le32_compile_time (GRUB_LINUX_MAGIC_SIGNATURE)
|| grub_le_to_cpu16 (lh.version) < 0x0200)
@@ -355,10 +363,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
}
len = grub_linux16_prot_size;
- if (grub_file_read (file, grub_linux_prot_chunk, grub_linux16_prot_size)
- != (grub_ssize_t) grub_linux16_prot_size && !grub_errno)
- grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
- argv[0]);
+ grub_memcpy (grub_linux_prot_chunk, kernel + kernel_offset, len);
+ kernel_offset += len;
if (grub_errno == GRUB_ERR_NONE)
{
@@ -368,6 +374,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
fail:
+ grub_free (kernel);
+
if (file)
grub_file_close (file);
--
1.8.5.6

View File

@ -21,23 +21,32 @@ Signed-off-by: Ken Lin <ken.lin@hpe.com>
include/grub/net.h | 1 +
2 files changed, 66 insertions(+), 2 deletions(-)
Index: grub-2.04~rc1/grub-core/net/bootp.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/net/bootp.c
+++ grub-2.04~rc1/grub-core/net/bootp.c
@@ -340,6 +340,53 @@ grub_net_configure_by_dhcp_ack (const ch
if (!inter)
return 0;
diff --git a/grub-core/net/bootp.c b/grub-core/net/bootp.c
index 81173b4..04f9f3d 100644
--- a/grub-core/net/bootp.c
+++ b/grub-core/net/bootp.c
@@ -207,6 +207,11 @@ parse_dhcp_vendor (const char *name, const void *vend, int limit, int *mask)
taglength);
break;
+ case GRUB_NET_BOOTP_VENDOR_CLASS_IDENTIFIER:
+ grub_env_set_net_property (name, "vendor_class_identifier", (const char *) ptr,
+ taglength);
+ break;
+
case GRUB_NET_BOOTP_EXTENSIONS_PATH:
grub_env_set_net_property (name, "extensionspath", (const char *) ptr,
taglength);
@@ -281,6 +286,66 @@ grub_net_configure_by_dhcp_ack (const char *name,
}
#endif
+ /* FIXME: Introduce new http flag for better synergy with existing tftp code base */
+ if (size > OFFSET_OF (vendor, bp))
+ {
+ char *cidvar;
+ const char *cid;
+
+ opt = find_dhcp_option (bp, size, GRUB_NET_BOOTP_VENDOR_CLASS_IDENTIFIER, &opt_len);
+ if (opt && opt_len)
+ grub_env_set_net_property (name, "vendor_class_identifier", (const char *) opt, opt_len);
+ parse_dhcp_vendor (name, &bp->vendor, size - OFFSET_OF (vendor, bp), &mask);
+ cidvar = grub_xasprintf ("net_%s_%s", name, "vendor_class_identifier");
+ cid = grub_env_get (cidvar);
+ grub_free (cidvar);
@ -46,12 +55,10 @@ Index: grub-2.04~rc1/grub-core/net/bootp.c
+ {
+ char *proto, *ip, *pa;
+
+ /* FIXME: Provide better URL function that returns in place pointers
+ * so that we don't have to free them.
+ */
+ if (!dissect_url (bp->boot_file, &proto, &ip, &pa))
+ return inter;
+
+ grub_env_set_net_property (name, "boot_file", pa, grub_strlen (pa));
+ if (is_def)
+ {
+ grub_net_default_server = grub_strdup (ip);
@ -63,40 +70,61 @@ Index: grub-2.04~rc1/grub-core/net/bootp.c
+ *device = grub_xasprintf ("%s,%s", proto, ip);
+ grub_print_error ();
+ }
+ if (path)
+ {
+ *path = grub_strdup (pa);
+ grub_print_error ();
+ if (*path)
+ {
+ char *slash;
+ slash = grub_strrchr (*path, '/');
+ if (slash)
+ *slash = 0;
+ else
+ **path = 0;
+ }
+ }
+ grub_net_add_ipv4_local (inter, mask);
+ inter->dhcp_ack = grub_malloc (size);
+ if (inter->dhcp_ack)
+ {
+ grub_memcpy (inter->dhcp_ack, bp, size);
+ inter->dhcp_acklen = size;
+ }
+ else
+ grub_errno = GRUB_ERR_NONE;
+
+ boot_file = pa;
+ boot_file_len = grub_strlen (pa);
+
+ /* FIXME: Don't use malloc buffer here */
+ grub_free (proto);
+ grub_free (ip);
+
+ /* FIXME: NEED TO FREE boot_file */
+ goto boot_file;
+ grub_free (pa);
+ return inter;
+ }
+ }
+
opt = find_dhcp_option (bp, size, GRUB_NET_DHCP_OVERLOAD, &opt_len);
if (opt && opt_len == 1)
overload = *opt;
@@ -416,6 +463,8 @@ grub_net_configure_by_dhcp_ack (const ch
if (size > OFFSET_OF (boot_file, bp))
grub_env_set_net_property (name, "boot_file", bp->boot_file,
sizeof (bp->boot_file));
@@ -342,8 +407,6 @@ grub_net_configure_by_dhcp_ack (const char *name,
**path = 0;
}
}
+boot_file:
+
if (boot_file)
{
grub_env_set_net_property (name, "boot_file", boot_file, boot_file_len);
Index: grub-2.04~rc1/include/grub/net.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/net.h
+++ grub-2.04~rc1/include/grub/net.h
@@ -523,6 +523,7 @@ enum
- if (size > OFFSET_OF (vendor, bp))
- parse_dhcp_vendor (name, &bp->vendor, size - OFFSET_OF (vendor, bp), &mask);
grub_net_add_ipv4_local (inter, mask);
inter->dhcp_ack = grub_malloc (size);
diff --git a/include/grub/net.h b/include/grub/net.h
index 38a3973..e4bf678 100644
--- a/include/grub/net.h
+++ b/include/grub/net.h
@@ -517,6 +517,7 @@ enum
GRUB_NET_BOOTP_DOMAIN = 0x0f,
GRUB_NET_BOOTP_ROOT_PATH = 0x11,
GRUB_NET_BOOTP_EXTENSIONS_PATH = 0x12,
+ GRUB_NET_BOOTP_VENDOR_CLASS_IDENTIFIER = 0x3C,
GRUB_NET_DHCP_REQUESTED_IP_ADDRESS = 50,
GRUB_NET_DHCP_OVERLOAD = 52,
GRUB_NET_DHCP_MESSAGE_TYPE = 53,
GRUB_NET_BOOTP_END = 0xff
};
--
2.6.6

View File

@ -0,0 +1,84 @@
From f0b411214ccc309f2f126d558e2777469d538ca2 Mon Sep 17 00:00:00 2001
From: Matthew Garrett <mjg59@coreos.com>
Date: Sun, 9 Aug 2015 16:28:29 -0700
Subject: [PATCH 06/11] Measure kernel and initrd on BIOS systems
Measure the kernel and initrd when loaded on BIOS systems
---
grub-core/loader/i386/linux.c | 5 +++++
grub-core/loader/i386/pc/linux.c | 3 +++
grub-core/loader/linux.c | 2 ++
3 files changed, 10 insertions(+)
Index: grub-2.02~beta3/grub-core/loader/i386/linux.c
===================================================================
--- grub-2.02~beta3.orig/grub-core/loader/i386/linux.c
+++ grub-2.02~beta3/grub-core/loader/i386/linux.c
@@ -35,6 +35,7 @@
#include <grub/i18n.h>
#include <grub/lib/cmdline.h>
#include <grub/linux.h>
+#include <grub/tpm.h>
GRUB_MOD_LICENSE ("GPLv3+");
@@ -716,7 +717,10 @@ grub_cmd_linux (grub_command_t cmd __att
goto fail;
}
+ grub_tpm_measure (kernel, len, GRUB_BINARY_PCR, "grub_linux", "Kernel");
+
grub_memcpy (&lh, kernel, sizeof (lh));
+
kernel_offset = sizeof (lh);
if (lh.boot_flag != grub_cpu_to_le16_compile_time (0xaa55))
@@ -1025,6 +1029,7 @@ grub_cmd_linux (grub_command_t cmd __att
len = prot_file_size;
grub_memcpy (prot_mode_mem, kernel + kernel_offset, len);
+ kernel_offset += len;
if (grub_errno == GRUB_ERR_NONE)
{
Index: grub-2.02~beta3/grub-core/loader/i386/pc/linux.c
===================================================================
--- grub-2.02~beta3.orig/grub-core/loader/i386/pc/linux.c
+++ grub-2.02~beta3/grub-core/loader/i386/pc/linux.c
@@ -35,6 +35,7 @@
#include <grub/i386/floppy.h>
#include <grub/lib/cmdline.h>
#include <grub/linux.h>
+#include <grub/tpm.h>
GRUB_MOD_LICENSE ("GPLv3+");
@@ -160,6 +161,8 @@ grub_cmd_linux (grub_command_t cmd __att
goto fail;
}
+ grub_tpm_measure (kernel, len, GRUB_BINARY_PCR, "grub_linux16", "Kernel");
+
grub_memcpy (&lh, kernel, sizeof (lh));
kernel_offset = sizeof (lh);
Index: grub-2.02~beta3/grub-core/loader/linux.c
===================================================================
--- grub-2.02~beta3.orig/grub-core/loader/linux.c
+++ grub-2.02~beta3/grub-core/loader/linux.c
@@ -4,6 +4,7 @@
#include <grub/misc.h>
#include <grub/file.h>
#include <grub/mm.h>
+#include <grub/tpm.h>
struct newc_head
{
@@ -288,6 +289,7 @@ grub_initrd_load (struct grub_linux_init
grub_initrd_close (initrd_ctx);
return grub_errno;
}
+ grub_tpm_measure (ptr, cursize, GRUB_BINARY_PCR, "grub_initrd", "Initrd");
ptr += cursize;
}
if (newc)

View File

@ -0,0 +1,51 @@
From 85e08e174e15c497c4387c16e92243e6ed05feb6 Mon Sep 17 00:00:00 2001
From: Michael Chang <mchang@suse.com>
Date: Thu, 11 Apr 2019 17:14:07 +0800
Subject: [PATCH 6/8] usbtest: Disable gcc9 -Waddress-of-packed-member
Disable the -Wadress-of-packaed-member diagnostic for the
grub_usb_get_string function since the result is false postive. The
descstrp->str is found to be aligned in the buffer allocated for 'struct
grub_usb_desc_str'.
[ 229s] ../../grub-core/commands/usbtest.c: In function 'grub_usb_get_string':
[ 229s] ../../grub-core/commands/usbtest.c:104:58: error: taking address of packed member of 'struct grub_usb_desc_str' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 229s] 104 | *grub_utf16_to_utf8 ((grub_uint8_t *) *string, descstrp->str,
[ 229s] | ~~~~~~~~^~~~~
Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
---
grub-core/commands/usbtest.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/grub-core/commands/usbtest.c b/grub-core/commands/usbtest.c
index 01cdca934..2c6d93fe6 100644
--- a/grub-core/commands/usbtest.c
+++ b/grub-core/commands/usbtest.c
@@ -63,6 +63,11 @@ static const char *usb_devspeed[] =
"High"
};
+#if __GNUC__ >= 9
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Waddress-of-packed-member"
+#endif
+
static grub_usb_err_t
grub_usb_get_string (grub_usb_device_t dev, grub_uint8_t index, int langid,
char **string)
@@ -108,6 +113,10 @@ grub_usb_get_string (grub_usb_device_t dev, grub_uint8_t index, int langid,
return GRUB_USB_ERR_NONE;
}
+#if __GNUC__ >= 9
+#pragma GCC diagnostic pop
+#endif
+
static void
usb_print_str (const char *description, grub_usb_device_t dev, int idx)
{
--
2.16.4

View File

@ -0,0 +1,64 @@
From 4868e17507dfebf2894079ad6b4876e612706f30 Mon Sep 17 00:00:00 2001
From: Michael Chang <mchang@suse.com>
Date: Thu, 11 Apr 2019 17:14:08 +0800
Subject: [PATCH 7/8] chainloader: Fix gcc9 error -Waddress-of-packed-member
The address of fp->path_name could be unaligned since seeking into the
device path buffer for a given node could end in byte boundary.
The fix is using aligned buffer allocated by grub_malloc for receiving
the converted UTF16 string by grub_utf8_to_utf16 and also the processing
after. The resulting string then gets copied to fp->path_name.
[ 243s] ../../grub-core/loader/efi/chainloader.c: In function 'copy_file_path':
[ 243s] ../../grub-core/loader/efi/chainloader.c:136:32: error: taking address of packed member of 'struct grub_efi_file_path_device_path' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 243s] 136 | size = grub_utf8_to_utf16 (fp->path_name, len * GRUB_MAX_UTF16_PER_UTF8,
[ 243s] | ~~^~~~~~~~~~~
[ 243s] ../../grub-core/loader/efi/chainloader.c:138:12: error: taking address of packed member of 'struct grub_efi_file_path_device_path' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 243s] 138 | for (p = fp->path_name; p < fp->path_name + size; p++)
[ 243s] | ^~
Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
---
grub-core/loader/efi/chainloader.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/grub-core/loader/efi/chainloader.c b/grub-core/loader/efi/chainloader.c
index f706b1ac3..cd92ea3f2 100644
--- a/grub-core/loader/efi/chainloader.c
+++ b/grub-core/loader/efi/chainloader.c
@@ -110,21 +110,27 @@ static void
copy_file_path (grub_efi_file_path_device_path_t *fp,
const char *str, grub_efi_uint16_t len)
{
- grub_efi_char16_t *p;
+ grub_efi_char16_t *p, *path_name;
grub_efi_uint16_t size;
fp->header.type = GRUB_EFI_MEDIA_DEVICE_PATH_TYPE;
fp->header.subtype = GRUB_EFI_FILE_PATH_DEVICE_PATH_SUBTYPE;
- size = grub_utf8_to_utf16 (fp->path_name, len * GRUB_MAX_UTF16_PER_UTF8,
+ path_name = grub_malloc (len * GRUB_MAX_UTF16_PER_UTF8 * sizeof (*path_name));
+ if (!path_name)
+ return;
+
+ size = grub_utf8_to_utf16 (path_name, len * GRUB_MAX_UTF16_PER_UTF8,
(const grub_uint8_t *) str, len, 0);
- for (p = fp->path_name; p < fp->path_name + size; p++)
+ for (p = path_name; p < path_name + size; p++)
if (*p == '/')
*p = '\\';
+ grub_memcpy (fp->path_name, path_name, size * sizeof (*fp->path_name));
/* File Path is NULL terminated */
fp->path_name[size++] = '\0';
fp->header.length = size * sizeof (grub_efi_char16_t) + sizeof (*fp);
+ grub_free (path_name);
}
static grub_efi_device_path_t *
--
2.16.4

View File

@ -0,0 +1,43 @@
From aa88827e5b6ca073d0a67e86c5d6581445de988b Mon Sep 17 00:00:00 2001
From: Matthew Garrett <mjg59@coreos.com>
Date: Sun, 9 Aug 2015 16:32:29 -0700
Subject: [PATCH 07/11] Measure the kernel commandline
Measure the kernel commandline to ensure that it hasn't been modified
---
grub-core/lib/cmdline.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/grub-core/lib/cmdline.c b/grub-core/lib/cmdline.c
index d5e10ee..3791f3a 100644
--- a/grub-core/lib/cmdline.c
+++ b/grub-core/lib/cmdline.c
@@ -19,6 +19,7 @@
#include <grub/lib/cmdline.h>
#include <grub/misc.h>
+#include <grub/tpm.h>
static unsigned int check_arg (char *c, int *has_space)
{
@@ -67,7 +68,7 @@ int grub_create_loader_cmdline (int argc, char *argv[], char *buf,
{
int i, space;
unsigned int arg_size;
- char *c;
+ char *c, *orig = buf;
for (i = 0; i < argc; i++)
{
@@ -104,5 +105,8 @@ int grub_create_loader_cmdline (int argc, char *argv[], char *buf,
*buf = 0;
+ grub_tpm_measure ((void *)orig, grub_strlen (orig), GRUB_ASCII_PCR,
+ "grub_kernel_cmdline", orig);
+
return i;
}
--
1.8.5.6

View File

@ -0,0 +1,83 @@
From 4dd4ceec023111a4ccf69f8de6fa0885c6847a35 Mon Sep 17 00:00:00 2001
From: Michael Chang <mchang@suse.com>
Date: Thu, 11 Apr 2019 17:14:09 +0800
Subject: [PATCH 8/8] efi: Fix gcc9 error -Waddress-of-packed-member
The address of fp->path_name could be unaligned since seeking into the
device path buffer for a given node could end in byte boundary.
The fix is allocating aligned buffer by grub_malloc for holding the
UTF16 string copied from fp->path_name, and after using that buffer as
argument for grub_utf16_to_utf8 to convert it to UTF8 string.
[ 255s] ../../grub-core/kern/efi/efi.c: In function 'grub_efi_get_filename':
[ 255s] ../../grub-core/kern/efi/efi.c:410:60: error: taking address of packed member of 'struct grub_efi_file_path_device_path' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 255s] 410 | p = (char *) grub_utf16_to_utf8 ((unsigned char *) p, fp->path_name, len);
[ 255s] | ~~^~~~~~~~~~~
[ 255s] ../../grub-core/kern/efi/efi.c: In function 'grub_efi_print_device_path':
[ 255s] ../../grub-core/kern/efi/efi.c:900:33: error: taking address of packed member of 'struct grub_efi_file_path_device_path' may result in an unaligned pointer value [-Werror=address-of-packed-member]
[ 255s] 900 | *grub_utf16_to_utf8 (buf, fp->path_name,
[ 255s] | ~~^~~~~~~~~~~
Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
---
grub-core/kern/efi/efi.c | 27 ++++++++++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c
index 84e68cf31..6e1ceb905 100644
--- a/grub-core/kern/efi/efi.c
+++ b/grub-core/kern/efi/efi.c
@@ -372,6 +372,7 @@ grub_efi_get_filename (grub_efi_device_path_t *dp0)
{
grub_efi_file_path_device_path_t *fp;
grub_efi_uint16_t len;
+ grub_efi_char16_t *dup_name;
*p++ = '/';
@@ -382,7 +383,16 @@ grub_efi_get_filename (grub_efi_device_path_t *dp0)
while (len > 0 && fp->path_name[len - 1] == 0)
len--;
- p = (char *) grub_utf16_to_utf8 ((unsigned char *) p, fp->path_name, len);
+ dup_name = grub_malloc (len * sizeof (*dup_name));
+ if (!dup_name)
+ {
+ grub_free (name);
+ return NULL;
+ }
+ p = (char *) grub_utf16_to_utf8 ((unsigned char *) p,
+ grub_memcpy (dup_name, fp->path_name, len * sizeof (*dup_name)),
+ len);
+ grub_free (dup_name);
}
dp = GRUB_EFI_NEXT_DEVICE_PATH (dp);
@@ -812,9 +822,20 @@ grub_efi_print_device_path (grub_efi_device_path_t *dp)
fp = (grub_efi_file_path_device_path_t *) dp;
buf = grub_malloc ((len - 4) * 2 + 1);
if (buf)
- *grub_utf16_to_utf8 (buf, fp->path_name,
+ {
+ grub_efi_char16_t *dup_name = grub_malloc (len - 4);
+ if (!dup_name)
+ {
+ grub_errno = GRUB_ERR_NONE;
+ grub_printf ("/File((null))");
+ grub_free (buf);
+ break;
+ }
+ *grub_utf16_to_utf8 (buf, grub_memcpy (dup_name, fp->path_name, len - 4),
(len - 4) / sizeof (grub_efi_char16_t))
- = '\0';
+ = '\0';
+ grub_free (dup_name);
+ }
else
grub_errno = GRUB_ERR_NONE;
grub_printf ("/File(%s)", buf);
--
2.16.4

View File

@ -32,10 +32,10 @@ Signed-off-by: Ken Lin <ken.lin@hpe.com>
include/grub/efi/api.h | 76 +++++++++++++++++
2 files changed, 239 insertions(+)
Index: grub-2.04~rc1/grub-core/net/drivers/efi/efinet.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/net/drivers/efi/efinet.c
+++ grub-2.04~rc1/grub-core/net/drivers/efi/efinet.c
diff --git a/grub-core/net/drivers/efi/efinet.c b/grub-core/net/drivers/efi/efinet.c
index 2d3b00f..82a28fb 100644
--- a/grub-core/net/drivers/efi/efinet.c
+++ b/grub-core/net/drivers/efi/efinet.c
@@ -30,6 +30,8 @@ GRUB_MOD_LICENSE ("GPLv3+");
/* GUID. */
static grub_efi_guid_t net_io_guid = GRUB_EFI_SIMPLE_NETWORK_GUID;
@ -171,7 +171,7 @@ Index: grub-2.04~rc1/grub-core/net/drivers/efi/efinet.c
static struct grub_net_buff *
grub_efinet_create_dhcp_ack_from_device_path (grub_efi_device_path_t *dp, int *use_ipv6)
{
@@ -377,6 +498,8 @@ grub_efinet_create_dhcp_ack_from_device_
@@ -377,6 +498,8 @@ grub_efinet_create_dhcp_ack_from_device_path (grub_efi_device_path_t *dp, int *u
grub_efi_ipv4_device_path_t *ipv4 = (grub_efi_ipv4_device_path_t *) ldp;
struct grub_net_bootp_packet *bp;
grub_uint8_t *ptr;
@ -180,7 +180,7 @@ Index: grub-2.04~rc1/grub-core/net/drivers/efi/efinet.c
bp = (struct grub_net_bootp_packet *) nb->tail;
err = grub_netbuff_put (nb, sizeof (*bp) + 4);
@@ -438,6 +561,25 @@ grub_efinet_create_dhcp_ack_from_device_
@@ -438,6 +561,25 @@ grub_efinet_create_dhcp_ack_from_device_path (grub_efi_device_path_t *dp, int *u
*ptr++ = sizeof ("HTTPClient") - 1;
grub_memcpy (ptr, "HTTPClient", sizeof ("HTTPClient") - 1);
@ -206,7 +206,7 @@ Index: grub-2.04~rc1/grub-core/net/drivers/efi/efinet.c
ptr = nb->tail;
err = grub_netbuff_put (nb, 1);
if (err)
@@ -470,6 +612,8 @@ grub_efinet_create_dhcp_ack_from_device_
@@ -470,6 +612,8 @@ grub_efinet_create_dhcp_ack_from_device_path (grub_efi_device_path_t *dp, int *u
struct grub_net_dhcp6_option *opt;
struct grub_net_dhcp6_option_iana *iana;
struct grub_net_dhcp6_option_iaaddr *iaaddr;
@ -215,7 +215,7 @@ Index: grub-2.04~rc1/grub-core/net/drivers/efi/efinet.c
d6p = (struct grub_net_dhcp6_packet *)nb->tail;
err = grub_netbuff_put (nb, sizeof(*d6p));
@@ -533,6 +677,25 @@ grub_efinet_create_dhcp_ack_from_device_
@@ -533,6 +677,25 @@ grub_efinet_create_dhcp_ack_from_device_path (grub_efi_device_path_t *dp, int *u
opt->len = grub_cpu_to_be16 (uri_len);
grub_memcpy (opt->data, uri_dp->uri, uri_len);
@ -241,10 +241,10 @@ Index: grub-2.04~rc1/grub-core/net/drivers/efi/efinet.c
*use_ipv6 = 1;
}
Index: grub-2.04~rc1/include/grub/efi/api.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/efi/api.h
+++ grub-2.04~rc1/include/grub/efi/api.h
diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h
index d5a1256..99ba068 100644
--- a/include/grub/efi/api.h
+++ b/include/grub/efi/api.h
@@ -334,6 +334,16 @@
{ 0x8B, 0x8C, 0xE2, 0x1B, 0x01, 0xAE, 0xF2, 0xB7 } \
}
@ -333,5 +333,8 @@ Index: grub-2.04~rc1/include/grub/efi/api.h
+typedef struct grub_efi_ip6_config_protocol grub_efi_ip6_config_protocol_t;
+
#if (GRUB_TARGET_SIZEOF_VOID_P == 4) || defined (__ia64__) \
|| defined (__aarch64__) || defined (__MINGW64__) || defined (__CYGWIN__) \
|| defined(__riscv)
|| defined (__aarch64__) || defined (__MINGW64__) || defined (__CYGWIN__)
--
2.6.6

View File

@ -0,0 +1,60 @@
From 959e235378adef1477d14d7546c549b7619eb5f1 Mon Sep 17 00:00:00 2001
From: Matthew Garrett <mjg59@srcf.ucam.org>
Date: Mon, 10 Aug 2015 15:27:12 -0700
Subject: [PATCH 08/11] Measure commands
Measure each command executed by grub, which includes script execution.
---
grub-core/script/execute.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
Index: grub-2.02~beta3/grub-core/script/execute.c
===================================================================
--- grub-2.02~beta3.orig/grub-core/script/execute.c
+++ grub-2.02~beta3/grub-core/script/execute.c
@@ -30,6 +30,7 @@
#ifdef GRUB_MACHINE_IEEE1275
#include <grub/ieee1275/ieee1275.h>
#endif
+#include <grub/tpm.h>
/* Max digits for a char is 3 (0xFF is 255), similarly for an int it
is sizeof (int) * 3, and one extra for a possible -ve sign. */
@@ -936,8 +937,9 @@ grub_script_execute_cmdline (struct grub
grub_err_t ret = 0;
grub_script_function_t func = 0;
char errnobuf[18];
- char *cmdname;
- int argc;
+ char *cmdname, *cmdstring;
+ int argc, offset = 0, cmdlen = 0;
+ unsigned int i;
char **args;
int invert;
struct grub_script_argv argv = { 0, 0, 0 };
@@ -946,6 +948,25 @@ grub_script_execute_cmdline (struct grub
if (grub_script_arglist_to_argv (cmdline->arglist, &argv) || ! argv.args[0])
return grub_errno;
+ for (i = 0; i < argv.argc; i++) {
+ cmdlen += grub_strlen (argv.args[i]) + 1;
+ }
+
+ cmdstring = grub_malloc (cmdlen);
+ if (!cmdstring)
+ {
+ return grub_error (GRUB_ERR_OUT_OF_MEMORY,
+ N_("cannot allocate command buffer"));
+ }
+
+ for (i = 0; i < argv.argc; i++) {
+ offset += grub_snprintf (cmdstring + offset, cmdlen - offset, "%s ",
+ argv.args[i]);
+ }
+ cmdstring[cmdlen-1]= '\0';
+ grub_tpm_measure ((unsigned char *)cmdstring, cmdlen, GRUB_ASCII_PCR,
+ "grub_cmd", cmdstring);
+ grub_free(cmdstring);
invert = 0;
argc = argv.argc - 1;
args = argv.args + 1;

View File

@ -0,0 +1,73 @@
From fd82340829d9fce685f80163ddb6ee3399929c3c Mon Sep 17 00:00:00 2001
From: Matthew Garrett <mjg59@coreos.com>
Date: Tue, 1 Sep 2015 16:02:55 -0700
Subject: [PATCH 09/11] Measure multiboot images and modules
---
grub-core/loader/i386/multiboot_mbi.c | 3 +++
grub-core/loader/multiboot.c | 2 ++
grub-core/loader/multiboot_mbi2.c | 3 +++
3 files changed, 8 insertions(+)
Index: grub-2.02~rc1/grub-core/loader/i386/multiboot_mbi.c
===================================================================
--- grub-2.02~rc1.orig/grub-core/loader/i386/multiboot_mbi.c
+++ grub-2.02~rc1/grub-core/loader/i386/multiboot_mbi.c
@@ -36,6 +36,7 @@
#include <grub/net.h>
#include <grub/i18n.h>
#include <grub/lib/cmdline.h>
+#include <grub/tpm.h>
#ifdef GRUB_MACHINE_EFI
#include <grub/efi/efi.h>
@@ -173,6 +174,8 @@ grub_multiboot_load (grub_file_t file, c
return grub_errno;
}
+ grub_tpm_measure((unsigned char*)buffer, len, GRUB_BINARY_PCR, "grub_multiboot", filename);
+
header = find_header (buffer, len);
if (header == 0)
Index: grub-2.02~rc1/grub-core/loader/multiboot.c
===================================================================
--- grub-2.02~rc1.orig/grub-core/loader/multiboot.c
+++ grub-2.02~rc1/grub-core/loader/multiboot.c
@@ -42,6 +42,7 @@
#include <grub/video.h>
#include <grub/memory.h>
#include <grub/i18n.h>
+#include <grub/tpm.h>
GRUB_MOD_LICENSE ("GPLv3+");
@@ -424,6 +425,7 @@ grub_cmd_module (grub_command_t cmd __at
}
grub_file_close (file);
+ grub_tpm_measure (module, size, GRUB_BINARY_PCR, "grub_multiboot", argv[0]);
return GRUB_ERR_NONE;
}
Index: grub-2.02~rc1/grub-core/loader/multiboot_mbi2.c
===================================================================
--- grub-2.02~rc1.orig/grub-core/loader/multiboot_mbi2.c
+++ grub-2.02~rc1/grub-core/loader/multiboot_mbi2.c
@@ -36,6 +36,7 @@
#include <grub/i18n.h>
#include <grub/net.h>
#include <grub/lib/cmdline.h>
+#include <grub/tpm.h>
#if defined (GRUB_MACHINE_EFI)
#include <grub/efi/efi.h>
@@ -131,6 +132,8 @@ grub_multiboot_load (grub_file_t file, c
COMPILE_TIME_ASSERT (MULTIBOOT_HEADER_ALIGN % 4 == 0);
+ grub_tpm_measure ((unsigned char *)mld.buffer, len, GRUB_BINARY_PCR, "grub_multiboot", filename);
+
header = find_header (mld.buffer, len);
if (header == 0)

View File

@ -0,0 +1,29 @@
From c9016d2ae0abc5edcb4dcf4b1ce04f138f6e5a67 Mon Sep 17 00:00:00 2001
From: Matthew Garrett <mjg59@coreos.com>
Date: Wed, 23 Mar 2016 16:49:42 -0700
Subject: [PATCH 10/11] Fix boot when there's no TPM
If the firmware has TPM support but has no TPM, we're jumping to core.img
without popping the registers back onto the stack. Fix that.
---
grub-core/boot/i386/pc/boot.S | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/grub-core/boot/i386/pc/boot.S b/grub-core/boot/i386/pc/boot.S
index 4c63247..47a461e 100644
--- a/grub-core/boot/i386/pc/boot.S
+++ b/grub-core/boot/i386/pc/boot.S
@@ -476,9 +476,9 @@ LOCAL(copy_buffer):
movl $0x8, %edx /* PCR 8 */
int $0x1A
+boot:
popa
#endif
-boot:
/* boot kernel */
jmp *(LOCAL(kernel_address))
--
1.8.5.6

View File

@ -0,0 +1,74 @@
Index: grub-2.02~rc1/grub-core/kern/efi/tpm.c
===================================================================
--- grub-2.02~rc1.orig/grub-core/kern/efi/tpm.c
+++ grub-2.02~rc1/grub-core/kern/efi/tpm.c
@@ -161,21 +161,12 @@ grub_tpm_execute(PassThroughToTPM_InputP
}
}
-typedef struct {
- grub_uint32_t pcrindex;
- grub_uint32_t eventtype;
- grub_uint8_t digest[20];
- grub_uint32_t eventsize;
- grub_uint8_t event[1];
-} Event;
-
-
static grub_err_t
grub_tpm1_log_event(grub_efi_handle_t tpm_handle, unsigned char *buf,
grub_size_t size, grub_uint8_t pcr,
const char *description)
{
- Event *event;
+ TCG_PCR_EVENT *event;
grub_efi_status_t status;
grub_efi_tpm_protocol_t *tpm;
grub_efi_physical_address_t lastevent;
@@ -188,18 +179,18 @@ grub_tpm1_log_event(grub_efi_handle_t tp
if (!grub_tpm_present(tpm))
return 0;
- event = grub_zalloc(sizeof (Event) + grub_strlen(description) + 1);
+ event = grub_zalloc(sizeof (TCG_PCR_EVENT) + grub_strlen(description) + 1);
if (!event)
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
N_("cannot allocate TPM event buffer"));
- event->pcrindex = pcr;
- event->eventtype = EV_IPL;
- event->eventsize = grub_strlen(description) + 1;
- grub_memcpy(event->event, description, event->eventsize);
+ event->PCRIndex = pcr;
+ event->EventType = EV_IPL;
+ event->EventSize = grub_strlen(description) + 1;
+ grub_memcpy(event->Event, description, event->EventSize);
algorithm = TCG_ALG_SHA;
- status = efi_call_7 (tpm->log_extend_event, tpm, buf, (grub_uint64_t) size,
+ status = efi_call_7 (tpm->log_extend_event, tpm, (grub_efi_physical_address_t)(grub_addr_t) buf, (grub_uint64_t) size,
algorithm, event, &eventnum, &lastevent);
switch (status) {
@@ -245,7 +236,7 @@ grub_tpm2_log_event(grub_efi_handle_t tp
event->Size = sizeof(*event) - sizeof(event->Event) + grub_strlen(description) + 1;
grub_memcpy(event->Event, description, grub_strlen(description) + 1);
- status = efi_call_5 (tpm->hash_log_extend_event, tpm, 0, buf,
+ status = efi_call_5 (tpm->hash_log_extend_event, tpm, 0, (grub_efi_physical_address_t)(grub_addr_t) buf,
(grub_uint64_t) size, event);
switch (status) {
Index: grub-2.02~rc1/include/grub/efi/tpm.h
===================================================================
--- grub-2.02~rc1.orig/include/grub/efi/tpm.h
+++ grub-2.02~rc1/include/grub/efi/tpm.h
@@ -129,7 +129,7 @@ struct grub_efi_tpm2_protocol
grub_efi_boolean_t *EventLogTruncated);
grub_efi_status_t (*hash_log_extend_event) (struct grub_efi_tpm2_protocol *this,
grub_efi_uint64_t Flags,
- grub_efi_physical_address_t *DataToHash,
+ grub_efi_physical_address_t DataToHash,
grub_efi_uint64_t DataToHashLen,
EFI_TCG2_EVENT *EfiTcgEvent);
grub_efi_status_t (*submit_command) (struct grub_efi_tpm2_protocol *this,

View File

@ -1,14 +1,442 @@
From 54b6ba5f27dd9eb9ec2f1a41e7160964ab94451c Mon Sep 17 00:00:00 2001
From: Michael Chang <mchang@suse.com>
Date: Wed, 23 Nov 2016 16:52:16 +0800
Subject: Build tpm as module
Subject: [PATCH 11/11] Build tpm as module
Add --suse-enable-tpm option to grub2-install.
Rather than having tpm as permanent kernel feature that gets enabled and active
unconditionally, it's more applicable to have it as external module that can be
installed with --suse-enable-tpm option to grub2-install.
Index: grub-2.04~rc1/util/grub-install.c
This can provide some enhancement. First the core image size can be nearly the
same when you don't need TPM, as it's controllable option now. Second the TPM
device can be tested upon loading the module instead of on every measurement.
Third is not to potentially break running system by forcing into the TPM after
update, as it's still bleeding edge feature that could have side effect.
---
grub-core/Makefile.core.def | 24 +++-
grub-core/boot/i386/pc/boot.S | 1 -
grub-core/kern/efi/tpm.c | 282 -----------------------------------------
grub-core/kern/i386/pc/tpm.c | 132 --------------------
grub-core/kern/tpm.c | 11 +-
grub-core/tpm/efi/tpm.c | 283 ++++++++++++++++++++++++++++++++++++++++++
grub-core/tpm/i386/pc/tpm.c | 144 +++++++++++++++++++++
include/grub/tpm.h | 23 ++--
util/grub-install.c | 16 ++-
9 files changed, 479 insertions(+), 437 deletions(-)
delete mode 100644 grub-core/kern/efi/tpm.c
delete mode 100644 grub-core/kern/i386/pc/tpm.c
create mode 100644 grub-core/tpm/efi/tpm.c
create mode 100644 grub-core/tpm/i386/pc/tpm.c
Index: grub-2.02~rc1/grub-core/Makefile.core.def
===================================================================
--- grub-2.04~rc1.orig/util/grub-install.c
+++ grub-2.04~rc1/util/grub-install.c
--- grub-2.02~rc1.orig/grub-core/Makefile.core.def
+++ grub-2.02~rc1/grub-core/Makefile.core.def
@@ -174,7 +174,6 @@ kernel = {
efi = term/efi/console.c;
efi = kern/acpi.c;
efi = kern/efi/acpi.c;
- efi = kern/efi/tpm.c;
i386_coreboot = kern/i386/pc/acpi.c;
i386_multiboot = kern/i386/pc/acpi.c;
i386_coreboot = kern/acpi.c;
@@ -221,7 +220,6 @@ kernel = {
i386_pc = kern/i386/pc/init.c;
i386_pc = kern/i386/pc/mmap.c;
- i386_pc = kern/i386/pc/tpm.c;
i386_pc = term/i386/pc/console.c;
i386_qemu = bus/pci.c;
@@ -395,6 +393,19 @@ image = {
};
image = {
+ name = boot_tpm;
+ i386_pc = boot/i386/pc/boot.S;
+
+ cppflags = '-DTPM=1';
+
+ i386_pc_ldflags = '$(TARGET_IMG_LDFLAGS)';
+ i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x7C00';
+
+ objcopyflags = '-O binary';
+ enable = i386_pc;
+};
+
+image = {
name = cdboot;
i386_pc = boot/i386/pc/cdboot.S;
@@ -2369,3 +2380,12 @@ module = {
common = loader/i386/xen_file64.c;
extra_dist = loader/i386/xen_fileXX.c;
};
+
+module = {
+ name = tpm;
+ i386_pc = kern/i386/pc/tpm.c;
+ efi = kern/efi/tpm.c;
+
+ enable = i386_pc;
+ enable = efi;
+};
Index: grub-2.02~rc1/grub-core/boot/i386/pc/boot.S
===================================================================
--- grub-2.02~rc1.orig/grub-core/boot/i386/pc/boot.S
+++ grub-2.02~rc1/grub-core/boot/i386/pc/boot.S
@@ -24,7 +24,6 @@
* defines for the code go here
*/
-#define TPM 1
/* Print message string */
#define MSG(x) movw $x, %si; call LOCAL(message)
Index: grub-2.02~rc1/grub-core/kern/efi/tpm.c
===================================================================
--- grub-2.02~rc1.orig/grub-core/kern/efi/tpm.c
+++ grub-2.02~rc1/grub-core/kern/efi/tpm.c
@@ -7,6 +7,8 @@
#include <grub/tpm.h>
#include <grub/term.h>
+GRUB_MOD_LICENSE ("GPLv3+");
+
static grub_efi_guid_t tpm_guid = EFI_TPM_GUID;
static grub_efi_guid_t tpm2_guid = EFI_TPM2_GUID;
@@ -70,21 +72,14 @@ static grub_efi_boolean_t grub_tpm_handl
}
static grub_err_t
-grub_tpm1_execute(grub_efi_handle_t tpm_handle,
+grub_tpm1_execute(grub_efi_tpm_protocol_t *tpm,
PassThroughToTPM_InputParamBlock *inbuf,
PassThroughToTPM_OutputParamBlock *outbuf)
{
grub_efi_status_t status;
- grub_efi_tpm_protocol_t *tpm;
grub_uint32_t inhdrsize = sizeof(*inbuf) - sizeof(inbuf->TPMOperandIn);
grub_uint32_t outhdrsize = sizeof(*outbuf) - sizeof(outbuf->TPMOperandOut);
- tpm = grub_efi_open_protocol (tpm_handle, &tpm_guid,
- GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
-
- if (!grub_tpm_present(tpm))
- return 0;
-
/* UEFI TPM protocol takes the raw operand block, no param block header */
status = efi_call_5 (tpm->pass_through_to_tpm, tpm,
inbuf->IPBLength - inhdrsize, inbuf->TPMOperandIn,
@@ -107,21 +102,14 @@ grub_tpm1_execute(grub_efi_handle_t tpm_
}
static grub_err_t
-grub_tpm2_execute(grub_efi_handle_t tpm_handle,
+grub_tpm2_execute(grub_efi_tpm2_protocol_t *tpm,
PassThroughToTPM_InputParamBlock *inbuf,
PassThroughToTPM_OutputParamBlock *outbuf)
{
grub_efi_status_t status;
- grub_efi_tpm2_protocol_t *tpm;
grub_uint32_t inhdrsize = sizeof(*inbuf) - sizeof(inbuf->TPMOperandIn);
grub_uint32_t outhdrsize = sizeof(*outbuf) - sizeof(outbuf->TPMOperandOut);
- tpm = grub_efi_open_protocol (tpm_handle, &tpm2_guid,
- GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
-
- if (!grub_tpm2_present(tpm))
- return 0;
-
/* UEFI TPM protocol takes the raw operand block, no param block header */
status = efi_call_5 (tpm->submit_command, tpm,
inbuf->IPBLength - inhdrsize, inbuf->TPMOperandIn,
@@ -143,42 +131,17 @@ grub_tpm2_execute(grub_efi_handle_t tpm_
}
}
-grub_err_t
-grub_tpm_execute(PassThroughToTPM_InputParamBlock *inbuf,
- PassThroughToTPM_OutputParamBlock *outbuf)
-{
- grub_efi_handle_t tpm_handle;
- grub_uint8_t protocol_version;
-
- /* It's not a hard failure for there to be no TPM */
- if (!grub_tpm_handle_find(&tpm_handle, &protocol_version))
- return 0;
-
- if (protocol_version == 1) {
- return grub_tpm1_execute(tpm_handle, inbuf, outbuf);
- } else {
- return grub_tpm2_execute(tpm_handle, inbuf, outbuf);
- }
-}
-
static grub_err_t
-grub_tpm1_log_event(grub_efi_handle_t tpm_handle, unsigned char *buf,
+grub_tpm1_log_event(grub_efi_tpm_protocol_t *tpm, unsigned char *buf,
grub_size_t size, grub_uint8_t pcr,
const char *description)
{
TCG_PCR_EVENT *event;
grub_efi_status_t status;
- grub_efi_tpm_protocol_t *tpm;
grub_efi_physical_address_t lastevent;
grub_uint32_t algorithm;
grub_uint32_t eventnum = 0;
- tpm = grub_efi_open_protocol (tpm_handle, &tpm_guid,
- GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
-
- if (!grub_tpm_present(tpm))
- return 0;
-
event = grub_zalloc(sizeof (TCG_PCR_EVENT) + grub_strlen(description) + 1);
if (!event)
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
@@ -210,19 +173,12 @@ grub_tpm1_log_event(grub_efi_handle_t tp
}
static grub_err_t
-grub_tpm2_log_event(grub_efi_handle_t tpm_handle, unsigned char *buf,
+grub_tpm2_log_event(grub_efi_tpm2_protocol_t *tpm, unsigned char *buf,
grub_size_t size, grub_uint8_t pcr,
const char *description)
{
EFI_TCG2_EVENT *event;
grub_efi_status_t status;
- grub_efi_tpm2_protocol_t *tpm;
-
- tpm = grub_efi_open_protocol (tpm_handle, &tpm2_guid,
- GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
-
- if (!grub_tpm2_present(tpm))
- return 0;
event = grub_zalloc(sizeof (EFI_TCG2_EVENT) + grub_strlen(description) + 1);
if (!event)
@@ -255,19 +211,64 @@ grub_tpm2_log_event(grub_efi_handle_t tp
}
}
-grub_err_t
+static grub_efi_tpm_protocol_t *tpm;
+static grub_efi_tpm2_protocol_t *tpm2;
+
+static grub_err_t
+grub_tpm_execute(PassThroughToTPM_InputParamBlock *inbuf,
+ PassThroughToTPM_OutputParamBlock *outbuf)
+{
+ if (tpm)
+ return grub_tpm1_execute(tpm, inbuf, outbuf);
+ else if (tpm2)
+ return grub_tpm2_execute(tpm2, inbuf, outbuf);
+ return GRUB_ERR_NONE;
+}
+
+static grub_err_t
grub_tpm_log_event(unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
const char *description)
{
+ if (tpm)
+ return grub_tpm1_log_event(tpm, buf, size, pcr, description);
+ else if (tpm2)
+ return grub_tpm2_log_event(tpm2, buf, size, pcr, description);
+ return GRUB_ERR_NONE;
+}
+
+static struct grub_tpm grub_efi_tpm =
+{
+ .log_event = grub_tpm_log_event,
+ .execute = grub_tpm_execute
+};
+
+GRUB_MOD_INIT (tpm)
+{
grub_efi_handle_t tpm_handle;
grub_efi_uint8_t protocol_version;
- if (!grub_tpm_handle_find(&tpm_handle, &protocol_version))
- return 0;
+ if (!grub_tpm_handle_find (&tpm_handle, &protocol_version))
+ return ;
- if (protocol_version == 1) {
- return grub_tpm1_log_event(tpm_handle, buf, size, pcr, description);
- } else {
- return grub_tpm2_log_event(tpm_handle, buf, size, pcr, description);
- }
+ if (protocol_version == 1)
+ {
+ tpm = grub_efi_open_protocol (tpm_handle, &tpm_guid,
+ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+ if (tpm && grub_tpm_present(tpm))
+ grub_tpm = &grub_efi_tpm;
+ }
+ else
+ {
+ tpm2 = grub_efi_open_protocol (tpm_handle, &tpm2_guid,
+ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+ if (tpm2 && grub_tpm2_present(tpm2))
+ grub_tpm = &grub_efi_tpm;
+ }
+}
+
+GRUB_MOD_FINI (tpm)
+{
+ grub_tpm = NULL;
+ tpm = NULL;
+ tpm2 = NULL;
}
Index: grub-2.02~rc1/grub-core/kern/i386/pc/tpm.c
===================================================================
--- grub-2.02~rc1.orig/grub-core/kern/i386/pc/tpm.c
+++ grub-2.02~rc1/grub-core/kern/i386/pc/tpm.c
@@ -4,12 +4,14 @@
#include <grub/tpm.h>
#include <grub/misc.h>
#include <grub/i386/pc/int.h>
+#include <grub/dl.h>
-#define TCPA_MAGIC 0x41504354
+GRUB_MOD_LICENSE ("GPLv3+");
-int tpm_present(void);
+#define TCPA_MAGIC 0x41504354
-int tpm_present(void)
+static int
+tpm_present(void)
{
struct grub_bios_int_registers regs;
@@ -24,16 +26,13 @@ int tpm_present(void)
return 0;
}
-grub_err_t
+static grub_err_t
grub_tpm_execute(PassThroughToTPM_InputParamBlock *inbuf,
PassThroughToTPM_OutputParamBlock *outbuf)
{
struct grub_bios_int_registers regs;
grub_addr_t inaddr, outaddr;
- if (!tpm_present())
- return 0;
-
inaddr = (grub_addr_t) inbuf;
outaddr = (grub_addr_t) outbuf;
regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT;
@@ -80,7 +79,7 @@ typedef struct {
grub_uint8_t hashvalue[20];
} GRUB_PACKED EventOutgoing;
-grub_err_t
+static grub_err_t
grub_tpm_log_event(unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
const char *description)
{
@@ -90,9 +89,6 @@ grub_tpm_log_event(unsigned char *buf, g
Event *event;
grub_uint32_t datalength;
- if (!tpm_present())
- return 0;
-
datalength = grub_strlen(description);
event = grub_zalloc(datalength + sizeof(Event));
if (!event)
@@ -130,3 +126,19 @@ grub_tpm_log_event(unsigned char *buf, g
return 0;
}
+static struct grub_tpm grub_pc_tpm =
+{
+ .log_event = grub_tpm_log_event,
+ .execute = grub_tpm_execute
+};
+
+GRUB_MOD_INIT (tpm)
+{
+ if (tpm_present())
+ grub_tpm = &grub_pc_tpm;
+}
+
+GRUB_MOD_FINI (tpm)
+{
+ grub_tpm = NULL;
+}
Index: grub-2.02~rc1/grub-core/kern/tpm.c
===================================================================
--- grub-2.02~rc1.orig/grub-core/kern/tpm.c
+++ grub-2.02~rc1/grub-core/kern/tpm.c
@@ -5,15 +5,22 @@
#include <grub/tpm.h>
#include <grub/term.h>
+grub_tpm_t grub_tpm = NULL;
+
grub_err_t
grub_tpm_measure (unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
const char *kind, const char *description)
{
grub_err_t ret;
- char *desc = grub_xasprintf("%s %s", kind, description);
+ char *desc;
+
+ if (!grub_tpm)
+ return GRUB_ERR_NONE;
+
+ desc = grub_xasprintf("%s %s", kind, description);
if (!desc)
return GRUB_ERR_OUT_OF_MEMORY;
- ret = grub_tpm_log_event(buf, size, pcr, description);
+ ret = grub_tpm->log_event(buf, size, pcr, desc);
grub_free(desc);
return ret;
}
Index: grub-2.02~rc1/include/grub/tpm.h
===================================================================
--- grub-2.02~rc1.orig/include/grub/tpm.h
+++ grub-2.02~rc1/include/grub/tpm.h
@@ -69,21 +69,14 @@ typedef struct {
grub_err_t EXPORT_FUNC(grub_tpm_measure) (unsigned char *buf, grub_size_t size,
grub_uint8_t pcr, const char *kind,
const char *description);
-#if defined (GRUB_MACHINE_EFI) || defined (GRUB_MACHINE_PCBIOS)
-grub_err_t grub_tpm_execute(PassThroughToTPM_InputParamBlock *inbuf,
- PassThroughToTPM_OutputParamBlock *outbuf);
-grub_err_t grub_tpm_log_event(unsigned char *buf, grub_size_t size,
- grub_uint8_t pcr, const char *description);
-#else
-static inline grub_err_t grub_tpm_execute(PassThroughToTPM_InputParamBlock *inbuf,
- PassThroughToTPM_OutputParamBlock *outbuf) { return 0; };
-static inline grub_err_t grub_tpm_log_event(unsigned char *buf,
- grub_size_t size,
- grub_uint8_t pcr,
- const char *description)
+typedef struct grub_tpm
{
- return 0;
-};
-#endif
+ grub_err_t (*log_event)(unsigned char *buf, grub_size_t size,
+ grub_uint8_t pcr, const char *description);
+ grub_err_t (*execute)(PassThroughToTPM_InputParamBlock *inbuf,
+ PassThroughToTPM_OutputParamBlock *outbuf);
+} *grub_tpm_t;
+
+extern grub_tpm_t EXPORT_VAR(grub_tpm);
#endif
Index: grub-2.02~rc1/util/grub-install.c
===================================================================
--- grub-2.02~rc1.orig/util/grub-install.c
+++ grub-2.02~rc1/util/grub-install.c
@@ -80,6 +80,7 @@ static char *label_color;
static char *label_bgcolor;
static char *product_version;
@ -44,13 +472,34 @@ Index: grub-2.04~rc1/util/grub-install.c
{"debug", OPTION_DEBUG, 0, OPTION_HIDDEN, 0, 2},
{"no-floppy", OPTION_NO_FLOPPY, 0, OPTION_HIDDEN, 0, 2},
@@ -1320,6 +1327,9 @@ main (int argc, char *argv[])
@@ -1322,6 +1329,9 @@ main (int argc, char *argv[])
else if (disk_module && disk_module[0])
grub_install_push_module (disk_module);
+ if (suse_enable_tpm && platform == GRUB_INSTALL_PLATFORM_X86_64_EFI)
+ if (suse_enable_tpm && (is_efi || platform == GRUB_INSTALL_PLATFORM_I386_PC))
+ grub_install_push_module ("tpm");
+
relative_grubdir = grub_make_system_path_relative_to_its_root (grubdir);
if (relative_grubdir[0] == '\0')
{
@@ -1742,9 +1752,9 @@ main (int argc, char *argv[])
{
char *boot_img_src = grub_util_path_concat (2,
grub_install_source_directory,
- "boot.img");
+ suse_enable_tpm ? "boot_tpm.img" : "boot.img");
char *boot_img = grub_util_path_concat (2, platdir,
- "boot.img");
+ suse_enable_tpm ? "boot_tpm.img" : "boot.img");
grub_install_copy_file (boot_img_src, boot_img, 1);
grub_util_info ("%sgrub-bios-setup %s %s %s %s %s --directory='%s' --device-map='%s' '%s'",
@@ -1762,7 +1772,7 @@ main (int argc, char *argv[])
/* Now perform the installation. */
if (install_bootsector)
- grub_util_bios_setup (platdir, "boot.img", "core.img",
+ grub_util_bios_setup (platdir, suse_enable_tpm ? "boot_tpm.img" : "boot.img", "core.img",
install_drive, force,
fs_probe, allow_floppy, add_rs_codes);
break;

View File

@ -0,0 +1,148 @@
Index: grub-2.02/grub-core/Makefile.core.def
===================================================================
--- grub-2.02.orig/grub-core/Makefile.core.def
+++ grub-2.02/grub-core/Makefile.core.def
@@ -451,6 +451,20 @@ image = {
};
image = {
+ name = diskboot_tpm;
+ i386_pc = boot/i386/pc/diskboot.S;
+
+ cppflags = '-DTPM=1';
+
+ i386_pc_ldflags = '$(TARGET_IMG_LDFLAGS)';
+ i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x8000';
+
+ objcopyflags = '-O binary';
+
+ enable = i386_pc;
+};
+
+image = {
name = lnxboot;
i386_pc = boot/i386/pc/lnxboot.S;
Index: grub-2.02/grub-core/boot/i386/pc/diskboot.S
===================================================================
--- grub-2.02.orig/grub-core/boot/i386/pc/diskboot.S
+++ grub-2.02/grub-core/boot/i386/pc/diskboot.S
@@ -19,8 +19,6 @@
#include <grub/symbol.h>
#include <grub/machine/boot.h>
-#define TPM 1
-
/*
* defines for the code go here
*/
Index: grub-2.02/include/grub/util/mkimage.h
===================================================================
--- grub-2.02.orig/include/grub/util/mkimage.h
+++ grub-2.02/include/grub/util/mkimage.h
@@ -71,7 +71,8 @@ struct grub_install_image_target_desc
IMAGE_I386_IEEE1275,
IMAGE_LOONGSON_ELF, IMAGE_QEMU, IMAGE_PPC, IMAGE_YEELOONG_FLASH,
IMAGE_FULOONG2F_FLASH, IMAGE_I386_PC_PXE, IMAGE_MIPS_ARC,
- IMAGE_QEMU_MIPS_FLASH, IMAGE_UBOOT, IMAGE_XEN, IMAGE_I386_PC_ELTORITO
+ IMAGE_QEMU_MIPS_FLASH, IMAGE_UBOOT, IMAGE_XEN, IMAGE_I386_PC_ELTORITO,
+ IMAGE_I386_PC_TPM
} id;
enum
{
Index: grub-2.02/util/grub-install.c
===================================================================
--- grub-2.02.orig/util/grub-install.c
+++ grub-2.02/util/grub-install.c
@@ -1660,6 +1660,16 @@ main (int argc, char *argv[])
case GRUB_INSTALL_PLATFORM_I386_PC:
+ if (suse_enable_tpm)
+ {
+ snprintf (mkimage_target, sizeof (mkimage_target),
+ "%s-%s-tpm",
+ grub_install_get_platform_cpu (platform),
+ grub_install_get_platform_platform (platform));
+ core_name = "core.img";
+ break;
+ }
+ /* FALLTHROUGH */
case GRUB_INSTALL_PLATFORM_MIPSEL_ARC:
case GRUB_INSTALL_PLATFORM_MIPS_ARC:
case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
Index: grub-2.02/util/mkimage.c
===================================================================
--- grub-2.02.orig/util/mkimage.c
+++ grub-2.02/util/mkimage.c
@@ -165,6 +165,22 @@ static const struct grub_install_image_t
.default_compression = GRUB_COMPRESSION_LZMA
},
{
+ .dirname = "i386-pc",
+ .names = { "i386-pc-tpm", NULL },
+ .voidp_sizeof = 4,
+ .bigendian = 0,
+ .id = IMAGE_I386_PC_TPM,
+ .flags = PLATFORM_FLAGS_DECOMPRESSORS,
+ .total_module_size = TARGET_NO_FIELD,
+ .decompressor_compressed_size = GRUB_DECOMPRESSOR_I386_PC_COMPRESSED_SIZE,
+ .decompressor_uncompressed_size = GRUB_DECOMPRESSOR_I386_PC_UNCOMPRESSED_SIZE,
+ .decompressor_uncompressed_addr = TARGET_NO_FIELD,
+ .section_align = 1,
+ .vaddr_offset = 0,
+ .link_addr = GRUB_KERNEL_I386_PC_LINK_ADDR,
+ .default_compression = GRUB_COMPRESSION_LZMA
+ },
+ {
.dirname = "i386-efi",
.names = { "i386-efi", NULL },
.voidp_sizeof = 4,
@@ -756,7 +772,8 @@ grub_install_generate_image (const char
if (image_target->id == IMAGE_I386_PC
|| image_target->id == IMAGE_I386_PC_PXE
- || image_target->id == IMAGE_I386_PC_ELTORITO)
+ || image_target->id == IMAGE_I386_PC_ELTORITO
+ || image_target->id == IMAGE_I386_PC_TPM)
comp = GRUB_COMPRESSION_LZMA;
path_list = grub_util_resolve_dependencies (dir, "moddep.lst", mods);
@@ -980,7 +997,8 @@ grub_install_generate_image (const char
if ((image_target->id == IMAGE_I386_PC
|| image_target->id == IMAGE_I386_PC_PXE
- || image_target->id == IMAGE_I386_PC_ELTORITO)
+ || image_target->id == IMAGE_I386_PC_ELTORITO
+ || image_target->id == IMAGE_I386_PC_TPM)
&& decompress_size > GRUB_KERNEL_I386_PC_LINK_ADDR - 0x8200)
grub_util_error ("%s", _("Decompressor is too big"));
@@ -1023,6 +1041,7 @@ grub_install_generate_image (const char
case IMAGE_I386_PC:
case IMAGE_I386_PC_PXE:
case IMAGE_I386_PC_ELTORITO:
+ case IMAGE_I386_PC_TPM:
if (GRUB_KERNEL_I386_PC_LINK_ADDR + core_size > 0x78000
|| (core_size > (0xffff << GRUB_DISK_SECTOR_BITS))
|| (layout.kernel_size + layout.bss_size
@@ -1061,6 +1080,7 @@ grub_install_generate_image (const char
case IMAGE_I386_PC:
case IMAGE_I386_PC_PXE:
case IMAGE_I386_PC_ELTORITO:
+ case IMAGE_I386_PC_TPM:
{
unsigned num;
char *boot_path, *boot_img;
@@ -1110,7 +1130,10 @@ grub_install_generate_image (const char
free (eltorito_path);
}
- boot_path = grub_util_get_path (dir, "diskboot.img");
+ if (image_target->id == IMAGE_I386_PC_TPM)
+ boot_path = grub_util_get_path (dir, "diskboot_tpm.img");
+ else
+ boot_path = grub_util_get_path (dir, "diskboot.img");
boot_size = grub_util_get_image_size (boot_path);
if (boot_size != GRUB_DISK_SECTOR_SIZE)
grub_util_error (_("diskboot.img size must be %u bytes"),

3
grub-2.02.tar.xz Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:810b3798d316394f94096ec2797909dbf23c858e48f7b3830826b8daa06b7b0f
size 6113260

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e5292496995ad42dabe843a0192cf2a2c502e7ffcc7479398232b10a472df77d
size 6393864

View File

@ -26,16 +26,15 @@ The count of zero with __builtin_clz can be 22. (clz counts the number of one bi
grub-core/net/drivers/ieee1275/ofnet.c | 2 +-
1 file changed, 1 insertion(+), 2 deletions(-)
Index: grub-2.04~rc1/grub-core/net/drivers/ieee1275/ofnet.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/net/drivers/ieee1275/ofnet.c
+++ grub-2.04~rc1/grub-core/net/drivers/ieee1275/ofnet.c
@@ -220,7 +220,7 @@ grub_ieee1275_parse_bootpath (const char
flags);
inter->vlantag = vlantag;
diff -ur grub-2.02~/grub-core/net/drivers/ieee1275/ofnet.c grub-2.02/grub-core/net/drivers/ieee1275/ofnet.c
--- grub-2.02~/grub-core/net/drivers/ieee1275/ofnet.c 2018-03-26 13:49:55.399558334 +0200
+++ grub-2.02/grub-core/net/drivers/ieee1275/ofnet.c 2018-03-26 13:51:03.092656921 +0200
@@ -232,7 +232,7 @@
}
grub_net_add_ipv4_local (inter,
- __builtin_ctz (~grub_le_to_cpu32 (subnet_mask.ipv4)));
+ __builtin_clz (~ (subnet_mask.ipv4)));
}
if (gateway_addr.ipv4 != 0)

View File

@ -0,0 +1,22 @@
Accept empty modules
For the Xen platform the all_video.mod module is empty.
With old binutils the .symtab section remained (containing
only section symbols), so the check didn't trigger, but starting
with binutils 2.27 not even a .symtab remains. As there are
also no relocations that's no problem (and that is checked
independendly).
Index: grub-2.02~rc1/util/grub-module-verifierXX.c
===================================================================
--- grub-2.02~rc1.orig/util/grub-module-verifierXX.c
+++ grub-2.02~rc1/util/grub-module-verifierXX.c
@@ -224,7 +224,8 @@ check_symbols (const struct grub_module_
s = find_section (arch, e, ".moddeps");
if (!s)
- grub_util_error ("no symbol table and no .moddeps section");
+ /*grub_util_error ("no symbol table and no .moddeps section");*/
+ return; /* An empty module happens for all_video.module for Xen */
if (!s->sh_size)
grub_util_error ("no symbol table and empty .moddeps section");

74
grub2-binutils2.31.patch Normal file
View File

@ -0,0 +1,74 @@
From 842c390469e2c2e10b5aa36700324cd3bde25875 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Sat, 17 Feb 2018 06:47:28 -0800
Subject: x86-64: Treat R_X86_64_PLT32 as R_X86_64_PC32
Starting from binutils commit bd7ab16b4537788ad53521c45469a1bdae84ad4a:
https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=bd7ab16b4537788ad53521c45469a1bdae84ad4a
x86-64 assembler generates R_X86_64_PLT32, instead of R_X86_64_PC32, for
32-bit PC-relative branches. Grub2 should treat R_X86_64_PLT32 as
R_X86_64_PC32.
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
---
grub-core/efiemu/i386/loadcore64.c | 1 +
grub-core/kern/x86_64/dl.c | 1 +
util/grub-mkimagexx.c | 1 +
util/grub-module-verifier.c | 1 +
4 files changed, 4 insertions(+)
diff --git a/grub-core/efiemu/i386/loadcore64.c b/grub-core/efiemu/i386/loadcore64.c
index e49d0b6..18facf4 100644
--- a/grub-core/efiemu/i386/loadcore64.c
+++ b/grub-core/efiemu/i386/loadcore64.c
@@ -98,6 +98,7 @@ grub_arch_efiemu_relocate_symbols64 (grub_efiemu_segment_t segs,
break;
case R_X86_64_PC32:
+ case R_X86_64_PLT32:
err = grub_efiemu_write_value (addr,
*addr32 + rel->r_addend
+ sym.off
diff --git a/grub-core/kern/x86_64/dl.c b/grub-core/kern/x86_64/dl.c
index 4406906..3a73e6e 100644
--- a/grub-core/kern/x86_64/dl.c
+++ b/grub-core/kern/x86_64/dl.c
@@ -70,6 +70,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
break;
case R_X86_64_PC32:
+ case R_X86_64_PLT32:
{
grub_int64_t value;
value = ((grub_int32_t) *addr32) + rel->r_addend + sym->st_value -
diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c
index a2bb054..39d7efb 100644
--- a/util/grub-mkimagexx.c
+++ b/util/grub-mkimagexx.c
@@ -841,6 +841,7 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections,
break;
case R_X86_64_PC32:
+ case R_X86_64_PLT32:
{
grub_uint32_t *t32 = (grub_uint32_t *) target;
*t32 = grub_host_to_target64 (grub_target_to_host32 (*t32)
diff --git a/util/grub-module-verifier.c b/util/grub-module-verifier.c
index 9179285..a79271f 100644
--- a/util/grub-module-verifier.c
+++ b/util/grub-module-verifier.c
@@ -19,6 +19,7 @@ struct grub_module_verifier_arch archs[] = {
-1
}, (int[]){
R_X86_64_PC32,
+ R_X86_64_PLT32,
-1
}
},
--
cgit v1.0-41-gc330

View File

@ -21,21 +21,21 @@ Signed-off-by: Jeff Mahoney <jeffm@suse.com>
grub-core/fs/btrfs.c | 529 +++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 518 insertions(+), 11 deletions(-)
Index: grub-2.04~rc1/grub-core/fs/btrfs.c
Index: grub-2.02~beta2/grub-core/fs/btrfs.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/fs/btrfs.c
+++ grub-2.04~rc1/grub-core/fs/btrfs.c
@@ -40,6 +40,9 @@
--- grub-2.02~beta2.orig/grub-core/fs/btrfs.c
+++ grub-2.02~beta2/grub-core/fs/btrfs.c
@@ -29,6 +29,9 @@
#include <minilzo.h>
#include <grub/i18n.h>
#include <grub/btrfs.h>
#include <grub/crypto.h>
#include <grub/diskfilter.h>
+#include <grub/command.h>
+#include <grub/env.h>
+#include <grub/extcmd.h>
GRUB_MOD_LICENSE ("GPLv3+");
@@ -78,9 +81,11 @@ struct grub_btrfs_superblock
@@ -64,9 +67,11 @@ struct grub_btrfs_superblock
grub_uint64_t generation;
grub_uint64_t root_tree;
grub_uint64_t chunk_tree;
@ -49,7 +49,7 @@ Index: grub-2.04~rc1/grub-core/fs/btrfs.c
struct grub_btrfs_device this_device;
char label[0x100];
grub_uint8_t dummy4[0x100];
@@ -120,6 +125,7 @@ struct grub_btrfs_data
@@ -105,6 +110,7 @@ struct grub_btrfs_data
grub_uint64_t exttree;
grub_size_t extsize;
struct grub_btrfs_extent_data *extent;
@ -57,7 +57,7 @@ Index: grub-2.04~rc1/grub-core/fs/btrfs.c
};
struct grub_btrfs_chunk_item
@@ -188,6 +194,14 @@ struct grub_btrfs_leaf_descriptor
@@ -171,6 +177,14 @@ struct grub_btrfs_leaf_descriptor
} *data;
};
@ -72,7 +72,7 @@ Index: grub-2.04~rc1/grub-core/fs/btrfs.c
struct grub_btrfs_time
{
grub_int64_t sec;
@@ -233,6 +247,14 @@ struct grub_btrfs_extent_data
@@ -215,6 +229,14 @@ struct grub_btrfs_extent_data
#define GRUB_BTRFS_OBJECT_ID_CHUNK 0x100
@ -87,7 +87,7 @@ Index: grub-2.04~rc1/grub-core/fs/btrfs.c
static grub_disk_addr_t superblock_sectors[] = { 64 * 2, 64 * 1024 * 2,
256 * 1048576 * 2, 1048576ULL * 1048576ULL * 2
};
@@ -1153,6 +1175,62 @@ grub_btrfs_read_logical (struct grub_btr
@@ -830,6 +852,62 @@ grub_btrfs_read_logical (struct grub_btr
return GRUB_ERR_NONE;
}
@ -150,7 +150,7 @@ Index: grub-2.04~rc1/grub-core/fs/btrfs.c
static struct grub_btrfs_data *
grub_btrfs_mount (grub_device_t dev)
{
@@ -1188,6 +1266,13 @@ grub_btrfs_mount (grub_device_t dev)
@@ -865,6 +943,13 @@ grub_btrfs_mount (grub_device_t dev)
data->devices_attached[0].dev = dev;
data->devices_attached[0].id = data->sblock.this_device.device_id;
@ -164,7 +164,7 @@ Index: grub-2.04~rc1/grub-core/fs/btrfs.c
return data;
}
@@ -1654,6 +1739,91 @@ get_root (struct grub_btrfs_data *data,
@@ -1226,6 +1311,91 @@ get_root (struct grub_btrfs_data *data,
}
static grub_err_t
@ -256,7 +256,7 @@ Index: grub-2.04~rc1/grub-core/fs/btrfs.c
find_path (struct grub_btrfs_data *data,
const char *path, struct grub_btrfs_key *key,
grub_uint64_t *tree, grub_uint8_t *type)
@@ -1671,14 +1841,26 @@ find_path (struct grub_btrfs_data *data,
@@ -1243,14 +1413,26 @@ find_path (struct grub_btrfs_data *data,
char *origpath = NULL;
unsigned symlinks_max = 32;
@ -287,7 +287,7 @@ Index: grub-2.04~rc1/grub-core/fs/btrfs.c
while (1)
{
while (path[0] == '/')
@@ -1851,9 +2033,21 @@ find_path (struct grub_btrfs_data *data,
@@ -1423,9 +1605,21 @@ find_path (struct grub_btrfs_data *data,
path = path_alloc = tmp;
if (path[0] == '/')
{
@ -312,7 +312,7 @@ Index: grub-2.04~rc1/grub-core/fs/btrfs.c
}
continue;
}
@@ -2094,6 +2288,20 @@ grub_btrfs_read (grub_file_t file, char
@@ -1666,6 +1860,20 @@ grub_btrfs_read (grub_file_t file, char
data->tree, file->offset, buf, len);
}
@ -333,7 +333,7 @@ Index: grub-2.04~rc1/grub-core/fs/btrfs.c
static grub_err_t
grub_btrfs_uuid (grub_device_t device, char **uuid)
{
@@ -2105,15 +2313,7 @@ grub_btrfs_uuid (grub_device_t device, c
@@ -1677,15 +1885,7 @@ grub_btrfs_uuid (grub_device_t device, c
if (!data)
return grub_errno;
@ -350,7 +350,7 @@ Index: grub-2.04~rc1/grub-core/fs/btrfs.c
grub_btrfs_unmount (data);
@@ -2170,6 +2370,242 @@ grub_btrfs_embed (grub_device_t device _
@@ -1742,6 +1942,242 @@ grub_btrfs_embed (grub_device_t device _
}
#endif
@ -592,8 +592,8 @@ Index: grub-2.04~rc1/grub-core/fs/btrfs.c
+
static struct grub_fs grub_btrfs_fs = {
.name = "btrfs",
.fs_dir = grub_btrfs_dir,
@@ -2185,12 +2621,88 @@ static struct grub_fs grub_btrfs_fs = {
.dir = grub_btrfs_dir,
@@ -1757,12 +2193,88 @@ static struct grub_fs grub_btrfs_fs = {
#endif
};
@ -682,10 +682,10 @@ Index: grub-2.04~rc1/grub-core/fs/btrfs.c
}
+
+// vim: si et sw=2:
Index: grub-2.04~rc1/include/grub/btrfs.h
Index: grub-2.02~beta2/include/grub/btrfs.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/btrfs.h
+++ grub-2.04~rc1/include/grub/btrfs.h
--- grub-2.02~beta2.orig/include/grub/btrfs.h
+++ grub-2.02~beta2/include/grub/btrfs.h
@@ -29,6 +29,7 @@ enum
GRUB_BTRFS_ITEM_TYPE_ROOT_ITEM = 0x84,
GRUB_BTRFS_ITEM_TYPE_ROOT_BACKREF = 0x90,

View File

@ -1,8 +1,8 @@
Index: grub-2.04~rc1/grub-core/fs/btrfs.c
Index: grub-2.02/grub-core/fs/btrfs.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/fs/btrfs.c
+++ grub-2.04~rc1/grub-core/fs/btrfs.c
@@ -2867,6 +2867,242 @@ out:
--- grub-2.02.orig/grub-core/fs/btrfs.c
+++ grub-2.02/grub-core/fs/btrfs.c
@@ -2446,6 +2446,242 @@ out:
return 0;
}
@ -244,8 +244,8 @@ Index: grub-2.04~rc1/grub-core/fs/btrfs.c
+
static struct grub_fs grub_btrfs_fs = {
.name = "btrfs",
.fs_dir = grub_btrfs_dir,
@@ -2885,6 +3121,7 @@ static struct grub_fs grub_btrfs_fs = {
.dir = grub_btrfs_dir,
@@ -2464,6 +2700,7 @@ static struct grub_fs grub_btrfs_fs = {
static grub_command_t cmd_info;
static grub_command_t cmd_mount_subvol;
static grub_extcmd_t cmd_list_subvols;
@ -253,7 +253,7 @@ Index: grub-2.04~rc1/grub-core/fs/btrfs.c
static char *
subvolid_set_env (struct grub_env_var *var __attribute__ ((unused)),
@@ -2955,6 +3192,11 @@ GRUB_MOD_INIT (btrfs)
@@ -2534,6 +2771,11 @@ GRUB_MOD_INIT (btrfs)
"[-p|-n] [-o var] DEVICE",
"Print list of BtrFS subvolumes on "
"DEVICE.", options);

View File

@ -4,18 +4,12 @@ References: bsc#892852, bsc#891946
Patch-Mainline: not yet
Needed to allow s390x-emu to be telecontrolled via LOADPARM.
v2: Added GRUB_FILE_TYPE_READ_ENVVAR as file type by read_file sub-command
tracked by verifier framework.
---
grub-core/commands/read.c | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
Index: grub-2.04~rc1/grub-core/commands/read.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/commands/read.c
+++ grub-2.04~rc1/grub-core/commands/read.c
--- a/grub-core/commands/read.c
+++ b/grub-core/commands/read.c
@@ -20,6 +20,7 @@
#include <grub/dl.h>
#include <grub/misc.h>
@ -39,7 +33,7 @@ Index: grub-2.04~rc1/grub-core/commands/read.c
+ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("file name expected"));
+ if (argc < 2)
+ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("variable name expected"));
+ file = grub_file_open (args[i++], GRUB_FILE_TYPE_READ_ENVVAR);
+ file = grub_file_open (args[i++]);
+ if (! file)
+ return grub_errno;
+ while ( i < argc )
@ -74,15 +68,3 @@ Index: grub-2.04~rc1/grub-core/commands/read.c
grub_unregister_command (cmd);
+ grub_unregister_command (cme);
}
Index: grub-2.04~rc1/include/grub/file.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/file.h
+++ grub-2.04~rc1/include/grub/file.h
@@ -122,6 +122,7 @@ enum grub_file_type
GRUB_FILE_TYPE_FS_SEARCH,
GRUB_FILE_TYPE_AUDIO,
GRUB_FILE_TYPE_VBE_DUMP,
+ GRUB_FILE_TYPE_READ_ENVVAR,
GRUB_FILE_TYPE_LOADENV,
GRUB_FILE_TYPE_SAVEENV,

View File

@ -0,0 +1,186 @@
From 33298c813c36a50ccc881c33c9b6eacfb830c21a Mon Sep 17 00:00:00 2001
From: Alexander Graf <agraf@suse.de>
Subject: [PATCH v7 2/2] efi: Free malloc regions on exit
When we exit grub, we don't free all the memory that we allocated earlier
for our heap region. This can cause problems with setups where you try
to descend the boot order using "exit" entries, such as PXE -> HD boot
scenarios.
Signed-off-by: Alexander Graf <agraf@suse.de>
---
v2 -> v3:
- add comment explaining the number of regions
- move nr of regions into a define
- add warning if we exceed the number of freeable regions
- reset region counter to 0 on fini
v3 -> v4:
- use dynamic list instead of static array at runtime
- use allocate_pool for list, so we are not bound by heap or random numbers
- remember all allocations, not just the heap
v4 -> v5:
- free dynamic list entries on allocation removal
v5 -> v6:
- move next ptr to last field
- s/start_addr/address/
- s/grub_efi_unremember_pages()/grub_efi_drop_alloc()/
- s/grub_efi_remember_pages()/grub_efi_store_alloc()/
- move grub_efi_drop_alloc after grub_efi_store_alloc
- s/grub2/GRUB/
- Make grub_efi_memory_fini comment more verbose
- Drop useless efi_allocated_memory = NULL; line
v6 -> v7:
- rewrite grub_efi_drop_alloc() according to Daniel's comments
---
grub-core/kern/efi/init.c | 1 +
grub-core/kern/efi/mm.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++
include/grub/efi/efi.h | 1 +
3 files changed, 81 insertions(+)
diff --git a/grub-core/kern/efi/init.c b/grub-core/kern/efi/init.c
index 2c31847bf..3dfdf2d22 100644
--- a/grub-core/kern/efi/init.c
+++ b/grub-core/kern/efi/init.c
@@ -80,4 +80,5 @@ grub_efi_fini (void)
{
grub_efidisk_fini ();
grub_console_fini ();
+ grub_efi_memory_fini ();
}
diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c
index ac2a4c556..6da8c206a 100644
--- a/grub-core/kern/efi/mm.c
+++ b/grub-core/kern/efi/mm.c
@@ -49,6 +49,69 @@ static grub_efi_uintn_t finish_desc_size;
static grub_efi_uint32_t finish_desc_version;
int grub_efi_is_finished = 0;
+/*
+ * We need to roll back EFI allocations on exit. Remember allocations that
+ * we'll free on exit.
+ */
+struct efi_allocation;
+struct efi_allocation {
+ grub_efi_physical_address_t address;
+ grub_efi_uint64_t pages;
+ struct efi_allocation *next;
+};
+static struct efi_allocation *efi_allocated_memory;
+
+static void
+grub_efi_store_alloc (grub_efi_physical_address_t address,
+ grub_efi_uintn_t pages)
+{
+ grub_efi_boot_services_t *b;
+ struct efi_allocation *alloc;
+ grub_efi_status_t status;
+
+ b = grub_efi_system_table->boot_services;
+ status = efi_call_3 (b->allocate_pool, GRUB_EFI_LOADER_DATA,
+ sizeof(*alloc), (void**)&alloc);
+ if (status == GRUB_EFI_SUCCESS)
+ {
+ alloc->next = efi_allocated_memory;
+ alloc->address = address;
+ alloc->pages = pages;
+ efi_allocated_memory = alloc;
+ }
+ else
+ grub_printf ("Could not malloc memory to remember EFI allocation. "
+ "Exiting GRUB won't free all memory.\n");
+}
+
+static void
+grub_efi_drop_alloc (grub_efi_physical_address_t address,
+ grub_efi_uintn_t pages)
+{
+ struct efi_allocation *ea, *eap;
+ grub_efi_boot_services_t *b;
+
+ b = grub_efi_system_table->boot_services;
+
+ for (eap = NULL, ea = efi_allocated_memory; ea; eap = ea, ea = ea->next)
+ {
+ if (ea->address != address || ea->pages != pages)
+ continue;
+
+ /* Remove the current entry from the list */
+ if (eap)
+ eap->next = ea->next;
+ else
+ efi_allocated_memory = ea->next;
+
+ /* Then free the memory backing it */
+ efi_call_1 (b->free_pool, ea);
+
+ /* And leave, we're done */
+ break;
+ }
+}
+
/* Allocate pages below a specified address */
void *
grub_efi_allocate_pages_max (grub_efi_physical_address_t max,
@@ -79,6 +142,7 @@ grub_efi_allocate_pages_real (grub_efi_physical_address_t address,
return 0;
}
+ grub_efi_store_alloc (address, pages);
return (void *) ((grub_addr_t) address);
}
@@ -108,6 +172,7 @@ grub_efi_free_pages (grub_efi_physical_address_t address,
b = grub_efi_system_table->boot_services;
efi_call_2 (b->free_pages, address, pages);
+ grub_efi_drop_alloc (address, pages);
}
#if defined (__i386__) || defined (__x86_64__)
@@ -422,6 +487,20 @@ add_memory_regions (grub_efi_memory_descriptor_t *memory_map,
grub_fatal ("too little memory");
}
+void
+grub_efi_memory_fini (void)
+{
+ /*
+ * Free all stale allocations. grub_efi_free_pages() will remove
+ * the found entry from the list and it will always find the first
+ * list entry (efi_allocated_memory is the list start). Hence we
+ * remove all entries from the list until none is left altogether.
+ */
+ while (efi_allocated_memory)
+ grub_efi_free_pages (efi_allocated_memory->address,
+ efi_allocated_memory->pages);
+}
+
#if 0
/* Print the memory map. */
static void
diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h
index 3fa082816..c996913e5 100644
--- a/include/grub/efi/efi.h
+++ b/include/grub/efi/efi.h
@@ -55,6 +55,7 @@ EXPORT_FUNC(grub_efi_get_memory_map) (grub_efi_uintn_t *memory_map_size,
grub_efi_uintn_t *map_key,
grub_efi_uintn_t *descriptor_size,
grub_efi_uint32_t *descriptor_version);
+void grub_efi_memory_fini (void);
grub_efi_loaded_image_t *EXPORT_FUNC(grub_efi_get_loaded_image) (grub_efi_handle_t image_handle);
void EXPORT_FUNC(grub_efi_print_device_path) (grub_efi_device_path_t *dp);
char *EXPORT_FUNC(grub_efi_get_filename) (grub_efi_device_path_t *dp);
--
2.12.3

View File

@ -1,11 +1,7 @@
v2: Add GRUB_FILE_TYPE_CONFIG to grub_file_open, see also upstream commit
ca0a4f689 verifiers: File type for fine-grained signature-verification controlling
Index: grub-2.04~rc1/grub-core/kern/efi/init.c
Index: grub-2.02~beta2/grub-core/kern/efi/init.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/kern/efi/init.c
+++ grub-2.04~rc1/grub-core/kern/efi/init.c
--- grub-2.02~beta2.orig/grub-core/kern/efi/init.c
+++ grub-2.02~beta2/grub-core/kern/efi/init.c
@@ -25,6 +25,7 @@
#include <grub/env.h>
#include <grub/mm.h>
@ -36,7 +32,7 @@ Index: grub-2.04~rc1/grub-core/kern/efi/init.c
+ goto quit;
+
+ config = grub_xasprintf ("(%s)%s/grub.cfg", device, path);
+ config_fd = grub_file_open (config, GRUB_FILE_TYPE_CONFIG);
+ config_fd = grub_file_open (config);
+
+ /* everything's fine, so quit the workaround */
+ if (config_fd)
@ -57,7 +53,7 @@ Index: grub-2.04~rc1/grub-core/kern/efi/init.c
+ if (! config_upper)
+ goto quit;
+
+ config_fd = grub_file_open (config_upper, GRUB_FILE_TYPE_CONFIG);
+ config_fd = grub_file_open (config_upper);
+
+ /* if config can be found by the upper case path, return it */
+ if (config_fd)
@ -82,7 +78,7 @@ Index: grub-2.04~rc1/grub-core/kern/efi/init.c
void
grub_machine_get_bootlocation (char **device, char **path)
@@ -72,6 +134,12 @@ grub_machine_get_bootlocation (char **de
@@ -69,6 +131,12 @@ grub_machine_get_bootlocation (char **de
p = grub_strrchr (*path, '/');
if (p)
*p = '\0';

View File

@ -0,0 +1,122 @@
From dee74e9bd88aa31e38b1e77dc7845930aa1cd60f Mon Sep 17 00:00:00 2001
From: Alexander Graf <agraf@suse.de>
Subject: [PATCH v7 1/2] efi: Move grub_reboot() into kernel
The reboot function calls machine_fini() and then reboots the system.
Currently it lives in lib/ which means it gets compiled into the
reboot module which lives on the heap.
In a following patch, I want to free the heap on machine_fini()
though, so we would free the memory that the code is running in. That
obviously breaks with smarter UEFI implementations.
So this patch moves it into the core. That way we ensure that all
code running after machine_fini() in the UEFI case is running from
memory that got allocated (and gets deallocated) by the UEFI core.
Signed-off-by: Alexander Graf <agraf@suse.de>
---
v3 -> v4:
- Move grub_reboot to kern/efi/efi.c
---
grub-core/Makefile.core.def | 4 ----
grub-core/kern/efi/efi.c | 9 +++++++++
grub-core/lib/efi/reboot.c | 33 ---------------------------------
include/grub/misc.h | 3 ++-
4 files changed, 11 insertions(+), 38 deletions(-)
delete mode 100644 grub-core/lib/efi/reboot.c
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
index a65c27f7f..1cc4ce374 100644
--- a/grub-core/Makefile.core.def
+++ b/grub-core/Makefile.core.def
@@ -872,10 +872,6 @@ module = {
name = reboot;
i386 = lib/i386/reboot.c;
i386 = lib/i386/reboot_trampoline.S;
- ia64_efi = lib/efi/reboot.c;
- x86_64_efi = lib/efi/reboot.c;
- arm_efi = lib/efi/reboot.c;
- arm64_efi = lib/efi/reboot.c;
powerpc_ieee1275 = lib/ieee1275/reboot.c;
sparc64_ieee1275 = lib/ieee1275/reboot.c;
mips_arc = lib/mips/arc/reboot.c;
diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c
index d467785fc..708581fcb 100644
--- a/grub-core/kern/efi/efi.c
+++ b/grub-core/kern/efi/efi.c
@@ -155,6 +155,15 @@ grub_efi_get_loaded_image (grub_efi_handle_t image_handle)
}
void
+grub_reboot (void)
+{
+ grub_machine_fini (GRUB_LOADER_FLAG_NORETURN);
+ efi_call_4 (grub_efi_system_table->runtime_services->reset_system,
+ GRUB_EFI_RESET_COLD, GRUB_EFI_SUCCESS, 0, NULL);
+ for (;;) ;
+}
+
+void
grub_exit (void)
{
grub_machine_fini (GRUB_LOADER_FLAG_NORETURN);
diff --git a/grub-core/lib/efi/reboot.c b/grub-core/lib/efi/reboot.c
deleted file mode 100644
index 7de8bcb5d..000000000
--- a/grub-core/lib/efi/reboot.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * GRUB -- GRand Unified Bootloader
- * Copyright (C) 2011 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/>.
- */
-
-#include <grub/efi/api.h>
-#include <grub/efi/efi.h>
-#include <grub/mm.h>
-#include <grub/misc.h>
-#include <grub/kernel.h>
-#include <grub/loader.h>
-
-void
-grub_reboot (void)
-{
- grub_machine_fini (GRUB_LOADER_FLAG_NORETURN);
- efi_call_4 (grub_efi_system_table->runtime_services->reset_system,
- GRUB_EFI_RESET_COLD, GRUB_EFI_SUCCESS, 0, NULL);
- for (;;) ;
-}
diff --git a/include/grub/misc.h b/include/grub/misc.h
index 2a9f87cc2..372f009e8 100644
--- a/include/grub/misc.h
+++ b/include/grub/misc.h
@@ -396,7 +396,8 @@ grub_abs (int x)
}
/* Reboot the machine. */
-#if defined (GRUB_MACHINE_EMU) || defined (GRUB_MACHINE_QEMU_MIPS)
+#if defined (GRUB_MACHINE_EMU) || defined (GRUB_MACHINE_QEMU_MIPS) || \
+ defined (GRUB_MACHINE_EFI)
void EXPORT_FUNC(grub_reboot) (void) __attribute__ ((noreturn));
#else
void grub_reboot (void) __attribute__ ((noreturn));
--
2.12.3

View File

@ -14,16 +14,16 @@ Signed-off-by: Michael Chang <mchang@suse.com>
grub-core/loader/efi/chainloader.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
Index: grub-2.04~rc1/grub-core/loader/efi/chainloader.c
Index: grub-2.02~beta2/grub-core/loader/efi/chainloader.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/loader/efi/chainloader.c
+++ grub-2.04~rc1/grub-core/loader/efi/chainloader.c
@@ -714,12 +714,16 @@ grub_cmd_chainloader (grub_command_t cmd
--- grub-2.02~beta2.orig/grub-core/loader/efi/chainloader.c
+++ grub-2.02~beta2/grub-core/loader/efi/chainloader.c
@@ -706,12 +706,16 @@ grub_cmd_chainloader (grub_command_t cmd
*(--p16) = 0;
}
+ grub_dprintf ("chain", "cmd='%s'\n", filename);
file = grub_file_open (filename, GRUB_FILE_TYPE_EFI_CHAINLOADED_IMAGE);
file = grub_file_open (filename);
if (! file)
goto fail;

View File

@ -5,12 +5,12 @@
grub-core/osdep/unix/emuconsole.c | 5 +++--
4 files changed, 14 insertions(+), 16 deletions(-)
Index: grub-2.04~rc1/Makefile.util.def
Index: grub-2.02~rc1/Makefile.util.def
===================================================================
--- grub-2.04~rc1.orig/Makefile.util.def
+++ grub-2.04~rc1/Makefile.util.def
@@ -362,7 +362,7 @@ program = {
ldadd = grub-core/lib/gnulib/libgnu.a;
--- grub-2.02~rc1.orig/Makefile.util.def
+++ grub-2.02~rc1/Makefile.util.def
@@ -352,7 +352,7 @@ program = {
ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
cppflags = '-DGRUB_SETUP_FUNC=grub_util_bios_setup';
- emu_condition = COND_NOT_s390x;
@ -18,8 +18,8 @@ Index: grub-2.04~rc1/Makefile.util.def
};
program = {
@@ -383,7 +383,7 @@ program = {
ldadd = grub-core/lib/gnulib/libgnu.a;
@@ -373,7 +373,7 @@ program = {
ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
cppflags = '-DGRUB_SETUP_FUNC=grub_util_sparc_setup';
- emu_condition = COND_NOT_s390x;
@ -27,38 +27,38 @@ Index: grub-2.04~rc1/Makefile.util.def
};
program = {
@@ -399,7 +399,7 @@ program = {
@@ -389,7 +389,7 @@ program = {
ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a;
ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
- emu_condition = COND_NOT_s390x;
+ emu_condition = COND_NOT_emu;
};
program = {
@@ -430,7 +430,7 @@ program = {
@@ -420,7 +420,7 @@ program = {
ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a;
ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
- emu_condition = COND_NOT_s390x;
+ emu_condition = COND_NOT_emu;
};
data = {
@@ -1361,7 +1361,7 @@ program = {
@@ -1345,7 +1345,7 @@ program = {
ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a;
ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
- emu_condition = COND_NOT_s390x;
+ emu_condition = COND_NOT_emu;
};
program = {
Index: grub-2.04~rc1/grub-core/Makefile.core.def
Index: grub-2.02~rc1/grub-core/Makefile.core.def
===================================================================
--- grub-2.04~rc1.orig/grub-core/Makefile.core.def
+++ grub-2.04~rc1/grub-core/Makefile.core.def
@@ -1139,7 +1139,7 @@ module = {
--- grub-2.02~rc1.orig/grub-core/Makefile.core.def
+++ grub-2.02~rc1/grub-core/Makefile.core.def
@@ -1057,7 +1057,7 @@ module = {
module = {
name = videotest;
common = commands/videotest.c;
@ -67,7 +67,7 @@ Index: grub-2.04~rc1/grub-core/Makefile.core.def
};
module = {
@@ -1572,7 +1572,7 @@ module = {
@@ -1470,7 +1470,7 @@ module = {
common = gfxmenu/gui_progress_bar.c;
common = gfxmenu/gui_util.c;
common = gfxmenu/gui_string_util.c;
@ -76,7 +76,7 @@ Index: grub-2.04~rc1/grub-core/Makefile.core.def
};
module = {
@@ -2008,13 +2008,13 @@ module = {
@@ -1886,13 +1886,13 @@ module = {
name = gfxterm;
common = term/gfxterm.c;
enable = videomodules;
@ -92,8 +92,8 @@ Index: grub-2.04~rc1/grub-core/Makefile.core.def
};
module = {
@@ -2133,9 +2133,7 @@ module = {
enable = i386_xen_pvh;
@@ -2005,9 +2005,7 @@ module = {
enable = i386_pc;
enable = i386_efi;
enable = x86_64_efi;
- enable = emu;
@ -102,7 +102,7 @@ Index: grub-2.04~rc1/grub-core/Makefile.core.def
};
module = {
@@ -2182,7 +2180,7 @@ module = {
@@ -2054,7 +2052,7 @@ module = {
module = {
name = gfxterm_menu;
common = tests/gfxterm_menu.c;
@ -111,8 +111,8 @@ Index: grub-2.04~rc1/grub-core/Makefile.core.def
};
module = {
@@ -2334,9 +2332,7 @@ module = {
enable = i386_xen_pvh;
@@ -2205,9 +2203,7 @@ module = {
enable = i386_pc;
enable = i386_efi;
enable = x86_64_efi;
- enable = emu;
@ -121,11 +121,11 @@ Index: grub-2.04~rc1/grub-core/Makefile.core.def
};
module = {
Index: grub-2.04~rc1/configure.ac
Index: grub-2.02~rc1/configure.ac
===================================================================
--- grub-2.04~rc1.orig/configure.ac
+++ grub-2.04~rc1/configure.ac
@@ -1911,6 +1911,7 @@ AC_SUBST(BUILD_LIBM)
--- grub-2.02~rc1.orig/configure.ac
+++ grub-2.02~rc1/configure.ac
@@ -1884,6 +1884,7 @@ AC_SUBST(BUILD_LIBM)
AM_CONDITIONAL([COND_real_platform], [test x$platform != xnone])
AM_CONDITIONAL([COND_emu], [test x$platform = xemu])
@ -133,10 +133,10 @@ Index: grub-2.04~rc1/configure.ac
AM_CONDITIONAL([COND_i386_pc], [test x$target_cpu = xi386 -a x$platform = xpc])
AM_CONDITIONAL([COND_i386_efi], [test x$target_cpu = xi386 -a x$platform = xefi])
AM_CONDITIONAL([COND_ia64_efi], [test x$target_cpu = xia64 -a x$platform = xefi])
Index: grub-2.04~rc1/grub-core/osdep/unix/emuconsole.c
Index: grub-2.02~rc1/grub-core/osdep/unix/emuconsole.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/osdep/unix/emuconsole.c
+++ grub-2.04~rc1/grub-core/osdep/unix/emuconsole.c
--- grub-2.02~rc1.orig/grub-core/osdep/unix/emuconsole.c
+++ grub-2.02~rc1/grub-core/osdep/unix/emuconsole.c
@@ -50,13 +50,12 @@ static struct termios new_tty;
static int console_mode = 0;

View File

@ -0,0 +1,24 @@
From: Andrei Borzenkov <arvidjaar@gmail.com>
Fix build with flex 2.6.4+. It no more casts fprintf() call to void, resulting in
[ 108s] grub_script.yy.c: In function 'yy_fatal_error':
[ 108s] grub_script.yy.c:18:22: error: statement with no effect [-Werror=unused-value]
[ 108s]
as grub2 defines fprintf as 0. Change it to explicitly define fprintf as (void)0.
flex commit: https://github.com/westes/flex/commit/a58086a269d3d7367530c1a178644a8e5f1a374f
Index: grub-2.02/grub-core/script/yylex.l
===================================================================
--- grub-2.02.orig/grub-core/script/yylex.l
+++ grub-2.02/grub-core/script/yylex.l
@@ -91,7 +91,7 @@ typedef size_t yy_size_t;
#define stdin 0
#define stdout 0
-#define fprintf(...) 0
+#define fprintf(...) (void)0
#define exit(...) grub_fatal("fatal error in lexer")
#endif

View File

@ -0,0 +1,37 @@
From e7500166b343874447e6abf385a791998c77f4c4 Mon Sep 17 00:00:00 2001
From: Michael Chang <mchang@suse.com>
Date: Wed, 26 Sep 2012 15:55:44 +0800
Subject: [PATCH] Silence error messages when translations are unavailable
From: Colin Watson <cjwatson@ubuntu.com>
References: bnc#771393
https://savannah.gnu.org/bugs/?35880
Patch-Mainline: no
Signed-off-by: Michael Chang <mchang@suse.com>
---
grub-core/gettext/gettext.c | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)
Index: grub-2.00/grub-core/gettext/gettext.c
===================================================================
--- grub-2.00.orig/grub-core/gettext/gettext.c
+++ grub-2.00/grub-core/gettext/gettext.c
@@ -424,9 +424,13 @@ grub_gettext_init_ext (struct grub_gette
grub_free (lang);
}
- if (locale[0] == 'e' && locale[1] == 'n'
- && (locale[2] == '\0' || locale[2] == '_'))
- grub_errno = err = GRUB_ERR_NONE;
+ /* If no translations are available, fall back to untranslated text. */
+ if (err == GRUB_ERR_FILE_NOT_FOUND)
+ {
+ grub_errno = GRUB_ERR_NONE;
+ return 0;
+ }
+
return err;
}

View File

@ -0,0 +1,165 @@
Index: grub-2.02/configure.ac
===================================================================
--- grub-2.02.orig/configure.ac
+++ grub-2.02/configure.ac
@@ -50,6 +50,10 @@ AC_PREREQ(2.60)
AC_CONFIG_SRCDIR([include/grub/dl.h])
AC_CONFIG_HEADER([config-util.h])
+# Explicitly check for pkg-config early on, since otherwise conditional
+# calls are problematic.
+PKG_PROG_PKG_CONFIG
+
# Program name transformations
AC_ARG_PROGRAM
grub_TRANSFORM([grub-bios-setup])
@@ -1493,29 +1497,21 @@ if test x"$enable_grub_mkfont" = xno ; t
grub_mkfont_excuse="explicitly disabled"
fi
-if test x"$grub_mkfont_excuse" = x ; then
- # Check for freetype libraries.
- AC_CHECK_TOOLS([FREETYPE], [freetype-config])
- if test "x$FREETYPE" = x ; then
- grub_mkfont_excuse=["need freetype2 library"]
- fi
-fi
-
unset ac_cv_header_ft2build_h
if test x"$grub_mkfont_excuse" = x ; then
- # Check for freetype libraries.
- freetype_cflags=`$FREETYPE --cflags`
- freetype_libs=`$FREETYPE --libs`
- SAVED_CPPFLAGS="$CPPFLAGS"
- SAVED_LIBS="$LIBS"
- CPPFLAGS="$CPPFLAGS $freetype_cflags"
- LIBS="$LIBS $freetype_libs"
- AC_CHECK_HEADERS([ft2build.h], [],
- [grub_mkfont_excuse=["need freetype2 headers"]])
- AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_mkfont_excuse=["freetype2 library unusable"]])
- CPPFLAGS="$SAVED_CPPFLAGS"
- LIBS="$SAVED_LIBS"
+ PKG_CHECK_MODULES([FREETYPE], [freetype2], [
+ SAVED_CPPFLAGS="$CPPFLAGS"
+ SAVED_LIBS="$LIBS"
+ CPPFLAGS="$CPPFLAGS $FREETYPE_CFLAGS"
+ LIBS="$LIBS $FREETYPE_LIBS"
+ AC_CHECK_HEADERS([ft2build.h], [],
+ [grub_mkfont_excuse=["need freetype2 headers"]])
+ AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [],
+ [grub_mkfont_excuse=["freetype2 library unusable"]])
+ CPPFLAGS="$SAVED_CPPFLAGS"
+ LIBS="$SAVED_LIBS"
+ ], [grub_mkfont_excuse=["need freetype2 library"]])
fi
if test x"$enable_grub_mkfont" = xyes && test x"$grub_mkfont_excuse" != x ; then
@@ -1527,8 +1523,6 @@ else
enable_grub_mkfont=no
fi
AC_SUBST([enable_grub_mkfont])
-AC_SUBST([freetype_cflags])
-AC_SUBST([freetype_libs])
SAVED_CC="$CC"
SAVED_CPP="$CPP"
@@ -1558,25 +1552,21 @@ AC_SUBST([BUILD_WORDS_BIGENDIAN])
if test x"$grub_build_mkfont_excuse" = x ; then
# Check for freetype libraries.
- AC_CHECK_PROGS([BUILD_FREETYPE], [freetype-config])
- if test "x$BUILD_FREETYPE" = x ; then
- grub_build_mkfont_excuse=["need freetype2 library"]
- fi
-fi
-
-if test x"$grub_build_mkfont_excuse" = x ; then
- # Check for freetype libraries.
- build_freetype_cflags=`$BUILD_FREETYPE --cflags`
- build_freetype_libs=`$BUILD_FREETYPE --libs`
- SAVED_CPPFLAGS_2="$CPPFLAGS"
- SAVED_LIBS="$LIBS"
- CPPFLAGS="$CPPFLAGS $build_freetype_cflags"
- LIBS="$LIBS $build_freetype_libs"
- AC_CHECK_HEADERS([ft2build.h], [],
- [grub_build_mkfont_excuse=["need freetype2 headers"]])
- AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_build_mkfont_excuse=["freetype2 library unusable"]])
- LIBS="$SAVED_LIBS"
- CPPFLAGS="$SAVED_CPPFLAGS_2"
+ SAVED_PKG_CONFIG="$PKG_CONFIG"
+ test -z "$BUILD_PKG_CONFIG" || PKG_CONFIG="$BUILD_PKG_CONFIG"
+ PKG_CHECK_MODULES([BUILD_FREETYPE], [freetype2], [
+ SAVED_CPPFLAGS_2="$CPPFLAGS"
+ SAVED_LIBS="$LIBS"
+ CPPFLAGS="$CPPFLAGS $BUILD_FREETYPE_CFLAGS"
+ LIBS="$LIBS $BUILD_FREETYPE_LIBS"
+ AC_CHECK_HEADERS([ft2build.h], [],
+ [grub_build_mkfont_excuse=["need freetype2 headers"]])
+ AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [],
+ [grub_build_mkfont_excuse=["freetype2 library unusable"]])
+ LIBS="$SAVED_LIBS"
+ CPPFLAGS="$SAVED_CPPFLAGS_2"
+ ], [grub_build_mkfont_excuse=["need freetype2 library"]])
+ PKG_CONFIG="$SAVED_PKG_CONFIG"
fi
if test x"$enable_build_grub_mkfont" = xyes && test x"$grub_build_mkfont_excuse" != x ; then
@@ -1595,9 +1585,6 @@ if test x"$enable_build_grub_mkfont" = x
fi
fi
-AC_SUBST([build_freetype_cflags])
-AC_SUBST([build_freetype_libs])
-
CC="$SAVED_CC"
CPP="$SAVED_CPP"
CFLAGS="$SAVED_CFLAGS"
Index: grub-2.02/Makefile.am
===================================================================
--- grub-2.02.orig/Makefile.am
+++ grub-2.02/Makefile.am
@@ -71,7 +71,7 @@ endif
starfield_theme_files = $(srcdir)/themes/starfield/blob_w.png $(srcdir)/themes/starfield/boot_menu_c.png $(srcdir)/themes/starfield/boot_menu_e.png $(srcdir)/themes/starfield/boot_menu_ne.png $(srcdir)/themes/starfield/boot_menu_n.png $(srcdir)/themes/starfield/boot_menu_nw.png $(srcdir)/themes/starfield/boot_menu_se.png $(srcdir)/themes/starfield/boot_menu_s.png $(srcdir)/themes/starfield/boot_menu_sw.png $(srcdir)/themes/starfield/boot_menu_w.png $(srcdir)/themes/starfield/slider_c.png $(srcdir)/themes/starfield/slider_n.png $(srcdir)/themes/starfield/slider_s.png $(srcdir)/themes/starfield/starfield.png $(srcdir)/themes/starfield/terminal_box_c.png $(srcdir)/themes/starfield/terminal_box_e.png $(srcdir)/themes/starfield/terminal_box_ne.png $(srcdir)/themes/starfield/terminal_box_n.png $(srcdir)/themes/starfield/terminal_box_nw.png $(srcdir)/themes/starfield/terminal_box_se.png $(srcdir)/themes/starfield/terminal_box_s.png $(srcdir)/themes/starfield/terminal_box_sw.png $(srcdir)/themes/starfield/terminal_box_w.png $(srcdir)/themes/starfield/theme.txt $(srcdir)/themes/starfield/README $(srcdir)/themes/starfield/COPYING.CC-BY-SA-3.0
build-grub-mkfont$(BUILD_EXEEXT): util/grub-mkfont.c grub-core/unidata.c grub-core/kern/emu/misc.c util/misc.c
- $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-mkfont\" $^ $(build_freetype_cflags) $(build_freetype_libs)
+ $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-mkfont\" $^ $(BUILD_FREETYPE_CFLAGS) $(BUILD_FREETYPE_LIBS)
CLEANFILES += build-grub-mkfont$(BUILD_EXEEXT)
garbage-gen$(BUILD_EXEEXT): util/garbage-gen.c
@@ -80,11 +80,11 @@ CLEANFILES += garbage-gen$(BUILD_EXEEXT)
EXTRA_DIST += util/garbage-gen.c
build-grub-gen-asciih$(BUILD_EXEEXT): util/grub-gen-asciih.c
- $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(build_freetype_cflags) $(build_freetype_libs) -Wall -Werror
+ $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(BUILD_FREETYPE_CFLAGS) $(BUILD_FREETYPE_LIBS) -Wall -Werror
CLEANFILES += build-grub-gen-asciih$(BUILD_EXEEXT)
build-grub-gen-widthspec$(BUILD_EXEEXT): util/grub-gen-widthspec.c
- $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(build_freetype_cflags) $(build_freetype_libs) -Wall -Werror
+ $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(BUILD_FREETYPE_CFLAGS) $(BUILD_FREETYPE_LIBS) -Wall -Werror
CLEANFILES += build-grub-gen-widthspec$(BUILD_EXEEXT)
if COND_STARFIELD
Index: grub-2.02/Makefile.util.def
===================================================================
--- grub-2.02.orig/Makefile.util.def
+++ grub-2.02/Makefile.util.def
@@ -302,14 +302,14 @@ program = {
common = grub-core/kern/emu/argp_common.c;
common = grub-core/osdep/init.c;
- cflags = '$(freetype_cflags)';
+ cflags = '$(FREETYPE_CFLAGS)';
cppflags = '-DGRUB_MKFONT=1';
ldadd = libgrubmods.a;
ldadd = libgrubgcry.a;
ldadd = libgrubkern.a;
ldadd = grub-core/gnulib/libgnu.a;
- ldadd = '$(freetype_libs)';
+ ldadd = '$(FREETYPE_LIBS)';
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
condition = COND_GRUB_MKFONT;
};

View File

@ -1,7 +1,7 @@
Index: grub-2.04rc1/util/grub.d/10_linux.in
Index: grub-2.02~beta2/util/grub.d/10_linux.in
===================================================================
--- grub-2.04rc1.orig/util/grub.d/10_linux.in
+++ grub-2.04rc1/util/grub.d/10_linux.in
--- grub-2.02~beta2.orig/util/grub.d/10_linux.in
+++ grub-2.02~beta2/util/grub.d/10_linux.in
@@ -31,7 +31,7 @@ CLASS="--class gnu-linux --class gnu --c
if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
OS=GNU/Linux
@ -11,7 +11,7 @@ Index: grub-2.04rc1/util/grub.d/10_linux.in
CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}"
fi
@@ -141,7 +141,7 @@ linux_entry ()
@@ -129,7 +129,7 @@ linux_entry ()
message="$(gettext_printf "Loading Linux %s ..." ${version})"
sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$message" | grub_quote)'
@ -20,10 +20,10 @@ Index: grub-2.04rc1/util/grub.d/10_linux.in
EOF
if test -n "${initrd}" ; then
# TRANSLATORS: ramdisk isn't identifier. Should be translated.
Index: grub-2.04rc1/util/grub.d/20_linux_xen.in
Index: grub-2.02~beta2/util/grub.d/20_linux_xen.in
===================================================================
--- grub-2.04rc1.orig/util/grub.d/20_linux_xen.in
+++ grub-2.04rc1/util/grub.d/20_linux_xen.in
--- grub-2.02~beta2.orig/util/grub.d/20_linux_xen.in
+++ grub-2.02~beta2/util/grub.d/20_linux_xen.in
@@ -31,7 +31,7 @@ CLASS="--class gnu-linux --class gnu --c
if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
OS=GNU/Linux
@ -33,12 +33,12 @@ Index: grub-2.04rc1/util/grub.d/20_linux_xen.in
CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}"
fi
@@ -134,7 +134,7 @@ linux_entry ()
@@ -122,7 +122,7 @@ linux_entry ()
fi
${xen_loader} ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts}
multiboot ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts}
echo '$(echo "$lmessage" | grub_quote)'
- ${module_loader} ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ro ${args}
+ ${module_loader} ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ${args}
- module ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ro ${args}
+ module ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ${args}
EOF
if test -n "${initrd}" ; then
# TRANSLATORS: ramdisk isn't identifier. Should be translated.

View File

@ -0,0 +1,33 @@
diff -pruN grub-2.02.orig/grub-core/loader/arm/linux.c grub-2.02/grub-core/loader/arm/linux.c
--- grub-2.02.orig/grub-core/loader/arm/linux.c 2016-02-22 20:04:35.000000000 +0100
+++ grub-2.02/grub-core/loader/arm/linux.c 2019-01-28 15:08:48.814415179 +0100
@@ -50,7 +50,7 @@ typedef void (*kernel_entry_t) (int, uns
#define LINUX_ZIMAGE_MAGIC 0x016f2818
#define LINUX_PHYS_OFFSET (0x00008000)
-#define LINUX_INITRD_PHYS_OFFSET (LINUX_PHYS_OFFSET + 0x02000000)
+#define LINUX_INITRD_PHYS_OFFSET (LINUX_PHYS_OFFSET + 0x03000000)
#define LINUX_FDT_PHYS_OFFSET (LINUX_INITRD_PHYS_OFFSET - 0x10000)
static grub_size_t
diff -pruN grub-2.02.orig/include/grub/arm/linux.h grub-2.02/include/grub/arm/linux.h
--- grub-2.02.orig/include/grub/arm/linux.h 2017-04-24 11:15:49.000000000 +0200
+++ grub-2.02/include/grub/arm/linux.h 2019-01-28 15:08:31.122275854 +0100
@@ -28,7 +28,7 @@
#if defined GRUB_MACHINE_UBOOT
# include <grub/uboot/uboot.h>
# define LINUX_ADDRESS (start_of_ram + 0x8000)
-# define LINUX_INITRD_ADDRESS (start_of_ram + 0x02000000)
+# define LINUX_INITRD_ADDRESS (start_of_ram + 0x03000000)
# define LINUX_FDT_ADDRESS (LINUX_INITRD_ADDRESS - 0x10000)
# define grub_arm_firmware_get_boot_data grub_uboot_get_boot_data
# define grub_arm_firmware_get_machine_type grub_uboot_get_machine_type
@@ -38,7 +38,7 @@
/* On UEFI platforms - load the images at the lowest available address not
less than *_PHYS_OFFSET from the first available memory location. */
# define LINUX_PHYS_OFFSET (0x00008000)
-# define LINUX_INITRD_PHYS_OFFSET (LINUX_PHYS_OFFSET + 0x02000000)
+# define LINUX_INITRD_PHYS_OFFSET (LINUX_PHYS_OFFSET + 0x03000000)
# define LINUX_FDT_PHYS_OFFSET (LINUX_INITRD_PHYS_OFFSET - 0x10000)
# define grub_arm_firmware_get_boot_data (grub_addr_t)grub_efi_get_firmware_fdt
static inline grub_uint32_t

View File

@ -0,0 +1,46 @@
Index: grub-2.02/grub-core/partmap/msdos.c
===================================================================
--- grub-2.02.orig/grub-core/partmap/msdos.c
+++ grub-2.02/grub-core/partmap/msdos.c
@@ -175,9 +175,9 @@ grub_partition_msdos_iterate (grub_disk_
e = mbr.entries + p.index;
p.start = p.offset
- + (grub_le_to_cpu32 (e->start)
+ + ((grub_disk_addr_t)grub_le_to_cpu32 (e->start)
<< (disk->log_sector_size - GRUB_DISK_SECTOR_BITS)) - delta;
- p.len = grub_le_to_cpu32 (e->length)
+ p.len = (grub_uint64_t)grub_le_to_cpu32 (e->length)
<< (disk->log_sector_size - GRUB_DISK_SECTOR_BITS);
p.msdostype = e->type;
@@ -217,7 +217,7 @@ grub_partition_msdos_iterate (grub_disk_
if (grub_msdos_partition_is_extended (e->type))
{
p.offset = ext_offset
- + (grub_le_to_cpu32 (e->start)
+ + ((grub_disk_addr_t)grub_le_to_cpu32 (e->start)
<< (disk->log_sector_size - GRUB_DISK_SECTOR_BITS));
if (! ext_offset)
ext_offset = p.offset;
@@ -301,9 +301,9 @@ pc_partition_map_embed (struct grub_disk
if (!grub_msdos_partition_is_empty (e->type)
&& end > offset
- + (grub_le_to_cpu32 (e->start)
+ + ((grub_disk_addr_t)grub_le_to_cpu32 (e->start)
<< (disk->log_sector_size - GRUB_DISK_SECTOR_BITS)))
- end = offset + (grub_le_to_cpu32 (e->start)
+ end = offset + ((grub_disk_addr_t)grub_le_to_cpu32 (e->start)
<< (disk->log_sector_size - GRUB_DISK_SECTOR_BITS));
/* If this is a GPT partition, this MBR is just a dummy. */
@@ -319,7 +319,7 @@ pc_partition_map_embed (struct grub_disk
if (grub_msdos_partition_is_extended (e->type))
{
offset = ext_offset
- + (grub_le_to_cpu32 (e->start)
+ + ((grub_disk_addr_t)grub_le_to_cpu32 (e->start)
<< (disk->log_sector_size - GRUB_DISK_SECTOR_BITS));
if (! ext_offset)
ext_offset = offset;

View File

@ -18,18 +18,17 @@ v2: Filter out autofs and securityfs from /proc/self/mountinfo (bsc#1069094)
util/grub-mkconfig.in | 37 ++++++++++++++++++++++++++++++-------
1 files changed, 30 insertions(+), 7 deletions(-)
Index: grub-2.04~rc1/util/grub-mkconfig.in
Index: grub-2.02/util/grub-mkconfig.in
===================================================================
--- grub-2.04~rc1.orig/util/grub-mkconfig.in
+++ grub-2.04~rc1/util/grub-mkconfig.in
@@ -131,23 +131,51 @@ else
--- grub-2.02.orig/util/grub-mkconfig.in
+++ grub-2.02/util/grub-mkconfig.in
@@ -131,22 +131,47 @@ else
exit 1
fi
-# Device containing our userland. Typically used for root= parameter.
-GRUB_DEVICE="`${grub_probe} --target=device /`"
-GRUB_DEVICE_UUID="`${grub_probe} --device ${GRUB_DEVICE} --target=fs_uuid 2> /dev/null`" || true
-GRUB_DEVICE_PARTUUID="`${grub_probe} --device ${GRUB_DEVICE} --target=partuuid 2> /dev/null`" || true
+probe_nfsroot_device () {
+ while read line ; do
+ part1=`echo $line | sed -e 's! - .*$!!'`
@ -55,24 +54,23 @@ Index: grub-2.04~rc1/util/grub-mkconfig.in
+
+NFSROOT_DEVICE="`awk '($9!="autofs")&&($9!="securityfs")' /proc/self/mountinfo | probe_nfsroot_device`"
# Filesystem for the device containing our userland. Used for stuff like
# choosing Hurd filesystem module.
GRUB_FS="`${grub_probe} --device ${GRUB_DEVICE} --target=fs 2> /dev/null || echo unknown`"
-# Filesystem for the device containing our userland. Used for stuff like
-# choosing Hurd filesystem module.
-GRUB_FS="`${grub_probe} --device ${GRUB_DEVICE} --target=fs 2> /dev/null || echo unknown`"
+if [ "x${NFSROOT_DEVICE}" != "x" ]; then
+ GRUB_DEVICE=""
+ GRUB_DEVICE_UUID=""
+ GRUB_DEVICE_PARTUUID=""
+ GRUB_FS="unknown"
+else
+ # Device containing our userland. Typically used for root= parameter.
+ GRUB_DEVICE="`${grub_probe} --target=device /`"
+ GRUB_DEVICE_UUID="`${grub_probe} --device ${GRUB_DEVICE} --target=fs_uuid 2> /dev/null`" || true
+ GRUB_DEVICE_PARTUUID="`${grub_probe} --device ${GRUB_DEVICE} --target=partuuid 2> /dev/null`" || true
-if [ x"$GRUB_FS" = xunknown ]; then
- GRUB_FS="$(stat -f -c %T / || echo unknown)"
- GRUB_FS="$(stat -f --printf=%T / || echo unknown)"
+
+ if [ x"$GRUB_FS" = x ] || [ x"$GRUB_FS" = xunknown ]; then
+ GRUB_FS="$(stat -f -c %T / || echo unknown)"
+ GRUB_FS="$(stat -f --printf=%T / || echo unknown)"
+ fi
fi
@ -80,14 +78,14 @@ Index: grub-2.04~rc1/util/grub-mkconfig.in
+GRUB_DEVICE_BOOT="`${grub_probe} --target=device /boot`"
+GRUB_DEVICE_BOOT_UUID="`${grub_probe} --device ${GRUB_DEVICE_BOOT} --target=fs_uuid 2> /dev/null`" || true
+
# Provide a default set of stock linux early initrd images.
# Define here so the list can be modified in the sourced config file.
if [ "x${GRUB_EARLY_INITRD_LINUX_STOCK}" = "x" ]; then
Index: grub-2.04~rc1/util/grub.d/10_linux.in
if test -f ${sysconfdir}/default/grub ; then
. ${sysconfdir}/default/grub
fi
Index: grub-2.02/util/grub.d/10_linux.in
===================================================================
--- grub-2.04~rc1.orig/util/grub.d/10_linux.in
+++ grub-2.04~rc1/util/grub.d/10_linux.in
@@ -86,6 +86,12 @@ linux_entry ()
--- grub-2.02.orig/util/grub.d/10_linux.in
+++ grub-2.02/util/grub.d/10_linux.in
@@ -76,6 +76,12 @@ linux_entry ()
type="$3"
args="$4"
@ -100,7 +98,7 @@ Index: grub-2.04~rc1/util/grub.d/10_linux.in
if [ -z "$boot_device_id" ]; then
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
fi
@@ -141,7 +147,7 @@ linux_entry ()
@@ -131,7 +137,7 @@ linux_entry ()
message="$(gettext_printf "Loading Linux %s ..." ${version})"
sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$message" | grub_quote)'
@ -109,11 +107,11 @@ Index: grub-2.04~rc1/util/grub.d/10_linux.in
EOF
if test -n "${initrd}" ; then
# TRANSLATORS: ramdisk isn't identifier. Should be translated.
Index: grub-2.04~rc1/util/grub.d/20_linux_xen.in
Index: grub-2.02/util/grub.d/20_linux_xen.in
===================================================================
--- grub-2.04~rc1.orig/util/grub.d/20_linux_xen.in
+++ grub-2.04~rc1/util/grub.d/20_linux_xen.in
@@ -101,6 +101,11 @@ linux_entry ()
--- grub-2.02.orig/util/grub.d/20_linux_xen.in
+++ grub-2.02/util/grub.d/20_linux_xen.in
@@ -91,6 +91,11 @@ linux_entry ()
type="$4"
args="$5"
xen_args="$6"
@ -125,12 +123,12 @@ Index: grub-2.04~rc1/util/grub.d/20_linux_xen.in
if [ -z "$boot_device_id" ]; then
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
fi
@@ -140,7 +145,7 @@ linux_entry ()
@@ -130,7 +135,7 @@ linux_entry ()
fi
${xen_loader} ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts}
multiboot ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts}
echo '$(echo "$lmessage" | grub_quote)'
- ${module_loader} ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ${args}
+ ${module_loader} ${rel_dirname}/${basename} placeholder ${root_device} ${args}
- module ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ${args}
+ module ${rel_dirname}/${basename} placeholder ${root_device} ${args}
EOF
if test -n "${initrd}" ; then
# TRANSLATORS: ramdisk isn't identifier. Should be translated.

View File

@ -1,8 +1,8 @@
Index: grub-2.04~rc1/grub-core/kern/ieee1275/openfw.c
Index: grub-2.02/grub-core/kern/ieee1275/openfw.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/kern/ieee1275/openfw.c
+++ grub-2.04~rc1/grub-core/kern/ieee1275/openfw.c
@@ -595,7 +595,7 @@ grub_ieee1275_canonicalise_devname (cons
--- grub-2.02.orig/grub-core/kern/ieee1275/openfw.c
+++ grub-2.02/grub-core/kern/ieee1275/openfw.c
@@ -592,7 +592,7 @@ grub_ieee1275_canonicalise_devname (cons
/* Check if it's a CAS reboot. If so, set the script to be executed. */
int
@ -11,7 +11,7 @@ Index: grub-2.04~rc1/grub-core/kern/ieee1275/openfw.c
{
grub_uint32_t ibm_ca_support_reboot;
grub_uint32_t ibm_fw_nbr_reboots;
@@ -628,16 +628,37 @@ grub_ieee1275_cas_reboot (char *script)
@@ -625,16 +625,37 @@ grub_ieee1275_cas_reboot (char *script)
if (ibm_ca_support_reboot || ibm_fw_nbr_reboots)
{
@ -57,7 +57,7 @@ Index: grub-2.04~rc1/grub-core/kern/ieee1275/openfw.c
grub_ieee1275_set_boot_last_label ("");
return -1;
@@ -651,8 +672,9 @@ int grub_ieee1275_set_boot_last_label (c
@@ -648,7 +669,8 @@ int grub_ieee1275_set_boot_last_label (c
grub_dprintf("ieee1275", "set boot_last_label (size: %" PRIxGRUB_SIZE ")\n", grub_strlen(text));
if (! grub_ieee1275_finddevice ("/options", &options) &&
options != (grub_ieee1275_ihandle_t) -1)
@ -67,11 +67,10 @@ Index: grub-2.04~rc1/grub-core/kern/ieee1275/openfw.c
+ grub_strlen (text) + 1, &actual);
return 0;
}
Index: grub-2.04~rc1/grub-core/normal/main.c
Index: grub-2.02/grub-core/normal/main.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/normal/main.c
+++ grub-2.04~rc1/grub-core/normal/main.c
--- grub-2.02.orig/grub-core/normal/main.c
+++ grub-2.02/grub-core/normal/main.c
@@ -281,10 +281,9 @@ grub_normal_execute (const char *config,
#ifdef GRUB_MACHINE_IEEE1275
int boot;
@ -85,11 +84,11 @@ Index: grub-2.04~rc1/grub-core/normal/main.c
{
if (! grub_script_execute_new_scope (script, 0, dummy))
boot = 1;
Index: grub-2.04~rc1/include/grub/ieee1275/ieee1275.h
Index: grub-2.02/include/grub/ieee1275/ieee1275.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/ieee1275/ieee1275.h
+++ grub-2.04~rc1/include/grub/ieee1275/ieee1275.h
@@ -263,7 +263,7 @@ int EXPORT_FUNC(grub_ieee1275_devalias_n
--- grub-2.02.orig/include/grub/ieee1275/ieee1275.h
+++ grub-2.02/include/grub/ieee1275/ieee1275.h
@@ -243,7 +243,7 @@ int EXPORT_FUNC(grub_ieee1275_devalias_n
void EXPORT_FUNC(grub_ieee1275_children_peer) (struct grub_ieee1275_devalias *alias);
void EXPORT_FUNC(grub_ieee1275_children_first) (const char *devpath,
struct grub_ieee1275_devalias *alias);
@ -97,4 +96,4 @@ Index: grub-2.04~rc1/include/grub/ieee1275/ieee1275.h
+int EXPORT_FUNC(grub_ieee1275_cas_reboot) (char **script);
int EXPORT_FUNC(grub_ieee1275_set_boot_last_label) (const char *text);
char *EXPORT_FUNC(grub_ieee1275_get_boot_dev) (void);
#define FOR_IEEE1275_DEVALIASES(alias) for (grub_ieee1275_devalias_init_iterator (&(alias)); grub_ieee1275_devalias_next (&(alias));)

View File

@ -24,11 +24,11 @@ parameters
include/grub/ieee1275/ieee1275.h | 2 ++
4 files changed, 90 insertions(+)
Index: grub-2.04~rc1/grub-core/kern/ieee1275/openfw.c
Index: grub-2.02~beta2/grub-core/kern/ieee1275/openfw.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/kern/ieee1275/openfw.c
+++ grub-2.04~rc1/grub-core/kern/ieee1275/openfw.c
@@ -593,6 +593,69 @@ grub_ieee1275_canonicalise_devname (cons
--- grub-2.02~beta2.orig/grub-core/kern/ieee1275/openfw.c 2016-01-29 23:08:47.560532720 +0300
+++ grub-2.02~beta2/grub-core/kern/ieee1275/openfw.c 2016-01-29 23:08:47.556532720 +0300
@@ -590,3 +590,65 @@
return NULL;
}
@ -94,14 +94,10 @@ Index: grub-2.04~rc1/grub-core/kern/ieee1275/openfw.c
+ grub_strlen (text), &actual);
+ return 0;
+}
+
char *
grub_ieee1275_get_boot_dev (void)
{
Index: grub-2.04~rc1/grub-core/normal/main.c
Index: grub-2.02~beta2/grub-core/normal/main.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/normal/main.c
+++ grub-2.04~rc1/grub-core/normal/main.c
--- grub-2.02~beta2.orig/grub-core/normal/main.c 2016-01-29 23:08:47.560532720 +0300
+++ grub-2.02~beta2/grub-core/normal/main.c 2016-01-29 23:09:59.812533575 +0300
@@ -33,6 +33,9 @@
#include <grub/charset.h>
#include <grub/script_sh.h>
@ -112,7 +108,7 @@ Index: grub-2.04~rc1/grub-core/normal/main.c
GRUB_MOD_LICENSE ("GPLv3+");
@@ -275,6 +278,21 @@ grub_normal_execute (const char *config,
@@ -275,6 +278,21 @@
{
menu = read_config_file (config);
@ -134,21 +130,21 @@ Index: grub-2.04~rc1/grub-core/normal/main.c
/* Ignore any error. */
grub_errno = GRUB_ERR_NONE;
}
Index: grub-2.04~rc1/grub-core/script/execute.c
Index: grub-2.02~beta2/grub-core/script/execute.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/script/execute.c
+++ grub-2.04~rc1/grub-core/script/execute.c
@@ -28,6 +28,9 @@
--- grub-2.02~beta2.orig/grub-core/script/execute.c 2016-01-29 23:08:47.560532720 +0300
+++ grub-2.02~beta2/grub-core/script/execute.c 2016-01-29 23:08:47.560532720 +0300
@@ -27,6 +27,9 @@
#include <grub/normal.h>
#include <grub/extcmd.h>
#include <grub/i18n.h>
#include <grub/verify.h>
+#ifdef GRUB_MACHINE_IEEE1275
+#include <grub/ieee1275/ieee1275.h>
+#endif
/* Max digits for a char is 3 (0xFF is 255), similarly for an int it
is sizeof (int) * 3, and one extra for a possible -ve sign. */
@@ -878,6 +881,10 @@ grub_script_execute_sourcecode (const ch
@@ -877,6 +880,10 @@
grub_err_t ret = 0;
struct grub_script *parsed_script;
@ -159,16 +155,16 @@ Index: grub-2.04~rc1/grub-core/script/execute.c
while (source)
{
char *line;
Index: grub-2.04~rc1/include/grub/ieee1275/ieee1275.h
Index: grub-2.02~beta2/include/grub/ieee1275/ieee1275.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/ieee1275/ieee1275.h
+++ grub-2.04~rc1/include/grub/ieee1275/ieee1275.h
@@ -263,6 +263,8 @@ int EXPORT_FUNC(grub_ieee1275_devalias_n
--- grub-2.02~beta2.orig/include/grub/ieee1275/ieee1275.h 2016-01-29 23:08:47.560532720 +0300
+++ grub-2.02~beta2/include/grub/ieee1275/ieee1275.h 2016-01-29 23:08:47.560532720 +0300
@@ -242,6 +242,8 @@
void EXPORT_FUNC(grub_ieee1275_children_peer) (struct grub_ieee1275_devalias *alias);
void EXPORT_FUNC(grub_ieee1275_children_first) (const char *devpath,
struct grub_ieee1275_devalias *alias);
+int EXPORT_FUNC(grub_ieee1275_cas_reboot) (char *script);
+int EXPORT_FUNC(grub_ieee1275_set_boot_last_label) (const char *text);
char *EXPORT_FUNC(grub_ieee1275_get_boot_dev) (void);
#define FOR_IEEE1275_DEVALIASES(alias) for (grub_ieee1275_devalias_init_iterator (&(alias)); grub_ieee1275_devalias_next (&(alias));)

View File

@ -1,7 +1,7 @@
Index: grub-2.04~rc1/grub-core/kern/ieee1275/cmain.c
Index: grub-2.02~beta2/grub-core/kern/ieee1275/cmain.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/kern/ieee1275/cmain.c
+++ grub-2.04~rc1/grub-core/kern/ieee1275/cmain.c
--- grub-2.02~beta2.orig/grub-core/kern/ieee1275/cmain.c
+++ grub-2.02~beta2/grub-core/kern/ieee1275/cmain.c
@@ -90,7 +90,10 @@ grub_ieee1275_find_options (void)
}
@ -14,11 +14,11 @@ Index: grub-2.04~rc1/grub-core/kern/ieee1275/cmain.c
/* Old Macs have no key repeat, newer ones have fully working one.
The ones inbetween when repeated key generates an escaoe sequence
Index: grub-2.04~rc1/grub-core/video/ieee1275.c
Index: grub-2.02~beta2/grub-core/video/ieee1275.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/video/ieee1275.c
+++ grub-2.04~rc1/grub-core/video/ieee1275.c
@@ -352,9 +352,12 @@ static struct grub_video_adapter grub_vi
--- grub-2.02~beta2.orig/grub-core/video/ieee1275.c
+++ grub-2.02~beta2/grub-core/video/ieee1275.c
@@ -351,9 +351,12 @@ static struct grub_video_adapter grub_vi
GRUB_MOD_INIT(ieee1275_fb)
{
@ -34,14 +34,14 @@ Index: grub-2.04~rc1/grub-core/video/ieee1275.c
}
GRUB_MOD_FINI(ieee1275_fb)
Index: grub-2.04~rc1/include/grub/ieee1275/ieee1275.h
Index: grub-2.02~beta2/include/grub/ieee1275/ieee1275.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/ieee1275/ieee1275.h
+++ grub-2.04~rc1/include/grub/ieee1275/ieee1275.h
@@ -148,6 +148,8 @@ enum grub_ieee1275_flag
GRUB_IEEE1275_FLAG_CURSORONOFF_ANSI_BROKEN,
--- grub-2.02~beta2.orig/include/grub/ieee1275/ieee1275.h
+++ grub-2.02~beta2/include/grub/ieee1275/ieee1275.h
@@ -145,6 +145,8 @@ enum grub_ieee1275_flag
GRUB_IEEE1275_FLAG_BROKEN_REPEAT,
GRUB_IEEE1275_FLAG_RAW_DEVNAMES,
GRUB_IEEE1275_FLAG_CURSORONOFF_ANSI_BROKEN,
+
+ GRUB_IEEE1275_FLAG_DISABLE_VIDEO_SUPPORT
};

View File

@ -1,7 +1,7 @@
Index: grub-2.04~rc1/grub-core/kern/ieee1275/openfw.c
Index: grub-2.02~beta2/grub-core/kern/ieee1275/openfw.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/kern/ieee1275/openfw.c
+++ grub-2.04~rc1/grub-core/kern/ieee1275/openfw.c
--- grub-2.02~beta2.orig/grub-core/kern/ieee1275/openfw.c
+++ grub-2.02~beta2/grub-core/kern/ieee1275/openfw.c
@@ -302,6 +302,34 @@ grub_ieee1275_map (grub_addr_t phys, gru
return args.catch_result;
}
@ -45,10 +45,10 @@ Index: grub-2.04~rc1/grub-core/kern/ieee1275/openfw.c
return GRUB_ERR_NONE;
}
Index: grub-2.04~rc1/include/grub/ieee1275/ieee1275.h
Index: grub-2.02~beta2/include/grub/ieee1275/ieee1275.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/ieee1275/ieee1275.h
+++ grub-2.04~rc1/include/grub/ieee1275/ieee1275.h
--- grub-2.02~beta2.orig/include/grub/ieee1275/ieee1275.h
+++ grub-2.02~beta2/include/grub/ieee1275/ieee1275.h
@@ -30,6 +30,12 @@ struct grub_ieee1275_mem_region
unsigned int size;
};
@ -62,19 +62,19 @@ Index: grub-2.04~rc1/include/grub/ieee1275/ieee1275.h
#define IEEE1275_MAX_PROP_LEN 8192
#define IEEE1275_MAX_PATH_LEN 256
@@ -235,6 +241,7 @@ char *EXPORT_FUNC(grub_ieee1275_encode_u
int EXPORT_FUNC(grub_ieee1275_get_block_size) (grub_ieee1275_ihandle_t ihandle);
@@ -214,6 +220,7 @@ int EXPORT_FUNC(grub_ieee1275_millisecon
grub_err_t EXPORT_FUNC(grub_claimmap) (grub_addr_t addr, grub_size_t size);
+void EXPORT_FUNC(grub_releasemap) (void);
int
EXPORT_FUNC(grub_ieee1275_map) (grub_addr_t phys, grub_addr_t virt,
Index: grub-2.04~rc1/grub-core/kern/ieee1275/init.c
Index: grub-2.02~beta2/grub-core/kern/ieee1275/init.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/kern/ieee1275/init.c
+++ grub-2.04~rc1/grub-core/kern/ieee1275/init.c
@@ -73,6 +73,7 @@ grub_addr_t grub_ieee1275_original_stack
--- grub-2.02~beta2.orig/grub-core/kern/ieee1275/init.c
+++ grub-2.02~beta2/grub-core/kern/ieee1275/init.c
@@ -62,6 +62,7 @@ grub_addr_t grub_ieee1275_original_stack
void
grub_exit (void)
{

View File

@ -21,41 +21,41 @@ Subject: [PATCH 1/3] - Changes made and files added in order to allow s390x
create mode 100644 include/grub/s390x/time.h
create mode 100644 include/grub/s390x/types.h
Index: grub-2.04~rc1/grub-core/kern/emu/cache_s.S
Index: grub-2.02~beta2/grub-core/kern/emu/cache_s.S
===================================================================
--- grub-2.04~rc1.orig/grub-core/kern/emu/cache_s.S
+++ grub-2.04~rc1/grub-core/kern/emu/cache_s.S
@@ -10,6 +10,7 @@
--- grub-2.02~beta2.orig/grub-core/kern/emu/cache_s.S
+++ grub-2.02~beta2/grub-core/kern/emu/cache_s.S
@@ -9,6 +9,7 @@
#elif defined(__powerpc__)
#include "../powerpc/cache.S"
#elif defined(__ia64__) || defined(__arm__) || defined(__aarch64__) || \
defined(__mips__) || defined(__riscv)
#elif defined(__ia64__) || defined(__arm__) || defined(__aarch64__) || defined(__mips__)
+#elif defined(__s390x__)
#else
#error "No target cpu type is defined"
#endif
Index: grub-2.04~rc1/grub-core/kern/emu/lite.c
Index: grub-2.02~beta2/grub-core/kern/emu/lite.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/kern/emu/lite.c
+++ grub-2.04~rc1/grub-core/kern/emu/lite.c
@@ -26,6 +26,8 @@
--- grub-2.02~beta2.orig/grub-core/kern/emu/lite.c
+++ grub-2.02~beta2/grub-core/kern/emu/lite.c
@@ -24,6 +24,8 @@
#elif defined(__aarch64__)
#include "../arm64/dl_helper.c"
#include "../arm64/dl.c"
#elif defined(__riscv)
#include "../riscv/dl.c"
+#elif defined(__s390x__)
+#include "../s390x/dl.c"
#else
#error "No target cpu type is defined"
#endif
Index: grub-2.04~rc1/grub-core/kern/dl.c
Index: grub-2.02~beta2/grub-core/kern/dl.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/kern/dl.c
+++ grub-2.04~rc1/grub-core/kern/dl.c
--- grub-2.02~beta2.orig/grub-core/kern/dl.c
+++ grub-2.02~beta2/grub-core/kern/dl.c
@@ -229,7 +229,7 @@ grub_dl_load_segments (grub_dl_t mod, co
unsigned i;
const Elf_Shdr *s;
grub_size_t tsize = 0, talign = 1;
-#if !defined (__i386__) && !defined (__x86_64__) && !defined(__riscv)
+#if !defined (__i386__) && !defined (__x86_64__) && !defined(__riscv) && !defined (__s390x__)
-#if !defined (__i386__) && !defined (__x86_64__)
+#if !defined (__i386__) && !defined (__x86_64__) && !defined (__s390x__)
grub_size_t tramp;
grub_size_t got;
grub_err_t err;
@ -63,8 +63,8 @@ Index: grub-2.04~rc1/grub-core/kern/dl.c
talign = s->sh_addralign;
}
-#if !defined (__i386__) && !defined (__x86_64__) && !defined(__riscv)
+#if !defined (__i386__) && !defined (__x86_64__) && !defined(__riscv) && !defined (__s390x__)
-#if !defined (__i386__) && !defined (__x86_64__)
+#if !defined (__i386__) && !defined (__x86_64__) && !defined (__s390x__)
err = grub_arch_dl_get_tramp_got_size (e, &tramp, &got);
if (err)
return err;
@ -72,15 +72,15 @@ Index: grub-2.04~rc1/grub-core/kern/dl.c
mod->segment = seg;
}
}
-#if !defined (__i386__) && !defined (__x86_64__) && !defined(__riscv)
+#if !defined (__i386__) && !defined (__x86_64__) && !defined(__riscv) && !defined (__s390x__)
-#if !defined (__i386__) && !defined (__x86_64__)
+#if !defined (__i386__) && !defined (__x86_64__) && !defined (__s390x__)
ptr = (char *) ALIGN_UP ((grub_addr_t) ptr, GRUB_ARCH_DL_TRAMP_ALIGN);
mod->tramp = ptr;
mod->trampptr = ptr;
Index: grub-2.04~rc1/grub-core/kern/s390x/dl.c
Index: grub-2.02~beta2/grub-core/kern/s390x/dl.c
===================================================================
--- /dev/null
+++ grub-2.04~rc1/grub-core/kern/s390x/dl.c
+++ grub-2.02~beta2/grub-core/kern/s390x/dl.c
@@ -0,0 +1,40 @@
+/* dl.c - arch-dependent part of loadable module support */
+/*
@ -122,10 +122,10 @@ Index: grub-2.04~rc1/grub-core/kern/s390x/dl.c
+ (void)(seg);
+ return GRUB_ERR_BUG;
+}
Index: grub-2.04~rc1/grub-core/lib/s390x/setjmp.S
Index: grub-2.02~beta2/grub-core/lib/s390x/setjmp.S
===================================================================
--- /dev/null
+++ grub-2.04~rc1/grub-core/lib/s390x/setjmp.S
+++ grub-2.02~beta2/grub-core/lib/s390x/setjmp.S
@@ -0,0 +1,46 @@
+/*
+ * GRUB -- GRand Unified Bootloader
@ -173,23 +173,23 @@ Index: grub-2.04~rc1/grub-core/lib/s390x/setjmp.S
+ lmg %r11,%r15,0(%r2)
+ lgr %r2,%r3
+ br %r14
Index: grub-2.04~rc1/grub-core/lib/setjmp.S
Index: grub-2.02~beta2/grub-core/lib/setjmp.S
===================================================================
--- grub-2.04~rc1.orig/grub-core/lib/setjmp.S
+++ grub-2.04~rc1/grub-core/lib/setjmp.S
@@ -17,6 +17,8 @@
--- grub-2.02~beta2.orig/grub-core/lib/setjmp.S
+++ grub-2.02~beta2/grub-core/lib/setjmp.S
@@ -15,6 +15,8 @@
#include "./arm/setjmp.S"
#elif defined(__aarch64__)
#include "./arm64/setjmp.S"
#elif defined(__riscv)
#include "./riscv/setjmp.S"
+#elif defined(__s390x__)
+#include "./s390x/setjmp.S"
#else
#error "Unknown target cpu type"
#endif
Index: grub-2.04~rc1/include/grub/cache.h
Index: grub-2.02~beta2/include/grub/cache.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/cache.h
+++ grub-2.04~rc1/include/grub/cache.h
--- grub-2.02~beta2.orig/include/grub/cache.h
+++ grub-2.02~beta2/include/grub/cache.h
@@ -23,7 +23,7 @@
#include <grub/symbol.h>
#include <grub/types.h>
@ -199,10 +199,10 @@ Index: grub-2.04~rc1/include/grub/cache.h
static inline void
grub_arch_sync_caches (void *address __attribute__ ((unused)),
grub_size_t len __attribute__ ((unused)))
Index: grub-2.04~rc1/include/grub/s390x/setjmp.h
Index: grub-2.02~beta2/include/grub/s390x/setjmp.h
===================================================================
--- /dev/null
+++ grub-2.04~rc1/include/grub/s390x/setjmp.h
+++ grub-2.02~beta2/include/grub/s390x/setjmp.h
@@ -0,0 +1,29 @@
+/*
+ * GRUB -- GRand Unified Bootloader
@ -233,10 +233,10 @@ Index: grub-2.04~rc1/include/grub/s390x/setjmp.h
+void grub_longjmp (grub_jmp_buf env, int val) __attribute__ ((noreturn));
+
+#endif /* ! GRUB_SETJMP_CPU_HEADER */
Index: grub-2.04~rc1/include/grub/s390x/time.h
Index: grub-2.02~beta2/include/grub/s390x/time.h
===================================================================
--- /dev/null
+++ grub-2.04~rc1/include/grub/s390x/time.h
+++ grub-2.02~beta2/include/grub/s390x/time.h
@@ -0,0 +1,27 @@
+/*
+ * GRUB -- GRand Unified Bootloader
@ -265,10 +265,10 @@ Index: grub-2.04~rc1/include/grub/s390x/time.h
+}
+
+#endif /* ! KERNEL_CPU_TIME_HEADER */
Index: grub-2.04~rc1/include/grub/s390x/types.h
Index: grub-2.02~beta2/include/grub/s390x/types.h
===================================================================
--- /dev/null
+++ grub-2.04~rc1/include/grub/s390x/types.h
+++ grub-2.02~beta2/include/grub/s390x/types.h
@@ -0,0 +1,32 @@
+/*
+ * GRUB -- GRand Unified Bootloader

View File

@ -9,14 +9,14 @@
include/grub/emu/misc.h | 3
8 files changed, 204 insertions(+), 4 deletions(-)
Index: grub-2.04~rc1/grub-core/Makefile.core.def
Index: grub-2.02~beta2/grub-core/Makefile.core.def
===================================================================
--- grub-2.04~rc1.orig/grub-core/Makefile.core.def
+++ grub-2.04~rc1/grub-core/Makefile.core.def
@@ -1786,9 +1786,9 @@ module = {
--- grub-2.02~beta2.orig/grub-core/Makefile.core.def 2016-01-29 22:59:52.244526390 +0300
+++ grub-2.02~beta2/grub-core/Makefile.core.def 2016-01-29 22:59:52.240526390 +0300
@@ -1667,9 +1667,9 @@
ia64_efi = loader/ia64/efi/linux.c;
arm = loader/arm/linux.c;
arm64 = loader/arm64/linux.c;
riscv32 = loader/riscv/linux.c;
riscv64 = loader/riscv/linux.c;
+ emu = loader/emu/linux.c;
common = loader/linux.c;
common = lib/cmdline.c;
@ -24,10 +24,10 @@ Index: grub-2.04~rc1/grub-core/Makefile.core.def
};
module = {
Index: grub-2.04~rc1/grub-core/loader/emu/linux.c
Index: grub-2.02~beta2/grub-core/loader/emu/linux.c
===================================================================
--- /dev/null
+++ grub-2.04~rc1/grub-core/loader/emu/linux.c
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ grub-2.02~beta2/grub-core/loader/emu/linux.c 2016-01-29 22:59:52.240526390 +0300
@@ -0,0 +1,173 @@
+/*
+ * GRUB -- GRand Unified Bootloader
@ -202,10 +202,10 @@ Index: grub-2.04~rc1/grub-core/loader/emu/linux.c
+ grub_unregister_command (cmd_linux);
+ grub_unregister_command (cmd_initrd);
+}
Index: grub-2.04~rc1/include/grub/emu/hostfile.h
Index: grub-2.02~beta2/include/grub/emu/hostfile.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/emu/hostfile.h
+++ grub-2.04~rc1/include/grub/emu/hostfile.h
--- grub-2.02~beta2.orig/include/grub/emu/hostfile.h 2016-01-29 22:59:52.244526390 +0300
+++ grub-2.02~beta2/include/grub/emu/hostfile.h 2016-01-29 22:59:52.240526390 +0300
@@ -22,6 +22,7 @@
#include <grub/disk.h>
#include <grub/partition.h>
@ -214,7 +214,7 @@ Index: grub-2.04~rc1/include/grub/emu/hostfile.h
#include <grub/osdep/hostfile.h>
int
@@ -29,7 +30,7 @@ grub_util_is_directory (const char *path
@@ -29,7 +30,7 @@
int
grub_util_is_special_file (const char *path);
int
@ -223,10 +223,10 @@ Index: grub-2.04~rc1/include/grub/emu/hostfile.h
char *
grub_util_path_concat (size_t n, ...);
Index: grub-2.04~rc1/include/grub/emu/exec.h
Index: grub-2.02~beta2/include/grub/emu/exec.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/emu/exec.h
+++ grub-2.04~rc1/include/grub/emu/exec.h
--- grub-2.02~beta2.orig/include/grub/emu/exec.h 2016-01-29 22:59:52.244526390 +0300
+++ grub-2.02~beta2/include/grub/emu/exec.h 2016-01-29 22:59:52.240526390 +0300
@@ -23,6 +23,8 @@
#include <stdarg.h>
@ -236,7 +236,7 @@ Index: grub-2.04~rc1/include/grub/emu/exec.h
pid_t
grub_util_exec_pipe (const char *const *argv, int *fd);
pid_t
@@ -32,7 +34,7 @@ int
@@ -32,7 +34,7 @@
grub_util_exec_redirect_all (const char *const *argv, const char *stdin_file,
const char *stdout_file, const char *stderr_file);
int
@ -245,11 +245,11 @@ Index: grub-2.04~rc1/include/grub/emu/exec.h
int
grub_util_exec_redirect (const char *const *argv, const char *stdin_file,
const char *stdout_file);
Index: grub-2.04~rc1/grub-core/Makefile.am
Index: grub-2.02~beta2/grub-core/Makefile.am
===================================================================
--- grub-2.04~rc1.orig/grub-core/Makefile.am
+++ grub-2.04~rc1/grub-core/Makefile.am
@@ -303,6 +303,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/inc
--- grub-2.02~beta2.orig/grub-core/Makefile.am 2016-01-29 22:59:52.244526390 +0300
+++ grub-2.02~beta2/grub-core/Makefile.am 2016-01-29 22:59:52.240526390 +0300
@@ -258,6 +258,7 @@
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/hostdisk.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/hostfile.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
@ -257,11 +257,11 @@ Index: grub-2.04~rc1/grub-core/Makefile.am
if COND_GRUB_EMU_SDL
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/sdl.h
endif
Index: grub-2.04~rc1/grub-core/kern/emu/main.c
Index: grub-2.02~beta2/grub-core/kern/emu/main.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/kern/emu/main.c
+++ grub-2.04~rc1/grub-core/kern/emu/main.c
@@ -107,6 +107,7 @@ static struct argp_option options[] = {
--- grub-2.02~beta2.orig/grub-core/kern/emu/main.c 2016-01-29 22:59:52.244526390 +0300
+++ grub-2.02~beta2/grub-core/kern/emu/main.c 2016-01-29 22:59:52.240526390 +0300
@@ -106,6 +106,7 @@
N_("use GRUB files in the directory DIR [default=%s]"), 0},
{"verbose", 'v', 0, 0, N_("print verbose messages."), 0},
{"hold", 'H', N_("SECS"), OPTION_ARG_OPTIONAL, N_("wait until a debugger will attach"), 0},
@ -269,7 +269,7 @@ Index: grub-2.04~rc1/grub-core/kern/emu/main.c
{ 0, 0, 0, 0, 0, 0 }
};
@@ -164,6 +165,9 @@ argp_parser (int key, char *arg, struct
@@ -163,6 +164,9 @@
case 'v':
verbosity++;
break;
@ -279,11 +279,11 @@ Index: grub-2.04~rc1/grub-core/kern/emu/main.c
case ARGP_KEY_ARG:
{
Index: grub-2.04~rc1/grub-core/kern/emu/misc.c
Index: grub-2.02~beta2/grub-core/kern/emu/misc.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/kern/emu/misc.c
+++ grub-2.04~rc1/grub-core/kern/emu/misc.c
@@ -39,6 +39,7 @@
--- grub-2.02~beta2.orig/grub-core/kern/emu/misc.c 2016-01-29 22:59:52.244526390 +0300
+++ grub-2.02~beta2/grub-core/kern/emu/misc.c 2016-01-29 22:59:52.240526390 +0300
@@ -37,6 +37,7 @@
#include <grub/emu/misc.h>
int verbosity;
@ -291,7 +291,7 @@ Index: grub-2.04~rc1/grub-core/kern/emu/misc.c
void
grub_util_warn (const char *fmt, ...)
@@ -82,7 +83,7 @@ grub_util_error (const char *fmt, ...)
@@ -80,7 +81,7 @@
vfprintf (stderr, fmt, ap);
va_end (ap);
fprintf (stderr, ".\n");
@ -300,7 +300,7 @@ Index: grub-2.04~rc1/grub-core/kern/emu/misc.c
}
void *
@@ -141,6 +142,9 @@ xasprintf (const char *fmt, ...)
@@ -138,6 +139,9 @@
void
grub_exit (void)
{
@ -310,7 +310,7 @@ Index: grub-2.04~rc1/grub-core/kern/emu/misc.c
exit (1);
}
#endif
@@ -202,3 +206,15 @@ grub_util_load_image (const char *path,
@@ -199,3 +203,15 @@
fclose (fp);
}
@ -326,13 +326,13 @@ Index: grub-2.04~rc1/grub-core/kern/emu/misc.c
+{
+ return kexecute;
+}
Index: grub-2.04~rc1/include/grub/emu/misc.h
Index: grub-2.02~beta2/include/grub/emu/misc.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/emu/misc.h
+++ grub-2.04~rc1/include/grub/emu/misc.h
@@ -56,6 +56,9 @@ void EXPORT_FUNC(grub_util_warn) (const
void EXPORT_FUNC(grub_util_info) (const char *fmt, ...) __attribute__ ((format (GNU_PRINTF, 1, 2)));
void EXPORT_FUNC(grub_util_error) (const char *fmt, ...) __attribute__ ((format (GNU_PRINTF, 1, 2), noreturn));
--- grub-2.02~beta2.orig/include/grub/emu/misc.h 2016-01-29 22:59:52.244526390 +0300
+++ grub-2.02~beta2/include/grub/emu/misc.h 2016-01-29 22:59:52.240526390 +0300
@@ -60,6 +60,9 @@
void EXPORT_FUNC(grub_util_info) (const char *fmt, ...) __attribute__ ((format (__printf__, 1, 2)));
void EXPORT_FUNC(grub_util_error) (const char *fmt, ...) __attribute__ ((format (__printf__, 1, 2), noreturn));
+void EXPORT_FUNC(grub_util_set_kexecute) (void);
+int EXPORT_FUNC(grub_util_get_kexecute) (void) WARN_UNUSED_RESULT;

View File

@ -51,8 +51,6 @@ V18:
* dracut-zipl-refresh.sh.in: initial submission. [bsc#1127293]
* dracut-grub2.sh: try to call zipl-refresh on failed kexec and drop
to an emergency shell otherwise
V19:
* dracut-grub2.sh: use 'grep -P' instead of '-E'. [bsc#1136970]
---
Makefile.util.def | 46 +++
@ -71,43 +69,41 @@ V19:
util/s390x/zipl2grub.pl.in | 423 +++++++++++++++++++++++++++++++++
14 files changed, 908 insertions(+), 3 deletions(-)
Index: grub-2.04~rc1/Makefile.util.def
===================================================================
--- grub-2.04~rc1.orig/Makefile.util.def
+++ grub-2.04~rc1/Makefile.util.def
@@ -362,6 +362,7 @@ program = {
ldadd = grub-core/lib/gnulib/libgnu.a;
--- a/Makefile.util.def
+++ b/Makefile.util.def
@@ -352,6 +352,7 @@ program = {
ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
cppflags = '-DGRUB_SETUP_FUNC=grub_util_bios_setup';
+ emu_condition = COND_NOT_s390x;
};
program = {
@@ -382,6 +383,7 @@ program = {
ldadd = grub-core/lib/gnulib/libgnu.a;
@@ -372,6 +373,7 @@ program = {
ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
cppflags = '-DGRUB_SETUP_FUNC=grub_util_sparc_setup';
+ emu_condition = COND_NOT_s390x;
};
program = {
@@ -397,6 +399,7 @@ program = {
@@ -387,6 +389,7 @@ program = {
ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a;
ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
+ emu_condition = COND_NOT_s390x;
};
program = {
@@ -427,6 +430,7 @@ program = {
@@ -417,6 +420,7 @@ program = {
ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a;
ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
+ emu_condition = COND_NOT_s390x;
};
data = {
@@ -638,6 +642,7 @@ program = {
@@ -628,6 +632,7 @@ program = {
common = grub-core/disk/host.c;
common = util/resolve.c;
@ -115,7 +111,7 @@ Index: grub-2.04~rc1/Makefile.util.def
common = grub-core/kern/emu/argp_common.c;
common = grub-core/osdep/init.c;
@@ -707,6 +712,46 @@ script = {
@@ -697,6 +702,46 @@ script = {
};
script = {
@ -162,19 +158,17 @@ Index: grub-2.04~rc1/Makefile.util.def
name = grub-mkconfig_lib;
common = util/grub-mkconfig_lib.in;
installdir = noinst;
@@ -1324,6 +1369,7 @@ program = {
@@ -1308,6 +1353,7 @@ program = {
ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a;
ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
+ emu_condition = COND_NOT_s390x;
};
program = {
Index: grub-2.04~rc1/configure.ac
===================================================================
--- grub-2.04~rc1.orig/configure.ac
+++ grub-2.04~rc1/configure.ac
@@ -197,9 +197,9 @@ if test x$platform != xemu ; then
--- a/configure.ac
+++ b/configure.ac
@@ -181,9 +181,9 @@ if test x$platform != xemu ; then
esac
fi
@ -187,21 +181,19 @@ Index: grub-2.04~rc1/configure.ac
case "$target_os" in
windows* | mingw32*) target_os=cygwin ;;
@@ -1941,6 +1941,9 @@ AM_CONDITIONAL([COND_riscv32], [test x$t
AM_CONDITIONAL([COND_riscv64], [test x$target_cpu = xriscv64 ])
AM_CONDITIONAL([COND_riscv32_efi], [test x$target_cpu = xriscv32 -a x$platform = xefi])
AM_CONDITIONAL([COND_riscv64_efi], [test x$target_cpu = xriscv64 -a x$platform = xefi])
@@ -1908,6 +1908,9 @@ AM_CONDITIONAL([COND_arm_uboot], [test x
AM_CONDITIONAL([COND_arm_efi], [test x$target_cpu = xarm -a x$platform = xefi])
AM_CONDITIONAL([COND_arm64], [test x$target_cpu = xarm64 ])
AM_CONDITIONAL([COND_arm64_efi], [test x$target_cpu = xarm64 -a x$platform = xefi])
+AM_CONDITIONAL([COND_s390x], [test x$target_cpu = xs390x ])
+AM_CONDITIONAL([COND_NOT_s390x], [test x$target_cpu != xs390x ])
+AM_CONDITIONAL([COND_s390x_emu], [test x$target_cpu = xs390x -a x$platform = xemu])
AM_CONDITIONAL([COND_HOST_HURD], [test x$host_kernel = xhurd])
AM_CONDITIONAL([COND_HOST_LINUX], [test x$host_kernel = xlinux])
Index: grub-2.04~rc1/grub-core/Makefile.core.def
===================================================================
--- grub-2.04~rc1.orig/grub-core/Makefile.core.def
+++ grub-2.04~rc1/grub-core/Makefile.core.def
@@ -1139,6 +1139,7 @@ module = {
--- a/grub-core/Makefile.core.def
+++ b/grub-core/Makefile.core.def
@@ -1057,6 +1057,7 @@ module = {
module = {
name = videotest;
common = commands/videotest.c;
@ -209,7 +201,7 @@ Index: grub-2.04~rc1/grub-core/Makefile.core.def
};
module = {
@@ -1571,6 +1572,7 @@ module = {
@@ -1469,6 +1470,7 @@ module = {
common = gfxmenu/gui_progress_bar.c;
common = gfxmenu/gui_util.c;
common = gfxmenu/gui_string_util.c;
@ -217,7 +209,7 @@ Index: grub-2.04~rc1/grub-core/Makefile.core.def
};
module = {
@@ -2006,11 +2008,13 @@ module = {
@@ -1884,11 +1886,13 @@ module = {
name = gfxterm;
common = term/gfxterm.c;
enable = videomodules;
@ -231,7 +223,7 @@ Index: grub-2.04~rc1/grub-core/Makefile.core.def
};
module = {
@@ -2131,6 +2135,7 @@ module = {
@@ -2003,6 +2007,7 @@ module = {
enable = x86_64_efi;
enable = emu;
enable = xen;
@ -239,7 +231,7 @@ Index: grub-2.04~rc1/grub-core/Makefile.core.def
};
module = {
@@ -2177,6 +2182,7 @@ module = {
@@ -2049,6 +2054,7 @@ module = {
module = {
name = gfxterm_menu;
common = tests/gfxterm_menu.c;
@ -247,7 +239,7 @@ Index: grub-2.04~rc1/grub-core/Makefile.core.def
};
module = {
@@ -2330,6 +2336,7 @@ module = {
@@ -2201,6 +2207,7 @@ module = {
enable = x86_64_efi;
enable = emu;
enable = xen;
@ -255,10 +247,8 @@ Index: grub-2.04~rc1/grub-core/Makefile.core.def
};
module = {
Index: grub-2.04~rc1/grub-core/osdep/basic/no_platform.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/osdep/basic/no_platform.c
+++ grub-2.04~rc1/grub-core/osdep/basic/no_platform.c
--- a/grub-core/osdep/basic/no_platform.c
+++ b/grub-core/osdep/basic/no_platform.c
@@ -44,3 +44,10 @@ grub_install_sgi_setup (const char *inst
{
grub_util_error ("%s", _("no SGI routines are available for your platform"));
@ -270,11 +260,9 @@ Index: grub-2.04~rc1/grub-core/osdep/basic/no_platform.c
+ grub_util_error ("%s", _("no zIPL routines are available for your platform"));
+}
+
Index: grub-2.04~rc1/grub-core/osdep/unix/platform.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/osdep/unix/platform.c
+++ grub-2.04~rc1/grub-core/osdep/unix/platform.c
@@ -239,3 +239,14 @@ grub_install_sgi_setup (const char *inst
--- a/grub-core/osdep/unix/platform.c
+++ b/grub-core/osdep/unix/platform.c
@@ -233,3 +233,14 @@ grub_install_sgi_setup (const char *inst
imgfile, destname, NULL });
grub_util_warn ("%s", _("You will have to set `SystemPartition' and `OSLoader' manually."));
}
@ -289,11 +277,9 @@ Index: grub-2.04~rc1/grub-core/osdep/unix/platform.c
+ "-z", dest, NULL }))
+ grub_util_error (_("`%s' failed.\n"), PACKAGE"-zipl-setup");
+}
Index: grub-2.04~rc1/grub-core/osdep/windows/platform.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/osdep/windows/platform.c
+++ grub-2.04~rc1/grub-core/osdep/windows/platform.c
@@ -424,3 +424,9 @@ grub_install_sgi_setup (const char *inst
--- a/grub-core/osdep/windows/platform.c
+++ b/grub-core/osdep/windows/platform.c
@@ -422,3 +422,9 @@ grub_install_sgi_setup (const char *inst
{
grub_util_error ("%s", _("no SGI routines are available for your platform"));
}
@ -303,19 +289,17 @@ Index: grub-2.04~rc1/grub-core/osdep/windows/platform.c
+{
+ grub_util_error ("%s", _("no zIPL routines are available for your platform"));
+}
Index: grub-2.04~rc1/include/grub/util/install.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/util/install.h
+++ grub-2.04~rc1/include/grub/util/install.h
@@ -105,6 +105,7 @@ enum grub_install_plat
GRUB_INSTALL_PLATFORM_ARM_COREBOOT,
GRUB_INSTALL_PLATFORM_RISCV32_EFI,
GRUB_INSTALL_PLATFORM_RISCV64_EFI,
--- a/include/grub/util/install.h
+++ b/include/grub/util/install.h
@@ -99,6 +99,7 @@ enum grub_install_plat
GRUB_INSTALL_PLATFORM_I386_XEN,
GRUB_INSTALL_PLATFORM_X86_64_XEN,
GRUB_INSTALL_PLATFORM_ARM64_EFI,
+ GRUB_INSTALL_PLATFORM_S390X_EMU,
GRUB_INSTALL_PLATFORM_MAX
};
@@ -229,6 +230,9 @@ void
@@ -219,6 +220,9 @@ void
grub_install_sgi_setup (const char *install_device,
const char *imgfile, const char *destname);
@ -325,22 +309,18 @@ Index: grub-2.04~rc1/include/grub/util/install.h
int
grub_install_compress_gzip (const char *src, const char *dest);
int
Index: grub-2.04~rc1/util/grub-install-common.c
===================================================================
--- grub-2.04~rc1.orig/util/grub-install-common.c
+++ grub-2.04~rc1/util/grub-install-common.c
@@ -737,6 +737,7 @@ static struct
[GRUB_INSTALL_PLATFORM_ARM_COREBOOT] = { "arm", "coreboot" },
[GRUB_INSTALL_PLATFORM_RISCV32_EFI] = { "riscv32", "efi" },
[GRUB_INSTALL_PLATFORM_RISCV64_EFI] = { "riscv64", "efi" },
--- a/util/grub-install-common.c
+++ b/util/grub-install-common.c
@@ -666,6 +666,7 @@ static struct
[GRUB_INSTALL_PLATFORM_ARM_EFI] = { "arm", "efi" },
[GRUB_INSTALL_PLATFORM_ARM64_EFI] = { "arm64", "efi" },
[GRUB_INSTALL_PLATFORM_ARM_UBOOT] = { "arm", "uboot" },
+ [GRUB_INSTALL_PLATFORM_S390X_EMU] = { "s390x", "emu" },
};
char *
Index: grub-2.04~rc1/util/grub-install.c
===================================================================
--- grub-2.04~rc1.orig/util/grub-install.c
+++ grub-2.04~rc1/util/grub-install.c
--- a/util/grub-install.c
+++ b/util/grub-install.c
@@ -66,6 +66,7 @@ static int force_file_id = 0;
static char *disk_module = NULL;
static char *efidir = NULL;
@ -387,32 +367,32 @@ Index: grub-2.04~rc1/util/grub-install.c
#else
return NULL;
#endif
@@ -499,6 +510,8 @@ have_bootdev (enum grub_install_plat pl)
@@ -495,6 +506,8 @@ have_bootdev (enum grub_install_plat pl)
case GRUB_INSTALL_PLATFORM_I386_XEN:
case GRUB_INSTALL_PLATFORM_X86_64_XEN:
case GRUB_INSTALL_PLATFORM_I386_XEN_PVH:
+
+ case GRUB_INSTALL_PLATFORM_S390X_EMU:
return 0;
/* pacify warning. */
@@ -914,6 +927,7 @@ main (int argc, char *argv[])
@@ -907,6 +920,7 @@ main (int argc, char *argv[])
case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
case GRUB_INSTALL_PLATFORM_I386_XEN:
case GRUB_INSTALL_PLATFORM_X86_64_XEN:
case GRUB_INSTALL_PLATFORM_I386_XEN_PVH:
+ case GRUB_INSTALL_PLATFORM_S390X_EMU:
break;
case GRUB_INSTALL_PLATFORM_I386_QEMU:
@@ -964,6 +978,7 @@ main (int argc, char *argv[])
@@ -952,6 +966,7 @@ main (int argc, char *argv[])
case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS:
case GRUB_INSTALL_PLATFORM_I386_XEN:
case GRUB_INSTALL_PLATFORM_X86_64_XEN:
case GRUB_INSTALL_PLATFORM_I386_XEN_PVH:
+ case GRUB_INSTALL_PLATFORM_S390X_EMU:
free (install_device);
install_device = NULL;
break;
@@ -1239,6 +1254,20 @@ main (int argc, char *argv[])
@@ -1213,6 +1228,20 @@ main (int argc, char *argv[])
}
}
@ -433,15 +413,15 @@ Index: grub-2.04~rc1/util/grub-install.c
grub_install_copy_files (grub_install_source_directory,
grubdir, platform);
@@ -1488,6 +1517,7 @@ main (int argc, char *argv[])
@@ -1458,6 +1487,7 @@ main (int argc, char *argv[])
case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
case GRUB_INSTALL_PLATFORM_I386_XEN:
case GRUB_INSTALL_PLATFORM_X86_64_XEN:
case GRUB_INSTALL_PLATFORM_I386_XEN_PVH:
+ case GRUB_INSTALL_PLATFORM_S390X_EMU:
grub_util_warn ("%s", _("no hints available for your platform. Expect reduced performance"));
break;
/* pacify warning. */
@@ -1605,6 +1635,10 @@ main (int argc, char *argv[])
@@ -1570,6 +1600,10 @@ main (int argc, char *argv[])
strcpy (mkimage_target, "sparc64-ieee1275-raw");
core_name = "core.img";
break;
@ -452,7 +432,7 @@ Index: grub-2.04~rc1/util/grub-install.c
/* pacify warning. */
case GRUB_INSTALL_PLATFORM_MAX:
break;
@@ -1620,6 +1654,7 @@ main (int argc, char *argv[])
@@ -1585,6 +1619,7 @@ main (int argc, char *argv[])
core_name);
char *prefix = xasprintf ("%s%s", prefix_drive ? : "",
relative_grubdir);
@ -460,7 +440,7 @@ Index: grub-2.04~rc1/util/grub-install.c
grub_install_make_image_wrap (/* source dir */ grub_install_source_directory,
/*prefix */ prefix,
/* output */ imgfile,
@@ -1658,6 +1693,10 @@ main (int argc, char *argv[])
@@ -1623,6 +1658,10 @@ main (int argc, char *argv[])
/* image target */ mkimage_target, 0);
}
break;
@ -470,8 +450,8 @@ Index: grub-2.04~rc1/util/grub-install.c
+
case GRUB_INSTALL_PLATFORM_ARM_EFI:
case GRUB_INSTALL_PLATFORM_ARM64_EFI:
case GRUB_INSTALL_PLATFORM_RISCV32_EFI:
@@ -1934,6 +1973,10 @@ main (int argc, char *argv[])
case GRUB_INSTALL_PLATFORM_IA64_EFI:
@@ -1885,6 +1924,10 @@ main (int argc, char *argv[])
}
break;
@ -482,10 +462,8 @@ Index: grub-2.04~rc1/util/grub-install.c
case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON:
case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS:
case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS:
Index: grub-2.04~rc1/util/s390x/dracut-grub2.sh.in
===================================================================
--- /dev/null
+++ grub-2.04~rc1/util/s390x/dracut-grub2.sh.in
+++ b/util/s390x/dracut-grub2.sh.in
@@ -0,0 +1,126 @@
+#!/bin/sh
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
@ -516,7 +494,7 @@ Index: grub-2.04~rc1/util/s390x/dracut-grub2.sh.in
+ checksnap() {
+ if [ -e /sysroot/.snapshots/grub-snapshot.cfg ]; then
+ echo true
+ elif grep -qP '^[^#\s]+\s+/.snapshots\s+' /sysroot/etc/fstab; then
+ elif grep -qE '^[^#\s]+\s+/.snapshots\s+' /sysroot/etc/fstab; then
+ echo false
+ else
+ echo true
@ -582,8 +560,8 @@ Index: grub-2.04~rc1/util/s390x/dracut-grub2.sh.in
+ debug "Trying grub2-emu (ro=$grub2rofs, TERM=$TERM, ctty=$_ctty)..."
+ setsid $CTTY -- chroot /sysroot $bindir/grub2-emu -X -X 0<>$_ctty 1>&0 2>&0
+
+ if [ -x /sysroot@libdir@/grub2/zipl-refresh ]; then
+ setsid $CTTY -- /sysroot@libdir@/grub2/zipl-refresh 0<>$_ctty 1>&0 2>&0
+ if [ -x /sysroot/usr/share/grub2/zipl-refresh ]; then
+ setsid $CTTY -- /sysroot/usr/share/grub2/zipl-refresh 0<>$_ctty 1>&0 2>&0
+ if [ $? != 0 ]; then
+ warn "Not continuing"
+ emergency_shell -n grub2-emu-zipl-refresh
@ -613,10 +591,8 @@ Index: grub-2.04~rc1/util/s390x/dracut-grub2.sh.in
+ fi
+fi
+
Index: grub-2.04~rc1/util/s390x/dracut-module-setup.sh.in
===================================================================
--- /dev/null
+++ grub-2.04~rc1/util/s390x/dracut-module-setup.sh.in
+++ b/util/s390x/dracut-module-setup.sh.in
@@ -0,0 +1,19 @@
+#!/bin/bash
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
@ -637,10 +613,8 @@ Index: grub-2.04~rc1/util/s390x/dracut-module-setup.sh.in
+ #inst_multiple grub2-emu kexec
+}
+
Index: grub-2.04~rc1/util/s390x/zipl2grub.conf.in
===================================================================
--- /dev/null
+++ grub-2.04~rc1/util/s390x/zipl2grub.conf.in
+++ b/util/s390x/zipl2grub.conf.in
@@ -0,0 +1,26 @@
+## This is the template for '@zipldir@/config' and is subject to
+## rpm's %config file handling in case of grub2-s390x-emu package update.
@ -668,10 +642,8 @@ Index: grub-2.04~rc1/util/s390x/zipl2grub.conf.in
+ 1 = grub2
+ 2 = skip-grub2
+
Index: grub-2.04~rc1/util/s390x/zipl2grub.pl.in
===================================================================
--- /dev/null
+++ grub-2.04~rc1/util/s390x/zipl2grub.pl.in
+++ b/util/s390x/zipl2grub.pl.in
@@ -0,0 +1,423 @@
+#!/usr/bin/perl
+use strict;
@ -1096,16 +1068,14 @@ Index: grub-2.04~rc1/util/s390x/zipl2grub.pl.in
+System( @C);
+exit( $miss);
+
Index: grub-2.04~rc1/util/s390x/dracut-zipl-refresh.sh.in
===================================================================
--- /dev/null
+++ grub-2.04~rc1/util/s390x/dracut-zipl-refresh.sh.in
+++ b/util/s390x/dracut-zipl-refresh.sh.in
@@ -0,0 +1,183 @@
+#!/bin/bash
+# ex: ts=8 sw=4 sts=4 et filetype=sh syntax=off
+
+debug=false
+TIMEOUT=300
+TIMEOUT=60
+[ -n "$SYSROOT" ] ||
+SYSROOT=/sysroot
+[ -d $SYSROOT/boot ] || SYSROOT=
@ -1187,7 +1157,7 @@ Index: grub-2.04~rc1/util/s390x/dracut-zipl-refresh.sh.in
+ to be made writable, then 'grub2-install --force' needs to be run,
+ and, on success, a 'reboot' will be initiated.
+
+ Press 'c[Enter]' to interrupt, any other input will proceed... "
+ Press 'c[Enter]' to interrupt... "
+
+trap interrupted=1 INT
+interrupted=0

View File

@ -6,13 +6,6 @@ References: fate#314485
Patch-Mainline: no
Signed-off-by: Michael Chang <mchang@suse.com>
v2: Adjust patch according to new upstream commits
4d4a8c96e verifiers: Add possibility to verify kernel and modules command lines
ca0a4f689 verifiers: File type for fine-grained signature-verification controlling
7d36709d5 i386: make struct linux_kernel_header architecture specific
4bc909bf8 Remove grub_efi_allocate_pages.
---
grub-core/Makefile.core.def | 8 +
grub-core/kern/efi/mm.c | 32 ++++
@ -22,11 +15,11 @@ ca0a4f689 verifiers: File type for fine-grained signature-verification controlli
5 files changed, 415 insertions(+), 0 deletions(-)
create mode 100644 grub-core/loader/i386/efi/linux.c
Index: grub-2.04~rc1/grub-core/Makefile.core.def
Index: grub-2.02~beta2/grub-core/Makefile.core.def
===================================================================
--- grub-2.04~rc1.orig/grub-core/Makefile.core.def
+++ grub-2.04~rc1/grub-core/Makefile.core.def
@@ -1850,6 +1850,14 @@ module = {
--- grub-2.02~beta2.orig/grub-core/Makefile.core.def
+++ grub-2.02~beta2/grub-core/Makefile.core.def
@@ -1691,6 +1691,14 @@ module = {
};
module = {
@ -41,13 +34,13 @@ Index: grub-2.04~rc1/grub-core/Makefile.core.def
name = chain;
efi = loader/efi/chainloader.c;
i386_pc = loader/i386/pc/chainloader.c;
Index: grub-2.04~rc1/grub-core/kern/efi/mm.c
Index: grub-2.02~beta2/grub-core/kern/efi/mm.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/kern/efi/mm.c
+++ grub-2.04~rc1/grub-core/kern/efi/mm.c
@@ -113,6 +113,38 @@ grub_efi_drop_alloc (grub_efi_physical_a
}
}
--- grub-2.02~beta2.orig/grub-core/kern/efi/mm.c
+++ grub-2.02~beta2/grub-core/kern/efi/mm.c
@@ -49,6 +49,38 @@ static grub_efi_uintn_t finish_desc_size
static grub_efi_uint32_t finish_desc_version;
int grub_efi_is_finished = 0;
+/* Allocate pages below a specified address */
+void *
@ -83,12 +76,12 @@ Index: grub-2.04~rc1/grub-core/kern/efi/mm.c
+
/* Allocate pages. Return the pointer to the first of allocated pages. */
void *
grub_efi_allocate_pages_real (grub_efi_physical_address_t address,
Index: grub-2.04~rc1/grub-core/loader/i386/efi/linux.c
grub_efi_allocate_pages (grub_efi_physical_address_t address,
Index: grub-2.02~beta2/grub-core/loader/i386/efi/linux.c
===================================================================
--- /dev/null
+++ grub-2.04~rc1/grub-core/loader/i386/efi/linux.c
@@ -0,0 +1,342 @@
+++ grub-2.02~beta2/grub-core/loader/i386/efi/linux.c
@@ -0,0 +1,371 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2012 Free Software Foundation, Inc.
@ -131,6 +124,32 @@ Index: grub-2.04~rc1/grub-core/loader/i386/efi/linux.c
+
+#define BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> 12)
+
+#define SHIM_LOCK_GUID \
+ { 0x605dab50, 0xe046, 0x4300, {0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23} }
+
+struct grub_efi_shim_lock
+{
+ grub_efi_status_t (*verify) (void *buffer, grub_uint32_t size);
+};
+typedef struct grub_efi_shim_lock grub_efi_shim_lock_t;
+
+static grub_efi_boolean_t
+grub_linuxefi_secure_validate (void *data, grub_uint32_t size)
+{
+ grub_efi_guid_t guid = SHIM_LOCK_GUID;
+ grub_efi_shim_lock_t *shim_lock;
+
+ shim_lock = grub_efi_locate_protocol(&guid, NULL);
+
+ if (!shim_lock)
+ return 1;
+
+ if (shim_lock->verify(data, size) == GRUB_EFI_SUCCESS)
+ return 1;
+
+ return 0;
+}
+
+typedef void(*handover_func)(void *, grub_efi_system_table_t *, struct linux_kernel_params *);
+
+static grub_err_t
@ -196,8 +215,8 @@ Index: grub-2.04~rc1/grub-core/loader/i386/efi/linux.c
+
+ for (i = 0; i < argc; i++)
+ {
+ files[i] = grub_file_open (argv[i], GRUB_FILE_TYPE_LINUX_INITRD
+ | GRUB_FILE_TYPE_NO_DECOMPRESS);
+ grub_file_filter_disable_compression ();
+ files[i] = grub_file_open (argv[i]);
+ if (! files[i])
+ goto fail;
+ nfiles++;
@ -250,10 +269,9 @@ Index: grub-2.04~rc1/grub-core/loader/i386/efi/linux.c
+ int argc, char *argv[])
+{
+ grub_file_t file = 0;
+ struct linux_i386_kernel_header lh;
+ struct linux_kernel_header lh;
+ grub_ssize_t len, start, filelen;
+ void *kernel;
+ grub_err_t err;
+
+ grub_dl_ref (my_mod);
+
@ -263,7 +281,7 @@ Index: grub-2.04~rc1/grub-core/loader/i386/efi/linux.c
+ goto fail;
+ }
+
+ file = grub_file_open (argv[0], GRUB_FILE_TYPE_LINUX_KERNEL);
+ file = grub_file_open (argv[0]);
+ if (! file)
+ goto fail;
+
@ -283,6 +301,13 @@ Index: grub-2.04~rc1/grub-core/loader/i386/efi/linux.c
+ goto fail;
+ }
+
+ if (! grub_linuxefi_secure_validate (kernel, filelen))
+ {
+ grub_error (GRUB_ERR_INVALID_COMMAND, N_("%s has invalid signature"), argv[0]);
+ grub_free (kernel);
+ goto fail;
+ }
+
+ grub_file_seek (file, 0);
+
+ grub_free(kernel);
@ -339,12 +364,9 @@ Index: grub-2.04~rc1/grub-core/loader/i386/efi/linux.c
+ }
+
+ grub_memcpy (linux_cmdline, LINUX_IMAGE, sizeof (LINUX_IMAGE));
+ err = grub_create_loader_cmdline (argc, argv,
+ grub_create_loader_cmdline (argc, argv,
+ linux_cmdline + sizeof (LINUX_IMAGE) - 1,
+ lh.cmdline_size - (sizeof (LINUX_IMAGE) - 1),
+ GRUB_VERIFY_KERNEL_CMDLINE);
+ if (err)
+ goto fail;
+ lh.cmdline_size - (sizeof (LINUX_IMAGE) - 1));
+
+ lh.cmd_line_ptr = (grub_uint32_t)(grub_addr_t)linux_cmdline;
+
@ -353,7 +375,7 @@ Index: grub-2.04~rc1/grub-core/loader/i386/efi/linux.c
+ start = (lh.setup_sects + 1) * 512;
+ len = grub_file_size(file) - start;
+
+ kernel_mem = grub_efi_allocate_fixed (lh.pref_address,
+ kernel_mem = grub_efi_allocate_pages(lh.pref_address,
+ BYTES_TO_PAGES(lh.init_size));
+
+ if (!kernel_mem)
@ -431,17 +453,29 @@ Index: grub-2.04~rc1/grub-core/loader/i386/efi/linux.c
+ grub_unregister_command (cmd_linux);
+ grub_unregister_command (cmd_initrd);
+}
Index: grub-2.04~rc1/include/grub/efi/efi.h
Index: grub-2.02~beta2/include/grub/efi/efi.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/efi/efi.h
+++ grub-2.04~rc1/include/grub/efi/efi.h
@@ -47,6 +47,9 @@ EXPORT_FUNC(grub_efi_allocate_fixed) (gr
grub_efi_uintn_t pages);
--- grub-2.02~beta2.orig/include/grub/efi/efi.h
+++ grub-2.02~beta2/include/grub/efi/efi.h
@@ -40,6 +40,9 @@ void EXPORT_FUNC(grub_efi_stall) (grub_e
void *
EXPORT_FUNC(grub_efi_allocate_any_pages) (grub_efi_uintn_t pages);
EXPORT_FUNC(grub_efi_allocate_pages) (grub_efi_physical_address_t address,
grub_efi_uintn_t pages);
+void *
+EXPORT_FUNC(grub_efi_allocate_pages_max) (grub_efi_physical_address_t max,
+ grub_efi_uintn_t pages);
void EXPORT_FUNC(grub_efi_free_pages) (grub_efi_physical_address_t address,
grub_efi_uintn_t pages);
grub_efi_uintn_t EXPORT_FUNC(grub_efi_find_mmap_size) (void);
int
Index: grub-2.02~beta2/include/grub/i386/linux.h
===================================================================
--- grub-2.02~beta2.orig/include/grub/i386/linux.h
+++ grub-2.02~beta2/include/grub/i386/linux.h
@@ -139,6 +139,7 @@ struct linux_kernel_header
grub_uint64_t setup_data;
grub_uint64_t pref_address;
grub_uint32_t init_size;
+ grub_uint32_t handover_offset;
} GRUB_PACKED;
/* Boot parameters for Linux based on 2.6.12. This is used by the setup

View File

@ -21,10 +21,10 @@ Signed-off-by: Michael Chang <mchang@suse.com>
grub-core/loader/efi/chainloader.c | 538 +++++++++++++++++++++++++++++++++--
1 files changed, 507 insertions(+), 31 deletions(-)
Index: grub-2.04~rc1/grub-core/loader/efi/chainloader.c
Index: grub-2.02~beta2/grub-core/loader/efi/chainloader.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/loader/efi/chainloader.c
+++ grub-2.04~rc1/grub-core/loader/efi/chainloader.c
--- grub-2.02~beta2.orig/grub-core/loader/efi/chainloader.c
+++ grub-2.02~beta2/grub-core/loader/efi/chainloader.c
@@ -40,15 +40,31 @@
#include <grub/i386/macho.h>
#endif
@ -65,7 +65,7 @@ Index: grub-2.04~rc1/grub-core/loader/efi/chainloader.c
grub_dl_unref (my_mod);
return GRUB_ERR_NONE;
@@ -197,12 +214,460 @@ make_file_path (grub_efi_device_path_t *
@@ -187,12 +204,460 @@ make_file_path (grub_efi_device_path_t *
return file_path;
}
@ -527,7 +527,7 @@ Index: grub-2.04~rc1/grub-core/loader/efi/chainloader.c
grub_efi_status_t status;
grub_efi_boot_services_t *b;
grub_device_t dev = 0;
@@ -210,7 +675,6 @@ grub_cmd_chainloader (grub_command_t cmd
@@ -200,7 +665,6 @@ grub_cmd_chainloader (grub_command_t cmd
grub_efi_loaded_image_t *loaded_image;
char *filename;
void *boot_image = 0;
@ -535,7 +535,7 @@ Index: grub-2.04~rc1/grub-core/loader/efi/chainloader.c
if (argc == 0)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
@@ -222,9 +686,36 @@ grub_cmd_chainloader (grub_command_t cmd
@@ -212,9 +676,36 @@ grub_cmd_chainloader (grub_command_t cmd
address = 0;
image_handle = 0;
file_path = 0;
@ -569,10 +569,10 @@ Index: grub-2.04~rc1/grub-core/loader/efi/chainloader.c
+ *(--p16) = 0;
+ }
+
file = grub_file_open (filename, GRUB_FILE_TYPE_EFI_CHAINLOADED_IMAGE);
file = grub_file_open (filename);
if (! file)
goto fail;
@@ -270,14 +761,14 @@ grub_cmd_chainloader (grub_command_t cmd
@@ -260,14 +751,14 @@ grub_cmd_chainloader (grub_command_t cmd
grub_printf ("file path: ");
grub_efi_print_device_path (file_path);
@ -590,7 +590,7 @@ Index: grub-2.04~rc1/grub-core/loader/efi/chainloader.c
status = efi_call_4 (b->allocate_pages, GRUB_EFI_ALLOCATE_ANY_PAGES,
GRUB_EFI_LOADER_CODE,
@@ -291,7 +782,7 @@ grub_cmd_chainloader (grub_command_t cmd
@@ -281,7 +772,7 @@ grub_cmd_chainloader (grub_command_t cmd
}
boot_image = (void *) ((grub_addr_t) address);
@ -599,7 +599,7 @@ Index: grub-2.04~rc1/grub-core/loader/efi/chainloader.c
{
if (grub_errno == GRUB_ERR_NONE)
grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
@@ -301,7 +792,7 @@ grub_cmd_chainloader (grub_command_t cmd
@@ -291,7 +782,7 @@ grub_cmd_chainloader (grub_command_t cmd
}
#if defined (__i386__) || defined (__x86_64__)
@ -608,7 +608,7 @@ Index: grub-2.04~rc1/grub-core/loader/efi/chainloader.c
{
struct grub_macho_fat_header *head = boot_image;
if (head->magic
@@ -324,20 +815,30 @@ grub_cmd_chainloader (grub_command_t cmd
@@ -314,20 +805,30 @@ grub_cmd_chainloader (grub_command_t cmd
> ~grub_cpu_to_le32 (archs[i].size)
|| grub_cpu_to_le32 (archs[i].offset)
+ grub_cpu_to_le32 (archs[i].size)
@ -642,7 +642,7 @@ Index: grub-2.04~rc1/grub-core/loader/efi/chainloader.c
&image_handle);
if (status != GRUB_EFI_SUCCESS)
{
@@ -360,33 +861,10 @@ grub_cmd_chainloader (grub_command_t cmd
@@ -350,33 +851,10 @@ grub_cmd_chainloader (grub_command_t cmd
}
loaded_image->device_handle = dev_handle;
@ -678,7 +678,7 @@ Index: grub-2.04~rc1/grub-core/loader/efi/chainloader.c
}
grub_file_close (file);
@@ -408,6 +886,9 @@ grub_cmd_chainloader (grub_command_t cmd
@@ -398,6 +876,9 @@ grub_cmd_chainloader (grub_command_t cmd
if (address)
efi_call_2 (b->free_pages, address, pages);

View File

@ -17,10 +17,10 @@ Signed-off-by: Michael Chang <mchang@suse.com>
util/grub-install.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 85 insertions(+), 1 deletion(-)
Index: grub-2.04~rc1/util/grub-install.c
Index: grub-2.02/util/grub-install.c
===================================================================
--- grub-2.04~rc1.orig/util/grub-install.c
+++ grub-2.04~rc1/util/grub-install.c
--- grub-2.02.orig/util/grub-install.c
+++ grub-2.02/util/grub-install.c
@@ -84,6 +84,15 @@ static int suse_enable_tpm = 0;
enum
@ -98,7 +98,7 @@ Index: grub-2.04~rc1/util/grub-install.c
case ARGP_KEY_HELP_POST_DOC:
return xasprintf (text, program_name, GRUB_BOOT_DIR_NAME "/" GRUB_DIR_NAME);
default:
@@ -1627,13 +1667,34 @@ main (int argc, char *argv[])
@@ -1596,13 +1636,34 @@ main (int argc, char *argv[])
char mkimage_target[200];
const char *core_name = NULL;
@ -106,6 +106,7 @@ Index: grub-2.04~rc1/util/grub-install.c
switch (platform)
{
- case GRUB_INSTALL_PLATFORM_I386_EFI:
+ case GRUB_INSTALL_PLATFORM_ARM64_EFI:
+
+ if (signed_grub_mode > SIGNED_GRUB_INHIBIT)
@ -127,14 +128,14 @@ Index: grub-2.04~rc1/util/grub-install.c
+ fprintf (stderr, _("Use signed file in %s for installation.\n"), signed_imgfile);
+
+ /* fallthrough. */
case GRUB_INSTALL_PLATFORM_I386_EFI:
case GRUB_INSTALL_PLATFORM_X86_64_EFI:
+ case GRUB_INSTALL_PLATFORM_I386_EFI:
case GRUB_INSTALL_PLATFORM_ARM_EFI:
- case GRUB_INSTALL_PLATFORM_ARM64_EFI:
case GRUB_INSTALL_PLATFORM_RISCV32_EFI:
case GRUB_INSTALL_PLATFORM_RISCV64_EFI:
case GRUB_INSTALL_PLATFORM_IA64_EFI:
@@ -1703,13 +1764,75 @@ main (int argc, char *argv[])
core_name = "core.efi";
snprintf (mkimage_target, sizeof (mkimage_target),
@@ -1678,13 +1739,75 @@ main (int argc, char *argv[])
core_name);
char *prefix = xasprintf ("%s%s", prefix_drive ? : "",
relative_grubdir);
@ -166,7 +167,7 @@ Index: grub-2.04~rc1/util/grub-install.c
+ else if (prefix_drive)
+ {
+ char *uuid = NULL;
+ if (grub_fs->fs_uuid && grub_fs->fs_uuid (grub_dev, &uuid))
+ if (grub_fs->uuid && grub_fs->uuid (grub_dev, &uuid))
+ {
+ grub_print_error ();
+ grub_errno = 0;
@ -211,7 +212,7 @@ Index: grub-2.04~rc1/util/grub-install.c
/* Backward-compatibility kludges. */
switch (platform)
{
@@ -1985,6 +2108,13 @@ main (int argc, char *argv[])
@@ -1950,6 +2073,13 @@ main (int argc, char *argv[])
char *dst = grub_util_path_concat (2, efidir, efi_file);
grub_install_copy_file (imgfile, dst, 1);
free (dst);

View File

@ -13,10 +13,10 @@ Signed-off-by: Michael Chang <mchang@suse.com>
include/grub/efi/efi.h | 1 +
3 files changed, 46 insertions(+)
Index: grub-2.04~rc1/grub-core/kern/dl.c
Index: grub-2.02~beta2/grub-core/kern/dl.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/kern/dl.c
+++ grub-2.04~rc1/grub-core/kern/dl.c
--- grub-2.02~beta2.orig/grub-core/kern/dl.c
+++ grub-2.02~beta2/grub-core/kern/dl.c
@@ -38,6 +38,10 @@
#define GRUB_MODULES_MACHINE_READONLY
#endif
@ -28,7 +28,7 @@ Index: grub-2.04~rc1/grub-core/kern/dl.c
#pragma GCC diagnostic ignored "-Wcast-align"
@@ -688,6 +692,19 @@ grub_dl_load_file (const char *filename)
@@ -682,6 +686,19 @@ grub_dl_load_file (const char *filename)
grub_boot_time ("Loading module %s", filename);
@ -45,14 +45,14 @@ Index: grub-2.04~rc1/grub-core/kern/dl.c
+ }
+#endif
+
file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE);
file = grub_file_open (filename);
if (! file)
return 0;
Index: grub-2.04~rc1/grub-core/kern/efi/efi.c
Index: grub-2.02~beta2/grub-core/kern/efi/efi.c
===================================================================
--- grub-2.04~rc1.orig/grub-core/kern/efi/efi.c
+++ grub-2.04~rc1/grub-core/kern/efi/efi.c
@@ -273,6 +273,34 @@ grub_efi_get_variable (const char *var,
--- grub-2.02~beta2.orig/grub-core/kern/efi/efi.c
+++ grub-2.02~beta2/grub-core/kern/efi/efi.c
@@ -259,6 +259,34 @@ grub_efi_get_variable (const char *var,
return NULL;
}
@ -87,11 +87,11 @@ Index: grub-2.04~rc1/grub-core/kern/efi/efi.c
#pragma GCC diagnostic ignored "-Wcast-align"
/* Search the mods section from the PE32/PE32+ image. This code uses
Index: grub-2.04~rc1/include/grub/efi/efi.h
Index: grub-2.02~beta2/include/grub/efi/efi.h
===================================================================
--- grub-2.04~rc1.orig/include/grub/efi/efi.h
+++ grub-2.04~rc1/include/grub/efi/efi.h
@@ -85,6 +85,7 @@ EXPORT_FUNC (grub_efi_set_variable) (con
--- grub-2.02~beta2.orig/include/grub/efi/efi.h
+++ grub-2.02~beta2/include/grub/efi/efi.h
@@ -72,6 +72,7 @@ EXPORT_FUNC (grub_efi_set_variable) (con
const grub_efi_guid_t *guid,
void *data,
grub_size_t datasize);

View File

@ -25,11 +25,11 @@ has shim exported protocols available.
util/grub.d/10_linux.in | 4 ++--
2 files changed, 4 insertions(+), 3 deletions(-)
Index: grub-2.04~rc1/util/grub-mkconfig.in
Index: grub-2.02~beta2/util/grub-mkconfig.in
===================================================================
--- grub-2.04~rc1.orig/util/grub-mkconfig.in
+++ grub-2.04~rc1/util/grub-mkconfig.in
@@ -271,7 +271,8 @@ export GRUB_DEFAULT \
--- grub-2.02~beta2.orig/util/grub-mkconfig.in
+++ grub-2.02~beta2/util/grub-mkconfig.in
@@ -254,7 +254,8 @@ export GRUB_DEFAULT \
GRUB_BADRAM \
GRUB_OS_PROBER_SKIP_LIST \
GRUB_DISABLE_SUBMENU \
@ -39,11 +39,11 @@ Index: grub-2.04~rc1/util/grub-mkconfig.in
if test "x${grub_cfg}" != "x"; then
rm -f "${grub_cfg}.new"
Index: grub-2.04~rc1/util/grub.d/10_linux.in
Index: grub-2.02~beta2/util/grub.d/10_linux.in
===================================================================
--- grub-2.04~rc1.orig/util/grub.d/10_linux.in
+++ grub-2.04~rc1/util/grub.d/10_linux.in
@@ -145,7 +145,7 @@ linux_entry ()
--- grub-2.02~beta2.orig/util/grub.d/10_linux.in
+++ grub-2.02~beta2/util/grub.d/10_linux.in
@@ -133,7 +133,7 @@ linux_entry ()
printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
fi
message="$(gettext_printf "Loading Linux %s ..." ${version})"
@ -52,12 +52,12 @@ Index: grub-2.04~rc1/util/grub.d/10_linux.in
sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$message" | grub_quote)'
linuxefi ${rel_dirname}/${basename} ${root_device} ${args}
@@ -163,7 +163,7 @@ EOF
for i in ${initrd}; do
initrd_path="${initrd_path} ${rel_dirname}/${i}"
done
@@ -147,7 +147,7 @@ EOF
if test -n "${initrd}" ; then
# TRANSLATORS: ramdisk isn't identifier. Should be translated.
message="$(gettext_printf "Loading initial ramdisk ...")"
- if [ -d /sys/firmware/efi ]; then
+ if [ -d /sys/firmware/efi ] && [ "x${GRUB_USE_LINUXEFI}" = "xtrue" ]; then
sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$message" | grub_quote)'
initrdefi $(echo $initrd_path)
initrdefi ${rel_dirname}/${initrd}

View File

@ -11,11 +11,11 @@ Signed-off-by: Michael Chang <mchang@suse.com>
util/grub.d/10_linux.in | 18 ++++++++++++++++--
1 files changed, 16 insertions(+), 2 deletions(-)
Index: grub-2.04~rc1/util/grub.d/10_linux.in
Index: grub-2.02~beta2/util/grub.d/10_linux.in
===================================================================
--- grub-2.04~rc1.orig/util/grub.d/10_linux.in
+++ grub-2.04~rc1/util/grub.d/10_linux.in
@@ -145,10 +145,17 @@ linux_entry ()
--- grub-2.02~beta2.orig/util/grub.d/10_linux.in
+++ grub-2.02~beta2/util/grub.d/10_linux.in
@@ -133,17 +133,31 @@ linux_entry ()
printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
fi
message="$(gettext_printf "Loading Linux %s ..." ${version})"
@ -34,20 +34,16 @@ Index: grub-2.04~rc1/util/grub.d/10_linux.in
if test -n "${initrd}" ; then
# TRANSLATORS: ramdisk isn't identifier. Should be translated.
message="$(gettext_printf "Loading initial ramdisk ...")"
@@ -156,10 +163,17 @@ EOF
for i in ${initrd}; do
initrd_path="${initrd_path} ${rel_dirname}/${i}"
done
- sed "s/^/$submenu_indentation/" << EOF
+ if [ -d /sys/firmware/efi ]; then
+ sed "s/^/$submenu_indentation/" << EOF
+ echo '$(echo "$message" | grub_quote)'
+ initrdefi $(echo $initrd_path)
+ initrdefi ${rel_dirname}/${initrd}
+EOF
+ else
+ sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$message" | grub_quote)'
initrd $(echo $initrd_path)
initrd ${rel_dirname}/${initrd}
EOF
+ fi
fi

View File

@ -1,11 +1,8 @@
V2: Add fs_ prefix to fs functions by upstream commit ad4bfee
Index: grub-2.04/util/setup.c
Index: grub-2.02/util/setup.c
===================================================================
--- grub-2.04.orig/util/setup.c
+++ grub-2.04/util/setup.c
@@ -526,8 +526,42 @@ SETUP (const char *dir,
--- grub-2.02.orig/util/setup.c
+++ grub-2.02/util/setup.c
@@ -511,8 +511,42 @@ SETUP (const char *dir,
err = grub_util_ldm_embed (dest_dev->disk, &nsec, maxsec,
GRUB_EMBED_PCBIOS, &sectors);
else if (ctx.dest_partmap)
@ -22,14 +19,14 @@ Index: grub-2.04/util/setup.c
+ grub_fs_t root_fs;
+
+ root_fs = grub_fs_probe (root_dev);
+ if (root_fs && root_fs->fs_embed)
+ if (root_fs && root_fs->embed)
+ {
+ grub_disk_addr_t *fs_sectors;
+ unsigned int fs_nsec;
+
+ fs_sectors = NULL;
+ fs_nsec = core_sectors;
+ err = root_fs->fs_embed (root_dev, &fs_nsec, maxsec,
+ err = root_fs->embed (root_dev, &fs_nsec, maxsec,
+ GRUB_EMBED_PCBIOS, &fs_sectors);
+ if (!err && fs_nsec >= core_sectors)
+ {
@ -48,9 +45,9 @@ Index: grub-2.04/util/setup.c
+#endif
+ }
else
err = fs->fs_embed (dest_dev, &nsec, maxsec,
GRUB_EMBED_PCBIOS, &sectors);
@@ -639,7 +673,7 @@ SETUP (const char *dir,
err = fs->embed (dest_dev, &nsec, maxsec,
GRUB_EMBED_PCBIOS, &sectors);
@@ -594,7 +628,7 @@ SETUP (const char *dir,
/* Write the core image onto the disk. */
for (i = 0; i < nsec; i++)
@ -58,4 +55,4 @@ Index: grub-2.04/util/setup.c
+ grub_disk_write (core_dev->disk, sectors[i], 0,
GRUB_DISK_SECTOR_SIZE,
core_img + i * GRUB_DISK_SECTOR_SIZE);
#endif

View File

@ -1,92 +1,3 @@
-------------------------------------------------------------------
Thu Oct 17 06:34:52 UTC 2019 - Michael Chang <mchang@suse.com>
- Version bump to 2.04
* removed
- translations-20170427.tar.xz
* grub2.spec
- Make signed grub-tpm.efi specific to x86_64-efi build, the platform
currently shipped with tpm module from upstream codebase
- Add shim_lock to signed grub.efi in x86_64-efi build
- x86_64: linuxefi now depends on linux, both will verify kernel via
shim_lock
- Remove translation tarball and po file hacks as it's been included in
upstream tarball
* rediff
- grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch
- grub2-commands-introduce-read_file-subcommand.patch
- grub2-secureboot-add-linuxefi.patch
- 0001-add-support-for-UEFI-network-protocols.patch
- grub2-efi-HP-workaround.patch
- grub2-secureboot-install-signed-grub.patch
- grub2-linux.patch
- use-grub2-as-a-package-name.patch
- grub2-pass-corret-root-for-nfsroot.patch
- grub2-secureboot-use-linuxefi-on-uefi.patch
- grub2-secureboot-no-insmod-on-sb.patch
- grub2-secureboot-provide-linuxefi-config.patch
- grub2-secureboot-chainloader.patch
- grub2-s390x-01-Changes-made-and-files-added-in-order-to-allow-s390x.patch
- grub2-s390x-02-kexec-module-added-to-emu.patch
- grub2-s390x-04-grub2-install.patch
- grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch
- grub2-efi-chainloader-root.patch
- grub2-ppc64le-disable-video.patch
- grub2-ppc64-cas-reboot-support.patch
- grub2-Fix-incorrect-netmask-on-ppc64.patch
- 0003-bootp-New-net_bootp6-command.patch
- 0006-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch
- 0012-tpm-Build-tpm-as-module.patch
- grub2-emu-4-all.patch
- grub2-btrfs-09-get-default-subvolume.patch
- grub2-ppc64le-memory-map.patch
- grub2-ppc64-cas-fix-double-free.patch
- 0008-efinet-Setting-DNS-server-from-UEFI-protocol.patch
* drop upstream patches
- grub2-fix-locale-en.mo.gz-not-found-error-message.patch
- grub2-fix-build-with-flex-2.6.4.patch
- grub2-accept-empty-module.patch
- 0001-Fix-packed-not-aligned-error-on-GCC-8.patch
- 0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch
- unix-exec-avoid-atexit-handlers-when-child-exits.patch
- 0001-xfs-Accept-filesystem-with-sparse-inodes.patch
- grub2-binutils2.31.patch
- grub2-msdos-fix-overflow.patch
- 0001-tsc-Change-default-tsc-calibration-method-to-pmtimer.patch
- grub2-efi-Move-grub_reboot-into-kernel.patch
- grub2-efi-Free-malloc-regions-on-exit.patch
- grub2-move-initrd-upper.patch
- 0002-Add-Virtual-LAN-support.patch
- 0001-ofnet-Initialize-structs-in-bootpath-parser.patch
- 0001-misc-fix-invalid-character-recongition-in-strto-l.patch
- 0001-tpm-Core-TPM-support.patch
- 0002-tpm-Measure-kernel-initrd.patch
- 0003-tpm-Add-BIOS-boot-measurement.patch
- 0004-tpm-Rework-linux-command.patch
- 0005-tpm-Rework-linux16-command.patch
- 0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch
- 0007-tpm-Measure-the-kernel-commandline.patch
- 0008-tpm-Measure-commands.patch
- 0009-tpm-Measure-multiboot-images-and-modules.patch
- 0010-tpm-Fix-boot-when-there-s-no-TPM.patch
- 0011-tpm-Fix-build-error.patch
- 0013-tpm-i386-pc-diskboot-img.patch
- grub2-freetype-pkgconfig.patch
- 0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch
- 0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch
- 0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch
- 0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch
- 0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch
- 0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch
- 0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch
- 0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch
-------------------------------------------------------------------
Tue Oct 15 13:29:14 UTC 2019 - rw@suse.com
- Consistently find btrfs snapshots on s390x. (bsc#1136970)
* grub2-s390x-04-grub2-install.patch
-------------------------------------------------------------------
Fri Aug 16 04:51:16 UTC 2019 - Michael Chang <mchang@suse.com>
@ -122,7 +33,7 @@ Mon Jun 17 09:45:49 UTC 2019 - mchang@suse.com
-------------------------------------------------------------------
Fri Jun 14 06:13:58 UTC 2019 - mchang@suse.com
- Avoid high resolution when trying to keep current mode (bsc#1133842)
- Avoid high resolution when trying to keep current mode (bsc#1133842)
* grub2-video-limit-the-resolution-for-fixed-bimap-font.patch
- Make GRUB_SAVEDEFAULT working with btrfs (bsc#1128592)
* grub2-grubenv-in-btrfs-header.patch

View File

@ -142,16 +142,19 @@ BuildRequires: update-bootloader-rpm-macros
%define only_x86_64 %{nil}
%endif
Version: 2.04
Version: 2.02
Release: 0
Summary: Bootloader with support for Linux, Multiboot and more
License: GPL-3.0-or-later
Group: System/Boot
Url: http://www.gnu.org/software/grub/
Source0: https://ftp.gnu.org/gnu/grub/grub-%{version}.tar.xz
%define rev 20120622
Source0: grub-%{version}.tar.xz
Source1: 90_persistent
Source2: grub.default
Source4: grub2.rpmlintrc
# rsync -Lrtvz translationproject.org::tp/latest/grub/ po
Source5: translations-20170427.tar.xz
Source6: grub2-once
Source7: 20_memtest86+
Source8: README.ibm3215
@ -173,9 +176,11 @@ Patch6: grub2-iterate-and-hook-for-extended-partition.patch
Patch8: grub2-ppc-terminfo.patch
Patch9: grub2-GRUB_CMDLINE_LINUX_RECOVERY-for-recovery-mode.patch
Patch10: grub2-fix-error-terminal-gfxterm-isn-t-found.patch
Patch11: grub2-fix-build-with-flex-2.6.4.patch
Patch12: grub2-fix-menu-in-xen-host-server.patch
Patch15: not-display-menu-when-boot-once.patch
Patch17: grub2-pass-corret-root-for-nfsroot.patch
Patch18: grub2-fix-locale-en.mo.gz-not-found-error-message.patch
Patch19: grub2-efi-HP-workaround.patch
Patch21: grub2-secureboot-add-linuxefi.patch
Patch22: grub2-secureboot-use-linuxefi-on-uefi.patch
@ -203,6 +208,7 @@ Patch65: grub2-mkconfig-aarch64.patch
Patch70: grub2-default-distributor.patch
Patch71: grub2-menu-unrestricted.patch
Patch72: grub2-mkconfig-arm.patch
Patch74: grub2-accept-empty-module.patch
Patch75: grub2-s390x-06-loadparm.patch
Patch76: grub2-s390x-07-add-image-param-for-zipl-setup.patch
Patch77: grub2-s390x-08-workaround-part-to-disk.patch
@ -214,8 +220,15 @@ Patch82: grub2-diskfilter-support-pv-without-metadatacopies.patch
Patch83: grub2-efi-uga-64bit-fb.patch
Patch84: grub2-s390x-09-improve-zipl-setup.patch
Patch85: grub2-getroot-scan-disk-pv.patch
Patch86: 0001-Fix-packed-not-aligned-error-on-GCC-8.patch
Patch87: 0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch
Patch88: unix-exec-avoid-atexit-handlers-when-child-exits.patch
Patch89: 0001-xfs-Accept-filesystem-with-sparse-inodes.patch
Patch90: grub2-binutils2.31.patch
Patch91: grub2-msdos-fix-overflow.patch
Patch92: grub2-util-30_os-prober-multiple-initrd.patch
Patch93: grub2-getroot-support-nvdimm.patch
Patch94: 0001-tsc-Change-default-tsc-calibration-method-to-pmtimer.patch
# Btrfs snapshot booting related patches
Patch101: grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch
Patch102: grub2-btrfs-02-export-subvolume-envvars.patch
@ -236,22 +249,30 @@ Patch124: grub2-efi-xen-removable.patch
# Hidden menu entry and hotkey "t" for text console
Patch140: grub2-Add-hidden-menu-entries.patch
Patch141: grub2-SUSE-Add-the-t-hotkey.patch
# EFI free memory on exit fix (bsc#980739)
Patch150: grub2-efi-Move-grub_reboot-into-kernel.patch
Patch151: grub2-efi-Free-malloc-regions-on-exit.patch
# Linux root device related patches
Patch163: grub2-zipl-setup-fix-btrfs-multipledev.patch
Patch164: grub2-suse-remove-linux-root-param.patch
# ARM patches - boo#1123350
Patch180: grub2-move-initrd-upper.patch
# PPC64 LE support
Patch205: grub2-ppc64le-disable-video.patch
Patch207: grub2-ppc64le-memory-map.patch
# PPC
Patch210: 0002-Add-Virtual-LAN-support.patch
Patch211: grub2-ppc64-cas-reboot-support.patch
Patch212: grub2-install-remove-useless-check-PReP-partition-is-empty.patch
Patch213: grub2-Fix-incorrect-netmask-on-ppc64.patch
Patch215: grub2-ppc64-cas-new-scope.patch
Patch216: 0001-ofnet-Initialize-structs-in-bootpath-parser.patch
Patch218: grub2-ppc64-cas-fix-double-free.patch
Patch233: grub2-use-stat-instead-of-udevadm-for-partition-lookup.patch
Patch234: fix-grub2-use-stat-instead-of-udevadm-for-partition-lookup-with-new-glibc.patch
Patch236: grub2-efi_gop-avoid-low-resolution.patch
# Support HTTP Boot IPv4 and IPv6 (fate#320129)
Patch280: 0001-misc-fix-invalid-character-recongition-in-strto-l.patch
Patch281: 0002-net-read-bracketed-ipv6-addrs-and-port-numbers.patch
Patch282: 0003-bootp-New-net_bootp6-command.patch
Patch283: 0004-efinet-UEFI-IPv6-PXE-support.patch
@ -262,7 +283,19 @@ Patch287: 0008-efinet-Setting-DNS-server-from-UEFI-protocol.patch
# Fix GOP BLT support (FATE#322332)
Patch311: grub2-efi-gop-add-blt.patch
# TPM Support (FATE#315831)
Patch400: 0001-tpm-Core-TPM-support.patch
Patch401: 0002-tpm-Measure-kernel-initrd.patch
Patch402: 0003-tpm-Add-BIOS-boot-measurement.patch
Patch403: 0004-tpm-Rework-linux-command.patch
Patch404: 0005-tpm-Rework-linux16-command.patch
Patch405: 0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch
Patch406: 0007-tpm-Measure-the-kernel-commandline.patch
Patch407: 0008-tpm-Measure-commands.patch
Patch408: 0009-tpm-Measure-multiboot-images-and-modules.patch
Patch409: 0010-tpm-Fix-boot-when-there-s-no-TPM.patch
Patch410: 0011-tpm-Fix-build-error.patch
Patch411: 0012-tpm-Build-tpm-as-module.patch
Patch412: 0013-tpm-i386-pc-diskboot-img.patch
# UEFI HTTP and related network protocol support (FATE#320130)
Patch420: 0001-add-support-for-UEFI-network-protocols.patch
Patch421: 0002-AUDIT-0-http-boot-tracker-bug.patch
@ -272,11 +305,22 @@ Patch430: grub2-mkconfig-default-entry-correction.patch
Patch431: grub2-s390x-10-keep-network-at-kexec.patch
# Support for UEFI Secure Boot on AArch64 (FATE#326541)
Patch450: grub2-secureboot-install-signed-grub.patch
# Use pkg-config to find Freetype2
Patch500: grub2-freetype-pkgconfig.patch
Patch501: grub2-btrfs-help-on-snapper-rollback.patch
# Improved hiDPI device support (FATE#326680)
Patch510: grub2-video-limit-the-resolution-for-fixed-bimap-font.patch
# Support long menuentries (FATE#325760)
Patch511: grub2-gfxmenu-support-scrolling-menu-entry-s-text.patch
# Fix GCC 9 build failure (bsc#1121208)
Patch520: 0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch
Patch521: 0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch
Patch522: 0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch
Patch523: 0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch
Patch524: 0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch
Patch525: 0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch
Patch526: 0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch
Patch527: 0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch
Requires: gettext-runtime
%if 0%{?suse_version} >= 1140
@ -443,7 +487,8 @@ swap partition while in resuming
%prep
# We create (if we build for efi) two copies of the sources in the Builddir
%setup -q -n grub-%{version}
%setup -q -n grub-%{version} -a 5
(cd po && ls *.po | cut -d. -f1 | xargs) >po/LINGUAS
%patch1 -p1
%patch2 -p1
%patch3 -p1
@ -452,9 +497,11 @@ swap partition while in resuming
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch15 -p1
%patch17 -p1
%patch18 -p1
%patch19 -p1
%patch21 -p1
%patch22 -p1
@ -482,6 +529,7 @@ swap partition while in resuming
%patch70 -p1
%patch71 -p1
%patch72 -p1
%patch74 -p1
%patch75 -p1
%patch76 -p1
%patch77 -p1
@ -493,8 +541,15 @@ swap partition while in resuming
%patch83 -p1
%patch84 -p1
%patch85 -p1
%patch86 -p1
%patch87 -p1
%patch88 -p1
%patch89 -p1
%patch90 -p1
%patch91 -p1
%patch92 -p1
%patch93 -p1
%patch94 -p1
%patch101 -p1
%patch102 -p1
%patch103 -p1
@ -512,18 +567,24 @@ swap partition while in resuming
%patch124 -p1
%patch140 -p1
%patch141 -p1
%patch150 -p1
%patch151 -p1
%patch163 -p1
%patch164 -p1
%patch180 -p1
%patch205 -p1
%patch207 -p1
%patch210 -p1
%patch211 -p1
%patch212 -p1
%patch213 -p1
%patch215 -p1
%patch216 -p1
%patch218 -p1
%patch233 -p1
%patch234 -p1
%patch236 -p1
%patch280 -p1
%patch281 -p1
%patch282 -p1
%patch283 -p1
@ -532,15 +593,36 @@ swap partition while in resuming
%patch286 -p1
%patch287 -p1
%patch311 -p1
%patch400 -p1
%patch401 -p1
%patch402 -p1
%patch403 -p1
%patch404 -p1
%patch405 -p1
%patch406 -p1
%patch407 -p1
%patch408 -p1
%patch409 -p1
%patch410 -p1
%patch411 -p1
%patch412 -p1
%patch420 -p1
%patch421 -p1
%patch430 -p1
%patch431 -p1
%patch450 -p1
%patch500 -p1
%patch501 -p1
%patch510 -p1
%patch511 -p1
%patch520 -p1
%patch521 -p1
%patch522 -p1
%patch523 -p1
%patch524 -p1
%patch525 -p1
%patch526 -p1
%patch527 -p1
%build
# collect evidence to debug spurious build failure on SLE15
@ -554,6 +636,14 @@ ulimit -a
# This simplifies patch handling without need to use git to create patch
# that renames file
mv docs/grub.texi docs/grub2.texi
# This avoids attempt to rebuild potfiles which fails because necessary
# sources are not included in tarball
mv po/grub.pot po/%{name}.pot
# Generate po/LINGUAS for message catalogs ...
./linguas.sh
# ... and make sure new catalogs are actually created
rm -f po/stamp-po
cp %{SOURCE8} .
mkdir build
@ -646,7 +736,7 @@ PXE_MODULES="efinet tftp http"
CRYPTO_MODULES="luks gcry_rijndael gcry_sha1 gcry_sha256"
%ifarch x86_64
CD_MODULES="${CD_MODULES} shim_lock linuxefi"
CD_MODULES="${CD_MODULES} linuxefi"
%else
CD_MODULES="${CD_MODULES} linux"
%endif
@ -654,10 +744,8 @@ CD_MODULES="${CD_MODULES} linux"
GRUB_MODULES="${CD_MODULES} ${FS_MODULES} ${PXE_MODULES} ${CRYPTO_MODULES} mdraid09 mdraid1x lvm serial"
./grub-mkimage -O %{grubefiarch} -o grub.efi --prefix= \
-d grub-core ${GRUB_MODULES}
%ifarch x86_64
./grub-mkimage -O %{grubefiarch} -o grub-tpm.efi --prefix= \
-d grub-core ${GRUB_MODULES} tpm
%endif
%ifarch x86_64 aarch64
%if 0%{?suse_version} >= 1230 || 0%{?suse_version} == 1110
@ -736,10 +824,7 @@ cd ..
%ifarch %{efi}
cd build-efi
%make_install
install -m 644 grub.efi %{buildroot}/%{_datadir}/%{name}/%{grubefiarch}/.
%ifarch x86_64
install -m 644 grub-tpm.efi %{buildroot}/%{_datadir}/%{name}/%{grubefiarch}/.
%endif
install -m 644 grub.efi grub-tpm.efi %{buildroot}/%{_datadir}/%{name}/%{grubefiarch}/.
# Create grub.efi link to system efi directory
# This is for tools like kiwi not fiddling with the path
@ -760,10 +845,7 @@ EoM
%ifarch x86_64 aarch64
%if 0%{?suse_version} >= 1230 || 0%{?suse_version} == 1110
export BRP_PESIGN_FILES="%{_datadir}/%{name}/%{grubefiarch}/grub.efi"
%ifarch x86_64
BRP_PESIGN_FILES="${BRP_PESIGN_FILES} %{_datadir}/%{name}/%{grubefiarch}/grub-tpm.efi"
%endif
export BRP_PESIGN_FILES="%{_datadir}/%{name}/%{grubefiarch}/grub.efi %{_datadir}/%{name}/%{grubefiarch}/grub-tpm.efi"
install -m 444 grub.der %{buildroot}/%{sysefidir}/
%endif
%endif
@ -1170,9 +1252,7 @@ fi
%defattr(-,root,root,-)
%dir %{_datadir}/%{name}/%{grubefiarch}
%{_datadir}/%{name}/%{grubefiarch}/grub.efi
%ifarch x86_64
%{_datadir}/%{name}/%{grubefiarch}/grub-tpm.efi
%endif
%{_datadir}/%{name}/%{grubefiarch}/*.img
%{_datadir}/%{name}/%{grubefiarch}/*.lst
%{_datadir}/%{name}/%{grubefiarch}/*.mod

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2793b20ede25e0d3a63ab5939a4fca6786d40d09946711350f8bf3cf9639f079
size 585860

View File

@ -0,0 +1,70 @@
From: Patrick Steinhardt <ps@pks.im>
Date: Mon, 28 Aug 2017 20:57:19 +0200
Subject: unix exec: avoid atexit handlers when child exits
Git-commit: e75cf4a58b5eaf482804e5e1b2cc7d4399df350e
Patch-mainline: Yes, but not released yet
References: bsc#1086670
The `grub_util_exec_redirect_all` helper function can be used to
spawn an executable and redirect its output to some files. After calling
`fork()`, the parent will wait for the child to terminate with
`waitpid()` while the child prepares its file descriptors, environment
and finally calls `execvp()`. If something in the children's setup
fails, it will stop by calling `exit(127)`.
Calling `exit()` will cause any function registered via `atexit()` to be
executed, which is usually the wrong thing to do in a child. And
actually, one can easily observe faulty behaviour on musl-based systems
without modprobe(8) installed: executing `grub-install --help` will call
`grub_util_exec_redirect_all` with "modprobe", which obviously fails if
modprobe(8) is not installed. Due to the child now exiting and invoking
the `atexit()` handlers, it will clean up some data structures of the
parent and cause it to be deadlocked in the `waitpid()` syscall.
The issue can easily be fixed by calling `_exit(127)` instead, which is
especially designed to be called when the atexit-handlers should not be
executed.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
grub-core/osdep/unix/exec.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
--- a/grub-core/osdep/unix/exec.c
+++ b/grub-core/osdep/unix/exec.c
@@ -99,7 +99,7 @@ grub_util_exec_redirect_all (const char
{
fd = open (stdin_file, O_RDONLY);
if (fd < 0)
- exit (127);
+ _exit (127);
dup2 (fd, STDIN_FILENO);
close (fd);
}
@@ -108,7 +108,7 @@ grub_util_exec_redirect_all (const char
{
fd = open (stdout_file, O_WRONLY | O_CREAT, 0700);
if (fd < 0)
- exit (127);
+ _exit (127);
dup2 (fd, STDOUT_FILENO);
close (fd);
}
@@ -117,7 +117,7 @@ grub_util_exec_redirect_all (const char
{
fd = open (stderr_file, O_WRONLY | O_CREAT, 0700);
if (fd < 0)
- exit (127);
+ _exit (127);
dup2 (fd, STDERR_FILENO);
close (fd);
}
@@ -126,7 +126,7 @@ grub_util_exec_redirect_all (const char
setenv ("LC_ALL", "C", 1);
execvp ((char *) argv[0], (char **) argv);
- exit (127);
+ _exit (127);
}
waitpid (pid, &status, 0);
if (!WIFEXITED (status))

View File

@ -12,16 +12,16 @@ Signed-off-by: Jiri Slaby <jirislaby@gmail.com>
configure.ac | 2 +-
2 files changed, 13 insertions(+), 13 deletions(-)
Index: grub-2.04/configure.ac
Index: grub-2.02/configure.ac
===================================================================
--- grub-2.04.orig/configure.ac
+++ grub-2.04/configure.ac
--- grub-2.02.orig/configure.ac
+++ grub-2.02/configure.ac
@@ -31,7 +31,7 @@ dnl (such as BUILD_CC, BUILD_CFLAGS, etc
dnl with the prefix "TARGET_" (such as TARGET_CC, TARGET_CFLAGS, etc.) are
dnl used for the target type. See INSTALL for full list of variables.
-AC_INIT([GRUB],[2.04],[bug-grub@gnu.org])
+AC_INIT([GRUB2],[2.04],[bug-grub@gnu.org])
-AC_INIT([GRUB],[2.02],[bug-grub@gnu.org])
+AC_INIT([GRUB2],[2.02],[bug-grub@gnu.org])
AC_CONFIG_AUX_DIR([build-aux])