From a2b07e1f8bb0a9dceff995eeeace97314fdc662b726a5ace7265cfded014a8eb Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Fri, 24 Feb 2017 01:43:15 +0000 Subject: [PATCH 01/57] Accepting request 460052 from Base:System 1 OBS-URL: https://build.opensuse.org/request/show/460052 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=155 --- ...rly-terminate-filepath-with-NULL-in-.patch | 39 ++++ ...mands-introduce-read_file-subcommand.patch | 70 +++++++ grub2-efi-chainload-harder.patch | 103 +++++++++++ grub2-emu-4-all.patch | 170 +++++++++++++++++ grub2-once | 175 ++++++++++++++++-- grub2-s390x-04-grub2-install.patch | 44 +++-- grub2-s390x-06-loadparm.patch | 47 +++++ ...0x-07-add-image-param-for-zipl-setup.patch | 41 ++++ grub2-s390x-08-workaround-part-to-disk.patch | 15 ++ grub2.changes | 43 +++++ grub2.spec | 103 ++++++++--- 11 files changed, 793 insertions(+), 57 deletions(-) create mode 100644 0001-Revert-efi-properly-terminate-filepath-with-NULL-in-.patch create mode 100644 grub2-commands-introduce-read_file-subcommand.patch create mode 100644 grub2-efi-chainload-harder.patch create mode 100644 grub2-emu-4-all.patch create mode 100644 grub2-s390x-06-loadparm.patch create mode 100644 grub2-s390x-07-add-image-param-for-zipl-setup.patch create mode 100644 grub2-s390x-08-workaround-part-to-disk.patch diff --git a/0001-Revert-efi-properly-terminate-filepath-with-NULL-in-.patch b/0001-Revert-efi-properly-terminate-filepath-with-NULL-in-.patch new file mode 100644 index 0000000..0d7ab44 --- /dev/null +++ b/0001-Revert-efi-properly-terminate-filepath-with-NULL-in-.patch @@ -0,0 +1,39 @@ +From 28f83642deb777cce122c3629ddbd7b44a7f95b4 Mon Sep 17 00:00:00 2001 +From: Michael Chang +Date: Thu, 23 Feb 2017 22:39:37 +0800 +Subject: [PATCH] Revert "efi: properly terminate filepath with NULL in + chainloader" + +This reverts commit ce95549cc54b5d6f494608a7c390dba3aab4fba7. +--- + grub-core/loader/efi/chainloader.c | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +diff --git a/grub-core/loader/efi/chainloader.c b/grub-core/loader/efi/chainloader.c +index adc8563..522a716 100644 +--- a/grub-core/loader/efi/chainloader.c ++++ b/grub-core/loader/efi/chainloader.c +@@ -122,8 +122,6 @@ copy_file_path (grub_efi_file_path_device_path_t *fp, + if (*p == '/') + *p = '\\'; + +- /* File Path is NULL terminated */ +- fp->path_name[size++] = '\0'; + fp->header.length = size * sizeof (grub_efi_char16_t) + sizeof (*fp); + } + +@@ -158,10 +156,8 @@ make_file_path (grub_efi_device_path_t *dp, const char *filename) + d = GRUB_EFI_NEXT_DEVICE_PATH (d); + } + +- /* File Path is NULL terminated. Allocate space for 2 extra characters */ +- /* FIXME why we split path in two components? */ + file_path = grub_malloc (size +- + ((grub_strlen (dir_start) + 2) ++ + ((grub_strlen (dir_start) + 1) + * GRUB_MAX_UTF16_PER_UTF8 + * sizeof (grub_efi_char16_t)) + + sizeof (grub_efi_file_path_device_path_t) * 2); +-- +2.6.6 + diff --git a/grub2-commands-introduce-read_file-subcommand.patch b/grub2-commands-introduce-read_file-subcommand.patch new file mode 100644 index 0000000..a82ebbc --- /dev/null +++ b/grub2-commands-introduce-read_file-subcommand.patch @@ -0,0 +1,70 @@ +From: Raymund Will +Subject: Introduce a 'read_file' sub-command. +References: bsc#892852, bsc#891946 +Patch-Mainline: not yet + +Needed to allow s390x-emu to be telecontrolled via LOADPARM. +--- + grub-core/commands/read.c | 34 ++++++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +--- a/grub-core/commands/read.c ++++ b/grub-core/commands/read.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -77,16 +78,49 @@ grub_cmd_read (grub_command_t cmd __attr + return 0; + } + ++static grub_err_t ++grub_cmd_read_from_file (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) ++{ ++ char *line; ++ int i = 0; ++ grub_file_t file; ++ ++ if (argc < 1) ++ 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++]); ++ if (! file) ++ return grub_errno; ++ while ( i < argc ) ++ { ++ line = grub_file_getline (file); ++ if ( !line ) ++ break; ++ grub_env_set (args[i++], line); ++ grub_free (line); ++ } ++ grub_file_close (file); ++ if (i != argc) ++ return GRUB_ERR_OUT_OF_RANGE; ++ return 0; ++} ++ + static grub_command_t cmd; ++static grub_command_t cme; + + GRUB_MOD_INIT(read) + { + cmd = grub_register_command ("read", grub_cmd_read, + N_("[ENVVAR]"), + N_("Set variable with user input.")); ++ cme = grub_register_command ("read_file", grub_cmd_read_from_file, ++ N_("FILE ENVVAR [...]"), ++ N_("Set variable(s) with line(s) from FILE.")); + } + + GRUB_MOD_FINI(read) + { + grub_unregister_command (cmd); ++ grub_unregister_command (cme); + } diff --git a/grub2-efi-chainload-harder.patch b/grub2-efi-chainload-harder.patch new file mode 100644 index 0000000..b1557cf --- /dev/null +++ b/grub2-efi-chainload-harder.patch @@ -0,0 +1,103 @@ +--- + grub-core/loader/efi/chainloader.c | 62 +++++++++++++++++++++---------------- + 1 file changed, 36 insertions(+), 26 deletions(-) + +Index: grub-2.02~beta2/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 +@@ -326,40 +326,41 @@ grub_secure_mode (void) + static grub_efi_boolean_t + read_header (void *data, grub_efi_uint32_t size, pe_coff_loader_image_context_t *context) + { +- grub_efi_guid_t guid = SHIM_LOCK_GUID; +- grub_efi_shim_lock_t *shim_lock; +- grub_efi_status_t status; +- +- shim_lock = grub_efi_locate_protocol (&guid, NULL); ++ char *msdos = (char *)data; ++ struct grub_pe32_header_no_msdos_stub *pe32 = (struct grub_pe32_header_no_msdos_stub *)data; + +- if (!shim_lock) ++ if (size < sizeof (*pe32)) + { +- grub_error (GRUB_ERR_BAD_ARGUMENT, "no shim lock protocol"); ++ grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid image"); + return 0; + } + +- status = shim_lock->context (data, size, context); +- +- if (status == GRUB_EFI_SUCCESS) ++ if (grub_memcmp (msdos, "MZ", 2) == 0) + { +- grub_dprintf ("chain", "context success\n"); +- return 1; ++ grub_uint32_t off = *((grub_uint32_t *) (msdos + 0x3c)); ++ pe32 = (struct grub_pe32_header_no_msdos_stub *) ((char *)data + off); + } + +- switch (status) ++ if (grub_memcmp (pe32->signature, "PE\0\0", 4) != 0 || ++ pe32->coff_header.machine != GRUB_PE32_MACHINE_X86_64 || ++ pe32->optional_header.magic != GRUB_PE32_PE64_MAGIC) + { +- case GRUB_EFI_UNSUPPORTED: +- grub_error (GRUB_ERR_BAD_ARGUMENT, "context error unsupported"); +- break; +- case GRUB_EFI_INVALID_PARAMETER: +- grub_error (GRUB_ERR_BAD_ARGUMENT, "context error invalid parameter"); +- break; +- default: +- grub_error (GRUB_ERR_BAD_ARGUMENT, "context error code"); +- break; ++ grub_error (GRUB_ERR_BAD_ARGUMENT, "Not supported image"); ++ return 0; + } + +- return 0; ++ context->number_of_rva_and_sizes = pe32->optional_header.num_data_directories; ++ context->size_of_headers = pe32->optional_header.header_size; ++ context->image_size = pe32->optional_header.image_size; ++ context->image_address = pe32->optional_header.image_base; ++ context->entry_point = pe32->optional_header.entry_addr; ++ context->reloc_dir = &pe32->optional_header.base_relocation_table; ++ context->sec_dir = &pe32->optional_header.certificate_table; ++ context->number_of_sections = pe32->coff_header.num_sections; ++ context->pe_hdr = pe32; ++ context->first_section = (struct grub_pe32_section_table *)((char *)(&pe32->optional_header) + pe32->coff_header.optional_header_size); ++ ++ return 1; + } + + static void* +@@ -623,6 +624,9 @@ error_exit: + if (buffer) + efi_call_1 (b->free_pool, buffer); + ++ if (grub_errno) ++ grub_print_error (); ++ + return 0; + + } +@@ -845,6 +849,19 @@ grub_cmd_chainloader (grub_command_t cmd + status = efi_call_6 (b->load_image, 0, grub_efi_image_handle, file_path, + boot_image, fsize, + &image_handle); ++#ifdef SUPPORT_SECURE_BOOT ++ if (status == GRUB_EFI_SECURITY_VIOLATION && !grub_secure_mode()) ++ { ++ /* If it failed with security violation while not in secure boot mode, ++ the firmware might be broken. We try to workaround on that by forcing ++ the SB method! (bsc#887793) */ ++ grub_dprintf ("chain", "Possible firmware flaw! Security violation while not in secure boot mode.\n"); ++ grub_file_close (file); ++ grub_loader_set (grub_secureboot_chainloader_boot, ++ grub_secureboot_chainloader_unload, 0); ++ return 0; ++ } ++#endif + if (status != GRUB_EFI_SUCCESS) + { + if (status == GRUB_EFI_OUT_OF_RESOURCES) diff --git a/grub2-emu-4-all.patch b/grub2-emu-4-all.patch new file mode 100644 index 0000000..38ff1ee --- /dev/null +++ b/grub2-emu-4-all.patch @@ -0,0 +1,170 @@ +--- + Makefile.util.def | 10 +++++----- + configure.ac | 1 + + grub-core/Makefile.core.def | 14 +++++--------- + grub-core/osdep/unix/emuconsole.c | 5 +++-- + 4 files changed, 14 insertions(+), 16 deletions(-) + +Index: grub-2.02~rc1/Makefile.util.def +=================================================================== +--- 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; ++ emu_condition = COND_NOT_emu; + }; + + program = { +@@ -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; ++ emu_condition = COND_NOT_emu; + }; + + program = { +@@ -389,7 +389,7 @@ program = { + ldadd = libgrubkern.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 = { +@@ -420,7 +420,7 @@ program = { + ldadd = libgrubkern.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 = { +@@ -1345,7 +1345,7 @@ program = { + ldadd = libgrubkern.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.02~rc1/grub-core/Makefile.core.def +=================================================================== +--- 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; +- emu_condition = COND_NOT_s390x; ++ emu_condition = COND_NOT_emu; + }; + + module = { +@@ -1470,7 +1470,7 @@ module = { + common = gfxmenu/gui_progress_bar.c; + common = gfxmenu/gui_util.c; + common = gfxmenu/gui_string_util.c; +- emu_condition = COND_NOT_s390x; ++ emu_condition = COND_NOT_emu; + }; + + module = { +@@ -1886,13 +1886,13 @@ module = { + name = gfxterm; + common = term/gfxterm.c; + enable = videomodules; +- emu_condition = COND_NOT_s390x; ++ emu_condition = COND_NOT_emu; + }; + + module = { + name = gfxterm_background; + common = term/gfxterm_background.c; +- emu_condition = COND_NOT_s390x; ++ emu_condition = COND_NOT_emu; + }; + + module = { +@@ -2005,9 +2005,7 @@ module = { + enable = i386_pc; + enable = i386_efi; + enable = x86_64_efi; +- enable = emu; + enable = xen; +- emu_condition = COND_NOT_s390x; + }; + + module = { +@@ -2054,7 +2052,7 @@ module = { + module = { + name = gfxterm_menu; + common = tests/gfxterm_menu.c; +- emu_condition = COND_NOT_s390x; ++ emu_condition = COND_NOT_emu; + }; + + module = { +@@ -2205,9 +2203,7 @@ module = { + enable = i386_pc; + enable = i386_efi; + enable = x86_64_efi; +- enable = emu; + enable = xen; +- emu_condition = COND_NOT_s390x; + }; + + module = { +Index: grub-2.02~rc1/configure.ac +=================================================================== +--- 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]) ++AM_CONDITIONAL([COND_NOT_emu], [test x$platform != xemu]) + 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.02~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; + + #define MAX_LEN 1023 +-#if defined(__s390x__) ++ + static int + dummy (void) + { + return 0; + } +-#endif + #if 0 + static char msg[MAX_LEN+1]; + static void +@@ -128,6 +127,7 @@ readkey (struct grub_term_input *term) + return -1; + } + ++#if defined(__s390x__) + #define NO_KEY ((grub_uint8_t)-1) + static int + readkey_dumb (struct grub_term_input *term) +@@ -158,6 +158,7 @@ readkey_dumb (struct grub_term_input *te + p = c; + return c; + } ++#endif + + static void + grub_dumb_putchar (struct grub_term_output *term, diff --git a/grub2-once b/grub2-once index 9dd6213..3a402c6 100644 --- a/grub2-once +++ b/grub2-once @@ -8,13 +8,151 @@ use strict; my $grub2_dir; my $grub2_reboot; +my $grub2_editenv; my $show_mapped; my $id_name; my @menuentry; +my @enumentry; +my %E; -sub parse_menuentry { +sub dPrint($) { + #print( STDERR @_[0]); +} - my ($parent, $menu) = @_; +sub sh_test($) { + my ( $exp ) = @_; + + dPrint( "?? '$exp' "); + $exp .= " ]" if ( $exp =~ m{^\[.*[^\]]\s*$} ); # gnaaa + #my $t = qx{set -x; $exp}; + my $t = qx{$exp}; + my $ret = $? >> 8; + $ret = ($ret == 0) ? 1 : 0; + dPrint("=> $ret ($t)\n"); + return $ret; +} + +sub read_cfg($$) { + my ($dir, $cfg) = @_; + + my $fh; + my $m = ""; + my $state = 1; # 1 == normal, 010 == if-false, 011 == if-true, 110 == else-false, 111 == else-true + my @State = (); + + if ($dir) { + %E = ( "config_directory" => $dir ); + dPrint("# VE: 'cd'='$dir'\n"); + $dir .= "/"; + if ($> == 0) { + open($fh, "$grub2_editenv - list |") || die "cannot read grub2 environment: $!\n"; + while (<$fh>) { + chomp; + if ( m{^([^\s=]+?)=(.*)$} ) { + my ($k, $v) = ($1, $2); + $v =~ s{^"([^"]*)"$}{$1}; + dPrint("# VE: '$k'='$v'\n"); + $E{$k} = $v; + } + } + close($fh); + } + } + + dPrint("# open($dir$cfg)\n"); + open($fh, "<$dir$cfg") || die "cannot read $cfg in $dir: $!\n"; + + LINE: while ( <$fh> ) { + s{^#.*$}{}; # get rid of trailing comments, + s{\s+$}{}; # trailing whitespace + s{\s*;$}{}; # including semicolons + next if (m{^\s*$}); # and empty lines. + s{^\s*}{ }; # force leading whitespace to one + + dPrint(sprintf("#%d: '%s' [%s]%04b\n", $., $_, join(",",@State), $state)); + if ( m{^ fi$} ) { + $state = pop( @State); + $m .= "$_\n"; + dPrint(sprintf(">FI: [%s]0b%04b\n", join(",",@State), $state)); + next; + } + if ($state & 0b10) { # {if,else}-* + if ( m{^ elif\s+(.*?)\s*; then$} && !($state & 0b1000)) { + if ($state & 0b1) { + $state = 0b110; # else-false + } else { + $state = 0b010 + sh_test( $1); # if-? + dPrint(sprintf("=EI: 0b%03b\n", $state)); + $m .= "$_\n"; + next; + } + } elsif ( m{^ else$} && !($state & 0b1000)) { + if (($state & 0b111) == 0b010) { # in 'if' but neither 'else' nor 'true' + $state = 0b111; # else-true + } else { + $state = 0b110; # else-false + } + $m .= "$_\n"; + dPrint(sprintf("=EL: 0b%03b\n", $state)); + next; + } + } + if ($state & 0b1) { # *-true or normal + dPrint("-I1: $_\n"); + } else { # *-false + dPrint("-I0: $_\n"); + if ( m{^ if (.*?)\s*; then$} ) { + push( @State, $state); + $state = 0b1000; + $m .= "$_\n"; + } + next; + } + + while ( m'(?:[^\\])(\$(?:{([^}]+?)}|([A-Za-z0-9_]+)))' ) { + my ($s, $k1, $k2) = ($1, $2, $3); + my $k = (defined($k1)) ? $k1 : $k2; + dPrint("# VT: '$k'\n"); + if (exists( $E{$k})) { + $s =~ s{([\$\{\}\"])}{\\$1}g; + dPrint("# VB: '$_'\n"); + s{$s}{$E{$k}} || die; + dPrint("# VR: '$_'\n"); + } else { + $s =~ s{([\$\{\}\"])}{\\$1}g; + s{$s}{} || die; + dPrint("# VR: '$_'\n"); + } + } + + if ( m{^ if (.*?)\s*; then$} ) { + push( @State, $state); + $state = 0b010 + sh_test( $1); + dPrint(sprintf("$title" : "$title"; + my $eId = (($pId ne "") ? "$pId>" : "") . $c++; if ($type eq "menuentry") { push @menuentry, $name; + push @enumentry, [$name, $eId]; } elsif ($type eq "submenu") { - &parse_menuentry ($name, $data); + parse_menuentry ($name, $eId, $data); } } } @@ -67,6 +207,7 @@ while () { if ($bl eq "grub2" || $bl eq "grub2-efi") { $grub2_dir = "/boot/grub2"; $grub2_reboot = "/usr/sbin/grub2-reboot"; + $grub2_editenv = "/usr/bin/grub2-editenv"; } last; } @@ -83,26 +224,22 @@ if ($id_name eq "--help" or $id_name eq "-h") die "no grub2_dir" if ($grub2_dir eq ""); -open(MENU, "<$grub2_dir/grub.cfg") || die "cannot read grub.cfg in $grub2_dir: $!\n"; -undef $/; - -while () { - &parse_menuentry ("", $_); -} - -close (MENU); - -if (open(MENU, "<$grub2_dir/custom.cfg")) { - while () { - &parse_menuentry ("", $_); - } - close (MENU); -} +my $m = read_cfg( $grub2_dir, "grub.cfg"); +# Note: only *one* top-level call to parse_menuentry() is possible +# or else it will start again with 0 (and no parent)! +parse_menuentry ("", "", $m); my $ret = ""; my $name = ""; my $id = -1; +if ($id_name eq '--enum') { + foreach my $e (@enumentry) { + printf "%-7s %s\n", $e->[1], $e->[0]; + } + exit 0; +} + if ($id_name eq '--list') { my $c = 0; @@ -151,4 +288,4 @@ if ($show_mapped > 0) { system "$grub2_reboot \"$name\""; enable_restore_grubenv_service; } - + diff --git a/grub2-s390x-04-grub2-install.patch b/grub2-s390x-04-grub2-install.patch index 2847574..80408fa 100644 --- a/grub2-s390x-04-grub2-install.patch +++ b/grub2-s390x-04-grub2-install.patch @@ -41,6 +41,10 @@ V13: * dracut-grub2.sh: provide /boot from above to grub2-emu in chroot. V14: * grub2-zipl-setup: actually remove obsolete kernel/initrds. [bnc#892810] +V15: + * zipl2grub.conf: turn of zipl-prompt and quiescent plymouth. [bsc#898198] +V16: + * dracut-grub2.sh: force read-only '/usr' for kexec. [bsc#932951] --- Makefile.util.def | 39 +++ @@ -52,11 +56,11 @@ V14: include/grub/util/install.h | 4 util/grub-install-common.c | 1 util/grub-install.c | 43 +++ - util/s390x/dracut-grub2.sh.in | 106 ++++++++ + util/s390x/dracut-grub2.sh.in | 110 +++++++++ util/s390x/dracut-module-setup.sh.in | 19 + util/s390x/zipl2grub.conf.in | 26 ++ util/s390x/zipl2grub.pl.in | 424 +++++++++++++++++++++++++++++++++++ - 13 files changed, 698 insertions(+), 4 deletions(-) + 13 files changed, 702 insertions(+), 4 deletions(-) Index: grub-2.02~rc1/Makefile.util.def =================================================================== @@ -86,15 +90,23 @@ Index: grub-2.02~rc1/Makefile.util.def }; program = { -@@ -402,6 +405,7 @@ program = { +@@ -417,6 +420,7 @@ program = { ldadd = libgrubkern.a; ldadd = grub-core/gnulib/libgnu.a; - ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; + ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; + emu_condition = COND_NOT_s390x; }; - program = { -@@ -697,6 +701,38 @@ script = { + data = { +@@ -628,6 +632,7 @@ program = { + common = grub-core/disk/host.c; + + common = util/resolve.c; ++ emu_condition = COND_s390x; + common = grub-core/kern/emu/argp_common.c; + common = grub-core/osdep/init.c; + +@@ -697,6 +702,38 @@ script = { }; script = { @@ -133,7 +145,7 @@ Index: grub-2.02~rc1/Makefile.util.def name = grub-mkconfig_lib; common = util/grub-mkconfig_lib.in; installdir = noinst; -@@ -1292,6 +1328,7 @@ program = { +@@ -1308,6 +1345,7 @@ program = { ldadd = libgrubkern.a; ldadd = grub-core/gnulib/libgnu.a; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; @@ -457,7 +469,7 @@ Index: grub-2.02~rc1/util/s390x/dracut-grub2.sh.in =================================================================== --- /dev/null +++ grub-2.02~rc1/util/s390x/dracut-grub2.sh.in -@@ -0,0 +1,106 @@ +@@ -0,0 +1,110 @@ +#!/bin/sh +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# ex: ts=8 sw=4 sts=4 et filetype=sh @@ -466,12 +478,14 @@ Index: grub-2.02~rc1/util/s390x/dracut-grub2.sh.in +if getargbool 0 initgrub && [ ! -e /grub2skip ] || [ -e /grub2force ]; then + #type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh + checkro() { ++ local tgt="$1" + local dev mp fs opts dc -+ local rofs=false ++ local rofs=true + while read dev mp fs opts dc; do -+ [ "$mp" = "/sysroot" ] || continue ++ [ "$mp" = "$tgt" ] || continue + case ",$opts," in + (*,ro,*) rofs=true;; ++ (*) rofs=false;; + esac + done < /proc/mounts + echo $rofs @@ -513,9 +527,9 @@ Index: grub-2.02~rc1/util/s390x/dracut-grub2.sh.in + bindir=@bindir@ + if [ -e /sysroot$bindir/grub2-emu ]; then + -+ + export TERM=$(getterm) -+ export grub2rofs=$(checkro) ++ export grub2rofs=$(checkro /sysroot) ++ export grub2roufs=$(checkro /sysroot/usr) + export grub2sysfs=$(checkd /sysroot/sys/devices/system/memory) + export grub2procfs=$(checkd /sysroot/proc/self) + export grub2bootfs=$(checkboot) @@ -540,6 +554,7 @@ Index: grub-2.02~rc1/util/s390x/dracut-grub2.sh.in + + CTTY="$CTTY --wait" + $grub2rofs || mount -o remount,ro /sysroot ++ $grub2roufs || mount -o remount,ro /sysroot/usr + $grub2sysfs || mount --bind {,/sysroot}/sys + $grub2procfs || mount --bind {,/sysroot}/proc + $grub2bootfs || mount --bind {,/sysroot}/boot @@ -558,6 +573,7 @@ Index: grub-2.02~rc1/util/s390x/dracut-grub2.sh.in + $grub2bootfs || umount /sysroot/boot + $grub2procfs || umount /sysroot/proc + $grub2sysfs || umount /sysroot/sys ++ $grub2roufs || mount -o remount,rw /sysroot/usr + $grub2rofs || mount -o remount,rw /sysroot + else + info "No $bindir/grub2-emu in /sysroot--trying to proceed without kexec..." @@ -603,7 +619,7 @@ Index: grub-2.02~rc1/util/s390x/zipl2grub.conf.in + target = @zipldir@ + ramdisk = @zipldir@/initrd,0x2000000 + image = @zipldir@/image -+ parameters = "root=@GRUB_DEVICE@ @GRUB_EMU_CONMODE@ @GRUB_CMDLINE_LINUX@ @GRUB_CMDLINE_LINUX_DEFAULT@ initgrub quiet splash=silent " ++ parameters = "root=@GRUB_DEVICE@ @GRUB_EMU_CONMODE@ @GRUB_CMDLINE_LINUX@ @GRUB_CMDLINE_LINUX_DEFAULT@ initgrub quiet splash=silent plymouth.enable=0 " + +[skip-grub2] + target = @zipldir@ @@ -615,7 +631,7 @@ Index: grub-2.02~rc1/util/s390x/zipl2grub.conf.in + target = @zipldir@ + timeout = 16 + default = 1 -+ prompt = 1 ++ prompt = 0 + 1 = grub2 + 2 = skip-grub2 + diff --git a/grub2-s390x-06-loadparm.patch b/grub2-s390x-06-loadparm.patch new file mode 100644 index 0000000..e7c93ad --- /dev/null +++ b/grub2-s390x-06-loadparm.patch @@ -0,0 +1,47 @@ +From: Raymund Will +Subject: Allow s390x-emu to telecontrolled by LOADPARM +References: bsc#892852, bsc#891946 +Patch-Mainline: no + +--- + util/grub.d/00_header.in | 27 +++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) + +Index: grub-2.02~beta3/util/grub.d/00_header.in +=================================================================== +--- grub-2.02~beta3.orig/util/grub.d/00_header.in ++++ grub-2.02~beta3/util/grub.d/00_header.in +@@ -52,6 +52,33 @@ if [ "\${env_block}" ] ; then + fi + + EOF ++if [ "`uname -m`" = "s390x" ]; then ++ cat <' ++ regexp -s 1:z_1 -s 2:z_2 '^([0-9][0-9>]*)\.([0-9][0-9.]*)$' "\$z_gp" ++ if [ ! "\$z_1" -o ! "\$z_2" ]; then break; fi ++ set z_gp="\$z_1>\$z_2" ++ done ++ if [ ! "\$z_gp" ]; then break; fi ++ set next_entry="\$z_gp" ++ unset z_gp ++ unset loadparm ++ break ++done ++EOF ++fi + if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then + cat < 0); +- $msg .= "Usage: $C [-v] [-d] [-f] [-T template] [-z ZIPLDIR]\n"; ++ $msg .= "Usage: $C [-v] [-d] [-f] [-T template] [-z ZIPLDIR] [-i imagepath]\n"; + Panic( $_[0], $msg . "\n"); + } + +@@ -184,6 +187,7 @@ while ( $#ARGV >= 0 ) { + (/^--?help/ || /^-h/) && (Usage(0)); + (/^--zipldir$/ || /^-z$/) && ($zipldir = shift || Usage(2), next); + (/^--template$/ || /^-T$/) && ($in = shift || Usage(3), next); ++ (/^--image$/ || /^-i$/) && ($Image = shift || Usage(5), $force = 1, next); + (/^-/) && (Usage(1)); + Usage(1); + } +@@ -379,11 +383,8 @@ if ( ! $debug ) { + } + + # copy out kernel and initrd +-my $defimage = "/boot/image"; +-my $definitrd = "/boot/initrd"; + my $ziplimage = "$zipldir/image"; + my $ziplinitrd = "$zipldir/initrd"; +-my $Image = "$defimage"; + + if ( ! $running && ! $force ) { + chomp( $running = qx{uname -r}); diff --git a/grub2-s390x-08-workaround-part-to-disk.patch b/grub2-s390x-08-workaround-part-to-disk.patch new file mode 100644 index 0000000..d93cf8a --- /dev/null +++ b/grub2-s390x-08-workaround-part-to-disk.patch @@ -0,0 +1,15 @@ +Index: grub-2.02~beta2/grub-core/osdep/linux/getroot.c +=================================================================== +--- grub-2.02~beta2.orig/grub-core/osdep/linux/getroot.c ++++ grub-2.02~beta2/grub-core/osdep/linux/getroot.c +@@ -713,6 +713,10 @@ grub_util_part_to_disk (const char *os_d + if (! realpath (os_dev, path)) + return NULL; + ++#ifdef __s390x__ ++ return path; ++#endif ++ + if (strncmp ("/dev/", path, 5) == 0) + { + char *p = path + 5; diff --git a/grub2.changes b/grub2.changes index 69f714e..6ce2086 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,46 @@ +------------------------------------------------------------------- +Thu Feb 23 15:06:44 UTC 2017 - mchang@suse.com + +- Temporary fix for openQA UEFI USB Boot failure (bsc#1026344) + * 0001-Revert-efi-properly-terminate-filepath-with-NULL-in-.patch + +------------------------------------------------------------------- +Fri Feb 17 06:46:11 UTC 2017 - mchang@suse.com + +- grub2.spec: fix s390x file list. + +------------------------------------------------------------------- +Wed Feb 15 07:25:02 UTC 2017 - mchang@suse.com + +- Merge changes from SLE12 +- add grub2-emu-4-all.patch + * Build 'grub2-emu' wherever possible, to allow a better + implementation of that feature. +- add grub2-s390x-06-loadparm.patch, +- add grub2-commands-introduce-read_file-subcommand.patch: + * allow s390x to telecontrol grub2. (bsc#891946, bsc#892852) +- add grub2-s390x-06-loadparm.patch: + * ignore case and fix transliteration of parameter. (bsc#891946) +- add grub2-s390x-07-add-image-param-for-zipl-setup.patch + * Add --image switch to force zipl update to specific kernel + (bsc#928131) +- add grub2-s390x-08-workaround-part-to-disk.patch + * Ignore partition tables on s390x. (bsc#935127) +- add grub2-efi-chainload-harder.patch: + * allow XEN to be chain-loaded despite firmware flaws. (bnc#887793) + * Do not use shim lock protocol for reading pe header, it won't be + available when secure boot disabled (bsc#943380) + * Make firmware flaw condition be more precisely detected and add + debug message for the case + * Check msdos header to find PE file header (bsc#954126) +- grub2-s390x-04-grub2-install.patch: + * streamline boot to grub menu. (bsc#898198) + * Force '/usr' to read-only before calling kexec. (bsc#932951) +- grub2-once: + * add '--enum' option to enumerate boot-entries in a way + actually understood by 'grub2'. (bsc#892852, bsc#892811) + * Examine variables from grub environment in 'grub2-once'. (fate#319632) + ------------------------------------------------------------------- Fri Feb 10 17:58:22 UTC 2017 - arvidjaar@gmail.com diff --git a/grub2.spec b/grub2.spec index ca197f8..649d09c 100644 --- a/grub2.spec +++ b/grub2.spec @@ -64,9 +64,14 @@ BuildRequires: update-bootloader-rpm-macros # Modules code is dynamically loaded and collected from a _fixed_ path. %define _libdir %{_exec_prefix}/lib +# Build grub2-emu everywhere (it may be "required" by 'grub2-once') +%define emu 1 + %ifarch ppc ppc64 ppc64le %define grubcpu powerpc %define platform ieee1275 +# emu does not build here yet... :-( +%define emu 0 %endif %ifarch %{ix86} x86_64 @@ -84,15 +89,18 @@ BuildRequires: update-bootloader-rpm-macros %define platform uboot %endif +%ifarch aarch64 +%define grubcpu arm64 +%define platform efi +%define only_efi 1 +%endif + %define grubarch %{grubcpu}-%{platform} # build efi bootloader on some platforms only: %if ! 0%{?efi:1} %global efi %{ix86} x86_64 ia64 aarch64 %{arm} %endif -%ifarch aarch64 -%define only_efi 1 -%endif %ifarch %{efi} %ifarch %{ix86} @@ -118,6 +126,11 @@ BuildRequires: update-bootloader-rpm-macros %define grubxenarch x86_64-xen %endif +%if %{platform} == emu +# force %{emu} to 1, e.g. for s390 +%define emu 1 +%endif + %if 0%{?suse_version} == 1110 %define only_efi %{nil} %define only_x86_64 %{nil} @@ -187,6 +200,13 @@ 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 +Patch78: grub2-commands-introduce-read_file-subcommand.patch +Patch79: grub2-efi-chainload-harder.patch +Patch80: grub2-emu-4-all.patch +Patch81: 0001-Revert-efi-properly-terminate-filepath-with-NULL-in-.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 @@ -280,6 +300,7 @@ Requires: %{name} = %{version}-%{release} %description branding-upstream Upstream branding for GRUB2's graphical console +%if ! 0%{?only_efi:1} %package %{grubarch} Summary: Bootloader with support for Linux, Multiboot and more @@ -309,6 +330,8 @@ bootloader with modular architecture. It supports rich variety of kernel format file systems, computer architectures and hardware devices. This subpackage provides support for %{platform} systems. +%endif + %ifarch %{efi} %package %{grubefiarch} @@ -433,6 +456,13 @@ swap partition while in resuming %patch71 -p1 %patch72 -p1 %patch74 -p1 +%patch75 -p1 +%patch76 -p1 +%patch77 -p1 +%patch78 -p1 +%patch79 -p1 +%patch80 -p1 +%patch81 -p1 %patch101 -p1 %patch102 -p1 %patch103 -p1 @@ -487,6 +517,9 @@ mkdir build-efi %ifarch %{ix86} x86_64 mkdir build-xen %endif +%if %{emu} +mkdir build-emu +%endif %build # autogen calls autoreconf -vi @@ -502,6 +535,28 @@ CXXFLAGS=" " FFLAGS=" " export CFLAGS CXXFLAGS FFLAGS +%if %{emu} +cd build-emu +%define arch_specific --enable-device-mapper --disable-grub-mount +TFLAGS="-fPIC" + +# -static is needed so that autoconf script is able to link +# test that looks for _start symbol on 64 bit platforms +../configure TARGET_LDFLAGS=$TFLAGS \ + --prefix=%{_prefix} \ + --sysconfdir=%{_sysconfdir} \ + --target=%{_target_platform} \ + --with-platform=emu \ + %{arch_specific} \ + --program-transform-name=s,grub,%{name}, +make %{?_smp_mflags} +cd .. +if [ "%{platform}" = "emu" ]; then + rmdir build + mv build-emu build +fi +%endif + %ifarch %{ix86} x86_64 cd build-xen ../configure \ @@ -593,13 +648,9 @@ cd build %define _target_platform i386-%{_vendor}-%{_target_os}%{?_gnu} %endif -%ifarch s390x -%define arch_specific --enable-device-mapper --disable-grub-mount -TFLAGS="-fPIC" -%else +%if %{platform} != "emu" %define arch_specific --enable-device-mapper TFLAGS="-static" -%endif # -static is needed so that autoconf script is able to link # test that looks for _start symbol on 64 bit platforms @@ -612,6 +663,8 @@ TFLAGS="-static" --program-transform-name=s,grub,%{name}, make %{?_smp_mflags} %endif +cd .. +%endif %install @@ -651,10 +704,17 @@ cd .. %if ! 0%{?only_efi:1} cd build make DESTDIR=$RPM_BUILD_ROOT install -%else -cd build-efi +cd .. %endif +if [ -d build-emu/grub-core ]; then + cd build-emu/grub-core + install -m 755 grub-emu $RPM_BUILD_ROOT%{_bindir}/%{name}-emu + install -m 755 grub-emu-lite $RPM_BUILD_ROOT%{_bindir}/%{name}-emu-lite + install -m 644 grub-emu.1 $RPM_BUILD_ROOT%{_mandir}/man1/%{name}-emu.1 + cd ../.. +fi + # *.module files are installed with executable bits due to the way grub2 build # system works. Clear executable bits to not confuse find-debuginfo.sh find $RPM_BUILD_ROOT%{_libdir}/%{name} \ @@ -878,16 +938,11 @@ if [ $1 = 0 ]; then fi %endif fi -%if 0%{?only_efi:1} -%define source_dir build-efi -%else -%define source_dir build -%endif %postun %service_del_postun grub2-once.service -%files -f %{source_dir}/%{name}.lang +%files -f %{name}.lang %defattr(-,root,root,-) %doc COPYING NEWS README %doc THANKS TODO ChangeLog @@ -917,7 +972,6 @@ fi %{_bindir}/%{name}-editenv %{_bindir}/%{name}-file %{_bindir}/%{name}-fstest -%{_bindir}/%{name}-glue-efi %{_bindir}/%{name}-kbdcomp %{_bindir}/%{name}-menulst2cfg %{_bindir}/%{name}-mkfont @@ -930,6 +984,7 @@ fi %{_bindir}/%{name}-mkstandalone %{_bindir}/%{name}-render-label %{_bindir}/%{name}-script-check +%{_bindir}/%{name}-syslinux2cfg %if 0%{?has_systemd:1} %{_unitdir}/grub2-once.service %endif @@ -945,7 +1000,6 @@ fi %{_mandir}/man1/%{name}-editenv.1.* %{_mandir}/man1/%{name}-file.1.* %{_mandir}/man1/%{name}-fstest.1.* -%{_mandir}/man1/%{name}-glue-efi.1.* %{_mandir}/man1/%{name}-kbdcomp.1.* %{_mandir}/man1/%{name}-menulst2cfg.1.* %{_mandir}/man1/%{name}-mkfont.1.* @@ -958,29 +1012,30 @@ fi %{_mandir}/man1/%{name}-mkstandalone.1.* %{_mandir}/man1/%{name}-render-label.1.* %{_mandir}/man1/%{name}-script-check.1.* +%{_mandir}/man1/%{name}-syslinux2cfg.1.* %{_mandir}/man8/%{name}-install.8.* %{_mandir}/man8/%{name}-mkconfig.8.* %{_mandir}/man8/%{name}-probe.8.* %{_mandir}/man8/%{name}-reboot.8.* %{_mandir}/man8/%{name}-set-default.8.* -%ifarch s390x -%{_bindir}/%{name}-emu -%{_bindir}/%{name}-emu-lite +%if %{emu} +%{_bindir}/%{name}-emu* %{_mandir}/man1/%{name}-emu.1.* -%else +%endif +%ifnarch s390x %config %{_sysconfdir}/grub.d/30_os-prober +%{_bindir}/%{name}-glue-efi %{_bindir}/%{name}-mount -%{_bindir}/%{name}-syslinux2cfg %{_sbindir}/%{name}-bios-setup %{_sbindir}/%{name}-macbless %{_sbindir}/%{name}-ofpathname %{_sbindir}/%{name}-sparc64-setup +%{_mandir}/man1/%{name}-glue-efi.1.* %{_mandir}/man1/%{name}-mount.1.* %{_mandir}/man8/%{name}-bios-setup.8.* %{_mandir}/man8/%{name}-macbless.8.* %{_mandir}/man8/%{name}-ofpathname.8.* %{_mandir}/man8/%{name}-sparc64-setup.8.* -%{_mandir}/man1/%{name}-syslinux2cfg.1.* %endif %files branding-upstream From 116fc0275164931b1279c19168605ddffdc0f9a865b1efcd1a845ac3acd7f508 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Sun, 5 Mar 2017 16:58:46 +0000 Subject: [PATCH 02/57] Accepting request 462013 from Base:System Redo merge (forwarded request 461950 from michals) OBS-URL: https://build.opensuse.org/request/show/462013 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=156 --- ...rly-terminate-filepath-with-NULL-in-.patch | 39 ------------------ ...nal-NULL-from-File-Path-in-grub_efi_.patch | 41 +++++++++++++++++++ grub2.changes | 12 ++++++ grub2.spec | 14 ++----- 4 files changed, 56 insertions(+), 50 deletions(-) delete mode 100644 0001-Revert-efi-properly-terminate-filepath-with-NULL-in-.patch create mode 100644 0001-efi-strip-off-final-NULL-from-File-Path-in-grub_efi_.patch diff --git a/0001-Revert-efi-properly-terminate-filepath-with-NULL-in-.patch b/0001-Revert-efi-properly-terminate-filepath-with-NULL-in-.patch deleted file mode 100644 index 0d7ab44..0000000 --- a/0001-Revert-efi-properly-terminate-filepath-with-NULL-in-.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 28f83642deb777cce122c3629ddbd7b44a7f95b4 Mon Sep 17 00:00:00 2001 -From: Michael Chang -Date: Thu, 23 Feb 2017 22:39:37 +0800 -Subject: [PATCH] Revert "efi: properly terminate filepath with NULL in - chainloader" - -This reverts commit ce95549cc54b5d6f494608a7c390dba3aab4fba7. ---- - grub-core/loader/efi/chainloader.c | 6 +----- - 1 file changed, 1 insertion(+), 5 deletions(-) - -diff --git a/grub-core/loader/efi/chainloader.c b/grub-core/loader/efi/chainloader.c -index adc8563..522a716 100644 ---- a/grub-core/loader/efi/chainloader.c -+++ b/grub-core/loader/efi/chainloader.c -@@ -122,8 +122,6 @@ copy_file_path (grub_efi_file_path_device_path_t *fp, - if (*p == '/') - *p = '\\'; - -- /* File Path is NULL terminated */ -- fp->path_name[size++] = '\0'; - fp->header.length = size * sizeof (grub_efi_char16_t) + sizeof (*fp); - } - -@@ -158,10 +156,8 @@ make_file_path (grub_efi_device_path_t *dp, const char *filename) - d = GRUB_EFI_NEXT_DEVICE_PATH (d); - } - -- /* File Path is NULL terminated. Allocate space for 2 extra characters */ -- /* FIXME why we split path in two components? */ - file_path = grub_malloc (size -- + ((grub_strlen (dir_start) + 2) -+ + ((grub_strlen (dir_start) + 1) - * GRUB_MAX_UTF16_PER_UTF8 - * sizeof (grub_efi_char16_t)) - + sizeof (grub_efi_file_path_device_path_t) * 2); --- -2.6.6 - diff --git a/0001-efi-strip-off-final-NULL-from-File-Path-in-grub_efi_.patch b/0001-efi-strip-off-final-NULL-from-File-Path-in-grub_efi_.patch new file mode 100644 index 0000000..101e2ed --- /dev/null +++ b/0001-efi-strip-off-final-NULL-from-File-Path-in-grub_efi_.patch @@ -0,0 +1,41 @@ +From 892dfbe113d08c18e51d7c27eee5094f3da530ec Mon Sep 17 00:00:00 2001 +From: Andrei Borzenkov +Date: Sat, 25 Feb 2017 08:39:38 +0300 +Subject: [PATCH] efi: strip off final NULL from File Path in + grub_efi_get_filename + +UEFI 2.6 9.3.6.4 File Path Media Device Path says that Path Name is +"A NULL-terminated Path string including directory and file names". + +Strip final NULL from Path Name in each File Path node when constructing +full path. To be on safe side, strip all of them. + +Fixes failure chainloading grub from grub, when loaded grub truncates +image path and does not find its grub.cfg. + +https://bugzilla.opensuse.org/show_bug.cgi?id=1026344 + +This was triggered by commit ce95549cc54b5d6f494608a7c390dba3aab4fba7; +before it we built Path Name without trailing NULL, and apparently all +other bootloaders use single File Path node, thus not exposing this bug. +--- + grub-core/kern/efi/efi.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c +index caf9bcc..d467785 100644 +--- a/grub-core/kern/efi/efi.c ++++ b/grub-core/kern/efi/efi.c +@@ -366,6 +366,9 @@ grub_efi_get_filename (grub_efi_device_path_t *dp0) + len = ((GRUB_EFI_DEVICE_PATH_LENGTH (dp) - 4) + / sizeof (grub_efi_char16_t)); + fp = (grub_efi_file_path_device_path_t *) dp; ++ /* According to EFI spec Path Name is NULL terminated */ ++ while (len > 0 && fp->path_name[len - 1] == 0) ++ len--; + + p = (char *) grub_utf16_to_utf8 ((unsigned char *) p, fp->path_name, len); + } +-- +2.6.6 + diff --git a/grub2.changes b/grub2.changes index 6ce2086..c9f724d 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Wed Mar 1 10:29:46 UTC 2017 - mchang@suse.com + +- Fix for openQA UEFI USB Boot failure with upstream patch (bsc#1026344) + * added 0001-efi-strip-off-final-NULL-from-File-Path-in-grub_efi_.patch + * removed 0001-Revert-efi-properly-terminate-filepath-with-NULL-in-.patch + ------------------------------------------------------------------- Thu Feb 23 15:06:44 UTC 2017 - mchang@suse.com @@ -9,6 +16,11 @@ Fri Feb 17 06:46:11 UTC 2017 - mchang@suse.com - grub2.spec: fix s390x file list. +------------------------------------------------------------------- +Thu Feb 16 12:55:29 UTC 2017 - msuchanek@suse.com + +- require efibootmgr in efi package (boo#1025520) + ------------------------------------------------------------------- Wed Feb 15 07:25:02 UTC 2017 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 649d09c..99af5f7 100644 --- a/grub2.spec +++ b/grub2.spec @@ -206,7 +206,7 @@ Patch77: grub2-s390x-08-workaround-part-to-disk.patch Patch78: grub2-commands-introduce-read_file-subcommand.patch Patch79: grub2-efi-chainload-harder.patch Patch80: grub2-emu-4-all.patch -Patch81: 0001-Revert-efi-properly-terminate-filepath-with-NULL-in-.patch +Patch81: 0001-efi-strip-off-final-NULL-from-File-Path-in-grub_efi_.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 @@ -337,19 +337,11 @@ provides support for %{platform} systems. %package %{grubefiarch} Summary: Bootloader with support for Linux, Multiboot and more +# Require efibootmgr +# Without it grub-install is broken so break the package as well if unavailable Group: System/Boot -%ifarch ia64 x86_64 aarch64 -#Package is available on ia64, x86_64 and aarch64 only and not necessarily needed Requires: efibootmgr Requires(post): efibootmgr -%endif -# Also require efibootmgr on i586 Tumbleweed where it is available -%if 0%{?suse_version} > 1320 -%ifarch i586 -Requires: efibootmgr -Requires(post): efibootmgr -%endif -%endif Requires: %{name} = %{version}-%{release} Requires(post): %{name} = %{version}-%{release} %if 0%{?update_bootloader_requires:1} From de5854a4125a933f8eb9a87e99fb40018483c86bebbb0cdae3eb87c6bbb07940 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Sat, 11 Mar 2017 14:18:48 +0000 Subject: [PATCH 03/57] Accepting request 477883 from Base:System 1 OBS-URL: https://build.opensuse.org/request/show/477883 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=157 --- 0001-tpm-Core-TPM-support.patch | 785 ++++++++++++++++++ 0002-tpm-Measure-kernel-initrd.patch | 39 + 0003-tpm-Add-BIOS-boot-measurement.patch | 179 ++++ 0004-tpm-Rework-linux-command.patch | 104 +++ 0005-tpm-Rework-linux16-command.patch | 101 +++ ...re-kernel-and-initrd-on-BIOS-systems.patch | 84 ++ 0007-tpm-Measure-the-kernel-commandline.patch | 43 + 0008-tpm-Measure-commands.patch | 60 ++ ...Measure-multiboot-images-and-modules.patch | 73 ++ 0010-tpm-Fix-boot-when-there-s-no-TPM.patch | 29 + 0011-tpm-Fix-build-error.patch | 74 ++ 0012-tpm-Build-tpm-as-module.patch | 505 +++++++++++ grub2-efi-xen-cfg-unquote.patch | 92 ++ ...ix-multi-device-root-kernel-argument.patch | 44 - grub2-linuxefi-fix-boot-params.patch | 20 + grub2.changes | 30 + grub2.spec | 50 +- 17 files changed, 2258 insertions(+), 54 deletions(-) create mode 100644 0001-tpm-Core-TPM-support.patch create mode 100644 0002-tpm-Measure-kernel-initrd.patch create mode 100644 0003-tpm-Add-BIOS-boot-measurement.patch create mode 100644 0004-tpm-Rework-linux-command.patch create mode 100644 0005-tpm-Rework-linux16-command.patch create mode 100644 0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch create mode 100644 0007-tpm-Measure-the-kernel-commandline.patch create mode 100644 0008-tpm-Measure-commands.patch create mode 100644 0009-tpm-Measure-multiboot-images-and-modules.patch create mode 100644 0010-tpm-Fix-boot-when-there-s-no-TPM.patch create mode 100644 0011-tpm-Fix-build-error.patch create mode 100644 0012-tpm-Build-tpm-as-module.patch create mode 100644 grub2-efi-xen-cfg-unquote.patch delete mode 100644 grub2-fix-multi-device-root-kernel-argument.patch create mode 100644 grub2-linuxefi-fix-boot-params.patch diff --git a/0001-tpm-Core-TPM-support.patch b/0001-tpm-Core-TPM-support.patch new file mode 100644 index 0000000..103b6cf --- /dev/null +++ b/0001-tpm-Core-TPM-support.patch @@ -0,0 +1,785 @@ +From 866eb2103187d84f2e02c262cfdd1a388acfec15 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include + #include ++#include + + /* 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++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 ++#include ++#include ++#include ++#include ++#include ++ ++#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, ®s); ++ ++ 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, ®s); ++ ++ 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, ®s); ++ ++ 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 ++#include ++#include ++#include ++#include ++#include ++ ++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 . ++ */ ++ ++#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 . ++ */ ++ ++#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 diff --git a/0002-tpm-Measure-kernel-initrd.patch b/0002-tpm-Measure-kernel-initrd.patch new file mode 100644 index 0000000..c865b07 --- /dev/null +++ b/0002-tpm-Measure-kernel-initrd.patch @@ -0,0 +1,39 @@ +From b3afe6ad07192d3f38875e30b57a785ac3b1ea27 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include + #include ++#include + + 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]); diff --git a/0003-tpm-Add-BIOS-boot-measurement.patch b/0003-tpm-Add-BIOS-boot-measurement.patch new file mode 100644 index 0000000..21ce113 --- /dev/null +++ b/0003-tpm-Add-BIOS-boot-measurement.patch @@ -0,0 +1,179 @@ +From e12373683b894f22c2e35dc3732440a4e9053d61 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include + ++#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 + diff --git a/0004-tpm-Rework-linux-command.patch b/0004-tpm-Rework-linux-command.patch new file mode 100644 index 0000000..d92c325 --- /dev/null +++ b/0004-tpm-Rework-linux-command.patch @@ -0,0 +1,104 @@ +From 9f12cf163e56d3b5f03c8a5da94dc501032312eb Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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~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 +@@ -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 (&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); + diff --git a/0005-tpm-Rework-linux16-command.patch b/0005-tpm-Rework-linux16-command.patch new file mode 100644 index 0000000..d97a195 --- /dev/null +++ b/0005-tpm-Rework-linux16-command.patch @@ -0,0 +1,101 @@ +From f8f66cdcb66dba05353887b3be0d715d54efdea8 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + diff --git a/0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch b/0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch new file mode 100644 index 0000000..9148a83 --- /dev/null +++ b/0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch @@ -0,0 +1,84 @@ +From f0b411214ccc309f2f126d558e2777469d538ca2 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include + #include ++#include + + 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 + #include + #include ++#include + + 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 + #include + #include ++#include + + 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) diff --git a/0007-tpm-Measure-the-kernel-commandline.patch b/0007-tpm-Measure-the-kernel-commandline.patch new file mode 100644 index 0000000..87e0056 --- /dev/null +++ b/0007-tpm-Measure-the-kernel-commandline.patch @@ -0,0 +1,43 @@ +From aa88827e5b6ca073d0a67e86c5d6581445de988b Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include ++#include + + 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 + diff --git a/0008-tpm-Measure-commands.patch b/0008-tpm-Measure-commands.patch new file mode 100644 index 0000000..607b0b3 --- /dev/null +++ b/0008-tpm-Measure-commands.patch @@ -0,0 +1,60 @@ +From 959e235378adef1477d14d7546c549b7619eb5f1 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #endif ++#include + + /* 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; diff --git a/0009-tpm-Measure-multiboot-images-and-modules.patch b/0009-tpm-Measure-multiboot-images-and-modules.patch new file mode 100644 index 0000000..293fd0d --- /dev/null +++ b/0009-tpm-Measure-multiboot-images-and-modules.patch @@ -0,0 +1,73 @@ +From fd82340829d9fce685f80163ddb6ee3399929c3c Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include + #include ++#include + + #ifdef GRUB_MACHINE_EFI + #include +@@ -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 + #include + #include ++#include + + 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 + #include + #include ++#include + + #if defined (GRUB_MACHINE_EFI) + #include +@@ -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) diff --git a/0010-tpm-Fix-boot-when-there-s-no-TPM.patch b/0010-tpm-Fix-boot-when-there-s-no-TPM.patch new file mode 100644 index 0000000..d10fd00 --- /dev/null +++ b/0010-tpm-Fix-boot-when-there-s-no-TPM.patch @@ -0,0 +1,29 @@ +From c9016d2ae0abc5edcb4dcf4b1ce04f138f6e5a67 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + diff --git a/0011-tpm-Fix-build-error.patch b/0011-tpm-Fix-build-error.patch new file mode 100644 index 0000000..41542c9 --- /dev/null +++ b/0011-tpm-Fix-build-error.patch @@ -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, diff --git a/0012-tpm-Build-tpm-as-module.patch b/0012-tpm-Build-tpm-as-module.patch new file mode 100644 index 0000000..d95d9c3 --- /dev/null +++ b/0012-tpm-Build-tpm-as-module.patch @@ -0,0 +1,505 @@ +From 54b6ba5f27dd9eb9ec2f1a41e7160964ab94451c Mon Sep 17 00:00:00 2001 +From: Michael Chang +Date: Wed, 23 Nov 2016 16:52:16 +0800 +Subject: [PATCH 11/11] Build tpm as module + +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. + +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.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 + #include + ++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 + #include + #include ++#include + +-#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 + #include + ++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; + static int add_rs_codes = 1; ++static int suse_enable_tpm = 0; + + enum + { +@@ -106,6 +107,7 @@ enum + OPTION_DISK_MODULE, + OPTION_NO_BOOTSECTOR, + OPTION_NO_RS_CODES, ++ OPTION_SUSE_ENABLE_TPM, + OPTION_MACPPC_DIRECTORY, + OPTION_ZIPL_DIRECTORY, + OPTION_LABEL_FONT, +@@ -231,6 +233,10 @@ argp_parser (int key, char *arg, struct + add_rs_codes = 0; + return 0; + ++ case OPTION_SUSE_ENABLE_TPM: ++ suse_enable_tpm = 1; ++ return 0; ++ + case OPTION_DEBUG: + verbosity++; + return 0; +@@ -292,6 +298,7 @@ static struct argp_option options[] = { + {"no-rs-codes", OPTION_NO_RS_CODES, 0, 0, + N_("Do not apply any reed-solomon codes when embedding core.img. " + "This option is only available on x86 BIOS targets."), 0}, ++ {"suse-enable-tpm", OPTION_SUSE_ENABLE_TPM, 0, 0, N_("install TPM modules"), 0}, + + {"debug", OPTION_DEBUG, 0, OPTION_HIDDEN, 0, 2}, + {"no-floppy", OPTION_NO_FLOPPY, 0, OPTION_HIDDEN, 0, 2}, +@@ -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 && (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; diff --git a/grub2-efi-xen-cfg-unquote.patch b/grub2-efi-xen-cfg-unquote.patch new file mode 100644 index 0000000..907e2f5 --- /dev/null +++ b/grub2-efi-xen-cfg-unquote.patch @@ -0,0 +1,92 @@ +From: Petr Tesarik +Subject: Unquote parameters written to Xen EFI config file +References: bsc#900418 +Patch-mainline: not yet + +The GRUB_CMDLINE_* value is copied verbatim to grub.conf, so it is first +parsed by GRUB2 before being passed down to the kernel. OTOH Xen EFI loader +takes the config file options verbatim. This means that any special GRUB2 +syntax must be evaluated when generating that file. + +Of course, some things are not even possible (e.g. substituting GRUB runtime +variables), but let's call them known limitations. + +Signed-off-by: Petr Tesarik + +--- + util/grub.d/20_linux_xen.in | 54 ++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 52 insertions(+), 2 deletions(-) + +Index: grub-2.02~rc1/util/grub.d/20_linux_xen.in +=================================================================== +--- grub-2.02~rc1.orig/util/grub.d/20_linux_xen.in ++++ grub-2.02~rc1/util/grub.d/20_linux_xen.in +@@ -122,6 +122,52 @@ else + is_efi=false + fi + ++grub2_unquote () ++{ ++ awk ' ++ BEGIN { ++ bare = "[^{}|&$;<> \t\n'\''\"\\\\]+" ++ esc = "\\\\." ++ id = "[[:alpha:]_][[:alnum:]_]*|[[:digit:]]+|[?#*@]" ++ var = "\\$("id")|\\$\\{("id")\\}" ++ dqesc = "\\\\[$\"\\\\]" ++ dqstr = "\\$?\"([^\"]|"var"|"dqesc")*\"" ++ sqstr = "'\''[^'\'']*'\''" ++ pat = bare"|"esc"|"var"|"dqstr"|"sqstr ++ ORS = "" ++ } ++ { ++ patsplit($0, words, pat, sep) ++ print sep[0] ++ for (i in words) { ++ w = words[i] ++ if (w ~ /^\$?\"/) { ++ # Double-quoted string ++ patsplit(w, segs, var"|"dqesc, ssep) ++ print ssep[0] ++ for (j in segs) { ++ if (segs[j] ~ /^\\/) ++ print substr(segs[j], 2) ++ print ssep[j] ++ } ++ } else if (w ~ /^'\''/) { ++ # Single-quoted string ++ print substr(w, 2, length(w)-2) ++ } else if (w ~ /^\\/) { ++ # Escape sequence ++ print substr(w, 2) ++ } else if (w ~ /^\$/) { ++ # Variable expansion ++ } else { ++ # Bare word ++ print w ++ } ++ print sep[i] ++ } ++ print "\n" ++ }' ++} ++ + linux_entry () + { + os="$1" +@@ -174,11 +220,13 @@ linux_entry () + else + section="failsafe.$section_count" + fi ++ xen_args_unq=$(echo $xen_args | grub2_unquote) ++ args_unq=$(echo $args | grub2_unquote) + cat <<-EOF >> $grub_dir/$xen_cfg + + [$section] +- options=${xen_args} +- kernel=${basename} root=${linux_root_device_thisversion} ${args} ++ options=${xen_args_unq} ++ kernel=${basename} root=${linux_root_device_thisversion} ${args_unq} + ramdisk=${initrd} + EOF + message="$(gettext_printf "Loading Xen %s with Linux %s ..." ${xen_version} ${version})" diff --git a/grub2-fix-multi-device-root-kernel-argument.patch b/grub2-fix-multi-device-root-kernel-argument.patch deleted file mode 100644 index 65a93bf..0000000 --- a/grub2-fix-multi-device-root-kernel-argument.patch +++ /dev/null @@ -1,44 +0,0 @@ -Index: grub-2.02~beta2/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 -@@ -45,12 +45,14 @@ esac - - # btrfs may reside on multiple devices. We cannot pass them as value of root= parameter - # and mounting btrfs requires user space scanning, so force UUID in this case. --if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ -+if ( [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ - || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ -- || ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then -+ || uses_abstraction "${GRUB_DEVICE}" lvm ) && test -e "${GRUB_DEVICE}"; then - LINUX_ROOT_DEVICE=${GRUB_DEVICE} - else -- LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} -+ if [ "x${GRUB_DEVICE_UUID}" != "x" ]; then -+ LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} -+ fi - fi - - if [ "x$GRUB_CONMODE" != "x" ]; then -Index: grub-2.02~beta2/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 -@@ -55,12 +55,14 @@ esac - - # btrfs may reside on multiple devices. We cannot pass them as value of root= parameter - # and mounting btrfs requires user space scanning, so force UUID in this case. --if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ -+if ( [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ - || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ -- || ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then -+ || uses_abstraction "${GRUB_DEVICE}" lvm ) && test -e "${GRUB_DEVICE}"; then - LINUX_ROOT_DEVICE=${GRUB_DEVICE} - else -- LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} -+ if [ "x${GRUB_DEVICE_UUID}" != "x" ]; then -+ LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} -+ fi - fi - - # Allow overriding GRUB_CMDLINE_LINUX and GRUB_CMDLINE_LINUX_DEFAULT. diff --git a/grub2-linuxefi-fix-boot-params.patch b/grub2-linuxefi-fix-boot-params.patch new file mode 100644 index 0000000..32a3372 --- /dev/null +++ b/grub2-linuxefi-fix-boot-params.patch @@ -0,0 +1,20 @@ +Index: grub-2.02~rc1/grub-core/loader/i386/efi/linux.c +=================================================================== +--- grub-2.02~rc1.orig/grub-core/loader/i386/efi/linux.c ++++ grub-2.02~rc1/grub-core/loader/i386/efi/linux.c +@@ -324,7 +324,14 @@ grub_cmd_linux (grub_command_t cmd __att + lh.code32_start = (grub_uint32_t)(grub_addr_t) kernel_mem; + } + +- grub_memcpy(params, &lh, 2 * 512); ++ /* Grub linuxefi erroneously initialize linux's boot_params with non-zero values. (bsc#1025563) ++ ++ From https://www.kernel.org/doc/Documentation/x86/boot.txt: ++ The memory for struct boot_params could be allocated anywhere (even above 4G) ++ and initialized to all zero. ++ Then, the setup header at offset 0x01f1 of kernel image on should be ++ loaded into struct boot_params and examined. */ ++ grub_memcpy (¶ms->setup_sects, &lh.setup_sects, sizeof (lh) - 0x01f1); + + params->type_of_loader = 0x21; + diff --git a/grub2.changes b/grub2.changes index c9f724d..ac951aa 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,33 @@ +------------------------------------------------------------------- +Mon Mar 6 06:34:01 UTC 2017 - mchang@suse.com + +- TPM Support (FATE#315831) + * 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 + * 0012-tpm-Build-tpm-as-module.patch +- grub2.spec : Add grub-tpm.efi for Secure Boot + +------------------------------------------------------------------- +Fri Mar 3 10:26:10 UTC 2017 - mchang@suse.com + +- Fix invalid Xen EFI config files if xen_args include GRUB2 quoting + (bsc#900418) (bsc#951748) + * grub2-efi-xen-cfg-unquote.patch +- Fix linuxefi erroneously initialize linux's boot_params with non-zero + values. (bsc#1025563) + * grub2-linuxefi-fix-boot-params.patch +- Removed grub2-fix-multi-device-root-kernel-argument.patch as it has + regression on how GRUB_DISABLE_LINUX_UUID=true interpreted (bsc#1015138) + ------------------------------------------------------------------- Wed Mar 1 10:29:46 UTC 2017 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 99af5f7..9a2100d 100644 --- a/grub2.spec +++ b/grub2.spec @@ -1,7 +1,7 @@ # # spec file for package grub2 # -# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2017 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -178,8 +178,9 @@ Patch21: grub2-secureboot-add-linuxefi.patch Patch22: grub2-secureboot-use-linuxefi-on-uefi.patch Patch23: grub2-secureboot-no-insmod-on-sb.patch Patch24: grub2-secureboot-provide-linuxefi-config.patch -Patch29: grub2-secureboot-chainloader.patch -Patch34: grub2-secureboot-use-linuxefi-on-uefi-in-os-prober.patch +Patch25: grub2-secureboot-chainloader.patch +Patch26: grub2-secureboot-use-linuxefi-on-uefi-in-os-prober.patch +Patch27: grub2-linuxefi-fix-boot-params.patch Patch35: grub2-linguas.sh-no-rsync.patch Patch37: grub2-use-Unifont-for-starfield-theme-terminal.patch Patch38: grub2-s390x-01-Changes-made-and-files-added-in-order-to-allow-s390x.patch @@ -220,13 +221,13 @@ Patch108: grub2-btrfs-08-workaround-snapshot-menu-default-entry.patch Patch120: grub2-efi-xen-chainload.patch Patch121: grub2-efi-chainloader-root.patch Patch122: grub2-efi-xen-cmdline.patch +Patch123: grub2-efi-xen-cfg-unquote.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-Free-malloc-regions-on-exit.patch # Linux root device related patches -Patch162: grub2-fix-multi-device-root-kernel-argument.patch Patch163: grub2-zipl-setup-fix-btrfs-multipledev.patch Patch164: grub2-suse-remove-linux-root-param.patch # PPC64 LE support @@ -248,6 +249,19 @@ Patch286: 0007-efinet-Setting-network-from-UEFI-device-path.patch 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 Requires: gettext-runtime %if 0%{?suse_version} >= 1140 @@ -337,9 +351,9 @@ provides support for %{platform} systems. %package %{grubefiarch} Summary: Bootloader with support for Linux, Multiboot and more +Group: System/Boot # Require efibootmgr # Without it grub-install is broken so break the package as well if unavailable -Group: System/Boot Requires: efibootmgr Requires(post): efibootmgr Requires: %{name} = %{version}-%{release} @@ -426,8 +440,9 @@ swap partition while in resuming %patch22 -p1 %patch23 -p1 %patch24 -p1 -%patch29 -p1 -%patch34 -p1 +%patch25 -p1 +%patch26 -p1 +%patch27 -p1 %patch35 -p1 %patch37 -p1 %patch38 -p1 @@ -466,10 +481,10 @@ swap partition while in resuming %patch120 -p1 %patch121 -p1 %patch122 -p1 +%patch123 -p1 %patch140 -p1 %patch141 -p1 %patch150 -p1 -%patch162 -p1 %patch163 -p1 %patch164 -p1 %patch205 -p1 @@ -488,6 +503,18 @@ 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 # This simplifies patch handling without need to use git to create patch # that renames file @@ -598,6 +625,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} +./grub-mkimage -O %{grubefiarch} -o grub-tpm.efi --prefix= \ + -d grub-core ${GRUB_MODULES} tpm #./grub-mkimage -O %{grubefiarch} -o grub.efi -d grub-core part_gpt hfsplus fat \ # ext2 btrfs normal chain boot configfile linux appleldr minicmd \ # loadbios reboot halt search font gfxterm @@ -671,7 +700,7 @@ cd .. cd build-efi make DESTDIR=$RPM_BUILD_ROOT install -install -m 644 grub.efi $RPM_BUILD_ROOT%{_libdir}/%{name}/%{grubefiarch}/. +install -m 644 grub.efi grub-tpm.efi $RPM_BUILD_ROOT%{_libdir}/%{name}/%{grubefiarch}/. # Create grub.efi link to system efi directory # This is for tools like kiwi not fiddling with the path @@ -685,7 +714,7 @@ ln -sf ../../../%{_libdir}/%{name}/%{grubefiarch}/grub.efi $RPM_BUILD_ROOT%{syse %ifarch x86_64 %if 0%{?suse_version} >= 1230 || 0%{?suse_version} == 1110 -export BRP_PESIGN_FILES="%{_libdir}/%{name}/%{grubefiarch}/grub.efi" +export BRP_PESIGN_FILES="%{_libdir}/%{name}/%{grubefiarch}/grub.efi %{_libdir}/%{name}/%{grubefiarch}/grub-tpm.efi" install -m 444 grub.der $RPM_BUILD_ROOT%{sysefidir}/ %endif %endif @@ -1075,6 +1104,7 @@ fi %defattr(-,root,root,-) %dir %{_libdir}/%{name}/%{grubefiarch} %{_libdir}/%{name}/%{grubefiarch}/grub.efi +%{_libdir}/%{name}/%{grubefiarch}/grub-tpm.efi %{_libdir}/%{name}/%{grubefiarch}/*.img %{_libdir}/%{name}/%{grubefiarch}/*.lst %{_libdir}/%{name}/%{grubefiarch}/*.mod From a16fc66c63be12e0f1dded49cd403da74fa71dbffa099c5481cc8ed57af4f66c Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Tue, 14 Mar 2017 08:54:35 +0000 Subject: [PATCH 04/57] osc copypac from project:openSUSE:Factory package:grub2 revision:156, using expand OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=158 --- 0001-tpm-Core-TPM-support.patch | 785 ------------------ 0002-tpm-Measure-kernel-initrd.patch | 39 - 0003-tpm-Add-BIOS-boot-measurement.patch | 179 ---- 0004-tpm-Rework-linux-command.patch | 104 --- 0005-tpm-Rework-linux16-command.patch | 101 --- ...re-kernel-and-initrd-on-BIOS-systems.patch | 84 -- 0007-tpm-Measure-the-kernel-commandline.patch | 43 - 0008-tpm-Measure-commands.patch | 60 -- ...Measure-multiboot-images-and-modules.patch | 73 -- 0010-tpm-Fix-boot-when-there-s-no-TPM.patch | 29 - 0011-tpm-Fix-build-error.patch | 74 -- 0012-tpm-Build-tpm-as-module.patch | 505 ----------- grub2-efi-xen-cfg-unquote.patch | 92 -- ...ix-multi-device-root-kernel-argument.patch | 44 + grub2-linuxefi-fix-boot-params.patch | 20 - grub2.changes | 30 - grub2.spec | 50 +- 17 files changed, 54 insertions(+), 2258 deletions(-) delete mode 100644 0001-tpm-Core-TPM-support.patch delete mode 100644 0002-tpm-Measure-kernel-initrd.patch delete mode 100644 0003-tpm-Add-BIOS-boot-measurement.patch delete mode 100644 0004-tpm-Rework-linux-command.patch delete mode 100644 0005-tpm-Rework-linux16-command.patch delete mode 100644 0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch delete mode 100644 0007-tpm-Measure-the-kernel-commandline.patch delete mode 100644 0008-tpm-Measure-commands.patch delete mode 100644 0009-tpm-Measure-multiboot-images-and-modules.patch delete mode 100644 0010-tpm-Fix-boot-when-there-s-no-TPM.patch delete mode 100644 0011-tpm-Fix-build-error.patch delete mode 100644 0012-tpm-Build-tpm-as-module.patch delete mode 100644 grub2-efi-xen-cfg-unquote.patch create mode 100644 grub2-fix-multi-device-root-kernel-argument.patch delete mode 100644 grub2-linuxefi-fix-boot-params.patch diff --git a/0001-tpm-Core-TPM-support.patch b/0001-tpm-Core-TPM-support.patch deleted file mode 100644 index 103b6cf..0000000 --- a/0001-tpm-Core-TPM-support.patch +++ /dev/null @@ -1,785 +0,0 @@ -From 866eb2103187d84f2e02c262cfdd1a388acfec15 Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - #include - #include -+#include - - /* 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 -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+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 -+#include -+#include -+#include -+#include -+#include -+ -+#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, ®s); -+ -+ 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, ®s); -+ -+ 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, ®s); -+ -+ 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 -+#include -+#include -+#include -+#include -+#include -+ -+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 . -+ */ -+ -+#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 . -+ */ -+ -+#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 diff --git a/0002-tpm-Measure-kernel-initrd.patch b/0002-tpm-Measure-kernel-initrd.patch deleted file mode 100644 index c865b07..0000000 --- a/0002-tpm-Measure-kernel-initrd.patch +++ /dev/null @@ -1,39 +0,0 @@ -From b3afe6ad07192d3f38875e30b57a785ac3b1ea27 Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - #include - #include -+#include - - 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]); diff --git a/0003-tpm-Add-BIOS-boot-measurement.patch b/0003-tpm-Add-BIOS-boot-measurement.patch deleted file mode 100644 index 21ce113..0000000 --- a/0003-tpm-Add-BIOS-boot-measurement.patch +++ /dev/null @@ -1,179 +0,0 @@ -From e12373683b894f22c2e35dc3732440a4e9053d61 Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - #include - -+#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 - diff --git a/0004-tpm-Rework-linux-command.patch b/0004-tpm-Rework-linux-command.patch deleted file mode 100644 index d92c325..0000000 --- a/0004-tpm-Rework-linux-command.patch +++ /dev/null @@ -1,104 +0,0 @@ -From 9f12cf163e56d3b5f03c8a5da94dc501032312eb Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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~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 -@@ -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 (&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); - diff --git a/0005-tpm-Rework-linux16-command.patch b/0005-tpm-Rework-linux16-command.patch deleted file mode 100644 index d97a195..0000000 --- a/0005-tpm-Rework-linux16-command.patch +++ /dev/null @@ -1,101 +0,0 @@ -From f8f66cdcb66dba05353887b3be0d715d54efdea8 Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - diff --git a/0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch b/0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch deleted file mode 100644 index 9148a83..0000000 --- a/0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch +++ /dev/null @@ -1,84 +0,0 @@ -From f0b411214ccc309f2f126d558e2777469d538ca2 Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - #include - #include -+#include - - 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 - #include - #include -+#include - - 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 - #include - #include -+#include - - 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) diff --git a/0007-tpm-Measure-the-kernel-commandline.patch b/0007-tpm-Measure-the-kernel-commandline.patch deleted file mode 100644 index 87e0056..0000000 --- a/0007-tpm-Measure-the-kernel-commandline.patch +++ /dev/null @@ -1,43 +0,0 @@ -From aa88827e5b6ca073d0a67e86c5d6581445de988b Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - #include -+#include - - 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 - diff --git a/0008-tpm-Measure-commands.patch b/0008-tpm-Measure-commands.patch deleted file mode 100644 index 607b0b3..0000000 --- a/0008-tpm-Measure-commands.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 959e235378adef1477d14d7546c549b7619eb5f1 Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - #endif -+#include - - /* 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; diff --git a/0009-tpm-Measure-multiboot-images-and-modules.patch b/0009-tpm-Measure-multiboot-images-and-modules.patch deleted file mode 100644 index 293fd0d..0000000 --- a/0009-tpm-Measure-multiboot-images-and-modules.patch +++ /dev/null @@ -1,73 +0,0 @@ -From fd82340829d9fce685f80163ddb6ee3399929c3c Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - #include - #include -+#include - - #ifdef GRUB_MACHINE_EFI - #include -@@ -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 - #include - #include -+#include - - 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 - #include - #include -+#include - - #if defined (GRUB_MACHINE_EFI) - #include -@@ -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) diff --git a/0010-tpm-Fix-boot-when-there-s-no-TPM.patch b/0010-tpm-Fix-boot-when-there-s-no-TPM.patch deleted file mode 100644 index d10fd00..0000000 --- a/0010-tpm-Fix-boot-when-there-s-no-TPM.patch +++ /dev/null @@ -1,29 +0,0 @@ -From c9016d2ae0abc5edcb4dcf4b1ce04f138f6e5a67 Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - diff --git a/0011-tpm-Fix-build-error.patch b/0011-tpm-Fix-build-error.patch deleted file mode 100644 index 41542c9..0000000 --- a/0011-tpm-Fix-build-error.patch +++ /dev/null @@ -1,74 +0,0 @@ -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, diff --git a/0012-tpm-Build-tpm-as-module.patch b/0012-tpm-Build-tpm-as-module.patch deleted file mode 100644 index d95d9c3..0000000 --- a/0012-tpm-Build-tpm-as-module.patch +++ /dev/null @@ -1,505 +0,0 @@ -From 54b6ba5f27dd9eb9ec2f1a41e7160964ab94451c Mon Sep 17 00:00:00 2001 -From: Michael Chang -Date: Wed, 23 Nov 2016 16:52:16 +0800 -Subject: [PATCH 11/11] Build tpm as module - -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. - -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.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 - #include - -+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 - #include - #include -+#include - --#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 - #include - -+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; - static int add_rs_codes = 1; -+static int suse_enable_tpm = 0; - - enum - { -@@ -106,6 +107,7 @@ enum - OPTION_DISK_MODULE, - OPTION_NO_BOOTSECTOR, - OPTION_NO_RS_CODES, -+ OPTION_SUSE_ENABLE_TPM, - OPTION_MACPPC_DIRECTORY, - OPTION_ZIPL_DIRECTORY, - OPTION_LABEL_FONT, -@@ -231,6 +233,10 @@ argp_parser (int key, char *arg, struct - add_rs_codes = 0; - return 0; - -+ case OPTION_SUSE_ENABLE_TPM: -+ suse_enable_tpm = 1; -+ return 0; -+ - case OPTION_DEBUG: - verbosity++; - return 0; -@@ -292,6 +298,7 @@ static struct argp_option options[] = { - {"no-rs-codes", OPTION_NO_RS_CODES, 0, 0, - N_("Do not apply any reed-solomon codes when embedding core.img. " - "This option is only available on x86 BIOS targets."), 0}, -+ {"suse-enable-tpm", OPTION_SUSE_ENABLE_TPM, 0, 0, N_("install TPM modules"), 0}, - - {"debug", OPTION_DEBUG, 0, OPTION_HIDDEN, 0, 2}, - {"no-floppy", OPTION_NO_FLOPPY, 0, OPTION_HIDDEN, 0, 2}, -@@ -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 && (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; diff --git a/grub2-efi-xen-cfg-unquote.patch b/grub2-efi-xen-cfg-unquote.patch deleted file mode 100644 index 907e2f5..0000000 --- a/grub2-efi-xen-cfg-unquote.patch +++ /dev/null @@ -1,92 +0,0 @@ -From: Petr Tesarik -Subject: Unquote parameters written to Xen EFI config file -References: bsc#900418 -Patch-mainline: not yet - -The GRUB_CMDLINE_* value is copied verbatim to grub.conf, so it is first -parsed by GRUB2 before being passed down to the kernel. OTOH Xen EFI loader -takes the config file options verbatim. This means that any special GRUB2 -syntax must be evaluated when generating that file. - -Of course, some things are not even possible (e.g. substituting GRUB runtime -variables), but let's call them known limitations. - -Signed-off-by: Petr Tesarik - ---- - util/grub.d/20_linux_xen.in | 54 ++++++++++++++++++++++++++++++++++++++++++-- - 1 file changed, 52 insertions(+), 2 deletions(-) - -Index: grub-2.02~rc1/util/grub.d/20_linux_xen.in -=================================================================== ---- grub-2.02~rc1.orig/util/grub.d/20_linux_xen.in -+++ grub-2.02~rc1/util/grub.d/20_linux_xen.in -@@ -122,6 +122,52 @@ else - is_efi=false - fi - -+grub2_unquote () -+{ -+ awk ' -+ BEGIN { -+ bare = "[^{}|&$;<> \t\n'\''\"\\\\]+" -+ esc = "\\\\." -+ id = "[[:alpha:]_][[:alnum:]_]*|[[:digit:]]+|[?#*@]" -+ var = "\\$("id")|\\$\\{("id")\\}" -+ dqesc = "\\\\[$\"\\\\]" -+ dqstr = "\\$?\"([^\"]|"var"|"dqesc")*\"" -+ sqstr = "'\''[^'\'']*'\''" -+ pat = bare"|"esc"|"var"|"dqstr"|"sqstr -+ ORS = "" -+ } -+ { -+ patsplit($0, words, pat, sep) -+ print sep[0] -+ for (i in words) { -+ w = words[i] -+ if (w ~ /^\$?\"/) { -+ # Double-quoted string -+ patsplit(w, segs, var"|"dqesc, ssep) -+ print ssep[0] -+ for (j in segs) { -+ if (segs[j] ~ /^\\/) -+ print substr(segs[j], 2) -+ print ssep[j] -+ } -+ } else if (w ~ /^'\''/) { -+ # Single-quoted string -+ print substr(w, 2, length(w)-2) -+ } else if (w ~ /^\\/) { -+ # Escape sequence -+ print substr(w, 2) -+ } else if (w ~ /^\$/) { -+ # Variable expansion -+ } else { -+ # Bare word -+ print w -+ } -+ print sep[i] -+ } -+ print "\n" -+ }' -+} -+ - linux_entry () - { - os="$1" -@@ -174,11 +220,13 @@ linux_entry () - else - section="failsafe.$section_count" - fi -+ xen_args_unq=$(echo $xen_args | grub2_unquote) -+ args_unq=$(echo $args | grub2_unquote) - cat <<-EOF >> $grub_dir/$xen_cfg - - [$section] -- options=${xen_args} -- kernel=${basename} root=${linux_root_device_thisversion} ${args} -+ options=${xen_args_unq} -+ kernel=${basename} root=${linux_root_device_thisversion} ${args_unq} - ramdisk=${initrd} - EOF - message="$(gettext_printf "Loading Xen %s with Linux %s ..." ${xen_version} ${version})" diff --git a/grub2-fix-multi-device-root-kernel-argument.patch b/grub2-fix-multi-device-root-kernel-argument.patch new file mode 100644 index 0000000..65a93bf --- /dev/null +++ b/grub2-fix-multi-device-root-kernel-argument.patch @@ -0,0 +1,44 @@ +Index: grub-2.02~beta2/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 +@@ -45,12 +45,14 @@ esac + + # btrfs may reside on multiple devices. We cannot pass them as value of root= parameter + # and mounting btrfs requires user space scanning, so force UUID in this case. +-if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ ++if ( [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ + || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ +- || ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then ++ || uses_abstraction "${GRUB_DEVICE}" lvm ) && test -e "${GRUB_DEVICE}"; then + LINUX_ROOT_DEVICE=${GRUB_DEVICE} + else +- LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} ++ if [ "x${GRUB_DEVICE_UUID}" != "x" ]; then ++ LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} ++ fi + fi + + if [ "x$GRUB_CONMODE" != "x" ]; then +Index: grub-2.02~beta2/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 +@@ -55,12 +55,14 @@ esac + + # btrfs may reside on multiple devices. We cannot pass them as value of root= parameter + # and mounting btrfs requires user space scanning, so force UUID in this case. +-if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ ++if ( [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ + || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ +- || ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then ++ || uses_abstraction "${GRUB_DEVICE}" lvm ) && test -e "${GRUB_DEVICE}"; then + LINUX_ROOT_DEVICE=${GRUB_DEVICE} + else +- LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} ++ if [ "x${GRUB_DEVICE_UUID}" != "x" ]; then ++ LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} ++ fi + fi + + # Allow overriding GRUB_CMDLINE_LINUX and GRUB_CMDLINE_LINUX_DEFAULT. diff --git a/grub2-linuxefi-fix-boot-params.patch b/grub2-linuxefi-fix-boot-params.patch deleted file mode 100644 index 32a3372..0000000 --- a/grub2-linuxefi-fix-boot-params.patch +++ /dev/null @@ -1,20 +0,0 @@ -Index: grub-2.02~rc1/grub-core/loader/i386/efi/linux.c -=================================================================== ---- grub-2.02~rc1.orig/grub-core/loader/i386/efi/linux.c -+++ grub-2.02~rc1/grub-core/loader/i386/efi/linux.c -@@ -324,7 +324,14 @@ grub_cmd_linux (grub_command_t cmd __att - lh.code32_start = (grub_uint32_t)(grub_addr_t) kernel_mem; - } - -- grub_memcpy(params, &lh, 2 * 512); -+ /* Grub linuxefi erroneously initialize linux's boot_params with non-zero values. (bsc#1025563) -+ -+ From https://www.kernel.org/doc/Documentation/x86/boot.txt: -+ The memory for struct boot_params could be allocated anywhere (even above 4G) -+ and initialized to all zero. -+ Then, the setup header at offset 0x01f1 of kernel image on should be -+ loaded into struct boot_params and examined. */ -+ grub_memcpy (¶ms->setup_sects, &lh.setup_sects, sizeof (lh) - 0x01f1); - - params->type_of_loader = 0x21; - diff --git a/grub2.changes b/grub2.changes index ac951aa..c9f724d 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,33 +1,3 @@ -------------------------------------------------------------------- -Mon Mar 6 06:34:01 UTC 2017 - mchang@suse.com - -- TPM Support (FATE#315831) - * 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 - * 0012-tpm-Build-tpm-as-module.patch -- grub2.spec : Add grub-tpm.efi for Secure Boot - -------------------------------------------------------------------- -Fri Mar 3 10:26:10 UTC 2017 - mchang@suse.com - -- Fix invalid Xen EFI config files if xen_args include GRUB2 quoting - (bsc#900418) (bsc#951748) - * grub2-efi-xen-cfg-unquote.patch -- Fix linuxefi erroneously initialize linux's boot_params with non-zero - values. (bsc#1025563) - * grub2-linuxefi-fix-boot-params.patch -- Removed grub2-fix-multi-device-root-kernel-argument.patch as it has - regression on how GRUB_DISABLE_LINUX_UUID=true interpreted (bsc#1015138) - ------------------------------------------------------------------- Wed Mar 1 10:29:46 UTC 2017 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 9a2100d..99af5f7 100644 --- a/grub2.spec +++ b/grub2.spec @@ -1,7 +1,7 @@ # # spec file for package grub2 # -# Copyright (c) 2017 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -178,9 +178,8 @@ Patch21: grub2-secureboot-add-linuxefi.patch Patch22: grub2-secureboot-use-linuxefi-on-uefi.patch Patch23: grub2-secureboot-no-insmod-on-sb.patch Patch24: grub2-secureboot-provide-linuxefi-config.patch -Patch25: grub2-secureboot-chainloader.patch -Patch26: grub2-secureboot-use-linuxefi-on-uefi-in-os-prober.patch -Patch27: grub2-linuxefi-fix-boot-params.patch +Patch29: grub2-secureboot-chainloader.patch +Patch34: grub2-secureboot-use-linuxefi-on-uefi-in-os-prober.patch Patch35: grub2-linguas.sh-no-rsync.patch Patch37: grub2-use-Unifont-for-starfield-theme-terminal.patch Patch38: grub2-s390x-01-Changes-made-and-files-added-in-order-to-allow-s390x.patch @@ -221,13 +220,13 @@ Patch108: grub2-btrfs-08-workaround-snapshot-menu-default-entry.patch Patch120: grub2-efi-xen-chainload.patch Patch121: grub2-efi-chainloader-root.patch Patch122: grub2-efi-xen-cmdline.patch -Patch123: grub2-efi-xen-cfg-unquote.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-Free-malloc-regions-on-exit.patch # Linux root device related patches +Patch162: grub2-fix-multi-device-root-kernel-argument.patch Patch163: grub2-zipl-setup-fix-btrfs-multipledev.patch Patch164: grub2-suse-remove-linux-root-param.patch # PPC64 LE support @@ -249,19 +248,6 @@ Patch286: 0007-efinet-Setting-network-from-UEFI-device-path.patch 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 Requires: gettext-runtime %if 0%{?suse_version} >= 1140 @@ -351,9 +337,9 @@ provides support for %{platform} systems. %package %{grubefiarch} Summary: Bootloader with support for Linux, Multiboot and more -Group: System/Boot # Require efibootmgr # Without it grub-install is broken so break the package as well if unavailable +Group: System/Boot Requires: efibootmgr Requires(post): efibootmgr Requires: %{name} = %{version}-%{release} @@ -440,9 +426,8 @@ swap partition while in resuming %patch22 -p1 %patch23 -p1 %patch24 -p1 -%patch25 -p1 -%patch26 -p1 -%patch27 -p1 +%patch29 -p1 +%patch34 -p1 %patch35 -p1 %patch37 -p1 %patch38 -p1 @@ -481,10 +466,10 @@ swap partition while in resuming %patch120 -p1 %patch121 -p1 %patch122 -p1 -%patch123 -p1 %patch140 -p1 %patch141 -p1 %patch150 -p1 +%patch162 -p1 %patch163 -p1 %patch164 -p1 %patch205 -p1 @@ -503,18 +488,6 @@ 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 # This simplifies patch handling without need to use git to create patch # that renames file @@ -625,8 +598,6 @@ 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} -./grub-mkimage -O %{grubefiarch} -o grub-tpm.efi --prefix= \ - -d grub-core ${GRUB_MODULES} tpm #./grub-mkimage -O %{grubefiarch} -o grub.efi -d grub-core part_gpt hfsplus fat \ # ext2 btrfs normal chain boot configfile linux appleldr minicmd \ # loadbios reboot halt search font gfxterm @@ -700,7 +671,7 @@ cd .. cd build-efi make DESTDIR=$RPM_BUILD_ROOT install -install -m 644 grub.efi grub-tpm.efi $RPM_BUILD_ROOT%{_libdir}/%{name}/%{grubefiarch}/. +install -m 644 grub.efi $RPM_BUILD_ROOT%{_libdir}/%{name}/%{grubefiarch}/. # Create grub.efi link to system efi directory # This is for tools like kiwi not fiddling with the path @@ -714,7 +685,7 @@ ln -sf ../../../%{_libdir}/%{name}/%{grubefiarch}/grub.efi $RPM_BUILD_ROOT%{syse %ifarch x86_64 %if 0%{?suse_version} >= 1230 || 0%{?suse_version} == 1110 -export BRP_PESIGN_FILES="%{_libdir}/%{name}/%{grubefiarch}/grub.efi %{_libdir}/%{name}/%{grubefiarch}/grub-tpm.efi" +export BRP_PESIGN_FILES="%{_libdir}/%{name}/%{grubefiarch}/grub.efi" install -m 444 grub.der $RPM_BUILD_ROOT%{sysefidir}/ %endif %endif @@ -1104,7 +1075,6 @@ fi %defattr(-,root,root,-) %dir %{_libdir}/%{name}/%{grubefiarch} %{_libdir}/%{name}/%{grubefiarch}/grub.efi -%{_libdir}/%{name}/%{grubefiarch}/grub-tpm.efi %{_libdir}/%{name}/%{grubefiarch}/*.img %{_libdir}/%{name}/%{grubefiarch}/*.lst %{_libdir}/%{name}/%{grubefiarch}/*.mod From a582f984305cc1be7e920498ac7bc7936bdcaa9a7d1ed80291449052396d0f72 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Tue, 21 Mar 2017 21:46:44 +0000 Subject: [PATCH 05/57] Accepting request 481722 from Base:System 1 OBS-URL: https://build.opensuse.org/request/show/481722 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=159 --- ...nal-NULL-from-File-Path-in-grub_efi_.patch | 41 - 0001-tpm-Core-TPM-support.patch | 785 ++++++++++++++++++ 0002-tpm-Measure-kernel-initrd.patch | 39 + 0003-tpm-Add-BIOS-boot-measurement.patch | 179 ++++ 0004-tpm-Rework-linux-command.patch | 104 +++ 0005-tpm-Rework-linux16-command.patch | 101 +++ ...re-kernel-and-initrd-on-BIOS-systems.patch | 84 ++ 0007-tpm-Measure-the-kernel-commandline.patch | 43 + 0008-tpm-Measure-commands.patch | 60 ++ ...Measure-multiboot-images-and-modules.patch | 73 ++ 0010-tpm-Fix-boot-when-there-s-no-TPM.patch | 29 + 0011-tpm-Fix-build-error.patch | 74 ++ 0012-tpm-Build-tpm-as-module.patch | 505 +++++++++++ grub-2.02~rc1.tar.xz | 3 - grub-2.02~rc2.tar.xz | 3 + grub2-btrfs-06-subvol-mount.patch | 49 +- grub2-efi-xen-cfg-unquote.patch | 92 ++ ...ix-multi-device-root-kernel-argument.patch | 44 - grub2-linguas.sh-no-rsync.patch | 10 +- grub2-linuxefi-fix-boot-params.patch | 20 + ...te-metadata-buffer-from-raw-contents.patch | 126 +++ grub2.changes | 54 ++ grub2.spec | 50 +- use-grub2-as-a-package-name.patch | 10 +- 24 files changed, 2452 insertions(+), 126 deletions(-) delete mode 100644 0001-efi-strip-off-final-NULL-from-File-Path-in-grub_efi_.patch create mode 100644 0001-tpm-Core-TPM-support.patch create mode 100644 0002-tpm-Measure-kernel-initrd.patch create mode 100644 0003-tpm-Add-BIOS-boot-measurement.patch create mode 100644 0004-tpm-Rework-linux-command.patch create mode 100644 0005-tpm-Rework-linux16-command.patch create mode 100644 0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch create mode 100644 0007-tpm-Measure-the-kernel-commandline.patch create mode 100644 0008-tpm-Measure-commands.patch create mode 100644 0009-tpm-Measure-multiboot-images-and-modules.patch create mode 100644 0010-tpm-Fix-boot-when-there-s-no-TPM.patch create mode 100644 0011-tpm-Fix-build-error.patch create mode 100644 0012-tpm-Build-tpm-as-module.patch delete mode 100644 grub-2.02~rc1.tar.xz create mode 100644 grub-2.02~rc2.tar.xz create mode 100644 grub2-efi-xen-cfg-unquote.patch delete mode 100644 grub2-fix-multi-device-root-kernel-argument.patch create mode 100644 grub2-linuxefi-fix-boot-params.patch create mode 100644 grub2-lvm-allocate-metadata-buffer-from-raw-contents.patch diff --git a/0001-efi-strip-off-final-NULL-from-File-Path-in-grub_efi_.patch b/0001-efi-strip-off-final-NULL-from-File-Path-in-grub_efi_.patch deleted file mode 100644 index 101e2ed..0000000 --- a/0001-efi-strip-off-final-NULL-from-File-Path-in-grub_efi_.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 892dfbe113d08c18e51d7c27eee5094f3da530ec Mon Sep 17 00:00:00 2001 -From: Andrei Borzenkov -Date: Sat, 25 Feb 2017 08:39:38 +0300 -Subject: [PATCH] efi: strip off final NULL from File Path in - grub_efi_get_filename - -UEFI 2.6 9.3.6.4 File Path Media Device Path says that Path Name is -"A NULL-terminated Path string including directory and file names". - -Strip final NULL from Path Name in each File Path node when constructing -full path. To be on safe side, strip all of them. - -Fixes failure chainloading grub from grub, when loaded grub truncates -image path and does not find its grub.cfg. - -https://bugzilla.opensuse.org/show_bug.cgi?id=1026344 - -This was triggered by commit ce95549cc54b5d6f494608a7c390dba3aab4fba7; -before it we built Path Name without trailing NULL, and apparently all -other bootloaders use single File Path node, thus not exposing this bug. ---- - grub-core/kern/efi/efi.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c -index caf9bcc..d467785 100644 ---- a/grub-core/kern/efi/efi.c -+++ b/grub-core/kern/efi/efi.c -@@ -366,6 +366,9 @@ grub_efi_get_filename (grub_efi_device_path_t *dp0) - len = ((GRUB_EFI_DEVICE_PATH_LENGTH (dp) - 4) - / sizeof (grub_efi_char16_t)); - fp = (grub_efi_file_path_device_path_t *) dp; -+ /* According to EFI spec Path Name is NULL terminated */ -+ while (len > 0 && fp->path_name[len - 1] == 0) -+ len--; - - p = (char *) grub_utf16_to_utf8 ((unsigned char *) p, fp->path_name, len); - } --- -2.6.6 - diff --git a/0001-tpm-Core-TPM-support.patch b/0001-tpm-Core-TPM-support.patch new file mode 100644 index 0000000..103b6cf --- /dev/null +++ b/0001-tpm-Core-TPM-support.patch @@ -0,0 +1,785 @@ +From 866eb2103187d84f2e02c262cfdd1a388acfec15 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include + #include ++#include + + /* 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++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 ++#include ++#include ++#include ++#include ++#include ++ ++#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, ®s); ++ ++ 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, ®s); ++ ++ 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, ®s); ++ ++ 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 ++#include ++#include ++#include ++#include ++#include ++ ++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 . ++ */ ++ ++#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 . ++ */ ++ ++#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 diff --git a/0002-tpm-Measure-kernel-initrd.patch b/0002-tpm-Measure-kernel-initrd.patch new file mode 100644 index 0000000..c865b07 --- /dev/null +++ b/0002-tpm-Measure-kernel-initrd.patch @@ -0,0 +1,39 @@ +From b3afe6ad07192d3f38875e30b57a785ac3b1ea27 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include + #include ++#include + + 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]); diff --git a/0003-tpm-Add-BIOS-boot-measurement.patch b/0003-tpm-Add-BIOS-boot-measurement.patch new file mode 100644 index 0000000..21ce113 --- /dev/null +++ b/0003-tpm-Add-BIOS-boot-measurement.patch @@ -0,0 +1,179 @@ +From e12373683b894f22c2e35dc3732440a4e9053d61 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include + ++#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 + diff --git a/0004-tpm-Rework-linux-command.patch b/0004-tpm-Rework-linux-command.patch new file mode 100644 index 0000000..e36626e --- /dev/null +++ b/0004-tpm-Rework-linux-command.patch @@ -0,0 +1,104 @@ +From 9f12cf163e56d3b5f03c8a5da94dc501032312eb Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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); + diff --git a/0005-tpm-Rework-linux16-command.patch b/0005-tpm-Rework-linux16-command.patch new file mode 100644 index 0000000..d97a195 --- /dev/null +++ b/0005-tpm-Rework-linux16-command.patch @@ -0,0 +1,101 @@ +From f8f66cdcb66dba05353887b3be0d715d54efdea8 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + diff --git a/0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch b/0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch new file mode 100644 index 0000000..9148a83 --- /dev/null +++ b/0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch @@ -0,0 +1,84 @@ +From f0b411214ccc309f2f126d558e2777469d538ca2 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include + #include ++#include + + 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 + #include + #include ++#include + + 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 + #include + #include ++#include + + 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) diff --git a/0007-tpm-Measure-the-kernel-commandline.patch b/0007-tpm-Measure-the-kernel-commandline.patch new file mode 100644 index 0000000..87e0056 --- /dev/null +++ b/0007-tpm-Measure-the-kernel-commandline.patch @@ -0,0 +1,43 @@ +From aa88827e5b6ca073d0a67e86c5d6581445de988b Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include ++#include + + 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 + diff --git a/0008-tpm-Measure-commands.patch b/0008-tpm-Measure-commands.patch new file mode 100644 index 0000000..607b0b3 --- /dev/null +++ b/0008-tpm-Measure-commands.patch @@ -0,0 +1,60 @@ +From 959e235378adef1477d14d7546c549b7619eb5f1 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #endif ++#include + + /* 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; diff --git a/0009-tpm-Measure-multiboot-images-and-modules.patch b/0009-tpm-Measure-multiboot-images-and-modules.patch new file mode 100644 index 0000000..293fd0d --- /dev/null +++ b/0009-tpm-Measure-multiboot-images-and-modules.patch @@ -0,0 +1,73 @@ +From fd82340829d9fce685f80163ddb6ee3399929c3c Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include + #include ++#include + + #ifdef GRUB_MACHINE_EFI + #include +@@ -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 + #include + #include ++#include + + 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 + #include + #include ++#include + + #if defined (GRUB_MACHINE_EFI) + #include +@@ -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) diff --git a/0010-tpm-Fix-boot-when-there-s-no-TPM.patch b/0010-tpm-Fix-boot-when-there-s-no-TPM.patch new file mode 100644 index 0000000..d10fd00 --- /dev/null +++ b/0010-tpm-Fix-boot-when-there-s-no-TPM.patch @@ -0,0 +1,29 @@ +From c9016d2ae0abc5edcb4dcf4b1ce04f138f6e5a67 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + diff --git a/0011-tpm-Fix-build-error.patch b/0011-tpm-Fix-build-error.patch new file mode 100644 index 0000000..41542c9 --- /dev/null +++ b/0011-tpm-Fix-build-error.patch @@ -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, diff --git a/0012-tpm-Build-tpm-as-module.patch b/0012-tpm-Build-tpm-as-module.patch new file mode 100644 index 0000000..d95d9c3 --- /dev/null +++ b/0012-tpm-Build-tpm-as-module.patch @@ -0,0 +1,505 @@ +From 54b6ba5f27dd9eb9ec2f1a41e7160964ab94451c Mon Sep 17 00:00:00 2001 +From: Michael Chang +Date: Wed, 23 Nov 2016 16:52:16 +0800 +Subject: [PATCH 11/11] Build tpm as module + +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. + +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.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 + #include + ++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 + #include + #include ++#include + +-#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 + #include + ++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; + static int add_rs_codes = 1; ++static int suse_enable_tpm = 0; + + enum + { +@@ -106,6 +107,7 @@ enum + OPTION_DISK_MODULE, + OPTION_NO_BOOTSECTOR, + OPTION_NO_RS_CODES, ++ OPTION_SUSE_ENABLE_TPM, + OPTION_MACPPC_DIRECTORY, + OPTION_ZIPL_DIRECTORY, + OPTION_LABEL_FONT, +@@ -231,6 +233,10 @@ argp_parser (int key, char *arg, struct + add_rs_codes = 0; + return 0; + ++ case OPTION_SUSE_ENABLE_TPM: ++ suse_enable_tpm = 1; ++ return 0; ++ + case OPTION_DEBUG: + verbosity++; + return 0; +@@ -292,6 +298,7 @@ static struct argp_option options[] = { + {"no-rs-codes", OPTION_NO_RS_CODES, 0, 0, + N_("Do not apply any reed-solomon codes when embedding core.img. " + "This option is only available on x86 BIOS targets."), 0}, ++ {"suse-enable-tpm", OPTION_SUSE_ENABLE_TPM, 0, 0, N_("install TPM modules"), 0}, + + {"debug", OPTION_DEBUG, 0, OPTION_HIDDEN, 0, 2}, + {"no-floppy", OPTION_NO_FLOPPY, 0, OPTION_HIDDEN, 0, 2}, +@@ -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 && (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; diff --git a/grub-2.02~rc1.tar.xz b/grub-2.02~rc1.tar.xz deleted file mode 100644 index 07fc14c..0000000 --- a/grub-2.02~rc1.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:445239e9b96d1143c194c1d37851cf4196b83701c60172e49665e9d453d80278 -size 6051964 diff --git a/grub-2.02~rc2.tar.xz b/grub-2.02~rc2.tar.xz new file mode 100644 index 0000000..4622bd8 --- /dev/null +++ b/grub-2.02~rc2.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:053bfcbe366733e4f5a1baf4eb15e1efd977225bdd323b78087ce5fa172fc246 +size 6055836 diff --git a/grub2-btrfs-06-subvol-mount.patch b/grub2-btrfs-06-subvol-mount.patch index c3accb7..07636e3 100644 --- a/grub2-btrfs-06-subvol-mount.patch +++ b/grub2-btrfs-06-subvol-mount.patch @@ -1,7 +1,7 @@ -Index: grub-2.02~rc1/grub-core/fs/btrfs.c +Index: grub-2.02~rc2/grub-core/fs/btrfs.c =================================================================== ---- grub-2.02~rc1.orig/grub-core/fs/btrfs.c -+++ grub-2.02~rc1/grub-core/fs/btrfs.c +--- grub-2.02~rc2.orig/grub-core/fs/btrfs.c ++++ grub-2.02~rc2/grub-core/fs/btrfs.c @@ -32,6 +32,7 @@ #include #include @@ -264,10 +264,10 @@ Index: grub-2.02~rc1/grub-core/fs/btrfs.c cmd_list_subvols = grub_register_extcmd("btrfs-list-subvols", grub_cmd_btrfs_list_subvols, 0, "[-p|-n] [-o var] DEVICE", -Index: grub-2.02~rc1/grub-core/osdep/linux/getroot.c +Index: grub-2.02~rc2/grub-core/osdep/linux/getroot.c =================================================================== ---- grub-2.02~rc1.orig/grub-core/osdep/linux/getroot.c -+++ grub-2.02~rc1/grub-core/osdep/linux/getroot.c +--- grub-2.02~rc2.orig/grub-core/osdep/linux/getroot.c ++++ grub-2.02~rc2/grub-core/osdep/linux/getroot.c @@ -107,6 +107,14 @@ struct btrfs_ioctl_search_key grub_uint32_t unused[9]; }; @@ -412,7 +412,7 @@ Index: grub-2.02~rc1/grub-core/osdep/linux/getroot.c } } else if (!retry && grub_strcmp (entries[i].fstype, "autofs") == 0) -@@ -1144,6 +1258,34 @@ grub_util_get_grub_dev_os (const char *o +@@ -1148,6 +1262,34 @@ grub_util_get_grub_dev_os (const char *o return grub_dev; } @@ -447,11 +447,11 @@ Index: grub-2.02~rc1/grub-core/osdep/linux/getroot.c char * grub_make_system_path_relative_to_its_root_os (const char *path) { -Index: grub-2.02~rc1/util/grub-install.c +Index: grub-2.02~rc2/util/grub-install.c =================================================================== ---- grub-2.02~rc1.orig/util/grub-install.c -+++ grub-2.02~rc1/util/grub-install.c -@@ -1560,6 +1560,42 @@ main (int argc, char *argv[]) +--- grub-2.02~rc2.orig/util/grub-install.c ++++ grub-2.02~rc2/util/grub-install.c +@@ -1560,6 +1560,55 @@ main (int argc, char *argv[]) prefix_drive = xasprintf ("(%s)", grub_drives[0]); } @@ -462,12 +462,17 @@ Index: grub-2.02~rc1/util/grub-install.c + { + char *subvol = NULL; + char *mount_path = NULL; ++ char **rootdir_devices = NULL; ++ char *rootdir_path = grub_util_path_concat (2, "/", rootdir); + -+ if (!load_cfg_f) -+ load_cfg_f = grub_util_fopen (load_cfg, "wb"); -+ have_load_cfg = 1; ++ if (grub_util_is_directory (rootdir_path)) ++ rootdir_devices = grub_guess_root_devices (rootdir_path); + -+ subvol = grub_util_get_btrfs_subvol (platdir, &mount_path); ++ free (rootdir_path); ++ ++ if (rootdir_devices && rootdir_devices[0]) ++ if (grub_strcmp (rootdir_devices[0], grub_devices[0]) == 0) ++ subvol = grub_util_get_btrfs_subvol (platdir, &mount_path); + + if (subvol && mount_path) + { @@ -477,12 +482,20 @@ Index: grub-2.02~rc1/util/grub-install.c + + if (def_subvol) + { ++ if (!load_cfg_f) ++ load_cfg_f = grub_util_fopen (load_cfg, "wb"); ++ have_load_cfg = 1; ++ + if (grub_strcmp (subvol, def_subvol) != 0) + fprintf (load_cfg_f, "btrfs-mount-subvol ($root) %s %s\n", mount_path, subvol); + free (def_subvol); + } + } + ++ for (curdev = rootdir_devices; *curdev; curdev++) ++ free (*curdev); ++ if (rootdir_devices) ++ free (rootdir_devices); + if (subvol) + free (subvol); + if (mount_path) @@ -494,10 +507,10 @@ Index: grub-2.02~rc1/util/grub-install.c char mkimage_target[200]; const char *core_name = NULL; -Index: grub-2.02~rc1/include/grub/emu/getroot.h +Index: grub-2.02~rc2/include/grub/emu/getroot.h =================================================================== ---- grub-2.02~rc1.orig/include/grub/emu/getroot.h -+++ grub-2.02~rc1/include/grub/emu/getroot.h +--- grub-2.02~rc2.orig/include/grub/emu/getroot.h ++++ grub-2.02~rc2/include/grub/emu/getroot.h @@ -53,6 +53,11 @@ char ** grub_find_root_devices_from_mountinfo (const char *dir, char **relroot); #endif diff --git a/grub2-efi-xen-cfg-unquote.patch b/grub2-efi-xen-cfg-unquote.patch new file mode 100644 index 0000000..907e2f5 --- /dev/null +++ b/grub2-efi-xen-cfg-unquote.patch @@ -0,0 +1,92 @@ +From: Petr Tesarik +Subject: Unquote parameters written to Xen EFI config file +References: bsc#900418 +Patch-mainline: not yet + +The GRUB_CMDLINE_* value is copied verbatim to grub.conf, so it is first +parsed by GRUB2 before being passed down to the kernel. OTOH Xen EFI loader +takes the config file options verbatim. This means that any special GRUB2 +syntax must be evaluated when generating that file. + +Of course, some things are not even possible (e.g. substituting GRUB runtime +variables), but let's call them known limitations. + +Signed-off-by: Petr Tesarik + +--- + util/grub.d/20_linux_xen.in | 54 ++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 52 insertions(+), 2 deletions(-) + +Index: grub-2.02~rc1/util/grub.d/20_linux_xen.in +=================================================================== +--- grub-2.02~rc1.orig/util/grub.d/20_linux_xen.in ++++ grub-2.02~rc1/util/grub.d/20_linux_xen.in +@@ -122,6 +122,52 @@ else + is_efi=false + fi + ++grub2_unquote () ++{ ++ awk ' ++ BEGIN { ++ bare = "[^{}|&$;<> \t\n'\''\"\\\\]+" ++ esc = "\\\\." ++ id = "[[:alpha:]_][[:alnum:]_]*|[[:digit:]]+|[?#*@]" ++ var = "\\$("id")|\\$\\{("id")\\}" ++ dqesc = "\\\\[$\"\\\\]" ++ dqstr = "\\$?\"([^\"]|"var"|"dqesc")*\"" ++ sqstr = "'\''[^'\'']*'\''" ++ pat = bare"|"esc"|"var"|"dqstr"|"sqstr ++ ORS = "" ++ } ++ { ++ patsplit($0, words, pat, sep) ++ print sep[0] ++ for (i in words) { ++ w = words[i] ++ if (w ~ /^\$?\"/) { ++ # Double-quoted string ++ patsplit(w, segs, var"|"dqesc, ssep) ++ print ssep[0] ++ for (j in segs) { ++ if (segs[j] ~ /^\\/) ++ print substr(segs[j], 2) ++ print ssep[j] ++ } ++ } else if (w ~ /^'\''/) { ++ # Single-quoted string ++ print substr(w, 2, length(w)-2) ++ } else if (w ~ /^\\/) { ++ # Escape sequence ++ print substr(w, 2) ++ } else if (w ~ /^\$/) { ++ # Variable expansion ++ } else { ++ # Bare word ++ print w ++ } ++ print sep[i] ++ } ++ print "\n" ++ }' ++} ++ + linux_entry () + { + os="$1" +@@ -174,11 +220,13 @@ linux_entry () + else + section="failsafe.$section_count" + fi ++ xen_args_unq=$(echo $xen_args | grub2_unquote) ++ args_unq=$(echo $args | grub2_unquote) + cat <<-EOF >> $grub_dir/$xen_cfg + + [$section] +- options=${xen_args} +- kernel=${basename} root=${linux_root_device_thisversion} ${args} ++ options=${xen_args_unq} ++ kernel=${basename} root=${linux_root_device_thisversion} ${args_unq} + ramdisk=${initrd} + EOF + message="$(gettext_printf "Loading Xen %s with Linux %s ..." ${xen_version} ${version})" diff --git a/grub2-fix-multi-device-root-kernel-argument.patch b/grub2-fix-multi-device-root-kernel-argument.patch deleted file mode 100644 index 65a93bf..0000000 --- a/grub2-fix-multi-device-root-kernel-argument.patch +++ /dev/null @@ -1,44 +0,0 @@ -Index: grub-2.02~beta2/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 -@@ -45,12 +45,14 @@ esac - - # btrfs may reside on multiple devices. We cannot pass them as value of root= parameter - # and mounting btrfs requires user space scanning, so force UUID in this case. --if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ -+if ( [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ - || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ -- || ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then -+ || uses_abstraction "${GRUB_DEVICE}" lvm ) && test -e "${GRUB_DEVICE}"; then - LINUX_ROOT_DEVICE=${GRUB_DEVICE} - else -- LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} -+ if [ "x${GRUB_DEVICE_UUID}" != "x" ]; then -+ LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} -+ fi - fi - - if [ "x$GRUB_CONMODE" != "x" ]; then -Index: grub-2.02~beta2/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 -@@ -55,12 +55,14 @@ esac - - # btrfs may reside on multiple devices. We cannot pass them as value of root= parameter - # and mounting btrfs requires user space scanning, so force UUID in this case. --if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ -+if ( [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ - || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ -- || ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then -+ || uses_abstraction "${GRUB_DEVICE}" lvm ) && test -e "${GRUB_DEVICE}"; then - LINUX_ROOT_DEVICE=${GRUB_DEVICE} - else -- LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} -+ if [ "x${GRUB_DEVICE_UUID}" != "x" ]; then -+ LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} -+ fi - fi - - # Allow overriding GRUB_CMDLINE_LINUX and GRUB_CMDLINE_LINUX_DEFAULT. diff --git a/grub2-linguas.sh-no-rsync.patch b/grub2-linguas.sh-no-rsync.patch index df9f653..8cc702e 100644 --- a/grub2-linguas.sh-no-rsync.patch +++ b/grub2-linguas.sh-no-rsync.patch @@ -4,15 +4,15 @@ Subject: disable rsync to make it possible to use in RPM build We need to create po/LINGUAS to generate message catalogs. Use linguas.sh to ensure we always use the same rules as upstream, but disable rsync. -Index: grub-2.02~beta2/linguas.sh +Index: grub-2.02~rc2/linguas.sh =================================================================== ---- grub-2.02~beta2.orig/linguas.sh 2015-11-02 20:47:03.471686784 +0300 -+++ grub-2.02~beta2/linguas.sh 2015-11-02 20:48:15.707687638 +0300 +--- grub-2.02~rc2.orig/linguas.sh ++++ grub-2.02~rc2/linguas.sh @@ -1,8 +1,8 @@ #!/bin/sh --rsync -Lrtvz --exclude=ko.po translationproject.org::tp/latest/grub/ po -+#rsync -Lrtvz --exclude=ko.po translationproject.org::tp/latest/grub/ po +-rsync -Lrtvz translationproject.org::tp/latest/grub/ po ++#rsync -Lrtvz translationproject.org::tp/latest/grub/ po -autogenerated="en@quot en@hebrew de@hebrew en@cyrillic en@greek en@arabic en@piglatin de_CH" +autogenerated="en@quot" # en@hebrew de@hebrew en@cyrillic en@greek en@arabic en@piglatin de_CH" diff --git a/grub2-linuxefi-fix-boot-params.patch b/grub2-linuxefi-fix-boot-params.patch new file mode 100644 index 0000000..32a3372 --- /dev/null +++ b/grub2-linuxefi-fix-boot-params.patch @@ -0,0 +1,20 @@ +Index: grub-2.02~rc1/grub-core/loader/i386/efi/linux.c +=================================================================== +--- grub-2.02~rc1.orig/grub-core/loader/i386/efi/linux.c ++++ grub-2.02~rc1/grub-core/loader/i386/efi/linux.c +@@ -324,7 +324,14 @@ grub_cmd_linux (grub_command_t cmd __att + lh.code32_start = (grub_uint32_t)(grub_addr_t) kernel_mem; + } + +- grub_memcpy(params, &lh, 2 * 512); ++ /* Grub linuxefi erroneously initialize linux's boot_params with non-zero values. (bsc#1025563) ++ ++ From https://www.kernel.org/doc/Documentation/x86/boot.txt: ++ The memory for struct boot_params could be allocated anywhere (even above 4G) ++ and initialized to all zero. ++ Then, the setup header at offset 0x01f1 of kernel image on should be ++ loaded into struct boot_params and examined. */ ++ grub_memcpy (¶ms->setup_sects, &lh.setup_sects, sizeof (lh) - 0x01f1); + + params->type_of_loader = 0x21; + diff --git a/grub2-lvm-allocate-metadata-buffer-from-raw-contents.patch b/grub2-lvm-allocate-metadata-buffer-from-raw-contents.patch new file mode 100644 index 0000000..d8e2beb --- /dev/null +++ b/grub2-lvm-allocate-metadata-buffer-from-raw-contents.patch @@ -0,0 +1,126 @@ +From 87636b6eb33d10fad13739c39128029cde076c03 Mon Sep 17 00:00:00 2001 +From: Michael Chang +Date: Mon, 20 Mar 2017 14:59:41 +0800 +Subject: [PATCH] Allocate LVM metadata buffer from raw contents + +The size reserved for on disk LVM metadata area can be exceedingly large that +may trigger out of memory error for allocating buffer based on it. Refine the +buffer allocation to use size of raw LVM metadata contents and read them from +within the metadata area as we only need to parse the JSON formatted contents +rather than the entire metadata area. This reduced the size significantly and +the likelihood to out of memory error. +--- + grub-core/disk/lvm.c | 65 ++++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 45 insertions(+), 20 deletions(-) + +diff --git a/grub-core/disk/lvm.c b/grub-core/disk/lvm.c +index 7b265c7..47aae05 100644 +--- a/grub-core/disk/lvm.c ++++ b/grub-core/disk/lvm.c +@@ -102,9 +102,11 @@ grub_lvm_detect (grub_disk_t disk, + { + grub_err_t err; + grub_uint64_t mda_offset, mda_size; ++ grub_uint64_t mda_raw_offset, mda_raw_size; + char buf[GRUB_LVM_LABEL_SIZE]; + char vg_id[GRUB_LVM_ID_STRLEN+1]; + char pv_id[GRUB_LVM_ID_STRLEN+1]; ++ char mdah_buf[sizeof (struct grub_lvm_mda_header) + sizeof (struct grub_lvm_raw_locn)]; + char *metadatabuf, *p, *q, *vgname; + struct grub_lvm_label_header *lh = (struct grub_lvm_label_header *) buf; + struct grub_lvm_pv_header *pvh; +@@ -167,21 +169,15 @@ grub_lvm_detect (grub_disk_t disk, + + dlocn++; + mda_offset = grub_le_to_cpu64 (dlocn->offset); +- mda_size = grub_le_to_cpu64 (dlocn->size); + + /* It's possible to have multiple copies of metadata areas, we just use the + first one. */ +- +- /* Allocate buffer space for the circular worst-case scenario. */ +- metadatabuf = grub_malloc (2 * mda_size); +- if (! metadatabuf) ++ err = grub_disk_read (disk, 0, mda_offset, sizeof (mdah_buf), mdah_buf); ++ if (err) + goto fail; + +- err = grub_disk_read (disk, 0, mda_offset, mda_size, metadatabuf); +- if (err) +- goto fail2; ++ mdah = (struct grub_lvm_mda_header *) mdah_buf; + +- mdah = (struct grub_lvm_mda_header *) metadatabuf; + if ((grub_strncmp ((char *)mdah->magic, GRUB_LVM_FMTT_MAGIC, + sizeof (mdah->magic))) + || (grub_le_to_cpu32 (mdah->version) != GRUB_LVM_FMTT_VERSION)) +@@ -191,26 +187,55 @@ grub_lvm_detect (grub_disk_t disk, + #ifdef GRUB_UTIL + grub_util_info ("unknown LVM metadata header"); + #endif +- goto fail2; ++ goto fail; + } + + rlocn = mdah->raw_locns; +- if (grub_le_to_cpu64 (rlocn->offset) + grub_le_to_cpu64 (rlocn->size) > +- grub_le_to_cpu64 (mdah->size)) ++ ++ mda_size = grub_le_to_cpu64 (mdah->size); ++ mda_raw_size = grub_le_to_cpu64 (rlocn->size); ++ mda_raw_offset = grub_le_to_cpu64 (rlocn->offset); ++ ++ metadatabuf = grub_malloc (mda_raw_size); ++ ++ if (! metadatabuf) ++ goto fail; ++ ++ if (mda_raw_offset > mda_size) ++ goto fail2; ++ ++ if (mda_raw_offset + mda_raw_size > mda_size) + { ++ err = grub_disk_read (disk, 0, ++ mda_offset + mda_raw_offset, ++ mda_size - mda_raw_offset, ++ metadatabuf); ++ if (err) ++ goto fail2; ++ + /* Metadata is circular. Copy the wrap in place. */ +- grub_memcpy (metadatabuf + mda_size, +- metadatabuf + GRUB_LVM_MDA_HEADER_SIZE, +- grub_le_to_cpu64 (rlocn->offset) + +- grub_le_to_cpu64 (rlocn->size) - +- grub_le_to_cpu64 (mdah->size)); ++ err = grub_disk_read (disk, 0, ++ mda_offset + GRUB_LVM_MDA_HEADER_SIZE, ++ mda_raw_offset + mda_raw_size - mda_size, ++ metadatabuf + mda_size - mda_raw_offset); ++ if (err) ++ goto fail2; ++ } ++ else ++ { ++ err = grub_disk_read (disk, 0, ++ mda_offset + mda_raw_offset, ++ mda_raw_size, ++ metadatabuf); ++ if (err) ++ goto fail2; + } +- p = q = metadatabuf + grub_le_to_cpu64 (rlocn->offset); ++ p = q = metadatabuf; + +- while (*q != ' ' && q < metadatabuf + mda_size) ++ while (*q != ' ' && q < metadatabuf + mda_raw_size) + q++; + +- if (q == metadatabuf + mda_size) ++ if (q == metadatabuf + mda_raw_size) + { + #ifdef GRUB_UTIL + grub_util_info ("error parsing metadata"); +-- +2.6.6 + diff --git a/grub2.changes b/grub2.changes index c9f724d..3112a86 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,57 @@ +------------------------------------------------------------------- +Mon Mar 20 09:43:58 UTC 2017 - mchang@suse.com + +- Fix out of memory error on lvm detection (bsc#1016536) (bsc#1027401) + * grub2-lvm-allocate-metadata-buffer-from-raw-contents.patch +- Fix boot failure if /boot is separate btrfs partition (bsc#1023160) + * grub2-btrfs-06-subvol-mount.patch + +------------------------------------------------------------------- +Fri Mar 17 06:22:42 UTC 2017 - mchang@suse.com + +- 0004-tpm-Rework-linux-command.patch : Fix out of bound memory copy + (bsc#1029187) + +------------------------------------------------------------------- +Thu Mar 16 16:32:54 UTC 2017 - arvidjaar@gmail.com + +- new upstream version 2.02~rc2 + * rediff + - use-grub2-as-a-package-name.patch + - grub2-linguas.sh-no-rsync.patch + * drop upstream patches + - 0001-efi-strip-off-final-NULL-from-File-Path-in-grub_efi_.patch + +------------------------------------------------------------------- +Mon Mar 6 06:34:01 UTC 2017 - mchang@suse.com + +- TPM Support (FATE#315831) + * 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 + * 0012-tpm-Build-tpm-as-module.patch +- grub2.spec : Add grub-tpm.efi for Secure Boot + +------------------------------------------------------------------- +Fri Mar 3 10:26:10 UTC 2017 - mchang@suse.com + +- Fix invalid Xen EFI config files if xen_args include GRUB2 quoting + (bsc#900418) (bsc#951748) + * grub2-efi-xen-cfg-unquote.patch +- Fix linuxefi erroneously initialize linux's boot_params with non-zero + values. (bsc#1025563) + * grub2-linuxefi-fix-boot-params.patch +- Removed grub2-fix-multi-device-root-kernel-argument.patch as it has + regression on how GRUB_DISABLE_LINUX_UUID=true interpreted (bsc#1015138) + ------------------------------------------------------------------- Wed Mar 1 10:29:46 UTC 2017 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 99af5f7..2d6385d 100644 --- a/grub2.spec +++ b/grub2.spec @@ -136,7 +136,7 @@ BuildRequires: update-bootloader-rpm-macros %define only_x86_64 %{nil} %endif -Version: 2.02~rc1 +Version: 2.02~rc2 Release: 0 Summary: Bootloader with support for Linux, Multiboot and more License: GPL-3.0+ @@ -178,8 +178,9 @@ Patch21: grub2-secureboot-add-linuxefi.patch Patch22: grub2-secureboot-use-linuxefi-on-uefi.patch Patch23: grub2-secureboot-no-insmod-on-sb.patch Patch24: grub2-secureboot-provide-linuxefi-config.patch -Patch29: grub2-secureboot-chainloader.patch -Patch34: grub2-secureboot-use-linuxefi-on-uefi-in-os-prober.patch +Patch25: grub2-secureboot-chainloader.patch +Patch26: grub2-secureboot-use-linuxefi-on-uefi-in-os-prober.patch +Patch27: grub2-linuxefi-fix-boot-params.patch Patch35: grub2-linguas.sh-no-rsync.patch Patch37: grub2-use-Unifont-for-starfield-theme-terminal.patch Patch38: grub2-s390x-01-Changes-made-and-files-added-in-order-to-allow-s390x.patch @@ -206,7 +207,7 @@ Patch77: grub2-s390x-08-workaround-part-to-disk.patch Patch78: grub2-commands-introduce-read_file-subcommand.patch Patch79: grub2-efi-chainload-harder.patch Patch80: grub2-emu-4-all.patch -Patch81: 0001-efi-strip-off-final-NULL-from-File-Path-in-grub_efi_.patch +Patch81: grub2-lvm-allocate-metadata-buffer-from-raw-contents.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 @@ -220,13 +221,13 @@ Patch108: grub2-btrfs-08-workaround-snapshot-menu-default-entry.patch Patch120: grub2-efi-xen-chainload.patch Patch121: grub2-efi-chainloader-root.patch Patch122: grub2-efi-xen-cmdline.patch +Patch123: grub2-efi-xen-cfg-unquote.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-Free-malloc-regions-on-exit.patch # Linux root device related patches -Patch162: grub2-fix-multi-device-root-kernel-argument.patch Patch163: grub2-zipl-setup-fix-btrfs-multipledev.patch Patch164: grub2-suse-remove-linux-root-param.patch # PPC64 LE support @@ -248,6 +249,19 @@ Patch286: 0007-efinet-Setting-network-from-UEFI-device-path.patch 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 Requires: gettext-runtime %if 0%{?suse_version} >= 1140 @@ -426,8 +440,9 @@ swap partition while in resuming %patch22 -p1 %patch23 -p1 %patch24 -p1 -%patch29 -p1 -%patch34 -p1 +%patch25 -p1 +%patch26 -p1 +%patch27 -p1 %patch35 -p1 %patch37 -p1 %patch38 -p1 @@ -466,10 +481,10 @@ swap partition while in resuming %patch120 -p1 %patch121 -p1 %patch122 -p1 +%patch123 -p1 %patch140 -p1 %patch141 -p1 %patch150 -p1 -%patch162 -p1 %patch163 -p1 %patch164 -p1 %patch205 -p1 @@ -488,6 +503,18 @@ 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 # This simplifies patch handling without need to use git to create patch # that renames file @@ -598,6 +625,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} +./grub-mkimage -O %{grubefiarch} -o grub-tpm.efi --prefix= \ + -d grub-core ${GRUB_MODULES} tpm #./grub-mkimage -O %{grubefiarch} -o grub.efi -d grub-core part_gpt hfsplus fat \ # ext2 btrfs normal chain boot configfile linux appleldr minicmd \ # loadbios reboot halt search font gfxterm @@ -671,7 +700,7 @@ cd .. cd build-efi make DESTDIR=$RPM_BUILD_ROOT install -install -m 644 grub.efi $RPM_BUILD_ROOT%{_libdir}/%{name}/%{grubefiarch}/. +install -m 644 grub.efi grub-tpm.efi $RPM_BUILD_ROOT%{_libdir}/%{name}/%{grubefiarch}/. # Create grub.efi link to system efi directory # This is for tools like kiwi not fiddling with the path @@ -685,7 +714,7 @@ ln -sf ../../../%{_libdir}/%{name}/%{grubefiarch}/grub.efi $RPM_BUILD_ROOT%{syse %ifarch x86_64 %if 0%{?suse_version} >= 1230 || 0%{?suse_version} == 1110 -export BRP_PESIGN_FILES="%{_libdir}/%{name}/%{grubefiarch}/grub.efi" +export BRP_PESIGN_FILES="%{_libdir}/%{name}/%{grubefiarch}/grub.efi %{_libdir}/%{name}/%{grubefiarch}/grub-tpm.efi" install -m 444 grub.der $RPM_BUILD_ROOT%{sysefidir}/ %endif %endif @@ -1075,6 +1104,7 @@ fi %defattr(-,root,root,-) %dir %{_libdir}/%{name}/%{grubefiarch} %{_libdir}/%{name}/%{grubefiarch}/grub.efi +%{_libdir}/%{name}/%{grubefiarch}/grub-tpm.efi %{_libdir}/%{name}/%{grubefiarch}/*.img %{_libdir}/%{name}/%{grubefiarch}/*.lst %{_libdir}/%{name}/%{grubefiarch}/*.mod diff --git a/use-grub2-as-a-package-name.patch b/use-grub2-as-a-package-name.patch index 890714f..a9f2a03 100644 --- a/use-grub2-as-a-package-name.patch +++ b/use-grub2-as-a-package-name.patch @@ -12,16 +12,16 @@ Signed-off-by: Jiri Slaby configure.ac | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) -Index: grub-2.02~rc1/configure.ac +Index: grub-2.02~rc2/configure.ac =================================================================== ---- grub-2.02~rc1.orig/configure.ac -+++ grub-2.02~rc1/configure.ac +--- grub-2.02~rc2.orig/configure.ac ++++ grub-2.02~rc2/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.02~rc1],[bug-grub@gnu.org]) -+AC_INIT([GRUB2],[2.02~rc1],[bug-grub@gnu.org]) +-AC_INIT([GRUB],[2.02~rc2],[bug-grub@gnu.org]) ++AC_INIT([GRUB2],[2.02~rc2],[bug-grub@gnu.org]) AC_CONFIG_AUX_DIR([build-aux]) From 119ac5f17c5a2d5ccaf1e8b48243485029b47245aa2c187a67af50d369abbd54 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Mon, 24 Apr 2017 07:46:06 +0000 Subject: [PATCH 06/57] Accepting request 485744 from Base:System 1 OBS-URL: https://build.opensuse.org/request/show/485744 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=160 --- grub2-add-FALLTHROUGH-annotations.patch | 313 ++++++++++++++++++ grub2-btrfs-workaround-grub2-once.patch | 29 +- ...tialized-variable-in-btrfs-with-GCC7.patch | 31 ++ grub2.changes | 13 + grub2.spec | 4 + 5 files changed, 381 insertions(+), 9 deletions(-) create mode 100644 grub2-add-FALLTHROUGH-annotations.patch create mode 100644 grub2-fix-uninitialized-variable-in-btrfs-with-GCC7.patch diff --git a/grub2-add-FALLTHROUGH-annotations.patch b/grub2-add-FALLTHROUGH-annotations.patch new file mode 100644 index 0000000..dad2ce3 --- /dev/null +++ b/grub2-add-FALLTHROUGH-annotations.patch @@ -0,0 +1,313 @@ +From: Andrei Borzenkov +Subject: [PATCH] i386, x86_64, ppc: fix switch fallthrough cases with GCC7 + +In util/getroot and efidisk slightly modify exitsing comment to mostly +retain it but still make GCC7 compliant with respect to fall through +annotation. + +In grub-core/lib/xzembed/xz_dec_lzma2.c it adds same comments as +upstream (I plan to update after release). + +In grub-core/tests/setjmp_tets.c declare functions as "noreturn" to +suppress GCC7 warning. + +In grub-core/gnulib/regexec.c move FALLTHROUGH outside of #ifdef block, +otherwise it is not accepted by GCC7 parser (which requires that comment +immediately precedes case statement). + +Otherwise add FALLTHROUGH comment. + +Closes: 50598 + +--- + grub-core/commands/hdparm.c | 1 + + grub-core/commands/nativedisk.c | 1 + + grub-core/disk/cryptodisk.c | 1 + + grub-core/disk/efi/efidisk.c | 2 +- + grub-core/efiemu/mm.c | 1 + + grub-core/gdb/cstub.c | 1 + + grub-core/gnulib/regexec.c | 4 +++- + grub-core/lib/xzembed/xz_dec_lzma2.c | 4 ++++ + grub-core/lib/xzembed/xz_dec_stream.c | 6 ++++++ + grub-core/loader/i386/linux.c | 3 +++ + grub-core/tests/setjmp_test.c | 5 ++++- + grub-core/video/ieee1275.c | 1 + + grub-core/video/readers/jpeg.c | 1 + + util/getroot.c | 2 +- + util/grub-install.c | 1 + + util/grub-mkimagexx.c | 1 + + util/grub-mount.c | 1 + + 17 files changed, 32 insertions(+), 4 deletions(-) + +diff --git a/grub-core/commands/hdparm.c b/grub-core/commands/hdparm.c +index f6b178e..d3fa966 100644 +--- a/grub-core/commands/hdparm.c ++++ b/grub-core/commands/hdparm.c +@@ -328,6 +328,7 @@ grub_cmd_hdparm (grub_extcmd_context_t ctxt, int argc, char **args) + ata = ((struct grub_scsi *) disk->data)->data; + break; + } ++ /* FALLTHROUGH */ + default: + grub_disk_close (disk); + return grub_error (GRUB_ERR_IO, "not an ATA device"); +diff --git a/grub-core/commands/nativedisk.c b/grub-core/commands/nativedisk.c +index 345f97c..2f56a87 100644 +--- a/grub-core/commands/nativedisk.c ++++ b/grub-core/commands/nativedisk.c +@@ -79,6 +79,7 @@ get_uuid (const char *name, char **uuid, int getnative) + case GRUB_DISK_DEVICE_XEN: + if (getnative) + break; ++ /* FALLTHROUGH */ + + /* Virtual disks. */ + /* GRUB dynamically generated files. */ +diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c +index 1e03a09..bd60a66 100644 +--- a/grub-core/disk/cryptodisk.c ++++ b/grub-core/disk/cryptodisk.c +@@ -282,6 +282,7 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev, + break; + case GRUB_CRYPTODISK_MODE_IV_PLAIN64: + iv[1] = grub_cpu_to_le32 (sector >> 32); ++ /* FALLTHROUGH */ + case GRUB_CRYPTODISK_MODE_IV_PLAIN: + iv[0] = grub_cpu_to_le32 (sector & 0xFFFFFFFF); + break; +diff --git a/grub-core/disk/efi/efidisk.c b/grub-core/disk/efi/efidisk.c +index e66b35d..5d2400f 100644 +--- a/grub-core/disk/efi/efidisk.c ++++ b/grub-core/disk/efi/efidisk.c +@@ -224,7 +224,7 @@ name_devices (struct grub_efidisk_data *devices) + { + case GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE: + is_hard_drive = 1; +- /* Fall through by intention. */ ++ /* Intentionally fall through. */ + case GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE: + { + struct grub_efidisk_data *parent, *parent2; +diff --git a/grub-core/efiemu/mm.c b/grub-core/efiemu/mm.c +index e606dbf..52a032f 100644 +--- a/grub-core/efiemu/mm.c ++++ b/grub-core/efiemu/mm.c +@@ -417,6 +417,7 @@ fill_hook (grub_uint64_t addr, grub_uint64_t size, grub_memory_type_t type, + default: + grub_dprintf ("efiemu", + "Unknown memory type %d. Assuming unusable\n", type); ++ /* FALLTHROUGH */ + case GRUB_MEMORY_RESERVED: + return grub_efiemu_add_to_mmap (addr, size, + GRUB_EFI_UNUSABLE_MEMORY); +diff --git a/grub-core/gdb/cstub.c b/grub-core/gdb/cstub.c +index c94411b..b64acd7 100644 +--- a/grub-core/gdb/cstub.c ++++ b/grub-core/gdb/cstub.c +@@ -336,6 +336,7 @@ grub_gdb_trap (int trap_no) + /* sAA..AA: Step one instruction from AA..AA(optional). */ + case 's': + stepping = 1; ++ /* FALLTHROUGH */ + + /* cAA..AA: Continue at address AA..AA(optional). */ + case 'c': +diff --git a/grub-core/gnulib/regexec.c b/grub-core/gnulib/regexec.c +index f632cd4..c8d2f09 100644 +--- a/grub-core/gnulib/regexec.c ++++ b/grub-core/gnulib/regexec.c +@@ -4099,8 +4099,10 @@ check_node_accept (const re_match_context_t *mctx, const re_token_t *node, + case OP_UTF8_PERIOD: + if (ch >= ASCII_CHARS) + return false; +- /* FALLTHROUGH */ ++ goto FALLTHROUGH_TO_OP_PERIOD; ++ FALLTHROUGH_TO_OP_PERIOD: + #endif ++ + case OP_PERIOD: + if ((ch == '\n' && !(mctx->dfa->syntax & RE_DOT_NEWLINE)) + || (ch == '\0' && (mctx->dfa->syntax & RE_DOT_NOT_NULL))) +diff --git a/grub-core/lib/xzembed/xz_dec_lzma2.c b/grub-core/lib/xzembed/xz_dec_lzma2.c +index 8a2a118..af7b770 100644 +--- a/grub-core/lib/xzembed/xz_dec_lzma2.c ++++ b/grub-core/lib/xzembed/xz_dec_lzma2.c +@@ -1044,6 +1044,8 @@ enum xz_ret xz_dec_lzma2_run( + + s->lzma2.sequence = SEQ_LZMA_PREPARE; + ++ /* Fall through */ ++ + case SEQ_LZMA_PREPARE: + if (s->lzma2.compressed < RC_INIT_BYTES) + return XZ_DATA_ERROR; +@@ -1054,6 +1056,8 @@ enum xz_ret xz_dec_lzma2_run( + s->lzma2.compressed -= RC_INIT_BYTES; + s->lzma2.sequence = SEQ_LZMA_RUN; + ++ /* Fall through */ ++ + case SEQ_LZMA_RUN: + /* + * Set dictionary limit to indicate how much we want +diff --git a/grub-core/lib/xzembed/xz_dec_stream.c b/grub-core/lib/xzembed/xz_dec_stream.c +index c16b130..a29751e 100644 +--- a/grub-core/lib/xzembed/xz_dec_stream.c ++++ b/grub-core/lib/xzembed/xz_dec_stream.c +@@ -750,6 +750,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b) + + s->sequence = SEQ_BLOCK_START; + ++ /* FALLTHROUGH */ + case SEQ_BLOCK_START: + /* We need one byte of input to continue. */ + if (b->in_pos == b->in_size) +@@ -773,6 +774,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b) + s->temp.pos = 0; + s->sequence = SEQ_BLOCK_HEADER; + ++ /* FALLTHROUGH */ + case SEQ_BLOCK_HEADER: + if (!fill_temp(s, b)) + return XZ_OK; +@@ -783,6 +785,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b) + + s->sequence = SEQ_BLOCK_UNCOMPRESS; + ++ /* FALLTHROUGH */ + case SEQ_BLOCK_UNCOMPRESS: + ret = dec_block(s, b); + if (ret != XZ_STREAM_END) +@@ -810,6 +813,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b) + + s->sequence = SEQ_BLOCK_CHECK; + ++ /* FALLTHROUGH */ + case SEQ_BLOCK_CHECK: + ret = hash_validate(s, b, 0); + if (ret != XZ_STREAM_END) +@@ -858,6 +862,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b) + + s->sequence = SEQ_INDEX_CRC32; + ++ /* FALLTHROUGH */ + case SEQ_INDEX_CRC32: + ret = hash_validate(s, b, 1); + if (ret != XZ_STREAM_END) +@@ -866,6 +871,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b) + s->temp.size = STREAM_HEADER_SIZE; + s->sequence = SEQ_STREAM_FOOTER; + ++ /* FALLTHROUGH */ + case SEQ_STREAM_FOOTER: + if (!fill_temp(s, b)) + return XZ_OK; +diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c +index b15b8cc..083f941 100644 +--- a/grub-core/loader/i386/linux.c ++++ b/grub-core/loader/i386/linux.c +@@ -984,10 +984,13 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), + { + case 'g': + shift += 10; ++ /* FALLTHROUGH */ + case 'm': + shift += 10; ++ /* FALLTHROUGH */ + case 'k': + shift += 10; ++ /* FALLTHROUGH */ + default: + break; + } +diff --git a/grub-core/tests/setjmp_test.c b/grub-core/tests/setjmp_test.c +index 390cb26..604a6ce 100644 +--- a/grub-core/tests/setjmp_test.c ++++ b/grub-core/tests/setjmp_test.c +@@ -25,7 +25,10 @@ GRUB_MOD_LICENSE ("GPLv3+"); + static grub_jmp_buf jmp_point; + static int expected, ctr; + +-#pragma GCC diagnostic ignored "-Wmissing-noreturn" ++/* This fixes GCC7 "unintentional fallthrough" warning */ ++static void jmp0 (void) __attribute__ ((noreturn)); ++static void jmp1 (void) __attribute__ ((noreturn)); ++static void jmp2 (void) __attribute__ ((noreturn)); + + static void + jmp0 (void) +diff --git a/grub-core/video/ieee1275.c b/grub-core/video/ieee1275.c +index 0b150ec..17a3dbb 100644 +--- a/grub-core/video/ieee1275.c ++++ b/grub-core/video/ieee1275.c +@@ -181,6 +181,7 @@ grub_video_ieee1275_fill_mode_info (grub_ieee1275_phandle_t dev, + case 32: + out->reserved_mask_size = 8; + out->reserved_field_pos = 24; ++ /* FALLTHROUGH */ + + case 24: + out->red_mask_size = 8; +diff --git a/grub-core/video/readers/jpeg.c b/grub-core/video/readers/jpeg.c +index c3e0df2..21b0d9d 100644 +--- a/grub-core/video/readers/jpeg.c ++++ b/grub-core/video/readers/jpeg.c +@@ -736,6 +736,7 @@ grub_jpeg_decode_jpeg (struct grub_jpeg_data *data) + case JPEG_MARKER_SOS: /* Start Of Scan. */ + if (grub_jpeg_decode_sos (data)) + break; ++ /* FALLTHROUGH */ + case JPEG_MARKER_RST0: /* Restart. */ + case JPEG_MARKER_RST1: + case JPEG_MARKER_RST2: +diff --git a/util/getroot.c b/util/getroot.c +index 92c0d70..847406f 100644 +--- a/util/getroot.c ++++ b/util/getroot.c +@@ -99,7 +99,7 @@ grub_util_pull_device (const char *os_dev) + { + case GRUB_DEV_ABSTRACTION_LVM: + grub_util_pull_lvm_by_command (os_dev); +- /* Fallthrough in case that lvm-tools are unavailable. */ ++ /* Fallthrough - in case that lvm-tools are unavailable. */ + case GRUB_DEV_ABSTRACTION_LUKS: + grub_util_pull_devmapper (os_dev); + return; +diff --git a/util/grub-install.c b/util/grub-install.c +index 6c89c2b..9074d3e 100644 +--- a/util/grub-install.c ++++ b/util/grub-install.c +@@ -1851,6 +1851,7 @@ main (int argc, char *argv[]) + free (mach_kernel); + break; + } ++ /* FALLTHROUGH */ + case GRUB_INSTALL_PLATFORM_ARM_EFI: + case GRUB_INSTALL_PLATFORM_ARM64_EFI: + case GRUB_INSTALL_PLATFORM_IA64_EFI: +diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c +index f8faae8..e63f148 100644 +--- a/util/grub-mkimagexx.c ++++ b/util/grub-mkimagexx.c +@@ -907,6 +907,7 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections, + + sym->st_value + - image_target->vaddr_offset)); + } ++ /* FALLTHROUGH */ + case R_IA64_LTOFF_FPTR22: + *gpptr = grub_host_to_target64 (addend + sym_addr); + grub_ia64_add_value_to_slot_21 ((grub_addr_t) target, +diff --git a/util/grub-mount.c b/util/grub-mount.c +index aca5f82..a25db8a 100644 +--- a/util/grub-mount.c ++++ b/util/grub-mount.c +@@ -530,6 +530,7 @@ argp_parser (int key, char *arg, struct argp_state *state) + if (arg[0] != '-') + break; + ++ /* FALLTHROUGH */ + default: + if (!arg) + return 0; +-- +tg: (8014b7b..) bug/50598 (depends on: master) diff --git a/grub2-btrfs-workaround-grub2-once.patch b/grub2-btrfs-workaround-grub2-once.patch index a914e88..d4d0780 100644 --- a/grub2-btrfs-workaround-grub2-once.patch +++ b/grub2-btrfs-workaround-grub2-once.patch @@ -1,7 +1,7 @@ -Index: grub-2.02~beta3/grub-core/kern/fs.c +Index: grub-2.02~rc2/grub-core/kern/fs.c =================================================================== ---- grub-2.02~beta3.orig/grub-core/kern/fs.c -+++ grub-2.02~beta3/grub-core/kern/fs.c +--- grub-2.02~rc2.orig/grub-core/kern/fs.c ++++ grub-2.02~rc2/grub-core/kern/fs.c @@ -27,6 +27,7 @@ #include #include @@ -24,10 +24,10 @@ Index: grub-2.02~beta3/grub-core/kern/fs.c ret += size; len -= size; sector -= ((size + offset) >> GRUB_DISK_SECTOR_BITS); -Index: grub-2.02~beta3/util/grub-editenv.c +Index: grub-2.02~rc2/util/grub-editenv.c =================================================================== ---- grub-2.02~beta3.orig/util/grub-editenv.c -+++ grub-2.02~beta3/util/grub-editenv.c +--- grub-2.02~rc2.orig/util/grub-editenv.c ++++ grub-2.02~rc2/util/grub-editenv.c @@ -23,8 +23,11 @@ #include #include @@ -437,10 +437,10 @@ Index: grub-2.02~beta3/util/grub-editenv.c if (strcmp (command, "create") == 0) grub_util_create_envblk_file (filename); else if (strcmp (command, "list") == 0) -Index: grub-2.02~beta3/util/grub.d/00_header.in +Index: grub-2.02~rc2/util/grub.d/00_header.in =================================================================== ---- grub-2.02~beta3.orig/util/grub.d/00_header.in -+++ grub-2.02~beta3/util/grub.d/00_header.in +--- grub-2.02~rc2.orig/util/grub.d/00_header.in ++++ grub-2.02~rc2/util/grub.d/00_header.in @@ -46,6 +46,11 @@ cat << EOF if [ -s \$prefix/grubenv ]; then load_env @@ -473,3 +473,14 @@ Index: grub-2.02~beta3/util/grub.d/00_header.in set boot_once=true else set default="${GRUB_DEFAULT}" +@@ -94,6 +105,10 @@ function savedefault { + if [ -z "\${boot_once}" ]; then + saved_entry="\${chosen}" + save_env saved_entry ++ if [ "\${env_block}" ] ; then ++ save_env -f "\${env_block}" saved_entry ++ fi ++ + fi + } + diff --git a/grub2-fix-uninitialized-variable-in-btrfs-with-GCC7.patch b/grub2-fix-uninitialized-variable-in-btrfs-with-GCC7.patch new file mode 100644 index 0000000..d463f84 --- /dev/null +++ b/grub2-fix-uninitialized-variable-in-btrfs-with-GCC7.patch @@ -0,0 +1,31 @@ +From: Andrei Borzenkov +Subject: [PATCH] btrfs: avoid "used uninitialized" error with GCC7 + +sblock was local and so considered new variable on every loop +iteration. + +Closes: 50597 + +--- + grub-core/fs/btrfs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c +index 9cffa91..4849c1c 100644 +--- a/grub-core/fs/btrfs.c ++++ b/grub-core/fs/btrfs.c +@@ -227,11 +227,11 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, + static grub_err_t + read_sblock (grub_disk_t disk, struct grub_btrfs_superblock *sb) + { ++ struct grub_btrfs_superblock sblock; + unsigned i; + grub_err_t err = GRUB_ERR_NONE; + for (i = 0; i < ARRAY_SIZE (superblock_sectors); i++) + { +- struct grub_btrfs_superblock sblock; + /* Don't try additional superblocks beyond device size. */ + if (i && (grub_le_to_cpu64 (sblock.this_device.size) + >> GRUB_DISK_SECTOR_BITS) <= superblock_sectors[i]) +-- +tg: (ec4af11..) bug/50597-light (depends on: master) diff --git a/grub2.changes b/grub2.changes index 3112a86..137fb0d 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,16 @@ +------------------------------------------------------------------- +Sun Mar 26 18:08:20 UTC 2017 - arvidjaar@gmail.com + +- update grub2-btrfs-workaround-grub2-once.patch to also store saved_entry + in additional environment block (boo#1031025) + +------------------------------------------------------------------- +Wed Mar 22 17:39:52 UTC 2017 - arvidjaar@gmail.com + +- fix building with GCC (bsc#1030247) + * add grub2-fix-uninitialized-variable-in-btrfs-with-GCC7.patch + * grub2-add-FALLTHROUGH-annotations.patch + ------------------------------------------------------------------- Mon Mar 20 09:43:58 UTC 2017 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 2d6385d..f5f930e 100644 --- a/grub2.spec +++ b/grub2.spec @@ -208,6 +208,8 @@ Patch78: grub2-commands-introduce-read_file-subcommand.patch Patch79: grub2-efi-chainload-harder.patch Patch80: grub2-emu-4-all.patch Patch81: grub2-lvm-allocate-metadata-buffer-from-raw-contents.patch +Patch82: grub2-fix-uninitialized-variable-in-btrfs-with-GCC7.patch +Patch83: grub2-add-FALLTHROUGH-annotations.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 @@ -470,6 +472,8 @@ swap partition while in resuming %patch79 -p1 %patch80 -p1 %patch81 -p1 +%patch82 -p1 +%patch83 -p1 %patch101 -p1 %patch102 -p1 %patch103 -p1 From 6d75b85fc1be43003fd24b6fef8a0bd393f06d0e7911046f3e2ef8435559dbe2 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Sat, 6 May 2017 18:45:23 +0000 Subject: [PATCH 07/57] Accepting request 492386 from Base:System 1 OBS-URL: https://build.opensuse.org/request/show/492386 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=161 --- grub-2.02.tar.xz | 3 + grub-2.02~rc2.tar.xz | 3 - grub2-add-FALLTHROUGH-annotations.patch | 313 ------------------ ...tialized-variable-in-btrfs-with-GCC7.patch | 31 -- grub2.changes | 11 + grub2.spec | 8 +- translations-20140921.tar.xz | 3 - translations-20170427.tar.xz | 3 + use-grub2-as-a-package-name.patch | 10 +- 9 files changed, 24 insertions(+), 361 deletions(-) create mode 100644 grub-2.02.tar.xz delete mode 100644 grub-2.02~rc2.tar.xz delete mode 100644 grub2-add-FALLTHROUGH-annotations.patch delete mode 100644 grub2-fix-uninitialized-variable-in-btrfs-with-GCC7.patch delete mode 100644 translations-20140921.tar.xz create mode 100644 translations-20170427.tar.xz diff --git a/grub-2.02.tar.xz b/grub-2.02.tar.xz new file mode 100644 index 0000000..99e42af --- /dev/null +++ b/grub-2.02.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:810b3798d316394f94096ec2797909dbf23c858e48f7b3830826b8daa06b7b0f +size 6113260 diff --git a/grub-2.02~rc2.tar.xz b/grub-2.02~rc2.tar.xz deleted file mode 100644 index 4622bd8..0000000 --- a/grub-2.02~rc2.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:053bfcbe366733e4f5a1baf4eb15e1efd977225bdd323b78087ce5fa172fc246 -size 6055836 diff --git a/grub2-add-FALLTHROUGH-annotations.patch b/grub2-add-FALLTHROUGH-annotations.patch deleted file mode 100644 index dad2ce3..0000000 --- a/grub2-add-FALLTHROUGH-annotations.patch +++ /dev/null @@ -1,313 +0,0 @@ -From: Andrei Borzenkov -Subject: [PATCH] i386, x86_64, ppc: fix switch fallthrough cases with GCC7 - -In util/getroot and efidisk slightly modify exitsing comment to mostly -retain it but still make GCC7 compliant with respect to fall through -annotation. - -In grub-core/lib/xzembed/xz_dec_lzma2.c it adds same comments as -upstream (I plan to update after release). - -In grub-core/tests/setjmp_tets.c declare functions as "noreturn" to -suppress GCC7 warning. - -In grub-core/gnulib/regexec.c move FALLTHROUGH outside of #ifdef block, -otherwise it is not accepted by GCC7 parser (which requires that comment -immediately precedes case statement). - -Otherwise add FALLTHROUGH comment. - -Closes: 50598 - ---- - grub-core/commands/hdparm.c | 1 + - grub-core/commands/nativedisk.c | 1 + - grub-core/disk/cryptodisk.c | 1 + - grub-core/disk/efi/efidisk.c | 2 +- - grub-core/efiemu/mm.c | 1 + - grub-core/gdb/cstub.c | 1 + - grub-core/gnulib/regexec.c | 4 +++- - grub-core/lib/xzembed/xz_dec_lzma2.c | 4 ++++ - grub-core/lib/xzembed/xz_dec_stream.c | 6 ++++++ - grub-core/loader/i386/linux.c | 3 +++ - grub-core/tests/setjmp_test.c | 5 ++++- - grub-core/video/ieee1275.c | 1 + - grub-core/video/readers/jpeg.c | 1 + - util/getroot.c | 2 +- - util/grub-install.c | 1 + - util/grub-mkimagexx.c | 1 + - util/grub-mount.c | 1 + - 17 files changed, 32 insertions(+), 4 deletions(-) - -diff --git a/grub-core/commands/hdparm.c b/grub-core/commands/hdparm.c -index f6b178e..d3fa966 100644 ---- a/grub-core/commands/hdparm.c -+++ b/grub-core/commands/hdparm.c -@@ -328,6 +328,7 @@ grub_cmd_hdparm (grub_extcmd_context_t ctxt, int argc, char **args) - ata = ((struct grub_scsi *) disk->data)->data; - break; - } -+ /* FALLTHROUGH */ - default: - grub_disk_close (disk); - return grub_error (GRUB_ERR_IO, "not an ATA device"); -diff --git a/grub-core/commands/nativedisk.c b/grub-core/commands/nativedisk.c -index 345f97c..2f56a87 100644 ---- a/grub-core/commands/nativedisk.c -+++ b/grub-core/commands/nativedisk.c -@@ -79,6 +79,7 @@ get_uuid (const char *name, char **uuid, int getnative) - case GRUB_DISK_DEVICE_XEN: - if (getnative) - break; -+ /* FALLTHROUGH */ - - /* Virtual disks. */ - /* GRUB dynamically generated files. */ -diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c -index 1e03a09..bd60a66 100644 ---- a/grub-core/disk/cryptodisk.c -+++ b/grub-core/disk/cryptodisk.c -@@ -282,6 +282,7 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev, - break; - case GRUB_CRYPTODISK_MODE_IV_PLAIN64: - iv[1] = grub_cpu_to_le32 (sector >> 32); -+ /* FALLTHROUGH */ - case GRUB_CRYPTODISK_MODE_IV_PLAIN: - iv[0] = grub_cpu_to_le32 (sector & 0xFFFFFFFF); - break; -diff --git a/grub-core/disk/efi/efidisk.c b/grub-core/disk/efi/efidisk.c -index e66b35d..5d2400f 100644 ---- a/grub-core/disk/efi/efidisk.c -+++ b/grub-core/disk/efi/efidisk.c -@@ -224,7 +224,7 @@ name_devices (struct grub_efidisk_data *devices) - { - case GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE: - is_hard_drive = 1; -- /* Fall through by intention. */ -+ /* Intentionally fall through. */ - case GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE: - { - struct grub_efidisk_data *parent, *parent2; -diff --git a/grub-core/efiemu/mm.c b/grub-core/efiemu/mm.c -index e606dbf..52a032f 100644 ---- a/grub-core/efiemu/mm.c -+++ b/grub-core/efiemu/mm.c -@@ -417,6 +417,7 @@ fill_hook (grub_uint64_t addr, grub_uint64_t size, grub_memory_type_t type, - default: - grub_dprintf ("efiemu", - "Unknown memory type %d. Assuming unusable\n", type); -+ /* FALLTHROUGH */ - case GRUB_MEMORY_RESERVED: - return grub_efiemu_add_to_mmap (addr, size, - GRUB_EFI_UNUSABLE_MEMORY); -diff --git a/grub-core/gdb/cstub.c b/grub-core/gdb/cstub.c -index c94411b..b64acd7 100644 ---- a/grub-core/gdb/cstub.c -+++ b/grub-core/gdb/cstub.c -@@ -336,6 +336,7 @@ grub_gdb_trap (int trap_no) - /* sAA..AA: Step one instruction from AA..AA(optional). */ - case 's': - stepping = 1; -+ /* FALLTHROUGH */ - - /* cAA..AA: Continue at address AA..AA(optional). */ - case 'c': -diff --git a/grub-core/gnulib/regexec.c b/grub-core/gnulib/regexec.c -index f632cd4..c8d2f09 100644 ---- a/grub-core/gnulib/regexec.c -+++ b/grub-core/gnulib/regexec.c -@@ -4099,8 +4099,10 @@ check_node_accept (const re_match_context_t *mctx, const re_token_t *node, - case OP_UTF8_PERIOD: - if (ch >= ASCII_CHARS) - return false; -- /* FALLTHROUGH */ -+ goto FALLTHROUGH_TO_OP_PERIOD; -+ FALLTHROUGH_TO_OP_PERIOD: - #endif -+ - case OP_PERIOD: - if ((ch == '\n' && !(mctx->dfa->syntax & RE_DOT_NEWLINE)) - || (ch == '\0' && (mctx->dfa->syntax & RE_DOT_NOT_NULL))) -diff --git a/grub-core/lib/xzembed/xz_dec_lzma2.c b/grub-core/lib/xzembed/xz_dec_lzma2.c -index 8a2a118..af7b770 100644 ---- a/grub-core/lib/xzembed/xz_dec_lzma2.c -+++ b/grub-core/lib/xzembed/xz_dec_lzma2.c -@@ -1044,6 +1044,8 @@ enum xz_ret xz_dec_lzma2_run( - - s->lzma2.sequence = SEQ_LZMA_PREPARE; - -+ /* Fall through */ -+ - case SEQ_LZMA_PREPARE: - if (s->lzma2.compressed < RC_INIT_BYTES) - return XZ_DATA_ERROR; -@@ -1054,6 +1056,8 @@ enum xz_ret xz_dec_lzma2_run( - s->lzma2.compressed -= RC_INIT_BYTES; - s->lzma2.sequence = SEQ_LZMA_RUN; - -+ /* Fall through */ -+ - case SEQ_LZMA_RUN: - /* - * Set dictionary limit to indicate how much we want -diff --git a/grub-core/lib/xzembed/xz_dec_stream.c b/grub-core/lib/xzembed/xz_dec_stream.c -index c16b130..a29751e 100644 ---- a/grub-core/lib/xzembed/xz_dec_stream.c -+++ b/grub-core/lib/xzembed/xz_dec_stream.c -@@ -750,6 +750,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b) - - s->sequence = SEQ_BLOCK_START; - -+ /* FALLTHROUGH */ - case SEQ_BLOCK_START: - /* We need one byte of input to continue. */ - if (b->in_pos == b->in_size) -@@ -773,6 +774,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b) - s->temp.pos = 0; - s->sequence = SEQ_BLOCK_HEADER; - -+ /* FALLTHROUGH */ - case SEQ_BLOCK_HEADER: - if (!fill_temp(s, b)) - return XZ_OK; -@@ -783,6 +785,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b) - - s->sequence = SEQ_BLOCK_UNCOMPRESS; - -+ /* FALLTHROUGH */ - case SEQ_BLOCK_UNCOMPRESS: - ret = dec_block(s, b); - if (ret != XZ_STREAM_END) -@@ -810,6 +813,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b) - - s->sequence = SEQ_BLOCK_CHECK; - -+ /* FALLTHROUGH */ - case SEQ_BLOCK_CHECK: - ret = hash_validate(s, b, 0); - if (ret != XZ_STREAM_END) -@@ -858,6 +862,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b) - - s->sequence = SEQ_INDEX_CRC32; - -+ /* FALLTHROUGH */ - case SEQ_INDEX_CRC32: - ret = hash_validate(s, b, 1); - if (ret != XZ_STREAM_END) -@@ -866,6 +871,7 @@ static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b) - s->temp.size = STREAM_HEADER_SIZE; - s->sequence = SEQ_STREAM_FOOTER; - -+ /* FALLTHROUGH */ - case SEQ_STREAM_FOOTER: - if (!fill_temp(s, b)) - return XZ_OK; -diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c -index b15b8cc..083f941 100644 ---- a/grub-core/loader/i386/linux.c -+++ b/grub-core/loader/i386/linux.c -@@ -984,10 +984,13 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - { - case 'g': - shift += 10; -+ /* FALLTHROUGH */ - case 'm': - shift += 10; -+ /* FALLTHROUGH */ - case 'k': - shift += 10; -+ /* FALLTHROUGH */ - default: - break; - } -diff --git a/grub-core/tests/setjmp_test.c b/grub-core/tests/setjmp_test.c -index 390cb26..604a6ce 100644 ---- a/grub-core/tests/setjmp_test.c -+++ b/grub-core/tests/setjmp_test.c -@@ -25,7 +25,10 @@ GRUB_MOD_LICENSE ("GPLv3+"); - static grub_jmp_buf jmp_point; - static int expected, ctr; - --#pragma GCC diagnostic ignored "-Wmissing-noreturn" -+/* This fixes GCC7 "unintentional fallthrough" warning */ -+static void jmp0 (void) __attribute__ ((noreturn)); -+static void jmp1 (void) __attribute__ ((noreturn)); -+static void jmp2 (void) __attribute__ ((noreturn)); - - static void - jmp0 (void) -diff --git a/grub-core/video/ieee1275.c b/grub-core/video/ieee1275.c -index 0b150ec..17a3dbb 100644 ---- a/grub-core/video/ieee1275.c -+++ b/grub-core/video/ieee1275.c -@@ -181,6 +181,7 @@ grub_video_ieee1275_fill_mode_info (grub_ieee1275_phandle_t dev, - case 32: - out->reserved_mask_size = 8; - out->reserved_field_pos = 24; -+ /* FALLTHROUGH */ - - case 24: - out->red_mask_size = 8; -diff --git a/grub-core/video/readers/jpeg.c b/grub-core/video/readers/jpeg.c -index c3e0df2..21b0d9d 100644 ---- a/grub-core/video/readers/jpeg.c -+++ b/grub-core/video/readers/jpeg.c -@@ -736,6 +736,7 @@ grub_jpeg_decode_jpeg (struct grub_jpeg_data *data) - case JPEG_MARKER_SOS: /* Start Of Scan. */ - if (grub_jpeg_decode_sos (data)) - break; -+ /* FALLTHROUGH */ - case JPEG_MARKER_RST0: /* Restart. */ - case JPEG_MARKER_RST1: - case JPEG_MARKER_RST2: -diff --git a/util/getroot.c b/util/getroot.c -index 92c0d70..847406f 100644 ---- a/util/getroot.c -+++ b/util/getroot.c -@@ -99,7 +99,7 @@ grub_util_pull_device (const char *os_dev) - { - case GRUB_DEV_ABSTRACTION_LVM: - grub_util_pull_lvm_by_command (os_dev); -- /* Fallthrough in case that lvm-tools are unavailable. */ -+ /* Fallthrough - in case that lvm-tools are unavailable. */ - case GRUB_DEV_ABSTRACTION_LUKS: - grub_util_pull_devmapper (os_dev); - return; -diff --git a/util/grub-install.c b/util/grub-install.c -index 6c89c2b..9074d3e 100644 ---- a/util/grub-install.c -+++ b/util/grub-install.c -@@ -1851,6 +1851,7 @@ main (int argc, char *argv[]) - free (mach_kernel); - break; - } -+ /* FALLTHROUGH */ - case GRUB_INSTALL_PLATFORM_ARM_EFI: - case GRUB_INSTALL_PLATFORM_ARM64_EFI: - case GRUB_INSTALL_PLATFORM_IA64_EFI: -diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c -index f8faae8..e63f148 100644 ---- a/util/grub-mkimagexx.c -+++ b/util/grub-mkimagexx.c -@@ -907,6 +907,7 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections, - + sym->st_value - - image_target->vaddr_offset)); - } -+ /* FALLTHROUGH */ - case R_IA64_LTOFF_FPTR22: - *gpptr = grub_host_to_target64 (addend + sym_addr); - grub_ia64_add_value_to_slot_21 ((grub_addr_t) target, -diff --git a/util/grub-mount.c b/util/grub-mount.c -index aca5f82..a25db8a 100644 ---- a/util/grub-mount.c -+++ b/util/grub-mount.c -@@ -530,6 +530,7 @@ argp_parser (int key, char *arg, struct argp_state *state) - if (arg[0] != '-') - break; - -+ /* FALLTHROUGH */ - default: - if (!arg) - return 0; --- -tg: (8014b7b..) bug/50598 (depends on: master) diff --git a/grub2-fix-uninitialized-variable-in-btrfs-with-GCC7.patch b/grub2-fix-uninitialized-variable-in-btrfs-with-GCC7.patch deleted file mode 100644 index d463f84..0000000 --- a/grub2-fix-uninitialized-variable-in-btrfs-with-GCC7.patch +++ /dev/null @@ -1,31 +0,0 @@ -From: Andrei Borzenkov -Subject: [PATCH] btrfs: avoid "used uninitialized" error with GCC7 - -sblock was local and so considered new variable on every loop -iteration. - -Closes: 50597 - ---- - grub-core/fs/btrfs.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c -index 9cffa91..4849c1c 100644 ---- a/grub-core/fs/btrfs.c -+++ b/grub-core/fs/btrfs.c -@@ -227,11 +227,11 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, - static grub_err_t - read_sblock (grub_disk_t disk, struct grub_btrfs_superblock *sb) - { -+ struct grub_btrfs_superblock sblock; - unsigned i; - grub_err_t err = GRUB_ERR_NONE; - for (i = 0; i < ARRAY_SIZE (superblock_sectors); i++) - { -- struct grub_btrfs_superblock sblock; - /* Don't try additional superblocks beyond device size. */ - if (i && (grub_le_to_cpu64 (sblock.this_device.size) - >> GRUB_DISK_SECTOR_BITS) <= superblock_sectors[i]) --- -tg: (ec4af11..) bug/50597-light (depends on: master) diff --git a/grub2.changes b/grub2.changes index 137fb0d..e9704bc 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,14 @@ +------------------------------------------------------------------- +Thu Apr 27 18:39:21 UTC 2017 - arvidjaar@gmail.com + +- new upstream version 2.02 + * rediff + - use-grub2-as-a-package-name.patch + * drop upstream patches + - grub2-fix-uninitialized-variable-in-btrfs-with-GCC7.patch + - grub2-add-FALLTHROUGH-annotations.patch +- update translations + ------------------------------------------------------------------- Sun Mar 26 18:08:20 UTC 2017 - arvidjaar@gmail.com diff --git a/grub2.spec b/grub2.spec index f5f930e..ac9b1a9 100644 --- a/grub2.spec +++ b/grub2.spec @@ -136,7 +136,7 @@ BuildRequires: update-bootloader-rpm-macros %define only_x86_64 %{nil} %endif -Version: 2.02~rc2 +Version: 2.02 Release: 0 Summary: Bootloader with support for Linux, Multiboot and more License: GPL-3.0+ @@ -148,7 +148,7 @@ Source1: 90_persistent Source2: grub.default Source4: grub2.rpmlintrc # rsync -Lrtvz translationproject.org::tp/latest/grub/ po -Source5: translations-20140921.tar.xz +Source5: translations-20170427.tar.xz Source6: grub2-once Source7: 20_memtest86+ Source8: README.ibm3215 @@ -208,8 +208,6 @@ Patch78: grub2-commands-introduce-read_file-subcommand.patch Patch79: grub2-efi-chainload-harder.patch Patch80: grub2-emu-4-all.patch Patch81: grub2-lvm-allocate-metadata-buffer-from-raw-contents.patch -Patch82: grub2-fix-uninitialized-variable-in-btrfs-with-GCC7.patch -Patch83: grub2-add-FALLTHROUGH-annotations.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 @@ -472,8 +470,6 @@ swap partition while in resuming %patch79 -p1 %patch80 -p1 %patch81 -p1 -%patch82 -p1 -%patch83 -p1 %patch101 -p1 %patch102 -p1 %patch103 -p1 diff --git a/translations-20140921.tar.xz b/translations-20140921.tar.xz deleted file mode 100644 index 5700810..0000000 --- a/translations-20140921.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36885e7f4039a2634a0abeca7f8ab631c32abc5977119eb33c06c752fb3cecc5 -size 516764 diff --git a/translations-20170427.tar.xz b/translations-20170427.tar.xz new file mode 100644 index 0000000..ea0bb13 --- /dev/null +++ b/translations-20170427.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2793b20ede25e0d3a63ab5939a4fca6786d40d09946711350f8bf3cf9639f079 +size 585860 diff --git a/use-grub2-as-a-package-name.patch b/use-grub2-as-a-package-name.patch index a9f2a03..a8281a8 100644 --- a/use-grub2-as-a-package-name.patch +++ b/use-grub2-as-a-package-name.patch @@ -12,16 +12,16 @@ Signed-off-by: Jiri Slaby configure.ac | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) -Index: grub-2.02~rc2/configure.ac +Index: grub-2.02/configure.ac =================================================================== ---- grub-2.02~rc2.orig/configure.ac -+++ grub-2.02~rc2/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.02~rc2],[bug-grub@gnu.org]) -+AC_INIT([GRUB2],[2.02~rc2],[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]) From 8559bdfc6f101e5ded69635fe8babd70414b6297a42d57ba9e013de55350c69a Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Sat, 20 May 2017 12:28:59 +0000 Subject: [PATCH 08/57] Accepting request 494786 from Base:System 1 OBS-URL: https://build.opensuse.org/request/show/494786 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=162 --- grub2-btrfs-09-get-default-subvolume.patch | 263 +++++++++++++++++++++ grub2-xen-pv-firmware.cfg | 24 +- grub2.changes | 9 + grub2.spec | 2 + 4 files changed, 293 insertions(+), 5 deletions(-) create mode 100644 grub2-btrfs-09-get-default-subvolume.patch diff --git a/grub2-btrfs-09-get-default-subvolume.patch b/grub2-btrfs-09-get-default-subvolume.patch new file mode 100644 index 0000000..2fb991f --- /dev/null +++ b/grub2-btrfs-09-get-default-subvolume.patch @@ -0,0 +1,263 @@ +Index: grub-2.02~beta2/grub-core/fs/btrfs.c +=================================================================== +--- grub-2.02~beta2.orig/grub-core/fs/btrfs.c ++++ grub-2.02~beta2/grub-core/fs/btrfs.c +@@ -2439,6 +2439,238 @@ out: + return 0; + } + ++static grub_err_t ++grub_btrfs_get_parent_subvol_path (struct grub_btrfs_data *data, ++ grub_uint64_t child_id, ++ const char *child_path, ++ grub_uint64_t *parent_id, ++ char **path_out) ++{ ++ grub_uint64_t fs_root = 0; ++ struct grub_btrfs_key key_in = { ++ .object_id = child_id, ++ .type = GRUB_BTRFS_ITEM_TYPE_ROOT_BACKREF, ++ .offset = 0, ++ }, key_out; ++ struct grub_btrfs_root_ref *ref; ++ char *buf; ++ struct grub_btrfs_leaf_descriptor desc; ++ grub_size_t elemsize; ++ grub_disk_addr_t elemaddr; ++ grub_err_t err; ++ char *parent_path; ++ ++ *parent_id = 0; ++ *path_out = 0; ++ ++ err = lower_bound(data, &key_in, &key_out, data->sblock.root_tree, ++ &elemaddr, &elemsize, &desc, 0); ++ if (err) ++ return err; ++ ++ if (key_out.type != GRUB_BTRFS_ITEM_TYPE_ROOT_BACKREF || elemaddr == 0) ++ next(data, &desc, &elemaddr, &elemsize, &key_out); ++ ++ if (key_out.type != GRUB_BTRFS_ITEM_TYPE_ROOT_BACKREF) ++ { ++ free_iterator(&desc); ++ return grub_error(GRUB_ERR_FILE_NOT_FOUND, N_("can't find root backrefs")); ++ } ++ ++ buf = grub_malloc(elemsize + 1); ++ if (!buf) ++ { ++ free_iterator(&desc); ++ return grub_errno; ++ } ++ ++ err = grub_btrfs_read_logical(data, elemaddr, buf, elemsize, 0); ++ if (err) ++ { ++ grub_free(buf); ++ free_iterator(&desc); ++ return err; ++ } ++ ++ buf[elemsize] = 0; ++ ref = (struct grub_btrfs_root_ref *)buf; ++ ++ err = get_fs_root(data, data->sblock.root_tree, grub_le_to_cpu64 (key_out.offset), ++ 0, &fs_root); ++ if (err) ++ { ++ grub_free(buf); ++ free_iterator(&desc); ++ return err; ++ } ++ ++ find_pathname(data, grub_le_to_cpu64 (ref->dirid), fs_root, ref->name, &parent_path); ++ ++ if (child_path) ++ { ++ *path_out = grub_xasprintf ("%s/%s", parent_path, child_path); ++ grub_free (parent_path); ++ } ++ else ++ *path_out = parent_path; ++ ++ *parent_id = grub_le_to_cpu64 (key_out.offset); ++ ++ grub_free(buf); ++ free_iterator(&desc); ++ return GRUB_ERR_NONE; ++} ++ ++static grub_err_t ++grub_btrfs_get_default_subvolume_id (struct grub_btrfs_data *data, grub_uint64_t *id) ++{ ++ grub_err_t err; ++ grub_disk_addr_t elemaddr; ++ grub_size_t elemsize; ++ struct grub_btrfs_key key, key_out; ++ struct grub_btrfs_dir_item *direl = NULL; ++ const char *ctoken = "default"; ++ grub_size_t ctokenlen = sizeof ("default") - 1; ++ ++ *id = 0; ++ key.object_id = data->sblock.root_dir_objectid; ++ key.type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM; ++ key.offset = grub_cpu_to_le64 (~grub_getcrc32c (1, ctoken, ctokenlen)); ++ err = lower_bound (data, &key, &key_out, data->sblock.root_tree, &elemaddr, &elemsize, ++ NULL, 0); ++ if (err) ++ return err; ++ ++ if (key_cmp (&key, &key_out) != 0) ++ return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file not found")); ++ ++ struct grub_btrfs_dir_item *cdirel; ++ direl = grub_malloc (elemsize + 1); ++ err = grub_btrfs_read_logical (data, elemaddr, direl, elemsize, 0); ++ if (err) ++ { ++ grub_free (direl); ++ return err; ++ } ++ for (cdirel = direl; ++ (grub_uint8_t *) cdirel - (grub_uint8_t *) direl ++ < (grub_ssize_t) elemsize; ++ cdirel = (void *) ((grub_uint8_t *) (direl + 1) ++ + grub_le_to_cpu16 (cdirel->n) ++ + grub_le_to_cpu16 (cdirel->m))) ++ { ++ if (ctokenlen == grub_le_to_cpu16 (cdirel->n) ++ && grub_memcmp (cdirel->name, ctoken, ctokenlen) == 0) ++ break; ++ } ++ if ((grub_uint8_t *) cdirel - (grub_uint8_t *) direl ++ >= (grub_ssize_t) elemsize) ++ { ++ grub_free (direl); ++ err = grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file not found")); ++ return err; ++ } ++ ++ if (cdirel->key.type != GRUB_BTRFS_ITEM_TYPE_ROOT_ITEM) ++ { ++ grub_free (direl); ++ err = grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file not found")); ++ return err; ++ } ++ ++ *id = grub_le_to_cpu64 (cdirel->key.object_id); ++ return GRUB_ERR_NONE; ++} ++ ++static grub_err_t ++grub_cmd_btrfs_get_default_subvol (struct grub_extcmd_context *ctxt, ++ int argc, char **argv) ++{ ++ char *devname; ++ grub_device_t dev; ++ struct grub_btrfs_data *data; ++ grub_err_t err; ++ grub_uint64_t id; ++ char *subvol = NULL; ++ grub_uint64_t subvolid = 0; ++ char *varname = NULL; ++ char *output = NULL; ++ int path_only = ctxt->state[1].set; ++ int num_only = ctxt->state[2].set; ++ ++ if (ctxt->state[0].set) ++ varname = ctxt->state[0].arg; ++ ++ if (argc < 1) ++ return grub_error (GRUB_ERR_BAD_ARGUMENT, "device name required"); ++ ++ devname = grub_file_get_device_name(argv[0]); ++ if (!devname) ++ return grub_errno; ++ ++ dev = grub_device_open (devname); ++ grub_free (devname); ++ if (!dev) ++ return grub_errno; ++ ++ data = grub_btrfs_mount(dev); ++ if (!data) ++ { ++ grub_device_close (dev); ++ grub_dprintf ("btrfs", "failed to open fs\n"); ++ grub_errno = GRUB_ERR_NONE; ++ return 0; ++ } ++ ++ err = grub_btrfs_get_default_subvolume_id (data, &subvolid); ++ if (err) ++ { ++ grub_btrfs_unmount (data); ++ grub_device_close (dev); ++ return err; ++ } ++ ++ id = subvolid; ++ while (id != GRUB_BTRFS_ROOT_VOL_OBJECTID) ++ { ++ grub_uint64_t parent_id; ++ char *path_out; ++ ++ err = grub_btrfs_get_parent_subvol_path (data, grub_cpu_to_le64 (id), subvol, &parent_id, &path_out); ++ if (err) ++ { ++ grub_btrfs_unmount (data); ++ grub_device_close (dev); ++ return err; ++ } ++ ++ if (subvol) ++ grub_free (subvol); ++ subvol = path_out; ++ id = parent_id; ++ } ++ ++ if (num_only && path_only) ++ output = grub_xasprintf ("%"PRIuGRUB_UINT64_T" /%s", subvolid, subvol); ++ else if (num_only) ++ output = grub_xasprintf ("%"PRIuGRUB_UINT64_T, subvolid); ++ else ++ output = grub_xasprintf ("/%s", subvol); ++ ++ if (varname) ++ grub_env_set(varname, output); ++ else ++ grub_printf ("%s\n", output); ++ ++ grub_free (output); ++ grub_free (subvol); ++ ++ grub_btrfs_unmount (data); ++ grub_device_close (dev); ++ ++ return GRUB_ERR_NONE; ++} ++ + static struct grub_fs grub_btrfs_fs = { + .name = "btrfs", + .dir = grub_btrfs_dir, +@@ -2457,6 +2689,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; ++static grub_extcmd_t cmd_get_default_subvol; + + static char * + subvolid_set_env (struct grub_env_var *var __attribute__ ((unused)), +@@ -2527,6 +2760,11 @@ GRUB_MOD_INIT (btrfs) + "[-p|-n] [-o var] DEVICE", + "Print list of BtrFS subvolumes on " + "DEVICE.", options); ++ cmd_get_default_subvol = grub_register_extcmd("btrfs-get-default-subvol", ++ grub_cmd_btrfs_get_default_subvol, 0, ++ "[-p|-n] [-o var] DEVICE", ++ "Print default BtrFS subvolume on " ++ "DEVICE.", options); + grub_register_variable_hook ("btrfs_subvol", subvol_get_env, + subvol_set_env); + grub_register_variable_hook ("btrfs_subvolid", subvolid_get_env, diff --git a/grub2-xen-pv-firmware.cfg b/grub2-xen-pv-firmware.cfg index f793389..1d6c078 100644 --- a/grub2-xen-pv-firmware.cfg +++ b/grub2-xen-pv-firmware.cfg @@ -3,6 +3,7 @@ insmod part_gpt insmod search insmod configfile insmod legacy_configfile +insmod lvm set debian_cddev="" set debian_cdarch="" @@ -43,9 +44,6 @@ fi set hdcfg_list="\ /boot/grub2/grub.cfg \ -/@/boot/grub2/grub.cfg \ -/@/.snapshots/1/snapshot/boot/grub2/grub.cfg \ -/.snapshots/1/snapshot/boot/grub2/grub.cfg \ /grub2/grub.cfg\ " @@ -55,25 +53,41 @@ set hdlst_list="\ " for c in ${hdcfg_list}; do + btrfs_relative_path=1 if search -s hddev -f "${c}"; then + btrfs_relative_path=0 menuentry "${hddev} Boot From Hard Disk (${c})" "${hddev}" "${c}" { set root="${2}" set cfg="${3}" - configfile "${cfg}" + btrfs-get-default-subvol -p -o btrfs_default_subvol ($root) + if [ -n "${btrfs_default_subvol}" ]; then + configfile "${btrfs_default_subvol}${cfg}" + else + configfile "${cfg}" + fi } break fi + btrfs_relative_path=0 done for c in ${hdlst_list}; do + btrfs_relative_path=1 if search -s hddev -f "${c}"; then + btrfs_relative_path=0 menuentry "${hddev} Boot From Hard Disk (${c})" "${hddev}" "${c}" { set root="${2}" set cfg="${3}" - legacy_configfile "${cfg}" + btrfs-get-default-subvol -p -o btrfs_default_subvol ($root) + if [ -n "${btrfs_default_subvol}" ]; then + legacy_configfile "${btrfs_default_subvol}${cfg}" + else + legacy_configfile "${cfg}" + fi } break fi + btrfs_relative_path=0 done set timeout=0 diff --git a/grub2.changes b/grub2.changes index e9704bc..edfa131 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,12 @@ +------------------------------------------------------------------- +Thu May 11 08:56:57 UTC 2017 - mchang@suse.com + +- grub2-xen-pv-firmware.cfg: insmod lvm module as it's not auto-loaded + to support booting from lvm volume (bsc#1004324) +- Grub not working correctly with xen and btrfs snapshots (bsc#1026511) + * Add grub2-btrfs-09-get-default-subvolume.patch + * grub2-xen-pv-firmware.cfg : search path in default subvolume + ------------------------------------------------------------------- Thu Apr 27 18:39:21 UTC 2017 - arvidjaar@gmail.com diff --git a/grub2.spec b/grub2.spec index ac9b1a9..ecb77c2 100644 --- a/grub2.spec +++ b/grub2.spec @@ -217,6 +217,7 @@ Patch105: grub2-btrfs-05-grub2-mkconfig.patch Patch106: grub2-btrfs-06-subvol-mount.patch Patch107: grub2-btrfs-07-subvol-fallback.patch Patch108: grub2-btrfs-08-workaround-snapshot-menu-default-entry.patch +Patch109: grub2-btrfs-09-get-default-subvolume.patch # Support EFI xen loader Patch120: grub2-efi-xen-chainload.patch Patch121: grub2-efi-chainloader-root.patch @@ -478,6 +479,7 @@ swap partition while in resuming %patch106 -p1 %patch107 -p1 %patch108 -p1 +%patch109 -p1 %patch120 -p1 %patch121 -p1 %patch122 -p1 From 600be16800aef4bbab2a3759680d4355eaaae6ffca8e469be12bbd0b328cc998 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Mon, 5 Jun 2017 16:49:53 +0000 Subject: [PATCH 09/57] Accepting request 500886 from Base:System 1 OBS-URL: https://build.opensuse.org/request/show/500886 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=163 --- ...er-support-pv-without-metadatacopies.patch | 223 ++++++++++++++++++ grub2-efi-uga-64bit-fb.patch | 104 ++++++++ grub2.changes | 10 + grub2.spec | 5 + 4 files changed, 342 insertions(+) create mode 100644 grub2-diskfilter-support-pv-without-metadatacopies.patch create mode 100644 grub2-efi-uga-64bit-fb.patch diff --git a/grub2-diskfilter-support-pv-without-metadatacopies.patch b/grub2-diskfilter-support-pv-without-metadatacopies.patch new file mode 100644 index 0000000..a740d75 --- /dev/null +++ b/grub2-diskfilter-support-pv-without-metadatacopies.patch @@ -0,0 +1,223 @@ +From a28bc19400b4e70725ce5532bc5e4c374c72d7a9 Mon Sep 17 00:00:00 2001 +From: Lidong Zhong +Date: Wed, 26 Apr 2017 15:52:40 +0800 +Subject: [PATCH] diskfilter: implementation of processing no metadata recorded + in PV + +If one PV underlying the root LV is created with no metadata, such as + +pvcreate --metadatacopies 0 /dev/sda + +then we could get a lot of error messages when generating a new +configuration file. + +Generating grub configuration file ... +error: unknown LVM metadata header. +error: unknown LVM metadata header. +/usr/sbin/grub2-probe: warning: Couldn't find physical volume `pv1'. +Some modules may be missing from core image.. +(For details, please refer to + https://bugzilla.suse.com/show_bug.cgi?id=1027526) + +When one labelled PV which dose not have any metadata is found, we put +it into a global grub_detached_pv list. and we search all the PVs in the +current array list to check if it is a member of grub_detached_pv list. +So we can know if the PV is really missing or just without metadata. + +Signed-off-by: Lidong Zhong +--- + grub-core/disk/diskfilter.c | 112 +++++++++++++++++++++++++++++++++++++++++++- + grub-core/disk/lvm.c | 15 ++++-- + 2 files changed, 121 insertions(+), 6 deletions(-) + +Index: grub-2.02/grub-core/disk/diskfilter.c +=================================================================== +--- grub-2.02.orig/grub-core/disk/diskfilter.c ++++ grub-2.02/grub-core/disk/diskfilter.c +@@ -28,6 +28,7 @@ + #include + #include + #endif ++#include + + GRUB_MOD_LICENSE ("GPLv3+"); + +@@ -43,7 +44,17 @@ static struct grub_diskfilter_lv * + find_lv (const char *name); + static int is_lv_readable (struct grub_diskfilter_lv *lv, int easily); + +- ++struct grub_detached_pv { ++ struct grub_detached_pv *next; ++ struct grub_detached_pv **prev; ++ struct grub_diskfilter_pv_id id; ++ grub_disk_t disk; ++ grub_diskfilter_t diskfilter; ++} ; ++ ++static struct grub_detached_pv *detached_pv_list; ++ ++#define FOR_DETACHED_PVS(var) for (var = detached_pv_list; var; var = var->next) + + static grub_err_t + is_node_readable (const struct grub_diskfilter_node *node, int easily) +@@ -132,6 +143,7 @@ scan_disk_partition_iter (grub_disk_t di + grub_disk_addr_t start_sector; + struct grub_diskfilter_pv_id id; + grub_diskfilter_t diskfilter; ++ struct grub_detached_pv *pv; + + grub_dprintf ("diskfilter", "Scanning for DISKFILTER devices on disk %s\n", + name); +@@ -168,6 +180,28 @@ scan_disk_partition_iter (grub_disk_t di + grub_free (id.uuid); + return 0; + } ++ /*insert the special LVM PV into detached_pv_list*/ ++ if (!arr && (id.uuidlen > 0) && (grub_strcmp(diskfilter->name, "lvm") == 0)) ++ { ++ pv = grub_zalloc(sizeof(*pv)); ++ if (!pv) ++ return 1; ++ pv->id.uuidlen = GRUB_LVM_ID_STRLEN; ++ pv->id.uuid = grub_malloc(GRUB_LVM_ID_STRLEN); ++ if (!pv->id.uuid) ++ goto fail_id; ++ grub_memcpy(pv->id.uuid, id.uuid, GRUB_LVM_ID_STRLEN); ++ /*It's safe to save disk into this standalone pv list*/ ++ pv->disk = grub_disk_open(name); ++ if (!pv->disk) ++ goto fail_id; ++ pv->diskfilter = diskfilter; ++ grub_list_push (GRUB_AS_LIST_P (&detached_pv_list), ++ GRUB_AS_LIST(pv)); ++#ifdef GRUB_UTIL ++ grub_util_info ("adding disk %s into detached pv list", name); ++#endif ++ } + if (arr && id.uuidlen) + grub_free (id.uuid); + +@@ -180,6 +214,65 @@ scan_disk_partition_iter (grub_disk_t di + } + + return 0; ++fail_id: ++ if (pv->id.uuidlen) ++ grub_free(pv->id.uuid); ++ grub_free(pv); ++ return 1; ++} ++ ++static int ++process_detached_pv_list(void) ++{ ++ struct grub_diskfilter_vg *arr; ++ struct grub_diskfilter_pv *pv1; ++ struct grub_detached_pv *pv2; ++ unsigned found = 0; ++ ++ for (arr = array_list; arr != NULL; arr = arr->next) ++ { ++ for (pv1 = arr->pvs; pv1; pv1 = pv1->next) ++ { ++ if (pv1->disk) ++ continue; ++ FOR_DETACHED_PVS(pv2) ++ { ++ if (pv2->id.uuidlen == pv1->id.uuidlen && ++ !grub_memcmp(pv2->id.uuid, pv1->id.uuid, pv1->id.uuidlen)) ++ { ++ if (insert_array(pv2->disk, &(pv2->id), arr, -1, pv2->diskfilter)) ++ return grub_errno; ++ else ++ { ++#ifdef GRUB_UTIL ++ grub_util_info ("found disk %s in detached pv list", pv1->disk->name); ++#endif ++ found = 1; ++ break; ++ } ++ } ++ } ++ /*remove pv2 from the list*/ ++ if (found) ++ { ++#ifdef GRUB_UTIL ++ grub_util_info ("removing disk %s from detached pv list", pv1->disk->name); ++#endif ++ grub_list_remove(GRUB_AS_LIST (pv2)); ++ if (pv2->id.uuidlen) ++ { ++ pv2->id.uuidlen = 0; ++ grub_free(pv2->id.uuid); ++ } ++ grub_disk_close(pv2->disk); ++ grub_free(pv2); ++ break; ++ } ++ } ++ if (found) ++ break; ++ } ++ return 0; + } + + static int +@@ -206,6 +299,9 @@ scan_disk (const char *name, int accept_ + grub_partition_iterate (disk, scan_disk_partition_iter, (void *) name); + grub_disk_close (disk); + scan_depth--; ++ ++ /*process the detached_pv_list*/ ++ process_detached_pv_list(); + return 0; + } + +@@ -1249,6 +1345,20 @@ insert_array (grub_disk_t disk, const st + static void + free_array (void) + { ++ while(detached_pv_list) ++ { ++ struct grub_detached_pv *pv; ++ pv = detached_pv_list; ++ detached_pv_list = detached_pv_list->next; ++#ifdef GRUB_UTIL ++ grub_util_warn (_("Couldn't find disk for physical volume `%s'." ++ "Some LVs may not work normally."),pv->disk->name); ++#endif ++ if (pv->id.uuidlen) ++ grub_free(pv->id.uuid); ++ grub_disk_close(pv->disk); ++ grub_free(pv); ++ } + while (array_list) + { + struct grub_diskfilter_vg *vg; +Index: grub-2.02/grub-core/disk/lvm.c +=================================================================== +--- grub-2.02.orig/grub-core/disk/lvm.c ++++ grub-2.02/grub-core/disk/lvm.c +@@ -182,11 +182,16 @@ grub_lvm_detect (grub_disk_t disk, + sizeof (mdah->magic))) + || (grub_le_to_cpu32 (mdah->version) != GRUB_LVM_FMTT_VERSION)) + { +- grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, +- "unknown LVM metadata header"); +-#ifdef GRUB_UTIL +- grub_util_info ("unknown LVM metadata header"); +-#endif ++ /* ++ * It's not necessarily an error. There is no metadata recorded when ++ * PV is created with pvmetadatacopies set to zero. We need to process ++ * this kind of PV seperately. ++ */ ++ id->uuid = grub_malloc(GRUB_LVM_ID_STRLEN); ++ if (!id->uuid) ++ goto fail; ++ grub_memcpy(id->uuid, pv_id, GRUB_LVM_ID_STRLEN); ++ id->uuidlen = GRUB_LVM_ID_STRLEN; + goto fail; + } + diff --git a/grub2-efi-uga-64bit-fb.patch b/grub2-efi-uga-64bit-fb.patch new file mode 100644 index 0000000..da99f8b --- /dev/null +++ b/grub2-efi-uga-64bit-fb.patch @@ -0,0 +1,104 @@ +From: Andrei Borzenkov +Subject: [PATCH] efi/uga: use 64 bit for fb_base + +We get 64 bit from PCI BAR but then truncate by assigning to 32 bit. +Make sure to check that pointer does not overflow on 32 bit platform. + +Closes: 50931 + +--- + grub-core/video/efi_uga.c | 31 ++++++++++++++++--------------- + 1 file changed, 16 insertions(+), 15 deletions(-) + +Index: grub-2.02/grub-core/video/efi_uga.c +=================================================================== +--- grub-2.02.orig/grub-core/video/efi_uga.c ++++ grub-2.02/grub-core/video/efi_uga.c +@@ -34,7 +34,7 @@ GRUB_MOD_LICENSE ("GPLv3+"); + + static grub_efi_guid_t uga_draw_guid = GRUB_EFI_UGA_DRAW_GUID; + static struct grub_efi_uga_draw_protocol *uga; +-static grub_uint32_t uga_fb; ++static grub_uint64_t uga_fb; + static grub_uint32_t uga_pitch; + + static struct +@@ -52,7 +52,7 @@ static struct + #define FBTEST_COUNT 8 + + static int +-find_line_len (grub_uint32_t *fb_base, grub_uint32_t *line_len) ++find_line_len (grub_uint64_t *fb_base, grub_uint32_t *line_len) + { + grub_uint32_t *base = (grub_uint32_t *) (grub_addr_t) *fb_base; + int i; +@@ -67,7 +67,7 @@ find_line_len (grub_uint32_t *fb_base, g + { + if ((base[j] & RGB_MASK) == RGB_MAGIC) + { +- *fb_base = (grub_uint32_t) (grub_addr_t) base; ++ *fb_base = (grub_uint64_t) (grub_addr_t) base; + *line_len = j << 2; + + return 1; +@@ -84,7 +84,7 @@ find_line_len (grub_uint32_t *fb_base, g + /* Context for find_framebuf. */ + struct find_framebuf_ctx + { +- grub_uint32_t *fb_base; ++ grub_uint64_t *fb_base; + grub_uint32_t *line_len; + int found; + }; +@@ -120,7 +120,9 @@ find_card (grub_pci_device_t dev, grub_p + if (i == 5) + break; + +- old_bar2 = grub_pci_read (addr + 4); ++ i++; ++ addr += 4; ++ old_bar2 = grub_pci_read (addr); + } + else + old_bar2 = 0; +@@ -129,10 +131,15 @@ find_card (grub_pci_device_t dev, grub_p + base64 <<= 32; + base64 |= (old_bar1 & GRUB_PCI_ADDR_MEM_MASK); + +- grub_dprintf ("fb", "%s(%d): 0x%llx\n", ++ grub_dprintf ("fb", "%s(%d): 0x%" PRIxGRUB_UINT64_T "\n", + ((old_bar1 & GRUB_PCI_ADDR_MEM_PREFETCH) ? +- "VMEM" : "MMIO"), i, +- (unsigned long long) base64); ++ "VMEM" : "MMIO"), type == GRUB_PCI_ADDR_MEM_TYPE_64 ? i - 1 : i, ++ base64); ++ ++#if GRUB_CPU_SIZEOF_VOID_P == 4 ++ if (old_bar2) ++ continue; ++#endif + + if ((old_bar1 & GRUB_PCI_ADDR_MEM_PREFETCH) && (! ctx->found)) + { +@@ -140,12 +147,6 @@ find_card (grub_pci_device_t dev, grub_p + if (find_line_len (ctx->fb_base, ctx->line_len)) + ctx->found++; + } +- +- if (type == GRUB_PCI_ADDR_MEM_TYPE_64) +- { +- i++; +- addr += 4; +- } + } + } + +@@ -153,7 +154,7 @@ find_card (grub_pci_device_t dev, grub_p + } + + static int +-find_framebuf (grub_uint32_t *fb_base, grub_uint32_t *line_len) ++find_framebuf (grub_uint64_t *fb_base, grub_uint32_t *line_len) + { + struct find_framebuf_ctx ctx = { + .fb_base = fb_base, diff --git a/grub2.changes b/grub2.changes index edfa131..1d2cfae 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,13 @@ +------------------------------------------------------------------- +Thu Jun 1 09:45:44 UTC 2017 - mchang@suse.com + +- Support LVM physical volume created without metadatacopies (bsc#1027526) + * grub2-diskfilter-support-pv-without-metadatacopies.patch +- Fix page fault exception when grub loads with Nvidia cards (bsc#1038533) + * grub2-efi-uga-64bit-fb.patch +- Require 'kexec-tools' for System z. (bsc#944358) + * modified grub2.spec + ------------------------------------------------------------------- Thu May 11 08:56:57 UTC 2017 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index ecb77c2..3b56112 100644 --- a/grub2.spec +++ b/grub2.spec @@ -208,6 +208,8 @@ Patch78: grub2-commands-introduce-read_file-subcommand.patch Patch79: grub2-efi-chainload-harder.patch Patch80: grub2-emu-4-all.patch Patch81: grub2-lvm-allocate-metadata-buffer-from-raw-contents.patch +Patch82: grub2-diskfilter-support-pv-without-metadatacopies.patch +Patch83: grub2-efi-uga-64bit-fb.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 @@ -332,6 +334,7 @@ Requires(post): perl-Bootloader # required utilities by grub2-s390x-04-grub2-install.patch # use 'showconsole' to determine console device. (bnc#876743) Requires: /sbin/showconsole +Requires: kexec-tools # for /sbin/zipl used by grub2-zipl-setup Requires: s390-tools %endif @@ -471,6 +474,8 @@ swap partition while in resuming %patch79 -p1 %patch80 -p1 %patch81 -p1 +%patch82 -p1 +%patch83 -p1 %patch101 -p1 %patch102 -p1 %patch103 -p1 From c05d2136d025afc332cf15048d6844c155d877dfe3c8be6881d5e853cc0677cc Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Wed, 12 Jul 2017 17:30:22 +0000 Subject: [PATCH 10/57] Accepting request 508680 from Base:System 1 OBS-URL: https://build.opensuse.org/request/show/508680 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=164 --- grub2-fix-build-with-flex-2.6.4.patch | 24 ++++++++++++++++++++++++ grub2.changes | 6 ++++++ grub2.spec | 2 ++ 3 files changed, 32 insertions(+) create mode 100644 grub2-fix-build-with-flex-2.6.4.patch diff --git a/grub2-fix-build-with-flex-2.6.4.patch b/grub2-fix-build-with-flex-2.6.4.patch new file mode 100644 index 0000000..d7c2d55 --- /dev/null +++ b/grub2-fix-build-with-flex-2.6.4.patch @@ -0,0 +1,24 @@ +From: Andrei Borzenkov + +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 + diff --git a/grub2.changes b/grub2.changes index 1d2cfae..ec67cd8 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Tue Jul 4 16:56:33 UTC 2017 - arvidjaar@gmail.com + +- add grub2-fix-build-with-flex-2.6.4.patch - fix build with flex 2.6.4+ + that removed explicit (void) cast from fprintf call in yy_fatal_error. + ------------------------------------------------------------------- Thu Jun 1 09:45:44 UTC 2017 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 3b56112..cd6de16 100644 --- a/grub2.spec +++ b/grub2.spec @@ -169,6 +169,7 @@ 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 @@ -435,6 +436,7 @@ swap partition while in resuming %patch8 -p1 %patch9 -p1 %patch10 -p1 +%patch11 -p1 %patch12 -p1 %patch15 -p1 %patch17 -p1 From 6d7f1109b9ab5e8eed97b5ce388e3cf1ba4ffd145b5dfe26f10e49a980a672e7 Mon Sep 17 00:00:00 2001 From: Yuchen Lin Date: Tue, 8 Aug 2017 09:58:03 +0000 Subject: [PATCH 11/57] Accepting request 512434 from Base:System 1 OBS-URL: https://build.opensuse.org/request/show/512434 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=165 --- grub2.changes | 5 +++++ grub2.spec | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/grub2.changes b/grub2.changes index ec67cd8..c8d7e76 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Mon Jul 24 13:39:25 UTC 2017 - bwiedemann@suse.com + +- Make grub2.info build reproducible (boo#1047218) + ------------------------------------------------------------------- Tue Jul 4 16:56:33 UTC 2017 - arvidjaar@gmail.com diff --git a/grub2.spec b/grub2.spec index cd6de16..f03484c 100644 --- a/grub2.spec +++ b/grub2.spec @@ -524,6 +524,11 @@ swap partition while in resuming %patch409 -p1 %patch410 -p1 %patch411 -p1 +# patches above may update the timestamp of grub.texi +# and via build-aux/mdate-sh they end up in grub2.info, breaking build-compare +[ -z "$SOURCE_DATE_EPOCH" ] ||\ + [ `stat -c %Y docs/grub.texi` -lt $SOURCE_DATE_EPOCH ] ||\ + touch -d@$SOURCE_DATE_EPOCH docs/grub.texi # This simplifies patch handling without need to use git to create patch # that renames file From 4b4eca0350c9cdffd9b49615dbcb03ddb699e8cce327cb59415ad1e91befc2b5 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Tue, 29 Aug 2017 09:34:17 +0000 Subject: [PATCH 12/57] Accepting request 518462 from Base:System 1 OBS-URL: https://build.opensuse.org/request/show/518462 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=166 --- grub2-s390x-09-improve-zipl-setup.patch | 74 +++++++++++++++++++++++++ grub2.changes | 7 +++ grub2.spec | 4 +- 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 grub2-s390x-09-improve-zipl-setup.patch diff --git a/grub2-s390x-09-improve-zipl-setup.patch b/grub2-s390x-09-improve-zipl-setup.patch new file mode 100644 index 0000000..a312a4f --- /dev/null +++ b/grub2-s390x-09-improve-zipl-setup.patch @@ -0,0 +1,74 @@ +--- + util/s390x/zipl2grub.conf.in | 2 +- + util/s390x/zipl2grub.pl.in | 19 +++++++++++-------- + 2 files changed, 12 insertions(+), 9 deletions(-) + +--- a/util/s390x/zipl2grub.conf.in ++++ b/util/s390x/zipl2grub.conf.in +@@ -8,7 +8,7 @@ defaultmenu = menu + target = @zipldir@ + ramdisk = @zipldir@/initrd,0x2000000 + image = @zipldir@/image +- parameters = "root=@GRUB_DEVICE@ @GRUB_EMU_CONMODE@ @GRUB_CMDLINE_LINUX@ @GRUB_CMDLINE_LINUX_DEFAULT@ initgrub quiet splash=silent plymouth.enable=0 " ++ parameters = "root=@GRUB_DEVICE@ @GRUB_EMU_CONMODE@ @GRUB_CMDLINE_LINUX@ @GRUB_CMDLINE_LINUX_DEFAULT@ initgrub quiet splash=silent plymouth.enable=0 mem=1G " + + [skip-grub2] + target = @zipldir@ +--- a/util/s390x/zipl2grub.pl.in ++++ b/util/s390x/zipl2grub.pl.in +@@ -44,12 +44,12 @@ sub System(@) { + return 0 if ($debug); + system( @C); + if ($? == -1) { +- Panic( $?, "$C[0]: Failed to execute: $!\n"); ++ Panic( 1, "$C[0]: Failed to execute: $!\n"); + } elsif ($? & 127) { +- Panic( $?, sprintf( "$C[0]: Died with signal %d with%s coredump\n", ++ Panic( 1, sprintf( "$C[0]: Died with signal %d with%s coredump\n", + ($? & 127), ($? & 128) ? '' : 'out')); + } elsif ( $? >> 8 != 0 ) { +- Panic( $?, "$C[0]: Failed\n"); ++ Panic( $? >> 8, "$C[0]: Failed\n"); + } + return( 0); + } +@@ -166,7 +166,9 @@ sub Usage($) { + "zIPL directory missing.", + "Configuration template missing.", + "Configuration template unreadable.", +- "zIPL directory not accesible.", ++ "zIPL directory not accessible.", ++ "kernel image parameter missing.", ++ "kernel image unreadable.", + "" + ); + my $msg = ""; +@@ -190,7 +192,8 @@ while ( $#ARGV >= 0 ) { + (/^--?help/ || /^-h/) && (Usage(0)); + (/^--zipldir$/ || /^-z$/) && ($zipldir = shift || Usage(2), next); + (/^--template$/ || /^-T$/) && ($in = shift || Usage(3), next); +- (/^--image$/ || /^-i$/) && ($Image = shift || Usage(5), $force = 1, next); ++ (/^--image$/ || /^-i$/) && ($Image = shift || Usage(6), ++ -r "$Image" || Usage(7), $force = 1, next); + (/^-/) && (Usage(1)); + Usage(1); + } +@@ -403,15 +406,15 @@ if ( -l $Image ) { + $Image = readlink( $Image); + } + my ($image, $version) = ($Image =~ m{^(?:/boot/)?([^-]+-(.+))$}); +-my $initrd = "initrd-$version"; +- + if ( !defined($image) || !defined($version) || ! -r "/boot/$image" ) { + Panic( 1, "$C: weird $Image. This should never happen!\n"); + } ++my $initrd = "initrd-$version"; + + if ( ! -r $ziplimage || ! -r $ziplinitrd || $refresh ) { + BootCopy( $image, $zipldir, "image"); +- BootCopy( $initrd, $zipldir, "initrd") if (-r "/boot/$initrd"); ++ BootCopy( $initrd, $zipldir, "initrd") ++ if (-r "/boot/$initrd" && ! exists( $fsdev{"/boot"})); + } + if ( $refresh || ChkInitrd( $zipldir, "initrd") <= 0 ) { + MkInitrd( $initrd, $zipldir, $version); diff --git a/grub2.changes b/grub2.changes index c8d7e76..04b8aa4 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Wed Aug 23 17:52:32 UTC 2017 - rw@suse.com + +- Fix minor oversights in and the exit value of the grub2-install + helper on s390x. (bsc#1055343, fate#323298) + * grub2-s390x-09-improve-zipl-setup.patch + ------------------------------------------------------------------- Mon Jul 24 13:39:25 UTC 2017 - bwiedemann@suse.com diff --git a/grub2.spec b/grub2.spec index f03484c..bd046d0 100644 --- a/grub2.spec +++ b/grub2.spec @@ -211,6 +211,7 @@ Patch80: grub2-emu-4-all.patch Patch81: grub2-lvm-allocate-metadata-buffer-from-raw-contents.patch Patch82: grub2-diskfilter-support-pv-without-metadatacopies.patch Patch83: grub2-efi-uga-64bit-fb.patch +Patch84: grub2-s390x-09-improve-zipl-setup.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 @@ -356,9 +357,9 @@ provides support for %{platform} systems. %package %{grubefiarch} Summary: Bootloader with support for Linux, Multiboot and more +Group: System/Boot # Require efibootmgr # Without it grub-install is broken so break the package as well if unavailable -Group: System/Boot Requires: efibootmgr Requires(post): efibootmgr Requires: %{name} = %{version}-%{release} @@ -478,6 +479,7 @@ swap partition while in resuming %patch81 -p1 %patch82 -p1 %patch83 -p1 +%patch84 -p1 %patch101 -p1 %patch102 -p1 %patch103 -p1 From 9019d23b6e494b362d2b340311d6a39a7b857148174500bf0642957f499c5e19 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Thu, 7 Sep 2017 20:10:42 +0000 Subject: [PATCH 13/57] Accepting request 520583 from Base:System 1 OBS-URL: https://build.opensuse.org/request/show/520583 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=167 --- ...d-support-for-UEFI-network-protocols.patch | 4816 +++++++++++++++++ grub2-s390x-04-grub2-install.patch | 77 +- grub2.changes | 13 + grub2.spec | 3 + 4 files changed, 4871 insertions(+), 38 deletions(-) create mode 100644 0001-add-support-for-UEFI-network-protocols.patch diff --git a/0001-add-support-for-UEFI-network-protocols.patch b/0001-add-support-for-UEFI-network-protocols.patch new file mode 100644 index 0000000..da98245 --- /dev/null +++ b/0001-add-support-for-UEFI-network-protocols.patch @@ -0,0 +1,4816 @@ +From a4baaedd5482ec182f1be83a1f4b3cdf3c286ea2 Mon Sep 17 00:00:00 2001 +From: Michael Chang +Date: Wed, 22 Feb 2017 14:27:50 +0800 +Subject: [PATCH] Add support for UEFI network protocols + +Add preliminary support of existing network functions based on UEFI network +protocols. + +--- + grub-core/Makefile.core.def | 18 + + grub-core/kern/efi/efi.c | 70 +- + grub-core/net/drivers/efi/efinet.c | 6 + + grub-core/net/efi/dhcp.c | 397 ++++++++++ + grub-core/net/efi/efi_netfs.c | 57 ++ + grub-core/net/efi/http.c | 354 +++++++++ + grub-core/net/efi/ip4_config.c | 398 ++++++++++ + grub-core/net/efi/ip6_config.c | 422 +++++++++++ + grub-core/net/efi/net.c | 1420 ++++++++++++++++++++++++++++++++++++ + grub-core/net/efi/pxe.c | 419 +++++++++++ + grub-core/net/net.c | 74 ++ + include/grub/efi/api.h | 145 +++- + include/grub/efi/dhcp.h | 343 +++++++++ + include/grub/efi/http.h | 215 ++++++ + include/grub/net/efi.h | 143 ++++ + util/grub-mknetdir.c | 23 +- + 16 files changed, 4478 insertions(+), 26 deletions(-) + create mode 100644 grub-core/net/efi/dhcp.c + create mode 100644 grub-core/net/efi/efi_netfs.c + create mode 100644 grub-core/net/efi/http.c + create mode 100644 grub-core/net/efi/ip4_config.c + create mode 100644 grub-core/net/efi/ip6_config.c + create mode 100644 grub-core/net/efi/net.c + create mode 100644 grub-core/net/efi/pxe.c + create mode 100644 include/grub/efi/dhcp.h + create mode 100644 include/grub/efi/http.h + create mode 100644 include/grub/net/efi.h + +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 +@@ -2157,6 +2157,18 @@ 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; +@@ -2169,6 +2181,12 @@ module = { + common = net/ethernet.c; + common = net/arp.c; + common = net/netbuff.c; ++ efi = net/efi/net.c; ++ efi = net/efi/http.c; ++ efi = net/efi/pxe.c; ++ efi = net/efi/ip4_config.c; ++ efi = net/efi/ip6_config.c; ++ efi = net/efi/dhcp.c; + }; + + module = { +Index: grub-2.02/grub-core/kern/efi/efi.c +=================================================================== +--- grub-2.02.orig/grub-core/kern/efi/efi.c ++++ grub-2.02/grub-core/kern/efi/efi.c +@@ -700,7 +700,7 @@ grub_efi_print_device_path (grub_efi_dev + { + grub_efi_ipv4_device_path_t *ipv4 + = (grub_efi_ipv4_device_path_t *) dp; +- grub_printf ("/IPv4(%u.%u.%u.%u,%u.%u.%u.%u,%u,%u,%x,%x)", ++ grub_printf ("/IPv4(%u.%u.%u.%u,%u.%u.%u.%u,%u,%u,%x,%x", + (unsigned) ipv4->local_ip_address[0], + (unsigned) ipv4->local_ip_address[1], + (unsigned) ipv4->local_ip_address[2], +@@ -713,33 +713,60 @@ grub_efi_print_device_path (grub_efi_dev + (unsigned) ipv4->remote_port, + (unsigned) ipv4->protocol, + (unsigned) ipv4->static_ip_address); ++ if (len == sizeof (*ipv4)) ++ { ++ grub_printf (",%u.%u.%u.%u,%u.%u.%u.%u", ++ (unsigned) ipv4->gateway_ip_address[0], ++ (unsigned) ipv4->gateway_ip_address[1], ++ (unsigned) ipv4->gateway_ip_address[2], ++ (unsigned) ipv4->gateway_ip_address[3], ++ (unsigned) ipv4->subnet_mask[0], ++ (unsigned) ipv4->subnet_mask[1], ++ (unsigned) ipv4->subnet_mask[2], ++ (unsigned) ipv4->subnet_mask[3]); ++ } ++ grub_printf (")"); + } + break; + case GRUB_EFI_IPV6_DEVICE_PATH_SUBTYPE: + { + grub_efi_ipv6_device_path_t *ipv6 + = (grub_efi_ipv6_device_path_t *) dp; +- grub_printf ("/IPv6(%x:%x:%x:%x:%x:%x:%x:%x,%x:%x:%x:%x:%x:%x:%x:%x,%u,%u,%x,%x)", +- (unsigned) ipv6->local_ip_address[0], +- (unsigned) ipv6->local_ip_address[1], +- (unsigned) ipv6->local_ip_address[2], +- (unsigned) ipv6->local_ip_address[3], +- (unsigned) ipv6->local_ip_address[4], +- (unsigned) ipv6->local_ip_address[5], +- (unsigned) ipv6->local_ip_address[6], +- (unsigned) ipv6->local_ip_address[7], +- (unsigned) ipv6->remote_ip_address[0], +- (unsigned) ipv6->remote_ip_address[1], +- (unsigned) ipv6->remote_ip_address[2], +- (unsigned) ipv6->remote_ip_address[3], +- (unsigned) ipv6->remote_ip_address[4], +- (unsigned) ipv6->remote_ip_address[5], +- (unsigned) ipv6->remote_ip_address[6], +- (unsigned) ipv6->remote_ip_address[7], ++ grub_printf ("/IPv6(%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x,%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x,%u,%u,%x,%x", ++ (unsigned) grub_be_to_cpu16 (ipv6->local_ip_address[0]), ++ (unsigned) grub_be_to_cpu16 (ipv6->local_ip_address[1]), ++ (unsigned) grub_be_to_cpu16 (ipv6->local_ip_address[2]), ++ (unsigned) grub_be_to_cpu16 (ipv6->local_ip_address[3]), ++ (unsigned) grub_be_to_cpu16 (ipv6->local_ip_address[4]), ++ (unsigned) grub_be_to_cpu16 (ipv6->local_ip_address[5]), ++ (unsigned) grub_be_to_cpu16 (ipv6->local_ip_address[6]), ++ (unsigned) grub_be_to_cpu16 (ipv6->local_ip_address[7]), ++ (unsigned) grub_be_to_cpu16 (ipv6->remote_ip_address[0]), ++ (unsigned) grub_be_to_cpu16 (ipv6->remote_ip_address[1]), ++ (unsigned) grub_be_to_cpu16 (ipv6->remote_ip_address[2]), ++ (unsigned) grub_be_to_cpu16 (ipv6->remote_ip_address[3]), ++ (unsigned) grub_be_to_cpu16 (ipv6->remote_ip_address[4]), ++ (unsigned) grub_be_to_cpu16 (ipv6->remote_ip_address[5]), ++ (unsigned) grub_be_to_cpu16 (ipv6->remote_ip_address[6]), ++ (unsigned) grub_be_to_cpu16 (ipv6->remote_ip_address[7]), + (unsigned) ipv6->local_port, + (unsigned) ipv6->remote_port, + (unsigned) ipv6->protocol, + (unsigned) ipv6->static_ip_address); ++ if (len == sizeof (*ipv6)) ++ { ++ grub_printf (",%u,%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", ++ (unsigned) ipv6->prefix_length, ++ (unsigned) grub_be_to_cpu16 (ipv6->gateway_ip_address[0]), ++ (unsigned) grub_be_to_cpu16 (ipv6->gateway_ip_address[1]), ++ (unsigned) grub_be_to_cpu16 (ipv6->gateway_ip_address[2]), ++ (unsigned) grub_be_to_cpu16 (ipv6->gateway_ip_address[3]), ++ (unsigned) grub_be_to_cpu16 (ipv6->gateway_ip_address[4]), ++ (unsigned) grub_be_to_cpu16 (ipv6->gateway_ip_address[5]), ++ (unsigned) grub_be_to_cpu16 (ipv6->gateway_ip_address[6]), ++ (unsigned) grub_be_to_cpu16 (ipv6->gateway_ip_address[7])); ++ } ++ grub_printf (")"); + } + break; + case GRUB_EFI_INFINIBAND_DEVICE_PATH_SUBTYPE: +@@ -779,6 +806,13 @@ grub_efi_print_device_path (grub_efi_dev + dump_vendor_path ("Messaging", + (grub_efi_vendor_device_path_t *) dp); + break; ++ case GRUB_EFI_URI_DEVICE_PATH_SUBTYPE: ++ { ++ grub_efi_uri_device_path_t *uri ++ = (grub_efi_uri_device_path_t *) dp; ++ grub_printf ("/URI(%s)", uri->uri); ++ } ++ break; + default: + grub_printf ("/UnknownMessaging(%x)", (unsigned) subtype); + break; +Index: grub-2.02/grub-core/net/drivers/efi/efinet.c +=================================================================== +--- grub-2.02.orig/grub-core/net/drivers/efi/efinet.c ++++ grub-2.02/grub-core/net/drivers/efi/efinet.c +@@ -24,6 +24,7 @@ + #include + #include + #include ++#include + + GRUB_MOD_LICENSE ("GPLv3+"); + +@@ -816,6 +817,9 @@ grub_efi_net_config_real (grub_efi_handl + + GRUB_MOD_INIT(efinet) + { ++ if (grub_efi_net_config) ++ return; ++ + grub_efinet_findcards (); + grub_efi_net_config = grub_efi_net_config_real; + } +@@ -827,5 +831,7 @@ GRUB_MOD_FINI(efinet) + FOR_NET_CARDS_SAFE (card, next) + if (card->driver == &efidriver) + grub_net_card_unregister (card); ++ ++ grub_efi_net_config = NULL; + } + +Index: grub-2.02/grub-core/net/efi/dhcp.c +=================================================================== +--- /dev/null ++++ grub-2.02/grub-core/net/efi/dhcp.c +@@ -0,0 +1,397 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#ifdef GRUB_EFI_NET_DEBUG ++static void ++dhcp4_mode_print (grub_efi_dhcp4_mode_data_t *mode) ++{ ++ switch (mode->state) ++ { ++ case GRUB_EFI_DHCP4_STOPPED: ++ grub_printf ("STATE: STOPPED\n"); ++ break; ++ case GRUB_EFI_DHCP4_INIT: ++ grub_printf ("STATE: INIT\n"); ++ break; ++ case GRUB_EFI_DHCP4_SELECTING: ++ grub_printf ("STATE: SELECTING\n"); ++ break; ++ case GRUB_EFI_DHCP4_REQUESTING: ++ grub_printf ("STATE: REQUESTING\n"); ++ break; ++ case GRUB_EFI_DHCP4_BOUND: ++ grub_printf ("STATE: BOUND\n"); ++ break; ++ case GRUB_EFI_DHCP4_RENEWING: ++ grub_printf ("STATE: RENEWING\n"); ++ break; ++ case GRUB_EFI_DHCP4_REBINDING: ++ grub_printf ("STATE: REBINDING\n"); ++ break; ++ case GRUB_EFI_DHCP4_INIT_REBOOT: ++ grub_printf ("STATE: INIT_REBOOT\n"); ++ break; ++ case GRUB_EFI_DHCP4_REBOOTING: ++ grub_printf ("STATE: REBOOTING\n"); ++ break; ++ default: ++ grub_printf ("STATE: UNKNOWN\n"); ++ break; ++ } ++ ++ grub_printf ("CLIENT_ADDRESS: %u.%u.%u.%u\n", ++ mode->client_address[0], ++ mode->client_address[1], ++ mode->client_address[2], ++ mode->client_address[3]); ++ grub_printf ("SERVER_ADDRESS: %u.%u.%u.%u\n", ++ mode->server_address[0], ++ mode->server_address[1], ++ mode->server_address[2], ++ mode->server_address[3]); ++ grub_printf ("SUBNET_MASK: %u.%u.%u.%u\n", ++ mode->subnet_mask[0], ++ mode->subnet_mask[1], ++ mode->subnet_mask[2], ++ mode->subnet_mask[3]); ++ grub_printf ("ROUTER_ADDRESS: %u.%u.%u.%u\n", ++ mode->router_address[0], ++ mode->router_address[1], ++ mode->router_address[2], ++ mode->router_address[3]); ++} ++#endif ++ ++static grub_efi_ipv4_address_t * ++grub_efi_dhcp4_parse_dns (grub_efi_dhcp4_protocol_t *dhcp4, grub_efi_dhcp4_packet_t *reply_packet) ++{ ++ grub_efi_dhcp4_packet_option_t **option_list; ++ grub_efi_status_t status; ++ grub_efi_uint32_t option_count = 0; ++ grub_efi_uint32_t i; ++ ++ status = efi_call_4 (dhcp4->parse, dhcp4, reply_packet, &option_count, NULL); ++ ++ if (status != GRUB_EFI_BUFFER_TOO_SMALL) ++ return NULL; ++ ++ option_list = grub_malloc (option_count * sizeof(*option_list)); ++ if (!option_list) ++ return NULL; ++ ++ status = efi_call_4 (dhcp4->parse, dhcp4, reply_packet, &option_count, option_list); ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_free (option_list); ++ return NULL; ++ } ++ ++ for (i = 0; i < option_count; ++i) ++ { ++ if (option_list[i]->op_code == 6) ++ { ++ grub_efi_ipv4_address_t *dns_address; ++ ++ if (((option_list[i]->length & 0x3) != 0) || (option_list[i]->length == 0)) ++ continue; ++ ++ /* We only contact primary dns */ ++ dns_address = grub_malloc (sizeof (*dns_address)); ++ if (!dns_address) ++ { ++ grub_free (option_list); ++ return NULL; ++ } ++ grub_memcpy (dns_address, option_list[i]->data, sizeof (dns_address)); ++ grub_free (option_list); ++ return dns_address; ++ } ++ } ++ ++ grub_free (option_list); ++ return NULL; ++} ++ ++#if 0 ++/* Somehow this doesn't work ... */ ++static grub_err_t ++grub_cmd_efi_bootp (struct grub_command *cmd __attribute__ ((unused)), ++ int argc __attribute__ ((unused)), ++ char **args __attribute__ ((unused))) ++{ ++ struct grub_efi_net_device *dev; ++ for (dev = net_devices; dev; dev = dev->next) ++ { ++ grub_efi_pxe_t *pxe = dev->ip4_pxe; ++ grub_efi_pxe_mode_t *mode = pxe->mode; ++ grub_efi_status_t status; ++ ++ if (!mode->started) ++ { ++ status = efi_call_2 (pxe->start, pxe, 0); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ grub_printf ("Couldn't start PXE\n"); ++ } ++ ++ status = efi_call_2 (pxe->dhcp, pxe, 0); ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_printf ("dhcp4 configure failed, %d\n", (int)status); ++ continue; ++ } ++ ++ dev->prefer_ip6 = 0; ++ } ++ ++ return GRUB_ERR_NONE; ++} ++#endif ++ ++static grub_err_t ++grub_cmd_efi_bootp (struct grub_command *cmd __attribute__ ((unused)), ++ int argc, ++ char **args) ++{ ++ struct grub_efi_net_device *netdev; ++ ++ for (netdev = net_devices; netdev; netdev = netdev->next) ++ { ++ grub_efi_status_t status; ++ grub_efi_dhcp4_mode_data_t mode; ++ grub_efi_dhcp4_config_data_t config; ++ grub_efi_dhcp4_packet_option_t *options; ++ grub_efi_ipv4_address_t *dns_address; ++ grub_efi_net_ip_manual_address_t net_ip; ++ grub_efi_net_ip_address_t ip_addr; ++ grub_efi_net_interface_t *inf = NULL; ++ ++ if (argc > 0 && grub_strcmp (netdev->card_name, args[0]) != 0) ++ continue; ++ ++ grub_memset (&config, 0, sizeof(config)); ++ ++ config.option_count = 1; ++ options = grub_malloc (sizeof(*options) + 2); ++ /* Parameter request list */ ++ options->op_code = 55; ++ options->length = 3; ++ /* subnet mask */ ++ options->data[0] = 1; ++ /* router */ ++ options->data[1] = 3; ++ /* DNS */ ++ options->data[2] = 6; ++ config.option_list = &options; ++ ++ /* FIXME: What if the dhcp has bounded */ ++ status = efi_call_2 (netdev->dhcp4->configure, netdev->dhcp4, &config); ++ grub_free (options); ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_printf ("dhcp4 configure failed, %d\n", (int)status); ++ continue; ++ } ++ ++ status = efi_call_2 (netdev->dhcp4->start, netdev->dhcp4, NULL); ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_printf ("dhcp4 start failed, %d\n", (int)status); ++ continue; ++ } ++ ++ status = efi_call_2 (netdev->dhcp4->get_mode_data, netdev->dhcp4, &mode); ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_printf ("dhcp4 get mode failed, %d\n", (int)status); ++ continue; ++ } ++ ++#ifdef GRUB_EFI_NET_DEBUG ++ dhcp4_mode_print (&mode); ++#endif ++ ++ for (inf = netdev->net_interfaces; inf; inf = inf->next) ++ if (inf->prefer_ip6 == 0) ++ break; ++ ++ grub_memcpy (net_ip.ip4.address, mode.client_address, sizeof (net_ip.ip4.address)); ++ grub_memcpy (net_ip.ip4.subnet_mask, mode.subnet_mask, sizeof (net_ip.ip4.subnet_mask)); ++ ++ if (!inf) ++ { ++ char *name = grub_xasprintf ("%s:dhcp", netdev->card_name); ++ ++ net_ip.is_ip6 = 0; ++ inf = grub_efi_net_create_interface (netdev, ++ name, ++ &net_ip, ++ 1); ++ grub_free (name); ++ } ++ else ++ { ++ efi_net_interface_set_address (inf, &net_ip, 1); ++ } ++ ++ grub_memcpy (ip_addr.ip4, mode.router_address, sizeof (ip_addr.ip4)); ++ efi_net_interface_set_gateway (inf, &ip_addr); ++ ++ dns_address = grub_efi_dhcp4_parse_dns (netdev->dhcp4, mode.reply_packet); ++ if (dns_address) ++ efi_net_interface_set_dns (inf, (grub_efi_net_ip_address_t *)&dns_address); ++ ++ } ++ ++ return GRUB_ERR_NONE; ++} ++ ++ ++static grub_err_t ++grub_cmd_efi_bootp6 (struct grub_command *cmd __attribute__ ((unused)), ++ int argc, ++ char **args) ++{ ++ struct grub_efi_net_device *dev; ++ grub_efi_uint32_t ia_id; ++ ++ for (dev = net_devices, ia_id = 0; dev; dev = dev->next, ia_id++) ++ { ++ grub_efi_dhcp6_config_data_t config; ++ grub_efi_dhcp6_packet_option_t *option_list[1]; ++ grub_efi_dhcp6_packet_option_t *opt; ++ grub_efi_status_t status; ++ grub_efi_dhcp6_mode_data_t mode; ++ grub_efi_dhcp6_retransmission_t retrans; ++ grub_efi_net_ip_manual_address_t net_ip; ++ grub_efi_boot_services_t *b = grub_efi_system_table->boot_services; ++ grub_efi_net_interface_t *inf = NULL; ++ ++ if (argc > 0 && grub_strcmp (dev->card_name, args[0]) != 0) ++ continue; ++ ++ opt = grub_malloc (sizeof(*opt) + 2 * sizeof (grub_efi_uint16_t)); ++ ++#define GRUB_EFI_DHCP6_OPT_ORO 6 ++ ++ opt->op_code = grub_cpu_to_be16_compile_time (GRUB_EFI_DHCP6_OPT_ORO); ++ opt->op_len = grub_cpu_to_be16_compile_time (2 * sizeof (grub_efi_uint16_t)); ++ ++#define GRUB_EFI_DHCP6_OPT_BOOT_FILE_URL 59 ++#define GRUB_EFI_DHCP6_OPT_DNS_SERVERS 23 ++ ++ grub_set_unaligned16 (opt->data, grub_cpu_to_be16_compile_time(GRUB_EFI_DHCP6_OPT_BOOT_FILE_URL)); ++ grub_set_unaligned16 (opt->data + 1 * sizeof (grub_efi_uint16_t), ++ grub_cpu_to_be16_compile_time(GRUB_EFI_DHCP6_OPT_DNS_SERVERS)); ++ ++ option_list[0] = opt; ++ retrans.irt = 4; ++ retrans.mrc = 4; ++ retrans.mrt = 32; ++ retrans.mrd = 60; ++ ++ config.dhcp6_callback = NULL; ++ config.callback_context = NULL; ++ config.option_count = 1; ++ config.option_list = option_list; ++ config.ia_descriptor.ia_id = ia_id; ++ config.ia_descriptor.type = GRUB_EFI_DHCP6_IA_TYPE_NA; ++ config.ia_info_event = NULL; ++ config.reconfigure_accept = 0; ++ config.rapid_commit = 0; ++ config.solicit_retransmission = &retrans; ++ ++ status = efi_call_2 (dev->dhcp6->configure, dev->dhcp6, &config); ++ grub_free (opt); ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_printf ("dhcp6 configure failed, %d\n", (int)status); ++ continue; ++ } ++ status = efi_call_1 (dev->dhcp6->start, dev->dhcp6); ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_printf ("dhcp6 start failed, %d\n", (int)status); ++ continue; ++ } ++ ++ status = efi_call_3 (dev->dhcp6->get_mode_data, dev->dhcp6, &mode, NULL); ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_printf ("dhcp4 get mode failed, %d\n", (int)status); ++ continue; ++ } ++ ++ for (inf = dev->net_interfaces; inf; inf = inf->next) ++ if (inf->prefer_ip6 == 1) ++ break; ++ ++ grub_memcpy (net_ip.ip6.address, mode.ia->ia_address[0].ip_address, sizeof (net_ip.ip6.address)); ++ net_ip.ip6.prefix_length = 64; ++ net_ip.ip6.is_anycast = 0; ++ net_ip.is_ip6 = 1; ++ ++ if (!inf) ++ { ++ char *name = grub_xasprintf ("%s:dhcp", dev->card_name); ++ ++ inf = grub_efi_net_create_interface (dev, ++ name, ++ &net_ip, ++ 1); ++ grub_free (name); ++ } ++ else ++ { ++ efi_net_interface_set_address (inf, &net_ip, 1); ++ } ++ ++ { ++ grub_efi_uint32_t count = 0; ++ grub_efi_dhcp6_packet_option_t **options = NULL; ++ grub_efi_uint32_t i; ++ ++ status = efi_call_4 (dev->dhcp6->parse, dev->dhcp6, mode.ia->reply_packet, &count, NULL); ++ ++ if (status == GRUB_EFI_BUFFER_TOO_SMALL && count) ++ { ++ options = grub_malloc (count * sizeof(*options)); ++ status = efi_call_4 (dev->dhcp6->parse, dev->dhcp6, mode.ia->reply_packet, &count, options); ++ } ++ ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ if (options) ++ grub_free (options); ++ continue; ++ } ++ ++ for (i = 0; i < count; ++i) ++ { ++ if (options[i]->op_code == grub_cpu_to_be16_compile_time(GRUB_EFI_DHCP6_OPT_DNS_SERVERS)) ++ { ++ grub_efi_net_ip_address_t dns; ++ grub_memcpy (dns.ip6, options[i]->data, sizeof(net_ip.ip6)); ++ efi_net_interface_set_dns (inf, &dns); ++ break; ++ } ++ } ++ ++ if (options) ++ grub_free (options); ++ } ++ ++ efi_call_1 (b->free_pool, mode.client_id); ++ efi_call_1 (b->free_pool, mode.ia); ++ } ++ ++ return GRUB_ERR_NONE; ++} ++ ++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.02/grub-core/net/efi/efi_netfs.c +=================================================================== +--- /dev/null ++++ grub-2.02/grub-core/net/efi/efi_netfs.c +@@ -0,0 +1,57 @@ ++#include ++#include ++#define EFI_NET_CMD_PREFIX "net_efi" ++#include ++ ++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; ++ } ++} +Index: grub-2.02/grub-core/net/efi/http.c +=================================================================== +--- /dev/null ++++ grub-2.02/grub-core/net/efi/http.c +@@ -0,0 +1,354 @@ ++ ++#include ++#include ++#include ++#include ++#include ++ ++static void ++http_configure (struct grub_efi_net_device *dev, int prefer_ip6) ++{ ++ grub_efi_http_config_data_t http_config; ++ grub_efi_httpv4_access_point_t httpv4_node; ++ grub_efi_httpv6_access_point_t httpv6_node; ++ grub_efi_status_t status; ++ ++ grub_efi_http_t *http = dev->http; ++ ++ grub_memset (&http_config, 0, sizeof(http_config)); ++ http_config.http_version = GRUB_EFI_HTTPVERSION11; ++ http_config.timeout_millisec = 5000; ++ ++ if (prefer_ip6) ++ { ++ grub_efi_uintn_t sz; ++ grub_efi_ip6_config_manual_address_t manual_address; ++ ++ http_config.local_address_is_ipv6 = 1; ++ sz = sizeof (manual_address); ++ status = efi_call_4 (dev->ip6_config->get_data, dev->ip6_config, ++ GRUB_EFI_IP6_CONFIG_DATA_TYPE_MANUAL_ADDRESS, ++ &sz, &manual_address); ++ ++ if (status == GRUB_EFI_NOT_FOUND) ++ { ++ grub_printf ("The MANUAL ADDRESS is not found\n"); ++ } ++ ++ /* FIXME: The manual interface would return BUFFER TOO SMALL !!! */ ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_printf ("??? %d\n",(int) status); ++ return; ++ } ++ ++ grub_memcpy (httpv6_node.local_address, manual_address.address, sizeof (httpv6_node.local_address)); ++ httpv6_node.local_port = 0; ++ http_config.access_point.ipv6_node = &httpv6_node; ++ } ++ else ++ { ++ http_config.local_address_is_ipv6 = 0; ++ grub_memset (&httpv4_node, 0, sizeof(httpv4_node)); ++ httpv4_node.use_default_address = 1; ++ ++ /* Use random port here */ ++ /* See TcpBind() in edk2/NetworkPkg/TcpDxe/TcpDispatcher.c */ ++ httpv4_node.local_port = 0; ++ http_config.access_point.ipv4_node = &httpv4_node; ++ } ++ ++ status = efi_call_2 (http->configure, http, &http_config); ++ ++ if (status == GRUB_EFI_ALREADY_STARTED) ++ { ++ /* XXX: This hangs HTTPS boot */ ++#if 0 ++ if (efi_call_2 (http->configure, http, NULL) != GRUB_EFI_SUCCESS) ++ { ++ grub_error (GRUB_ERR_IO, N_("couldn't reset http instance")); ++ grub_print_error (); ++ return; ++ } ++ status = efi_call_2 (http->configure, http, &http_config); ++#endif ++ return; ++ } ++ ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_error (GRUB_ERR_IO, N_("couldn't configure http protocol, reason: %d"), (int)status); ++ grub_print_error (); ++ return ; ++ } ++} ++ ++static grub_efi_boolean_t request_callback_done; ++static grub_efi_boolean_t response_callback_done; ++ ++static void ++grub_efi_http_request_callback (grub_efi_event_t event __attribute__ ((unused)), ++ void *context __attribute__ ((unused))) ++{ ++ request_callback_done = 1; ++} ++ ++static void ++grub_efi_http_response_callback (grub_efi_event_t event __attribute__ ((unused)), ++ void *context __attribute__ ((unused))) ++{ ++ response_callback_done = 1; ++} ++ ++static grub_err_t ++grub_efihttp_open (struct grub_efi_net_device *dev, ++ int prefer_ip6 __attribute__ ((unused)), ++ grub_file_t file, ++ const char *filename __attribute__ ((unused)), ++ int type) ++{ ++ grub_efi_status_t status; ++ grub_efi_http_request_data_t request_data = {0}; ++ grub_efi_http_message_t request_message = {{0}, 0, 0, 0, 0}; ++ grub_efi_http_token_t request_token = {0}; ++ grub_efi_http_response_data_t response_data = {0}; ++ grub_efi_http_message_t response_message = {{0}, 0, 0, 0, 0}; ++ grub_efi_http_token_t response_token = {0}; ++ grub_uint32_t length, i; ++ grub_efi_boot_services_t *b = grub_efi_system_table->boot_services; ++ grub_efi_http_t *http = dev->http; ++ char *url = NULL; ++ grub_efi_http_header_t request_headers[3] = { ++ {(grub_efi_char8_t *)"Host", (grub_efi_char8_t *)file->device->net->server}, ++ {(grub_efi_char8_t *)"Accept", (grub_efi_char8_t *)"*/*"}, ++ {(grub_efi_char8_t *)"User-Agent", (grub_efi_char8_t *)"UefiHttpBoot/1.0"} ++ }; ++ ++ { ++ grub_efi_ipv6_address_t address; ++ const char *rest; ++ grub_efi_char16_t *ucs2_url; ++ grub_size_t url_len, ucs2_url_len; ++ const char *protocol = (type == 1) ? "https" : "http"; ++ ++ if (grub_efi_string_to_ip6_address (file->device->net->server, &address, &rest) && *rest == 0) ++ url = grub_xasprintf ("%s://[%s]%s", protocol, file->device->net->server, file->device->net->name); ++ else ++ url = grub_xasprintf ("%s://%s%s", protocol, file->device->net->server, file->device->net->name); ++ ++ if (!url) ++ return grub_errno; ++ ++ url_len = grub_strlen (url); ++ ucs2_url_len = url_len * GRUB_MAX_UTF16_PER_UTF8; ++ ucs2_url = grub_malloc ((ucs2_url_len + 1) * sizeof (ucs2_url[0])); ++ ++ if (!ucs2_url) ++ { ++ grub_free (url); ++ return grub_errno; ++ } ++ ++ ucs2_url_len = grub_utf8_to_utf16 (ucs2_url, ucs2_url_len, (grub_uint8_t *)url, url_len, NULL); /* convert string format from ascii to usc2 */ ++ ucs2_url[ucs2_url_len] = 0; ++ grub_free (url); ++ request_data.url = ucs2_url; ++ } ++ ++ request_data.method = GRUB_EFI_HTTPMETHODGET; ++ ++ request_message.data.request = &request_data; ++ request_message.header_count = 3; ++ request_message.headers = request_headers; ++ request_message.body_length = 0; ++ request_message.body = NULL; ++ ++ /* request token */ ++ request_token.event = NULL; ++ request_token.status = GRUB_EFI_NOT_READY; ++ request_token.message = &request_message; ++ ++ request_callback_done = 0; ++ status = efi_call_5 (b->create_event, ++ GRUB_EFI_EVT_NOTIFY_SIGNAL, ++ GRUB_EFI_TPL_CALLBACK, ++ grub_efi_http_request_callback, ++ NULL, ++ &request_token.event); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_free (request_data.url); ++ return grub_error (GRUB_ERR_IO, "Fail to create an event! status=0x%x\n", status); ++ } ++ ++ status = efi_call_2 (http->request, http, &request_token); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ efi_call_1 (b->close_event, request_token.event); ++ grub_free (request_data.url); ++ return grub_error (GRUB_ERR_IO, "Fail to send a request! status=0x%x\n", status); ++ } ++ /* TODO: Add Timeout */ ++ while (!request_callback_done) ++ efi_call_1(http->poll, http); ++ ++ response_data.status_code = GRUB_EFI_HTTP_STATUS_UNSUPPORTED_STATUS; ++ response_message.data.response = &response_data; ++ /* herader_count will be updated by the HTTP driver on response */ ++ response_message.header_count = 0; ++ /* headers will be populated by the driver on response */ ++ response_message.headers = NULL; ++ /* use zero BodyLength to only receive the response headers */ ++ response_message.body_length = 0; ++ response_message.body = NULL; ++ response_token.event = NULL; ++ ++ status = efi_call_5 (b->create_event, ++ GRUB_EFI_EVT_NOTIFY_SIGNAL, ++ GRUB_EFI_TPL_CALLBACK, ++ grub_efi_http_response_callback, ++ NULL, ++ &response_token.event); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ efi_call_1 (b->close_event, request_token.event); ++ grub_free (request_data.url); ++ return grub_error (GRUB_ERR_IO, "Fail to create an event! status=0x%x\n", status); ++ } ++ ++ response_token.status = GRUB_EFI_SUCCESS; ++ response_token.message = &response_message; ++ ++ /* wait for HTTP response */ ++ response_callback_done = 0; ++ status = efi_call_2 (http->response, http, &response_token); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ efi_call_1 (b->close_event, response_token.event); ++ efi_call_1 (b->close_event, request_token.event); ++ grub_free (request_data.url); ++ return grub_error (GRUB_ERR_IO, "Fail to receive a response! status=%d\n", (int)status); ++ } ++ ++ /* TODO: Add Timeout */ ++ while (!response_callback_done) ++ efi_call_1 (http->poll, http); ++ ++ /* check the HTTP status code */ ++ /* parse the length of the file from the ContentLength header */ ++ for (length = 0, i = 0; i < response_message.header_count; ++i) ++ { ++ if (!grub_strcmp((const char*)response_message.headers[i].field_name, "Content-Length")) ++ { ++ length = grub_strtoul((const char*)response_message.headers[i].field_value, 0, 10); ++ break; ++ } ++ } ++ ++ file->size = (grub_off_t)length; ++ file->not_easily_seekable = 0; ++ file->data = 0; ++ file->device->net->offset = 0; ++ ++ /* release */ ++ /* On response, this array is allocated and ++ populated by the HTTP driver. It is the responsibility of the caller ++ to free this memory on both request and response. */ ++ if (response_message.headers) ++ efi_call_1 (b->free_pool, response_message.headers); ++ ++ efi_call_1 (b->close_event, response_token.event); ++ efi_call_1 (b->close_event, request_token.event); ++ grub_free (request_data.url); ++ ++ return GRUB_ERR_NONE; ++} ++ ++static grub_err_t ++grub_efihttp_close (struct grub_efi_net_device *dev, ++ int prefer_ip6 __attribute__ ((unused)), ++ grub_file_t file) ++{ ++ grub_efi_status_t status; ++ grub_efi_http_t *http = dev->http; ++ ++ return GRUB_ERR_NONE; ++ status = efi_call_2 (http->cancel, http, NULL); ++ if (status != GRUB_EFI_SUCCESS) ++ return grub_error (GRUB_ERR_IO, "Error! status=%d\n", (int)status); ++ ++ file->offset = 0; ++ file->device->net->offset = 0; ++ ++ return GRUB_ERR_NONE; ++} ++ ++static grub_ssize_t ++grub_efihttp_read (struct grub_efi_net_device *dev, ++ int prefer_ip6 __attribute__((unused)), ++ grub_file_t file, ++ char *buf, ++ grub_size_t len) ++{ ++ grub_efi_http_token_t response_token; ++ grub_efi_status_t status; ++ grub_size_t sum = 0; ++ grub_efi_boot_services_t *b = grub_efi_system_table->boot_services; ++ grub_efi_http_t *http = dev->http; ++ ++ response_token.event = NULL; ++ efi_call_5 (b->create_event, ++ GRUB_EFI_EVT_NOTIFY_SIGNAL, ++ GRUB_EFI_TPL_CALLBACK, ++ grub_efi_http_response_callback, ++ NULL, ++ &response_token.event); ++ ++ while (len) ++ { ++ grub_efi_http_message_t response_message; ++ ++ response_message.data.response = NULL; ++ response_message.header_count = 0; ++ response_message.headers = NULL; ++ response_message.body_length = len; ++ response_message.body = buf; ++ ++ response_token.message = &response_message; ++ response_token.status = GRUB_EFI_NOT_READY; ++ ++ response_callback_done = 0; ++ ++ status = efi_call_2 (http->response, http, &response_token); ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ efi_call_1 (b->close_event, response_token.event); ++ grub_error (GRUB_ERR_IO, "Error! status=%d\n", (int)status); ++ return -1; ++ } ++ ++ while (!response_callback_done) ++ efi_call_1(http->poll, http); ++ ++ file->device->net->offset += response_message.body_length; ++ sum += response_message.body_length; ++ buf += response_message.body_length; ++ len -= response_message.body_length; ++ } ++ ++ efi_call_1 (b->close_event, response_token.event); ++ ++ return sum; ++} ++ ++struct grub_efi_net_io io_http = ++ { ++ .configure = http_configure, ++ .open = grub_efihttp_open, ++ .read = grub_efihttp_read, ++ .close = grub_efihttp_close ++ }; +Index: grub-2.02/grub-core/net/efi/ip4_config.c +=================================================================== +--- /dev/null ++++ grub-2.02/grub-core/net/efi/ip4_config.c +@@ -0,0 +1,398 @@ ++ ++#include ++#include ++#include ++#include ++#include ++ ++char * ++grub_efi_hw_address_to_string (grub_efi_uint32_t hw_address_size, grub_efi_mac_address_t hw_address) ++{ ++ char *hw_addr, *p; ++ int sz, s; ++ int i; ++ ++ sz = (int)hw_address_size * (sizeof ("XX:") - 1) + 1; ++ ++ hw_addr = grub_malloc (sz); ++ if (!hw_addr) ++ return NULL; ++ ++ p = hw_addr; ++ s = sz; ++ for (i = 0; i < (int)hw_address_size; i++) ++ { ++ grub_snprintf (p, sz, "%02x:", hw_address[i]); ++ p += sizeof ("XX:") - 1; ++ s -= sizeof ("XX:") - 1; ++ } ++ ++ hw_addr[sz - 2] = '\0'; ++ return hw_addr; ++} ++ ++char * ++grub_efi_ip4_address_to_string (grub_efi_ipv4_address_t *address) ++{ ++ char *addr; ++ ++ addr = grub_malloc (sizeof ("XXX.XXX.XXX.XXX")); ++ if (!addr) ++ return NULL; ++ ++ /* FIXME: Use grub_xasprintf ? */ ++ grub_snprintf (addr, ++ sizeof ("XXX.XXX.XXX.XXX"), ++ "%u.%u.%u.%u", ++ (*address)[0], ++ (*address)[1], ++ (*address)[2], ++ (*address)[3]); ++ ++ return addr; ++} ++ ++int ++grub_efi_string_to_ip4_address (const char *val, grub_efi_ipv4_address_t *address, const char **rest) ++{ ++ grub_uint32_t newip = 0; ++ int i; ++ const char *ptr = val; ++ ++ for (i = 0; i < 4; i++) ++ { ++ unsigned long t; ++ t = grub_strtoul (ptr, (char **) &ptr, 0); ++ if (grub_errno) ++ { ++ grub_errno = GRUB_ERR_NONE; ++ return 0; ++ } ++ if (*ptr != '.' && i == 0) ++ { ++ /* XXX: t is in host byte order */ ++ newip = t; ++ break; ++ } ++ if (t & ~0xff) ++ return 0; ++ newip <<= 8; ++ newip |= t; ++ if (i != 3 && *ptr != '.') ++ return 0; ++ ptr++; ++ } ++ ++ newip = grub_cpu_to_be32 (newip); ++ ++ grub_memcpy (address, &newip, sizeof(*address)); ++ ++ if (rest) ++ *rest = (ptr - 1); ++ return 1; ++} ++ ++static grub_efi_ip4_config2_interface_info_t * ++efi_ip4_config_interface_info (grub_efi_ip4_config2_protocol_t *ip4_config) ++{ ++ grub_efi_uintn_t sz; ++ grub_efi_status_t status; ++ grub_efi_ip4_config2_interface_info_t *interface_info; ++ ++ sz = sizeof (*interface_info) + sizeof (*interface_info->route_table); ++ interface_info = grub_malloc (sz); ++ if (!interface_info) ++ return NULL; ++ ++ status = efi_call_4 (ip4_config->get_data, ip4_config, ++ GRUB_EFI_IP4_CONFIG2_DATA_TYPE_INTERFACEINFO, ++ &sz, interface_info); ++ ++ if (status == GRUB_EFI_BUFFER_TOO_SMALL) ++ { ++ grub_free (interface_info); ++ interface_info = grub_malloc (sz); ++ status = efi_call_4 (ip4_config->get_data, ip4_config, ++ GRUB_EFI_IP4_CONFIG2_DATA_TYPE_INTERFACEINFO, ++ &sz, interface_info); ++ } ++ ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_free (interface_info); ++ return NULL; ++ } ++ ++ return interface_info; ++} ++ ++static grub_efi_ip4_config2_manual_address_t * ++efi_ip4_config_manual_address (grub_efi_ip4_config2_protocol_t *ip4_config) ++{ ++ grub_efi_uintn_t sz; ++ grub_efi_status_t status; ++ grub_efi_ip4_config2_manual_address_t *manual_address; ++ ++ sz = sizeof (*manual_address); ++ manual_address = grub_malloc (sz); ++ if (!manual_address) ++ return NULL; ++ ++ status = efi_call_4 (ip4_config->get_data, ip4_config, ++ GRUB_EFI_IP4_CONFIG2_DATA_TYPE_MANUAL_ADDRESS, ++ &sz, manual_address); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_free (manual_address); ++ return NULL; ++ } ++ ++ return manual_address; ++} ++ ++char * ++grub_efi_ip4_interface_name (struct grub_efi_net_device *dev) ++{ ++ grub_efi_ip4_config2_interface_info_t *interface_info; ++ char *name; ++ ++ interface_info = efi_ip4_config_interface_info (dev->ip4_config); ++ ++ if (!interface_info) ++ return NULL; ++ ++ name = grub_malloc (GRUB_EFI_IP4_CONFIG2_INTERFACE_INFO_NAME_SIZE ++ * GRUB_MAX_UTF8_PER_UTF16 + 1); ++ *grub_utf16_to_utf8 ((grub_uint8_t *)name, interface_info->name, ++ GRUB_EFI_IP4_CONFIG2_INTERFACE_INFO_NAME_SIZE) = 0; ++ grub_free (interface_info); ++ return name; ++} ++ ++static char * ++grub_efi_ip4_interface_hw_address (struct grub_efi_net_device *dev) ++{ ++ grub_efi_ip4_config2_interface_info_t *interface_info; ++ char *hw_addr; ++ ++ interface_info = efi_ip4_config_interface_info (dev->ip4_config); ++ ++ if (!interface_info) ++ return NULL; ++ ++ hw_addr = grub_efi_hw_address_to_string (interface_info->hw_address_size, interface_info->hw_address); ++ grub_free (interface_info); ++ ++ return hw_addr; ++} ++ ++static char * ++grub_efi_ip4_interface_address (struct grub_efi_net_device *dev) ++{ ++ grub_efi_ip4_config2_manual_address_t *manual_address; ++ char *addr; ++ ++ manual_address = efi_ip4_config_manual_address (dev->ip4_config); ++ ++ if (!manual_address) ++ return NULL; ++ ++ addr = grub_efi_ip4_address_to_string (&manual_address->address); ++ grub_free (manual_address); ++ return addr; ++} ++ ++ ++static int ++address_mask_size (grub_efi_ipv4_address_t *address) ++{ ++ grub_uint8_t i; ++ grub_uint32_t u32_addr = grub_be_to_cpu32 (grub_get_unaligned32 (address)); ++ ++ if (u32_addr == 0) ++ return 0; ++ ++ for (i = 0; i < 32 ; ++i) ++ { ++ if (u32_addr == ((0xffffffff >> i) << i)) ++ return (32 - i); ++ } ++ ++ return -1; ++} ++ ++static char ** ++grub_efi_ip4_interface_route_table (struct grub_efi_net_device *dev) ++{ ++ grub_efi_ip4_config2_interface_info_t *interface_info; ++ char **ret; ++ int i, id; ++ ++ interface_info = efi_ip4_config_interface_info (dev->ip4_config); ++ if (!interface_info) ++ return NULL; ++ ++ ret = grub_malloc (sizeof (*ret) * (interface_info->route_table_size + 1)); ++ ++ if (!ret) ++ { ++ grub_free (interface_info); ++ return NULL; ++ } ++ ++ id = 0; ++ for (i = 0; i < (int)interface_info->route_table_size; i++) ++ { ++ char *subnet, *gateway, *mask; ++ grub_uint32_t u32_subnet, u32_gateway; ++ int mask_size; ++ grub_efi_ip4_route_table_t *route_table = interface_info->route_table + i; ++ grub_efi_net_interface_t *inf; ++ char *interface_name = NULL; ++ ++ for (inf = dev->net_interfaces; inf; inf = inf->next) ++ if (!inf->prefer_ip6) ++ interface_name = inf->name; ++ ++ u32_gateway = grub_get_unaligned32 (&route_table->gateway_address); ++ gateway = grub_efi_ip4_address_to_string (&route_table->gateway_address); ++ u32_subnet = grub_get_unaligned32 (&route_table->subnet_address); ++ subnet = grub_efi_ip4_address_to_string (&route_table->subnet_address); ++ mask_size = address_mask_size (&route_table->subnet_mask); ++ mask = grub_efi_ip4_address_to_string (&route_table->subnet_mask); ++ if (u32_subnet && !u32_gateway && interface_name) ++ ret[id++] = grub_xasprintf ("%s:local %s/%d %s", dev->card_name, subnet, mask_size, interface_name); ++ else if (u32_subnet && u32_gateway) ++ ret[id++] = grub_xasprintf ("%s:gw %s/%d gw %s", dev->card_name, subnet, mask_size, gateway); ++ else if (!u32_subnet && u32_gateway) ++ ret[id++] = grub_xasprintf ("%s:default %s/%d gw %s", dev->card_name, subnet, mask_size, gateway); ++ grub_free (subnet); ++ grub_free (gateway); ++ grub_free (mask); ++ } ++ ++ ret[id] = NULL; ++ grub_free (interface_info); ++ return ret; ++} ++ ++static grub_efi_net_interface_t * ++grub_efi_ip4_interface_match (struct grub_efi_net_device *dev, grub_efi_net_ip_address_t *ip_address) ++{ ++ grub_efi_ip4_config2_interface_info_t *interface_info; ++ grub_efi_net_interface_t *inf; ++ int i; ++ grub_efi_ipv4_address_t *address = &ip_address->ip4; ++ ++ interface_info = efi_ip4_config_interface_info (dev->ip4_config); ++ if (!interface_info) ++ return NULL; ++ ++ for (i = 0; i < (int)interface_info->route_table_size; i++) ++ { ++ grub_efi_ip4_route_table_t *route_table = interface_info->route_table + i; ++ grub_uint32_t u32_address, u32_mask, u32_subnet; ++ ++ u32_address = grub_get_unaligned32 (address); ++ u32_subnet = grub_get_unaligned32 (route_table->subnet_address); ++ u32_mask = grub_get_unaligned32 (route_table->subnet_mask); ++ ++ /* SKIP Default GATEWAY */ ++ if (!u32_subnet && !u32_mask) ++ continue; ++ ++ if ((u32_address & u32_mask) == u32_subnet) ++ { ++ for (inf = dev->net_interfaces; inf; inf = inf->next) ++ if (!inf->prefer_ip6) ++ { ++ grub_free (interface_info); ++ return inf; ++ } ++ } ++ } ++ ++ grub_free (interface_info); ++ return NULL; ++} ++ ++static int ++grub_efi_ip4_interface_set_manual_address (struct grub_efi_net_device *dev, ++ grub_efi_net_ip_manual_address_t *net_ip, ++ int with_subnet) ++{ ++ grub_efi_status_t status; ++ grub_efi_ip4_config2_manual_address_t *address = &net_ip->ip4; ++ ++ if (!with_subnet) ++ { ++ grub_efi_ip4_config2_manual_address_t *manual_address = ++ efi_ip4_config_manual_address (dev->ip4_config); ++ ++ if (manual_address) ++ { ++ grub_memcpy (address->subnet_mask, manual_address->subnet_mask, sizeof(address->subnet_mask)); ++ grub_free (manual_address); ++ } ++ else ++ { ++ /* XXX: */ ++ address->subnet_mask[0] = 0xff; ++ address->subnet_mask[1] = 0xff; ++ address->subnet_mask[2] = 0xff; ++ address->subnet_mask[3] = 0; ++ } ++ } ++ ++ status = efi_call_4 (dev->ip4_config->set_data, dev->ip4_config, ++ GRUB_EFI_IP4_CONFIG2_DATA_TYPE_MANUAL_ADDRESS, ++ sizeof(*address), address); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ return 0; ++ ++ return 1; ++} ++ ++static int ++grub_efi_ip4_interface_set_gateway (struct grub_efi_net_device *dev, ++ grub_efi_net_ip_address_t *address) ++{ ++ grub_efi_status_t status; ++ ++ status = efi_call_4 (dev->ip4_config->set_data, dev->ip4_config, ++ GRUB_EFI_IP4_CONFIG2_DATA_TYPE_GATEWAY, ++ sizeof (address->ip4), &address->ip4); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ return 0; ++ return 1; ++} ++ ++/* FIXME: Multiple DNS */ ++static int ++grub_efi_ip4_interface_set_dns (struct grub_efi_net_device *dev, ++ grub_efi_net_ip_address_t *address) ++{ ++ grub_efi_status_t status; ++ ++ status = efi_call_4 (dev->ip4_config->set_data, dev->ip4_config, ++ GRUB_EFI_IP4_CONFIG2_DATA_TYPE_DNSSERVER, ++ sizeof (address->ip4), &address->ip4); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ return 0; ++ return 1; ++} ++ ++grub_efi_net_ip_config_t *efi_net_ip4_config = &(grub_efi_net_ip_config_t) ++ { ++ .get_hw_address = grub_efi_ip4_interface_hw_address, ++ .get_address = grub_efi_ip4_interface_address, ++ .get_route_table = grub_efi_ip4_interface_route_table, ++ .best_interface = grub_efi_ip4_interface_match, ++ .set_address = grub_efi_ip4_interface_set_manual_address, ++ .set_gateway = grub_efi_ip4_interface_set_gateway, ++ .set_dns = grub_efi_ip4_interface_set_dns ++ }; +Index: grub-2.02/grub-core/net/efi/ip6_config.c +=================================================================== +--- /dev/null ++++ grub-2.02/grub-core/net/efi/ip6_config.c +@@ -0,0 +1,422 @@ ++#include ++#include ++#include ++#include ++#include ++ ++char * ++grub_efi_ip6_address_to_string (grub_efi_pxe_ipv6_address_t *address) ++{ ++ char *str = grub_malloc (sizeof ("XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX")); ++ char *p; ++ int i; ++ int squash; ++ ++ if (!str) ++ return NULL; ++ ++ p = str; ++ squash = 0; ++ for (i = 0; i < 8; ++i) ++ { ++ grub_uint16_t addr; ++ ++ if (i == 7) ++ squash = 2; ++ ++ addr = grub_get_unaligned16 (address->addr + i * 2); ++ ++ if (grub_be_to_cpu16 (addr)) ++ { ++ char buf[sizeof ("XXXX")]; ++ if (i > 0) ++ *p++ = ':'; ++ grub_snprintf (buf, sizeof (buf), "%x", grub_be_to_cpu16 (addr)); ++ grub_strcpy (p, buf); ++ p += grub_strlen (buf); ++ ++ if (squash == 1) ++ squash = 2; ++ } ++ else ++ { ++ if (squash == 0) ++ { ++ *p++ = ':'; ++ squash = 1; ++ } ++ else if (squash == 2) ++ { ++ *p++ = ':'; ++ *p++ = '0'; ++ } ++ } ++ } ++ *p = '\0'; ++ return str; ++} ++ ++int ++grub_efi_string_to_ip6_address (const char *val, grub_efi_ipv6_address_t *address, const char **rest) ++{ ++ grub_uint16_t newip[8]; ++ const char *ptr = val; ++ int word, quaddot = -1; ++ int bracketed = 0; ++ ++ if (ptr[0] == '[') { ++ bracketed = 1; ++ ptr++; ++ } ++ ++ if (ptr[0] == ':' && ptr[1] != ':') ++ return 0; ++ if (ptr[0] == ':') ++ ptr++; ++ ++ for (word = 0; word < 8; word++) ++ { ++ unsigned long t; ++ if (*ptr == ':') ++ { ++ quaddot = word; ++ word--; ++ ptr++; ++ continue; ++ } ++ t = grub_strtoul (ptr, (char **) &ptr, 16); ++ if (grub_errno) ++ { ++ grub_errno = GRUB_ERR_NONE; ++ break; ++ } ++ if (t & ~0xffff) ++ return 0; ++ newip[word] = grub_cpu_to_be16 (t); ++ if (*ptr != ':') ++ break; ++ ptr++; ++ } ++ if (quaddot == -1 && word < 7) ++ return 0; ++ if (quaddot != -1) ++ { ++ grub_memmove (&newip[quaddot + 7 - word], &newip[quaddot], ++ (word - quaddot + 1) * sizeof (newip[0])); ++ grub_memset (&newip[quaddot], 0, (7 - word) * sizeof (newip[0])); ++ } ++ grub_memcpy (address, newip, 16); ++ if (bracketed && *ptr == ']') { ++ ptr++; ++ } ++ if (rest) ++ *rest = ptr; ++ return 1; ++} ++ ++static grub_efi_ip6_config_interface_info_t * ++efi_ip6_config_interface_info (grub_efi_ip6_config_protocol_t *ip6_config) ++{ ++ grub_efi_uintn_t sz; ++ grub_efi_status_t status; ++ grub_efi_ip6_config_interface_info_t *interface_info; ++ ++ sz = sizeof (*interface_info) + sizeof (*interface_info->route_table); ++ interface_info = grub_malloc (sz); ++ ++ status = efi_call_4 (ip6_config->get_data, ip6_config, ++ GRUB_EFI_IP6_CONFIG_DATA_TYPE_INTERFACEINFO, ++ &sz, interface_info); ++ ++ if (status == GRUB_EFI_BUFFER_TOO_SMALL) ++ { ++ grub_free (interface_info); ++ interface_info = grub_malloc (sz); ++ status = efi_call_4 (ip6_config->get_data, ip6_config, ++ GRUB_EFI_IP6_CONFIG_DATA_TYPE_INTERFACEINFO, ++ &sz, interface_info); ++ } ++ ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_free (interface_info); ++ return NULL; ++ } ++ ++ return interface_info; ++} ++ ++static grub_efi_ip6_config_manual_address_t * ++efi_ip6_config_manual_address (grub_efi_ip6_config_protocol_t *ip6_config) ++{ ++ grub_efi_uintn_t sz; ++ grub_efi_status_t status; ++ grub_efi_ip6_config_manual_address_t *manual_address; ++ ++ sz = sizeof (*manual_address); ++ manual_address = grub_malloc (sz); ++ if (!manual_address) ++ return NULL; ++ ++ status = efi_call_4 (ip6_config->get_data, ip6_config, ++ GRUB_EFI_IP6_CONFIG_DATA_TYPE_MANUAL_ADDRESS, ++ &sz, manual_address); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_free (manual_address); ++ return NULL; ++ } ++ ++ return manual_address; ++} ++ ++char * ++grub_efi_ip6_interface_name (struct grub_efi_net_device *dev) ++{ ++ grub_efi_ip6_config_interface_info_t *interface_info; ++ char *name; ++ ++ interface_info = efi_ip6_config_interface_info (dev->ip6_config); ++ ++ if (!interface_info) ++ return NULL; ++ ++ name = grub_malloc (GRUB_EFI_IP4_CONFIG2_INTERFACE_INFO_NAME_SIZE ++ * GRUB_MAX_UTF8_PER_UTF16 + 1); ++ *grub_utf16_to_utf8 ((grub_uint8_t *)name, interface_info->name, ++ GRUB_EFI_IP4_CONFIG2_INTERFACE_INFO_NAME_SIZE) = 0; ++ grub_free (interface_info); ++ return name; ++} ++ ++static char * ++grub_efi_ip6_interface_hw_address (struct grub_efi_net_device *dev) ++{ ++ grub_efi_ip6_config_interface_info_t *interface_info; ++ char *hw_addr; ++ ++ interface_info = efi_ip6_config_interface_info (dev->ip6_config); ++ ++ if (!interface_info) ++ return NULL; ++ ++ hw_addr = grub_efi_hw_address_to_string (interface_info->hw_address_size, interface_info->hw_address); ++ grub_free (interface_info); ++ ++ return hw_addr; ++} ++ ++static char * ++grub_efi_ip6_interface_address (struct grub_efi_net_device *dev) ++{ ++ grub_efi_ip6_config_manual_address_t *manual_address; ++ char *addr; ++ ++ manual_address = efi_ip6_config_manual_address (dev->ip6_config); ++ ++ if (!manual_address) ++ return NULL; ++ ++ addr = grub_efi_ip6_address_to_string ((grub_efi_pxe_ipv6_address_t *)&manual_address->address); ++ grub_free (manual_address); ++ return addr; ++} ++ ++static char ** ++grub_efi_ip6_interface_route_table (struct grub_efi_net_device *dev) ++{ ++ grub_efi_ip6_config_interface_info_t *interface_info; ++ char **ret; ++ int i, id; ++ ++ interface_info = efi_ip6_config_interface_info (dev->ip6_config); ++ if (!interface_info) ++ return NULL; ++ ++ ret = grub_malloc (sizeof (*ret) * (interface_info->route_count + 1)); ++ ++ if (!ret) ++ { ++ grub_free (interface_info); ++ return NULL; ++ } ++ ++ id = 0; ++ for (i = 0; i < (int)interface_info->route_count ; i++) ++ { ++ char *gateway, *destination; ++ grub_uint64_t u64_gateway[2]; ++ grub_uint64_t u64_destination[2]; ++ grub_efi_ip6_route_table_t *route_table = interface_info->route_table + i; ++ grub_efi_net_interface_t *inf; ++ char *interface_name = NULL; ++ ++ gateway = grub_efi_ip6_address_to_string (&route_table->gateway); ++ destination = grub_efi_ip6_address_to_string (&route_table->destination); ++ ++ u64_gateway[0] = grub_get_unaligned64 (route_table->gateway.addr); ++ u64_gateway[1] = grub_get_unaligned64 (route_table->gateway.addr + 8); ++ u64_destination[0] = grub_get_unaligned64 (route_table->destination.addr); ++ u64_destination[1] = grub_get_unaligned64 (route_table->destination.addr + 8); ++ ++ for (inf = dev->net_interfaces; inf; inf = inf->next) ++ if (inf->prefer_ip6) ++ interface_name = inf->name; ++ ++ if ((!u64_gateway[0] && !u64_gateway[1]) ++ && (u64_destination[0] || u64_destination[1])) ++ { ++ if (interface_name) ++ { ++ if ((grub_be_to_cpu64 (u64_destination[0]) == 0xfe80000000000000ULL) ++ && (!u64_destination[1]) ++ && (route_table->prefix_length == 64)) ++ ret[id++] = grub_xasprintf ("%s:link %s/%d %s", dev->card_name, destination, route_table->prefix_length, interface_name); ++ else ++ ret[id++] = grub_xasprintf ("%s:local %s/%d %s", dev->card_name, destination, route_table->prefix_length, interface_name); ++ } ++ } ++ else if ((u64_gateway[0] || u64_gateway[1]) ++ && (u64_destination[0] || u64_destination[1])) ++ ret[id++] = grub_xasprintf ("%s:gw %s/%d gw %s", dev->card_name, destination, route_table->prefix_length, gateway); ++ else if ((u64_gateway[0] || u64_gateway[1]) ++ && (!u64_destination[0] && !u64_destination[1])) ++ ret[id++] = grub_xasprintf ("%s:default %s/%d gw %s", dev->card_name, destination, route_table->prefix_length, gateway); ++ ++ grub_free (gateway); ++ grub_free (destination); ++ } ++ ++ ret[id] = NULL; ++ grub_free (interface_info); ++ return ret; ++} ++ ++static grub_efi_net_interface_t * ++grub_efi_ip6_interface_match (struct grub_efi_net_device *dev, grub_efi_net_ip_address_t *ip_address) ++{ ++ grub_efi_ip6_config_interface_info_t *interface_info; ++ grub_efi_net_interface_t *inf; ++ int i; ++ grub_efi_ipv6_address_t *address = &ip_address->ip6; ++ ++ interface_info = efi_ip6_config_interface_info (dev->ip6_config); ++ if (!interface_info) ++ return NULL; ++ ++ for (i = 0; i < (int)interface_info->route_count ; i++) ++ { ++ grub_uint64_t u64_addr[2]; ++ grub_uint64_t u64_subnet[2]; ++ grub_uint64_t u64_mask[2]; ++ ++ grub_efi_ip6_route_table_t *route_table = interface_info->route_table + i; ++ ++ /* SKIP Default GATEWAY */ ++ if (route_table->prefix_length == 0) ++ continue; ++ ++ u64_addr[0] = grub_get_unaligned64 (address); ++ u64_addr[1] = grub_get_unaligned64 (address + 4); ++ u64_subnet[0] = grub_get_unaligned64 (route_table->destination.addr); ++ u64_subnet[1] = grub_get_unaligned64 (route_table->destination.addr + 8); ++ u64_mask[0] = (route_table->prefix_length <= 64) ? ++ 0xffffffffffffffffULL << (64 - route_table->prefix_length) : ++ 0xffffffffffffffffULL; ++ u64_mask[1] = (route_table->prefix_length <= 64) ? ++ 0 : ++ 0xffffffffffffffffULL << (128 - route_table->prefix_length); ++ ++ if (((u64_addr[0] & u64_mask[0]) == u64_subnet[0]) ++ && ((u64_addr[1] & u64_mask[1]) == u64_subnet[1])) ++ { ++ for (inf = dev->net_interfaces; inf; inf = inf->next) ++ if (inf->prefer_ip6) ++ { ++ grub_free (interface_info); ++ return inf; ++ } ++ } ++ } ++ ++ grub_free (interface_info); ++ return NULL; ++} ++ ++static int ++grub_efi_ip6_interface_set_manual_address (struct grub_efi_net_device *dev, ++ grub_efi_net_ip_manual_address_t *net_ip, ++ int with_subnet) ++{ ++ grub_efi_status_t status; ++ grub_efi_ip6_config_manual_address_t *address = &net_ip->ip6; ++ ++ if (!with_subnet) ++ { ++ grub_efi_ip6_config_manual_address_t *manual_address = ++ efi_ip6_config_manual_address (dev->ip6_config); ++ ++ if (manual_address) ++ { ++ address->prefix_length = manual_address->prefix_length; ++ grub_free (manual_address); ++ } ++ else ++ { ++ /* XXX: */ ++ address->prefix_length = 64; ++ } ++ } ++ ++ status = efi_call_4 (dev->ip6_config->set_data, dev->ip6_config, ++ GRUB_EFI_IP6_CONFIG_DATA_TYPE_MANUAL_ADDRESS, ++ sizeof(*address), address); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ return 0; ++ ++ return 1; ++} ++ ++static int ++grub_efi_ip6_interface_set_gateway (struct grub_efi_net_device *dev, ++ grub_efi_net_ip_address_t *address) ++{ ++ grub_efi_status_t status; ++ ++ status = efi_call_4 (dev->ip6_config->set_data, dev->ip6_config, ++ GRUB_EFI_IP6_CONFIG_DATA_TYPE_GATEWAY, ++ sizeof (address->ip6), &address->ip6); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ return 0; ++ return 1; ++} ++ ++static int ++grub_efi_ip6_interface_set_dns (struct grub_efi_net_device *dev, ++ grub_efi_net_ip_address_t *address) ++{ ++ ++ grub_efi_status_t status; ++ ++ status = efi_call_4 (dev->ip6_config->set_data, dev->ip6_config, ++ GRUB_EFI_IP6_CONFIG_DATA_TYPE_DNSSERVER, ++ sizeof (address->ip6), &address->ip6); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ return 0; ++ return 1; ++} ++ ++grub_efi_net_ip_config_t *efi_net_ip6_config = &(grub_efi_net_ip_config_t) ++ { ++ .get_hw_address = grub_efi_ip6_interface_hw_address, ++ .get_address = grub_efi_ip6_interface_address, ++ .get_route_table = grub_efi_ip6_interface_route_table, ++ .best_interface = grub_efi_ip6_interface_match, ++ .set_address = grub_efi_ip6_interface_set_manual_address, ++ .set_gateway = grub_efi_ip6_interface_set_gateway, ++ .set_dns = grub_efi_ip6_interface_set_dns ++ }; +Index: grub-2.02/grub-core/net/efi/net.c +=================================================================== +--- /dev/null ++++ grub-2.02/grub-core/net/efi/net.c +@@ -0,0 +1,1420 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++GRUB_MOD_LICENSE ("GPLv3+"); ++ ++#define GRUB_EFI_IP6_PREFIX_LENGTH 64 ++ ++static grub_efi_guid_t ip4_config_guid = GRUB_EFI_IP4_CONFIG2_PROTOCOL_GUID; ++static grub_efi_guid_t ip6_config_guid = GRUB_EFI_IP6_CONFIG_PROTOCOL_GUID; ++static grub_efi_guid_t http_service_binding_guid = GRUB_EFI_HTTP_SERVICE_BINDING_PROTOCOL_GUID; ++static grub_efi_guid_t http_guid = GRUB_EFI_HTTP_PROTOCOL_GUID; ++static grub_efi_guid_t pxe_io_guid = GRUB_EFI_PXE_GUID; ++static grub_efi_guid_t dhcp4_service_binding_guid = GRUB_EFI_DHCP4_SERVICE_BINDING_PROTOCOL_GUID; ++static grub_efi_guid_t dhcp4_guid = GRUB_EFI_DHCP4_PROTOCOL_GUID; ++static grub_efi_guid_t dhcp6_service_binding_guid = GRUB_EFI_DHCP6_SERVICE_BINDING_PROTOCOL_GUID; ++static grub_efi_guid_t dhcp6_guid = GRUB_EFI_DHCP6_PROTOCOL_GUID; ++ ++struct grub_efi_net_device *net_devices; ++ ++static char *default_server; ++static grub_efi_net_interface_t *net_interface; ++static grub_efi_net_interface_t *net_default_interface; ++ ++#define efi_net_interface_configure(inf) inf->io->configure (inf->dev, inf->prefer_ip6) ++#define efi_net_interface_open(inf, file, name) inf->io->open (inf->dev, inf->prefer_ip6, file, name, inf->io_type) ++#define efi_net_interface_read(inf, file, buf, sz) inf->io->read (inf->dev, inf->prefer_ip6, file, buf, sz) ++#define efi_net_interface_close(inf, file) inf->io->close (inf->dev, inf->prefer_ip6, file) ++#define efi_net_interface(m,...) efi_net_interface_ ## m (net_interface, ## __VA_ARGS__) ++ ++static grub_efi_handle_t ++grub_efi_locate_device_path (grub_efi_guid_t *protocol, grub_efi_device_path_t *device_path, ++ grub_efi_device_path_t **r_device_path) ++{ ++ grub_efi_handle_t handle; ++ grub_efi_status_t status; ++ ++ status = efi_call_3 (grub_efi_system_table->boot_services->locate_device_path, ++ protocol, &device_path, &handle); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ return 0; ++ ++ if (r_device_path) ++ *r_device_path = device_path; ++ ++ return handle; ++} ++ ++static int ++url_parse_fields (const char *url, char **proto, char **host, char **path) ++{ ++ const char *p, *ps; ++ grub_size_t l; ++ ++ *proto = *host = *path = NULL; ++ ps = p = url; ++ ++ while ((p = grub_strchr (p, ':'))) ++ { ++ if (grub_strlen (p) < sizeof ("://") - 1) ++ break; ++ if (grub_memcmp (p, "://", sizeof ("://") - 1) == 0) ++ { ++ l = p - ps; ++ *proto = grub_malloc (l + 1); ++ if (!*proto) ++ { ++ grub_print_error (); ++ return 0; ++ } ++ ++ grub_memcpy (*proto, ps, l); ++ (*proto)[l] = '\0'; ++ p += sizeof ("://") - 1; ++ break; ++ } ++ ++p; ++ } ++ ++ if (!*proto) ++ { ++ grub_dprintf ("bootp", "url: %s is not valid, protocol not found\n", url); ++ return 0; ++ } ++ ++ ps = p; ++ p = grub_strchr (p, '/'); ++ ++ if (!p) ++ { ++ grub_dprintf ("bootp", "url: %s is not valid, host/path not found\n", url); ++ grub_free (*proto); ++ *proto = NULL; ++ return 0; ++ } ++ ++ l = p - ps; ++ ++ if (l > 2 && ps[0] == '[' && ps[l - 1] == ']') ++ { ++ *host = grub_malloc (l - 1); ++ if (!*host) ++ { ++ grub_print_error (); ++ grub_free (*proto); ++ *proto = NULL; ++ return 0; ++ } ++ grub_memcpy (*host, ps + 1, l - 2); ++ (*host)[l - 2] = 0; ++ } ++ else ++ { ++ *host = grub_malloc (l + 1); ++ if (!*host) ++ { ++ grub_print_error (); ++ grub_free (*proto); ++ *proto = NULL; ++ return 0; ++ } ++ grub_memcpy (*host, ps, l); ++ (*host)[l] = 0; ++ } ++ ++ *path = grub_strdup (p); ++ if (!*path) ++ { ++ grub_print_error (); ++ grub_free (*host); ++ grub_free (*proto); ++ *host = NULL; ++ *proto = NULL; ++ return 0; ++ } ++ return 1; ++} ++ ++static void ++url_get_boot_location (const char *url, char **device, char **path, int is_default) ++{ ++ char *protocol, *server, *file; ++ char *slash; ++ ++ if (!url_parse_fields (url, &protocol, &server, &file)) ++ return; ++ ++ if ((slash = grub_strrchr (file, '/'))) ++ *slash = 0; ++ else ++ *file = 0; ++ ++ *device = grub_xasprintf ("%s,%s", protocol, server); ++ *path = grub_strdup(file); ++ ++ if (is_default) ++ default_server = server; ++ else ++ grub_free (server); ++ ++ grub_free (protocol); ++ grub_free (file); ++} ++ ++static void ++pxe_get_boot_location (const struct grub_net_bootp_packet *bp, ++ char **device, ++ char **path, ++ int is_default) ++{ ++ char *server = grub_xasprintf ("%d.%d.%d.%d", ++ ((grub_uint8_t *) &bp->server_ip)[0], ++ ((grub_uint8_t *) &bp->server_ip)[1], ++ ((grub_uint8_t *) &bp->server_ip)[2], ++ ((grub_uint8_t *) &bp->server_ip)[3]); ++ ++ *device = grub_xasprintf ("tftp,%s", server); ++ ++ *path = grub_strndup (bp->boot_file, sizeof (bp->boot_file)); ++ ++ if (*path) ++ { ++ char *slash; ++ slash = grub_strrchr (*path, '/'); ++ if (slash) ++ *slash = 0; ++ else ++ **path = 0; ++ } ++ ++ if (is_default) ++ default_server = server; ++ else ++ grub_free (server); ++} ++ ++static void ++pxe_get_boot_location_v6 (const struct grub_net_dhcp6_packet *dp, ++ grub_size_t dhcp_size, ++ char **device, ++ char **path) ++{ ++ ++ struct grub_net_dhcp6_option *dhcp_opt; ++ grub_size_t dhcp_remain_size; ++ *device = *path = 0; ++ ++ if (dhcp_size < sizeof (*dp)) ++ { ++ grub_error (GRUB_ERR_OUT_OF_RANGE, N_("DHCPv6 packet size too small")); ++ return; ++ } ++ ++ dhcp_remain_size = dhcp_size - sizeof (*dp); ++ dhcp_opt = (struct grub_net_dhcp6_option *)dp->dhcp_options; ++ ++ while (dhcp_remain_size) ++ { ++ grub_uint16_t code = grub_be_to_cpu16 (dhcp_opt->code); ++ grub_uint16_t len = grub_be_to_cpu16 (dhcp_opt->len); ++ grub_uint16_t option_size = sizeof (*dhcp_opt) + len; ++ ++ if (dhcp_remain_size < option_size || code == 0) ++ break; ++ ++ if (code == GRUB_NET_DHCP6_OPTION_BOOTFILE_URL) ++ { ++ char *url = grub_malloc (len + 1); ++ ++ grub_memcpy (url, dhcp_opt->data, len); ++ url[len] = 0; ++ ++ url_get_boot_location ((const char *)url, device, path, 1); ++ grub_free (url); ++ break; ++ } ++ ++ dhcp_remain_size -= option_size; ++ dhcp_opt = (struct grub_net_dhcp6_option *)((grub_uint8_t *)dhcp_opt + option_size); ++ } ++} ++ ++static grub_efi_net_interface_t * ++grub_efi_net_config_from_device_path (grub_efi_device_path_t *dp, ++ struct grub_efi_net_device *netdev, ++ char **device, ++ char **path) ++{ ++ grub_efi_net_interface_t *inf = NULL; ++ ++ while (1) ++ { ++ grub_efi_uint8_t type = GRUB_EFI_DEVICE_PATH_TYPE (dp); ++ grub_efi_uint8_t subtype = GRUB_EFI_DEVICE_PATH_SUBTYPE (dp); ++ grub_efi_uint16_t len = GRUB_EFI_DEVICE_PATH_LENGTH (dp); ++ ++ if (type == GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE) ++ { ++ if (subtype == GRUB_EFI_URI_DEVICE_PATH_SUBTYPE) ++ { ++ grub_efi_uri_device_path_t *uri_dp; ++ uri_dp = (grub_efi_uri_device_path_t *) dp; ++ /* Beware that uri_dp->uri may not be null terminated */ ++ url_get_boot_location ((const char *)uri_dp->uri, device, path, 1); ++ } ++ else if (subtype == GRUB_EFI_IPV4_DEVICE_PATH_SUBTYPE) ++ { ++ grub_efi_net_ip_manual_address_t net_ip; ++ grub_efi_ipv4_device_path_t *ipv4 = (grub_efi_ipv4_device_path_t *) dp; ++ ++ if (inf) ++ continue; ++ grub_memcpy (net_ip.ip4.address, ipv4->local_ip_address, sizeof (net_ip.ip4.address)); ++ grub_memcpy (net_ip.ip4.subnet_mask, ipv4->subnet_mask, sizeof (net_ip.ip4.subnet_mask)); ++ net_ip.is_ip6 = 0; ++ inf = grub_efi_net_create_interface (netdev, ++ netdev->card_name, ++ &net_ip, ++ 1); ++ } ++ else if (subtype == GRUB_EFI_IPV6_DEVICE_PATH_SUBTYPE) ++ { ++ grub_efi_net_ip_manual_address_t net_ip; ++ grub_efi_ipv6_device_path_t *ipv6 = (grub_efi_ipv6_device_path_t *) dp; ++ ++ if (inf) ++ continue; ++ grub_memcpy (net_ip.ip6.address, ipv6->local_ip_address, sizeof (net_ip.ip6.address)); ++ net_ip.ip6.prefix_length = GRUB_EFI_IP6_PREFIX_LENGTH; ++ net_ip.ip6.is_anycast = 0; ++ net_ip.is_ip6 = 1; ++ inf = grub_efi_net_create_interface (netdev, ++ netdev->card_name, ++ &net_ip, ++ 1); ++ } ++ } ++ ++ if (GRUB_EFI_END_ENTIRE_DEVICE_PATH (dp)) ++ break; ++ dp = (grub_efi_device_path_t *) ((char *) dp + len); ++ } ++ ++ return inf; ++} ++ ++static grub_efi_net_interface_t * ++grub_efi_net_config_from_handle (grub_efi_handle_t *hnd, ++ struct grub_efi_net_device *netdev, ++ char **device, ++ char **path) ++{ ++ grub_efi_pxe_t *pxe = NULL; ++ ++ if (hnd == netdev->ip4_pxe_handle) ++ pxe = netdev->ip4_pxe; ++ else if (hnd == netdev->ip6_pxe_handle) ++ pxe = netdev->ip6_pxe; ++ ++ if (!pxe) ++ return (grub_efi_net_config_from_device_path ( ++ grub_efi_get_device_path (hnd), ++ netdev, ++ device, ++ path)); ++ ++ if (pxe->mode->using_ipv6) ++ { ++ grub_efi_net_ip_manual_address_t net_ip; ++ ++ pxe_get_boot_location_v6 ( ++ (const struct grub_net_dhcp6_packet *) &pxe->mode->dhcp_ack, ++ sizeof (pxe->mode->dhcp_ack), ++ device, ++ path); ++ ++ grub_memcpy (net_ip.ip6.address, pxe->mode->station_ip.v6.addr, sizeof(net_ip.ip6.address)); ++ net_ip.ip6.prefix_length = GRUB_EFI_IP6_PREFIX_LENGTH; ++ net_ip.ip6.is_anycast = 0; ++ net_ip.is_ip6 = 1; ++ return (grub_efi_net_create_interface (netdev, ++ netdev->card_name, ++ &net_ip, ++ 1)); ++ } ++ else ++ { ++ grub_efi_net_ip_manual_address_t net_ip; ++ ++ pxe_get_boot_location ( ++ (const struct grub_net_bootp_packet *) &pxe->mode->dhcp_ack, ++ device, ++ path, ++ 1); ++ ++ grub_memcpy (net_ip.ip4.address, pxe->mode->station_ip.v4.addr, sizeof (net_ip.ip4.address)); ++ grub_memcpy (net_ip.ip4.subnet_mask, pxe->mode->subnet_mask.v4.addr, sizeof (net_ip.ip4.subnet_mask)); ++ net_ip.is_ip6 = 0; ++ return (grub_efi_net_create_interface (netdev, ++ netdev->card_name, ++ &net_ip, ++ 1)); ++ } ++} ++ ++static const char * ++grub_efi_net_var_get_address (struct grub_env_var *var, ++ const char *val __attribute__ ((unused))) ++{ ++ struct grub_efi_net_device *dev; ++ ++ for (dev = net_devices; dev; dev = dev->next) ++ { ++ grub_efi_net_interface_t *inf; ++ ++ for (inf = dev->net_interfaces; inf; inf = inf->next) ++ { ++ char *var_name; ++ ++ var_name = grub_xasprintf ("net_%s_ip", inf->name); ++ if (grub_strcmp (var_name, var->name) == 0) ++ return efi_net_interface_get_address (inf); ++ grub_free (var_name); ++ var_name = grub_xasprintf ("net_%s_mac", inf->name); ++ if (grub_strcmp (var_name, var->name) == 0) ++ return efi_net_interface_get_hw_address (inf); ++ grub_free (var_name); ++ } ++ } ++ ++ return NULL; ++} ++ ++static char * ++grub_efi_net_var_set_interface (struct grub_env_var *var __attribute__ ((unused)), ++ const char *val) ++{ ++ struct grub_efi_net_device *dev; ++ grub_efi_net_interface_t *inf; ++ ++ for (dev = net_devices; dev; dev = dev->next) ++ for (inf = dev->net_interfaces; inf; inf = inf->next) ++ if (grub_strcmp (inf->name, val) == 0) ++ { ++ net_default_interface = inf; ++ return grub_strdup (val); ++ } ++ ++ return NULL; ++} ++ ++static char * ++grub_efi_net_var_set_server (struct grub_env_var *var __attribute__ ((unused)), ++ const char *val) ++{ ++ grub_free (default_server); ++ default_server = grub_strdup (val); ++ return grub_strdup (val); ++} ++ ++static const char * ++grub_efi_net_var_get_server (struct grub_env_var *var __attribute__ ((unused)), ++ const char *val __attribute__ ((unused))) ++{ ++ return default_server ? : ""; ++} ++ ++static const char * ++grub_efi_net_var_get_ip (struct grub_env_var *var __attribute__ ((unused)), ++ const char *val __attribute__ ((unused))) ++{ ++ const char *intf = grub_env_get ("net_default_interface"); ++ const char *ret = NULL; ++ if (intf) ++ { ++ char *buf = grub_xasprintf ("net_%s_ip", intf); ++ if (buf) ++ ret = grub_env_get (buf); ++ grub_free (buf); ++ } ++ return ret; ++} ++ ++static const char * ++grub_efi_net_var_get_mac (struct grub_env_var *var __attribute__ ((unused)), ++ const char *val __attribute__ ((unused))) ++{ ++ const char *intf = grub_env_get ("net_default_interface"); ++ const char *ret = NULL; ++ if (intf) ++ { ++ char *buf = grub_xasprintf ("net_%s_mac", intf); ++ if (buf) ++ ret = grub_env_get (buf); ++ grub_free (buf); ++ } ++ return ret; ++} ++ ++static void ++grub_efi_net_export_interface_vars (void) ++{ ++ struct grub_efi_net_device *dev; ++ ++ for (dev = net_devices; dev; dev = dev->next) ++ { ++ grub_efi_net_interface_t *inf; ++ ++ for (inf = dev->net_interfaces; inf; inf = inf->next) ++ { ++ char *var; ++ ++ var = grub_xasprintf ("net_%s_ip", inf->name); ++ grub_register_variable_hook (var, grub_efi_net_var_get_address, 0); ++ grub_env_export (var); ++ grub_free (var); ++ var = grub_xasprintf ("net_%s_mac", inf->name); ++ grub_register_variable_hook (var, grub_efi_net_var_get_address, 0); ++ grub_env_export (var); ++ grub_free (var); ++ } ++ } ++} ++ ++static void ++grub_efi_net_unset_interface_vars (void) ++{ ++ struct grub_efi_net_device *dev; ++ ++ for (dev = net_devices; dev; dev = dev->next) ++ { ++ grub_efi_net_interface_t *inf; ++ ++ for (inf = dev->net_interfaces; inf; inf = inf->next) ++ { ++ char *var; ++ ++ var = grub_xasprintf ("net_%s_ip", inf->name); ++ grub_register_variable_hook (var, 0, 0); ++ grub_env_unset (var); ++ grub_free (var); ++ var = grub_xasprintf ("net_%s_mac", inf->name); ++ grub_register_variable_hook (var, 0, 0); ++ grub_env_unset (var); ++ grub_free (var); ++ } ++ } ++} ++ ++grub_efi_net_interface_t * ++grub_efi_net_create_interface (struct grub_efi_net_device *dev, ++ const char *interface_name, ++ grub_efi_net_ip_manual_address_t *net_ip, ++ int has_subnet) ++{ ++ grub_efi_net_interface_t *inf; ++ ++ for (inf = dev->net_interfaces; inf; inf = inf->next) ++ { ++ if (inf->prefer_ip6 == net_ip->is_ip6) ++ break; ++ } ++ ++ if (!inf) ++ { ++ inf = grub_malloc (sizeof(*inf)); ++ inf->name = grub_strdup (interface_name); ++ inf->prefer_ip6 = net_ip->is_ip6; ++ inf->dev = dev; ++ inf->next = dev->net_interfaces; ++ inf->ip_config = (net_ip->is_ip6) ? efi_net_ip6_config : efi_net_ip4_config ; ++ dev->net_interfaces = inf; ++ } ++ else ++ { ++ grub_free (inf->name); ++ inf->name = grub_strdup (interface_name); ++ } ++ ++ if (!efi_net_interface_set_address (inf, net_ip, has_subnet)) ++ { ++ grub_error (GRUB_ERR_BUG, N_("Set Address Failed")); ++ return NULL; ++ } ++ ++ return inf; ++} ++ ++static void ++grub_efi_net_config_real (grub_efi_handle_t hnd, char **device, ++ char **path) ++{ ++ grub_efi_handle_t config_hnd; ++ ++ struct grub_efi_net_device *netdev; ++ grub_efi_net_interface_t *inf; ++ ++ config_hnd = grub_efi_locate_device_path (&ip4_config_guid, grub_efi_get_device_path (hnd), NULL); ++ ++ if (!config_hnd) ++ return; ++ ++ for (netdev = net_devices; netdev; netdev = netdev->next) ++ if (netdev->handle == config_hnd) ++ break; ++ ++ if (!netdev) ++ return; ++ ++ if (!(inf = grub_efi_net_config_from_handle (hnd, netdev, device, path))) ++ return; ++ ++ grub_env_set ("net_default_interface", inf->name); ++ grub_efi_net_export_interface_vars (); ++} ++ ++static grub_err_t ++grub_efi_netfs_dir (grub_device_t device, const char *path __attribute__ ((unused)), ++ grub_fs_dir_hook_t hook __attribute__ ((unused)), ++ void *hook_data __attribute__ ((unused))) ++{ ++ if (!device->net) ++ return grub_error (GRUB_ERR_BUG, "invalid net device"); ++ return GRUB_ERR_NONE; ++} ++ ++static grub_err_t ++grub_efi_netfs_open (struct grub_file *file_out __attribute__ ((unused)), ++ const char *name __attribute__ ((unused))) ++{ ++ struct grub_file *file, *bufio; ++ ++ file = grub_malloc (sizeof (*file)); ++ if (!file) ++ return grub_errno; ++ ++ grub_memcpy (file, file_out, sizeof (struct grub_file)); ++ file->device->net->name = grub_strdup (name); ++ ++ if (!file->device->net->name) ++ { ++ grub_free (file); ++ return grub_errno; ++ } ++ ++ efi_net_interface(open, file, name); ++ grub_print_error (); ++ ++ bufio = grub_bufio_open (file, 32768); ++ if (!bufio) ++ { ++ grub_free (file->device->net->name); ++ grub_free (file); ++ return grub_errno; ++ } ++ grub_memcpy (file_out, bufio, sizeof (struct grub_file)); ++ grub_free (bufio); ++ ++ return GRUB_ERR_NONE; ++} ++ ++static grub_ssize_t ++grub_efihttp_chunk_read (grub_file_t file, char *buf, ++ grub_size_t len, grub_size_t chunk_size) ++{ ++ char *chunk = grub_malloc (chunk_size); ++ grub_size_t sum = 0; ++ ++ while (len) ++ { ++ grub_ssize_t rd; ++ grub_size_t sz = (len > chunk_size) ? chunk_size : len; ++ ++ rd = efi_net_interface (read, file, chunk, sz); ++ ++ if (rd <= 0) ++ return rd; ++ ++ if (buf) ++ { ++ grub_memcpy (buf, chunk, rd); ++ buf += rd; ++ } ++ sum += rd; ++ len -= rd; ++ } ++ ++ grub_free (chunk); ++ return sum; ++} ++ ++static grub_ssize_t ++grub_efi_netfs_read (grub_file_t file __attribute__ ((unused)), ++ char *buf __attribute__ ((unused)), grub_size_t len __attribute__ ((unused))) ++{ ++ if (file->offset > file->device->net->offset) ++ { ++ grub_efihttp_chunk_read (file, NULL, file->offset - file->device->net->offset, 10240); ++ } ++ else if (file->offset < file->device->net->offset) ++ { ++ efi_net_interface (close, file); ++ efi_net_interface (open, file, file->device->net->name); ++ if (file->offset) ++ grub_efihttp_chunk_read (file, NULL, file->offset, 10240); ++ } ++ ++ return efi_net_interface (read, file, buf, len); ++} ++ ++static grub_err_t ++grub_efi_netfs_close (grub_file_t file) ++{ ++ efi_net_interface (close, file); ++ return GRUB_ERR_NONE; ++} ++ ++static grub_efi_handle_t ++grub_efi_service_binding (grub_efi_handle_t dev, grub_efi_guid_t *service_binding_guid) ++{ ++ grub_efi_service_binding_t *service; ++ grub_efi_status_t status; ++ grub_efi_handle_t child_dev = NULL; ++ ++ service = grub_efi_open_protocol (dev, service_binding_guid, GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); ++ if (!service) ++ { ++ grub_error (GRUB_ERR_IO, N_("couldn't open http service binding protocol")); ++ return NULL; ++ } ++ ++ status = efi_call_2 (service->create_child, service, &child_dev); ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_error (GRUB_ERR_IO, N_("Failed to create child device of http service %x"), status); ++ return NULL; ++ } ++ ++ return child_dev; ++} ++ ++static grub_err_t ++grub_efi_net_parse_address (const char *address, ++ grub_efi_ip4_config2_manual_address_t *ip4, ++ grub_efi_ip6_config_manual_address_t *ip6, ++ int *is_ip6, ++ int *has_cidr) ++{ ++ const char *rest; ++ ++ if (grub_efi_string_to_ip4_address (address, &ip4->address, &rest)) ++ { ++ *is_ip6 = 0; ++ if (*rest == '/') ++ { ++ grub_uint32_t subnet_mask_size; ++ ++ subnet_mask_size = grub_strtoul (rest + 1, (char **) &rest, 0); ++ ++ if (!grub_errno && subnet_mask_size <= 32 && *rest == 0) ++ { ++ grub_uint32_t subnet_mask; ++ ++ subnet_mask = grub_cpu_to_be32 ((0xffffffffU << (32 - subnet_mask_size))); ++ grub_memcpy (ip4->subnet_mask, &subnet_mask, sizeof (ip4->subnet_mask)); ++ if (has_cidr) ++ *has_cidr = 1; ++ return GRUB_ERR_NONE; ++ } ++ } ++ else if (*rest == 0) ++ { ++ grub_uint32_t subnet_mask = 0xffffffffU; ++ grub_memcpy (ip4->subnet_mask, &subnet_mask, sizeof (ip4->subnet_mask)); ++ if (has_cidr) ++ *has_cidr = 0; ++ return GRUB_ERR_NONE; ++ } ++ } ++ else if (grub_efi_string_to_ip6_address (address, &ip6->address, &rest)) ++ { ++ *is_ip6 = 1; ++ if (*rest == '/') ++ { ++ grub_efi_uint8_t prefix_length; ++ ++ prefix_length = grub_strtoul (rest + 1, (char **) &rest, 0); ++ if (!grub_errno && prefix_length <= 128 && *rest == 0) ++ { ++ ip6->prefix_length = prefix_length; ++ ip6->is_anycast = 0; ++ if (has_cidr) ++ *has_cidr = 1; ++ return GRUB_ERR_NONE; ++ } ++ } ++ else if (*rest == 0) ++ { ++ ip6->prefix_length = 128; ++ ip6->is_anycast = 0; ++ if (has_cidr) ++ *has_cidr = 0; ++ return GRUB_ERR_NONE; ++ } ++ } ++ ++ return grub_error (GRUB_ERR_NET_BAD_ADDRESS, ++ N_("unrecognised network address `%s'"), ++ address); ++} ++ ++static grub_efi_net_interface_t * ++match_route (const char *server) ++{ ++ grub_err_t err; ++ grub_efi_ip4_config2_manual_address_t ip4; ++ grub_efi_ip6_config_manual_address_t ip6; ++ grub_efi_net_interface_t *inf; ++ int is_ip6 = 0; ++ ++ err = grub_efi_net_parse_address (server, &ip4, &ip6, &is_ip6, 0); ++ ++ if (err) ++ { ++ grub_print_error (); ++ return NULL; ++ } ++ ++ if (is_ip6) ++ { ++ struct grub_efi_net_device *dev; ++ grub_efi_net_ip_address_t addr; ++ ++ grub_memcpy (addr.ip6, ip6.address, sizeof(ip6.address)); ++ ++ for (dev = net_devices; dev; dev = dev->next) ++ if ((inf = efi_net_ip6_config->best_interface (dev, &addr))) ++ return inf; ++ } ++ else ++ { ++ struct grub_efi_net_device *dev; ++ grub_efi_net_ip_address_t addr; ++ ++ grub_memcpy (addr.ip4, ip4.address, sizeof(ip4.address)); ++ ++ for (dev = net_devices; dev; dev = dev->next) ++ if ((inf = efi_net_ip4_config->best_interface (dev, &addr))) ++ return inf; ++ } ++ ++ return 0; ++} ++ ++static void ++grub_efi_net_add_pxebc_to_cards (void) ++{ ++ grub_efi_uintn_t num_handles; ++ grub_efi_handle_t *handles; ++ grub_efi_handle_t *handle; ++ ++ handles = grub_efi_locate_handle (GRUB_EFI_BY_PROTOCOL, &pxe_io_guid, ++ 0, &num_handles); ++ if (!handles) ++ return; ++ ++ for (handle = handles; num_handles--; handle++) ++ { ++ grub_efi_device_path_t *dp, *ddp, *ldp; ++ grub_efi_pxe_t *pxe; ++ struct grub_efi_net_device *d; ++ int is_ip6; ++ ++ dp = grub_efi_get_device_path (*handle); ++ if (!dp) ++ continue; ++ ++ ddp = grub_efi_duplicate_device_path (dp); ++ ldp = grub_efi_find_last_device_path (ddp); ++ ++ if (ldp->type == GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE ++ && ldp->subtype == GRUB_EFI_IPV4_DEVICE_PATH_SUBTYPE) ++ is_ip6 = 0; ++ else if (ldp->type == GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE ++ && ldp->subtype == GRUB_EFI_IPV6_DEVICE_PATH_SUBTYPE) ++ is_ip6 = 1; ++ else ++ { ++ grub_free (ddp); ++ continue; ++ } ++ ++ ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE; ++ ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; ++ ldp->length = sizeof (*ldp); ++ ++ for (d = net_devices; d; d = d->next) ++ if (grub_efi_compare_device_paths (ddp, grub_efi_get_device_path (d->handle)) == 0) ++ break; ++ ++ if (!d) ++ { ++ grub_free (ddp); ++ continue; ++ } ++ ++ pxe = grub_efi_open_protocol (*handle, &pxe_io_guid, ++ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); ++ ++ if (!pxe) ++ { ++ grub_free (ddp); ++ continue; ++ } ++ ++ if (is_ip6) ++ { ++ d->ip6_pxe_handle = *handle; ++ d->ip6_pxe = pxe; ++ } ++ else ++ { ++ d->ip4_pxe_handle = *handle; ++ d->ip4_pxe = pxe; ++ } ++ ++ grub_free (ddp); ++ } ++ ++ grub_free (handles); ++} ++ ++static void ++set_ip_policy_to_static (void) ++{ ++ struct grub_efi_net_device *dev; ++ ++ for (dev = net_devices; dev; dev = dev->next) ++ { ++ grub_efi_status_t status; ++ grub_efi_ip4_config2_policy_t ip4_policy = GRUB_EFI_IP4_CONFIG2_POLICY_STATIC; ++ grub_efi_ip6_config_policy_t ip6_policy = GRUB_EFI_IP6_CONFIG_POLICY_MANUAL; ++ ++ status = efi_call_4 (dev->ip4_config->set_data, dev->ip4_config, ++ GRUB_EFI_IP4_CONFIG2_DATA_TYPE_POLICY, ++ sizeof (ip4_policy), &ip4_policy); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ grub_printf ("Set IP4 STATIC POLICY FAILED, reason: %d\n", (int)status); ++ else ++ grub_printf ("Set IP4 STATIC POLICY SUCCEEDED\n"); ++ ++ ++ status = efi_call_4 (dev->ip6_config->set_data, dev->ip6_config, ++ GRUB_EFI_IP6_CONFIG_DATA_TYPE_POLICY, ++ sizeof (ip6_policy), &ip6_policy); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ grub_printf ("Set IP6 STATIC POLICY FAILED, reason %d\n", (int)status); ++ else ++ grub_printf ("Set IP6 STATIC POLICY SUCCEEDED\n"); ++ } ++} ++ ++/* FIXME: Do not fail if the card did not support any of the protocol (Eg http) */ ++static void ++grub_efi_net_find_cards (void) ++{ ++ grub_efi_uintn_t num_handles; ++ grub_efi_handle_t *handles; ++ grub_efi_handle_t *handle; ++ int id; ++ ++ handles = grub_efi_locate_handle (GRUB_EFI_BY_PROTOCOL, &ip4_config_guid, ++ 0, &num_handles); ++ if (!handles) ++ return; ++ ++ for (id = 0, handle = handles; num_handles--; handle++, id++) ++ { ++ grub_efi_device_path_t *dp; ++ grub_efi_ip4_config2_protocol_t *ip4_config; ++ grub_efi_ip6_config_protocol_t *ip6_config; ++ grub_efi_handle_t http_handle; ++ grub_efi_http_t *http; ++ grub_efi_handle_t dhcp4_handle; ++ grub_efi_dhcp4_protocol_t *dhcp4; ++ grub_efi_handle_t dhcp6_handle; ++ grub_efi_dhcp6_protocol_t *dhcp6; ++ ++ struct grub_efi_net_device *d; ++ ++ dp = grub_efi_get_device_path (*handle); ++ if (!dp) ++ continue; ++ ++ ip4_config = grub_efi_open_protocol (*handle, &ip4_config_guid, ++ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); ++ if (!ip4_config) ++ continue; ++ ++ ip6_config = grub_efi_open_protocol (*handle, &ip6_config_guid, ++ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); ++ ++ if (!ip6_config) ++ continue; ++ ++ http_handle = grub_efi_service_binding (*handle, &http_service_binding_guid); ++ ++ if (!http_handle) ++ continue; ++ ++ http = grub_efi_open_protocol (http_handle, &http_guid, ++ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); ++ ++ if (!http) ++ continue; ++ ++ dhcp4_handle = grub_efi_service_binding (*handle, &dhcp4_service_binding_guid); ++ ++ if (!dhcp4_handle) ++ continue; ++ ++ dhcp4 = grub_efi_open_protocol (dhcp4_handle, &dhcp4_guid, ++ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); ++ ++ if (!dhcp4) ++ continue; ++ ++ dhcp6_handle = grub_efi_service_binding (*handle, &dhcp6_service_binding_guid); ++ ++ if (!dhcp6_handle) ++ continue; ++ ++ dhcp6 = grub_efi_open_protocol (dhcp6_handle, &dhcp6_guid, ++ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); ++ ++ if (!dhcp6) ++ continue; ++ d = grub_malloc (sizeof (*d)); ++ if (!d) ++ { ++ grub_free (handles); ++ while (net_devices) ++ { ++ d = net_devices->next; ++ grub_free (net_devices); ++ net_devices = d; ++ } ++ return; ++ } ++ d->handle = *handle; ++ d->ip4_config = ip4_config; ++ d->ip6_config = ip6_config; ++ d->http_handle = http_handle; ++ d->http = http; ++ d->dhcp4_handle = dhcp4_handle; ++ d->dhcp4 = dhcp4; ++ d->dhcp6_handle = dhcp6_handle; ++ d->dhcp6 = dhcp6; ++ d->next = net_devices; ++ d->card_name = grub_xasprintf ("efinet%d", id); ++ d->net_interfaces = NULL; ++ net_devices = d; ++ } ++ ++ grub_efi_net_add_pxebc_to_cards (); ++ grub_free (handles); ++ set_ip_policy_to_static (); ++} ++ ++static void ++listroutes_ip4 (struct grub_efi_net_device *netdev) ++{ ++ char **routes; ++ ++ routes = NULL; ++ ++ if ((routes = efi_net_ip4_config->get_route_table (netdev))) ++ { ++ char **r; ++ ++ for (r = routes; *r; ++r) ++ grub_printf ("%s\n", *r); ++ } ++ ++ if (routes) ++ { ++ char **r; ++ ++ for (r = routes; *r; ++r) ++ grub_free (*r); ++ grub_free (routes); ++ } ++} ++ ++static void ++listroutes_ip6 (struct grub_efi_net_device *netdev) ++{ ++ char **routes; ++ ++ routes = NULL; ++ ++ if ((routes = efi_net_ip6_config->get_route_table (netdev))) ++ { ++ char **r; ++ ++ for (r = routes; *r; ++r) ++ grub_printf ("%s\n", *r); ++ } ++ ++ if (routes) ++ { ++ char **r; ++ ++ for (r = routes; *r; ++r) ++ grub_free (*r); ++ grub_free (routes); ++ } ++} ++ ++static grub_err_t ++grub_cmd_efi_listroutes (struct grub_command *cmd __attribute__ ((unused)), ++ int argc __attribute__ ((unused)), ++ char **args __attribute__ ((unused))) ++{ ++ struct grub_efi_net_device *netdev; ++ ++ for (netdev = net_devices; netdev; netdev = netdev->next) ++ { ++ listroutes_ip4 (netdev); ++ listroutes_ip6 (netdev); ++ } ++ ++ return GRUB_ERR_NONE; ++} ++static grub_err_t ++grub_cmd_efi_listcards (struct grub_command *cmd __attribute__ ((unused)), ++ int argc __attribute__ ((unused)), ++ char **args __attribute__ ((unused))) ++{ ++ struct grub_efi_net_device *dev; ++ ++ for (dev = net_devices; dev; dev = dev->next) ++ { ++ char *hw_addr; ++ ++ hw_addr = efi_net_ip4_config->get_hw_address (dev); ++ ++ if (hw_addr) ++ { ++ grub_printf ("%s %s\n", dev->card_name, hw_addr); ++ grub_free (hw_addr); ++ } ++ } ++ ++ return GRUB_ERR_NONE; ++} ++ ++static grub_err_t ++grub_cmd_efi_listaddrs (struct grub_command *cmd __attribute__ ((unused)), ++ int argc __attribute__ ((unused)), ++ char **args __attribute__ ((unused))) ++{ ++ struct grub_efi_net_device *dev; ++ grub_efi_net_interface_t *inf; ++ ++ for (dev = net_devices; dev; dev = dev->next) ++ for (inf = dev->net_interfaces; inf; inf = inf->next) ++ { ++ char *hw_addr = NULL; ++ char *addr = NULL; ++ ++ if ((hw_addr = efi_net_interface_get_hw_address (inf)) ++ && (addr = efi_net_interface_get_address (inf))) ++ grub_printf ("%s %s %s\n", inf->name, hw_addr, addr); ++ ++ if (hw_addr) ++ grub_free (hw_addr); ++ if (addr) ++ grub_free (addr); ++ } ++ ++ return GRUB_ERR_NONE; ++} ++ ++/* FIXME: support MAC specifying. */ ++static grub_err_t ++grub_cmd_efi_addaddr (struct grub_command *cmd __attribute__ ((unused)), ++ int argc, char **args) ++{ ++ struct grub_efi_net_device *dev; ++ grub_err_t err; ++ grub_efi_ip4_config2_manual_address_t ip4; ++ grub_efi_ip6_config_manual_address_t ip6; ++ grub_efi_net_ip_manual_address_t net_ip; ++ int is_ip6 = 0; ++ int cidr = 0; ++ ++ if (argc != 3) ++ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("three arguments expected")); ++ ++ for (dev = net_devices; dev; dev = dev->next) ++ { ++ if (grub_strcmp (dev->card_name, args[1]) == 0) ++ break; ++ } ++ ++ if (!dev) ++ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("card not found")); ++ ++ err = grub_efi_net_parse_address (args[2], &ip4, &ip6, &is_ip6, &cidr); ++ ++ if (err) ++ return err; ++ ++ net_ip.is_ip6 = is_ip6; ++ if (is_ip6) ++ grub_memcpy (&net_ip.ip6, &ip6, sizeof(net_ip.ip6)); ++ else ++ grub_memcpy (&net_ip.ip4, &ip4, sizeof(net_ip.ip4)); ++ ++ if (!grub_efi_net_create_interface (dev, ++ args[0], ++ &net_ip, ++ cidr)) ++ return grub_errno; ++ ++ return GRUB_ERR_NONE; ++} ++ ++static struct grub_fs grub_efi_netfs; ++ ++static grub_net_t ++grub_net_open_real (const char *name __attribute__ ((unused))) ++{ ++ grub_size_t protnamelen; ++ const char *protname, *server; ++ grub_net_t ret; ++ ++ grub_printf ("%s\n", name); ++ net_interface = NULL; ++ ++ if (grub_strncmp (name, "pxe:", sizeof ("pxe:") - 1) == 0) ++ { ++ protname = "tftp"; ++ protnamelen = sizeof ("tftp") - 1; ++ server = name + sizeof ("pxe:") - 1; ++ } ++ else if (grub_strcmp (name, "pxe") == 0) ++ { ++ protname = "tftp"; ++ protnamelen = sizeof ("tftp") - 1; ++ server = default_server; ++ } ++ else ++ { ++ const char *comma; ++ ++ comma = grub_strchr (name, ','); ++ if (comma) ++ { ++ protnamelen = comma - name; ++ server = comma + 1; ++ protname = name; ++ } ++ else ++ { ++ protnamelen = grub_strlen (name); ++ server = default_server; ++ protname = name; ++ } ++ } ++ ++ if (!server) ++ { ++ grub_error (GRUB_ERR_NET_BAD_ADDRESS, ++ N_("no server is specified")); ++ return NULL; ++ } ++ ++ grub_printf ("server is %s\n", server); ++ ++ /*FIXME: Use DNS translate name to address */ ++ net_interface = match_route (server); ++ ++ /*XXX: should we check device with default gateway ? */ ++ if (!net_interface && !(net_interface = net_default_interface)) ++ { ++ grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("disk `%s' no route found"), ++ name); ++ return NULL; ++ } ++ ++ if ((protnamelen == (sizeof ("https") - 1) ++ && grub_memcmp ("https", protname, protnamelen) == 0)) ++ { ++ net_interface->io = &io_http; ++ net_interface->io_type = 1; ++ } ++ else if ((protnamelen == (sizeof ("http") - 1) ++ && grub_memcmp ("http", protname, protnamelen) == 0)) ++ { ++ net_interface->io = &io_http; ++ net_interface->io_type = 0; ++ } ++ else if (protnamelen == (sizeof ("tftp") - 1) ++ && grub_memcmp ("tftp", protname, protnamelen) == 0) ++ { ++ net_interface->io = &io_pxe; ++ net_interface->io_type = 0; ++ } ++ else ++ { ++ grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("disk `%s' not found"), ++ name); ++ return NULL; ++ } ++ ++ /*XXX: Should we try to avoid doing excess "reconfigure" here ??? */ ++ efi_net_interface (configure); ++ ++ ret = grub_zalloc (sizeof (*ret)); ++ if (!ret) ++ return NULL; ++ ++ ret->server = grub_strdup (server); ++ if (!ret->server) ++ { ++ grub_free (ret); ++ return NULL; ++ } ++ ++ ret->fs = &grub_efi_netfs; ++ return ret; ++} ++#if 0 ++static grub_command_t cmd_efi_lsaddr; ++static grub_command_t cmd_efi_lscards; ++static grub_command_t cmd_efi_lsroutes; ++static grub_command_t cmd_efi_addaddr; ++#endif ++ ++static struct grub_fs grub_efi_netfs = ++ { ++ .name = "efi netfs", ++ .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 ++grub_efi_net_boot_from_https (void) ++{ ++ grub_efi_loaded_image_t *image = NULL; ++ grub_efi_device_path_t *dp; ++ ++ image = grub_efi_get_loaded_image (grub_efi_image_handle); ++ if (!image) ++ return 0; ++ ++ dp = grub_efi_get_device_path (image->device_handle); ++ ++ while (1) ++ { ++ grub_efi_uint8_t type = GRUB_EFI_DEVICE_PATH_TYPE (dp); ++ grub_efi_uint8_t subtype = GRUB_EFI_DEVICE_PATH_SUBTYPE (dp); ++ grub_efi_uint16_t len = GRUB_EFI_DEVICE_PATH_LENGTH (dp); ++ ++ if ((type == GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE) ++ && (subtype == GRUB_EFI_URI_DEVICE_PATH_SUBTYPE)) ++ { ++ grub_efi_uri_device_path_t *uri_dp = (grub_efi_uri_device_path_t *) dp; ++ return (grub_strncmp ((const char*)uri_dp->uri, "https://", sizeof ("https://") - 1) == 0) ? 1 : 0; ++ } ++ ++ if (GRUB_EFI_END_ENTIRE_DEVICE_PATH (dp)) ++ break; ++ dp = (grub_efi_device_path_t *) ((char *) dp + len); ++ } ++ ++ return 0; ++} ++ ++static char * ++grub_env_write_readonly (struct grub_env_var *var __attribute__ ((unused)), ++ const char *val __attribute__ ((unused))) ++{ ++ return NULL; ++} ++ ++grub_command_func_t grub_efi_net_list_routes = grub_cmd_efi_listroutes; ++grub_command_func_t grub_efi_net_list_cards = grub_cmd_efi_listcards; ++grub_command_func_t grub_efi_net_list_addrs = grub_cmd_efi_listaddrs; ++grub_command_func_t grub_efi_net_add_addr = grub_cmd_efi_addaddr; ++ ++int ++grub_efi_net_fs_init () ++{ ++ grub_efi_net_find_cards (); ++ grub_efi_net_config = grub_efi_net_config_real; ++ grub_net_open = grub_net_open_real; ++ grub_register_variable_hook ("net_default_server", grub_efi_net_var_get_server, ++ grub_efi_net_var_set_server); ++ grub_env_export ("net_default_server"); ++ grub_register_variable_hook ("pxe_default_server", grub_efi_net_var_get_server, ++ grub_efi_net_var_set_server); ++ grub_env_export ("pxe_default_server"); ++ grub_register_variable_hook ("net_default_interface", 0, ++ grub_efi_net_var_set_interface); ++ grub_env_export ("net_default_interface"); ++ grub_register_variable_hook ("net_default_ip", grub_efi_net_var_get_ip, ++ 0); ++ grub_env_export ("net_default_ip"); ++ grub_register_variable_hook ("net_default_mac", grub_efi_net_var_get_mac, ++ 0); ++ grub_env_export ("net_default_mac"); ++ ++ grub_env_set ("grub_netfs_type", "efi"); ++ grub_register_variable_hook ("grub_netfs_type", 0, grub_env_write_readonly); ++ grub_env_export ("grub_netfs_type"); ++ ++ return 1; ++} ++ ++void ++grub_efi_net_fs_fini (void) ++{ ++ grub_env_unset ("grub_netfs_type"); ++ grub_efi_net_unset_interface_vars (); ++ grub_register_variable_hook ("net_default_server", 0, 0); ++ grub_env_unset ("net_default_server"); ++ grub_register_variable_hook ("net_default_interface", 0, 0); ++ grub_env_unset ("net_default_interface"); ++ grub_register_variable_hook ("pxe_default_server", 0, 0); ++ grub_env_unset ("pxe_default_server"); ++ grub_register_variable_hook ("net_default_ip", 0, 0); ++ grub_env_unset ("net_default_ip"); ++ grub_register_variable_hook ("net_default_mac", 0, 0); ++ grub_env_unset ("net_default_mac"); ++ grub_efi_net_config = NULL; ++ grub_net_open = NULL; ++ grub_fs_unregister (&grub_efi_netfs); ++} +Index: grub-2.02/grub-core/net/efi/pxe.c +=================================================================== +--- /dev/null ++++ grub-2.02/grub-core/net/efi/pxe.c +@@ -0,0 +1,419 @@ ++ ++#include ++#include ++#include ++#include ++#include ++ ++static grub_efi_ip6_config_manual_address_t * ++efi_ip6_config_manual_address (grub_efi_ip6_config_protocol_t *ip6_config) ++{ ++ grub_efi_uintn_t sz; ++ grub_efi_status_t status; ++ grub_efi_ip6_config_manual_address_t *manual_address; ++ ++ sz = sizeof (*manual_address); ++ manual_address = grub_malloc (sz); ++ if (!manual_address) ++ return NULL; ++ ++ status = efi_call_4 (ip6_config->get_data, ip6_config, ++ GRUB_EFI_IP6_CONFIG_DATA_TYPE_MANUAL_ADDRESS, ++ &sz, manual_address); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_free (manual_address); ++ return NULL; ++ } ++ ++ return manual_address; ++} ++ ++static grub_efi_ip4_config2_manual_address_t * ++efi_ip4_config_manual_address (grub_efi_ip4_config2_protocol_t *ip4_config) ++{ ++ grub_efi_uintn_t sz; ++ grub_efi_status_t status; ++ grub_efi_ip4_config2_manual_address_t *manual_address; ++ ++ sz = sizeof (*manual_address); ++ manual_address = grub_malloc (sz); ++ if (!manual_address) ++ return NULL; ++ ++ status = efi_call_4 (ip4_config->get_data, ip4_config, ++ GRUB_EFI_IP4_CONFIG2_DATA_TYPE_MANUAL_ADDRESS, ++ &sz, manual_address); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ grub_free (manual_address); ++ return NULL; ++ } ++ ++ return manual_address; ++} ++ ++static void ++pxe_configure (struct grub_efi_net_device *dev, int prefer_ip6) ++{ ++ grub_efi_pxe_t *pxe = (prefer_ip6) ? dev->ip6_pxe : dev->ip4_pxe; ++ ++ grub_efi_pxe_mode_t *mode = pxe->mode; ++ ++ if (!mode->started) ++ { ++ grub_efi_status_t status; ++ status = efi_call_2 (pxe->start, pxe, prefer_ip6); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ grub_printf ("Couldn't start PXE\n"); ++ } ++ ++ grub_printf ("PXE STARTED: %u\n", mode->started); ++ grub_printf ("PXE USING IPV6: %u\n", mode->using_ipv6); ++ ++ if (mode->using_ipv6) ++ { ++ grub_efi_ip6_config_manual_address_t *manual_address; ++ manual_address = efi_ip6_config_manual_address (dev->ip6_config); ++ ++ if (manual_address && ++ grub_memcmp (manual_address->address, mode->station_ip.v6.addr, sizeof (manual_address->address)) != 0) ++ { ++ grub_efi_status_t status; ++ grub_efi_pxe_ip_address_t station_ip; ++ ++ grub_memcpy (station_ip.v6.addr, manual_address->address, sizeof (station_ip.v6.addr)); ++ status = efi_call_3 (pxe->set_station_ip, pxe, &station_ip, NULL); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ grub_printf ("Couldn't set station ip\n"); ++ ++ grub_free (manual_address); ++ } ++ } ++ else ++ { ++ grub_efi_ip4_config2_manual_address_t *manual_address; ++ manual_address = efi_ip4_config_manual_address (dev->ip4_config); ++ ++ if (manual_address && ++ grub_memcmp (manual_address->address, mode->station_ip.v4.addr, sizeof (manual_address->address)) != 0) ++ { ++ grub_efi_status_t status; ++ grub_efi_pxe_ip_address_t station_ip; ++ grub_efi_pxe_ip_address_t subnet_mask; ++ ++ grub_memcpy (station_ip.v4.addr, manual_address->address, sizeof (station_ip.v4.addr)); ++ grub_memcpy (subnet_mask.v4.addr, manual_address->subnet_mask, sizeof (subnet_mask.v4.addr)); ++ ++ status = efi_call_3 (pxe->set_station_ip, pxe, &station_ip, &subnet_mask); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ grub_printf ("Couldn't set station ip\n"); ++ ++ grub_free (manual_address); ++ } ++ } ++ ++ if (mode->using_ipv6) ++ { ++ grub_printf ("PXE STATION IP: %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n", ++ mode->station_ip.v6.addr[0], ++ mode->station_ip.v6.addr[1], ++ mode->station_ip.v6.addr[2], ++ mode->station_ip.v6.addr[3], ++ mode->station_ip.v6.addr[4], ++ mode->station_ip.v6.addr[5], ++ mode->station_ip.v6.addr[6], ++ mode->station_ip.v6.addr[7], ++ mode->station_ip.v6.addr[8], ++ mode->station_ip.v6.addr[9], ++ mode->station_ip.v6.addr[10], ++ mode->station_ip.v6.addr[11], ++ mode->station_ip.v6.addr[12], ++ mode->station_ip.v6.addr[13], ++ mode->station_ip.v6.addr[14], ++ mode->station_ip.v6.addr[15]); ++ } ++ else ++ { ++ grub_printf ("PXE STATION IP: %d.%d.%d.%d\n", ++ mode->station_ip.v4.addr[0], ++ mode->station_ip.v4.addr[1], ++ mode->station_ip.v4.addr[2], ++ mode->station_ip.v4.addr[3]); ++ grub_printf ("PXE SUBNET MASK: %d.%d.%d.%d\n", ++ mode->subnet_mask.v4.addr[0], ++ mode->subnet_mask.v4.addr[1], ++ mode->subnet_mask.v4.addr[2], ++ mode->subnet_mask.v4.addr[3]); ++ } ++ ++ /* TODO: Set The Station IP to the IP2 Config */ ++} ++ ++static int ++parse_ip6 (const char *val, grub_uint64_t *ip, const char **rest) ++{ ++ grub_uint16_t newip[8]; ++ const char *ptr = val; ++ int word, quaddot = -1; ++ int bracketed = 0; ++ ++ if (ptr[0] == '[') { ++ bracketed = 1; ++ ptr++; ++ } ++ ++ if (ptr[0] == ':' && ptr[1] != ':') ++ return 0; ++ if (ptr[0] == ':') ++ ptr++; ++ ++ for (word = 0; word < 8; word++) ++ { ++ unsigned long t; ++ if (*ptr == ':') ++ { ++ quaddot = word; ++ word--; ++ ptr++; ++ continue; ++ } ++ t = grub_strtoul (ptr, (char **) &ptr, 16); ++ if (grub_errno) ++ { ++ grub_errno = GRUB_ERR_NONE; ++ break; ++ } ++ if (t & ~0xffff) ++ return 0; ++ newip[word] = grub_cpu_to_be16 (t); ++ if (*ptr != ':') ++ break; ++ ptr++; ++ } ++ if (quaddot == -1 && word < 7) ++ return 0; ++ if (quaddot != -1) ++ { ++ grub_memmove (&newip[quaddot + 7 - word], &newip[quaddot], ++ (word - quaddot + 1) * sizeof (newip[0])); ++ grub_memset (&newip[quaddot], 0, (7 - word) * sizeof (newip[0])); ++ } ++ grub_memcpy (ip, newip, 16); ++ if (bracketed && *ptr == ']') { ++ ptr++; ++ } ++ if (rest) ++ *rest = ptr; ++ return 1; ++} ++ ++static grub_err_t ++pxe_open (struct grub_efi_net_device *dev, ++ int prefer_ip6, ++ grub_file_t file, ++ const char *filename, ++ int type __attribute__((unused))) ++{ ++ int i; ++ char *p; ++ grub_efi_status_t status; ++ grub_efi_pxe_ip_address_t server_ip; ++ grub_efi_uint64_t file_size = 0; ++ grub_efi_pxe_t *pxe = (prefer_ip6) ? dev->ip6_pxe : dev->ip4_pxe; ++ ++ if (pxe->mode->using_ipv6) ++ { ++ const char *rest; ++ grub_uint64_t ip6[2]; ++ if (parse_ip6 (file->device->net->server, ip6, &rest) && *rest == 0) ++ grub_memcpy (server_ip.v6.addr, ip6, sizeof (server_ip.v6.addr)); ++ /* TODO: ERROR Handling Here */ ++ grub_printf ("PXE SERVER IP: %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n", ++ server_ip.v6.addr[0], ++ server_ip.v6.addr[1], ++ server_ip.v6.addr[2], ++ server_ip.v6.addr[3], ++ server_ip.v6.addr[4], ++ server_ip.v6.addr[5], ++ server_ip.v6.addr[6], ++ server_ip.v6.addr[7], ++ server_ip.v6.addr[8], ++ server_ip.v6.addr[9], ++ server_ip.v6.addr[10], ++ server_ip.v6.addr[11], ++ server_ip.v6.addr[12], ++ server_ip.v6.addr[13], ++ server_ip.v6.addr[14], ++ server_ip.v6.addr[15]); ++ } ++ else ++ { ++ for (i = 0, p = file->device->net->server; i < 4; ++i, ++p) ++ server_ip.v4.addr[i] = grub_strtoul (p, &p, 10); ++ } ++ ++ status = efi_call_10 (pxe->mtftp, ++ pxe, ++ GRUB_EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE, ++ NULL, ++ 0, ++ &file_size, ++ NULL, ++ &server_ip, ++ (grub_efi_char8_t *)filename, ++ NULL, ++ 0); ++ ++ if (status != GRUB_EFI_SUCCESS) ++ return grub_error (GRUB_ERR_IO, "Couldn't get file size"); ++ ++ file->size = (grub_off_t)file_size; ++ file->not_easily_seekable = 0; ++ file->data = 0; ++ file->device->net->offset = 0; ++ ++ return GRUB_ERR_NONE; ++} ++ ++static grub_err_t ++pxe_close (struct grub_efi_net_device *dev __attribute__((unused)), ++ int prefer_ip6 __attribute__((unused)), ++ grub_file_t file __attribute__((unused))) ++{ ++ file->offset = 0; ++ file->size = 0; ++ file->device->net->offset = 0; ++ ++ if (file->data) ++ { ++ grub_free (file->data); ++ file->data = NULL; ++ } ++ ++ return GRUB_ERR_NONE; ++} ++ ++static grub_ssize_t ++pxe_read (struct grub_efi_net_device *dev, ++ int prefer_ip6, ++ grub_file_t file, ++ char *buf, ++ grub_size_t len) ++{ ++ int i; ++ char *p; ++ grub_efi_status_t status; ++ grub_efi_pxe_t *pxe = (prefer_ip6) ? dev->ip6_pxe : dev->ip4_pxe; ++ grub_efi_uint64_t bufsz = len; ++ grub_efi_pxe_ip_address_t server_ip; ++ char *buf2 = NULL; ++ ++ if (file->data) ++ { ++ /* TODO: RANGE Check for offset and file size */ ++ grub_printf ("Read From file->data\n"); ++ grub_memcpy (buf, (char*)file->data + file->device->net->offset, len); ++ file->device->net->offset += len; ++ return len; ++ } ++ ++ if (file->device->net->offset) ++ { ++ grub_error (GRUB_ERR_BUG, "No Offet Read Possible"); ++ grub_print_error (); ++ return 0; ++ } ++ ++ if (pxe->mode->using_ipv6) ++ { ++ const char *rest; ++ grub_uint64_t ip6[2]; ++ if (parse_ip6 (file->device->net->server, ip6, &rest) && *rest == 0) ++ grub_memcpy (server_ip.v6.addr, ip6, sizeof (server_ip.v6.addr)); ++ /* TODO: ERROR Handling Here */ ++ } ++ else ++ { ++ for (i = 0, p = file->device->net->server; i < 4; ++i, ++p) ++ server_ip.v4.addr[i] = grub_strtoul (p, &p, 10); ++ } ++ ++ status = efi_call_10 (pxe->mtftp, ++ pxe, ++ GRUB_EFI_PXE_BASE_CODE_TFTP_READ_FILE, ++ buf, ++ 0, ++ &bufsz, ++ NULL, ++ &server_ip, ++ (grub_efi_char8_t *)file->device->net->name, ++ NULL, ++ 0); ++ ++ if (bufsz != file->size) ++ { ++ grub_error (GRUB_ERR_BUG, "Short read should not happen here"); ++ grub_print_error (); ++ return 0; ++ } ++ ++ if (status == GRUB_EFI_BUFFER_TOO_SMALL) ++ { ++ ++ buf2 = grub_malloc (bufsz); ++ ++ if (!buf2) ++ { ++ grub_error (GRUB_ERR_OUT_OF_MEMORY, "ERROR OUT OF MEMORY"); ++ grub_print_error (); ++ return 0; ++ } ++ ++ status = efi_call_10 (pxe->mtftp, ++ pxe, ++ GRUB_EFI_PXE_BASE_CODE_TFTP_READ_FILE, ++ buf2, ++ 0, ++ &bufsz, ++ NULL, ++ &server_ip, ++ (grub_efi_char8_t *)file->device->net->name, ++ NULL, ++ 0); ++ } ++ ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ if (buf2) ++ grub_free (buf2); ++ ++ grub_error (GRUB_ERR_IO, "Failed to Read File"); ++ grub_print_error (); ++ return 0; ++ } ++ ++ if (buf2) ++ grub_memcpy (buf, buf2, len); ++ ++ file->device->net->offset = len; ++ ++ if (buf2) ++ file->data = buf2; ++ ++ return len; ++} ++ ++struct grub_efi_net_io io_pxe = ++ { ++ .configure = pxe_configure, ++ .open = pxe_open, ++ .read = pxe_read, ++ .close = pxe_close ++ }; ++ +Index: grub-2.02/grub-core/net/net.c +=================================================================== +--- grub-2.02.orig/grub-core/net/net.c ++++ grub-2.02/grub-core/net/net.c +@@ -32,6 +32,9 @@ + #include + #include + #include ++#ifdef GRUB_MACHINE_EFI ++#include ++#endif + + GRUB_MOD_LICENSE ("GPLv3+"); + +@@ -1817,8 +1820,49 @@ static grub_command_t cmd_addaddr, cmd_d + static grub_command_t cmd_lsroutes, cmd_lscards; + static grub_command_t cmd_lsaddr, cmd_slaac; + ++#ifdef GRUB_MACHINE_EFI ++ ++static enum { ++ INIT_MODE_NONE, ++ INIT_MODE_GRUB, ++ INIT_MODE_EFI ++} init_mode; ++ ++static grub_command_t cmd_bootp, cmd_bootp6; ++ ++#endif ++ + GRUB_MOD_INIT(net) + { ++#ifdef GRUB_MACHINE_EFI ++ if (grub_net_open) ++ return; ++ ++ if (grub_efi_net_boot_from_https () ++ && grub_efi_net_fs_init ()) ++ { ++ cmd_lsroutes = grub_register_command ("net_ls_routes", grub_efi_net_list_routes, ++ "", N_("list network routes")); ++ cmd_lscards = grub_register_command ("net_ls_cards", grub_efi_net_list_cards, ++ "", N_("list network cards")); ++ cmd_lsaddr = grub_register_command ("net_ls_addr", grub_efi_net_list_addrs, ++ "", N_("list network addresses")); ++ cmd_addaddr = grub_register_command ("net_add_addr", grub_efi_net_add_addr, ++ /* TRANSLATORS: HWADDRESS stands for ++ "hardware address". */ ++ N_("SHORTNAME CARD ADDRESS [HWADDRESS]"), ++ N_("Add a network address.")); ++ cmd_bootp = grub_register_command ("net_bootp", grub_efi_net_bootp, ++ N_("[CARD]"), ++ N_("perform a bootp autoconfiguration")); ++ cmd_bootp6 = grub_register_command ("net_bootp6", grub_efi_net_bootp6, ++ N_("[CARD]"), ++ N_("perform a bootp autoconfiguration")); ++ init_mode = INIT_MODE_EFI; ++ return; ++ } ++#endif ++ + grub_register_variable_hook ("net_default_server", defserver_get_env, + defserver_set_env); + grub_env_export ("net_default_server"); +@@ -1866,10 +1910,37 @@ GRUB_MOD_INIT(net) + grub_net_restore_hw, + GRUB_LOADER_PREBOOT_HOOK_PRIO_DISK); + grub_net_poll_cards_idle = grub_net_poll_cards_idle_real; ++ ++#ifdef GRUB_MACHINE_EFI ++ grub_env_set ("grub_netfs_type", "grub"); ++ grub_register_variable_hook ("grub_netfs_type", 0, grub_env_write_readonly); ++ grub_env_export ("grub_netfs_type"); ++ init_mode = INIT_MODE_GRUB; ++#endif ++ + } + + GRUB_MOD_FINI(net) + { ++ ++#ifdef GRUB_MACHINE_EFI ++ if (init_mode == INIT_MODE_NONE) ++ return; ++ ++ if (init_mode == INIT_MODE_EFI) ++ { ++ grub_unregister_command (cmd_lsroutes); ++ grub_unregister_command (cmd_lscards); ++ grub_unregister_command (cmd_lsaddr); ++ grub_unregister_command (cmd_addaddr); ++ grub_unregister_command (cmd_bootp); ++ grub_unregister_command (cmd_bootp6); ++ grub_efi_net_fs_fini (); ++ init_mode = INIT_MODE_NONE; ++ return; ++ } ++#endif ++ + grub_register_variable_hook ("net_default_server", 0, 0); + grub_register_variable_hook ("pxe_default_server", 0, 0); + +@@ -1888,4 +1959,7 @@ GRUB_MOD_FINI(net) + grub_net_fini_hw (0); + grub_loader_unregister_preboot_hook (fini_hnd); + grub_net_poll_cards_idle = grub_net_poll_cards_idle_real; ++#ifdef GRUB_MACHINE_EFI ++ init_mode = INIT_MODE_NONE; ++#endif + } +Index: grub-2.02/include/grub/efi/api.h +=================================================================== +--- grub-2.02.orig/include/grub/efi/api.h ++++ grub-2.02/include/grub/efi/api.h +@@ -851,6 +851,8 @@ struct grub_efi_ipv6_device_path + grub_efi_uint16_t remote_port; + grub_efi_uint16_t protocol; + grub_efi_uint8_t static_ip_address; ++ grub_efi_uint8_t prefix_length; ++ grub_efi_ipv6_address_t gateway_ip_address; + } GRUB_PACKED; + typedef struct grub_efi_ipv6_device_path grub_efi_ipv6_device_path_t; + +@@ -982,6 +984,23 @@ struct grub_efi_bios_device_path + } GRUB_PACKED; + typedef struct grub_efi_bios_device_path grub_efi_bios_device_path_t; + ++/* Service Binding definitions */ ++struct grub_efi_service_binding; ++ ++typedef grub_efi_status_t ++(*grub_efi_service_binding_create_child) (struct grub_efi_service_binding *this, ++ grub_efi_handle_t *child_handle); ++ ++typedef grub_efi_status_t ++(*grub_efi_service_binding_destroy_child) (struct grub_efi_service_binding *this, ++ grub_efi_handle_t *child_handle); ++ ++typedef struct grub_efi_service_binding ++{ ++ grub_efi_service_binding_create_child create_child; ++ grub_efi_service_binding_destroy_child destroy_child; ++} grub_efi_service_binding_t; ++ + struct grub_efi_open_protocol_information_entry + { + grub_efi_handle_t agent_handle; +@@ -1491,6 +1510,29 @@ typedef union { + grub_efi_pxe_ipv6_address_t v6; + } grub_efi_pxe_ip_address_t; + ++typedef grub_efi_uint16_t grub_efi_pxe_base_code_udp_port_t; ++ ++typedef enum { ++ GRUB_EFI_PXE_BASE_CODE_TFTP_FIRST, ++ GRUB_EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE, ++ GRUB_EFI_PXE_BASE_CODE_TFTP_READ_FILE, ++ GRUB_EFI_PXE_BASE_CODE_TFTP_WRITE_FILE, ++ GRUB_EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY, ++ GRUB_EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE, ++ GRUB_EFI_PXE_BASE_CODE_MTFTP_READ_FILE, ++ GRUB_EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY, ++ GRUB_EFI_PXE_BASE_CODE_MTFTP_LAST ++} grub_efi_pxe_base_code_tftp_opcode_t; ++ ++ ++typedef struct { ++ grub_efi_ip_address_t mcast_ip; ++ grub_efi_pxe_base_code_udp_port_t c_port; ++ grub_efi_pxe_base_code_udp_port_t s_port; ++ grub_efi_uint16_t listen_timeout; ++ grub_efi_uint16_t transmit_timeout; ++} grub_efi_pxe_base_code_mtftp_info_t; ++ + #define GRUB_EFI_PXE_BASE_CODE_MAX_IPCNT 8 + typedef struct { + grub_uint8_t filters; +@@ -1539,17 +1581,31 @@ typedef struct grub_efi_pxe_mode + typedef struct grub_efi_pxe + { + grub_uint64_t rev; +- void (*start) (void); ++ grub_efi_status_t (*start) (struct grub_efi_pxe *this, grub_efi_boolean_t use_ipv6); + void (*stop) (void); +- void (*dhcp) (void); ++ grub_efi_status_t (*dhcp) (struct grub_efi_pxe *this, ++ grub_efi_boolean_t sort_offers); + void (*discover) (void); +- void (*mftp) (void); ++ grub_efi_status_t (*mtftp) (struct grub_efi_pxe *this, ++ grub_efi_pxe_base_code_tftp_opcode_t operation, ++ void *buffer_ptr, ++ grub_efi_boolean_t overwrite, ++ grub_efi_uint64_t *buffer_size, ++ grub_efi_uintn_t *block_size, ++ grub_efi_pxe_ip_address_t *server_ip, ++ //grub_efi_ip_address_t *server_ip, ++ grub_efi_char8_t *filename, ++ grub_efi_pxe_base_code_mtftp_info_t *info, ++ grub_efi_boolean_t dont_use_buffer); + void (*udpwrite) (void); + void (*udpread) (void); + void (*setipfilter) (void); + void (*arp) (void); + void (*setparams) (void); +- void (*setstationip) (void); ++ grub_efi_status_t (*set_station_ip) (struct grub_efi_pxe *this, ++ grub_efi_pxe_ip_address_t *new_station_ip, ++ grub_efi_pxe_ip_address_t *new_subnet_mask); ++ //void (*setstationip) (void); + void (*setpackets) (void); + struct grub_efi_pxe_mode *mode; + } grub_efi_pxe_t; +@@ -1791,6 +1847,44 @@ struct grub_efi_ip4_config2_protocol + }; + typedef struct grub_efi_ip4_config2_protocol grub_efi_ip4_config2_protocol_t; + ++struct grub_efi_ip4_route_table { ++ grub_efi_ipv4_address_t subnet_address; ++ grub_efi_ipv4_address_t subnet_mask; ++ grub_efi_ipv4_address_t gateway_address; ++}; ++ ++typedef struct grub_efi_ip4_route_table grub_efi_ip4_route_table_t; ++ ++#define GRUB_EFI_IP4_CONFIG2_INTERFACE_INFO_NAME_SIZE 32 ++ ++struct grub_efi_ip4_config2_interface_info { ++ grub_efi_char16_t name[GRUB_EFI_IP4_CONFIG2_INTERFACE_INFO_NAME_SIZE]; ++ grub_efi_uint8_t if_type; ++ grub_efi_uint32_t hw_address_size; ++ grub_efi_mac_address_t hw_address; ++ grub_efi_ipv4_address_t station_address; ++ grub_efi_ipv4_address_t subnet_mask; ++ grub_efi_uint32_t route_table_size; ++ grub_efi_ip4_route_table_t *route_table; ++}; ++ ++typedef struct grub_efi_ip4_config2_interface_info grub_efi_ip4_config2_interface_info_t; ++ ++enum grub_efi_ip4_config2_policy { ++ GRUB_EFI_IP4_CONFIG2_POLICY_STATIC, ++ GRUB_EFI_IP4_CONFIG2_POLICY_DHCP, ++ GRUB_EFI_IP4_CONFIG2_POLICY_MAX ++}; ++ ++typedef enum grub_efi_ip4_config2_policy grub_efi_ip4_config2_policy_t; ++ ++struct grub_efi_ip4_config2_manual_address { ++ grub_efi_ipv4_address_t address; ++ grub_efi_ipv4_address_t subnet_mask; ++}; ++ ++typedef struct grub_efi_ip4_config2_manual_address grub_efi_ip4_config2_manual_address_t; ++ + enum grub_efi_ip6_config_data_type { + GRUB_EFI_IP6_CONFIG_DATA_TYPE_INTERFACEINFO, + GRUB_EFI_IP6_CONFIG_DATA_TYPE_ALT_INTERFACEID, +@@ -1825,6 +1919,49 @@ struct grub_efi_ip6_config_protocol + }; + typedef struct grub_efi_ip6_config_protocol grub_efi_ip6_config_protocol_t; + ++enum grub_efi_ip6_config_policy { ++ GRUB_EFI_IP6_CONFIG_POLICY_MANUAL, ++ GRUB_EFI_IP6_CONFIG_POLICY_AUTOMATIC ++}; ++typedef enum grub_efi_ip6_config_policy grub_efi_ip6_config_policy_t; ++ ++struct grub_efi_ip6_address_info { ++ grub_efi_ipv6_address_t address; ++ grub_efi_uint8_t prefix_length; ++}; ++typedef struct grub_efi_ip6_address_info grub_efi_ip6_address_info_t; ++ ++struct grub_efi_ip6_route_table { ++ grub_efi_pxe_ipv6_address_t gateway; ++ grub_efi_pxe_ipv6_address_t destination; ++ grub_efi_uint8_t prefix_length; ++}; ++typedef struct grub_efi_ip6_route_table grub_efi_ip6_route_table_t; ++ ++struct grub_efi_ip6_config_interface_info { ++ grub_efi_char16_t name[32]; ++ grub_efi_uint8_t if_type; ++ grub_efi_uint32_t hw_address_size; ++ grub_efi_mac_address_t hw_address; ++ grub_efi_uint32_t address_info_count; ++ grub_efi_ip6_address_info_t *address_info; ++ grub_efi_uint32_t route_count; ++ grub_efi_ip6_route_table_t *route_table; ++}; ++typedef struct grub_efi_ip6_config_interface_info grub_efi_ip6_config_interface_info_t; ++ ++struct grub_efi_ip6_config_dup_addr_detect_transmits { ++ grub_efi_uint32_t dup_addr_detect_transmits; ++}; ++typedef struct grub_efi_ip6_config_dup_addr_detect_transmits grub_efi_ip6_config_dup_addr_detect_transmits_t; ++ ++struct grub_efi_ip6_config_manual_address { ++ grub_efi_ipv6_address_t address; ++ grub_efi_boolean_t is_anycast; ++ grub_efi_uint8_t prefix_length; ++}; ++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__) + +Index: grub-2.02/include/grub/efi/dhcp.h +=================================================================== +--- /dev/null ++++ grub-2.02/include/grub/efi/dhcp.h +@@ -0,0 +1,343 @@ ++#ifndef GRUB_EFI_DHCP_HEADER ++#define GRUB_EFI_DHCP_HEADER 1 ++ ++#define GRUB_EFI_DHCP4_SERVICE_BINDING_PROTOCOL_GUID \ ++ { 0x9d9a39d8, 0xbd42, 0x4a73, \ ++ { 0xa4, 0xd5, 0x8e, 0xe9, 0x4b, 0xe1, 0x13, 0x80 } \ ++ } ++ ++#define GRUB_EFI_DHCP4_PROTOCOL_GUID \ ++ { 0x8a219718, 0x4ef5, 0x4761, \ ++ { 0x91, 0xc8, 0xc0, 0xf0, 0x4b, 0xda, 0x9e, 0x56 } \ ++ } ++ ++#define GRUB_EFI_DHCP6_SERVICE_BINDING_PROTOCOL_GUID \ ++ { 0x9fb9a8a1, 0x2f4a, 0x43a6, \ ++ { 0x88, 0x9c, 0xd0, 0xf7, 0xb6, 0xc4 ,0x7a, 0xd5 } \ ++ } ++ ++#define GRUB_EFI_DHCP6_PROTOCOL_GUID \ ++ { 0x87c8bad7, 0x595, 0x4053, \ ++ { 0x82, 0x97, 0xde, 0xde, 0x39, 0x5f, 0x5d, 0x5b } \ ++ } ++ ++typedef struct grub_efi_dhcp4_protocol grub_efi_dhcp4_protocol_t; ++ ++enum grub_efi_dhcp4_state { ++ GRUB_EFI_DHCP4_STOPPED, ++ GRUB_EFI_DHCP4_INIT, ++ GRUB_EFI_DHCP4_SELECTING, ++ GRUB_EFI_DHCP4_REQUESTING, ++ GRUB_EFI_DHCP4_BOUND, ++ GRUB_EFI_DHCP4_RENEWING, ++ GRUB_EFI_DHCP4_REBINDING, ++ GRUB_EFI_DHCP4_INIT_REBOOT, ++ GRUB_EFI_DHCP4_REBOOTING ++}; ++ ++typedef enum grub_efi_dhcp4_state grub_efi_dhcp4_state_t; ++ ++struct grub_efi_dhcp4_header { ++ grub_efi_uint8_t op_code; ++ grub_efi_uint8_t hw_type; ++ grub_efi_uint8_t hw_addr_len; ++ grub_efi_uint8_t hops; ++ grub_efi_uint32_t xid; ++ grub_efi_uint16_t seconds; ++ grub_efi_uint16_t reserved; ++ grub_efi_ipv4_address_t client_addr; ++ grub_efi_ipv4_address_t your_addr; ++ grub_efi_ipv4_address_t server_addr; ++ grub_efi_ipv4_address_t gateway_addr; ++ grub_efi_uint8_t client_hw_addr[16]; ++ grub_efi_char8_t server_name[64]; ++ grub_efi_char8_t boot_file_name[128]; ++} GRUB_PACKED; ++ ++typedef struct grub_efi_dhcp4_header grub_efi_dhcp4_header_t; ++ ++struct grub_efi_dhcp4_packet { ++ grub_efi_uint32_t size; ++ grub_efi_uint32_t length; ++ struct { ++ grub_efi_dhcp4_header_t header; ++ grub_efi_uint32_t magik; ++ grub_efi_uint8_t option[1]; ++ } dhcp4; ++} GRUB_PACKED; ++ ++typedef struct grub_efi_dhcp4_packet grub_efi_dhcp4_packet_t; ++ ++struct grub_efi_dhcp4_listen_point { ++ grub_efi_ipv4_address_t listen_address; ++ grub_efi_ipv4_address_t subnet_mask; ++ grub_efi_uint16_t listen_port; ++}; ++ ++typedef struct grub_efi_dhcp4_listen_point grub_efi_dhcp4_listen_point_t; ++ ++struct grub_efi_dhcp4_transmit_receive_token { ++ grub_efi_status_t status; ++ grub_efi_event_t completion_event; ++ grub_efi_ipv4_address_t remote_address; ++ grub_efi_uint16_t remote_port; ++ grub_efi_ipv4_address_t gateway_address; ++ grub_efi_uint32_t listen_point_count; ++ grub_efi_dhcp4_listen_point_t *listen_points; ++ grub_efi_uint32_t timeout_value; ++ grub_efi_dhcp4_packet_t *packet; ++ grub_efi_uint32_t response_count; ++ grub_efi_dhcp4_packet_t *response_list; ++}; ++ ++typedef struct grub_efi_dhcp4_transmit_receive_token grub_efi_dhcp4_transmit_receive_token_t; ++ ++enum grub_efi_dhcp4_event { ++ GRUB_EFI_DHCP4_SEND_DISCOVER = 0X01, ++ GRUB_EFI_DHCP4_RCVD_OFFER, ++ GRUB_EFI_DHCP4_SELECT_OFFER, ++ GRUB_EFI_DHCP4_SEND_REQUEST, ++ GRUB_EFI_DHCP4_RCVD_ACK, ++ GRUB_EFI_DHCP4_RCVD_NAK, ++ GRUB_EFI_DHCP4_SEND_DECLINE, ++ GRUB_EFI_DHCP4_BOUND_COMPLETED, ++ GRUB_EFI_DHCP4_ENTER_RENEWING, ++ GRUB_EFI_DHCP4_ENTER_REBINDING, ++ GRUB_EFI_DHCP4_ADDRESS_LOST, ++ GRUB_EFI_DHCP4_FAIL ++}; ++ ++typedef enum grub_efi_dhcp4_event grub_efi_dhcp4_event_t; ++ ++struct grub_efi_dhcp4_packet_option { ++ grub_efi_uint8_t op_code; ++ grub_efi_uint8_t length; ++ grub_efi_uint8_t data[1]; ++} GRUB_PACKED; ++ ++typedef struct grub_efi_dhcp4_packet_option grub_efi_dhcp4_packet_option_t; ++ ++struct grub_efi_dhcp4_config_data { ++ grub_efi_uint32_t discover_try_count; ++ grub_efi_uint32_t *discover_timeout; ++ grub_efi_uint32_t request_try_count; ++ grub_efi_uint32_t *request_timeout; ++ grub_efi_ipv4_address_t client_address; ++ grub_efi_status_t (*dhcp4_callback) ( ++ grub_efi_dhcp4_protocol_t *this, ++ void *context, ++ grub_efi_dhcp4_state_t current_state, ++ grub_efi_dhcp4_event_t dhcp4_event, ++ grub_efi_dhcp4_packet_t *packet, ++ grub_efi_dhcp4_packet_t **new_packet ++ ); ++ void *callback_context; ++ grub_efi_uint32_t option_count; ++ grub_efi_dhcp4_packet_option_t **option_list; ++}; ++ ++typedef struct grub_efi_dhcp4_config_data grub_efi_dhcp4_config_data_t; ++ ++struct grub_efi_dhcp4_mode_data { ++ grub_efi_dhcp4_state_t state; ++ grub_efi_dhcp4_config_data_t config_data; ++ grub_efi_ipv4_address_t client_address; ++ grub_efi_mac_address_t client_mac_address; ++ grub_efi_ipv4_address_t server_address; ++ grub_efi_ipv4_address_t router_address; ++ grub_efi_ipv4_address_t subnet_mask; ++ grub_efi_uint32_t lease_time; ++ grub_efi_dhcp4_packet_t *reply_packet; ++}; ++ ++typedef struct grub_efi_dhcp4_mode_data grub_efi_dhcp4_mode_data_t; ++ ++struct grub_efi_dhcp4_protocol { ++ grub_efi_status_t (*get_mode_data) (grub_efi_dhcp4_protocol_t *this, ++ grub_efi_dhcp4_mode_data_t *dhcp4_mode_data); ++ grub_efi_status_t (*configure) (grub_efi_dhcp4_protocol_t *this, ++ grub_efi_dhcp4_config_data_t *dhcp4_cfg_data); ++ grub_efi_status_t (*start) (grub_efi_dhcp4_protocol_t *this, ++ grub_efi_event_t completion_event); ++ grub_efi_status_t (*renew_rebind) (grub_efi_dhcp4_protocol_t *this, ++ grub_efi_boolean_t rebind_request, ++ grub_efi_event_t completion_event); ++ grub_efi_status_t (*release) (grub_efi_dhcp4_protocol_t *this); ++ grub_efi_status_t (*stop) (grub_efi_dhcp4_protocol_t *this); ++ grub_efi_status_t (*build) (grub_efi_dhcp4_protocol_t *this, ++ grub_efi_dhcp4_packet_t *seed_packet, ++ grub_efi_uint32_t delete_count, ++ grub_efi_uint8_t *delete_list, ++ grub_efi_uint32_t append_count, ++ grub_efi_dhcp4_packet_option_t *append_list[], ++ grub_efi_dhcp4_packet_t **new_packet); ++ grub_efi_status_t (*transmit_receive) (grub_efi_dhcp4_protocol_t *this, ++ grub_efi_dhcp4_transmit_receive_token_t *token); ++ grub_efi_status_t (*parse) (grub_efi_dhcp4_protocol_t *this, ++ grub_efi_dhcp4_packet_t *packet, ++ grub_efi_uint32_t *option_count, ++ grub_efi_dhcp4_packet_option_t *packet_option_list[]); ++}; ++ ++typedef struct grub_efi_dhcp6_protocol grub_efi_dhcp6_protocol_t; ++ ++struct grub_efi_dhcp6_retransmission { ++ grub_efi_uint32_t irt; ++ grub_efi_uint32_t mrc; ++ grub_efi_uint32_t mrt; ++ grub_efi_uint32_t mrd; ++}; ++ ++typedef struct grub_efi_dhcp6_retransmission grub_efi_dhcp6_retransmission_t; ++ ++enum grub_efi_dhcp6_event { ++ GRUB_EFI_DHCP6_SEND_SOLICIT, ++ GRUB_EFI_DHCP6_RCVD_ADVERTISE, ++ GRUB_EFI_DHCP6_SELECT_ADVERTISE, ++ GRUB_EFI_DHCP6_SEND_REQUEST, ++ GRUB_EFI_DHCP6_RCVD_REPLY, ++ GRUB_EFI_DHCP6_RCVD_RECONFIGURE, ++ GRUB_EFI_DHCP6_SEND_DECLINE, ++ GRUB_EFI_DHCP6_SEND_CONFIRM, ++ GRUB_EFI_DHCP6_SEND_RELEASE, ++ GRUB_EFI_DHCP6_SEND_RENEW, ++ GRUB_EFI_DHCP6_SEND_REBIND ++}; ++ ++typedef enum grub_efi_dhcp6_event grub_efi_dhcp6_event_t; ++ ++struct grub_efi_dhcp6_packet_option { ++ grub_efi_uint16_t op_code; ++ grub_efi_uint16_t op_len; ++ grub_efi_uint8_t data[1]; ++} GRUB_PACKED; ++ ++typedef struct grub_efi_dhcp6_packet_option grub_efi_dhcp6_packet_option_t; ++ ++struct grub_efi_dhcp6_header { ++ grub_efi_uint32_t transaction_id:24; ++ grub_efi_uint32_t message_type:8; ++} GRUB_PACKED; ++ ++typedef struct grub_efi_dhcp6_header grub_efi_dhcp6_header_t; ++ ++struct grub_efi_dhcp6_packet { ++ grub_efi_uint32_t size; ++ grub_efi_uint32_t length; ++ struct { ++ grub_efi_dhcp6_header_t header; ++ grub_efi_uint8_t option[1]; ++ } dhcp6; ++} GRUB_PACKED; ++ ++typedef struct grub_efi_dhcp6_packet grub_efi_dhcp6_packet_t; ++ ++struct grub_efi_dhcp6_ia_address { ++ grub_efi_ipv6_address_t ip_address; ++ grub_efi_uint32_t preferred_lifetime; ++ grub_efi_uint32_t valid_lifetime; ++}; ++ ++typedef struct grub_efi_dhcp6_ia_address grub_efi_dhcp6_ia_address_t; ++ ++enum grub_efi_dhcp6_state { ++ GRUB_EFI_DHCP6_INIT, ++ GRUB_EFI_DHCP6_SELECTING, ++ GRUB_EFI_DHCP6_REQUESTING, ++ GRUB_EFI_DHCP6_DECLINING, ++ GRUB_EFI_DHCP6_CONFIRMING, ++ GRUB_EFI_DHCP6_RELEASING, ++ GRUB_EFI_DHCP6_BOUND, ++ GRUB_EFI_DHCP6_RENEWING, ++ GRUB_EFI_DHCP6_REBINDING ++}; ++ ++typedef enum grub_efi_dhcp6_state grub_efi_dhcp6_state_t; ++ ++#define GRUB_EFI_DHCP6_IA_TYPE_NA 3 ++#define GRUB_EFI_DHCP6_IA_TYPE_TA 4 ++ ++struct grub_efi_dhcp6_ia_descriptor { ++ grub_efi_uint16_t type; ++ grub_efi_uint32_t ia_id; ++}; ++ ++typedef struct grub_efi_dhcp6_ia_descriptor grub_efi_dhcp6_ia_descriptor_t; ++ ++struct grub_efi_dhcp6_ia { ++ grub_efi_dhcp6_ia_descriptor_t descriptor; ++ grub_efi_dhcp6_state_t state; ++ grub_efi_dhcp6_packet_t *reply_packet; ++ grub_efi_uint32_t ia_address_count; ++ grub_efi_dhcp6_ia_address_t ia_address[1]; ++}; ++ ++typedef struct grub_efi_dhcp6_ia grub_efi_dhcp6_ia_t; ++ ++struct grub_efi_dhcp6_duid { ++ grub_efi_uint16_t length; ++ grub_efi_uint8_t duid[1]; ++}; ++ ++typedef struct grub_efi_dhcp6_duid grub_efi_dhcp6_duid_t; ++ ++struct grub_efi_dhcp6_mode_data { ++ grub_efi_dhcp6_duid_t *client_id; ++ grub_efi_dhcp6_ia_t *ia; ++}; ++ ++typedef struct grub_efi_dhcp6_mode_data grub_efi_dhcp6_mode_data_t; ++ ++struct grub_efi_dhcp6_config_data { ++ grub_efi_status_t (*dhcp6_callback) (grub_efi_dhcp6_protocol_t this, ++ void *context, ++ grub_efi_dhcp6_state_t current_state, ++ grub_efi_dhcp6_event_t dhcp6_event, ++ grub_efi_dhcp6_packet_t *packet, ++ grub_efi_dhcp6_packet_t **new_packet); ++ void *callback_context; ++ grub_efi_uint32_t option_count; ++ grub_efi_dhcp6_packet_option_t **option_list; ++ grub_efi_dhcp6_ia_descriptor_t ia_descriptor; ++ grub_efi_event_t ia_info_event; ++ grub_efi_boolean_t reconfigure_accept; ++ grub_efi_boolean_t rapid_commit; ++ grub_efi_dhcp6_retransmission_t *solicit_retransmission; ++}; ++ ++typedef struct grub_efi_dhcp6_config_data grub_efi_dhcp6_config_data_t; ++ ++struct grub_efi_dhcp6_protocol { ++ grub_efi_status_t (*get_mode_data) (grub_efi_dhcp6_protocol_t *this, ++ grub_efi_dhcp6_mode_data_t *dhcp6_mode_data, ++ grub_efi_dhcp6_config_data_t *dhcp6_config_data); ++ grub_efi_status_t (*configure) (grub_efi_dhcp6_protocol_t *this, ++ grub_efi_dhcp6_config_data_t *dhcp6_cfg_data); ++ grub_efi_status_t (*start) (grub_efi_dhcp6_protocol_t *this); ++ grub_efi_status_t (*info_request) (grub_efi_dhcp6_protocol_t *this, ++ grub_efi_boolean_t send_client_id, ++ grub_efi_dhcp6_packet_option_t *option_request, ++ grub_efi_uint32_t option_count, ++ grub_efi_dhcp6_packet_option_t *option_list[], ++ grub_efi_dhcp6_retransmission_t *retransmission, ++ grub_efi_event_t timeout_event, ++ grub_efi_status_t (*reply_callback) (grub_efi_dhcp6_protocol_t *this, ++ void *context, ++ grub_efi_dhcp6_packet_t *packet), ++ void *callback_context); ++ grub_efi_status_t (*renew_rebind) (grub_efi_dhcp6_protocol_t *this, ++ grub_efi_boolean_t rebind_request); ++ grub_efi_status_t (*decline) (grub_efi_dhcp6_protocol_t *this, ++ grub_efi_uint32_t address_count, ++ grub_efi_ipv6_address_t *addresses); ++ grub_efi_status_t (*release) (grub_efi_dhcp6_protocol_t *this, ++ grub_efi_uint32_t address_count, ++ grub_efi_ipv6_address_t *addresses); ++ grub_efi_status_t (*stop) (grub_efi_dhcp6_protocol_t *this); ++ grub_efi_status_t (*parse) (grub_efi_dhcp6_protocol_t *this, ++ grub_efi_dhcp6_packet_t *packet, ++ grub_efi_uint32_t *option_count, ++ grub_efi_dhcp6_packet_option_t *packet_option_list[]); ++}; ++ ++#endif /* ! GRUB_EFI_DHCP_HEADER */ +Index: grub-2.02/include/grub/efi/http.h +=================================================================== +--- /dev/null ++++ grub-2.02/include/grub/efi/http.h +@@ -0,0 +1,215 @@ ++/* ++ * GRUB -- GRand Unified Bootloader ++ * Copyright (C) 2006,2007,2008 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 . ++ */ ++ ++#ifndef GRUB_EFI_HTTP_HEADER ++#define GRUB_EFI_HTTP_HEADER 1 ++ ++#include ++#include ++#include ++ ++#define GRUB_EFI_HTTP_SERVICE_BINDING_PROTOCOL_GUID \ ++ { 0xbdc8e6af, 0xd9bc, 0x4379, \ ++ { 0xa7, 0x2a, 0xe0, 0xc4, 0xe7, 0x5d, 0xae, 0x1c } \ ++ } ++ ++#define GRUB_EFI_HTTP_PROTOCOL_GUID \ ++ { 0x7A59B29B, 0x910B, 0x4171, \ ++ { 0x82, 0x42, 0xA8, 0x5A, 0x0D, 0xF2, 0x5B, 0x5B } \ ++ } ++ ++#define EFIHTTP_WAIT_TIME 10000 // 10000ms = 10s ++#define EFIHTTP_RX_BUF_LEN 10240 ++ ++//****************************************** ++// Protocol Interface Structure ++//****************************************** ++struct grub_efi_http; ++ ++//****************************************** ++// EFI_HTTP_VERSION ++//****************************************** ++typedef enum { ++ GRUB_EFI_HTTPVERSION10, ++ GRUB_EFI_HTTPVERSION11, ++ GRUB_EFI_HTTPVERSIONUNSUPPORTED ++} grub_efi_http_version_t; ++ ++//****************************************** ++// EFI_HTTPv4_ACCESS_POINT ++//****************************************** ++typedef struct { ++ grub_efi_boolean_t use_default_address; ++ grub_efi_ipv4_address_t local_address; ++ grub_efi_ipv4_address_t local_subnet; ++ grub_efi_uint16_t local_port; ++} grub_efi_httpv4_access_point_t; ++ ++//****************************************** ++// EFI_HTTPv6_ACCESS_POINT ++//****************************************** ++typedef struct { ++ grub_efi_ipv6_address_t local_address; ++ grub_efi_uint16_t local_port; ++} grub_efi_httpv6_access_point_t; ++ ++//****************************************** ++// EFI_HTTP_CONFIG_DATA ++//****************************************** ++typedef struct { ++ grub_efi_http_version_t http_version; ++ grub_efi_uint32_t timeout_millisec; ++ grub_efi_boolean_t local_address_is_ipv6; ++ union { ++ grub_efi_httpv4_access_point_t *ipv4_node; ++ grub_efi_httpv6_access_point_t *ipv6_node; ++ } access_point; ++} grub_efi_http_config_data_t; ++ ++//****************************************** ++// EFI_HTTP_METHOD ++//****************************************** ++typedef enum { ++ GRUB_EFI_HTTPMETHODGET, ++ GRUB_EFI_HTTPMETHODPOST, ++ GRUB_EFI_HTTPMETHODPATCH, ++ GRUB_EFI_HTTPMETHODOPTIONS, ++ GRUB_EFI_HTTPMETHODCONNECT, ++ GRUB_EFI_HTTPMETHODHEAD, ++ GRUB_EFI_HTTPMETHODPUT, ++ GRUB_EFI_HTTPMETHODDELETE, ++ GRUB_EFI_HTTPMETHODTRACE, ++} grub_efi_http_method_t; ++ ++//****************************************** ++// EFI_HTTP_REQUEST_DATA ++//****************************************** ++typedef struct { ++ grub_efi_http_method_t method; ++ grub_efi_char16_t *url; ++} grub_efi_http_request_data_t; ++ ++typedef enum { ++ GRUB_EFI_HTTP_STATUS_UNSUPPORTED_STATUS = 0, ++ GRUB_EFI_HTTP_STATUS_100_CONTINUE, ++ GRUB_EFI_HTTP_STATUS_101_SWITCHING_PROTOCOLS, ++ GRUB_EFI_HTTP_STATUS_200_OK, ++ GRUB_EFI_HTTP_STATUS_201_CREATED, ++ GRUB_EFI_HTTP_STATUS_202_ACCEPTED, ++ GRUB_EFI_HTTP_STATUS_203_NON_AUTHORITATIVE_INFORMATION, ++ GRUB_EFI_HTTP_STATUS_204_NO_CONTENT, ++ GRUB_EFI_HTTP_STATUS_205_RESET_CONTENT, ++ GRUB_EFI_HTTP_STATUS_206_PARTIAL_CONTENT, ++ GRUB_EFI_HTTP_STATUS_300_MULTIPLE_CHIOCES, ++ GRUB_EFI_HTTP_STATUS_301_MOVED_PERMANENTLY, ++ GRUB_EFI_HTTP_STATUS_302_FOUND, ++ GRUB_EFI_HTTP_STATUS_303_SEE_OTHER, ++ GRUB_EFI_HTTP_STATUS_304_NOT_MODIFIED, ++ GRUB_EFI_HTTP_STATUS_305_USE_PROXY, ++ GRUB_EFI_HTTP_STATUS_307_TEMPORARY_REDIRECT, ++ GRUB_EFI_HTTP_STATUS_400_BAD_REQUEST, ++ GRUB_EFI_HTTP_STATUS_401_UNAUTHORIZED, ++ GRUB_EFI_HTTP_STATUS_402_PAYMENT_REQUIRED, ++ GRUB_EFI_HTTP_STATUS_403_FORBIDDEN, ++ GRUB_EFI_HTTP_STATUS_404_NOT_FOUND, ++ GRUB_EFI_HTTP_STATUS_405_METHOD_NOT_ALLOWED, ++ GRUB_EFI_HTTP_STATUS_406_NOT_ACCEPTABLE, ++ GRUB_EFI_HTTP_STATUS_407_PROXY_AUTHENTICATION_REQUIRED, ++ GRUB_EFI_HTTP_STATUS_408_REQUEST_TIME_OUT, ++ GRUB_EFI_HTTP_STATUS_409_CONFLICT, ++ GRUB_EFI_HTTP_STATUS_410_GONE, ++ GRUB_EFI_HTTP_STATUS_411_LENGTH_REQUIRED, ++ GRUB_EFI_HTTP_STATUS_412_PRECONDITION_FAILED, ++ GRUB_EFI_HTTP_STATUS_413_REQUEST_ENTITY_TOO_LARGE, ++ GRUB_EFI_HTTP_STATUS_414_REQUEST_URI_TOO_LARGE, ++ GRUB_EFI_HTTP_STATUS_415_UNSUPPORTED_MEDIA_TYPE, ++ GRUB_EFI_HTTP_STATUS_416_REQUESTED_RANGE_NOT_SATISFIED, ++ GRUB_EFI_HTTP_STATUS_417_EXPECTATION_FAILED, ++ GRUB_EFI_HTTP_STATUS_500_INTERNAL_SERVER_ERROR, ++ GRUB_EFI_HTTP_STATUS_501_NOT_IMPLEMENTED, ++ GRUB_EFI_HTTP_STATUS_502_BAD_GATEWAY, ++ GRUB_EFI_HTTP_STATUS_503_SERVICE_UNAVAILABLE, ++ GRUB_EFI_HTTP_STATUS_504_GATEWAY_TIME_OUT, ++ GRUB_EFI_HTTP_STATUS_505_HTTP_VERSION_NOT_SUPPORTED ++} grub_efi_http_status_code_t; ++ ++//****************************************** ++// EFI_HTTP_RESPONSE_DATA ++//****************************************** ++typedef struct { ++ grub_efi_http_status_code_t status_code; ++} grub_efi_http_response_data_t; ++ ++//****************************************** ++// EFI_HTTP_HEADER ++//****************************************** ++typedef struct { ++ grub_efi_char8_t *field_name; ++ grub_efi_char8_t *field_value; ++} grub_efi_http_header_t; ++ ++//****************************************** ++// EFI_HTTP_MESSAGE ++//****************************************** ++typedef struct { ++ union { ++ grub_efi_http_request_data_t *request; ++ grub_efi_http_response_data_t *response; ++ } data; ++ grub_efi_uint32_t header_count; ++ grub_efi_http_header_t *headers; ++ grub_efi_uint32_t body_length; ++ void *body; ++} grub_efi_http_message_t; ++ ++//****************************************** ++// EFI_HTTP_TOKEN ++//****************************************** ++typedef struct { ++ grub_efi_event_t event; ++ grub_efi_status_t status; ++ grub_efi_http_message_t *message; ++} grub_efi_http_token_t; ++ ++struct grub_efi_http { ++ grub_efi_status_t ++ (*get_mode_data) (struct grub_efi_http *this, ++ grub_efi_http_config_data_t *http_config_data); ++ ++ grub_efi_status_t ++ (*configure) (struct grub_efi_http *this, ++ grub_efi_http_config_data_t *http_config_data); ++ ++ grub_efi_status_t ++ (*request) (struct grub_efi_http *this, ++ grub_efi_http_token_t *token); ++ ++ grub_efi_status_t ++ (*cancel) (struct grub_efi_http *this, ++ grub_efi_http_token_t *token); ++ ++ grub_efi_status_t ++ (*response) (struct grub_efi_http *this, ++ grub_efi_http_token_t *token); ++ ++ grub_efi_status_t ++ (*poll) (struct grub_efi_http *this); ++}; ++typedef struct grub_efi_http grub_efi_http_t; ++ ++#endif /* !GRUB_EFI_HTTP_HEADER */ +Index: grub-2.02/include/grub/net/efi.h +=================================================================== +--- /dev/null ++++ grub-2.02/include/grub/net/efi.h +@@ -0,0 +1,143 @@ ++#ifndef GRUB_NET_EFI_HEADER ++#define GRUB_NET_EFI_HEADER 1 ++ ++#include ++#include ++#include ++#include ++ ++typedef struct grub_efi_net_interface grub_efi_net_interface_t; ++typedef struct grub_efi_net_ip_config grub_efi_net_ip_config_t; ++typedef union grub_efi_net_ip_address grub_efi_net_ip_address_t; ++typedef struct grub_efi_net_ip_manual_address grub_efi_net_ip_manual_address_t; ++ ++struct grub_efi_net_interface ++{ ++ char *name; ++ int prefer_ip6; ++ struct grub_efi_net_device *dev; ++ struct grub_efi_net_io *io; ++ grub_efi_net_ip_config_t *ip_config; ++ int io_type; ++ struct grub_efi_net_interface *next; ++}; ++ ++#define efi_net_interface_get_hw_address(inf) inf->ip_config->get_hw_address (inf->dev) ++#define efi_net_interface_get_address(inf) inf->ip_config->get_address (inf->dev) ++#define efi_net_interface_get_route_table(inf) inf->ip_config->get_route_table (inf->dev) ++#define efi_net_interface_set_address(inf, addr, with_subnet) inf->ip_config->set_address (inf->dev, addr, with_subnet) ++#define efi_net_interface_set_gateway(inf, addr) inf->ip_config->set_gateway (inf->dev, addr) ++#define efi_net_interface_set_dns(inf, addr) inf->ip_config->set_dns (inf->dev, addr) ++ ++struct grub_efi_net_ip_config ++{ ++ char * (*get_hw_address) (struct grub_efi_net_device *dev); ++ char * (*get_address) (struct grub_efi_net_device *dev); ++ char ** (*get_route_table) (struct grub_efi_net_device *dev); ++ grub_efi_net_interface_t * (*best_interface) (struct grub_efi_net_device *dev, grub_efi_net_ip_address_t *address); ++ int (*set_address) (struct grub_efi_net_device *dev, grub_efi_net_ip_manual_address_t *net_ip, int with_subnet); ++ int (*set_gateway) (struct grub_efi_net_device *dev, grub_efi_net_ip_address_t *address); ++ int (*set_dns) (struct grub_efi_net_device *dev, grub_efi_net_ip_address_t *dns); ++}; ++ ++union grub_efi_net_ip_address ++{ ++ grub_efi_ipv4_address_t ip4; ++ grub_efi_ipv6_address_t ip6; ++}; ++ ++struct grub_efi_net_ip_manual_address ++{ ++ int is_ip6; ++ union ++ { ++ grub_efi_ip4_config2_manual_address_t ip4; ++ grub_efi_ip6_config_manual_address_t ip6; ++ }; ++}; ++ ++struct grub_efi_net_device ++{ ++ grub_efi_handle_t handle; ++ grub_efi_ip4_config2_protocol_t *ip4_config; ++ grub_efi_ip6_config_protocol_t *ip6_config; ++ grub_efi_handle_t http_handle; ++ grub_efi_http_t *http; ++ grub_efi_handle_t ip4_pxe_handle; ++ grub_efi_pxe_t *ip4_pxe; ++ grub_efi_handle_t ip6_pxe_handle; ++ grub_efi_pxe_t *ip6_pxe; ++ grub_efi_handle_t dhcp4_handle; ++ grub_efi_dhcp4_protocol_t *dhcp4; ++ grub_efi_handle_t dhcp6_handle; ++ grub_efi_dhcp6_protocol_t *dhcp6; ++ char *card_name; ++ grub_efi_net_interface_t *net_interfaces; ++ struct grub_efi_net_device *next; ++}; ++ ++struct grub_efi_net_io ++{ ++ void (*configure) (struct grub_efi_net_device *dev, int prefer_ip6); ++ grub_err_t (*open) (struct grub_efi_net_device *dev, ++ int prefer_ip6, ++ grub_file_t file, ++ const char *filename, ++ int type); ++ grub_ssize_t (*read) (struct grub_efi_net_device *dev, ++ int prefer_ip6, ++ grub_file_t file, ++ char *buf, ++ grub_size_t len); ++ grub_err_t (*close) (struct grub_efi_net_device *dev, ++ int prefer_ip6, ++ grub_file_t file); ++}; ++ ++extern struct grub_efi_net_device *net_devices; ++ ++extern struct grub_efi_net_io io_http; ++extern struct grub_efi_net_io io_pxe; ++ ++extern grub_efi_net_ip_config_t *efi_net_ip4_config; ++extern grub_efi_net_ip_config_t *efi_net_ip6_config; ++ ++char * ++grub_efi_ip4_address_to_string (grub_efi_ipv4_address_t *address); ++ ++char * ++grub_efi_ip6_address_to_string (grub_efi_pxe_ipv6_address_t *address); ++ ++char * ++grub_efi_hw_address_to_string (grub_efi_uint32_t hw_address_size, grub_efi_mac_address_t hw_address); ++ ++int ++grub_efi_string_to_ip4_address (const char *val, grub_efi_ipv4_address_t *address, const char **rest); ++ ++int ++grub_efi_string_to_ip6_address (const char *val, grub_efi_ipv6_address_t *address, const char **rest); ++ ++char * ++grub_efi_ip6_interface_name (struct grub_efi_net_device *dev); ++ ++char * ++grub_efi_ip4_interface_name (struct grub_efi_net_device *dev); ++ ++grub_efi_net_interface_t * ++grub_efi_net_create_interface (struct grub_efi_net_device *dev, ++ const char *interface_name, ++ grub_efi_net_ip_manual_address_t *net_ip, ++ int has_subnet); ++ ++int grub_efi_net_fs_init (void); ++void grub_efi_net_fs_fini (void); ++int grub_efi_net_boot_from_https (void); ++ ++extern grub_command_func_t grub_efi_net_list_routes; ++extern grub_command_func_t grub_efi_net_list_cards; ++extern grub_command_func_t grub_efi_net_list_addrs; ++extern grub_command_func_t grub_efi_net_add_addr; ++extern grub_command_func_t grub_efi_net_bootp; ++extern grub_command_func_t grub_efi_net_bootp6; ++ ++#endif /* ! GRUB_NET_EFI_HEADER */ +Index: grub-2.02/util/grub-mknetdir.c +=================================================================== +--- grub-2.02.orig/util/grub-mknetdir.c ++++ grub-2.02/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 + 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 + } + } + +- + 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 + 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) + { diff --git a/grub2-s390x-04-grub2-install.patch b/grub2-s390x-04-grub2-install.patch index 80408fa..857fe90 100644 --- a/grub2-s390x-04-grub2-install.patch +++ b/grub2-s390x-04-grub2-install.patch @@ -45,6 +45,8 @@ V15: * zipl2grub.conf: turn of zipl-prompt and quiescent plymouth. [bsc#898198] V16: * dracut-grub2.sh: force read-only '/usr' for kexec. [bsc#932951] +V17: + * grub2-zipl-setup: remove arybase dependency by not referencing $[. [bsc#1055280] --- Makefile.util.def | 39 +++ @@ -62,10 +64,10 @@ V16: util/s390x/zipl2grub.pl.in | 424 +++++++++++++++++++++++++++++++++++ 13 files changed, 702 insertions(+), 4 deletions(-) -Index: grub-2.02~rc1/Makefile.util.def +Index: grub-2.02/Makefile.util.def =================================================================== ---- grub-2.02~rc1.orig/Makefile.util.def -+++ grub-2.02~rc1/Makefile.util.def +--- grub-2.02.orig/Makefile.util.def ++++ grub-2.02/Makefile.util.def @@ -352,6 +352,7 @@ program = { ldadd = grub-core/gnulib/libgnu.a; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; @@ -153,10 +155,10 @@ Index: grub-2.02~rc1/Makefile.util.def }; program = { -Index: grub-2.02~rc1/configure.ac +Index: grub-2.02/configure.ac =================================================================== ---- grub-2.02~rc1.orig/configure.ac -+++ grub-2.02~rc1/configure.ac +--- grub-2.02.orig/configure.ac ++++ grub-2.02/configure.ac @@ -181,9 +181,9 @@ if test x$platform != xemu ; then esac fi @@ -180,10 +182,10 @@ Index: grub-2.02~rc1/configure.ac AM_CONDITIONAL([COND_HOST_HURD], [test x$host_kernel = xhurd]) AM_CONDITIONAL([COND_HOST_LINUX], [test x$host_kernel = xlinux]) -Index: grub-2.02~rc1/grub-core/Makefile.core.def +Index: grub-2.02/grub-core/Makefile.core.def =================================================================== ---- grub-2.02~rc1.orig/grub-core/Makefile.core.def -+++ grub-2.02~rc1/grub-core/Makefile.core.def +--- grub-2.02.orig/grub-core/Makefile.core.def ++++ grub-2.02/grub-core/Makefile.core.def @@ -1057,6 +1057,7 @@ module = { module = { name = videotest; @@ -238,10 +240,10 @@ Index: grub-2.02~rc1/grub-core/Makefile.core.def }; module = { -Index: grub-2.02~rc1/grub-core/osdep/basic/no_platform.c +Index: grub-2.02/grub-core/osdep/basic/no_platform.c =================================================================== ---- grub-2.02~rc1.orig/grub-core/osdep/basic/no_platform.c -+++ grub-2.02~rc1/grub-core/osdep/basic/no_platform.c +--- grub-2.02.orig/grub-core/osdep/basic/no_platform.c ++++ grub-2.02/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")); @@ -253,10 +255,10 @@ Index: grub-2.02~rc1/grub-core/osdep/basic/no_platform.c + grub_util_error ("%s", _("no zIPL routines are available for your platform")); +} + -Index: grub-2.02~rc1/grub-core/osdep/unix/platform.c +Index: grub-2.02/grub-core/osdep/unix/platform.c =================================================================== ---- grub-2.02~rc1.orig/grub-core/osdep/unix/platform.c -+++ grub-2.02~rc1/grub-core/osdep/unix/platform.c +--- grub-2.02.orig/grub-core/osdep/unix/platform.c ++++ grub-2.02/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.")); @@ -272,10 +274,10 @@ Index: grub-2.02~rc1/grub-core/osdep/unix/platform.c + "-z", dest, NULL })) + grub_util_error (_("`%s' failed.\n"), PACKAGE"-zipl-setup"); +} -Index: grub-2.02~rc1/grub-core/osdep/windows/platform.c +Index: grub-2.02/grub-core/osdep/windows/platform.c =================================================================== ---- grub-2.02~rc1.orig/grub-core/osdep/windows/platform.c -+++ grub-2.02~rc1/grub-core/osdep/windows/platform.c +--- grub-2.02.orig/grub-core/osdep/windows/platform.c ++++ grub-2.02/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")); @@ -286,10 +288,10 @@ Index: grub-2.02~rc1/grub-core/osdep/windows/platform.c +{ + grub_util_error ("%s", _("no zIPL routines are available for your platform")); +} -Index: grub-2.02~rc1/include/grub/util/install.h +Index: grub-2.02/include/grub/util/install.h =================================================================== ---- grub-2.02~rc1.orig/include/grub/util/install.h -+++ grub-2.02~rc1/include/grub/util/install.h +--- grub-2.02.orig/include/grub/util/install.h ++++ grub-2.02/include/grub/util/install.h @@ -99,6 +99,7 @@ enum grub_install_plat GRUB_INSTALL_PLATFORM_I386_XEN, GRUB_INSTALL_PLATFORM_X86_64_XEN, @@ -308,10 +310,10 @@ Index: grub-2.02~rc1/include/grub/util/install.h int grub_install_compress_gzip (const char *src, const char *dest); int -Index: grub-2.02~rc1/util/grub-install-common.c +Index: grub-2.02/util/grub-install-common.c =================================================================== ---- grub-2.02~rc1.orig/util/grub-install-common.c -+++ grub-2.02~rc1/util/grub-install-common.c +--- grub-2.02.orig/util/grub-install-common.c ++++ grub-2.02/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" }, @@ -320,10 +322,10 @@ Index: grub-2.02~rc1/util/grub-install-common.c }; char * -Index: grub-2.02~rc1/util/grub-install.c +Index: grub-2.02/util/grub-install.c =================================================================== ---- grub-2.02~rc1.orig/util/grub-install.c -+++ grub-2.02~rc1/util/grub-install.c +--- grub-2.02.orig/util/grub-install.c ++++ grub-2.02/util/grub-install.c @@ -66,6 +66,7 @@ static int force_file_id = 0; static char *disk_module = NULL; static char *efidir = NULL; @@ -454,7 +456,7 @@ Index: grub-2.02~rc1/util/grub-install.c case GRUB_INSTALL_PLATFORM_ARM_EFI: case GRUB_INSTALL_PLATFORM_ARM64_EFI: case GRUB_INSTALL_PLATFORM_IA64_EFI: -@@ -1884,6 +1923,10 @@ main (int argc, char *argv[]) +@@ -1885,6 +1924,10 @@ main (int argc, char *argv[]) } break; @@ -465,10 +467,10 @@ Index: grub-2.02~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.02~rc1/util/s390x/dracut-grub2.sh.in +Index: grub-2.02/util/s390x/dracut-grub2.sh.in =================================================================== --- /dev/null -+++ grub-2.02~rc1/util/s390x/dracut-grub2.sh.in ++++ grub-2.02/util/s390x/dracut-grub2.sh.in @@ -0,0 +1,110 @@ +#!/bin/sh +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- @@ -580,10 +582,10 @@ Index: grub-2.02~rc1/util/s390x/dracut-grub2.sh.in + fi +fi + -Index: grub-2.02~rc1/util/s390x/dracut-module-setup.sh.in +Index: grub-2.02/util/s390x/dracut-module-setup.sh.in =================================================================== --- /dev/null -+++ grub-2.02~rc1/util/s390x/dracut-module-setup.sh.in ++++ grub-2.02/util/s390x/dracut-module-setup.sh.in @@ -0,0 +1,19 @@ +#!/bin/bash +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- @@ -604,10 +606,10 @@ Index: grub-2.02~rc1/util/s390x/dracut-module-setup.sh.in + #inst_multiple grub2-emu kexec +} + -Index: grub-2.02~rc1/util/s390x/zipl2grub.conf.in +Index: grub-2.02/util/s390x/zipl2grub.conf.in =================================================================== --- /dev/null -+++ grub-2.02~rc1/util/s390x/zipl2grub.conf.in ++++ grub-2.02/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. @@ -635,11 +637,11 @@ Index: grub-2.02~rc1/util/s390x/zipl2grub.conf.in + 1 = grub2 + 2 = skip-grub2 + -Index: grub-2.02~rc1/util/s390x/zipl2grub.pl.in +Index: grub-2.02/util/s390x/zipl2grub.pl.in =================================================================== --- /dev/null -+++ grub-2.02~rc1/util/s390x/zipl2grub.pl.in -@@ -0,0 +1,424 @@ ++++ grub-2.02/util/s390x/zipl2grub.pl.in +@@ -0,0 +1,423 @@ +#!/usr/bin/perl +use strict; + @@ -812,7 +814,6 @@ Index: grub-2.02~rc1/util/s390x/zipl2grub.pl.in + Panic( $_[0], $msg . "\n"); +} + -+die if ($[ != 0); +while ( $#ARGV >= 0 ) { + $_ = shift; + next if /^$/; diff --git a/grub2.changes b/grub2.changes index 04b8aa4..39c081f 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,16 @@ +------------------------------------------------------------------- +Sun Sep 3 12:12:21 UTC 2017 - mchang@suse.com + +- Add preliminary patch for UEFI HTTPS and related network protocol support + (fate#320130) + * 0001-add-support-for-UEFI-network-protocols.patch + +------------------------------------------------------------------- +Sun Sep 3 11:41:42 UTC 2017 - mchang@suse.com + +- grub2-s390x-04-grub2-install.patch : remove arybase dependency in + grub2-zipl-setup by not referencing to $[ (bsc#1055280) + ------------------------------------------------------------------- Wed Aug 23 17:52:32 UTC 2017 - rw@suse.com diff --git a/grub2.spec b/grub2.spec index bd046d0..ffad106 100644 --- a/grub2.spec +++ b/grub2.spec @@ -267,6 +267,8 @@ 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 +# UEFI HTTP and related network protocol support (FATE#320130) +Patch420: 0001-add-support-for-UEFI-network-protocols.patch Requires: gettext-runtime %if 0%{?suse_version} >= 1140 @@ -526,6 +528,7 @@ swap partition while in resuming %patch409 -p1 %patch410 -p1 %patch411 -p1 +%patch420 -p1 # patches above may update the timestamp of grub.texi # and via build-aux/mdate-sh they end up in grub2.info, breaking build-compare [ -z "$SOURCE_DATE_EPOCH" ] ||\ From 337c60c3482cf082534d28f39960a30ed065e5c1db61a82080874555a993dc7c Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Fri, 15 Sep 2017 19:02:22 +0000 Subject: [PATCH 14/57] Accepting request 523219 from Base:System 1 OBS-URL: https://build.opensuse.org/request/show/523219 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=168 --- grub2-efi-Free-malloc-regions-on-exit.patch | 184 ++++++++++++++----- grub2-efi-Move-grub_reboot-into-kernel.patch | 122 ++++++++++++ grub2.changes | 7 + grub2.spec | 6 +- 4 files changed, 274 insertions(+), 45 deletions(-) create mode 100644 grub2-efi-Move-grub_reboot-into-kernel.patch diff --git a/grub2-efi-Free-malloc-regions-on-exit.patch b/grub2-efi-Free-malloc-regions-on-exit.patch index 30f0afa..c0dc400 100644 --- a/grub2-efi-Free-malloc-regions-on-exit.patch +++ b/grub2-efi-Free-malloc-regions-on-exit.patch @@ -1,7 +1,6 @@ -From 0c5fbc745846a53cc04ac1052cfbd35c699394c5 Mon Sep 17 00:00:00 2001 +From 33298c813c36a50ccc881c33c9b6eacfb830c21a Mon Sep 17 00:00:00 2001 From: Alexander Graf -Date: Thu, 19 May 2016 15:01:06 +0200 -Subject: [PATCH] efi: Free malloc regions on exit +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 @@ -9,76 +8,172 @@ to descend the boot order using "exit" entries, such as PXE -> HD boot scenarios. Signed-off-by: Alexander Graf + +--- + +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 | 24 ++++++++++++++++++++++++ + grub-core/kern/efi/mm.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++ include/grub/efi/efi.h | 1 + - 3 files changed, 26 insertions(+) + 3 files changed, 81 insertions(+) -Index: grub-2.02~beta3/grub-core/kern/efi/init.c -=================================================================== ---- grub-2.02~beta3.orig/grub-core/kern/efi/init.c -+++ grub-2.02~beta3/grub-core/kern/efi/init.c -@@ -167,4 +167,5 @@ grub_efi_fini (void) +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 (); } -Index: grub-2.02~beta3/grub-core/kern/efi/mm.c -=================================================================== ---- grub-2.02~beta3.orig/grub-core/kern/efi/mm.c -+++ grub-2.02~beta3/grub-core/kern/efi/mm.c -@@ -49,6 +49,12 @@ static grub_efi_uintn_t finish_desc_size +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_uint64_t start_addr; -+ grub_uint64_t pages; -+} efi_allocated_memory[16]; -+unsigned int efi_allocated_memory_idx = 0; ++ 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, -@@ -440,6 +446,13 @@ add_memory_regions (grub_efi_memory_desc - (void *) ((grub_addr_t) start), - (unsigned) pages); +@@ -79,6 +142,7 @@ grub_efi_allocate_pages_real (grub_efi_physical_address_t address, + return 0; + } -+ /* Track up to 16 regions that we allocate from */ -+ if (efi_allocated_memory_idx < ARRAY_SIZE(efi_allocated_memory)) { -+ efi_allocated_memory[efi_allocated_memory_idx].start_addr = start; -+ efi_allocated_memory[efi_allocated_memory_idx].pages = pages; -+ efi_allocated_memory_idx++; -+ } -+ - grub_mm_init_region (addr, PAGES_TO_BYTES (pages)); ++ grub_efi_store_alloc (address, pages); + return (void *) ((grub_addr_t) address); + } - required_pages -= pages; -@@ -451,6 +464,17 @@ add_memory_regions (grub_efi_memory_desc +@@ -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) +{ -+ unsigned int i; -+ -+ for (i = 0; i < efi_allocated_memory_idx; i++) { -+ grub_efi_free_pages (efi_allocated_memory[i].start_addr, -+ efi_allocated_memory[i].pages); -+ } ++ /* ++ * 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 -Index: grub-2.02~beta3/include/grub/efi/efi.h -=================================================================== ---- grub-2.02~beta3.orig/include/grub/efi/efi.h -+++ grub-2.02~beta3/include/grub/efi/efi.h -@@ -51,6 +51,7 @@ EXPORT_FUNC(grub_efi_get_memory_map) (gr +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); @@ -86,3 +181,6 @@ Index: grub-2.02~beta3/include/grub/efi/efi.h 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 + diff --git a/grub2-efi-Move-grub_reboot-into-kernel.patch b/grub2-efi-Move-grub_reboot-into-kernel.patch new file mode 100644 index 0000000..11cb458 --- /dev/null +++ b/grub2-efi-Move-grub_reboot-into-kernel.patch @@ -0,0 +1,122 @@ +From dee74e9bd88aa31e38b1e77dc7845930aa1cd60f Mon Sep 17 00:00:00 2001 +From: Alexander Graf +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 + +--- + +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 . +- */ +- +-#include +-#include +-#include +-#include +-#include +-#include +- +-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 + diff --git a/grub2.changes b/grub2.changes index 39c081f..4a12596 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Fri Sep 8 08:04:41 UTC 2017 - agraf@suse.com + +- Fix reboot in UEFI environments (bsc#1047331) + * Add grub2-efi-Move-grub_reboot-into-kernel.patch + * Refresh grub2-efi-Free-malloc-regions-on-exit.patch + ------------------------------------------------------------------- Sun Sep 3 12:12:21 UTC 2017 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index ffad106..eb6ba2e 100644 --- a/grub2.spec +++ b/grub2.spec @@ -231,7 +231,8 @@ Patch123: grub2-efi-xen-cfg-unquote.patch 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-Free-malloc-regions-on-exit.patch +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 @@ -359,9 +360,9 @@ provides support for %{platform} systems. %package %{grubefiarch} Summary: Bootloader with support for Linux, Multiboot and more -Group: System/Boot # Require efibootmgr # Without it grub-install is broken so break the package as well if unavailable +Group: System/Boot Requires: efibootmgr Requires(post): efibootmgr Requires: %{name} = %{version}-%{release} @@ -498,6 +499,7 @@ swap partition while in resuming %patch140 -p1 %patch141 -p1 %patch150 -p1 +%patch151 -p1 %patch163 -p1 %patch164 -p1 %patch205 -p1 From 3a38b497cbe331122aac4a140091d65f0c0d03f16e87570ff4093ee7fb8406ba Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Thu, 21 Sep 2017 10:29:21 +0000 Subject: [PATCH 15/57] Accepting request 527631 from Base:System 1 OBS-URL: https://build.opensuse.org/request/show/527631 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=169 --- grub2-xen-pv-firmware.cfg | 42 ++++++++++++++++++++++----------------- grub2.changes | 12 +++++++++++ 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/grub2-xen-pv-firmware.cfg b/grub2-xen-pv-firmware.cfg index 1d6c078..7311399 100644 --- a/grub2-xen-pv-firmware.cfg +++ b/grub2-xen-pv-firmware.cfg @@ -36,10 +36,19 @@ if [ "${grub_cpu}" = "x86_64" ]; then fi set suse_cddev="" -search -s suse_cddev_content -f "/content" -search -s suse_cddev_product -f "/media.1/products" -if [ -n "${suse_cddev_content}" -a -n "${suse_cddev_product}" -a "${suse_cddev_content}" = "${suse_cddev_product}" ]; then - set suse_cddev="${suse_cddev_content}" +if [ "${grub_cpu}" = "i386" ]; then + set suse_cdarch="i586" +else + set suse_cdarch="${grub_cpu}" +fi +if [ -n "${suse_cdarch}" ]; then + set suse_kern="/boot/${suse_cdarch}/loader/linux" + set suse_initrd="/boot/${suse_cdarch}/loader/initrd" + search -s suse_cdkern -f "${suse_kern}" + search -s suse_cdinitrd -f "${suse_initrd}" + if [ -n "${suse_cdkern}" -a -n "${suse_cdinitrd}" -a "${suse_cdkern}" = "${suse_cdinitrd}" ]; then + set suse_cddev="${suse_cdkern}" + fi fi set hdcfg_list="\ @@ -115,33 +124,30 @@ if [ -n "${fedora_cddev}" ]; then fi if [ -n "${suse_cddev}" ]; then - if [ "${grub_cpu}" = "i386" ]; then - set suse_cdarch="i586" - else - set suse_cdarch="${grub_cpu}" - fi set timeout=8 set root="${suse_cddev}" set suse_cdcfg="/boot/${suse_cdarch}/grub2-xen/grub.cfg" - set suse_cdkern="/boot/${suse_cdarch}/vmlinuz-xen" - set suse_cdinitrd="/boot/${suse_cdarch}/initrd-xen" + if [ -e "/boot/${suse_cdarch}/vmlinuz-xen" ]; then + set suse_kern="/boot/${suse_cdarch}/vmlinuz-xen" + set suse_initrd="/boot/${suse_cdarch}/initrd-xen" + fi if [ -f "${suse_cdcfg}" ]; then menuentry "${suse_cddev} SUSE Install menu" { set root="${suse_cddev}" configfile "${suse_cdcfg}" } - elif [ -f "${suse_cdkern}" -a -f "$suse_cdinitrd" ]; then + elif [ -f "${suse_kern}" -a -f "$suse_initrd" ]; then menuentry "${suse_cddev} SUSE Install" { - linux "${suse_cdkern}" linemode=1 xencons=hvc0 - initrd "${suse_cdinitrd}" + linux "${suse_kern}" linemode=1 xencons=hvc0 + initrd "${suse_initrd}" } menuentry "${suse_cddev} SUSE Rescue" { - linux "${suse_cdkern}" linemode=1 xencons=hvc0 rescue=1 - initrd "${suse_cdinitrd}" + linux "${suse_kern}" linemode=1 xencons=hvc0 rescue=1 + initrd "${suse_initrd}" } menuentry "${suse_cddev} SUSE Upgrade" { - linux "${suse_cdkern}" linemode=1 xencons=hvc0 upgrade=1 - initrd "${suse_cdinitrd}" + linux "${suse_kern}" linemode=1 xencons=hvc0 upgrade=1 + initrd "${suse_initrd}" } else echo "the device ${suse_cddev} is not xen pv bootable" diff --git a/grub2.changes b/grub2.changes index 4a12596..e350013 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Wed Sep 20 22:17:10 UTC 2017 - mlatimer@suse.com + +- Use /boot//loader/linux to determine if install media + is SUSE instead of /contents file (bsc#1054453) + +------------------------------------------------------------------- +Tue Sep 19 22:52:45 UTC 2017 - mlatimer@suse.com + +- Use the pvops-enabled default kernel if the traditional xen + pv kernel and initrd are not found (bsc#1054453) + ------------------------------------------------------------------- Fri Sep 8 08:04:41 UTC 2017 - agraf@suse.com From 55f8d164bd6a52506ebc9e74446eb4371cfb18ab75aef0cbf082f2776d50fd91 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Sat, 7 Oct 2017 15:46:05 +0000 Subject: [PATCH 16/57] Accepting request 530250 from Base:System 1 OBS-URL: https://build.opensuse.org/request/show/530250 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=170 --- 0013-tpm-i386-pc-diskboot-img.patch | 148 ++++++++++++++++++++++++++++ grub2.changes | 8 ++ grub2.spec | 2 + 3 files changed, 158 insertions(+) create mode 100644 0013-tpm-i386-pc-diskboot-img.patch diff --git a/0013-tpm-i386-pc-diskboot-img.patch b/0013-tpm-i386-pc-diskboot-img.patch new file mode 100644 index 0000000..473d1bb --- /dev/null +++ b/0013-tpm-i386-pc-diskboot-img.patch @@ -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 + #include + +-#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"), diff --git a/grub2.changes b/grub2.changes index e350013..d5d5046 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Tue Sep 26 06:35:50 UTC 2017 - mchang@suse.com + +- Build diskboot_tpm.img as separate image to diskboot.img to prevent failure + in booting on some bogus firmware. To use the TPM image you have to use + suse-enable-tpm option of grub2-install (bsc#1052401) + * 0013-tpm-i386-pc-diskboot-img.patch + ------------------------------------------------------------------- Wed Sep 20 22:17:10 UTC 2017 - mlatimer@suse.com diff --git a/grub2.spec b/grub2.spec index eb6ba2e..bb388b7 100644 --- a/grub2.spec +++ b/grub2.spec @@ -268,6 +268,7 @@ 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 @@ -530,6 +531,7 @@ swap partition while in resuming %patch409 -p1 %patch410 -p1 %patch411 -p1 +%patch412 -p1 %patch420 -p1 # patches above may update the timestamp of grub.texi # and via build-aux/mdate-sh they end up in grub2.info, breaking build-compare From 1974a6df7e34bbc101efa9d111029535e3e4a383746da13c8c3466500fe36c72 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Fri, 10 Nov 2017 13:42:35 +0000 Subject: [PATCH 17/57] Accepting request 540121 from Base:System OBS-URL: https://build.opensuse.org/request/show/540121 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=171 --- ...seless-check-PReP-partition-is-empty.patch | 79 +++++++++++++++++++ grub2-xen-pv-firmware.cfg | 6 +- grub2.changes | 18 +++++ grub2.spec | 5 +- 4 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 grub2-install-remove-useless-check-PReP-partition-is-empty.patch diff --git a/grub2-install-remove-useless-check-PReP-partition-is-empty.patch b/grub2-install-remove-useless-check-PReP-partition-is-empty.patch new file mode 100644 index 0000000..9b7c876 --- /dev/null +++ b/grub2-install-remove-useless-check-PReP-partition-is-empty.patch @@ -0,0 +1,79 @@ +From b57af595c94db6d7babb7623c1530ee4f5b956f0 Mon Sep 17 00:00:00 2001 +From: Michal Suchanek +Date: Tue, 31 Oct 2017 14:28:54 +0100 +Subject: [PATCH] grub-install: remove useless check PReP partition is empty. + +References: bsc#1065738 + +The grub-install rewrite in commit cd46aa6cefab checks that the PPeP +partition does not install an ELF binary before writing grub to it. This +causes regression in installer scripts that expect to be able to +reinstall bootloaders without first witping the partition by hand. + +Fixes: cd46aa6cefab ("Rewrite grub-install, grub-mkrescue, + grub-mkstandalone and grub-mknetdir ") +--- + util/grub-install.c | 39 ++------------------------------------- + 1 file changed, 2 insertions(+), 37 deletions(-) + +diff --git a/util/grub-install.c b/util/grub-install.c +index 75e3e5ba6f07..ae859476e3da 100644 +--- a/util/grub-install.c ++++ b/util/grub-install.c +@@ -731,34 +731,6 @@ is_prep_partition (grub_device_t dev) + return 0; + } + +-static int +-is_prep_empty (grub_device_t dev) +-{ +- grub_disk_addr_t dsize, addr; +- grub_uint32_t buffer[32768]; +- +- dsize = grub_disk_get_size (dev->disk); +- for (addr = 0; addr < dsize; +- addr += sizeof (buffer) / GRUB_DISK_SECTOR_SIZE) +- { +- grub_size_t sz = sizeof (buffer); +- grub_uint32_t *ptr; +- +- if (sizeof (buffer) / GRUB_DISK_SECTOR_SIZE > dsize - addr) +- sz = (dsize - addr) * GRUB_DISK_SECTOR_SIZE; +- grub_disk_read (dev->disk, addr, 0, sz, buffer); +- +- if (addr == 0 && grub_memcmp (buffer, ELFMAG, SELFMAG) == 0) +- return 1; +- +- for (ptr = buffer; ptr < buffer + sz / sizeof (*buffer); ptr++) +- if (*ptr) +- return 0; +- } +- +- return 1; +-} +- + static void + bless (grub_device_t dev, const char *path, int x86) + { +@@ -1772,16 +1744,9 @@ main (int argc, char *argv[]) + { + grub_util_error ("%s", _("the chosen partition is not a PReP partition")); + } +- if (is_prep_empty (ins_dev)) +- { +- if (write_to_disk (ins_dev, imgfile)) +- grub_util_error ("%s", _("failed to copy Grub to the PReP partition")); +- } +- else ++ if (write_to_disk (ins_dev, imgfile)) + { +- char *s = xasprintf ("dd if=/dev/zero of=%s", install_device); +- grub_util_error (_("the PReP partition is not empty. If you are sure you want to use it, run dd to clear it: `%s'"), +- s); ++ grub_util_error ("%s", _("failed to copy Grub to the PReP partition")); + } + grub_device_close (ins_dev); + if (update_nvram) +-- +2.13.6 + diff --git a/grub2-xen-pv-firmware.cfg b/grub2-xen-pv-firmware.cfg index 7311399..757b392 100644 --- a/grub2-xen-pv-firmware.cfg +++ b/grub2-xen-pv-firmware.cfg @@ -138,15 +138,15 @@ if [ -n "${suse_cddev}" ]; then } elif [ -f "${suse_kern}" -a -f "$suse_initrd" ]; then menuentry "${suse_cddev} SUSE Install" { - linux "${suse_kern}" linemode=1 xencons=hvc0 + linux "${suse_kern}" xencons=hvc0 initrd "${suse_initrd}" } menuentry "${suse_cddev} SUSE Rescue" { - linux "${suse_kern}" linemode=1 xencons=hvc0 rescue=1 + linux "${suse_kern}" xencons=hvc0 rescue=1 initrd "${suse_initrd}" } menuentry "${suse_cddev} SUSE Upgrade" { - linux "${suse_kern}" linemode=1 xencons=hvc0 upgrade=1 + linux "${suse_kern}" xencons=hvc0 upgrade=1 initrd "${suse_initrd}" } else diff --git a/grub2.changes b/grub2.changes index d5d5046..7bd7a01 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,21 @@ +------------------------------------------------------------------- +Wed Nov 8 09:37:12 UTC 2017 - olaf@aepfle.de + +- grub2-xen-pv-firmware.cfg: remove linemode=1 from cmdline for + SUSE installer. openQA expects ncurses interface. (bsc#1066919) + +------------------------------------------------------------------- +Mon Nov 6 15:34:03 UTC 2017 - jmatejek@suse.com + +- use python3 for autogen.sh (fate#323526) + +------------------------------------------------------------------- +Tue Oct 31 13:36:02 UTC 2017 - msuchanek@suse.com + +- Do not check that PReP partition does not contain an ELF during installation + (bsc#1065738). + * grub2-install-remove-useless-check-PReP-partition-is-empty.patch + ------------------------------------------------------------------- Tue Sep 26 06:35:50 UTC 2017 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index bb388b7..c208759 100644 --- a/grub2.spec +++ b/grub2.spec @@ -44,7 +44,7 @@ BuildRequires: makeinfo %else BuildRequires: texinfo %endif -BuildRequires: python +BuildRequires: python3 BuildRequires: xz-devel %ifarch x86_64 %if 0%{?suse_version} >= 1230 || 0%{?suse_version} == 1110 @@ -212,6 +212,7 @@ Patch81: grub2-lvm-allocate-metadata-buffer-from-raw-contents.patch 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-install-remove-useless-check-PReP-partition-is-empty.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 @@ -484,6 +485,7 @@ swap partition while in resuming %patch82 -p1 %patch83 -p1 %patch84 -p1 +%patch85 -p1 %patch101 -p1 %patch102 -p1 %patch103 -p1 @@ -564,6 +566,7 @@ mkdir build-emu %endif %build +export PYTHON=%{_bindir}/python3 # autogen calls autoreconf -vi ./autogen.sh # Not yet: From 49cb644c9d12cd1cb8f3bea6e7daae7842bbe1e106ce2229346220cb6cfec7cc Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Sun, 19 Nov 2017 10:05:27 +0000 Subject: [PATCH 18/57] Accepting request 541952 from Base:System OBS-URL: https://build.opensuse.org/request/show/541952 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=172 --- ...d-support-for-UEFI-network-protocols.patch | 628 +++++++++++------- grub2.changes | 9 + 2 files changed, 405 insertions(+), 232 deletions(-) diff --git a/0001-add-support-for-UEFI-network-protocols.patch b/0001-add-support-for-UEFI-network-protocols.patch index da98245..58aa642 100644 --- a/0001-add-support-for-UEFI-network-protocols.patch +++ b/0001-add-support-for-UEFI-network-protocols.patch @@ -1,29 +1,39 @@ -From a4baaedd5482ec182f1be83a1f4b3cdf3c286ea2 Mon Sep 17 00:00:00 2001 +From 5d6111790e1cd07d1156f47bca0733f6d715337f Mon Sep 17 00:00:00 2001 From: Michael Chang Date: Wed, 22 Feb 2017 14:27:50 +0800 -Subject: [PATCH] Add support for UEFI network protocols +Subject: [PATCH] Support UEFI networking protocols -Add preliminary support of existing network functions based on UEFI network -protocols. +References: fate#320130, bsc#1015589 +Patch-Mainline: no + +V1: + * Add preliminary support of UEFI networking protocols + * Support UEFI HTTPS Boot + +V2: + * Workaround http data access in firmware + * Fix DNS device path parsing for efinet device + * Relaxed UEFI Protocol requirement + * Support Intel OPA (Omni-Path Architecture) PXE Boot --- grub-core/Makefile.core.def | 18 + - grub-core/kern/efi/efi.c | 70 +- - grub-core/net/drivers/efi/efinet.c | 6 + + grub-core/kern/efi/efi.c | 96 ++- + grub-core/net/drivers/efi/efinet.c | 27 + grub-core/net/efi/dhcp.c | 397 ++++++++++ grub-core/net/efi/efi_netfs.c | 57 ++ - grub-core/net/efi/http.c | 354 +++++++++ + grub-core/net/efi/http.c | 360 +++++++++ grub-core/net/efi/ip4_config.c | 398 ++++++++++ grub-core/net/efi/ip6_config.c | 422 +++++++++++ - grub-core/net/efi/net.c | 1420 ++++++++++++++++++++++++++++++++++++ - grub-core/net/efi/pxe.c | 419 +++++++++++ + grub-core/net/efi/net.c | 1428 ++++++++++++++++++++++++++++++++++++ + grub-core/net/efi/pxe.c | 424 +++++++++++ grub-core/net/net.c | 74 ++ - include/grub/efi/api.h | 145 +++- + include/grub/efi/api.h | 181 ++++- include/grub/efi/dhcp.h | 343 +++++++++ include/grub/efi/http.h | 215 ++++++ - include/grub/net/efi.h | 143 ++++ + include/grub/net/efi.h | 144 ++++ util/grub-mknetdir.c | 23 +- - 16 files changed, 4478 insertions(+), 26 deletions(-) + 16 files changed, 4567 insertions(+), 40 deletions(-) create mode 100644 grub-core/net/efi/dhcp.c create mode 100644 grub-core/net/efi/efi_netfs.c create mode 100644 grub-core/net/efi/http.c @@ -35,11 +45,11 @@ protocols. create mode 100644 include/grub/efi/http.h create mode 100644 include/grub/net/efi.h -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 -@@ -2157,6 +2157,18 @@ module = { +diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def +index a65c27f..e93c772 100644 +--- a/grub-core/Makefile.core.def ++++ b/grub-core/Makefile.core.def +@@ -2167,6 +2167,18 @@ module = { }; module = { @@ -58,7 +68,7 @@ Index: grub-2.02/grub-core/Makefile.core.def name = net; common = net/net.c; common = net/dns.c; -@@ -2169,6 +2181,12 @@ module = { +@@ -2179,6 +2191,12 @@ module = { common = net/ethernet.c; common = net/arp.c; common = net/netbuff.c; @@ -71,11 +81,11 @@ Index: grub-2.02/grub-core/Makefile.core.def }; module = { -Index: grub-2.02/grub-core/kern/efi/efi.c -=================================================================== ---- grub-2.02.orig/grub-core/kern/efi/efi.c -+++ grub-2.02/grub-core/kern/efi/efi.c -@@ -700,7 +700,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 d467785..0ceaa48 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; @@ -84,7 +94,7 @@ Index: grub-2.02/grub-core/kern/efi/efi.c (unsigned) ipv4->local_ip_address[0], (unsigned) ipv4->local_ip_address[1], (unsigned) ipv4->local_ip_address[2], -@@ -713,33 +713,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); @@ -162,7 +172,7 @@ Index: grub-2.02/grub-core/kern/efi/efi.c } break; case GRUB_EFI_INFINIBAND_DEVICE_PATH_SUBTYPE: -@@ -779,6 +806,13 @@ 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; @@ -172,14 +182,40 @@ Index: grub-2.02/grub-core/kern/efi/efi.c + = (grub_efi_uri_device_path_t *) dp; + grub_printf ("/URI(%s)", uri->uri); + } ++ break; ++ case GRUB_EFI_DNS_DEVICE_PATH_SUBTYPE: ++ { ++ grub_efi_dns_device_path_t *dns ++ = (grub_efi_dns_device_path_t *) dp; ++ if (dns->is_ipv6) ++ { ++ grub_printf ("/DNS(%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x)", ++ (grub_uint16_t)(grub_be_to_cpu32(dns->dns_server_ip[0].addr[0]) >> 16), ++ (grub_uint16_t)(grub_be_to_cpu32(dns->dns_server_ip[0].addr[0])), ++ (grub_uint16_t)(grub_be_to_cpu32(dns->dns_server_ip[0].addr[1]) >> 16), ++ (grub_uint16_t)(grub_be_to_cpu32(dns->dns_server_ip[0].addr[1])), ++ (grub_uint16_t)(grub_be_to_cpu32(dns->dns_server_ip[0].addr[2]) >> 16), ++ (grub_uint16_t)(grub_be_to_cpu32(dns->dns_server_ip[0].addr[2])), ++ (grub_uint16_t)(grub_be_to_cpu32(dns->dns_server_ip[0].addr[3]) >> 16), ++ (grub_uint16_t)(grub_be_to_cpu32(dns->dns_server_ip[0].addr[3]))); ++ } ++ else ++ { ++ grub_printf ("/DNS(%d.%d.%d.%d)", ++ dns->dns_server_ip[0].v4.addr[0], ++ dns->dns_server_ip[0].v4.addr[1], ++ dns->dns_server_ip[0].v4.addr[2], ++ dns->dns_server_ip[0].v4.addr[3]); ++ } ++ } + break; default: grub_printf ("/UnknownMessaging(%x)", (unsigned) subtype); break; -Index: grub-2.02/grub-core/net/drivers/efi/efinet.c -=================================================================== ---- grub-2.02.orig/grub-core/net/drivers/efi/efinet.c -+++ grub-2.02/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 82a28fb..f189209 100644 +--- a/grub-core/net/drivers/efi/efinet.c ++++ b/grub-core/net/drivers/efi/efinet.c @@ -24,6 +24,7 @@ #include #include @@ -188,7 +224,49 @@ Index: grub-2.02/grub-core/net/drivers/efi/efinet.c GRUB_MOD_LICENSE ("GPLv3+"); -@@ -816,6 +817,9 @@ grub_efi_net_config_real (grub_efi_handl +@@ -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); + ++ /* Skip the DNS Device */ ++ if (GRUB_EFI_DEVICE_PATH_TYPE (ldp) == GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE ++ && GRUB_EFI_DEVICE_PATH_SUBTYPE (ldp) == GRUB_EFI_DNS_DEVICE_PATH_SUBTYPE) ++ { ++ ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE; ++ ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; ++ ldp->length = sizeof (*ldp); ++ ++ ldp = grub_efi_find_last_device_path (ddp); ++ } ++ + 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_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 ++ && GRUB_EFI_DEVICE_PATH_SUBTYPE (ldp) != GRUB_EFI_DNS_DEVICE_PATH_SUBTYPE + && 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_handle_t hnd, char **device, + } + + dup_ldp = grub_efi_find_last_device_path (dup_dp); ++ if (GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == GRUB_EFI_DNS_DEVICE_PATH_SUBTYPE) ++ { ++ dup_ldp = grub_efi_find_last_device_path (dup_dp); ++ 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); ++ } ++ ++ dup_ldp = grub_efi_find_last_device_path (dup_dp); + 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_handle_t hnd, char **device, GRUB_MOD_INIT(efinet) { @@ -198,7 +276,7 @@ Index: grub-2.02/grub-core/net/drivers/efi/efinet.c grub_efinet_findcards (); grub_efi_net_config = grub_efi_net_config_real; } -@@ -827,5 +831,7 @@ GRUB_MOD_FINI(efinet) +@@ -827,5 +852,7 @@ GRUB_MOD_FINI(efinet) FOR_NET_CARDS_SAFE (card, next) if (card->driver == &efidriver) grub_net_card_unregister (card); @@ -206,10 +284,11 @@ Index: grub-2.02/grub-core/net/drivers/efi/efinet.c + grub_efi_net_config = NULL; } -Index: grub-2.02/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 0000000..dbef63d --- /dev/null -+++ grub-2.02/grub-core/net/efi/dhcp.c ++++ b/grub-core/net/efi/dhcp.c @@ -0,0 +1,397 @@ +#include +#include @@ -608,10 +687,11 @@ Index: grub-2.02/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.02/grub-core/net/efi/efi_netfs.c -=================================================================== +diff --git a/grub-core/net/efi/efi_netfs.c b/grub-core/net/efi/efi_netfs.c +new file mode 100644 +index 0000000..ef371d8 --- /dev/null -+++ grub-2.02/grub-core/net/efi/efi_netfs.c ++++ b/grub-core/net/efi/efi_netfs.c @@ -0,0 +1,57 @@ +#include +#include @@ -670,11 +750,12 @@ Index: grub-2.02/grub-core/net/efi/efi_netfs.c + return; + } +} -Index: grub-2.02/grub-core/net/efi/http.c -=================================================================== +diff --git a/grub-core/net/efi/http.c b/grub-core/net/efi/http.c +new file mode 100644 +index 0000000..816a3cd --- /dev/null -+++ grub-2.02/grub-core/net/efi/http.c -@@ -0,0 +1,354 @@ ++++ b/grub-core/net/efi/http.c +@@ -0,0 +1,360 @@ + +#include +#include @@ -777,6 +858,17 @@ Index: grub-2.02/grub-core/net/efi/http.c + response_callback_done = 1; +} + ++struct grub_efi_http_data ++{ ++ grub_efi_http_request_data_t request_data; ++ grub_efi_http_message_t request_message; ++ grub_efi_http_token_t request_token; ++ grub_efi_http_response_data_t response_data; ++ grub_efi_http_message_t response_message; ++ grub_efi_http_token_t response_token; ++ grub_efi_http_header_t request_headers[3]; ++}; ++ +static grub_err_t +grub_efihttp_open (struct grub_efi_net_device *dev, + int prefer_ip6 __attribute__ ((unused)), @@ -785,21 +877,21 @@ Index: grub-2.02/grub-core/net/efi/http.c + int type) +{ + grub_efi_status_t status; -+ grub_efi_http_request_data_t request_data = {0}; -+ grub_efi_http_message_t request_message = {{0}, 0, 0, 0, 0}; -+ grub_efi_http_token_t request_token = {0}; -+ grub_efi_http_response_data_t response_data = {0}; -+ grub_efi_http_message_t response_message = {{0}, 0, 0, 0, 0}; -+ grub_efi_http_token_t response_token = {0}; + grub_uint32_t length, i; + grub_efi_boot_services_t *b = grub_efi_system_table->boot_services; + grub_efi_http_t *http = dev->http; + char *url = NULL; -+ grub_efi_http_header_t request_headers[3] = { -+ {(grub_efi_char8_t *)"Host", (grub_efi_char8_t *)file->device->net->server}, -+ {(grub_efi_char8_t *)"Accept", (grub_efi_char8_t *)"*/*"}, -+ {(grub_efi_char8_t *)"User-Agent", (grub_efi_char8_t *)"UefiHttpBoot/1.0"} -+ }; ++ ++ struct grub_efi_http_data *data = grub_malloc (sizeof (*data)); ++ ++ grub_memset (data, 0, sizeof (*data)); ++ ++ data->request_headers[0].field_name = (grub_efi_char8_t *)"Host"; ++ data->request_headers[0].field_value = (grub_efi_char8_t *)file->device->net->server; ++ data->request_headers[1].field_name = (grub_efi_char8_t *)"Accept"; ++ data->request_headers[1].field_value = (grub_efi_char8_t *)"*/*"; ++ data->request_headers[2].field_name = (grub_efi_char8_t *)"User-Agent"; ++ data->request_headers[2].field_value = (grub_efi_char8_t *)"UefiHttpBoot/1.0"; + + { + grub_efi_ipv6_address_t address; @@ -829,21 +921,21 @@ Index: grub-2.02/grub-core/net/efi/http.c + ucs2_url_len = grub_utf8_to_utf16 (ucs2_url, ucs2_url_len, (grub_uint8_t *)url, url_len, NULL); /* convert string format from ascii to usc2 */ + ucs2_url[ucs2_url_len] = 0; + grub_free (url); -+ request_data.url = ucs2_url; ++ data->request_data.url = ucs2_url; + } + -+ request_data.method = GRUB_EFI_HTTPMETHODGET; ++ data->request_data.method = GRUB_EFI_HTTPMETHODGET; + -+ request_message.data.request = &request_data; -+ request_message.header_count = 3; -+ request_message.headers = request_headers; -+ request_message.body_length = 0; -+ request_message.body = NULL; ++ data->request_message.data.request = &data->request_data; ++ data->request_message.header_count = 3; ++ data->request_message.headers = data->request_headers; ++ data->request_message.body_length = 0; ++ data->request_message.body = NULL; + + /* request token */ -+ request_token.event = NULL; -+ request_token.status = GRUB_EFI_NOT_READY; -+ request_token.message = &request_message; ++ data->request_token.event = NULL; ++ data->request_token.status = GRUB_EFI_NOT_READY; ++ data->request_token.message = &data->request_message; + + request_callback_done = 0; + status = efi_call_5 (b->create_event, @@ -851,63 +943,63 @@ Index: grub-2.02/grub-core/net/efi/http.c + GRUB_EFI_TPL_CALLBACK, + grub_efi_http_request_callback, + NULL, -+ &request_token.event); ++ &data->request_token.event); + + if (status != GRUB_EFI_SUCCESS) + { -+ grub_free (request_data.url); ++ grub_free (data->request_data.url); + return grub_error (GRUB_ERR_IO, "Fail to create an event! status=0x%x\n", status); + } + -+ status = efi_call_2 (http->request, http, &request_token); ++ status = efi_call_2 (http->request, http, &data->request_token); + + if (status != GRUB_EFI_SUCCESS) + { -+ efi_call_1 (b->close_event, request_token.event); -+ grub_free (request_data.url); ++ efi_call_1 (b->close_event, data->request_token.event); ++ grub_free (data->request_data.url); + return grub_error (GRUB_ERR_IO, "Fail to send a request! status=0x%x\n", status); + } + /* TODO: Add Timeout */ + while (!request_callback_done) + efi_call_1(http->poll, http); + -+ response_data.status_code = GRUB_EFI_HTTP_STATUS_UNSUPPORTED_STATUS; -+ response_message.data.response = &response_data; ++ data->response_data.status_code = GRUB_EFI_HTTP_STATUS_UNSUPPORTED_STATUS; ++ data->response_message.data.response = &data->response_data; + /* herader_count will be updated by the HTTP driver on response */ -+ response_message.header_count = 0; ++ data->response_message.header_count = 0; + /* headers will be populated by the driver on response */ -+ response_message.headers = NULL; ++ data->response_message.headers = NULL; + /* use zero BodyLength to only receive the response headers */ -+ response_message.body_length = 0; -+ response_message.body = NULL; -+ response_token.event = NULL; ++ data->response_message.body_length = 0; ++ data->response_message.body = NULL; ++ data->response_token.event = NULL; + + status = efi_call_5 (b->create_event, + GRUB_EFI_EVT_NOTIFY_SIGNAL, + GRUB_EFI_TPL_CALLBACK, + grub_efi_http_response_callback, + NULL, -+ &response_token.event); ++ &data->response_token.event); + + if (status != GRUB_EFI_SUCCESS) + { -+ efi_call_1 (b->close_event, request_token.event); -+ grub_free (request_data.url); ++ efi_call_1 (b->close_event, data->request_token.event); ++ grub_free (data->request_data.url); + return grub_error (GRUB_ERR_IO, "Fail to create an event! status=0x%x\n", status); + } + -+ response_token.status = GRUB_EFI_SUCCESS; -+ response_token.message = &response_message; ++ data->response_token.status = GRUB_EFI_SUCCESS; ++ data->response_token.message = &data->response_message; + + /* wait for HTTP response */ + response_callback_done = 0; -+ status = efi_call_2 (http->response, http, &response_token); ++ status = efi_call_2 (http->response, http, &data->response_token); + + if (status != GRUB_EFI_SUCCESS) + { -+ efi_call_1 (b->close_event, response_token.event); -+ efi_call_1 (b->close_event, request_token.event); -+ grub_free (request_data.url); ++ efi_call_1 (b->close_event, data->response_token.event); ++ efi_call_1 (b->close_event, data->request_token.event); ++ grub_free (data->request_data.url); + return grub_error (GRUB_ERR_IO, "Fail to receive a response! status=%d\n", (int)status); + } + @@ -917,50 +1009,47 @@ Index: grub-2.02/grub-core/net/efi/http.c + + /* check the HTTP status code */ + /* parse the length of the file from the ContentLength header */ -+ for (length = 0, i = 0; i < response_message.header_count; ++i) ++ for (length = 0, i = 0; i < data->response_message.header_count; ++i) + { -+ if (!grub_strcmp((const char*)response_message.headers[i].field_name, "Content-Length")) ++ if (!grub_strcmp((const char*)data->response_message.headers[i].field_name, "Content-Length")) + { -+ length = grub_strtoul((const char*)response_message.headers[i].field_value, 0, 10); ++ length = grub_strtoul((const char*)data->response_message.headers[i].field_value, 0, 10); + break; + } + } + + file->size = (grub_off_t)length; + file->not_easily_seekable = 0; -+ file->data = 0; ++ file->data = data; + file->device->net->offset = 0; + + /* release */ + /* On response, this array is allocated and + populated by the HTTP driver. It is the responsibility of the caller + to free this memory on both request and response. */ -+ if (response_message.headers) -+ efi_call_1 (b->free_pool, response_message.headers); ++ if (data->response_message.headers) ++ efi_call_1 (b->free_pool, data->response_message.headers); + -+ efi_call_1 (b->close_event, response_token.event); -+ efi_call_1 (b->close_event, request_token.event); -+ grub_free (request_data.url); ++ efi_call_1 (b->close_event, data->response_token.event); ++ efi_call_1 (b->close_event, data->request_token.event); ++ grub_free (data->request_data.url); + + return GRUB_ERR_NONE; +} + +static grub_err_t -+grub_efihttp_close (struct grub_efi_net_device *dev, ++grub_efihttp_close (struct grub_efi_net_device *dev __attribute__ ((unused)), + int prefer_ip6 __attribute__ ((unused)), + grub_file_t file) +{ -+ grub_efi_status_t status; -+ grub_efi_http_t *http = dev->http; ++ struct grub_efi_http_data *data = file->data; + -+ return GRUB_ERR_NONE; -+ status = efi_call_2 (http->cancel, http, NULL); -+ if (status != GRUB_EFI_SUCCESS) -+ return grub_error (GRUB_ERR_IO, "Error! status=%d\n", (int)status); ++ if (data) ++ grub_free (data); + ++ file->data = 0; + file->offset = 0; + file->device->net->offset = 0; -+ + return GRUB_ERR_NONE; +} + @@ -971,39 +1060,37 @@ Index: grub-2.02/grub-core/net/efi/http.c + char *buf, + grub_size_t len) +{ -+ grub_efi_http_token_t response_token; + grub_efi_status_t status; + grub_size_t sum = 0; + grub_efi_boot_services_t *b = grub_efi_system_table->boot_services; + grub_efi_http_t *http = dev->http; ++ struct grub_efi_http_data *data = file->data; + -+ response_token.event = NULL; ++ grub_memset (data, 0, sizeof (*data)); + efi_call_5 (b->create_event, + GRUB_EFI_EVT_NOTIFY_SIGNAL, + GRUB_EFI_TPL_CALLBACK, + grub_efi_http_response_callback, + NULL, -+ &response_token.event); ++ &data->response_token.event); + + while (len) + { -+ grub_efi_http_message_t response_message; ++ data->response_message.data.response = NULL; ++ data->response_message.header_count = 0; ++ data->response_message.headers = NULL; ++ data->response_message.body_length = len; ++ data->response_message.body = buf; + -+ response_message.data.response = NULL; -+ response_message.header_count = 0; -+ response_message.headers = NULL; -+ response_message.body_length = len; -+ response_message.body = buf; -+ -+ response_token.message = &response_message; -+ response_token.status = GRUB_EFI_NOT_READY; ++ data->response_token.message = &data->response_message; ++ data->response_token.status = GRUB_EFI_NOT_READY; + + response_callback_done = 0; + -+ status = efi_call_2 (http->response, http, &response_token); ++ status = efi_call_2 (http->response, http, &data->response_token); + if (status != GRUB_EFI_SUCCESS) + { -+ efi_call_1 (b->close_event, response_token.event); ++ efi_call_1 (b->close_event, data->response_token.event); + grub_error (GRUB_ERR_IO, "Error! status=%d\n", (int)status); + return -1; + } @@ -1011,13 +1098,13 @@ Index: grub-2.02/grub-core/net/efi/http.c + while (!response_callback_done) + efi_call_1(http->poll, http); + -+ file->device->net->offset += response_message.body_length; -+ sum += response_message.body_length; -+ buf += response_message.body_length; -+ len -= response_message.body_length; ++ file->device->net->offset += data->response_message.body_length; ++ sum += data->response_message.body_length; ++ buf += data->response_message.body_length; ++ len -= data->response_message.body_length; + } + -+ efi_call_1 (b->close_event, response_token.event); ++ efi_call_1 (b->close_event, data->response_token.event); + + return sum; +} @@ -1029,10 +1116,11 @@ Index: grub-2.02/grub-core/net/efi/http.c + .read = grub_efihttp_read, + .close = grub_efihttp_close + }; -Index: grub-2.02/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 0000000..b711a5d --- /dev/null -+++ grub-2.02/grub-core/net/efi/ip4_config.c ++++ b/grub-core/net/efi/ip4_config.c @@ -0,0 +1,398 @@ + +#include @@ -1432,10 +1520,11 @@ Index: grub-2.02/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.02/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 0000000..017c4d0 --- /dev/null -+++ grub-2.02/grub-core/net/efi/ip6_config.c ++++ b/grub-core/net/efi/ip6_config.c @@ -0,0 +1,422 @@ +#include +#include @@ -1859,11 +1948,12 @@ Index: grub-2.02/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.02/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 0000000..0bac343 --- /dev/null -+++ grub-2.02/grub-core/net/efi/net.c -@@ -0,0 +1,1420 @@ ++++ b/grub-core/net/efi/net.c +@@ -0,0 +1,1428 @@ +#include +#include +#include @@ -2563,7 +2653,7 @@ Index: grub-2.02/grub-core/net/efi/net.c + service = grub_efi_open_protocol (dev, service_binding_guid, GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); + if (!service) + { -+ grub_error (GRUB_ERR_IO, N_("couldn't open http service binding protocol")); ++ grub_error (GRUB_ERR_IO, N_("couldn't open efi service binding protocol")); + return NULL; + } + @@ -2707,7 +2797,7 @@ Index: grub-2.02/grub-core/net/efi/net.c + grub_efi_device_path_t *dp, *ddp, *ldp; + grub_efi_pxe_t *pxe; + struct grub_efi_net_device *d; -+ int is_ip6; ++ int is_ip6 = 0; + + dp = grub_efi_get_device_path (*handle); + if (!dp) @@ -2718,20 +2808,20 @@ Index: grub-2.02/grub-core/net/efi/net.c + + if (ldp->type == GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE + && ldp->subtype == GRUB_EFI_IPV4_DEVICE_PATH_SUBTYPE) -+ is_ip6 = 0; ++ { ++ ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE; ++ ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; ++ ldp->length = sizeof (*ldp); ++ } + else if (ldp->type == GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE + && ldp->subtype == GRUB_EFI_IPV6_DEVICE_PATH_SUBTYPE) -+ is_ip6 = 1; -+ else + { -+ grub_free (ddp); -+ continue; ++ is_ip6 = 1; ++ ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE; ++ ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; ++ ldp->length = sizeof (*ldp); + } + -+ ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE; -+ ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; -+ ldp->length = sizeof (*ldp); -+ + for (d = net_devices; d; d = d->next) + if (grub_efi_compare_device_paths (ddp, grub_efi_get_device_path (d->handle)) == 0) + break; @@ -2775,28 +2865,22 @@ Index: grub-2.02/grub-core/net/efi/net.c + + for (dev = net_devices; dev; dev = dev->next) + { -+ grub_efi_status_t status; + grub_efi_ip4_config2_policy_t ip4_policy = GRUB_EFI_IP4_CONFIG2_POLICY_STATIC; -+ grub_efi_ip6_config_policy_t ip6_policy = GRUB_EFI_IP6_CONFIG_POLICY_MANUAL; + -+ status = efi_call_4 (dev->ip4_config->set_data, dev->ip4_config, ++ if (efi_call_4 (dev->ip4_config->set_data, dev->ip4_config, + GRUB_EFI_IP4_CONFIG2_DATA_TYPE_POLICY, -+ sizeof (ip4_policy), &ip4_policy); ++ sizeof (ip4_policy), &ip4_policy) != GRUB_EFI_SUCCESS) ++ grub_dprintf ("efinetfs", "could not set GRUB_EFI_IP4_CONFIG2_POLICY_STATIC on dev `%s'", dev->card_name); + -+ if (status != GRUB_EFI_SUCCESS) -+ grub_printf ("Set IP4 STATIC POLICY FAILED, reason: %d\n", (int)status); -+ else -+ grub_printf ("Set IP4 STATIC POLICY SUCCEEDED\n"); ++ if (dev->ip6_config) ++ { ++ grub_efi_ip6_config_policy_t ip6_policy = GRUB_EFI_IP6_CONFIG_POLICY_MANUAL; + -+ -+ status = efi_call_4 (dev->ip6_config->set_data, dev->ip6_config, ++ if (efi_call_4 (dev->ip6_config->set_data, dev->ip6_config, + GRUB_EFI_IP6_CONFIG_DATA_TYPE_POLICY, -+ sizeof (ip6_policy), &ip6_policy); -+ -+ if (status != GRUB_EFI_SUCCESS) -+ grub_printf ("Set IP6 STATIC POLICY FAILED, reason %d\n", (int)status); -+ else -+ grub_printf ("Set IP6 STATIC POLICY SUCCEEDED\n"); ++ sizeof (ip6_policy), &ip6_policy) != GRUB_EFI_SUCCESS) ++ grub_dprintf ("efinetfs", "could not set GRUB_EFI_IP6_CONFIG_POLICY_MANUAL on dev `%s'", dev->card_name); ++ } + } +} + @@ -2840,41 +2924,25 @@ Index: grub-2.02/grub-core/net/efi/net.c + ip6_config = grub_efi_open_protocol (*handle, &ip6_config_guid, + GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); + -+ if (!ip6_config) -+ continue; -+ + http_handle = grub_efi_service_binding (*handle, &http_service_binding_guid); -+ -+ if (!http_handle) -+ continue; -+ -+ http = grub_efi_open_protocol (http_handle, &http_guid, -+ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); -+ -+ if (!http) -+ continue; ++ grub_errno = GRUB_ERR_NONE; ++ http = (http_handle) ++ ? grub_efi_open_protocol (http_handle, &http_guid, GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL) ++ : NULL; + + dhcp4_handle = grub_efi_service_binding (*handle, &dhcp4_service_binding_guid); ++ grub_errno = GRUB_ERR_NONE; ++ dhcp4 = (dhcp4_handle) ++ ? grub_efi_open_protocol (dhcp4_handle, &dhcp4_guid, GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL) ++ : NULL; + -+ if (!dhcp4_handle) -+ continue; -+ -+ dhcp4 = grub_efi_open_protocol (dhcp4_handle, &dhcp4_guid, -+ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); -+ -+ if (!dhcp4) -+ continue; + + dhcp6_handle = grub_efi_service_binding (*handle, &dhcp6_service_binding_guid); ++ grub_errno = GRUB_ERR_NONE; ++ dhcp6 = (dhcp6_handle) ++ ? grub_efi_open_protocol (dhcp6_handle, &dhcp6_guid, GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL) ++ : NULL; + -+ if (!dhcp6_handle) -+ continue; -+ -+ dhcp6 = grub_efi_open_protocol (dhcp6_handle, &dhcp6_guid, -+ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); -+ -+ if (!dhcp6) -+ continue; + d = grub_malloc (sizeof (*d)); + if (!d) + { @@ -3076,7 +3144,6 @@ Index: grub-2.02/grub-core/net/efi/net.c + const char *protname, *server; + grub_net_t ret; + -+ grub_printf ("%s\n", name); + net_interface = NULL; + + if (grub_strncmp (name, "pxe:", sizeof ("pxe:") - 1) == 0) @@ -3117,8 +3184,6 @@ Index: grub-2.02/grub-core/net/efi/net.c + return NULL; + } + -+ grub_printf ("server is %s\n", server); -+ + /*FIXME: Use DNS translate name to address */ + net_interface = match_route (server); + @@ -3224,6 +3289,39 @@ Index: grub-2.02/grub-core/net/efi/net.c + return 0; +} + ++int ++grub_efi_net_boot_from_opa (void) ++{ ++ grub_efi_loaded_image_t *image = NULL; ++ grub_efi_device_path_t *dp; ++ ++ image = grub_efi_get_loaded_image (grub_efi_image_handle); ++ if (!image) ++ return 0; ++ ++ dp = grub_efi_get_device_path (image->device_handle); ++ ++ while (1) ++ { ++ grub_efi_uint8_t type = GRUB_EFI_DEVICE_PATH_TYPE (dp); ++ grub_efi_uint8_t subtype = GRUB_EFI_DEVICE_PATH_SUBTYPE (dp); ++ grub_efi_uint16_t len = GRUB_EFI_DEVICE_PATH_LENGTH (dp); ++ ++ if ((type == GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE) ++ && (subtype == GRUB_EFI_MAC_ADDRESS_DEVICE_PATH_SUBTYPE)) ++ { ++ grub_efi_mac_address_device_path_t *mac_dp = (grub_efi_mac_address_device_path_t *)dp; ++ return (mac_dp->if_type == 0xC7) ? 1 : 0; ++ } ++ ++ if (GRUB_EFI_END_ENTIRE_DEVICE_PATH (dp)) ++ break; ++ dp = (grub_efi_device_path_t *) ((char *) dp + len); ++ } ++ ++ return 0; ++} ++ +static char * +grub_env_write_readonly (struct grub_env_var *var __attribute__ ((unused)), + const char *val __attribute__ ((unused))) @@ -3284,11 +3382,12 @@ Index: grub-2.02/grub-core/net/efi/net.c + grub_net_open = NULL; + grub_fs_unregister (&grub_efi_netfs); +} -Index: grub-2.02/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 0000000..4b6b48c --- /dev/null -+++ grub-2.02/grub-core/net/efi/pxe.c -@@ -0,0 +1,419 @@ ++++ b/grub-core/net/efi/pxe.c +@@ -0,0 +1,424 @@ + +#include +#include @@ -3362,8 +3461,10 @@ Index: grub-2.02/grub-core/net/efi/pxe.c + grub_printf ("Couldn't start PXE\n"); + } + ++#if 0 + grub_printf ("PXE STARTED: %u\n", mode->started); + grub_printf ("PXE USING IPV6: %u\n", mode->using_ipv6); ++#endif + + if (mode->using_ipv6) + { @@ -3409,6 +3510,7 @@ Index: grub-2.02/grub-core/net/efi/pxe.c + } + } + ++#if 0 + if (mode->using_ipv6) + { + grub_printf ("PXE STATION IP: %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n", @@ -3442,6 +3544,7 @@ Index: grub-2.02/grub-core/net/efi/pxe.c + mode->subnet_mask.v4.addr[2], + mode->subnet_mask.v4.addr[3]); + } ++#endif + + /* TODO: Set The Station IP to the IP2 Config */ +} @@ -3525,6 +3628,7 @@ Index: grub-2.02/grub-core/net/efi/pxe.c + if (parse_ip6 (file->device->net->server, ip6, &rest) && *rest == 0) + grub_memcpy (server_ip.v6.addr, ip6, sizeof (server_ip.v6.addr)); + /* TODO: ERROR Handling Here */ ++#if 0 + grub_printf ("PXE SERVER IP: %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n", + server_ip.v6.addr[0], + server_ip.v6.addr[1], @@ -3542,6 +3646,7 @@ Index: grub-2.02/grub-core/net/efi/pxe.c + server_ip.v6.addr[13], + server_ip.v6.addr[14], + server_ip.v6.addr[15]); ++#endif + } + else + { @@ -3608,7 +3713,6 @@ Index: grub-2.02/grub-core/net/efi/pxe.c + if (file->data) + { + /* TODO: RANGE Check for offset and file size */ -+ grub_printf ("Read From file->data\n"); + grub_memcpy (buf, (char*)file->data + file->device->net->offset, len); + file->device->net->offset += len; + return len; @@ -3708,10 +3812,10 @@ Index: grub-2.02/grub-core/net/efi/pxe.c + .close = pxe_close + }; + -Index: grub-2.02/grub-core/net/net.c -=================================================================== ---- grub-2.02.orig/grub-core/net/net.c -+++ grub-2.02/grub-core/net/net.c +diff --git a/grub-core/net/net.c b/grub-core/net/net.c +index 5cc0d2f..02bbe95 100644 +--- a/grub-core/net/net.c ++++ b/grub-core/net/net.c @@ -32,6 +32,9 @@ #include #include @@ -3722,7 +3826,7 @@ Index: grub-2.02/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; @@ -3744,7 +3848,7 @@ Index: grub-2.02/grub-core/net/net.c + if (grub_net_open) + return; + -+ if (grub_efi_net_boot_from_https () ++ if ((grub_efi_net_boot_from_https () || grub_efi_net_boot_from_opa ()) + && grub_efi_net_fs_init ()) + { + cmd_lsroutes = grub_register_command ("net_ls_routes", grub_efi_net_list_routes, @@ -3818,11 +3922,35 @@ Index: grub-2.02/grub-core/net/net.c + init_mode = INIT_MODE_NONE; +#endif } -Index: grub-2.02/include/grub/efi/api.h -=================================================================== ---- grub-2.02.orig/include/grub/efi/api.h -+++ grub-2.02/include/grub/efi/api.h -@@ -851,6 +851,8 @@ struct grub_efi_ipv6_device_path +diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h +index 99ba068..cfedd78 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; ++typedef struct { ++ grub_uint8_t addr[4]; ++} grub_efi_pxe_ipv4_address_t; ++ ++typedef struct { ++ grub_uint8_t addr[16]; ++} grub_efi_pxe_ipv6_address_t; ++ ++typedef struct { ++ grub_uint8_t addr[32]; ++} grub_efi_pxe_mac_address_t; ++ ++typedef union { ++ grub_uint32_t addr[4]; ++ grub_efi_pxe_ipv4_address_t v4; ++ grub_efi_pxe_ipv6_address_t v6; ++} grub_efi_pxe_ip_address_t; + + struct grub_efi_guid + { +@@ -851,6 +868,8 @@ struct grub_efi_ipv6_device_path grub_efi_uint16_t remote_port; grub_efi_uint16_t protocol; grub_efi_uint8_t static_ip_address; @@ -3831,7 +3959,23 @@ Index: grub-2.02/include/grub/efi/api.h } GRUB_PACKED; typedef struct grub_efi_ipv6_device_path grub_efi_ipv6_device_path_t; -@@ -982,6 +984,23 @@ struct grub_efi_bios_device_path +@@ -900,6 +919,15 @@ struct grub_efi_uri_device_path + } GRUB_PACKED; + typedef struct grub_efi_uri_device_path grub_efi_uri_device_path_t; + ++#define GRUB_EFI_DNS_DEVICE_PATH_SUBTYPE 31 ++struct grub_efi_dns_device_path ++{ ++ grub_efi_device_path_t header; ++ grub_efi_uint8_t is_ipv6; ++ grub_efi_pxe_ip_address_t dns_server_ip[0]; ++} GRUB_PACKED; ++typedef struct grub_efi_dns_device_path grub_efi_dns_device_path_t; ++ + #define GRUB_EFI_VENDOR_MESSAGING_DEVICE_PATH_SUBTYPE 10 + + /* Media Device Path. */ +@@ -982,6 +1010,23 @@ struct grub_efi_bios_device_path } GRUB_PACKED; typedef struct grub_efi_bios_device_path grub_efi_bios_device_path_t; @@ -3855,12 +3999,18 @@ Index: grub-2.02/include/grub/efi/api.h struct grub_efi_open_protocol_information_entry { grub_efi_handle_t agent_handle; -@@ -1491,6 +1510,29 @@ typedef union { - grub_efi_pxe_ipv6_address_t v6; - } grub_efi_pxe_ip_address_t; +@@ -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]; + +-typedef struct { +- grub_uint8_t addr[4]; +-} grub_efi_pxe_ipv4_address_t; +typedef grub_efi_uint16_t grub_efi_pxe_base_code_udp_port_t; -+ + +-typedef struct { +- grub_uint8_t addr[16]; +-} grub_efi_pxe_ipv6_address_t; +typedef enum { + GRUB_EFI_PXE_BASE_CODE_TFTP_FIRST, + GRUB_EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE, @@ -3872,8 +4022,16 @@ Index: grub-2.02/include/grub/efi/api.h + GRUB_EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY, + GRUB_EFI_PXE_BASE_CODE_MTFTP_LAST +} grub_efi_pxe_base_code_tftp_opcode_t; -+ -+ + +-typedef struct { +- grub_uint8_t addr[32]; +-} grub_efi_pxe_mac_address_t; + +-typedef union { +- grub_uint32_t addr[4]; +- grub_efi_pxe_ipv4_address_t v4; +- grub_efi_pxe_ipv6_address_t v6; +-} grub_efi_pxe_ip_address_t; +typedef struct { + grub_efi_ip_address_t mcast_ip; + grub_efi_pxe_base_code_udp_port_t c_port; @@ -3881,11 +4039,10 @@ Index: grub-2.02/include/grub/efi/api.h + grub_efi_uint16_t listen_timeout; + grub_efi_uint16_t transmit_timeout; +} grub_efi_pxe_base_code_mtftp_info_t; -+ + #define GRUB_EFI_PXE_BASE_CODE_MAX_IPCNT 8 typedef struct { - grub_uint8_t filters; -@@ -1539,17 +1581,31 @@ typedef struct grub_efi_pxe_mode +@@ -1539,17 +1589,31 @@ typedef struct grub_efi_pxe_mode typedef struct grub_efi_pxe { grub_uint64_t rev; @@ -3921,7 +4078,7 @@ Index: grub-2.02/include/grub/efi/api.h void (*setpackets) (void); struct grub_efi_pxe_mode *mode; } grub_efi_pxe_t; -@@ -1791,6 +1847,44 @@ struct grub_efi_ip4_config2_protocol +@@ -1791,6 +1855,44 @@ struct grub_efi_ip4_config2_protocol }; typedef struct grub_efi_ip4_config2_protocol grub_efi_ip4_config2_protocol_t; @@ -3966,7 +4123,7 @@ Index: grub-2.02/include/grub/efi/api.h enum grub_efi_ip6_config_data_type { GRUB_EFI_IP6_CONFIG_DATA_TYPE_INTERFACEINFO, GRUB_EFI_IP6_CONFIG_DATA_TYPE_ALT_INTERFACEID, -@@ -1825,6 +1919,49 @@ struct grub_efi_ip6_config_protocol +@@ -1825,6 +1927,49 @@ struct grub_efi_ip6_config_protocol }; typedef struct grub_efi_ip6_config_protocol grub_efi_ip6_config_protocol_t; @@ -4016,10 +4173,11 @@ Index: grub-2.02/include/grub/efi/api.h #if (GRUB_TARGET_SIZEOF_VOID_P == 4) || defined (__ia64__) \ || defined (__aarch64__) || defined (__MINGW64__) || defined (__CYGWIN__) -Index: grub-2.02/include/grub/efi/dhcp.h -=================================================================== +diff --git a/include/grub/efi/dhcp.h b/include/grub/efi/dhcp.h +new file mode 100644 +index 0000000..fdb88eb --- /dev/null -+++ grub-2.02/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 @@ -4364,10 +4522,11 @@ Index: grub-2.02/include/grub/efi/dhcp.h +}; + +#endif /* ! GRUB_EFI_DHCP_HEADER */ -Index: grub-2.02/include/grub/efi/http.h -=================================================================== +diff --git a/include/grub/efi/http.h b/include/grub/efi/http.h +new file mode 100644 +index 0000000..c5e9a89 --- /dev/null -+++ grub-2.02/include/grub/efi/http.h ++++ b/include/grub/efi/http.h @@ -0,0 +1,215 @@ +/* + * GRUB -- GRand Unified Bootloader @@ -4584,11 +4743,12 @@ Index: grub-2.02/include/grub/efi/http.h +typedef struct grub_efi_http grub_efi_http_t; + +#endif /* !GRUB_EFI_HTTP_HEADER */ -Index: grub-2.02/include/grub/net/efi.h -=================================================================== +diff --git a/include/grub/net/efi.h b/include/grub/net/efi.h +new file mode 100644 +index 0000000..de90d22 --- /dev/null -+++ grub-2.02/include/grub/net/efi.h -@@ -0,0 +1,143 @@ ++++ b/include/grub/net/efi.h +@@ -0,0 +1,144 @@ +#ifndef GRUB_NET_EFI_HEADER +#define GRUB_NET_EFI_HEADER 1 + @@ -4723,6 +4883,7 @@ Index: grub-2.02/include/grub/net/efi.h +int grub_efi_net_fs_init (void); +void grub_efi_net_fs_fini (void); +int grub_efi_net_boot_from_https (void); ++int grub_efi_net_boot_from_opa (void); + +extern grub_command_func_t grub_efi_net_list_routes; +extern grub_command_func_t grub_efi_net_list_cards; @@ -4732,10 +4893,10 @@ Index: grub-2.02/include/grub/net/efi.h +extern grub_command_func_t grub_efi_net_bootp6; + +#endif /* ! GRUB_NET_EFI_HEADER */ -Index: grub-2.02/util/grub-mknetdir.c -=================================================================== ---- grub-2.02.orig/util/grub-mknetdir.c -+++ grub-2.02/util/grub-mknetdir.c +diff --git a/util/grub-mknetdir.c b/util/grub-mknetdir.c +index 82073d5..ae31271 100644 +--- a/util/grub-mknetdir.c ++++ b/util/grub-mknetdir.c @@ -32,13 +32,15 @@ static char *rootdir = NULL, *subdir = NULL; @@ -4761,7 +4922,7 @@ Index: grub-2.02/util/grub-mknetdir.c {0, 0, 0, 0, 0, 0} }; -@@ -67,6 +70,9 @@ argp_parser (int key, char *arg, struct +@@ -67,6 +70,9 @@ argp_parser (int key, char *arg, struct argp_state *state) free (subdir); subdir = xstrdup (arg); return 0; @@ -4771,7 +4932,7 @@ Index: grub-2.02/util/grub-mknetdir.c /* This is an undocumented feature... */ case OPTION_DEBUG: verbosity++; -@@ -82,7 +88,6 @@ argp_parser (int key, char *arg, struct +@@ -82,7 +88,6 @@ argp_parser (int key, char *arg, struct argp_state *state) } } @@ -4788,7 +4949,7 @@ Index: grub-2.02/util/grub-mknetdir.c { const char *mkimage_target; const char *netmodule; -@@ -154,6 +159,7 @@ process_input_dir (const char *input_dir +@@ -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); @@ -4814,3 +4975,6 @@ Index: grub-2.02/util/grub-mknetdir.c if (!grub_install_source_directory) { +-- +2.6.2 + diff --git a/grub2.changes b/grub2.changes index 7bd7a01..d8b9b1e 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,12 @@ +------------------------------------------------------------------- +Tue Nov 14 09:02:19 UTC 2017 - mchang@suse.com + +- 0001-add-support-for-UEFI-network-protocols.patch: + * Workaround http data access in firmware + * Fix DNS device path parsing for efinet device + * Relaxed UEFI Protocol requirement + * Support Intel OPA (Omni-Path Architecture) PXE Boot (bsc#1015589) + ------------------------------------------------------------------- Wed Nov 8 09:37:12 UTC 2017 - olaf@aepfle.de From bd40b4374569864a439a57b65750ff6a5122d1ce3362b3492e3e05172c3a420e Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Wed, 6 Dec 2017 07:53:04 +0000 Subject: [PATCH 19/57] Accepting request 547741 from Base:System OBS-URL: https://build.opensuse.org/request/show/547741 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=173 --- 0002-AUDIT-0-http-boot-tracker-bug.patch | 65 ++++++++++++++++++++++++ grub2.changes | 6 +++ grub2.spec | 2 + 3 files changed, 73 insertions(+) create mode 100644 0002-AUDIT-0-http-boot-tracker-bug.patch diff --git a/0002-AUDIT-0-http-boot-tracker-bug.patch b/0002-AUDIT-0-http-boot-tracker-bug.patch new file mode 100644 index 0000000..65b12ea --- /dev/null +++ b/0002-AUDIT-0-http-boot-tracker-bug.patch @@ -0,0 +1,65 @@ +From b5c3492f31a98f5ef0f9bec2c0665ad0b71ad5cb Mon Sep 17 00:00:00 2001 +From: Sebastian Krahmer +Date: Tue, 28 Nov 2017 17:24:38 +0800 +Subject: [PATCH] AUDIT-0: http boot tracker bug + +Fixing a memory leak in case of error, and a integer overflow, leading to a +heap overflow due to overly large chunk sizes. + +We need to check against some maximum value, otherwise values like 0xffffffff +will eventually lead in the allocation functions to small sized buffers, since +the len is rounded up to the next reasonable alignment. The following memcpy +will then smash the heap, leading to RCE. + +This is no big issue for pure http boot, since its going to execute an +untrusted kernel anyway, but it will break trusted boot scenarios, where only +signed code is allowed to be executed. + +Signed-off-by: Michael Chang +--- + grub-core/net/efi/net.c | 4 +++- + grub-core/net/http.c | 5 ++++- + 2 files changed, 7 insertions(+), 2 deletions(-) + +diff --git a/grub-core/net/efi/net.c b/grub-core/net/efi/net.c +index 0bac343b4..5bc604ff0 100644 +--- a/grub-core/net/efi/net.c ++++ b/grub-core/net/efi/net.c +@@ -645,8 +645,10 @@ grub_efihttp_chunk_read (grub_file_t file, char *buf, + + rd = efi_net_interface (read, file, chunk, sz); + +- if (rd <= 0) ++ if (rd <= 0) { ++ grub_free (chunk); + return rd; ++ } + + if (buf) + { +diff --git a/grub-core/net/http.c b/grub-core/net/http.c +index f182d7b87..5004ecfee 100644 +--- a/grub-core/net/http.c ++++ b/grub-core/net/http.c +@@ -31,7 +31,8 @@ GRUB_MOD_LICENSE ("GPLv3+"); + + enum + { +- HTTP_PORT = 80 ++ HTTP_PORT = 80, ++ HTTP_MAX_CHUNK_SIZE = 0x80000000 + }; + + +@@ -78,6 +79,8 @@ parse_line (grub_file_t file, http_data_t data, char *ptr, grub_size_t len) + if (data->in_chunk_len == 2) + { + data->chunk_rem = grub_strtoul (ptr, 0, 16); ++ if (data->chunk_rem > HTTP_MAX_CHUNK_SIZE) ++ return GRUB_ERR_NET_PACKET_TOO_BIG; + grub_errno = GRUB_ERR_NONE; + if (data->chunk_rem == 0) + { +-- +2.12.0 + diff --git a/grub2.changes b/grub2.changes index d8b9b1e..58d182b 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Tue Nov 28 09:35:48 UTC 2017 - mchang@suse.com + +- Fix http(s) boot security review (bsc#1058090) + * 0002-AUDIT-0-http-boot-tracker-bug.patch + ------------------------------------------------------------------- Tue Nov 14 09:02:19 UTC 2017 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index c208759..0cb919e 100644 --- a/grub2.spec +++ b/grub2.spec @@ -272,6 +272,7 @@ 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 Requires: gettext-runtime %if 0%{?suse_version} >= 1140 @@ -535,6 +536,7 @@ swap partition while in resuming %patch411 -p1 %patch412 -p1 %patch420 -p1 +%patch421 -p1 # patches above may update the timestamp of grub.texi # and via build-aux/mdate-sh they end up in grub2.info, breaking build-compare [ -z "$SOURCE_DATE_EPOCH" ] ||\ From 9bda449c6ce5726a109f58d5a6a37e826d9b28667b78f26e5113f6cb433153e5 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Wed, 13 Dec 2017 10:55:58 +0000 Subject: [PATCH 20/57] Accepting request 555805 from Base:System OBS-URL: https://build.opensuse.org/request/show/555805 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=174 --- grub2-pass-corret-root-for-nfsroot.patch | 37 +++++++++++++----------- grub2.changes | 7 +++++ 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/grub2-pass-corret-root-for-nfsroot.patch b/grub2-pass-corret-root-for-nfsroot.patch index 6e6447b..fd893c6 100644 --- a/grub2-pass-corret-root-for-nfsroot.patch +++ b/grub2-pass-corret-root-for-nfsroot.patch @@ -3,7 +3,7 @@ From: Michael Chang Date: Thu, 30 Aug 2012 15:43:17 +0800 Subject: [PATCH] Pass corret root= for nfsroot -References: bnc#774548 +References: bnc#774548, bsc#1069094 Patch-Mainline: no Fix / is mounted on nfs. The fix is to pass kernel parameters @@ -11,15 +11,18 @@ with correct root= for nfs. However since grub2 doesn't support nfs file system module, the /boot on nfs is not possible and grub2-probe not work in probing nfs mounted path. The fix is merely on the script level and not use grub2-probe for above reasons. + +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.02~beta2/util/grub-mkconfig.in +Index: grub-2.02/util/grub-mkconfig.in =================================================================== ---- grub-2.02~beta2.orig/util/grub-mkconfig.in -+++ grub-2.02~beta2/util/grub-mkconfig.in -@@ -128,22 +128,47 @@ else +--- grub-2.02.orig/util/grub-mkconfig.in ++++ grub-2.02/util/grub-mkconfig.in +@@ -131,22 +131,47 @@ else exit 1 fi @@ -47,9 +50,9 @@ Index: grub-2.02~beta2/util/grub-mkconfig.in + return + fi + done -+} Date: Fri, 2 Feb 2018 21:19:58 +0000 Subject: [PATCH 21/57] Accepting request 571597 from Base:System OBS-URL: https://build.opensuse.org/request/show/571597 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=175 --- grub2-check-default.sh | 125 ++++++++++++++++++ grub2-getroot-scan-disk-pv.patch | 43 ++++++ grub2-mkconfig-default-entry-correction.patch | 16 +++ grub2.changes | 10 ++ grub2.spec | 11 +- 5 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 grub2-check-default.sh create mode 100644 grub2-getroot-scan-disk-pv.patch create mode 100644 grub2-mkconfig-default-entry-correction.patch diff --git a/grub2-check-default.sh b/grub2-check-default.sh new file mode 100644 index 0000000..ab94dff --- /dev/null +++ b/grub2-check-default.sh @@ -0,0 +1,125 @@ +#!/bin/sh + +set -e + +fallback_entry () { + + local saved=$1 + local FALLBACK_MATCH=`echo $saved | sed -e '/>/!d' -e '/>/s/>.*$//'` + + if [ -n "$FALLBACK_MATCH" ]; then + for i in $MENU_ENTRIES; do + if expr match "$i" "^$FALLBACK_MATCH" >/dev/null ; then + echo "$i" + return 0 + fi + done + fi + return 0 +} + +run_command () { + [ x"$DEBUG_RUN" = x1 ] && echo $@ || $@ +} + +debug_print () { + [ x"$DEBUG_RUN" = x1 ] && echo $@ || true +} + +case $1 in +-d|--debug) + DEBUG_RUN=1 + ;; +esac + +GRUB_EDITENV="/usr/bin/grub2-editenv" +GRUB_SET_DEFAULT="/usr/sbin/grub2-set-default" + +SAVED_ENTRY=`${GRUB_EDITENV} list | sed -ne "/^saved_entry=/{s@\"\(.*\)\"@\1@;t 1;s@'\(.*\)'@\1@;: 1;s@^[^=]\+=@@;p;b}"` + +debug_print "SAVED_ENTRY=$SAVED_ENTRY" + +[ -z "$SAVED_ENTRY" ] && exit 0 + +MENU_ENTRIES=`awk ' + BEGIN { + bracket = 0 + } + { + patsplit($0, words, "([^[:blank:]]+)|(\"[^\"]+\")|('\''[^'\'']*'\'')", sep) + + cmd = words[1] + arg1 = words[2] + + if (substr(arg1, 1, 1) == "\"" || substr(arg1, 1, 1) == "'\''") { + len = length(arg1) + arg1 = substr(arg1, 2, len - 2) + } + + if (cmd == "submenu") { + submenu[bracket] = arg1 + } else if (cmd == "menuentry") { + title = "" + for (i = 0; i < bracket; i++) { + if (i in submenu) + title = title submenu[i] ">" + } + print title arg1 + } + + for (w in words) { + if (words[w] == "{") { + bracket++ + } else if (words[w] == "}") { + bracket-- + } + } + } +' /boot/grub2/grub.cfg` + +IFS=$'\n' + +debug_print "MENU_ENTRIES=" +for i in $MENU_ENTRIES; do + debug_print "$i" +done + +for i in $MENU_ENTRIES; do + if [ "$SAVED_ENTRY" = "$i" ]; then + exit 0 + fi +done + +FALLBACK=`fallback_entry $SAVED_ENTRY` + +if [ -n "$FALLBACK" ]; then + run_command ${GRUB_SET_DEFAULT} "$FALLBACK" + exit 0 +fi + +source /etc/os-release + +NEW_SAVED_ENTRY=`echo $SAVED_ENTRY | sed -ne "s/$NAME [0-9a-zA-Z_.-]\\+/$NAME $VERSION/pg"` + +debug_print "NEW_SAVED_ENTRY=$NEW_SAVED_ENTRY" + +if [ "$NEW_SAVED_ENTRY" = "$SAVED_ENTRY" ]; then + exit 0 +fi + +IFS=$'\n' +for i in $MENU_ENTRIES; do + if [ $NEW_SAVED_ENTRY = $i ]; then + run_command ${GRUB_SET_DEFAULT} "$NEW_SAVED_ENTRY" + exit 0 + fi +done + +FALLBACK=`fallback_entry $NEW_SAVED_ENTRY` + +if [ -n "$FALLBACK" ]; then + run_command ${GRUB_SET_DEFAULT} "$FALLBACK" + exit 0 +fi + +exit 0 diff --git a/grub2-getroot-scan-disk-pv.patch b/grub2-getroot-scan-disk-pv.patch new file mode 100644 index 0000000..745e99e --- /dev/null +++ b/grub2-getroot-scan-disk-pv.patch @@ -0,0 +1,43 @@ +From: Michael Chang +Subject: Fix grub2-mkconfig warning when disk is LVM PV +References: bsc#1071239 + +When a disk device was found in grub_util_biosdisk_get_grub_dev, its grub +hostdisk device name just returned. Since the disk could also be used as PV +disk, use grub_util_get_ldm to kick scanning of on disk metadata and adding it +to VG array. + +--- +Index: grub-2.02/util/getroot.c +=================================================================== +--- grub-2.02.orig/util/getroot.c ++++ grub-2.02/util/getroot.c +@@ -272,8 +272,28 @@ grub_util_biosdisk_get_grub_dev (const c + grub_util_info ("%s is a parent of %s", sys_disk, os_dev); + if (!is_part) + { ++#if defined(__APPLE__) + free (sys_disk); + return make_device_name (drive); ++#else ++ char *name, *ldm_name; ++ grub_disk_t disk; ++ ++ free (sys_disk); ++ name = make_device_name (drive); ++ disk = grub_disk_open (name); ++ if (!disk) ++ return name; ++ ldm_name = grub_util_get_ldm (disk, 0); ++ if (ldm_name) ++ { ++ grub_disk_close (disk); ++ grub_free (name); ++ return ldm_name; ++ } ++ grub_disk_close (disk); ++ return name; ++#endif + } + free (sys_disk); + diff --git a/grub2-mkconfig-default-entry-correction.patch b/grub2-mkconfig-default-entry-correction.patch new file mode 100644 index 0000000..3f05a3a --- /dev/null +++ b/grub2-mkconfig-default-entry-correction.patch @@ -0,0 +1,16 @@ +Index: grub-2.02~beta2/util/grub-mkconfig.in +=================================================================== +--- grub-2.02~beta2.orig/util/grub-mkconfig.in ++++ grub-2.02~beta2/util/grub-mkconfig.in +@@ -311,6 +311,11 @@ and /etc/grub.d/* files or please file a + else + # none of the children aborted with error, install the new grub.cfg + mv -f ${grub_cfg}.new ${grub_cfg} ++ # check if default entry need to be corrected for updated distributor version ++ # and/or use fallback entry if default kernel entry removed ++ if test -x /usr/sbin/grub2-check-default; then ++ /usr/sbin/grub2-check-default >&2 ++ fi + fi + fi + diff --git a/grub2.changes b/grub2.changes index 0769575..07e27f1 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,13 @@ +------------------------------------------------------------------- +Tue Jan 23 04:41:22 UTC 2018 - mchang@suse.com + +- Check if default entry need to be corrected for updated distributor version + and/or use fallback entry if default kernel entry removed (bsc#1065349) + * grub2-check-default.sh + * grub2-mkconfig-default-entry-correction.patch +- Fix grub2-mkconfig warning when disk is LVM PV (bsc#1071239) + * grub2-getroot-scan-disk-pv.patch + ------------------------------------------------------------------- Fri Dec 8 09:30:46 UTC 2017 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 0cb919e..68a6634 100644 --- a/grub2.spec +++ b/grub2.spec @@ -1,7 +1,7 @@ # # spec file for package grub2 # -# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -160,6 +160,7 @@ Source15: grub2-once.service Source16: grub2-xen-pv-firmware.cfg # required hook for systemd-sleep (bsc#941758) Source17: grub2-systemd-sleep.sh +Source18: grub2-check-default.sh Source1000: PATCH_POLICY Patch1: rename-grub-info-file-to-grub2.patch Patch2: grub2-linux.patch @@ -213,6 +214,7 @@ 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-install-remove-useless-check-PReP-partition-is-empty.patch +Patch86: grub2-getroot-scan-disk-pv.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 @@ -273,6 +275,9 @@ 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 +# check if default entry need to be corrected for updated distributor version +# and/or use fallback entry if default kernel entry removed (bsc#1065349) +Patch430: grub2-mkconfig-default-entry-correction.patch Requires: gettext-runtime %if 0%{?suse_version} >= 1140 @@ -487,6 +492,7 @@ swap partition while in resuming %patch83 -p1 %patch84 -p1 %patch85 -p1 +%patch86 -p1 %patch101 -p1 %patch102 -p1 %patch103 -p1 @@ -537,6 +543,7 @@ swap partition while in resuming %patch412 -p1 %patch420 -p1 %patch421 -p1 +%patch430 -p1 # patches above may update the timestamp of grub.texi # and via build-aux/mdate-sh they end up in grub2.info, breaking build-compare [ -z "$SOURCE_DATE_EPOCH" ] ||\ @@ -795,6 +802,7 @@ install -m 755 -D %{SOURCE14} $RPM_BUILD_ROOT%{_sysconfdir}/grub.d/80_suse_btrfs install -m 644 -D %{SOURCE15} $RPM_BUILD_ROOT%{_unitdir}/grub2-once.service install -m 755 -D %{SOURCE17} $RPM_BUILD_ROOT%{_libdir}/systemd/system-sleep/grub2.sleep %endif +install -m 755 -D %{SOURCE18} $RPM_BUILD_ROOT%{_sbindir}/grub2-check-default R=$RPM_BUILD_ROOT %ifarch %{ix86} x86_64 @@ -1018,6 +1026,7 @@ fi %{_sbindir}/%{name}-probe %{_sbindir}/%{name}-reboot %{_sbindir}/%{name}-set-default +%{_sbindir}/%{name}-check-default %{_bindir}/%{name}-editenv %{_bindir}/%{name}-file %{_bindir}/%{name}-fstest From a710e55a511aeff7e483a95e95a3585c291ed77b5e71b2f7685a7d0c04699ca3 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Fri, 9 Feb 2018 14:45:30 +0000 Subject: [PATCH 22/57] Accepting request 574507 from Base:System OBS-URL: https://build.opensuse.org/request/show/574507 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=176 --- 80_suse_btrfs_snapshot | 18 +++++++++++++++--- grub2-check-default.sh | 8 +++++--- grub2.changes | 19 +++++++++++++++++++ grub2.spec | 3 ++- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/80_suse_btrfs_snapshot b/80_suse_btrfs_snapshot index 9826426..11eb75f 100644 --- a/80_suse_btrfs_snapshot +++ b/80_suse_btrfs_snapshot @@ -1,10 +1,22 @@ #! /bin/sh set -e +SNAPSHOTS="/.snapshots" if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ] && - [ "x${GRUB_FS}" = "xbtrfs" ] ; then + [ "x${GRUB_FS}" = "xbtrfs" ] && + [ -f "${SNAPSHOTS}/grub-snapshot.cfg" ]; then + SNAPSHOT_RID=`btrfs inspect-internal rootid ${SNAPSHOTS}` + ROOT_RID=`btrfs inspect-internal rootid /` + if [ -n "${SNAPSHOT_RID}" -a "${SNAPSHOT_RID}" != "${ROOT_RID}" ]; then + SNAPSHOT_SUBVOL=`btrfs inspect-internal subvolid-resolve ${SNAPSHOT_RID} /` + ROOT_SUBVOL=`btrfs inspect-internal subvolid-resolve ${ROOT_RID} /` + INODE=`stat -c '%i' ${SNAPSHOTS}` + if [ "x${INODE}" = "x256" -a "x${ROOT_SUBVOL}${SNAPSHOTS}" != "x${SNAPSHOT_SUBVOL}" ]; then + echo "btrfs-mount-subvol (\$root) ${SNAPSHOTS} ${SNAPSHOT_SUBVOL}" + fi + fi cat </dev/null; then + exit 0 +fi MENU_ENTRIES=`awk ' BEGIN { @@ -103,13 +105,13 @@ NEW_SAVED_ENTRY=`echo $SAVED_ENTRY | sed -ne "s/$NAME [0-9a-zA-Z_.-]\\+/$NAME $V debug_print "NEW_SAVED_ENTRY=$NEW_SAVED_ENTRY" -if [ "$NEW_SAVED_ENTRY" = "$SAVED_ENTRY" ]; then +if [ -z "$NEW_SAVED_ENTRY" -o "$NEW_SAVED_ENTRY" = "$SAVED_ENTRY" ]; then exit 0 fi IFS=$'\n' for i in $MENU_ENTRIES; do - if [ $NEW_SAVED_ENTRY = $i ]; then + if [ "$NEW_SAVED_ENTRY" = "$i" ]; then run_command ${GRUB_SET_DEFAULT} "$NEW_SAVED_ENTRY" exit 0 fi diff --git a/grub2.changes b/grub2.changes index 07e27f1..5da4228 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,22 @@ +------------------------------------------------------------------- +Wed Feb 7 09:58:26 UTC 2018 - mchang@suse.com + +- Fix disappeared snapshot menu entry (bsc#1078481) + * 80_suse_btrfs_snapshot + +------------------------------------------------------------------- +Tue Feb 6 09:44:26 UTC 2018 - mchang@suse.com + +- Fix unquoted string error and add some more checks (bsc#1079330) + * grub2-check-default.sh + +------------------------------------------------------------------- +Mon Feb 5 08:52:20 UTC 2018 - olaf@aepfle.de + +- The %prep section applies patches, the %build section builds. + Remove mixup of patching and building from %prep for quilt setup + Related to bsc#1065703 + ------------------------------------------------------------------- Tue Jan 23 04:41:22 UTC 2018 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 68a6634..e44127a 100644 --- a/grub2.spec +++ b/grub2.spec @@ -544,6 +544,8 @@ swap partition while in resuming %patch420 -p1 %patch421 -p1 %patch430 -p1 + +%build # patches above may update the timestamp of grub.texi # and via build-aux/mdate-sh they end up in grub2.info, breaking build-compare [ -z "$SOURCE_DATE_EPOCH" ] ||\ @@ -574,7 +576,6 @@ mkdir build-xen mkdir build-emu %endif -%build export PYTHON=%{_bindir}/python3 # autogen calls autoreconf -vi ./autogen.sh From 446f77bbb6b8cd8d38eb23e40f2232fc20ca43e26d9bf9242c9235ccbd9f15b0 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Tue, 13 Feb 2018 09:44:46 +0000 Subject: [PATCH 23/57] Accepting request 576013 from Base:System OBS-URL: https://build.opensuse.org/request/show/576013 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=177 --- 80_suse_btrfs_snapshot | 2 +- grub2.changes | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/80_suse_btrfs_snapshot b/80_suse_btrfs_snapshot index 11eb75f..7589358 100644 --- a/80_suse_btrfs_snapshot +++ b/80_suse_btrfs_snapshot @@ -3,7 +3,7 @@ set -e SNAPSHOTS="/.snapshots" if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ] && [ "x${GRUB_FS}" = "xbtrfs" ] && - [ -f "${SNAPSHOTS}/grub-snapshot.cfg" ]; then + [ -d "${SNAPSHOTS}" ]; then SNAPSHOT_RID=`btrfs inspect-internal rootid ${SNAPSHOTS}` ROOT_RID=`btrfs inspect-internal rootid /` if [ -n "${SNAPSHOT_RID}" -a "${SNAPSHOT_RID}" != "${ROOT_RID}" ]; then diff --git a/grub2.changes b/grub2.changes index 5da4228..de6a9db 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Tue Feb 13 09:05:45 UTC 2018 - mchang@suse.com + +- Fix incorrect check preventing the script from running (bsc#1078481) + * 80_suse_btrfs_snapshot + ------------------------------------------------------------------- Wed Feb 7 09:58:26 UTC 2018 - mchang@suse.com From 206157bd2d5e005dacf430dcd9e5650aa59cd9a30d150db86c183e6d9461132d Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Mon, 19 Mar 2018 22:30:33 +0000 Subject: [PATCH 24/57] Accepting request 587448 from Base:System OBS-URL: https://build.opensuse.org/request/show/587448 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=178 --- ...d-support-for-UEFI-network-protocols.patch | 368 +++++++++++------- grub2-btrfs-09-get-default-subvolume.patch | 16 +- ...tch => grub2-grubenv-in-btrfs-header.patch | 32 +- grub2-xen-pv-firmware.cfg | 2 + grub2.changes | 22 ++ grub2.spec | 2 +- 6 files changed, 278 insertions(+), 164 deletions(-) rename grub2-btrfs-workaround-grub2-once.patch => grub2-grubenv-in-btrfs-header.patch (92%) diff --git a/0001-add-support-for-UEFI-network-protocols.patch b/0001-add-support-for-UEFI-network-protocols.patch index 58aa642..0e31f3f 100644 --- a/0001-add-support-for-UEFI-network-protocols.patch +++ b/0001-add-support-for-UEFI-network-protocols.patch @@ -3,7 +3,7 @@ From: Michael Chang Date: Wed, 22 Feb 2017 14:27:50 +0800 Subject: [PATCH] Support UEFI networking protocols -References: fate#320130, bsc#1015589 +References: fate#320130, bsc#1015589, bsc#1076132 Patch-Mainline: no V1: @@ -16,13 +16,21 @@ V2: * Relaxed UEFI Protocol requirement * Support Intel OPA (Omni-Path Architecture) PXE Boot +V3: + * Fix bufio in calculating address of next_buf + * Check HTTP respond code + * Use HEAD request method to test before GET + * Finish HTTP transaction in one go + * Fix bsc#1076132 + --- grub-core/Makefile.core.def | 18 + + grub-core/io/bufio.c | 2 +- grub-core/kern/efi/efi.c | 96 ++- grub-core/net/drivers/efi/efinet.c | 27 + grub-core/net/efi/dhcp.c | 397 ++++++++++ grub-core/net/efi/efi_netfs.c | 57 ++ - grub-core/net/efi/http.c | 360 +++++++++ + grub-core/net/efi/http.c | 419 +++++++++++ grub-core/net/efi/ip4_config.c | 398 ++++++++++ grub-core/net/efi/ip6_config.c | 422 +++++++++++ grub-core/net/efi/net.c | 1428 ++++++++++++++++++++++++++++++++++++ @@ -33,7 +41,7 @@ V2: include/grub/efi/http.h | 215 ++++++ include/grub/net/efi.h | 144 ++++ util/grub-mknetdir.c | 23 +- - 16 files changed, 4567 insertions(+), 40 deletions(-) + 17 files changed, 4627 insertions(+), 41 deletions(-) create mode 100644 grub-core/net/efi/dhcp.c create mode 100644 grub-core/net/efi/efi_netfs.c create mode 100644 grub-core/net/efi/http.c @@ -46,7 +54,7 @@ V2: create mode 100644 include/grub/net/efi.h diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index a65c27f..e93c772 100644 +index a65c27f7f..e93c77255 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def @@ -2167,6 +2167,18 @@ module = { @@ -81,8 +89,21 @@ index a65c27f..e93c772 100644 }; module = { +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. */ +- next_buf = (file->offset + res + len - 1) & ~((grub_off_t) bufio->block_size - 1); ++ next_buf = (grub_divmod64 (file->offset + res + len - 1, bufio->block_size, NULL)) * bufio->block_size; + /* Now read between file->offset + res and bufio->buffer_at. */ + if (file->offset + res < next_buf) + { diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c -index d467785..0ceaa48 100644 +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) @@ -213,7 +234,7 @@ index d467785..0ceaa48 100644 grub_printf ("/UnknownMessaging(%x)", (unsigned) subtype); break; diff --git a/grub-core/net/drivers/efi/efinet.c b/grub-core/net/drivers/efi/efinet.c -index 82a28fb..f189209 100644 +index 82a28fb6e..f189209ba 100644 --- a/grub-core/net/drivers/efi/efinet.c +++ b/grub-core/net/drivers/efi/efinet.c @@ -24,6 +24,7 @@ @@ -286,7 +307,7 @@ index 82a28fb..f189209 100644 diff --git a/grub-core/net/efi/dhcp.c b/grub-core/net/efi/dhcp.c new file mode 100644 -index 0000000..dbef63d +index 000000000..dbef63d8c --- /dev/null +++ b/grub-core/net/efi/dhcp.c @@ -0,0 +1,397 @@ @@ -689,7 +710,7 @@ index 0000000..dbef63d +grub_command_func_t grub_efi_net_bootp6 = grub_cmd_efi_bootp6; diff --git a/grub-core/net/efi/efi_netfs.c b/grub-core/net/efi/efi_netfs.c new file mode 100644 -index 0000000..ef371d8 +index 000000000..ef371d885 --- /dev/null +++ b/grub-core/net/efi/efi_netfs.c @@ -0,0 +1,57 @@ @@ -752,10 +773,10 @@ index 0000000..ef371d8 +} diff --git a/grub-core/net/efi/http.c b/grub-core/net/efi/http.c new file mode 100644 -index 0000000..816a3cd +index 000000000..3f61fd2fa --- /dev/null +++ b/grub-core/net/efi/http.c -@@ -0,0 +1,360 @@ +@@ -0,0 +1,419 @@ + +#include +#include @@ -858,7 +879,8 @@ index 0000000..816a3cd + response_callback_done = 1; +} + -+struct grub_efi_http_data ++static grub_err_t ++efihttp_request (grub_efi_http_t *http, char *server, char *name, int use_https, int headeronly, grub_off_t *file_size) +{ + grub_efi_http_request_data_t request_data; + grub_efi_http_message_t request_message; @@ -867,46 +889,34 @@ index 0000000..816a3cd + grub_efi_http_message_t response_message; + grub_efi_http_token_t response_token; + grub_efi_http_header_t request_headers[3]; -+}; + -+static grub_err_t -+grub_efihttp_open (struct grub_efi_net_device *dev, -+ int prefer_ip6 __attribute__ ((unused)), -+ grub_file_t file, -+ const char *filename __attribute__ ((unused)), -+ int type) -+{ + grub_efi_status_t status; -+ grub_uint32_t length, i; + grub_efi_boot_services_t *b = grub_efi_system_table->boot_services; -+ grub_efi_http_t *http = dev->http; + char *url = NULL; + -+ struct grub_efi_http_data *data = grub_malloc (sizeof (*data)); -+ -+ grub_memset (data, 0, sizeof (*data)); -+ -+ data->request_headers[0].field_name = (grub_efi_char8_t *)"Host"; -+ data->request_headers[0].field_value = (grub_efi_char8_t *)file->device->net->server; -+ data->request_headers[1].field_name = (grub_efi_char8_t *)"Accept"; -+ data->request_headers[1].field_value = (grub_efi_char8_t *)"*/*"; -+ data->request_headers[2].field_name = (grub_efi_char8_t *)"User-Agent"; -+ data->request_headers[2].field_value = (grub_efi_char8_t *)"UefiHttpBoot/1.0"; ++ request_headers[0].field_name = (grub_efi_char8_t *)"Host"; ++ request_headers[0].field_value = (grub_efi_char8_t *)server; ++ request_headers[1].field_name = (grub_efi_char8_t *)"Accept"; ++ request_headers[1].field_value = (grub_efi_char8_t *)"*/*"; ++ request_headers[2].field_name = (grub_efi_char8_t *)"User-Agent"; ++ request_headers[2].field_value = (grub_efi_char8_t *)"UefiHttpBoot/1.0"; + + { + grub_efi_ipv6_address_t address; + const char *rest; + grub_efi_char16_t *ucs2_url; + grub_size_t url_len, ucs2_url_len; -+ const char *protocol = (type == 1) ? "https" : "http"; ++ const char *protocol = (use_https == 1) ? "https" : "http"; + -+ if (grub_efi_string_to_ip6_address (file->device->net->server, &address, &rest) && *rest == 0) -+ url = grub_xasprintf ("%s://[%s]%s", protocol, file->device->net->server, file->device->net->name); ++ if (grub_efi_string_to_ip6_address (server, &address, &rest) && *rest == 0) ++ url = grub_xasprintf ("%s://[%s]%s", protocol, server, name); + else -+ url = grub_xasprintf ("%s://%s%s", protocol, file->device->net->server, file->device->net->name); ++ url = grub_xasprintf ("%s://%s%s", protocol, server, name); + + if (!url) -+ return grub_errno; ++ { ++ return grub_errno; ++ } + + url_len = grub_strlen (url); + ucs2_url_len = url_len * GRUB_MAX_UTF16_PER_UTF8; @@ -921,21 +931,21 @@ index 0000000..816a3cd + ucs2_url_len = grub_utf8_to_utf16 (ucs2_url, ucs2_url_len, (grub_uint8_t *)url, url_len, NULL); /* convert string format from ascii to usc2 */ + ucs2_url[ucs2_url_len] = 0; + grub_free (url); -+ data->request_data.url = ucs2_url; ++ request_data.url = ucs2_url; + } + -+ data->request_data.method = GRUB_EFI_HTTPMETHODGET; ++ request_data.method = (headeronly > 0) ? GRUB_EFI_HTTPMETHODHEAD : GRUB_EFI_HTTPMETHODGET; + -+ data->request_message.data.request = &data->request_data; -+ data->request_message.header_count = 3; -+ data->request_message.headers = data->request_headers; -+ data->request_message.body_length = 0; -+ data->request_message.body = NULL; ++ request_message.data.request = &request_data; ++ request_message.header_count = 3; ++ request_message.headers = request_headers; ++ request_message.body_length = 0; ++ request_message.body = NULL; + + /* request token */ -+ data->request_token.event = NULL; -+ data->request_token.status = GRUB_EFI_NOT_READY; -+ data->request_token.message = &data->request_message; ++ request_token.event = NULL; ++ request_token.status = GRUB_EFI_NOT_READY; ++ request_token.message = &request_message; + + request_callback_done = 0; + status = efi_call_5 (b->create_event, @@ -943,63 +953,63 @@ index 0000000..816a3cd + GRUB_EFI_TPL_CALLBACK, + grub_efi_http_request_callback, + NULL, -+ &data->request_token.event); ++ &request_token.event); + + if (status != GRUB_EFI_SUCCESS) + { -+ grub_free (data->request_data.url); ++ grub_free (request_data.url); + return grub_error (GRUB_ERR_IO, "Fail to create an event! status=0x%x\n", status); + } + -+ status = efi_call_2 (http->request, http, &data->request_token); ++ status = efi_call_2 (http->request, http, &request_token); + + if (status != GRUB_EFI_SUCCESS) + { -+ efi_call_1 (b->close_event, data->request_token.event); -+ grub_free (data->request_data.url); ++ efi_call_1 (b->close_event, request_token.event); ++ grub_free (request_data.url); + return grub_error (GRUB_ERR_IO, "Fail to send a request! status=0x%x\n", status); + } + /* TODO: Add Timeout */ + while (!request_callback_done) + efi_call_1(http->poll, http); + -+ data->response_data.status_code = GRUB_EFI_HTTP_STATUS_UNSUPPORTED_STATUS; -+ data->response_message.data.response = &data->response_data; ++ response_data.status_code = GRUB_EFI_HTTP_STATUS_UNSUPPORTED_STATUS; ++ response_message.data.response = &response_data; + /* herader_count will be updated by the HTTP driver on response */ -+ data->response_message.header_count = 0; ++ response_message.header_count = 0; + /* headers will be populated by the driver on response */ -+ data->response_message.headers = NULL; ++ response_message.headers = NULL; + /* use zero BodyLength to only receive the response headers */ -+ data->response_message.body_length = 0; -+ data->response_message.body = NULL; -+ data->response_token.event = NULL; ++ response_message.body_length = 0; ++ response_message.body = NULL; ++ response_token.event = NULL; + + status = efi_call_5 (b->create_event, + GRUB_EFI_EVT_NOTIFY_SIGNAL, + GRUB_EFI_TPL_CALLBACK, + grub_efi_http_response_callback, + NULL, -+ &data->response_token.event); ++ &response_token.event); + + if (status != GRUB_EFI_SUCCESS) + { -+ efi_call_1 (b->close_event, data->request_token.event); -+ grub_free (data->request_data.url); ++ efi_call_1 (b->close_event, request_token.event); ++ grub_free (request_data.url); + return grub_error (GRUB_ERR_IO, "Fail to create an event! status=0x%x\n", status); + } + -+ data->response_token.status = GRUB_EFI_SUCCESS; -+ data->response_token.message = &data->response_message; ++ response_token.status = GRUB_EFI_SUCCESS; ++ response_token.message = &response_message; + + /* wait for HTTP response */ + response_callback_done = 0; -+ status = efi_call_2 (http->response, http, &data->response_token); ++ status = efi_call_2 (http->response, http, &response_token); + + if (status != GRUB_EFI_SUCCESS) + { -+ efi_call_1 (b->close_event, data->response_token.event); -+ efi_call_1 (b->close_event, data->request_token.event); -+ grub_free (data->request_data.url); ++ efi_call_1 (b->close_event, response_token.event); ++ efi_call_1 (b->close_event, request_token.event); ++ grub_free (request_data.url); + return grub_error (GRUB_ERR_IO, "Fail to receive a response! status=%d\n", (int)status); + } + @@ -1007,33 +1017,136 @@ index 0000000..816a3cd + while (!response_callback_done) + efi_call_1 (http->poll, http); + -+ /* check the HTTP status code */ -+ /* parse the length of the file from the ContentLength header */ -+ for (length = 0, i = 0; i < data->response_message.header_count; ++i) ++ if (response_message.data.response->status_code != GRUB_EFI_HTTP_STATUS_200_OK) + { -+ if (!grub_strcmp((const char*)data->response_message.headers[i].field_name, "Content-Length")) ++ grub_efi_http_status_code_t status_code = response_message.data.response->status_code; ++ ++ if (response_message.headers) ++ efi_call_1 (b->free_pool, response_message.headers); ++ efi_call_1 (b->close_event, response_token.event); ++ efi_call_1 (b->close_event, request_token.event); ++ grub_free (request_data.url); ++ if (status_code == GRUB_EFI_HTTP_STATUS_404_NOT_FOUND) + { -+ length = grub_strtoul((const char*)data->response_message.headers[i].field_value, 0, 10); -+ break; ++ return grub_error (GRUB_ERR_FILE_NOT_FOUND, _("file `%s' not found"), name); ++ } ++ else ++ { ++ return grub_error (GRUB_ERR_NET_UNKNOWN_ERROR, ++ _("unsupported uefi http status code 0x%x"), status_code); + } + } + -+ file->size = (grub_off_t)length; ++ if (file_size) ++ { ++ int i; ++ /* parse the length of the file from the ContentLength header */ ++ for (*file_size = 0, i = 0; i < (int)response_message.header_count; ++i) ++ { ++ if (!grub_strcmp((const char*)response_message.headers[i].field_name, "Content-Length")) ++ { ++ *file_size = grub_strtoul((const char*)response_message.headers[i].field_value, 0, 10); ++ break; ++ } ++ } ++ } ++ ++ if (response_message.headers) ++ efi_call_1 (b->free_pool, response_message.headers); ++ efi_call_1 (b->close_event, response_token.event); ++ efi_call_1 (b->close_event, request_token.event); ++ grub_free (request_data.url); ++ ++ return GRUB_ERR_NONE; ++} ++ ++static grub_ssize_t ++efihttp_read (struct grub_efi_net_device *dev, ++ char *buf, ++ grub_size_t len) ++{ ++ grub_efi_http_message_t response_message; ++ grub_efi_http_token_t response_token; ++ ++ grub_efi_status_t status; ++ grub_size_t sum = 0; ++ grub_efi_boot_services_t *b = grub_efi_system_table->boot_services; ++ grub_efi_http_t *http = dev->http; ++ ++ if (!len) ++ { ++ grub_error (GRUB_ERR_BUG, "Invalid arguments to EFI HTTP Read"); ++ return -1; ++ } ++ ++ efi_call_5 (b->create_event, ++ GRUB_EFI_EVT_NOTIFY_SIGNAL, ++ GRUB_EFI_TPL_CALLBACK, ++ grub_efi_http_response_callback, ++ NULL, ++ &response_token.event); ++ ++ while (len) ++ { ++ response_message.data.response = NULL; ++ response_message.header_count = 0; ++ response_message.headers = NULL; ++ response_message.body_length = len; ++ response_message.body = buf; ++ ++ response_token.message = &response_message; ++ response_token.status = GRUB_EFI_NOT_READY; ++ ++ response_callback_done = 0; ++ ++ status = efi_call_2 (http->response, http, &response_token); ++ if (status != GRUB_EFI_SUCCESS) ++ { ++ efi_call_1 (b->close_event, response_token.event); ++ grub_error (GRUB_ERR_IO, "Error! status=%d\n", (int)status); ++ return -1; ++ } ++ ++ while (!response_callback_done) ++ efi_call_1(http->poll, http); ++ ++ sum += response_message.body_length; ++ buf += response_message.body_length; ++ len -= response_message.body_length; ++ } ++ ++ efi_call_1 (b->close_event, response_token.event); ++ ++ return sum; ++} ++ ++static grub_err_t ++grub_efihttp_open (struct grub_efi_net_device *dev, ++ int prefer_ip6 __attribute__ ((unused)), ++ grub_file_t file, ++ const char *filename __attribute__ ((unused)), ++ int type) ++{ ++ grub_err_t err; ++ grub_off_t size; ++ char *buf; ++ ++ err = efihttp_request (dev->http, file->device->net->server, file->device->net->name, type, 1, 0); ++ if (err != GRUB_ERR_NONE) ++ return err; ++ ++ err = efihttp_request (dev->http, file->device->net->server, file->device->net->name, type, 0, &size); ++ if (err != GRUB_ERR_NONE) ++ return err; ++ ++ buf = grub_malloc (size); ++ efihttp_read (dev, buf, size); ++ ++ file->size = size; ++ file->data = buf; + file->not_easily_seekable = 0; -+ file->data = data; + file->device->net->offset = 0; + -+ /* release */ -+ /* On response, this array is allocated and -+ populated by the HTTP driver. It is the responsibility of the caller -+ to free this memory on both request and response. */ -+ if (data->response_message.headers) -+ efi_call_1 (b->free_pool, data->response_message.headers); -+ -+ efi_call_1 (b->close_event, data->response_token.event); -+ efi_call_1 (b->close_event, data->request_token.event); -+ grub_free (data->request_data.url); -+ + return GRUB_ERR_NONE; +} + @@ -1042,71 +1155,38 @@ index 0000000..816a3cd + int prefer_ip6 __attribute__ ((unused)), + grub_file_t file) +{ -+ struct grub_efi_http_data *data = file->data; -+ -+ if (data) -+ grub_free (data); ++ if (file->data) ++ grub_free (file->data); + + file->data = 0; + file->offset = 0; ++ file->size = 0; + file->device->net->offset = 0; + return GRUB_ERR_NONE; +} + +static grub_ssize_t -+grub_efihttp_read (struct grub_efi_net_device *dev, ++grub_efihttp_read (struct grub_efi_net_device *dev __attribute__((unused)), + int prefer_ip6 __attribute__((unused)), + grub_file_t file, + char *buf, + grub_size_t len) +{ -+ grub_efi_status_t status; -+ grub_size_t sum = 0; -+ grub_efi_boot_services_t *b = grub_efi_system_table->boot_services; -+ grub_efi_http_t *http = dev->http; -+ struct grub_efi_http_data *data = file->data; ++ grub_size_t r = len; + -+ grub_memset (data, 0, sizeof (*data)); -+ efi_call_5 (b->create_event, -+ GRUB_EFI_EVT_NOTIFY_SIGNAL, -+ GRUB_EFI_TPL_CALLBACK, -+ grub_efi_http_response_callback, -+ NULL, -+ &data->response_token.event); ++ if (!file->data || !buf || !len) ++ return 0; + -+ while (len) ++ if ((file->device->net->offset + len) > file->size) ++ r = file->size - file->device->net->offset; ++ ++ if (r) + { -+ data->response_message.data.response = NULL; -+ data->response_message.header_count = 0; -+ data->response_message.headers = NULL; -+ data->response_message.body_length = len; -+ data->response_message.body = buf; -+ -+ data->response_token.message = &data->response_message; -+ data->response_token.status = GRUB_EFI_NOT_READY; -+ -+ response_callback_done = 0; -+ -+ status = efi_call_2 (http->response, http, &data->response_token); -+ if (status != GRUB_EFI_SUCCESS) -+ { -+ efi_call_1 (b->close_event, data->response_token.event); -+ grub_error (GRUB_ERR_IO, "Error! status=%d\n", (int)status); -+ return -1; -+ } -+ -+ while (!response_callback_done) -+ efi_call_1(http->poll, http); -+ -+ file->device->net->offset += data->response_message.body_length; -+ sum += data->response_message.body_length; -+ buf += data->response_message.body_length; -+ len -= data->response_message.body_length; ++ grub_memcpy (buf, (char *)file->data + file->device->net->offset, r); ++ file->device->net->offset += r; + } + -+ efi_call_1 (b->close_event, data->response_token.event); -+ -+ return sum; ++ return r; +} + +struct grub_efi_net_io io_http = @@ -1118,7 +1198,7 @@ index 0000000..816a3cd + }; diff --git a/grub-core/net/efi/ip4_config.c b/grub-core/net/efi/ip4_config.c new file mode 100644 -index 0000000..b711a5d +index 000000000..b711a5d94 --- /dev/null +++ b/grub-core/net/efi/ip4_config.c @@ -0,0 +1,398 @@ @@ -1522,7 +1602,7 @@ index 0000000..b711a5d + }; diff --git a/grub-core/net/efi/ip6_config.c b/grub-core/net/efi/ip6_config.c new file mode 100644 -index 0000000..017c4d0 +index 000000000..017c4d05b --- /dev/null +++ b/grub-core/net/efi/ip6_config.c @@ -0,0 +1,422 @@ @@ -1950,7 +2030,7 @@ index 0000000..017c4d0 + }; diff --git a/grub-core/net/efi/net.c b/grub-core/net/efi/net.c new file mode 100644 -index 0000000..0bac343 +index 000000000..0bac343b4 --- /dev/null +++ b/grub-core/net/efi/net.c @@ -0,0 +1,1428 @@ @@ -3384,7 +3464,7 @@ index 0000000..0bac343 +} diff --git a/grub-core/net/efi/pxe.c b/grub-core/net/efi/pxe.c new file mode 100644 -index 0000000..4b6b48c +index 000000000..4b6b48cb1 --- /dev/null +++ b/grub-core/net/efi/pxe.c @@ -0,0 +1,424 @@ @@ -3813,7 +3893,7 @@ index 0000000..4b6b48c + }; + diff --git a/grub-core/net/net.c b/grub-core/net/net.c -index 5cc0d2f..02bbe95 100644 +index 5cc0d2f3b..02bbe956b 100644 --- a/grub-core/net/net.c +++ b/grub-core/net/net.c @@ -32,6 +32,9 @@ @@ -3923,7 +4003,7 @@ index 5cc0d2f..02bbe95 100644 +#endif } diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h -index 99ba068..cfedd78 100644 +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]; @@ -4175,7 +4255,7 @@ index 99ba068..cfedd78 100644 diff --git a/include/grub/efi/dhcp.h b/include/grub/efi/dhcp.h new file mode 100644 -index 0000000..fdb88eb +index 000000000..fdb88eb81 --- /dev/null +++ b/include/grub/efi/dhcp.h @@ -0,0 +1,343 @@ @@ -4524,7 +4604,7 @@ index 0000000..fdb88eb +#endif /* ! GRUB_EFI_DHCP_HEADER */ diff --git a/include/grub/efi/http.h b/include/grub/efi/http.h new file mode 100644 -index 0000000..c5e9a89 +index 000000000..c5e9a89f5 --- /dev/null +++ b/include/grub/efi/http.h @@ -0,0 +1,215 @@ @@ -4745,7 +4825,7 @@ index 0000000..c5e9a89 +#endif /* !GRUB_EFI_HTTP_HEADER */ diff --git a/include/grub/net/efi.h b/include/grub/net/efi.h new file mode 100644 -index 0000000..de90d22 +index 000000000..de90d223e --- /dev/null +++ b/include/grub/net/efi.h @@ -0,0 +1,144 @@ @@ -4894,7 +4974,7 @@ index 0000000..de90d22 + +#endif /* ! GRUB_NET_EFI_HEADER */ diff --git a/util/grub-mknetdir.c b/util/grub-mknetdir.c -index 82073d5..ae31271 100644 +index 82073d5cc..ae31271bb 100644 --- a/util/grub-mknetdir.c +++ b/util/grub-mknetdir.c @@ -32,13 +32,15 @@ @@ -4976,5 +5056,5 @@ index 82073d5..ae31271 100644 if (!grub_install_source_directory) { -- -2.6.2 +2.13.6 diff --git a/grub2-btrfs-09-get-default-subvolume.patch b/grub2-btrfs-09-get-default-subvolume.patch index 2fb991f..5d039c2 100644 --- a/grub2-btrfs-09-get-default-subvolume.patch +++ b/grub2-btrfs-09-get-default-subvolume.patch @@ -1,8 +1,8 @@ -Index: grub-2.02~beta2/grub-core/fs/btrfs.c +Index: grub-2.02/grub-core/fs/btrfs.c =================================================================== ---- grub-2.02~beta2.orig/grub-core/fs/btrfs.c -+++ grub-2.02~beta2/grub-core/fs/btrfs.c -@@ -2439,6 +2439,238 @@ 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; } @@ -198,6 +198,10 @@ Index: grub-2.02~beta2/grub-core/fs/btrfs.c + } + + id = subvolid; ++ ++ if (id == GRUB_BTRFS_ROOT_VOL_OBJECTID) ++ subvol = grub_strdup (""); ++ else + while (id != GRUB_BTRFS_ROOT_VOL_OBJECTID) + { + grub_uint64_t parent_id; @@ -241,7 +245,7 @@ Index: grub-2.02~beta2/grub-core/fs/btrfs.c static struct grub_fs grub_btrfs_fs = { .name = "btrfs", .dir = grub_btrfs_dir, -@@ -2457,6 +2689,7 @@ static struct grub_fs grub_btrfs_fs = { +@@ -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; @@ -249,7 +253,7 @@ Index: grub-2.02~beta2/grub-core/fs/btrfs.c static char * subvolid_set_env (struct grub_env_var *var __attribute__ ((unused)), -@@ -2527,6 +2760,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); diff --git a/grub2-btrfs-workaround-grub2-once.patch b/grub2-grubenv-in-btrfs-header.patch similarity index 92% rename from grub2-btrfs-workaround-grub2-once.patch rename to grub2-grubenv-in-btrfs-header.patch index d4d0780..3311068 100644 --- a/grub2-btrfs-workaround-grub2-once.patch +++ b/grub2-grubenv-in-btrfs-header.patch @@ -1,7 +1,12 @@ -Index: grub-2.02~rc2/grub-core/kern/fs.c +GRUB cannot write Btrfs file systems from the bootloader, so it cannot +modify values set from userspace (e.g. "next_entry" set by grub2-once). +As a workaround use the Btrfs header to store known data of the GRUB environment +block. +--- +Index: grub-2.02/grub-core/kern/fs.c =================================================================== ---- grub-2.02~rc2.orig/grub-core/kern/fs.c -+++ grub-2.02~rc2/grub-core/kern/fs.c +--- grub-2.02.orig/grub-core/kern/fs.c ++++ grub-2.02/grub-core/kern/fs.c @@ -27,6 +27,7 @@ #include #include @@ -24,10 +29,10 @@ Index: grub-2.02~rc2/grub-core/kern/fs.c ret += size; len -= size; sector -= ((size + offset) >> GRUB_DISK_SECTOR_BITS); -Index: grub-2.02~rc2/util/grub-editenv.c +Index: grub-2.02/util/grub-editenv.c =================================================================== ---- grub-2.02~rc2.orig/util/grub-editenv.c -+++ grub-2.02~rc2/util/grub-editenv.c +--- grub-2.02.orig/util/grub-editenv.c ++++ grub-2.02/util/grub-editenv.c @@ -23,8 +23,11 @@ #include #include @@ -239,13 +244,14 @@ Index: grub-2.02~rc2/util/grub-editenv.c set_variables (const char *name, int argc, char *argv[]) { grub_envblk_t envblk; -@@ -217,8 +393,26 @@ set_variables (const char *name, int arg +@@ -217,8 +393,27 @@ set_variables (const char *name, int arg *(p++) = 0; - if (! grub_envblk_set (envblk, argv[0], p)) - grub_util_error ("%s", _("environment block too small")); -+ if (strcmp (argv[0], "next_entry") == 0 && fs_envblk) ++ if ((strcmp (argv[0], "next_entry") == 0 || ++ strcmp (argv[0], "health_checker_flag") == 0) && fs_envblk) + { + grub_envblk_t envblk_fs; + envblk_fs = open_envblk_fs (envblk); @@ -268,7 +274,7 @@ Index: grub-2.02~rc2/util/grub-editenv.c argc--; argv++; -@@ -226,26 +420,158 @@ set_variables (const char *name, int arg +@@ -226,26 +421,158 @@ set_variables (const char *name, int arg write_envblk (name, envblk); grub_envblk_close (envblk); @@ -427,7 +433,7 @@ Index: grub-2.02~rc2/util/grub-editenv.c int main (int argc, char *argv[]) { -@@ -277,6 +603,9 @@ main (int argc, char *argv[]) +@@ -277,6 +604,9 @@ main (int argc, char *argv[]) command = argv[curindex++]; } @@ -437,10 +443,10 @@ Index: grub-2.02~rc2/util/grub-editenv.c if (strcmp (command, "create") == 0) grub_util_create_envblk_file (filename); else if (strcmp (command, "list") == 0) -Index: grub-2.02~rc2/util/grub.d/00_header.in +Index: grub-2.02/util/grub.d/00_header.in =================================================================== ---- grub-2.02~rc2.orig/util/grub.d/00_header.in -+++ grub-2.02~rc2/util/grub.d/00_header.in +--- grub-2.02.orig/util/grub.d/00_header.in ++++ grub-2.02/util/grub.d/00_header.in @@ -46,6 +46,11 @@ cat << EOF if [ -s \$prefix/grubenv ]; then load_env diff --git a/grub2-xen-pv-firmware.cfg b/grub2-xen-pv-firmware.cfg index 757b392..e8e02f7 100644 --- a/grub2-xen-pv-firmware.cfg +++ b/grub2-xen-pv-firmware.cfg @@ -4,6 +4,8 @@ insmod search insmod configfile insmod legacy_configfile insmod lvm +insmod mdraid09 +insmod mdraid1x set debian_cddev="" set debian_cdarch="" diff --git a/grub2.changes b/grub2.changes index de6a9db..5e38227 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,25 @@ +------------------------------------------------------------------- +Mon Mar 12 07:31:10 UTC 2018 - mchang@suse.com + +- Fix UEFI HTTPS Boot from ISO installation image (bsc#1076132) + * 0001-add-support-for-UEFI-network-protocols.patch + +------------------------------------------------------------------- +Tue Mar 6 08:21:43 UTC 2018 - mchang@suse.com + +- fix wrong command output when default subvolume is toplevel tree with + id 5 (bsc#1078775) + * grub2-btrfs-09-get-default-subvolume.patch +- insert mdraid modules to support software RAID (bsc#1078775) + * grub2-xen-pv-firmware.cfg + +------------------------------------------------------------------- +Thu Mar 1 18:36:33 UTC 2018 - iforster@suse.com + +- Rename grub2-btrfs-workaround-grub2-once.patch to + grub2-grubenv-in-btrfs-header.patch +- Store GRUB environment variable health_checker_flag in Btrfs header + ------------------------------------------------------------------- Tue Feb 13 09:05:45 UTC 2018 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index e44127a..8cff954 100644 --- a/grub2.spec +++ b/grub2.spec @@ -197,7 +197,7 @@ Patch58: grub2-xen-linux16.patch Patch59: grub2-efi-disable-video-cirrus-and-bochus.patch Patch60: grub2-editenv-add-warning-message.patch Patch61: grub2-vbe-blacklist-preferred-1440x900x32.patch -Patch64: grub2-btrfs-workaround-grub2-once.patch +Patch64: grub2-grubenv-in-btrfs-header.patch Patch65: grub2-mkconfig-aarch64.patch Patch70: grub2-default-distributor.patch Patch71: grub2-menu-unrestricted.patch From b99bc51d5e6b5c1107c2322de21aefe675fffb82c3b9b4cfa0c030274ec43d53 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Fri, 30 Mar 2018 10:01:00 +0000 Subject: [PATCH 25/57] Accepting request 591814 from Base:System OBS-URL: https://build.opensuse.org/request/show/591814 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=179 --- grub2-Fix-incorrect-netmask-on-ppc64.patch | 40 ++++++++++++++++++++++ grub2.changes | 6 ++++ grub2.spec | 8 +++-- 3 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 grub2-Fix-incorrect-netmask-on-ppc64.patch diff --git a/grub2-Fix-incorrect-netmask-on-ppc64.patch b/grub2-Fix-incorrect-netmask-on-ppc64.patch new file mode 100644 index 0000000..3cf4ba6 --- /dev/null +++ b/grub2-Fix-incorrect-netmask-on-ppc64.patch @@ -0,0 +1,40 @@ +From: Masahiro Matsuya + +The netmask configured in firmware is not respected on ppc64 (big endian). +When 255.255.252.0 is set as netmask in firmware, the following is the value of bootpath string in grub_ieee1275_parse_bootpath(). + + /vdevice/l-lan@30000002:speed=auto,duplex=auto,192.168.88.10,,192.168.89.113,192.168.88.1,5,5,255.255.252.0,512 + +The netmask in this bootpath is no problem, since it's a value specified in firmware. But, +The value of 'subnet_mask.ipv4' was set with 0xfffffc00, and __builtin_ctz (~grub_le_to_cpu32 (subnet_mask.ipv4)) returned 16 (not 22). +As a result, 16 was used for netmask wrongly. + +1111 1111 1111 1111 1111 1100 0000 0000 # subnet_mask.ipv4 (=0xfffffc00) +0000 0000 1111 1100 1111 1111 1111 1111 # grub_le_to_cpu32 (subnet_mask.ipv4) +1111 1111 0000 0011 0000 0000 0000 0000 # ~grub_le_to_cpu32 (subnet_mask.ipv4) + +And, the count of zero with __builtin_ctz can be 16. +This patch changes it as below. + +1111 1111 1111 1111 1111 1100 0000 0000 # subnet_mask.ipv4 (=0xfffffc00) +0000 0000 1111 1100 1111 1111 1111 1111 # grub_le_to_cpu32 (subnet_mask.ipv4) +1111 1111 1111 1111 1111 1100 0000 0000 # grub_swap_bytes32(grub_le_to_cpu32 (subnet_mask.ipv4)) +0000 0000 0000 0000 0000 0011 1111 1111 # ~grub_swap_bytes32(grub_le_to_cpu32 (subnet_mask.ipv4)) + +The count of zero with __builtin_clz can be 22. (clz counts the number of one bits preceding the most significant zero bit) +--- + grub-core/net/drivers/ieee1275/ofnet.c | 2 +- + 1 file changed, 1 insertion(+), 2 deletions(-) + +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) diff --git a/grub2.changes b/grub2.changes index 5e38227..73f3fde 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Mon Mar 26 11:37:13 UTC 2018 - msuchanek@suse.com + +- Fix incorrect netmask on ppc64 (bsc#1085419) + * grub2-Fix-incorrect-netmask-on-ppc64.patch + ------------------------------------------------------------------- Mon Mar 12 07:31:10 UTC 2018 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 8cff954..23d9817 100644 --- a/grub2.spec +++ b/grub2.spec @@ -213,8 +213,7 @@ Patch81: grub2-lvm-allocate-metadata-buffer-from-raw-contents.patch 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-install-remove-useless-check-PReP-partition-is-empty.patch -Patch86: grub2-getroot-scan-disk-pv.patch +Patch85: grub2-getroot-scan-disk-pv.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 @@ -247,6 +246,8 @@ Patch234: fix-grub2-use-stat-instead-of-udevadm-for-partition-lookup-with- Patch235: 0002-Add-Virtual-LAN-support.patch Patch236: grub2-efi_gop-avoid-low-resolution.patch Patch277: grub2-ppc64-cas-reboot-support.patch +Patch278: grub2-install-remove-useless-check-PReP-partition-is-empty.patch +Patch279: grub2-Fix-incorrect-netmask-on-ppc64.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 @@ -492,7 +493,6 @@ swap partition while in resuming %patch83 -p1 %patch84 -p1 %patch85 -p1 -%patch86 -p1 %patch101 -p1 %patch102 -p1 %patch103 -p1 @@ -519,6 +519,8 @@ swap partition while in resuming %patch235 -p1 %patch236 -p1 %patch277 -p1 +%patch278 -p1 +%patch279 -p1 %patch280 -p1 %patch281 -p1 %patch282 -p1 From b859f8d8987fa7c74970632a8771d052296e6309741fa5cdef20c75b1fd37552 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Thu, 5 Apr 2018 13:27:13 +0000 Subject: [PATCH 26/57] Accepting request 593091 from Base:System OBS-URL: https://build.opensuse.org/request/show/593091 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=180 --- ...n-GRUB2-accesses-non-enabled-MMIO-da.patch | 46 +++++++++++++ ...ix-packed-not-aligned-error-on-GCC-8.patch | 67 +++++++++++++++++++ grub2.changes | 13 ++++ grub2.spec | 4 ++ 4 files changed, 130 insertions(+) create mode 100644 0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch create mode 100644 0001-Fix-packed-not-aligned-error-on-GCC-8.patch diff --git a/0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch b/0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch new file mode 100644 index 0000000..fe17577 --- /dev/null +++ b/0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch @@ -0,0 +1,46 @@ +From 2f06e09673e48f6a91486a8ad38f45c160d537fe Mon Sep 17 00:00:00 2001 +From: "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 +--- + 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 + diff --git a/0001-Fix-packed-not-aligned-error-on-GCC-8.patch b/0001-Fix-packed-not-aligned-error-on-GCC-8.patch new file mode 100644 index 0000000..73efa00 --- /dev/null +++ b/0001-Fix-packed-not-aligned-error-on-GCC-8.patch @@ -0,0 +1,67 @@ +From 721f75ff7de467717658d2de9c20bbb18145790a Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Tested-by: Michael Chang +--- + 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 + diff --git a/grub2.changes b/grub2.changes index 73f3fde..851b5ec 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,16 @@ +------------------------------------------------------------------- +Mon Apr 2 08:30:05 UTC 2018 - mchang@suse.com + +- Fix Nvidia GPU in legacy I/O slot 2 disappears during system + startup (bsc#1082914) + * 0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch + +------------------------------------------------------------------- +Fri Mar 30 09:16:06 UTC 2018 - mchang@suse.com + +- Fix packed-not-aligned error on GCC 8 (bsc#1084632) + * 0001-Fix-packed-not-aligned-error-on-GCC-8.patch + ------------------------------------------------------------------- Mon Mar 26 11:37:13 UTC 2018 - msuchanek@suse.com diff --git a/grub2.spec b/grub2.spec index 23d9817..40308d8 100644 --- a/grub2.spec +++ b/grub2.spec @@ -214,6 +214,8 @@ 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 # Btrfs snapshot booting related patches Patch101: grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch Patch102: grub2-btrfs-02-export-subvolume-envvars.patch @@ -493,6 +495,8 @@ swap partition while in resuming %patch83 -p1 %patch84 -p1 %patch85 -p1 +%patch86 -p1 +%patch87 -p1 %patch101 -p1 %patch102 -p1 %patch103 -p1 From 5d4d9a9ad3efdba8a3fd20f9a863e5670f3e8e8f417bbea80985ec89b4d232a0 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Tue, 17 Apr 2018 09:09:31 +0000 Subject: [PATCH 27/57] Accepting request 597264 from Base:System OBS-URL: https://build.opensuse.org/request/show/597264 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=181 --- grub2-efi-xen-removable.patch | 113 ++++++++++++++++++ grub2-suse-remove-linux-root-param.patch | 38 +++--- grub2.changes | 14 +++ grub2.spec | 4 + ...oid-atexit-handlers-when-child-exits.patch | 70 +++++++++++ 5 files changed, 220 insertions(+), 19 deletions(-) create mode 100644 grub2-efi-xen-removable.patch create mode 100644 unix-exec-avoid-atexit-handlers-when-child-exits.patch diff --git a/grub2-efi-xen-removable.patch b/grub2-efi-xen-removable.patch new file mode 100644 index 0000000..6380b93 --- /dev/null +++ b/grub2-efi-xen-removable.patch @@ -0,0 +1,113 @@ +From: Michael Chang +References: bsc#1085842 +Patch-Mainline: no + +The grub can be installed with removable option to support booting from +removable media with standard UEFI default file path of the form: + \EFI\BOOT\BOOT{machine type short-name}.EFI + +It does not make use of distributor directory, which becomes a problem for UEFI +Xen installation as it requires that directory to be present for storing xen +stuff like chainloaded hypervisor, xen kernel and so on. Moreover it makes bad +assumption that hypervisor will be chainloaded by grub under the same +directory, which is also not always true. + +This patch fixes the problem by ensuring the directory available to Xen +installation if any Xen hypervisor found and independent to grub boot path +$cmdpath to work. + +Index: grub-2.02/util/grub.d/20_linux_xen.in +=================================================================== +--- grub-2.02.orig/util/grub.d/20_linux_xen.in ++++ grub-2.02/util/grub.d/20_linux_xen.in +@@ -91,31 +91,6 @@ esac + + title_correction_code= + +-if [ -d /sys/firmware/efi ]; then +- is_efi=true +- err_msg="" +- efi_dir="/boot/efi/efi/${os}" +- grub_dir=/boot/@PACKAGE@ +- xen_dir=/usr/lib64/efi +- for d in $grub_dir $efi_dir $xen_dir; do +- [ ! -d "$d" ] || continue +- err_msg="${err_msg}$ME: Essential directory '$d' not found!\n" +- done +- if ! [ -d "$efi_dir" -a -d "$grub_dir" -a -d "$xen_dir" ]; then +- err_msg="${err_msg}$ME: XEN configuration skipped!\n" +- else +- rm -f $grub_dir/xen*.cfg +- if [ -s $efi_dir/grub.xen-files ]; then +- for f in $(sort $efi_dir/grub.xen-files| uniq); do +- rm -f $efi_dir/$f +- done +- : > $efi_dir/grub.xen-files +- fi +- fi +-else +- is_efi=false +-fi +- + grub2_unquote () + { + awk ' +@@ -223,10 +198,15 @@ linux_entry () + kernel=${basename} root=${linux_root_device_thisversion} ${args_unq} + ramdisk=${initrd} + EOF ++ if [ -z "${prepare_efi_cache}" ]; then ++ grub_device_efi="`${grub_probe} --target=device /boot/efi`" ++ prepare_efi_cache="$(prepare_grub_to_access_device ${grub_device_efi} | grub_add_tab)" ++ fi ++ printf '%s\n' "${prepare_efi_cache}" | sed "s/^/$submenu_indentation/" + message="$(gettext_printf "Loading Xen %s with Linux %s ..." ${xen_version} ${version})" + sed "s/^/$submenu_indentation/" <<-EOF + echo '$(echo "$message" | grub_quote)' +- chainloader \$cmdpath/${xen_basename} ${xen_basename} ${SUSE_CMDLINE_XENEFI} $section ++ chainloader ${rel_efi_dir}/${xen_basename} ${xen_basename} ${SUSE_CMDLINE_XENEFI} $section + } + EOF + for f in ${grub_dir}/$xen_cfg ${xen_dir}/${xen_basename} ${dirname}/${basename} ${dirname}/${initrd}; do +@@ -307,6 +287,7 @@ else + done + fi + prepare_boot_cache= ++prepare_efi_cache= + boot_device_id= + + title_correction_code= +@@ -327,6 +308,33 @@ submenu_indentation="" + + is_top_level=true + ++if [ -d /sys/firmware/efi ] && [ "x${xen_list}" != "x" ]; then ++ is_efi=true ++ err_msg="" ++ efi_dir="/boot/efi/efi/${os}" ++ grub_dir=/boot/grub2 ++ xen_dir=/usr/lib64/efi ++ for d in $grub_dir $xen_dir; do ++ [ ! -d "$d" ] || continue ++ err_msg="${err_msg}$ME: Essential directory '$d' not found!\n" ++ done ++ if ! [ -d "$grub_dir" -a -d "$xen_dir" ]; then ++ err_msg="${err_msg}$ME: XEN configuration skipped!\n" ++ else ++ mkdir -p $efi_dir ++ rel_efi_dir=`make_system_path_relative_to_its_root $efi_dir` ++ rm -f $grub_dir/xen*.cfg ++ if [ -s $efi_dir/grub.xen-files ]; then ++ for f in $(sort $efi_dir/grub.xen-files| uniq); do ++ rm -f $efi_dir/$f ++ done ++ : > $efi_dir/grub.xen-files ++ fi ++ fi ++else ++ is_efi=false ++fi ++ + while [ "x${xen_list}" != "x" ] ; do + list="${linux_list}" + current_xen=`version_find_latest $xen_list` diff --git a/grub2-suse-remove-linux-root-param.patch b/grub2-suse-remove-linux-root-param.patch index 8741031..356b10f 100644 --- a/grub2-suse-remove-linux-root-param.patch +++ b/grub2-suse-remove-linux-root-param.patch @@ -1,8 +1,8 @@ -Index: grub-2.02~beta2/util/grub-mkconfig.in +Index: grub-2.02/util/grub-mkconfig.in =================================================================== ---- grub-2.02~beta2.orig/util/grub-mkconfig.in -+++ grub-2.02~beta2/util/grub-mkconfig.in -@@ -261,7 +261,8 @@ export GRUB_DEFAULT \ +--- grub-2.02.orig/util/grub-mkconfig.in ++++ grub-2.02/util/grub-mkconfig.in +@@ -268,7 +268,8 @@ export GRUB_DEFAULT \ GRUB_CMDLINE_LINUX_RECOVERY \ GRUB_USE_LINUXEFI \ SUSE_BTRFS_SNAPSHOT_BOOTING \ @@ -12,11 +12,11 @@ Index: grub-2.02~beta2/util/grub-mkconfig.in if test "x${grub_cfg}" != "x"; then rm -f "${grub_cfg}.new" -Index: grub-2.02~beta2/util/grub.d/10_linux.in +Index: grub-2.02/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 -@@ -66,7 +66,7 @@ case x"$GRUB_FS" in +--- grub-2.02.orig/util/grub.d/10_linux.in ++++ grub-2.02/util/grub.d/10_linux.in +@@ -64,7 +64,7 @@ case x"$GRUB_FS" in else rootsubvol="`make_system_path_relative_to_its_root /`" rootsubvol="${rootsubvol#/}" @@ -25,7 +25,7 @@ Index: grub-2.02~beta2/util/grub.d/10_linux.in GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}" fi fi;; -@@ -77,6 +77,10 @@ case x"$GRUB_FS" in +@@ -75,6 +75,10 @@ case x"$GRUB_FS" in ;; esac @@ -36,11 +36,11 @@ Index: grub-2.02~beta2/util/grub.d/10_linux.in title_correction_code= hotkey=1 -Index: grub-2.02~beta2/util/grub.d/20_linux_xen.in +Index: grub-2.02/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 -@@ -80,7 +80,7 @@ case x"$GRUB_FS" in +--- grub-2.02.orig/util/grub.d/20_linux_xen.in ++++ grub-2.02/util/grub.d/20_linux_xen.in +@@ -78,7 +78,7 @@ case x"$GRUB_FS" in else rootsubvol="`make_system_path_relative_to_its_root /`" rootsubvol="${rootsubvol#/}" @@ -49,7 +49,7 @@ Index: grub-2.02~beta2/util/grub.d/20_linux_xen.in GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}" fi fi;; -@@ -91,6 +91,10 @@ case x"$GRUB_FS" in +@@ -89,6 +89,10 @@ case x"$GRUB_FS" in ;; esac @@ -59,12 +59,12 @@ Index: grub-2.02~beta2/util/grub.d/20_linux_xen.in + title_correction_code= - if [ -d /sys/firmware/efi ]; then -Index: grub-2.02~beta2/util/s390x/zipl2grub.pl.in + grub2_unquote () +Index: grub-2.02/util/s390x/zipl2grub.pl.in =================================================================== ---- grub-2.02~beta2.orig/util/s390x/zipl2grub.pl.in -+++ grub-2.02~beta2/util/s390x/zipl2grub.pl.in -@@ -361,9 +361,13 @@ while ( ) { +--- grub-2.02.orig/util/s390x/zipl2grub.pl.in ++++ grub-2.02/util/s390x/zipl2grub.pl.in +@@ -367,9 +367,13 @@ while ( ) { } else { $v = ""; } diff --git a/grub2.changes b/grub2.changes index 851b5ec..b74b4d4 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,17 @@ +------------------------------------------------------------------- +Thu Apr 12 08:41:39 UTC 2018 - mchang@suse.com + +- Fix error of essential directory not found on UEFI Xen host (bsc#1085842) + * add grub2-efi-xen-removable.patch + * rediff grub2-suse-remove-linux-root-param.patch + +------------------------------------------------------------------- +Tue Apr 10 15:12:28 CEST 2018 - jdelvare@suse.de + +- Fix corruption of "grub2-install --help" and grub2-install manual + page (bsc#1086670) + * unix-exec-avoid-atexit-handlers-when-child-exits.patch + ------------------------------------------------------------------- Mon Apr 2 08:30:05 UTC 2018 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 40308d8..1d7e6bb 100644 --- a/grub2.spec +++ b/grub2.spec @@ -216,6 +216,7 @@ 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 # Btrfs snapshot booting related patches Patch101: grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch Patch102: grub2-btrfs-02-export-subvolume-envvars.patch @@ -231,6 +232,7 @@ Patch120: grub2-efi-xen-chainload.patch Patch121: grub2-efi-chainloader-root.patch Patch122: grub2-efi-xen-cmdline.patch Patch123: grub2-efi-xen-cfg-unquote.patch +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 @@ -497,6 +499,7 @@ swap partition while in resuming %patch85 -p1 %patch86 -p1 %patch87 -p1 +%patch88 -p1 %patch101 -p1 %patch102 -p1 %patch103 -p1 @@ -510,6 +513,7 @@ swap partition while in resuming %patch121 -p1 %patch122 -p1 %patch123 -p1 +%patch124 -p1 %patch140 -p1 %patch141 -p1 %patch150 -p1 diff --git a/unix-exec-avoid-atexit-handlers-when-child-exits.patch b/unix-exec-avoid-atexit-handlers-when-child-exits.patch new file mode 100644 index 0000000..3a5fcfb --- /dev/null +++ b/unix-exec-avoid-atexit-handlers-when-child-exits.patch @@ -0,0 +1,70 @@ +From: Patrick Steinhardt +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 +--- + 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)) From 1d3700b58ffb15c4904b484dcd9fcc3cab7da75e083bbf52244cab48c6e37eb6 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Sun, 22 Apr 2018 12:34:07 +0000 Subject: [PATCH 28/57] Accepting request 598028 from Base:System OBS-URL: https://build.opensuse.org/request/show/598028 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=182 --- grub2-ieee1275-open-raw-mode.patch | 60 ++++++++++++++++++++++++++++++ grub2.changes | 6 +++ grub2.spec | 19 ++++++---- 3 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 grub2-ieee1275-open-raw-mode.patch diff --git a/grub2-ieee1275-open-raw-mode.patch b/grub2-ieee1275-open-raw-mode.patch new file mode 100644 index 0000000..468412c --- /dev/null +++ b/grub2-ieee1275-open-raw-mode.patch @@ -0,0 +1,60 @@ +From: diegodo@br.ibm.com +References: bsc#1071559 +Patch-Mainline: no + +Because Openfirmware returns invalid ihandler when it tries to open a disk +which his first partition is not a supported one by the firmware (Prep, FAT, +ISO), the grub needs to understand when it should open the disk in "raw mode", +appending a ":0" in the end of the device path. + +Openfirmware is unable to open disk that contains a unknown first partition +(i.e it is not a PreP, Fat, ISO) ; We needed to open the disk in "raw mode" and +so Grub was required to take care of partitions and contents. + +Index: grub-2.02/grub-core/kern/ieee1275/ieee1275.c +=================================================================== +--- grub-2.02.orig/grub-core/kern/ieee1275/ieee1275.c ++++ grub-2.02/grub-core/kern/ieee1275/ieee1275.c +@@ -19,6 +19,8 @@ + + #include + #include ++#include ++#include + + #define IEEE1275_PHANDLE_INVALID ((grub_ieee1275_cell_t) -1) + #define IEEE1275_IHANDLE_INVALID ((grub_ieee1275_cell_t) 0) +@@ -458,8 +460,31 @@ grub_ieee1275_open (const char *path, gr + if (IEEE1275_CALL_ENTRY_FN (&args) == -1) + return -1; + *result = args.result; +- if (args.result == IEEE1275_IHANDLE_INVALID) +- return -1; ++ if (args.result == IEEE1275_IHANDLE_INVALID){ ++ ++ int path_len = grub_strlen(path); ++ if ((path[path_len-3] == ':') && (path[path_len-2] == '0')){ ++ return -1; ++ } ++ ++ char *new_path = grub_malloc(grub_strlen(path) + 3); ++ char *optr; ++ optr = grub_stpcpy (new_path, path); ++ *optr++ = ':'; ++ *optr++ = '0'; ++ *optr++ = '\0'; ++ ++ args.path = (grub_ieee1275_cell_t) new_path; ++ ++ if (IEEE1275_CALL_ENTRY_FN (&args) == -1) ++ return -1; ++ ++ *result = args.result; ++ if (args.result == IEEE1275_IHANDLE_INVALID) ++ return -1; ++ ++ } ++ + return 0; + } + diff --git a/grub2.changes b/grub2.changes index b74b4d4..6c97146 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Tue Apr 17 07:54:15 UTC 2018 - mchang@suse.com + +- Fallback to raw mode if Open Firmware returns invalid ihandler (bsc#1071559) + * grub2-ieee1275-open-raw-mode.patch + ------------------------------------------------------------------- Thu Apr 12 08:41:39 UTC 2018 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 1d7e6bb..d6e6d17 100644 --- a/grub2.spec +++ b/grub2.spec @@ -245,13 +245,15 @@ Patch164: grub2-suse-remove-linux-root-param.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 +Patch214: grub2-ieee1275-open-raw-mode.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 -Patch235: 0002-Add-Virtual-LAN-support.patch Patch236: grub2-efi_gop-avoid-low-resolution.patch -Patch277: grub2-ppc64-cas-reboot-support.patch -Patch278: grub2-install-remove-useless-check-PReP-partition-is-empty.patch -Patch279: grub2-Fix-incorrect-netmask-on-ppc64.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 @@ -522,13 +524,14 @@ swap partition while in resuming %patch164 -p1 %patch205 -p1 %patch207 -p1 +%patch210 -p1 +%patch211 -p1 +%patch212 -p1 +%patch213 -p1 +%patch214 -p1 %patch233 -p1 %patch234 -p1 -%patch235 -p1 %patch236 -p1 -%patch277 -p1 -%patch278 -p1 -%patch279 -p1 %patch280 -p1 %patch281 -p1 %patch282 -p1 From 1dbf82a478472c5ad56c51a31216f4acc5ca00c9e1e1f138d70089606ed6b98c Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Sun, 13 May 2018 13:53:21 +0000 Subject: [PATCH 29/57] Accepting request 605634 from Base:System OBS-URL: https://build.opensuse.org/request/show/605634 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=183 --- grub2-freetype-pkgconfig.patch | 165 +++++++++++++++++++++++++++++++++ grub2.changes | 6 ++ grub2.spec | 5 +- 3 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 grub2-freetype-pkgconfig.patch diff --git a/grub2-freetype-pkgconfig.patch b/grub2-freetype-pkgconfig.patch new file mode 100644 index 0000000..068792a --- /dev/null +++ b/grub2-freetype-pkgconfig.patch @@ -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; + }; diff --git a/grub2.changes b/grub2.changes index 6c97146..ff70e78 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Fri May 4 08:07:09 UTC 2018 - idonmez@suse.com + +- Add grub2-freetype-pkgconfig.patch to fix build with new freetype + use pkgconfig to find Freetype libraries. + ------------------------------------------------------------------- Tue Apr 17 07:54:15 UTC 2018 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index d6e6d17..c9ef60b 100644 --- a/grub2.spec +++ b/grub2.spec @@ -139,7 +139,7 @@ BuildRequires: update-bootloader-rpm-macros Version: 2.02 Release: 0 Summary: Bootloader with support for Linux, Multiboot and more -License: GPL-3.0+ +License: GPL-3.0-or-later Group: System/Boot Url: http://www.gnu.org/software/grub/ %define rev 20120622 @@ -285,6 +285,8 @@ Patch421: 0002-AUDIT-0-http-boot-tracker-bug.patch # check if default entry need to be corrected for updated distributor version # and/or use fallback entry if default kernel entry removed (bsc#1065349) Patch430: grub2-mkconfig-default-entry-correction.patch +# Use pkg-config to find Freetype2 +Patch500: grub2-freetype-pkgconfig.patch Requires: gettext-runtime %if 0%{?suse_version} >= 1140 @@ -557,6 +559,7 @@ swap partition while in resuming %patch420 -p1 %patch421 -p1 %patch430 -p1 +%patch500 -p1 %build # patches above may update the timestamp of grub.texi From 796a10711d5011409da0a114a26c0b1728fb4b28a4bf65209726cef92abf9817 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Wed, 23 May 2018 14:06:18 +0000 Subject: [PATCH 30/57] Accepting request 609945 from Base:System OBS-URL: https://build.opensuse.org/request/show/609945 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=184 --- grub2-s390x-10-keep-network-at-kexec.patch | 17 +++++++++++++++++ grub2.changes | 6 ++++++ grub2.spec | 2 ++ 3 files changed, 25 insertions(+) create mode 100644 grub2-s390x-10-keep-network-at-kexec.patch diff --git a/grub2-s390x-10-keep-network-at-kexec.patch b/grub2-s390x-10-keep-network-at-kexec.patch new file mode 100644 index 0000000..e2594fb --- /dev/null +++ b/grub2-s390x-10-keep-network-at-kexec.patch @@ -0,0 +1,17 @@ +Index: grub-2.02/grub-core/loader/emu/linux.c +=================================================================== +--- grub-2.02.orig/grub-core/loader/emu/linux.c ++++ grub-2.02/grub-core/loader/emu/linux.c +@@ -76,9 +76,10 @@ grub_linux_boot (void) + grub_fatal (N_("Error trying to perform 'systemctl kexec'")); + + /* need to check read-only root before resetting hard!? */ +- grub_printf("Performing 'kexec -e'"); ++ grub_printf("Performing 'kexec -e -x'"); + kexec[1] = "-e"; +- kexec[2] = NULL; ++ kexec[2] = "-x"; ++ kexec[3] = NULL; + rc = grub_util_exec(kexec); + if ( rc != GRUB_ERR_NONE ) + grub_fatal (N_("Error trying to directly perform 'kexec -e'.")); diff --git a/grub2.changes b/grub2.changes index ff70e78..cd75deb 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Wed May 16 09:07:08 UTC 2018 - Thomas.Blume@suse.com + +- grub2-emu on s390 keep network during kexec boot (bsc#1089493) + * grub2-s390x-10-keep-network-at-kexec.patch + ------------------------------------------------------------------- Fri May 4 08:07:09 UTC 2018 - idonmez@suse.com diff --git a/grub2.spec b/grub2.spec index c9ef60b..8bf7f6d 100644 --- a/grub2.spec +++ b/grub2.spec @@ -285,6 +285,7 @@ Patch421: 0002-AUDIT-0-http-boot-tracker-bug.patch # check if default entry need to be corrected for updated distributor version # and/or use fallback entry if default kernel entry removed (bsc#1065349) Patch430: grub2-mkconfig-default-entry-correction.patch +Patch431: grub2-s390x-10-keep-network-at-kexec.patch # Use pkg-config to find Freetype2 Patch500: grub2-freetype-pkgconfig.patch @@ -559,6 +560,7 @@ swap partition while in resuming %patch420 -p1 %patch421 -p1 %patch430 -p1 +%patch431 -p1 %patch500 -p1 %build From f3271bf16c2318974880746ee737a9fbae2d8ceee6709e977462210977e86f97 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Tue, 29 May 2018 14:45:55 +0000 Subject: [PATCH 31/57] Accepting request 612189 from Base:System OBS-URL: https://build.opensuse.org/request/show/612189 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=185 --- grub2.changes | 5 +++++ grub2.spec | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/grub2.changes b/grub2.changes index cd75deb..2834db2 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Thu May 24 11:02:04 CEST 2018 - kukuk@suse.de + +- Use %license instead of %doc [bsc#1082318] + ------------------------------------------------------------------- Wed May 16 09:07:08 UTC 2018 - Thomas.Blume@suse.com diff --git a/grub2.spec b/grub2.spec index 8bf7f6d..c7c222f 100644 --- a/grub2.spec +++ b/grub2.spec @@ -1020,7 +1020,8 @@ fi %files -f %{name}.lang %defattr(-,root,root,-) -%doc COPYING NEWS README +%license COPYING +%doc NEWS README %doc THANKS TODO ChangeLog %doc docs/autoiso.cfg docs/osdetect.cfg %ifarch s390x From a5083a196e808fc04781c7d627d9d33e43396397bdb3db8da785f0e101fdc6f7 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Mon, 25 Jun 2018 09:33:36 +0000 Subject: [PATCH 32/57] Accepting request 618170 from Base:System OBS-URL: https://build.opensuse.org/request/show/618170 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=186 --- grub2-btrfs-help-on-snapper-rollback.patch | 21 +++++++++++++++++++++ grub2.changes | 13 +++++++++++++ grub2.spec | 2 ++ 3 files changed, 36 insertions(+) create mode 100644 grub2-btrfs-help-on-snapper-rollback.patch diff --git a/grub2-btrfs-help-on-snapper-rollback.patch b/grub2-btrfs-help-on-snapper-rollback.patch new file mode 100644 index 0000000..f6e0f9e --- /dev/null +++ b/grub2-btrfs-help-on-snapper-rollback.patch @@ -0,0 +1,21 @@ +Index: grub-2.02/util/grub.d/00_header.in +=================================================================== +--- grub-2.02.orig/util/grub.d/00_header.in ++++ grub-2.02/util/grub.d/00_header.in +@@ -417,8 +417,14 @@ if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = + # Note: No $snapshot_num on *read-only* rollback! (bsc#901487) + cat <= 1140 @@ -562,6 +563,7 @@ swap partition while in resuming %patch430 -p1 %patch431 -p1 %patch500 -p1 +%patch501 -p1 %build # patches above may update the timestamp of grub.texi From 1a182dfb932dabc202b2ef7f043815f1839dfcaffb75f0998d77b75febc9b3d2 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Mon, 2 Jul 2018 21:28:14 +0000 Subject: [PATCH 33/57] Accepting request 619524 from Base:System OBS-URL: https://build.opensuse.org/request/show/619524 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=187 --- grub.default | 2 +- grub2.changes | 8 ++++++++ grub2.spec | 3 --- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/grub.default b/grub.default index 798fc4d..c75de63 100644 --- a/grub.default +++ b/grub.default @@ -33,7 +33,7 @@ GRUB_CMDLINE_LINUX="" #GRUB_DISABLE_LINUX_UUID=true # Uncomment to disable generation of recovery mode menu entries -#GRUB_DISABLE_LINUX_RECOVERY="true" +#GRUB_DISABLE_RECOVERY="true" # Uncomment to get a beep at grub start #GRUB_INIT_TUNE="480 440 1" diff --git a/grub2.changes b/grub2.changes index 64b3a93..052ca26 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Wed Jun 27 08:39:07 UTC 2018 - josef.moellers@suse.com + +- Replace "GRUB_DISABLE_LINUX_RECOVERY" by "GRUB_DISABLE_RECOVERY" + in /etc/default/grub and remove test from s390x install + section in upec file. + [bsc#1042433, grub.default, grub2.spec] + ------------------------------------------------------------------- Wed Jun 20 09:21:48 UTC 2018 - josef.moellers@suse.com diff --git a/grub2.spec b/grub2.spec index f389223..44726f0 100644 --- a/grub2.spec +++ b/grub2.spec @@ -852,9 +852,6 @@ perl -ni -e ' sub END() { print "\n# on s390x always:\nGRUB_DISABLE_OS_PROBER=true\n"; } - if ( s{^#(GRUB_DISABLE_LINUX_RECOVERY)=\"?(true)\"?}{$1=$2} ) { - $_ .= "GRUB_DISABLE_RECOVERY=true\n"; - } if ( s{^#?(GRUB_TERMINAL)=(console|gfxterm)}{$1=console} ) { $_ .= "GRUB_GFXPAYLOAD_LINUX=text\n"; } From ece8bc559ccdcb196e137703b363ef61348dc5af967f66fff36dd3122830af44 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Thu, 12 Jul 2018 07:17:11 +0000 Subject: [PATCH 34/57] Accepting request 620665 from Base:System OBS-URL: https://build.opensuse.org/request/show/620665 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=188 --- grub2.changes | 6 ++++++ grub2.spec | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/grub2.changes b/grub2.changes index 052ca26..70071e3 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Wed Jul 4 12:55:30 UTC 2018 - josef.moellers@suse.com + +- Marked %{_sysconfdir}/grub.d/40_custom as (noreplace) + [bsc#1079332, grub2.spec] + ------------------------------------------------------------------- Wed Jun 27 08:39:07 UTC 2018 - josef.moellers@suse.com diff --git a/grub2.spec b/grub2.spec index 44726f0..78a7ee9 100644 --- a/grub2.spec +++ b/grub2.spec @@ -1035,7 +1035,7 @@ fi %config %{_sysconfdir}/grub.d/00_header %config %{_sysconfdir}/grub.d/10_linux %config %{_sysconfdir}/grub.d/20_linux_xen -%config %{_sysconfdir}/grub.d/40_custom +%config(noreplace) %{_sysconfdir}/grub.d/40_custom %config %{_sysconfdir}/grub.d/41_custom %config %{_sysconfdir}/grub.d/90_persistent %config %{_sysconfdir}/grub.d/95_textmode From 13a1c53724493aab3db4c9528f447b2c8306e6122ab0793644f9dbb6881605d9 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Mon, 16 Jul 2018 08:41:34 +0000 Subject: [PATCH 35/57] Accepting request 623078 from Base:System OBS-URL: https://build.opensuse.org/request/show/623078 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=189 --- ...Accept-filesystem-with-sparse-inodes.patch | 57 +++++++++++++++++++ grub2.changes | 12 ++++ grub2.spec | 22 +++---- 3 files changed, 81 insertions(+), 10 deletions(-) create mode 100644 0001-xfs-Accept-filesystem-with-sparse-inodes.patch diff --git a/0001-xfs-Accept-filesystem-with-sparse-inodes.patch b/0001-xfs-Accept-filesystem-with-sparse-inodes.patch new file mode 100644 index 0000000..a28b11a --- /dev/null +++ b/0001-xfs-Accept-filesystem-with-sparse-inodes.patch @@ -0,0 +1,57 @@ +From cda0a857dd7a27cd5d621747464bfe71e8727fff Mon Sep 17 00:00:00 2001 +From: Daniel Kiper +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 +Reviewed-by: Daniel Kiper +Tested-by: Chris Murphy +--- + 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 diff --git a/grub2.changes b/grub2.changes index 70071e3..179c3ce 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Mon Jul 16 07:53:19 UTC 2018 - mchang@suse.com + +- Fix install on xfs error (bsc#1101283) + * 0001-xfs-Accept-filesystem-with-sparse-inodes.patch + +------------------------------------------------------------------- +Tue Jul 10 15:57:50 UTC 2018 - jbohac@suse.cz + +- grub2.spec: change %config to %config(noreplace) + Don't overwrite user changes to config files on upgrades. + ------------------------------------------------------------------- Wed Jul 4 12:55:30 UTC 2018 - josef.moellers@suse.com diff --git a/grub2.spec b/grub2.spec index 78a7ee9..6aaf02b 100644 --- a/grub2.spec +++ b/grub2.spec @@ -217,6 +217,7 @@ 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 # Btrfs snapshot booting related patches Patch101: grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch Patch102: grub2-btrfs-02-export-subvolume-envvars.patch @@ -506,6 +507,7 @@ swap partition while in resuming %patch86 -p1 %patch87 -p1 %patch88 -p1 +%patch89 -p1 %patch101 -p1 %patch102 -p1 %patch103 -p1 @@ -1032,13 +1034,13 @@ fi %config(noreplace) %{_sysconfdir}/default/grub %dir %{_sysconfdir}/grub.d %{_sysconfdir}/grub.d/README -%config %{_sysconfdir}/grub.d/00_header -%config %{_sysconfdir}/grub.d/10_linux -%config %{_sysconfdir}/grub.d/20_linux_xen +%config(noreplace) %{_sysconfdir}/grub.d/00_header +%config(noreplace) %{_sysconfdir}/grub.d/10_linux +%config(noreplace) %{_sysconfdir}/grub.d/20_linux_xen %config(noreplace) %{_sysconfdir}/grub.d/40_custom -%config %{_sysconfdir}/grub.d/41_custom -%config %{_sysconfdir}/grub.d/90_persistent -%config %{_sysconfdir}/grub.d/95_textmode +%config(noreplace) %{_sysconfdir}/grub.d/41_custom +%config(noreplace) %{_sysconfdir}/grub.d/90_persistent +%config(noreplace) %{_sysconfdir}/grub.d/95_textmode %{_sbindir}/%{name}-install %{_sbindir}/%{name}-mkconfig %{_sbindir}/%{name}-once @@ -1100,7 +1102,7 @@ fi %{_mandir}/man1/%{name}-emu.1.* %endif %ifnarch s390x -%config %{_sysconfdir}/grub.d/30_os-prober +%config(noreplace) %{_sysconfdir}/grub.d/30_os-prober %{_bindir}/%{name}-glue-efi %{_bindir}/%{name}-mount %{_sbindir}/%{name}-bios-setup @@ -1124,11 +1126,11 @@ fi %files %{grubarch} %defattr(-,root,root,-) %ifarch %{ix86} x86_64 -%config %{_sysconfdir}/grub.d/20_memtest86+ +%config(noreplace) %{_sysconfdir}/grub.d/20_memtest86+ %endif %dir %{_libdir}/%{name}/%{grubarch} %ifarch ppc ppc64 ppc64le -%config %{_sysconfdir}/grub.d/20_ppc_terminfo +%config(noreplace) %{_sysconfdir}/grub.d/20_ppc_terminfo # This is intentionally "grub.chrp" and not "%{name}.chrp" %{_libdir}/%{name}/%{grubarch}/grub.chrp %{_libdir}/%{name}/%{grubarch}/bootinfo.txt @@ -1183,7 +1185,7 @@ fi %defattr(-,root,root,-) %dir %{_libdir}/snapper %dir %{_libdir}/snapper/plugins -%config %{_sysconfdir}/grub.d/80_suse_btrfs_snapshot +%config(noreplace) %{_sysconfdir}/grub.d/80_suse_btrfs_snapshot %{_libdir}/snapper/plugins/grub %ifarch %{ix86} x86_64 From f1e201a0aaa84eea0bf81f3238649dfad2d3cdf0bf8012c1ed633e35dd5ab60e Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Thu, 2 Aug 2018 12:49:00 +0000 Subject: [PATCH 36/57] Accepting request 625372 from Base:System OBS-URL: https://build.opensuse.org/request/show/625372 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=190 --- grub2-btrfs-06-subvol-mount.patch | 60 ++++--- grub2-btrfs-10-config-directory.patch | 233 ++++++++++++++++++++++++++ grub2-ppc64-cas-new-scope.patch | 17 ++ grub2.changes | 12 ++ grub2.spec | 4 + 5 files changed, 300 insertions(+), 26 deletions(-) create mode 100644 grub2-btrfs-10-config-directory.patch create mode 100644 grub2-ppc64-cas-new-scope.patch diff --git a/grub2-btrfs-06-subvol-mount.patch b/grub2-btrfs-06-subvol-mount.patch index 07636e3..d40e7fe 100644 --- a/grub2-btrfs-06-subvol-mount.patch +++ b/grub2-btrfs-06-subvol-mount.patch @@ -1,7 +1,12 @@ -Index: grub-2.02~rc2/grub-core/fs/btrfs.c + +V2: +* Fix grub2-install --root-directory does not work for /boot/grub2/ on + separate btrfs subvolume (boo#1098420) + +Index: grub-2.02/grub-core/fs/btrfs.c =================================================================== ---- grub-2.02~rc2.orig/grub-core/fs/btrfs.c -+++ grub-2.02~rc2/grub-core/fs/btrfs.c +--- grub-2.02.orig/grub-core/fs/btrfs.c ++++ grub-2.02/grub-core/fs/btrfs.c @@ -32,6 +32,7 @@ #include #include @@ -264,10 +269,10 @@ Index: grub-2.02~rc2/grub-core/fs/btrfs.c cmd_list_subvols = grub_register_extcmd("btrfs-list-subvols", grub_cmd_btrfs_list_subvols, 0, "[-p|-n] [-o var] DEVICE", -Index: grub-2.02~rc2/grub-core/osdep/linux/getroot.c +Index: grub-2.02/grub-core/osdep/linux/getroot.c =================================================================== ---- grub-2.02~rc2.orig/grub-core/osdep/linux/getroot.c -+++ grub-2.02~rc2/grub-core/osdep/linux/getroot.c +--- grub-2.02.orig/grub-core/osdep/linux/getroot.c ++++ grub-2.02/grub-core/osdep/linux/getroot.c @@ -107,6 +107,14 @@ struct btrfs_ioctl_search_key grub_uint32_t unused[9]; }; @@ -447,11 +452,11 @@ Index: grub-2.02~rc2/grub-core/osdep/linux/getroot.c char * grub_make_system_path_relative_to_its_root_os (const char *path) { -Index: grub-2.02~rc2/util/grub-install.c +Index: grub-2.02/util/grub-install.c =================================================================== ---- grub-2.02~rc2.orig/util/grub-install.c -+++ grub-2.02~rc2/util/grub-install.c -@@ -1560,6 +1560,55 @@ main (int argc, char *argv[]) +--- grub-2.02.orig/util/grub-install.c ++++ grub-2.02/util/grub-install.c +@@ -1560,6 +1560,58 @@ main (int argc, char *argv[]) prefix_drive = xasprintf ("(%s)", grub_drives[0]); } @@ -463,13 +468,12 @@ Index: grub-2.02~rc2/util/grub-install.c + char *subvol = NULL; + char *mount_path = NULL; + char **rootdir_devices = NULL; -+ char *rootdir_path = grub_util_path_concat (2, "/", rootdir); ++ char *t = grub_util_path_concat (2, "/", rootdir); ++ char *rootdir_path = grub_canonicalize_file_name (t); + -+ if (grub_util_is_directory (rootdir_path)) ++ if (rootdir_path && grub_util_is_directory (rootdir_path)) + rootdir_devices = grub_guess_root_devices (rootdir_path); + -+ free (rootdir_path); -+ + if (rootdir_devices && rootdir_devices[0]) + if (grub_strcmp (rootdir_devices[0], grub_devices[0]) == 0) + subvol = grub_util_get_btrfs_subvol (platdir, &mount_path); @@ -478,28 +482,32 @@ Index: grub-2.02~rc2/util/grub-install.c + { + char *def_subvol; + -+ def_subvol = grub_util_get_btrfs_subvol ("/", NULL); ++ def_subvol = grub_util_get_btrfs_subvol (rootdir_path, NULL); + + if (def_subvol) + { ++ char *rootdir_mount_path = NULL; + if (!load_cfg_f) + load_cfg_f = grub_util_fopen (load_cfg, "wb"); + have_load_cfg = 1; + -+ if (grub_strcmp (subvol, def_subvol) != 0) -+ fprintf (load_cfg_f, "btrfs-mount-subvol ($root) %s %s\n", mount_path, subvol); ++ if (grub_strncmp (rootdir_path, mount_path, grub_strlen (rootdir_path)) == 0) ++ rootdir_mount_path = grub_util_path_concat (2, "/", mount_path + grub_strlen (rootdir_path)); ++ ++ if (grub_strcmp (subvol, def_subvol) != 0 && rootdir_mount_path) ++ fprintf (load_cfg_f, "btrfs-mount-subvol ($root) %s %s\n", rootdir_mount_path, subvol); ++ free (rootdir_mount_path); + free (def_subvol); + } + } + ++ free (t); ++ free (rootdir_path); + for (curdev = rootdir_devices; *curdev; curdev++) + free (*curdev); -+ if (rootdir_devices) -+ free (rootdir_devices); -+ if (subvol) -+ free (subvol); -+ if (mount_path) -+ free (mount_path); ++ free (rootdir_devices); ++ free (subvol); ++ free (mount_path); + } + +#endif @@ -507,10 +515,10 @@ Index: grub-2.02~rc2/util/grub-install.c char mkimage_target[200]; const char *core_name = NULL; -Index: grub-2.02~rc2/include/grub/emu/getroot.h +Index: grub-2.02/include/grub/emu/getroot.h =================================================================== ---- grub-2.02~rc2.orig/include/grub/emu/getroot.h -+++ grub-2.02~rc2/include/grub/emu/getroot.h +--- grub-2.02.orig/include/grub/emu/getroot.h ++++ grub-2.02/include/grub/emu/getroot.h @@ -53,6 +53,11 @@ char ** grub_find_root_devices_from_mountinfo (const char *dir, char **relroot); #endif diff --git a/grub2-btrfs-10-config-directory.patch b/grub2-btrfs-10-config-directory.patch new file mode 100644 index 0000000..25d12c7 --- /dev/null +++ b/grub2-btrfs-10-config-directory.patch @@ -0,0 +1,233 @@ +Index: grub-2.02/grub-core/fs/btrfs.c +=================================================================== +--- grub-2.02.orig/grub-core/fs/btrfs.c ++++ grub-2.02/grub-core/fs/btrfs.c +@@ -2590,8 +2590,7 @@ grub_btrfs_get_default_subvolume_id (str + } + + static grub_err_t +-grub_cmd_btrfs_get_default_subvol (struct grub_extcmd_context *ctxt, +- int argc, char **argv) ++grub_btrfs_get_default_subvol (const char *name, grub_uint64_t *ret_subvolid, char **ret_subvol) + { + char *devname; + grub_device_t dev; +@@ -2600,21 +2599,8 @@ grub_cmd_btrfs_get_default_subvol (struc + grub_uint64_t id; + char *subvol = NULL; + grub_uint64_t subvolid = 0; +- char *varname = NULL; +- char *output = NULL; +- int path_only = ctxt->state[1].set; +- int num_only = ctxt->state[2].set; +- +- if (ctxt->state[0].set) +- varname = ctxt->state[0].arg; +- +- if (argc < 1) +- return grub_error (GRUB_ERR_BAD_ARGUMENT, "device name required"); +- +- devname = grub_file_get_device_name(argv[0]); +- if (!devname) +- return grub_errno; + ++ devname = grub_file_get_device_name(name); + dev = grub_device_open (devname); + grub_free (devname); + if (!dev) +@@ -2655,12 +2641,43 @@ grub_cmd_btrfs_get_default_subvol (struc + return err; + } + +- if (subvol) +- grub_free (subvol); ++ grub_free (subvol); + subvol = path_out; + id = parent_id; + } + ++ if (ret_subvolid) ++ *ret_subvolid = subvolid; ++ if (ret_subvol) ++ *ret_subvol = subvol; ++ ++ grub_btrfs_unmount (data); ++ grub_device_close (dev); ++ ++ return GRUB_ERR_NONE; ++} ++ ++static grub_err_t ++grub_cmd_btrfs_get_default_subvol (struct grub_extcmd_context *ctxt, ++ int argc, char **argv) ++{ ++ grub_err_t err; ++ char *subvol = NULL; ++ grub_uint64_t subvolid = 0; ++ char *varname = NULL; ++ char *output = NULL; ++ int path_only = ctxt->state[1].set; ++ int num_only = ctxt->state[2].set; ++ ++ if (ctxt->state[0].set) ++ varname = ctxt->state[0].arg; ++ ++ if (argc < 1) ++ return grub_error (GRUB_ERR_BAD_ARGUMENT, "device name required"); ++ ++ if ((err = grub_btrfs_get_default_subvol (argv[0], &subvolid, &subvol)) != GRUB_ERR_NONE) ++ return err; ++ + if (num_only && path_only) + output = grub_xasprintf ("%"PRIuGRUB_UINT64_T" /%s", subvolid, subvol); + else if (num_only) +@@ -2676,9 +2693,6 @@ grub_cmd_btrfs_get_default_subvol (struc + grub_free (output); + grub_free (subvol); + +- grub_btrfs_unmount (data); +- grub_device_close (dev); +- + return GRUB_ERR_NONE; + } + +@@ -2757,6 +2771,122 @@ subvol_get_env (struct grub_env_var *var + return ""; + } + ++ ++static char * ++grub_btrfs_path_to_abs (const char *path) ++{ ++ grub_err_t err; ++ char *device_name = NULL; ++ char *subvol = NULL; ++ const char *file_name; ++ char *ret; ++ ++ if (!path) ++ return NULL; ++ ++ if ((err = grub_btrfs_get_default_subvol (path, 0, &subvol)) != GRUB_ERR_NONE) ++ { ++ grub_errno = GRUB_ERR_NONE; ++ return NULL; ++ } ++ ++ if (!subvol || *subvol == '\0') ++ return NULL; ++ ++ file_name = (path[0] == '(') ? grub_strchr (path, ')') : NULL; ++ if (file_name) ++ file_name++; ++ else ++ file_name = path; ++ device_name = grub_file_get_device_name (path); ++ if (device_name) ++ ret = grub_xasprintf ("(%s)/%s%s", device_name, subvol, file_name); ++ else ++ ret = grub_xasprintf ("/%s%s", subvol, file_name); ++ ++ grub_free (device_name); ++ grub_free (subvol); ++ ++ return ret; ++} ++ ++static char * ++grub_btrfs_path_to_rel (const char *path) ++{ ++ grub_err_t err; ++ char *subvol = NULL; ++ const char *file_name; ++ ++ if (!path) ++ return NULL; ++ ++ if ((err = grub_btrfs_get_default_subvol (path, 0, &subvol)) != GRUB_ERR_NONE) ++ { ++ grub_errno = GRUB_ERR_NONE; ++ return NULL; ++ } ++ ++ if (!subvol || *subvol == '\0') ++ return NULL; ++ ++ file_name = (path[0] == '(') ? grub_strchr (path, ')') : NULL; ++ if (file_name) ++ file_name++; ++ else ++ file_name = path; ++ ++ if (*file_name == '/') ++ file_name++; ++ ++ if (grub_strncmp (file_name, subvol, grub_strlen (subvol)) == 0) ++ { ++ char *device_name; ++ char *ret; ++ ++ device_name = grub_file_get_device_name (path); ++ file_name += grub_strlen (subvol); ++ if (device_name) ++ ret = grub_xasprintf ("(%s)%s", device_name, file_name); ++ else ++ ret = grub_strdup (file_name); ++ grub_free (device_name); ++ grub_free (subvol); ++ return ret; ++ } ++ ++ grub_free (subvol); ++ return NULL; ++} ++ ++static char * ++relpath_set_env (struct grub_env_var *var, ++ const char *val) ++{ ++ int new_val, old_val; ++ new_val = (val[0] == '1' || val[0] == 'y') ? 1 : 0; ++ old_val = (var->value[0] == '1' || var->value[0] == 'y') ? 1 : 0; ++ ++ if (new_val != old_val) ++ { ++ const char **n; ++ char * (*path_to_xxx) (const char *); ++ const char *envname[] = {"config_file", "config_directory", NULL}; ++ ++ path_to_xxx = (new_val == 1) ? grub_btrfs_path_to_rel : grub_btrfs_path_to_abs; ++ for (n = envname; *n; n++) ++ { ++ char *ctmp = path_to_xxx (grub_env_get (*n)); ++ if (ctmp) ++ { ++ grub_env_set (*n, ctmp); ++ grub_free (ctmp); ++ } ++ } ++ } ++ ++ return grub_strdup (val); ++} ++ + GRUB_MOD_INIT (btrfs) + { + grub_fs_register (&grub_btrfs_fs); +@@ -2780,6 +2910,8 @@ GRUB_MOD_INIT (btrfs) + subvol_set_env); + grub_register_variable_hook ("btrfs_subvolid", subvolid_get_env, + subvolid_set_env); ++ grub_register_variable_hook ("btrfs_relative_path", NULL, ++ relpath_set_env); + grub_env_export ("btrfs_subvol"); + grub_env_export ("btrfs_subvolid"); + grub_env_export ("btrfs_relative_path"); +@@ -2789,6 +2921,7 @@ GRUB_MOD_FINI (btrfs) + { + grub_register_variable_hook ("btrfs_subvol", NULL, NULL); + grub_register_variable_hook ("btrfs_subvolid", NULL, NULL); ++ grub_register_variable_hook ("btrfs_relative_path", NULL, NULL); + grub_unregister_command (cmd_info); + grub_unregister_extcmd (cmd_list_subvols); + grub_fs_unregister (&grub_btrfs_fs); diff --git a/grub2-ppc64-cas-new-scope.patch b/grub2-ppc64-cas-new-scope.patch new file mode 100644 index 0000000..c8bb566 --- /dev/null +++ b/grub2-ppc64-cas-new-scope.patch @@ -0,0 +1,17 @@ +Index: grub-2.02/grub-core/normal/main.c +=================================================================== +--- grub-2.02.orig/grub-core/normal/main.c ++++ grub-2.02/grub-core/normal/main.c +@@ -282,10 +282,11 @@ grub_normal_execute (const char *config, + int boot; + boot = 0; + char *script; ++ char *dummy[1] = { NULL }; + script = grub_malloc (1024); + if (! grub_ieee1275_cas_reboot (script)) + { +- if (! grub_script_execute_sourcecode (script)) ++ if (! grub_script_execute_new_scope (script, 0, dummy)) + boot = 1; + } + grub_free (script); diff --git a/grub2.changes b/grub2.changes index 179c3ce..3f3f571 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Tue Jul 24 07:56:02 UTC 2018 - mchang@suse.com + +- Fix config_directory on btrfs to follow path scheme (bsc#1063443) + * grub2-btrfs-10-config-directory.patch +- Fix grub2-install --root-directory does not work for /boot/grub2/ on + separate btrfs subvolume (boo#1098420) + * grub2-btrfs-06-subvol-mount.patch +- Fix setparams doesn't work as expected from boot-last-label NVRAM var, after + inital CAS reboot on ieee1275 (bsc#1088830) + * grub2-ppc64-cas-new-scope.patch + ------------------------------------------------------------------- Mon Jul 16 07:53:19 UTC 2018 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 6aaf02b..9bc1d09 100644 --- a/grub2.spec +++ b/grub2.spec @@ -228,6 +228,7 @@ Patch106: grub2-btrfs-06-subvol-mount.patch Patch107: grub2-btrfs-07-subvol-fallback.patch Patch108: grub2-btrfs-08-workaround-snapshot-menu-default-entry.patch Patch109: grub2-btrfs-09-get-default-subvolume.patch +Patch110: grub2-btrfs-10-config-directory.patch # Support EFI xen loader Patch120: grub2-efi-xen-chainload.patch Patch121: grub2-efi-chainloader-root.patch @@ -252,6 +253,7 @@ 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 Patch214: grub2-ieee1275-open-raw-mode.patch +Patch215: grub2-ppc64-cas-new-scope.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 @@ -517,6 +519,7 @@ swap partition while in resuming %patch107 -p1 %patch108 -p1 %patch109 -p1 +%patch110 -p1 %patch120 -p1 %patch121 -p1 %patch122 -p1 @@ -535,6 +538,7 @@ swap partition while in resuming %patch212 -p1 %patch213 -p1 %patch214 -p1 +%patch215 -p1 %patch233 -p1 %patch234 -p1 %patch236 -p1 From ecd5ce61efe08f9d996f4bd960efa025106e4ce588fa207d7c3015e7bc2ad548 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Mon, 13 Aug 2018 07:54:03 +0000 Subject: [PATCH 37/57] Accepting request 628303 from Base:System OBS-URL: https://build.opensuse.org/request/show/628303 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=191 --- grub2-binutils2.31.patch | 74 ++++++++++++++++++++++++++++++++++++++++ grub2-rpmlintrc | 1 + grub2.changes | 22 ++++++++++++ grub2.spec | 7 +++- 4 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 grub2-binutils2.31.patch create mode 100644 grub2-rpmlintrc diff --git a/grub2-binutils2.31.patch b/grub2-binutils2.31.patch new file mode 100644 index 0000000..b11267a --- /dev/null +++ b/grub2-binutils2.31.patch @@ -0,0 +1,74 @@ +From 842c390469e2c2e10b5aa36700324cd3bde25875 Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" +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 +Reviewed-by: Daniel Kiper +--- + 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 + + diff --git a/grub2-rpmlintrc b/grub2-rpmlintrc new file mode 100644 index 0000000..17aba33 --- /dev/null +++ b/grub2-rpmlintrc @@ -0,0 +1 @@ +addFilter('arch-independent-package-contains-binary-or-object') diff --git a/grub2.changes b/grub2.changes index 3f3f571..148b6c2 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,25 @@ +------------------------------------------------------------------- +Thu Aug 9 02:48:18 UTC 2018 - mchang@suse.com + +- Downgrade libburnia-tools to suggest as minimal system can't afford pulling + in tcl/tk and half of the x11 stack (bsc#1102515) + * modified grub2.spec + +------------------------------------------------------------------- +Wed Aug 8 15:17:13 UTC 2018 - dimstar@opensuse.org + +- Add grub2-binutils2.31.patch: x86-64: Treat R_X86_64_PLT32 as + R_X86_64_PC32. Starting from binutils commit bd7ab16b 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. + +------------------------------------------------------------------- +Mon Aug 6 09:02:45 UTC 2018 - josef.moellers@suse.com + +- The grubxenarch packages are now architecture-independent. + [bsc#953297, grub2.spec, grub2-rpmlintrc] + ------------------------------------------------------------------- Tue Jul 24 07:56:02 UTC 2018 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 9bc1d09..dba605b 100644 --- a/grub2.spec +++ b/grub2.spec @@ -161,6 +161,7 @@ Source16: grub2-xen-pv-firmware.cfg # required hook for systemd-sleep (bsc#941758) Source17: grub2-systemd-sleep.sh Source18: grub2-check-default.sh +Source999: grub2-rpmlintrc Source1000: PATCH_POLICY Patch1: rename-grub-info-file-to-grub2.patch Patch2: grub2-linux.patch @@ -218,6 +219,7 @@ 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 # Btrfs snapshot booting related patches Patch101: grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch Patch102: grub2-btrfs-02-export-subvolume-envvars.patch @@ -299,7 +301,8 @@ Requires: gettext-runtime Recommends: os-prober %endif # xorriso not available using grub2-mkrescue (bnc#812681) -Recommends: libburnia-tools +# downgrade to suggest as minimal system can't afford pulling in tcl/tk and half of the x11 stack (bsc#1102515) +Suggests: libburnia-tools Recommends: mtools %endif Requires(post): /sbin/install-info @@ -414,6 +417,7 @@ Summary: Bootloader with support for Linux, Multiboot and more Group: System/Boot Provides: %{name}-xen = %{version}-%{release} Obsoletes: %{name}-xen < %{version}-%{release} +BuildArch: noarch %description %{grubxenarch} The GRand Unified Bootloader (GRUB) is a highly configurable and customizable @@ -510,6 +514,7 @@ swap partition while in resuming %patch87 -p1 %patch88 -p1 %patch89 -p1 +%patch90 -p1 %patch101 -p1 %patch102 -p1 %patch103 -p1 From 474cf2dba500392fbc49b655aa04a633ece0860e0a12c10ae356dadee8df9492 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Mon, 3 Sep 2018 08:32:55 +0000 Subject: [PATCH 38/57] Accepting request 631916 from Base:System OBS-URL: https://build.opensuse.org/request/show/631916 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=192 --- grub2-msdos-fix-overflow.patch | 46 ++++++++++++++++++++++++++++++++++ grub2.changes | 6 +++++ grub2.spec | 2 ++ 3 files changed, 54 insertions(+) create mode 100644 grub2-msdos-fix-overflow.patch diff --git a/grub2-msdos-fix-overflow.patch b/grub2-msdos-fix-overflow.patch new file mode 100644 index 0000000..886150f --- /dev/null +++ b/grub2-msdos-fix-overflow.patch @@ -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; diff --git a/grub2.changes b/grub2.changes index 148b6c2..ae1175b 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Thu Aug 23 08:37:15 UTC 2018 - mchang@suse.com + +- Fix overflow in sector count calculation (bsc#1105163) + * grub2-msdos-fix-overflow.patch + ------------------------------------------------------------------- Thu Aug 9 02:48:18 UTC 2018 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index dba605b..38a07a5 100644 --- a/grub2.spec +++ b/grub2.spec @@ -220,6 +220,7 @@ 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 # Btrfs snapshot booting related patches Patch101: grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch Patch102: grub2-btrfs-02-export-subvolume-envvars.patch @@ -515,6 +516,7 @@ swap partition while in resuming %patch88 -p1 %patch89 -p1 %patch90 -p1 +%patch91 -p1 %patch101 -p1 %patch102 -p1 %patch103 -p1 From 1c78e556059b21a2430cfcac24d90d697b7dd13e7d4dca34d54c9596666eeaf0 Mon Sep 17 00:00:00 2001 From: Yuchen Lin Date: Sun, 16 Sep 2018 16:30:21 +0000 Subject: [PATCH 39/57] Accepting request 635552 from Base:System OBS-URL: https://build.opensuse.org/request/show/635552 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=193 --- ...nitialize-structs-in-bootpath-parser.patch | 36 +++++++++++++++++++ grub2-btrfs-10-config-directory.patch | 34 ++++++++++++++---- grub2.changes | 13 +++++++ grub2.spec | 2 ++ 4 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 0001-ofnet-Initialize-structs-in-bootpath-parser.patch diff --git a/0001-ofnet-Initialize-structs-in-bootpath-parser.patch b/0001-ofnet-Initialize-structs-in-bootpath-parser.patch new file mode 100644 index 0000000..e815b26 --- /dev/null +++ b/0001-ofnet-Initialize-structs-in-bootpath-parser.patch @@ -0,0 +1,36 @@ +From ddd47864e98cb32a718075bab4462dc56919ec6c Mon Sep 17 00:00:00 2001 +From: Julian Andres Klode +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 +--- + 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; diff --git a/grub2-btrfs-10-config-directory.patch b/grub2-btrfs-10-config-directory.patch index 25d12c7..6aae90e 100644 --- a/grub2-btrfs-10-config-directory.patch +++ b/grub2-btrfs-10-config-directory.patch @@ -1,3 +1,11 @@ +v1: +References: bsc#1063443 + +v2: +References: bsc#1106381 +Fix outputting invalid btrfs subvol path on non btrfs filesystem due to bogus +return code handling. + Index: grub-2.02/grub-core/fs/btrfs.c =================================================================== --- grub-2.02.orig/grub-core/fs/btrfs.c @@ -35,7 +43,17 @@ Index: grub-2.02/grub-core/fs/btrfs.c dev = grub_device_open (devname); grub_free (devname); if (!dev) -@@ -2655,12 +2641,43 @@ grub_cmd_btrfs_get_default_subvol (struc +@@ -2625,8 +2611,7 @@ grub_cmd_btrfs_get_default_subvol (struc + { + grub_device_close (dev); + grub_dprintf ("btrfs", "failed to open fs\n"); +- grub_errno = GRUB_ERR_NONE; +- return 0; ++ return grub_errno; + } + + err = grub_btrfs_get_default_subvolume_id (data, &subvolid); +@@ -2655,12 +2640,47 @@ grub_cmd_btrfs_get_default_subvol (struc return err; } @@ -76,12 +94,16 @@ Index: grub-2.02/grub-core/fs/btrfs.c + return grub_error (GRUB_ERR_BAD_ARGUMENT, "device name required"); + + if ((err = grub_btrfs_get_default_subvol (argv[0], &subvolid, &subvol)) != GRUB_ERR_NONE) -+ return err; ++ { ++ if (err == GRUB_ERR_BAD_FS) ++ err = grub_errno = GRUB_ERR_NONE; ++ return err; ++ } + if (num_only && path_only) output = grub_xasprintf ("%"PRIuGRUB_UINT64_T" /%s", subvolid, subvol); else if (num_only) -@@ -2676,9 +2693,6 @@ grub_cmd_btrfs_get_default_subvol (struc +@@ -2676,9 +2696,6 @@ grub_cmd_btrfs_get_default_subvol (struc grub_free (output); grub_free (subvol); @@ -91,7 +113,7 @@ Index: grub-2.02/grub-core/fs/btrfs.c return GRUB_ERR_NONE; } -@@ -2757,6 +2771,122 @@ subvol_get_env (struct grub_env_var *var +@@ -2757,6 +2774,122 @@ subvol_get_env (struct grub_env_var *var return ""; } @@ -214,7 +236,7 @@ Index: grub-2.02/grub-core/fs/btrfs.c GRUB_MOD_INIT (btrfs) { grub_fs_register (&grub_btrfs_fs); -@@ -2780,6 +2910,8 @@ GRUB_MOD_INIT (btrfs) +@@ -2780,6 +2913,8 @@ GRUB_MOD_INIT (btrfs) subvol_set_env); grub_register_variable_hook ("btrfs_subvolid", subvolid_get_env, subvolid_set_env); @@ -223,7 +245,7 @@ Index: grub-2.02/grub-core/fs/btrfs.c grub_env_export ("btrfs_subvol"); grub_env_export ("btrfs_subvolid"); grub_env_export ("btrfs_relative_path"); -@@ -2789,6 +2921,7 @@ GRUB_MOD_FINI (btrfs) +@@ -2789,6 +2924,7 @@ GRUB_MOD_FINI (btrfs) { grub_register_variable_hook ("btrfs_subvol", NULL, NULL); grub_register_variable_hook ("btrfs_subvolid", NULL, NULL); diff --git a/grub2.changes b/grub2.changes index ae1175b..44991d3 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,16 @@ +------------------------------------------------------------------- +Thu Sep 13 08:38:01 UTC 2018 - mchang@suse.com + +- Fix broken network interface with random address and same name (bsc#1084508) + * 0001-ofnet-Initialize-structs-in-bootpath-parser.patch + +------------------------------------------------------------------- +Fri Aug 31 10:06:56 UTC 2018 - mchang@suse.com + +- Fix outputting invalid btrfs subvol path on non btrfs filesystem due to bogus + return code handling. (bsc#1106381) + * modified grub2-btrfs-10-config-directory.patch + ------------------------------------------------------------------- Thu Aug 23 08:37:15 UTC 2018 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 38a07a5..7bdd88d 100644 --- a/grub2.spec +++ b/grub2.spec @@ -257,6 +257,7 @@ Patch212: grub2-install-remove-useless-check-PReP-partition-is-empty.patch Patch213: grub2-Fix-incorrect-netmask-on-ppc64.patch Patch214: grub2-ieee1275-open-raw-mode.patch Patch215: grub2-ppc64-cas-new-scope.patch +Patch216: 0001-ofnet-Initialize-structs-in-bootpath-parser.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 @@ -546,6 +547,7 @@ swap partition while in resuming %patch213 -p1 %patch214 -p1 %patch215 -p1 +%patch216 -p1 %patch233 -p1 %patch234 -p1 %patch236 -p1 From 420961a76db7c2a6a5592930f1343b8b01d719afa9980c806f762801fd283993 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Tue, 2 Oct 2018 17:39:25 +0000 Subject: [PATCH 40/57] Accepting request 638658 from Base:System OBS-URL: https://build.opensuse.org/request/show/638658 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=194 --- ...ee1275-FCP-methods-for-WWPN-and-LUNs.patch | 118 ++++++++++++++++++ grub2.changes | 6 + grub2.spec | 2 + 3 files changed, 126 insertions(+) create mode 100644 grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch diff --git a/grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch b/grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch new file mode 100644 index 0000000..9913742 --- /dev/null +++ b/grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch @@ -0,0 +1,118 @@ +From: Diego Domingos +Date: Fri, 10 Aug 2018 16:29:50 -0400 +Subject: ieee1275: implement FCP methods for WWPN and LUNs +References: bsc#1093145 +Patch-mainline: not yet + +This patch enables the fcp-targets and fcp-luns methods which are +responsible to get WWPNs and LUNs for fibre channel devices. + +Those methods are specially necessary if the boot directory and grub +installation are in different FCP disks, allowing the dev_iterate() +to find the WWPNs and LUNs when called by searchfs.uuid tool. + +Signed-off-by: Diego Domingos +--- + grub-core/disk/ieee1275/ofdisk.c | 89 +++++++++++++++++++++++++++++++++++++++- + 1 file changed, 88 insertions(+), 1 deletion(-) + +diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c +index 235c0fe..bb213f1 100644 +--- a/grub-core/disk/ieee1275/ofdisk.c ++++ b/grub-core/disk/ieee1275/ofdisk.c +@@ -209,7 +209,94 @@ dev_iterate_real (const char *name, const char *path) + static void + dev_iterate (const struct grub_ieee1275_devalias *alias) + { +- if (grub_strcmp (alias->type, "vscsi") == 0) ++ if (grub_strcmp (alias->type, "fcp") == 0){ ++ ++ /* If we are dealing with fcp devices, we need ++ * to find the WWPNs and LUNs to iterate them */ ++ grub_ieee1275_ihandle_t ihandle; ++ grub_uint64_t *ptr_targets, *ptr_luns; ++ unsigned int i, j, pos; ++ char *buf, *bufptr; ++ ++ struct set_fcp_targets_args ++ { ++ struct grub_ieee1275_common_hdr common; ++ grub_ieee1275_cell_t method; ++ grub_ieee1275_cell_t ihandle; ++ grub_ieee1275_cell_t catch_result; ++ grub_ieee1275_cell_t nentries; ++ grub_ieee1275_cell_t table; ++ } args_targets; ++ ++ struct set_fcp_luns_args ++ { ++ struct grub_ieee1275_common_hdr common; ++ grub_ieee1275_cell_t method; ++ grub_ieee1275_cell_t ihandle; ++ grub_ieee1275_cell_t wwpn_h; ++ grub_ieee1275_cell_t wwpn_l; ++ grub_ieee1275_cell_t catch_result; ++ grub_ieee1275_cell_t nentries; ++ grub_ieee1275_cell_t table; ++ } args_luns; ++ ++ grub_ieee1275_open (alias->path, &ihandle); ++ ++ INIT_IEEE1275_COMMON (&args_targets.common, "call-method", 2, 3); ++ args_targets.method = (grub_ieee1275_cell_t) "fcp-targets"; ++ args_targets.ihandle = ihandle; ++ args_targets.table = 0; ++ args_targets.nentries = 0; ++ ++ INIT_IEEE1275_COMMON (&args_luns.common, "call-method", 4, 3); ++ args_luns.method = (grub_ieee1275_cell_t) "fcp-luns"; ++ args_luns.ihandle = ihandle; ++ args_luns.table = 0; ++ args_luns.nentries = 0; ++ ++ IEEE1275_CALL_ENTRY_FN (&args_targets); ++ ++ buf = grub_malloc (grub_strlen (alias->path) + 32 + 32); ++ ++ if (!buf) ++ return; ++ ++ bufptr = grub_stpcpy (buf, alias->path); ++ ++ /* For each WWPN discovered we need to find his associated LUNS ++ * calling the fcp-luns method */ ++ for (i=0; i< args_targets.nentries; i++){ ++ ptr_targets = *(grub_uint64_t **) (args_targets.table + 4 + 8 * i); ++ while(*ptr_targets){ ++ args_luns.wwpn_l = (grub_ieee1275_cell_t) (*ptr_targets); ++ args_luns.wwpn_h = (grub_ieee1275_cell_t) (*ptr_targets >> 32); ++ pos=grub_snprintf (bufptr, 32, "/disk@%" PRIxGRUB_UINT64_T, ++ *ptr_targets++); ++ IEEE1275_CALL_ENTRY_FN (&args_luns); ++ ptr_luns = *(grub_uint64_t **) (args_luns.table); ++ ++ for(j=0;jtype, "vscsi") == 0) + { + static grub_ieee1275_ihandle_t ihandle; + struct set_color_args diff --git a/grub2.changes b/grub2.changes index 44991d3..3b1a293 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Wed Sep 26 08:01:05 UTC 2018 - mchang@suse.com + +- ieee1275: implement FCP methods for WWPN and LUNs (bsc#1093145) + * grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch + ------------------------------------------------------------------- Thu Sep 13 08:38:01 UTC 2018 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 7bdd88d..e850828 100644 --- a/grub2.spec +++ b/grub2.spec @@ -258,6 +258,7 @@ Patch213: grub2-Fix-incorrect-netmask-on-ppc64.patch Patch214: grub2-ieee1275-open-raw-mode.patch Patch215: grub2-ppc64-cas-new-scope.patch Patch216: 0001-ofnet-Initialize-structs-in-bootpath-parser.patch +Patch217: grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.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 @@ -548,6 +549,7 @@ swap partition while in resuming %patch214 -p1 %patch215 -p1 %patch216 -p1 +%patch217 -p1 %patch233 -p1 %patch234 -p1 %patch236 -p1 From 27419df33e3172440a9af6b61248c51c67b5df9a59b79780b826f7ffbe64ec2b Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Tue, 9 Oct 2018 13:52:40 +0000 Subject: [PATCH 41/57] Accepting request 639871 from Base:System OBS-URL: https://build.opensuse.org/request/show/639871 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=195 --- grub2-getroot-support-nvdimm.patch | 71 +++++++++++++++++++ grub2-util-30_os-prober-multiple-initrd.patch | 22 ++++++ grub2.changes | 13 ++++ grub2.spec | 4 ++ 4 files changed, 110 insertions(+) create mode 100644 grub2-getroot-support-nvdimm.patch create mode 100644 grub2-util-30_os-prober-multiple-initrd.patch diff --git a/grub2-getroot-support-nvdimm.patch b/grub2-getroot-support-nvdimm.patch new file mode 100644 index 0000000..cf539d7 --- /dev/null +++ b/grub2-getroot-support-nvdimm.patch @@ -0,0 +1,71 @@ +From 889c0894d358e48c02f8225426893094f20004e5 Mon Sep 17 00:00:00 2001 +From: Gary Lin +Date: Thu, 4 Oct 2018 10:32:07 +0800 +Subject: [PATCH] linux/getroot: Support NVDIMM device names + +There are two types of NVDIMM block devices in linux: fsdax and blk. +For fsdax, the device name would be /dev/pmemXpY, /dev/pmemXsY, +/dev/pmemX.YpZ, or /dev/pmemX.YsZ. +For blk, the name would be /dev/ndblkX.YpZ or /dev/ndblkX.YsZ +--- + grub-core/osdep/linux/getroot.c | 44 +++++++++++++++++++++++++++++++++ + 1 file changed, 44 insertions(+) + +diff --git a/grub-core/osdep/linux/getroot.c b/grub-core/osdep/linux/getroot.c +index 8776009..d2ab60f 100644 +--- a/grub-core/osdep/linux/getroot.c ++++ b/grub-core/osdep/linux/getroot.c +@@ -1082,6 +1082,50 @@ grub_util_part_to_disk (const char *os_dev, struct stat *st, + *pp = '\0'; + return path; + } ++ ++ /* If this is a NVDIMM device in fsdax mode */ ++ if (strncmp ("pmem", p, 4) == 0 && p[4] >= '0' && p[4] <= '9') ++ { ++ /* /dev/pmem[0-9]+(\.[0-9]+)?((p[0-9]+)?|s[0-9]*) */ ++ char *pp = strchr (p + 4, 'p'); ++ if (pp) ++ { ++ *is_part = 1; ++ *pp = '\0'; ++ } ++ else ++ { ++ pp = strchr (p + 4, 's'); ++ if (pp && pp[1] >= '0' && pp[1] <= '9') ++ { ++ *is_part = 1; ++ pp[1] = '\0'; ++ } ++ } ++ return path; ++ } ++ ++ /* If this is a NVDIMM device in block mode */ ++ if (strncmp ("ndblk", p, 5) == 0 && p[5] >= '0' && p[5] <= '9') ++ { ++ /* /dev/ndblk[0-9]+\.[0-9]+((p[0-9]+)?|s[0-9]*) */ ++ char *pp = strchr (p + 5, 'p'); ++ if (pp) ++ { ++ *is_part = 1; ++ *pp = '\0'; ++ } ++ else ++ { ++ pp = strchr (p + 5, 's'); ++ if (pp && pp[1] >= '0' && pp[1] <= '9') ++ { ++ *is_part = 1; ++ pp[1] = '\0'; ++ } ++ } ++ return path; ++ } + } + + return path; +-- +2.19.0 + diff --git a/grub2-util-30_os-prober-multiple-initrd.patch b/grub2-util-30_os-prober-multiple-initrd.patch new file mode 100644 index 0000000..9fbb142 --- /dev/null +++ b/grub2-util-30_os-prober-multiple-initrd.patch @@ -0,0 +1,22 @@ +Index: grub-2.02/util/grub.d/30_os-prober.in +=================================================================== +--- grub-2.02.orig/util/grub.d/30_os-prober.in ++++ grub-2.02/util/grub.d/30_os-prober.in +@@ -216,7 +216,7 @@ EOF + LBOOT="`echo ${LINUX} | cut -d ':' -f 2`" + LLABEL="`echo ${LINUX} | cut -d ':' -f 3 | tr '^' ' '`" + LKERNEL="`echo ${LINUX} | cut -d ':' -f 4`" +- LINITRD="`echo ${LINUX} | cut -d ':' -f 5`" ++ LINITRD="`echo ${LINUX} | cut -d ':' -f 5 | tr '^' ' '`" + LPARAMS="`echo ${LINUX} | cut -d ':' -f 6- | tr '^' ' '`" + + if [ -z "${LLABEL}" ] ; then +@@ -225,7 +225,7 @@ EOF + + if [ "${LROOT}" != "${LBOOT}" ]; then + LKERNEL="${LKERNEL#/boot}" +- LINITRD="${LINITRD#/boot}" ++ LINITRD="$(echo $LINITRD | sed -e 's!^/boot!!' -e 's!\(\s\)/boot!\1!g')" + fi + + onstr="$(gettext_printf "(on %s)" "${DEVICE}")" diff --git a/grub2.changes b/grub2.changes index 3b1a293..3f826ca 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,16 @@ +------------------------------------------------------------------- +Thu Oct 4 06:52:58 UTC 2018 - glin@suse.com + +- Support NVDIMM device names (bsc#1110073) + * grub2-getroot-support-nvdimm.patch + +------------------------------------------------------------------- +Wed Oct 3 07:08:14 UTC 2018 - mchang@suse.com + +- Translate caret back to space as the initrd stanza could use space to + delimit multiple files loaded (bsc#1101942) + * grub2-util-30_os-prober-multiple-initrd.patch + ------------------------------------------------------------------- Wed Sep 26 08:01:05 UTC 2018 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index e850828..1c53002 100644 --- a/grub2.spec +++ b/grub2.spec @@ -221,6 +221,8 @@ 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 # Btrfs snapshot booting related patches Patch101: grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch Patch102: grub2-btrfs-02-export-subvolume-envvars.patch @@ -519,6 +521,8 @@ swap partition while in resuming %patch89 -p1 %patch90 -p1 %patch91 -p1 +%patch92 -p1 +%patch93 -p1 %patch101 -p1 %patch102 -p1 %patch103 -p1 From acf5ba8f52d10fe568970713040ab6e2e4d4170a7680e36f052fa152596777e5 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Wed, 28 Nov 2018 10:10:33 +0000 Subject: [PATCH 42/57] Accepting request 651971 from Base:System OBS-URL: https://build.opensuse.org/request/show/651971 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=196 --- ...lt-tsc-calibration-method-to-pmtimer.patch | 29 ++++++ grub2-ppc64-cas-fix-double-free.patch | 99 +++++++++++++++++++ grub2.changes | 12 +++ grub2.spec | 4 + 4 files changed, 144 insertions(+) create mode 100644 0001-tsc-Change-default-tsc-calibration-method-to-pmtimer.patch create mode 100644 grub2-ppc64-cas-fix-double-free.patch diff --git a/0001-tsc-Change-default-tsc-calibration-method-to-pmtimer.patch b/0001-tsc-Change-default-tsc-calibration-method-to-pmtimer.patch new file mode 100644 index 0000000..4180f5f --- /dev/null +++ b/0001-tsc-Change-default-tsc-calibration-method-to-pmtimer.patch @@ -0,0 +1,29 @@ +From 446794de8da4329ea532cbee4ca877bcafd0e534 Mon Sep 17 00:00:00 2001 +From: "David E. Box" +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 +Reviewed-by: Daniel Kiper +--- + 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 diff --git a/grub2-ppc64-cas-fix-double-free.patch b/grub2-ppc64-cas-fix-double-free.patch new file mode 100644 index 0000000..b086a81 --- /dev/null +++ b/grub2-ppc64-cas-fix-double-free.patch @@ -0,0 +1,99 @@ +Index: grub-2.02/grub-core/kern/ieee1275/openfw.c +=================================================================== +--- 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 +-grub_ieee1275_cas_reboot (char *script) ++grub_ieee1275_cas_reboot (char **script) + { + grub_uint32_t ibm_ca_support_reboot; + grub_uint32_t ibm_fw_nbr_reboots; +@@ -625,16 +625,37 @@ grub_ieee1275_cas_reboot (char *script) + + if (ibm_ca_support_reboot || ibm_fw_nbr_reboots) + { +- if (! grub_ieee1275_get_property_length (options, "boot-last-label", &actual)) +- { +- if (actual > 1024) +- script = grub_realloc (script, actual + 1); +- grub_ieee1275_get_property (options, "boot-last-label", script, actual, +- &actual); +- return 0; +- } ++ grub_ssize_t len; ++ char *buf; ++ ++ if (grub_ieee1275_get_property_length (options, "boot-last-label", &len) ++ || len <= 0) ++ { ++ grub_dprintf ("ieee1275", "boot-last-label missing or invalid\n"); ++ goto out; ++ } ++ /* The returned property string length may not include terminating null byte, and in ++ a bid to avoid out of bound access we allocate one more byte to add it back */ ++ buf = grub_malloc ((grub_size_t)len + 1); ++ if (!buf) ++ { ++ grub_print_error (); ++ goto out; ++ } ++ if (grub_ieee1275_get_property (options, "boot-last-label", buf, (grub_size_t)len + 1, &actual) ++ || actual < 0) ++ { ++ grub_dprintf ("ieee1275", "error while get boot-last-label property\n"); ++ grub_free (buf); ++ goto out; ++ } ++ /* Add terminating null byte */ ++ buf[len] = '\0'; ++ *script = buf; ++ return 0; + } + ++out: + grub_ieee1275_set_boot_last_label (""); + + return -1; +@@ -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) ++ /* To be on the safe side, set the property string with terminating null byte */ + grub_ieee1275_set_property (options, "boot-last-label", text, +- grub_strlen (text), &actual); ++ grub_strlen (text) + 1, &actual); + return 0; + } +Index: grub-2.02/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; + boot = 0; +- char *script; ++ char *script = NULL; + char *dummy[1] = { NULL }; +- script = grub_malloc (1024); +- if (! grub_ieee1275_cas_reboot (script)) ++ if (! grub_ieee1275_cas_reboot (&script) && script) + { + if (! grub_script_execute_new_scope (script, 0, dummy)) + boot = 1; +Index: grub-2.02/include/grub/ieee1275/ieee1275.h +=================================================================== +--- 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); +-int EXPORT_FUNC(grub_ieee1275_cas_reboot) (char *script); ++int EXPORT_FUNC(grub_ieee1275_cas_reboot) (char **script); + int EXPORT_FUNC(grub_ieee1275_set_boot_last_label) (const char *text); + + #define FOR_IEEE1275_DEVALIASES(alias) for (grub_ieee1275_devalias_init_iterator (&(alias)); grub_ieee1275_devalias_next (&(alias));) diff --git a/grub2.changes b/grub2.changes index 3f826ca..6483595 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Mon Nov 26 06:54:34 UTC 2018 - mchang@suse.com + +- Change default tsc calibration method to pmtimer on EFI (bsc#1114754) + * 0001-tsc-Change-default-tsc-calibration-method-to-pmtimer.patch + +------------------------------------------------------------------- +Fri Oct 19 07:17:34 UTC 2018 - mchang@suse.com + +- ieee1275: Fix double free in CAS reboot (bsc#1111955) + * grub2-ppc64-cas-fix-double-free.patch + ------------------------------------------------------------------- Thu Oct 4 06:52:58 UTC 2018 - glin@suse.com diff --git a/grub2.spec b/grub2.spec index 1c53002..707c3e4 100644 --- a/grub2.spec +++ b/grub2.spec @@ -223,6 +223,7 @@ 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 @@ -261,6 +262,7 @@ Patch214: grub2-ieee1275-open-raw-mode.patch Patch215: grub2-ppc64-cas-new-scope.patch Patch216: 0001-ofnet-Initialize-structs-in-bootpath-parser.patch Patch217: grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.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 @@ -523,6 +525,7 @@ swap partition while in resuming %patch91 -p1 %patch92 -p1 %patch93 -p1 +%patch94 -p1 %patch101 -p1 %patch102 -p1 %patch103 -p1 @@ -554,6 +557,7 @@ swap partition while in resuming %patch215 -p1 %patch216 -p1 %patch217 -p1 +%patch218 -p1 %patch233 -p1 %patch234 -p1 %patch236 -p1 From a12859021fea23cb8fb75e83ecb43d6589e7a6d3fbba25738be08986d67a9165 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Wed, 26 Dec 2018 23:21:53 +0000 Subject: [PATCH 43/57] Accepting request 660471 from Base:System OBS-URL: https://build.opensuse.org/request/show/660471 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=197 --- ...efi-refactor-grub_efi_allocate_pages.patch | 120 +++++ 0002-Remove-grub_efi_allocate_pages.patch | 267 ++++++++++ ...EFI_PAGE-definitions-to-efi-memory.h.patch | 90 ++++ ...tral-copy-of-grub_efi_find_mmap_size.patch | 65 +++ ..._efi_get_ram_base-function-for-arm64.patch | 75 +++ ...dd-support-for-EFI-handover-on-ARM64.patch | 489 ++++++++++++++++++ grub2.changes | 11 + grub2.spec | 23 +- 8 files changed, 1135 insertions(+), 5 deletions(-) create mode 100644 0001-efi-refactor-grub_efi_allocate_pages.patch create mode 100644 0002-Remove-grub_efi_allocate_pages.patch create mode 100644 0003-arm64-efi-move-EFI_PAGE-definitions-to-efi-memory.h.patch create mode 100644 0004-efi-Add-central-copy-of-grub_efi_find_mmap_size.patch create mode 100644 0005-efi-Add-grub_efi_get_ram_base-function-for-arm64.patch create mode 100644 0006-Add-support-for-EFI-handover-on-ARM64.patch diff --git a/0001-efi-refactor-grub_efi_allocate_pages.patch b/0001-efi-refactor-grub_efi_allocate_pages.patch new file mode 100644 index 0000000..883954a --- /dev/null +++ b/0001-efi-refactor-grub_efi_allocate_pages.patch @@ -0,0 +1,120 @@ +From f44433a343f4b10b8682f44937e929fb94dda642 Mon Sep 17 00:00:00 2001 +From: Leif Lindholm +Date: Thu, 3 Aug 2017 11:04:23 +0100 +Subject: [PATCH 1/6] efi: refactor grub_efi_allocate_pages + +Expose a new function, grub_efi_allocate_pages_real(), making it possible +to specify allocation type and memory type as supported by the UEFI +AllocatePages boot service. + +Make grub_efi_allocate_pages() a consumer of the new function, +maintaining its old functionality. + +Also delete some left-around #if 1/#else blocks in the affected +functions. + +Signed-off-by: Leif Lindholm +--- + grub-core/kern/efi/mm.c | 46 ++++++++++++++++++++++++---------------------- + include/grub/efi/efi.h | 5 +++++ + 2 files changed, 29 insertions(+), 22 deletions(-) + +diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c +index 04ad549f4..a03a44e71 100644 +--- a/grub-core/kern/efi/mm.c ++++ b/grub-core/kern/efi/mm.c +@@ -147,36 +147,20 @@ grub_efi_allocate_pages_max (grub_efi_physical_address_t max, + + /* Allocate pages. Return the pointer to the first of allocated pages. */ + void * +-grub_efi_allocate_pages (grub_efi_physical_address_t address, +- grub_efi_uintn_t pages) ++grub_efi_allocate_pages_real (grub_efi_physical_address_t address, ++ grub_efi_uintn_t pages, ++ grub_efi_allocate_type_t alloctype, ++ grub_efi_memory_type_t memtype) + { +- grub_efi_allocate_type_t type; + grub_efi_status_t status; + grub_efi_boot_services_t *b; + +-#if 1 + /* Limit the memory access to less than 4GB for 32-bit platforms. */ + if (address > GRUB_EFI_MAX_USABLE_ADDRESS) + return 0; +-#endif +- +-#if 1 +- if (address == 0) +- { +- type = GRUB_EFI_ALLOCATE_MAX_ADDRESS; +- address = GRUB_EFI_MAX_USABLE_ADDRESS; +- } +- else +- type = GRUB_EFI_ALLOCATE_ADDRESS; +-#else +- if (address == 0) +- type = GRUB_EFI_ALLOCATE_ANY_PAGES; +- else +- type = GRUB_EFI_ALLOCATE_ADDRESS; +-#endif + + b = grub_efi_system_table->boot_services; +- status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA, pages, &address); ++ status = efi_call_4 (b->allocate_pages, alloctype, memtype, pages, &address); + if (status != GRUB_EFI_SUCCESS) + return 0; + +@@ -185,7 +169,7 @@ grub_efi_allocate_pages (grub_efi_physical_address_t address, + /* Uggh, the address 0 was allocated... This is too annoying, + so reallocate another one. */ + address = GRUB_EFI_MAX_USABLE_ADDRESS; +- status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA, pages, &address); ++ status = efi_call_4 (b->allocate_pages, alloctype, memtype, pages, &address); + grub_efi_free_pages (0, pages); + if (status != GRUB_EFI_SUCCESS) + return 0; +@@ -194,6 +178,24 @@ grub_efi_allocate_pages (grub_efi_physical_address_t address, + return (void *) ((grub_addr_t) address); + } + ++void * ++grub_efi_allocate_pages (grub_efi_physical_address_t address, ++ grub_efi_uintn_t pages) ++{ ++ grub_efi_allocate_type_t alloctype; ++ ++ if (address == 0) ++ { ++ alloctype = GRUB_EFI_ALLOCATE_MAX_ADDRESS; ++ address = GRUB_EFI_MAX_USABLE_ADDRESS; ++ } ++ else ++ alloctype = GRUB_EFI_ALLOCATE_ADDRESS; ++ ++ return grub_efi_allocate_pages_real (address, pages, alloctype, ++ GRUB_EFI_LOADER_DATA); ++} ++ + /* Free pages starting from ADDRESS. */ + void + grub_efi_free_pages (grub_efi_physical_address_t address, +diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h +index a4ea7831b..c7f2fe6c3 100644 +--- a/include/grub/efi/efi.h ++++ b/include/grub/efi/efi.h +@@ -38,6 +38,11 @@ void *EXPORT_FUNC(grub_efi_open_protocol) (grub_efi_handle_t handle, + int EXPORT_FUNC(grub_efi_set_text_mode) (int on); + void EXPORT_FUNC(grub_efi_stall) (grub_efi_uintn_t microseconds); + void * ++EXPORT_FUNC(grub_efi_allocate_pages_real) (grub_efi_physical_address_t address, ++ grub_efi_uintn_t pages, ++ grub_efi_allocate_type_t alloctype, ++ grub_efi_memory_type_t memtype); ++void * + EXPORT_FUNC(grub_efi_allocate_pages) (grub_efi_physical_address_t address, + grub_efi_uintn_t pages); + void * +-- +2.16.4 + diff --git a/0002-Remove-grub_efi_allocate_pages.patch b/0002-Remove-grub_efi_allocate_pages.patch new file mode 100644 index 0000000..f09905c --- /dev/null +++ b/0002-Remove-grub_efi_allocate_pages.patch @@ -0,0 +1,267 @@ +From bb4cb6d374625d3716380affda56dc4c20da36db Mon Sep 17 00:00:00 2001 +From: Vladimir Serbinenko +Date: Mon, 7 Aug 2017 18:33:29 +0200 +Subject: [PATCH 2/6] Remove grub_efi_allocate_pages. + +grub_efi_allocate_pages Essentially does 2 unrelated things: +* Allocate at fixed address. +* Allocate at any address. + +To switch between 2 different functions it uses address == 0 as magic +value which is wrong as 0 is a perfectly valid fixed adress to allocate at. +--- + grub-core/kern/arm/efi/misc.c | 4 ++-- + grub-core/kern/efi/mm.c | 30 ++++++++++++++---------------- + grub-core/loader/arm64/fdt.c | 2 +- + grub-core/loader/arm64/linux.c | 7 +++---- + grub-core/loader/arm64/xen_boot.c | 7 +++---- + grub-core/loader/i386/efi/linux.c | 2 +- + grub-core/loader/ia64/efi/linux.c | 10 +++++----- + include/grub/autoefi.h | 2 +- + include/grub/efi/efi.h | 4 +++- + 9 files changed, 33 insertions(+), 35 deletions(-) + +diff --git a/grub-core/kern/arm/efi/misc.c b/grub-core/kern/arm/efi/misc.c +index 7cd41842a..c95e8299d 100644 +--- a/grub-core/kern/arm/efi/misc.c ++++ b/grub-core/kern/arm/efi/misc.c +@@ -146,7 +146,7 @@ grub_efi_allocate_loader_memory (grub_uint32_t min_offset, grub_uint32_t size) + continue; + grub_dprintf("mm", "%s: let's allocate some (0x%x) pages @ 0x%08x...\n", + __FUNCTION__, (size >> PAGE_SHIFT), (grub_addr_t) start); +- mem = grub_efi_allocate_pages (start, (size >> PAGE_SHIFT) + 1); ++ mem = grub_efi_allocate_fixed (start, (size >> PAGE_SHIFT) + 1); + grub_dprintf("mm", "%s: retval=0x%08x\n", + __FUNCTION__, (grub_addr_t) mem); + if (! mem) +@@ -189,7 +189,7 @@ grub_efi_prepare_platform (void) + mmap_size = find_mmap_size (); + if (! mmap_size) + return GRUB_ERR_OUT_OF_MEMORY; +- mmap_buf = grub_efi_allocate_pages (0, page_align (mmap_size) >> 12); ++ mmap_buf = grub_efi_allocate_any_pages (page_align (mmap_size) >> 12); + if (! mmap_buf) + return GRUB_ERR_OUT_OF_MEMORY; + +diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c +index a03a44e71..4226f34ec 100644 +--- a/grub-core/kern/efi/mm.c ++++ b/grub-core/kern/efi/mm.c +@@ -179,20 +179,19 @@ grub_efi_allocate_pages_real (grub_efi_physical_address_t address, + } + + void * +-grub_efi_allocate_pages (grub_efi_physical_address_t address, +- grub_efi_uintn_t pages) ++grub_efi_allocate_any_pages (grub_efi_uintn_t pages) + { +- grub_efi_allocate_type_t alloctype; +- +- if (address == 0) +- { +- alloctype = GRUB_EFI_ALLOCATE_MAX_ADDRESS; +- address = GRUB_EFI_MAX_USABLE_ADDRESS; +- } +- else +- alloctype = GRUB_EFI_ALLOCATE_ADDRESS; ++ return grub_efi_allocate_pages_real (GRUB_EFI_MAX_USABLE_ADDRESS, ++ pages, GRUB_EFI_ALLOCATE_MAX_ADDRESS, ++ GRUB_EFI_LOADER_DATA); ++} + +- return grub_efi_allocate_pages_real (address, pages, alloctype, ++void * ++grub_efi_allocate_fixed (grub_efi_physical_address_t address, ++ grub_efi_uintn_t pages) ++{ ++ return grub_efi_allocate_pages_real (address, pages, ++ GRUB_EFI_ALLOCATE_ADDRESS, + GRUB_EFI_LOADER_DATA); + } + +@@ -501,7 +500,7 @@ add_memory_regions (grub_efi_memory_descriptor_t *memory_map, + pages = required_pages; + } + +- addr = grub_efi_allocate_pages (start, pages); ++ addr = grub_efi_allocate_fixed (start, pages); + if (! addr) + grub_fatal ("cannot allocate conventional memory %p with %u pages", + (void *) ((grub_addr_t) start), +@@ -567,8 +566,7 @@ grub_efi_mm_init (void) + int mm_status; + + /* Prepare a memory region to store two memory maps. */ +- memory_map = grub_efi_allocate_pages (0, +- 2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE)); ++ memory_map = grub_efi_allocate_any_pages (2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE)); + if (! memory_map) + grub_fatal ("cannot allocate memory"); + +@@ -586,7 +584,7 @@ grub_efi_mm_init (void) + /* Freeing/allocating operations may increase memory map size. */ + map_size += desc_size * 32; + +- memory_map = grub_efi_allocate_pages (0, 2 * BYTES_TO_PAGES (map_size)); ++ memory_map = grub_efi_allocate_any_pages (2 * BYTES_TO_PAGES (map_size)); + if (! memory_map) + grub_fatal ("cannot allocate memory"); + +diff --git a/grub-core/loader/arm64/fdt.c b/grub-core/loader/arm64/fdt.c +index db49cf649..368001696 100644 +--- a/grub-core/loader/arm64/fdt.c ++++ b/grub-core/loader/arm64/fdt.c +@@ -50,7 +50,7 @@ grub_fdt_load (grub_size_t additional_size) + size += additional_size; + + grub_dprintf ("linux", "allocating %ld bytes for fdt\n", size); +- fdt = grub_efi_allocate_pages (0, GRUB_EFI_BYTES_TO_PAGES (size)); ++ fdt = grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (size)); + if (!fdt) + return NULL; + +diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c +index 9519d2e4d..ee3fcaa86 100644 +--- a/grub-core/loader/arm64/linux.c ++++ b/grub-core/loader/arm64/linux.c +@@ -148,8 +148,7 @@ grub_arm64_uefi_boot_image (grub_addr_t addr, grub_size_t size, char *args) + loaded_image->load_options_size = len = + (grub_strlen (args) + 1) * sizeof (grub_efi_char16_t); + loaded_image->load_options = +- grub_efi_allocate_pages (0, +- GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size)); ++ grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size)); + if (!loaded_image->load_options) + return grub_errno; + +@@ -223,7 +222,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), + grub_dprintf ("linux", "Loading initrd\n"); + + initrd_pages = (GRUB_EFI_BYTES_TO_PAGES (initrd_size)); +- initrd_mem = grub_efi_allocate_pages (0, initrd_pages); ++ initrd_mem = grub_efi_allocate_any_pages (initrd_pages); + if (!initrd_mem) + { + grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory")); +@@ -277,7 +276,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), + grub_loader_unset(); + + grub_dprintf ("linux", "kernel file size: %lld\n", (long long) kernel_size); +- kernel_addr = grub_efi_allocate_pages (0, GRUB_EFI_BYTES_TO_PAGES (kernel_size)); ++ kernel_addr = grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (kernel_size)); + grub_dprintf ("linux", "kernel numpages: %lld\n", + (long long) GRUB_EFI_BYTES_TO_PAGES (kernel_size)); + if (!kernel_addr) +diff --git a/grub-core/loader/arm64/xen_boot.c b/grub-core/loader/arm64/xen_boot.c +index a914eb8e2..ab7c2f850 100644 +--- a/grub-core/loader/arm64/xen_boot.c ++++ b/grub-core/loader/arm64/xen_boot.c +@@ -324,10 +324,9 @@ xen_boot_binary_load (struct xen_boot_binary *binary, grub_file_t file, + grub_dprintf ("xen_loader", "Xen_boot file size: 0x%lx\n", binary->size); + + binary->start +- = (grub_addr_t) grub_efi_allocate_pages (0, +- GRUB_EFI_BYTES_TO_PAGES +- (binary->size + +- binary->align)); ++ = (grub_addr_t) grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES ++ (binary->size + ++ binary->align)); + if (!binary->start) + { + grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory")); +diff --git a/grub-core/loader/i386/efi/linux.c b/grub-core/loader/i386/efi/linux.c +index 549989d1d..27dea343c 100644 +--- a/grub-core/loader/i386/efi/linux.c ++++ b/grub-core/loader/i386/efi/linux.c +@@ -295,7 +295,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), + start = (lh.setup_sects + 1) * 512; + len = grub_file_size(file) - start; + +- kernel_mem = grub_efi_allocate_pages(lh.pref_address, ++ kernel_mem = grub_efi_allocate_fixed(lh.pref_address, + BYTES_TO_PAGES(lh.init_size)); + + if (!kernel_mem) +diff --git a/grub-core/loader/ia64/efi/linux.c b/grub-core/loader/ia64/efi/linux.c +index efaa42ccd..750330d45 100644 +--- a/grub-core/loader/ia64/efi/linux.c ++++ b/grub-core/loader/ia64/efi/linux.c +@@ -252,7 +252,7 @@ allocate_pages (grub_uint64_t align, grub_uint64_t size_pages, + aligned_start += align; + if (aligned_start + size > end) + continue; +- mem = grub_efi_allocate_pages (aligned_start, size_pages); ++ mem = grub_efi_allocate_fixed (aligned_start, size_pages); + if (! mem) + { + grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate memory"); +@@ -326,7 +326,7 @@ grub_linux_boot (void) + mmap_size = find_mmap_size (); + if (! mmap_size) + return grub_errno; +- mmap_buf = grub_efi_allocate_pages (0, page_align (mmap_size) >> 12); ++ mmap_buf = grub_efi_allocate_any_pages (page_align (mmap_size) >> 12); + if (! mmap_buf) + return grub_error (GRUB_ERR_IO, "cannot allocate memory map"); + err = grub_efi_finish_boot_services (&mmap_size, mmap_buf, &map_key, +@@ -422,7 +422,7 @@ grub_load_elf64 (grub_file_t file, void *buffer, const char *filename) + relocate = grub_env_get ("linux_relocate"); + if (!relocate || grub_strcmp (relocate, "force") != 0) + { +- kernel_mem = grub_efi_allocate_pages (low_addr, kernel_pages); ++ kernel_mem = grub_efi_allocate_fixed (low_addr, kernel_pages); + reloc_offset = 0; + } + /* Try to relocate. */ +@@ -524,7 +524,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), + len += grub_strlen (argv[i]) + 1; + len += sizeof (struct ia64_boot_param) + 512; /* Room for extensions. */ + boot_param_pages = page_align (len) >> 12; +- boot_param = grub_efi_allocate_pages (0, boot_param_pages); ++ boot_param = grub_efi_allocate_any_pages (boot_param_pages); + if (boot_param == 0) + { + grub_error (GRUB_ERR_OUT_OF_MEMORY, +@@ -589,7 +589,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), + grub_dprintf ("linux", "Loading initrd\n"); + + initrd_pages = (page_align (initrd_size) >> 12); +- initrd_mem = grub_efi_allocate_pages (0, initrd_pages); ++ initrd_mem = grub_efi_allocate_any_pages (initrd_pages); + if (! initrd_mem) + { + grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate pages"); +diff --git a/include/grub/autoefi.h b/include/grub/autoefi.h +index b75591176..b7a252e07 100644 +--- a/include/grub/autoefi.h ++++ b/include/grub/autoefi.h +@@ -55,7 +55,7 @@ static inline grub_err_t grub_autoefi_prepare (void) + # define SYSTEM_TABLE_PTR GRUB_EFIEMU_SYSTEM_TABLE_PTR + # define SIZEOF_OF_UINTN GRUB_EFIEMU_SIZEOF_OF_UINTN + # define SYSTEM_TABLE GRUB_EFIEMU_SYSTEM_TABLE +-# define grub_efi_allocate_pages(x,y) (x) ++# define grub_efi_allocate_fixed(x,y) (x) + # define grub_efi_free_pages(x,y) GRUB_EFI_SUCCESS + # define grub_autoefi_finish_boot_services grub_efiemu_finish_boot_services + # define EFI_PRESENT 1 +diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h +index c7f2fe6c3..f68a19de4 100644 +--- a/include/grub/efi/efi.h ++++ b/include/grub/efi/efi.h +@@ -43,9 +43,11 @@ EXPORT_FUNC(grub_efi_allocate_pages_real) (grub_efi_physical_address_t address, + grub_efi_allocate_type_t alloctype, + grub_efi_memory_type_t memtype); + void * +-EXPORT_FUNC(grub_efi_allocate_pages) (grub_efi_physical_address_t address, ++EXPORT_FUNC(grub_efi_allocate_fixed) (grub_efi_physical_address_t address, + grub_efi_uintn_t pages); + void * ++EXPORT_FUNC(grub_efi_allocate_any_pages) (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, +-- +2.16.4 + diff --git a/0003-arm64-efi-move-EFI_PAGE-definitions-to-efi-memory.h.patch b/0003-arm64-efi-move-EFI_PAGE-definitions-to-efi-memory.h.patch new file mode 100644 index 0000000..0240283 --- /dev/null +++ b/0003-arm64-efi-move-EFI_PAGE-definitions-to-efi-memory.h.patch @@ -0,0 +1,90 @@ +From 8a84e87b34eeb2e7a8f4ea4036f124c1209c6026 Mon Sep 17 00:00:00 2001 +From: Leif Lindholm +Date: Thu, 1 Feb 2018 18:18:49 +0000 +Subject: [PATCH 3/6] arm64/efi: move EFI_PAGE definitions to efi/memory.h + +The EFI page definitions and macros are generic and should not be confined +to arm64 headers - so move to efi/memory.h. +Also add EFI_PAGE_SIZE macro. + +Update loader sources to reflect new header location. + +Signed-off-by: Leif Lindholm +Reviewed-by: Daniel Kiper +--- + grub-core/loader/arm64/fdt.c | 1 + + grub-core/loader/arm64/linux.c | 1 + + grub-core/loader/arm64/xen_boot.c | 1 + + include/grub/arm64/fdtload.h | 3 --- + include/grub/efi/memory.h | 7 +++++++ + 5 files changed, 10 insertions(+), 3 deletions(-) + +diff --git a/grub-core/loader/arm64/fdt.c b/grub-core/loader/arm64/fdt.c +index 368001696..c61adbe67 100644 +--- a/grub-core/loader/arm64/fdt.c ++++ b/grub-core/loader/arm64/fdt.c +@@ -24,6 +24,7 @@ + #include + #include + #include ++#include + + static void *loaded_fdt; + static void *fdt; +diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c +index ee3fcaa86..364fbb6e6 100644 +--- a/grub-core/loader/arm64/linux.c ++++ b/grub-core/loader/arm64/linux.c +@@ -28,6 +28,7 @@ + #include + #include + #include ++#include + #include + #include + #include +diff --git a/grub-core/loader/arm64/xen_boot.c b/grub-core/loader/arm64/xen_boot.c +index ab7c2f850..f1363024b 100644 +--- a/grub-core/loader/arm64/xen_boot.c ++++ b/grub-core/loader/arm64/xen_boot.c +@@ -30,6 +30,7 @@ + #include + #include + #include ++#include + #include /* required by struct xen_hypervisor_header */ + #include + #include +diff --git a/include/grub/arm64/fdtload.h b/include/grub/arm64/fdtload.h +index 7b9ddba91..713c9424d 100644 +--- a/include/grub/arm64/fdtload.h ++++ b/include/grub/arm64/fdtload.h +@@ -29,7 +29,4 @@ grub_fdt_unload (void); + grub_err_t + grub_fdt_install (void); + +-#define GRUB_EFI_PAGE_SHIFT 12 +-#define GRUB_EFI_BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> GRUB_EFI_PAGE_SHIFT) +- + #endif +diff --git a/include/grub/efi/memory.h b/include/grub/efi/memory.h +index 20526b146..08fe62277 100644 +--- a/include/grub/efi/memory.h ++++ b/include/grub/efi/memory.h +@@ -22,6 +22,13 @@ + #include + #include + ++/* The term "page" in UEFI refers only to a 4 KiB-aligned 4 KiB size region of ++ memory. It is not concerned with underlying translation management concepts, ++ but only used as the granule for memory allocations. */ ++#define GRUB_EFI_PAGE_SHIFT 12 ++#define GRUB_EFI_PAGE_SIZE (1 << GRUB_EFI_PAGE_SHIFT) ++#define GRUB_EFI_BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> GRUB_EFI_PAGE_SHIFT) ++ + #define GRUB_MMAP_REGISTER_BY_FIRMWARE 1 + + grub_err_t grub_machine_mmap_register (grub_uint64_t start, grub_uint64_t size, +-- +2.16.4 + diff --git a/0004-efi-Add-central-copy-of-grub_efi_find_mmap_size.patch b/0004-efi-Add-central-copy-of-grub_efi_find_mmap_size.patch new file mode 100644 index 0000000..6af3dae --- /dev/null +++ b/0004-efi-Add-central-copy-of-grub_efi_find_mmap_size.patch @@ -0,0 +1,65 @@ +From 6ca50ac741b8c826f953b0905d736006b895f912 Mon Sep 17 00:00:00 2001 +From: Leif Lindholm +Date: Mon, 9 Jul 2018 18:33:00 +0100 +Subject: [PATCH 4/6] efi: Add central copy of grub_efi_find_mmap_size + +There are several implementations of this function in the tree. +Add a central version in grub-core/efi/mm.c. + +Signed-off-by: Leif Lindholm +Reviewed-by: Daniel Kiper +--- + grub-core/kern/efi/mm.c | 24 ++++++++++++++++++++++++ + include/grub/efi/efi.h | 1 + + 2 files changed, 25 insertions(+) + +diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c +index 4226f34ec..021d750b6 100644 +--- a/grub-core/kern/efi/mm.c ++++ b/grub-core/kern/efi/mm.c +@@ -315,6 +315,30 @@ grub_efi_finish_boot_services (grub_efi_uintn_t *outbuf_size, void *outbuf, + return GRUB_ERR_NONE; + } + ++/* ++ * To obtain the UEFI memory map, we must pass a buffer of sufficient size ++ * to hold the entire map. This function returns a sane start value for ++ * buffer size. ++ */ ++grub_efi_uintn_t ++grub_efi_find_mmap_size (void) ++{ ++ grub_efi_uintn_t mmap_size = 0; ++ grub_efi_uintn_t desc_size; ++ ++ if (grub_efi_get_memory_map (&mmap_size, NULL, NULL, &desc_size, 0) < 0) ++ { ++ grub_error (GRUB_ERR_IO, "cannot get EFI memory map size"); ++ return 0; ++ } ++ ++ /* ++ * Add an extra page, since UEFI can alter the memory map itself on ++ * callbacks or explicit calls, including console output. ++ */ ++ return ALIGN_UP (mmap_size + GRUB_EFI_PAGE_SIZE, GRUB_EFI_PAGE_SIZE); ++} ++ + /* Get the memory map as defined in the EFI spec. Return 1 if successful, + return 0 if partial, or return -1 if an error occurs. */ + int +diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h +index f68a19de4..e8ae60931 100644 +--- a/include/grub/efi/efi.h ++++ b/include/grub/efi/efi.h +@@ -52,6 +52,7 @@ 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 + EXPORT_FUNC(grub_efi_get_memory_map) (grub_efi_uintn_t *memory_map_size, + grub_efi_memory_descriptor_t *memory_map, +-- +2.16.4 + diff --git a/0005-efi-Add-grub_efi_get_ram_base-function-for-arm64.patch b/0005-efi-Add-grub_efi_get_ram_base-function-for-arm64.patch new file mode 100644 index 0000000..1ebb443 --- /dev/null +++ b/0005-efi-Add-grub_efi_get_ram_base-function-for-arm64.patch @@ -0,0 +1,75 @@ +From 226e83d10e35d1a76e93114366740f994548fe04 Mon Sep 17 00:00:00 2001 +From: Leif Lindholm +Date: Mon, 9 Jul 2018 18:33:01 +0100 +Subject: [PATCH 5/6] efi: Add grub_efi_get_ram_base() function for arm64 + +Since ARM platforms do not have a common memory map, add a helper +function that finds the lowest address region with the EFI_MEMORY_WB +attribute set in the UEFI memory map. + +Required for the arm64 efi linux loader to restrict the initrd +location to where it will be accessible by the kernel at runtime. + +Signed-off-by: Leif Lindholm +Reviewed-by: Daniel Kiper +--- + grub-core/kern/efi/mm.c | 31 +++++++++++++++++++++++++++++++ + include/grub/efi/efi.h | 3 +++ + 2 files changed, 34 insertions(+) + +diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c +index 021d750b6..270d0b8cc 100644 +--- a/grub-core/kern/efi/mm.c ++++ b/grub-core/kern/efi/mm.c +@@ -660,3 +660,34 @@ grub_efi_mm_init (void) + grub_efi_free_pages ((grub_addr_t) memory_map, + 2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE)); + } ++ ++#if defined (__aarch64__) ++grub_err_t ++grub_efi_get_ram_base(grub_addr_t *base_addr) ++{ ++ grub_efi_memory_descriptor_t *memory_map, *desc; ++ grub_efi_uintn_t memory_map_size, desc_size; ++ int ret; ++ ++ memory_map_size = grub_efi_find_mmap_size(); ++ ++ memory_map = grub_malloc (memory_map_size); ++ if (! memory_map) ++ return GRUB_ERR_OUT_OF_MEMORY; ++ ret = grub_efi_get_memory_map (&memory_map_size, memory_map, NULL, ++ &desc_size, NULL); ++ ++ if (ret < 1) ++ return GRUB_ERR_BUG; ++ ++ for (desc = memory_map, *base_addr = GRUB_UINT_MAX; ++ (grub_addr_t) desc < ((grub_addr_t) memory_map + memory_map_size); ++ desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size)) ++ if (desc->attribute & GRUB_EFI_MEMORY_WB) ++ *base_addr = grub_min (*base_addr, desc->physical_start); ++ ++ grub_free(memory_map); ++ ++ return GRUB_ERR_NONE; ++} ++#endif +diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h +index e8ae60931..13bc67d57 100644 +--- a/include/grub/efi/efi.h ++++ b/include/grub/efi/efi.h +@@ -97,6 +97,9 @@ extern void (*EXPORT_VAR(grub_efi_net_config)) (grub_efi_handle_t hnd, + #if defined(__arm__) || defined(__aarch64__) + void *EXPORT_FUNC(grub_efi_get_firmware_fdt)(void); + #endif ++#if defined(__aarch64__) ++grub_err_t EXPORT_FUNC(grub_efi_get_ram_base)(grub_addr_t *); ++#endif + + grub_addr_t grub_efi_modules_addr (void); + +-- +2.16.4 + diff --git a/0006-Add-support-for-EFI-handover-on-ARM64.patch b/0006-Add-support-for-EFI-handover-on-ARM64.patch new file mode 100644 index 0000000..da89f5c --- /dev/null +++ b/0006-Add-support-for-EFI-handover-on-ARM64.patch @@ -0,0 +1,489 @@ +From 17667c24295a4b105bf20a3bd5bb19ef0acaebba Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +Date: Fri, 21 Dec 2018 14:36:10 +0800 +Subject: [PATCH 6/6] Add support for EFI handover on ARM64 + +Add support for EFI handover on ARM64 for loading linux kernel. +--- + grub-core/Makefile.core.def | 9 +- + grub-core/loader/arm64/efi/linux.c | 448 +++++++++++++++++++++++++++++++++++++ + 2 files changed, 453 insertions(+), 4 deletions(-) + create mode 100644 grub-core/loader/arm64/efi/linux.c + +diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def +index 1269f372c..f306311e6 100644 +--- a/grub-core/Makefile.core.def ++++ b/grub-core/Makefile.core.def +@@ -1761,10 +1761,11 @@ module = { + + module = { + name = linuxefi; +- efi = loader/i386/efi/linux.c; +- efi = lib/cmdline.c; +- enable = i386_efi; +- enable = x86_64_efi; ++ arm64 = loader/arm64/efi/linux.c; ++ x86_64 = loader/i386/efi/linux.c; ++ common = lib/cmdline.c; ++ enable = x86_64; ++ enable = arm64; + }; + + module = { +diff --git a/grub-core/loader/arm64/efi/linux.c b/grub-core/loader/arm64/efi/linux.c +new file mode 100644 +index 000000000..4a5c70e4b +--- /dev/null ++++ b/grub-core/loader/arm64/efi/linux.c +@@ -0,0 +1,448 @@ ++/* ++ * GRUB -- GRand Unified Bootloader ++ * Copyright (C) 2013 Free Software Foundation, Inc. ++ * ++ * GRUB is free software: you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation, either version 3 of the License, or ++ * (at your option) any later version. ++ * ++ * GRUB is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with GRUB. If not, see . ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++GRUB_MOD_LICENSE ("GPLv3+"); ++ ++static grub_dl_t my_mod; ++static int loaded; ++ ++static void *kernel_addr; ++static grub_uint64_t kernel_size; ++static grub_uint32_t handover_offset; ++ ++static char *linux_args; ++static grub_uint32_t cmdline_size; ++ ++static grub_addr_t initrd_start; ++static grub_addr_t initrd_end; ++ ++struct grub_arm64_linux_pe_header ++{ ++ grub_uint32_t magic; ++ struct grub_pe32_coff_header coff; ++ struct grub_pe64_optional_header opt; ++}; ++ ++#if defined(__aarch64__) ++# define GRUB_LINUX_ARMXX_MAGIC_SIGNATURE GRUB_ARM64_LINUX_MAGIC ++# define linux_armxx_kernel_header grub_arm64_linux_kernel_header ++# define grub_armxx_linux_pe_header grub_arm64_linux_pe_header ++#endif ++ ++#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; ++} ++ ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wcast-align" ++ ++typedef void (*handover_func) (void *, grub_efi_system_table_t *, void *); ++ ++static grub_err_t ++grub_efi_linux_boot (void *kernel_address, grub_off_t offset, ++ void *kernel_params) ++{ ++ handover_func hf; ++ ++ hf = (handover_func)((char *)kernel_address + offset); ++ hf (grub_efi_image_handle, grub_efi_system_table, kernel_params); ++ ++ return GRUB_ERR_BUG; ++} ++ ++#pragma GCC diagnostic pop ++static grub_err_t ++grub_armxx_efi_linux_check_image (struct linux_armxx_kernel_header * lh) ++{ ++ if (lh->magic != GRUB_LINUX_ARMXX_MAGIC_SIGNATURE) ++ return grub_error(GRUB_ERR_BAD_OS, "invalid magic number"); ++ ++ if ((lh->code0 & 0xffff) != GRUB_EFI_PE_MAGIC) ++ return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, ++ N_("plain image kernel not supported - rebuild with CONFIG_(U)EFI_STUB enabled")); ++ ++ grub_dprintf ("linux", "UEFI stub kernel:\n"); ++ grub_dprintf ("linux", "PE/COFF header @ %08x\n", lh->hdr_offset); ++ ++ return GRUB_ERR_NONE; ++} ++ ++static grub_err_t ++finalize_params_linux (void) ++{ ++ grub_efi_loaded_image_t *loaded_image = NULL; ++ int node, retval, len; ++ ++ void *fdt; ++ ++ fdt = grub_fdt_load (0x400); ++ ++ if (!fdt) ++ goto failure; ++ ++ node = grub_fdt_find_subnode (fdt, 0, "chosen"); ++ if (node < 0) ++ node = grub_fdt_add_subnode (fdt, 0, "chosen"); ++ ++ if (node < 1) ++ goto failure; ++ ++ /* Set initrd info */ ++ if (initrd_start && initrd_end > initrd_start) ++ { ++ grub_dprintf ("linux", "Initrd @ %p-%p\n", ++ (void *) initrd_start, (void *) initrd_end); ++ ++ retval = grub_fdt_set_prop64 (fdt, node, "linux,initrd-start", ++ initrd_start); ++ if (retval) ++ goto failure; ++ retval = grub_fdt_set_prop64 (fdt, node, "linux,initrd-end", ++ initrd_end); ++ if (retval) ++ goto failure; ++ } ++ ++ if (grub_fdt_install() != GRUB_ERR_NONE) ++ goto failure; ++ ++ grub_dprintf ("linux", "Installed/updated FDT configuration table @ %p\n", ++ fdt); ++ ++ /* Convert command line to UCS-2 */ ++ loaded_image = grub_efi_get_loaded_image (grub_efi_image_handle); ++ if (!loaded_image) ++ goto failure; ++ ++ loaded_image->load_options_size = len = ++ (grub_strlen (linux_args) + 1) * sizeof (grub_efi_char16_t); ++ loaded_image->load_options = ++ grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size)); ++ if (!loaded_image->load_options) ++ return grub_error(GRUB_ERR_BAD_OS, "failed to create kernel parameters"); ++ ++ loaded_image->load_options_size = ++ 2 * grub_utf8_to_utf16 (loaded_image->load_options, len, ++ (grub_uint8_t *) linux_args, len, NULL); ++ ++ return GRUB_ERR_NONE; ++ ++failure: ++ grub_fdt_unload(); ++ return grub_error(GRUB_ERR_BAD_OS, "failed to install/update FDT"); ++} ++ ++static void ++free_params (void) ++{ ++ grub_efi_loaded_image_t *loaded_image = NULL; ++ ++ loaded_image = grub_efi_get_loaded_image (grub_efi_image_handle); ++ if (loaded_image) ++ { ++ if (loaded_image->load_options) ++ grub_efi_free_pages ((grub_efi_physical_address_t)(grub_efi_uintn_t)loaded_image->load_options, ++ GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size)); ++ loaded_image->load_options = NULL; ++ loaded_image->load_options_size = 0; ++ } ++} ++ ++static grub_err_t ++grub_armxx_efi_linux_boot_image (grub_addr_t addr, char *args) ++{ ++ grub_err_t retval; ++ ++ retval = finalize_params_linux (); ++ if (retval != GRUB_ERR_NONE) ++ return grub_errno; ++ ++ grub_dprintf ("linux", "linux command line: '%s'\n", args); ++ ++ retval = grub_efi_linux_boot ((char *)addr, handover_offset, (void *)addr); ++ ++ /* Never reached... */ ++ free_params(); ++ return retval; ++} ++ ++static grub_err_t ++grub_linux_boot (void) ++{ ++ return grub_armxx_efi_linux_boot_image((grub_addr_t)kernel_addr, linux_args); ++} ++ ++static grub_err_t ++grub_linux_unload (void) ++{ ++ grub_dl_unref (my_mod); ++ loaded = 0; ++ if (initrd_start) ++ grub_efi_free_pages ((grub_efi_physical_address_t) initrd_start, ++ GRUB_EFI_BYTES_TO_PAGES (initrd_end - initrd_start)); ++ initrd_start = initrd_end = 0; ++ grub_free (linux_args); ++ if (kernel_addr) ++ grub_efi_free_pages ((grub_addr_t) kernel_addr, ++ GRUB_EFI_BYTES_TO_PAGES (kernel_size)); ++ grub_fdt_unload (); ++ return GRUB_ERR_NONE; ++} ++ ++/* ++ * As per linux/Documentation/arm/Booting ++ * ARM initrd needs to be covered by kernel linear mapping, ++ * so place it in the first 512MB of DRAM. ++ * ++ * As per linux/Documentation/arm64/booting.txt ++ * ARM64 initrd needs to be contained entirely within a 1GB aligned window ++ * of up to 32GB of size that covers the kernel image as well. ++ * Since the EFI stub loader will attempt to load the kernel near start of ++ * RAM, place the buffer in the first 32GB of RAM. ++ */ ++#ifdef __arm__ ++#define INITRD_MAX_ADDRESS_OFFSET (512U * 1024 * 1024) ++#else /* __aarch64__ */ ++#define INITRD_MAX_ADDRESS_OFFSET (32ULL * 1024 * 1024 * 1024) ++#endif ++ ++/* ++ * This function returns a pointer to a legally allocated initrd buffer, ++ * or NULL if unsuccessful ++ */ ++static void * ++allocate_initrd_mem (int initrd_pages) ++{ ++ grub_addr_t max_addr; ++ ++ if (grub_efi_get_ram_base (&max_addr) != GRUB_ERR_NONE) ++ return NULL; ++ ++ max_addr += INITRD_MAX_ADDRESS_OFFSET - 1; ++ ++ return grub_efi_allocate_pages_real (max_addr, initrd_pages, ++ GRUB_EFI_ALLOCATE_MAX_ADDRESS, ++ GRUB_EFI_LOADER_DATA); ++} ++ ++static grub_err_t ++grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), ++ int argc, char *argv[]) ++{ ++ struct grub_linux_initrd_context initrd_ctx = { 0, 0, 0 }; ++ int initrd_size, initrd_pages; ++ void *initrd_mem = NULL; ++ ++ if (argc == 0) ++ { ++ grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); ++ goto fail; ++ } ++ ++ if (!loaded) ++ { ++ grub_error (GRUB_ERR_BAD_ARGUMENT, ++ N_("you need to load the kernel first")); ++ goto fail; ++ } ++ ++ if (grub_initrd_init (argc, argv, &initrd_ctx)) ++ goto fail; ++ ++ initrd_size = grub_get_initrd_size (&initrd_ctx); ++ grub_dprintf ("linux", "Loading initrd\n"); ++ ++ initrd_pages = (GRUB_EFI_BYTES_TO_PAGES (initrd_size)); ++ initrd_mem = allocate_initrd_mem (initrd_pages); ++ ++ if (!initrd_mem) ++ { ++ grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory")); ++ goto fail; ++ } ++ ++ if (grub_initrd_load (&initrd_ctx, argv, initrd_mem)) ++ goto fail; ++ ++ initrd_start = (grub_addr_t) initrd_mem; ++ initrd_end = initrd_start + initrd_size; ++ grub_dprintf ("linux", "[addr=%p, size=0x%x]\n", ++ (void *) initrd_start, initrd_size); ++ ++ fail: ++ grub_initrd_close (&initrd_ctx); ++ if (initrd_mem && !initrd_start) ++ grub_efi_free_pages ((grub_addr_t) initrd_mem, initrd_pages); ++ ++ return grub_errno; ++} ++ ++static grub_err_t ++grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), ++ int argc, char *argv[]) ++{ ++ grub_file_t file = 0; ++ struct linux_armxx_kernel_header lh; ++ struct grub_armxx_linux_pe_header *pe; ++ ++ grub_dl_ref (my_mod); ++ ++ if (argc == 0) ++ { ++ grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); ++ goto fail; ++ } ++ ++ file = grub_file_open (argv[0]); ++ if (!file) ++ goto fail; ++ ++ kernel_size = grub_file_size (file); ++ ++ if (grub_file_read (file, &lh, sizeof (lh)) < (long) sizeof (lh)) ++ return grub_errno; ++ ++ if (grub_armxx_efi_linux_check_image (&lh) != GRUB_ERR_NONE) ++ goto fail; ++ ++ grub_loader_unset(); ++ ++ grub_dprintf ("linux", "kernel file size: %lld\n", (long long) kernel_size); ++ kernel_addr = grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (kernel_size)); ++ grub_dprintf ("linux", "kernel numpages: %lld\n", ++ (long long) GRUB_EFI_BYTES_TO_PAGES (kernel_size)); ++ if (!kernel_addr) ++ { ++ grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory")); ++ goto fail; ++ } ++ ++ grub_file_seek (file, 0); ++ if (grub_file_read (file, kernel_addr, kernel_size) ++ < (grub_int64_t) kernel_size) ++ { ++ if (!grub_errno) ++ grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"), argv[0]); ++ goto fail; ++ } ++ ++ grub_dprintf ("linux", "kernel @ %p\n", kernel_addr); ++ ++ if (!grub_linuxefi_secure_validate (kernel_addr, kernel_size)) ++ { ++ grub_error (GRUB_ERR_INVALID_COMMAND, N_("%s has invalid signature"), argv[0]); ++ goto fail; ++ } ++ ++ pe = (void *)((unsigned long)kernel_addr + lh.hdr_offset); ++ handover_offset = pe->opt.entry_addr; ++ ++ cmdline_size = grub_loader_cmdline_size (argc, argv) + sizeof (LINUX_IMAGE); ++ linux_args = grub_malloc (cmdline_size); ++ if (!linux_args) ++ { ++ grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory")); ++ goto fail; ++ } ++ grub_memcpy (linux_args, LINUX_IMAGE, sizeof (LINUX_IMAGE)); ++ grub_create_loader_cmdline (argc, argv, ++ linux_args + sizeof (LINUX_IMAGE) - 1, ++ cmdline_size); ++ ++ if (grub_errno == GRUB_ERR_NONE) ++ { ++ grub_loader_set (grub_linux_boot, grub_linux_unload, 0); ++ loaded = 1; ++ } ++ ++fail: ++ if (file) ++ grub_file_close (file); ++ ++ if (grub_errno != GRUB_ERR_NONE) ++ { ++ grub_dl_unref (my_mod); ++ loaded = 0; ++ } ++ ++ if (linux_args && !loaded) ++ grub_free (linux_args); ++ ++ if (kernel_addr && !loaded) ++ grub_efi_free_pages ((grub_addr_t) kernel_addr, ++ GRUB_EFI_BYTES_TO_PAGES (kernel_size)); ++ ++ return grub_errno; ++} ++ ++ ++static grub_command_t cmd_linux, cmd_initrd; ++ ++GRUB_MOD_INIT (linux) ++{ ++ cmd_linux = grub_register_command ("linuxefi", grub_cmd_linux, 0, ++ N_("Load Linux.")); ++ cmd_initrd = grub_register_command ("initrdefi", grub_cmd_initrd, 0, ++ N_("Load initrd.")); ++ my_mod = mod; ++} ++ ++GRUB_MOD_FINI (linux) ++{ ++ grub_unregister_command (cmd_linux); ++ grub_unregister_command (cmd_initrd); ++} +-- +2.16.4 + diff --git a/grub2.changes b/grub2.changes index 6483595..de01bf0 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,14 @@ +------------------------------------------------------------------- +Thu Dec 20 09:21:27 UTC 2018 - mchang@suse.com + +- Support for UEFI Secure Boot on AArch64 (FATE#326541) + * 0001-efi-refactor-grub_efi_allocate_pages.patch + * 0002-Remove-grub_efi_allocate_pages.patch + * 0003-arm64-efi-move-EFI_PAGE-definitions-to-efi-memory.h.patch + * 0004-efi-Add-central-copy-of-grub_efi_find_mmap_size.patch + * 0005-efi-Add-grub_efi_get_ram_base-function-for-arm64.patch + * 0006-Add-support-for-EFI-handover-on-ARM64.patch + ------------------------------------------------------------------- Mon Nov 26 06:54:34 UTC 2018 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 707c3e4..c750ad6 100644 --- a/grub2.spec +++ b/grub2.spec @@ -46,7 +46,7 @@ BuildRequires: texinfo %endif BuildRequires: python3 BuildRequires: xz-devel -%ifarch x86_64 +%ifarch x86_64 aarch64 %if 0%{?suse_version} >= 1230 || 0%{?suse_version} == 1110 BuildRequires: openssl >= 0.9.8 BuildRequires: pesign-obs-integration @@ -298,6 +298,13 @@ Patch421: 0002-AUDIT-0-http-boot-tracker-bug.patch # and/or use fallback entry if default kernel entry removed (bsc#1065349) 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: 0001-efi-refactor-grub_efi_allocate_pages.patch +Patch451: 0002-Remove-grub_efi_allocate_pages.patch +Patch452: 0003-arm64-efi-move-EFI_PAGE-definitions-to-efi-memory.h.patch +Patch453: 0004-efi-Add-central-copy-of-grub_efi_find_mmap_size.patch +Patch454: 0005-efi-Add-grub_efi_get_ram_base-function-for-arm64.patch +Patch455: 0006-Add-support-for-EFI-handover-on-ARM64.patch # Use pkg-config to find Freetype2 Patch500: grub2-freetype-pkgconfig.patch Patch501: grub2-btrfs-help-on-snapper-rollback.patch @@ -587,6 +594,12 @@ swap partition while in resuming %patch421 -p1 %patch430 -p1 %patch431 -p1 +%patch450 -p1 +%patch451 -p1 +%patch452 -p1 +%patch453 -p1 +%patch454 -p1 +%patch455 -p1 %patch500 -p1 %patch501 -p1 @@ -697,7 +710,7 @@ CD_MODULES=" all_video boot cat chain configfile echo true \ PXE_MODULES="efinet tftp http" CRYPTO_MODULES="luks gcry_rijndael gcry_sha1 gcry_sha256" -%ifarch x86_64 +%ifarch x86_64 aarch64 CD_MODULES="${CD_MODULES} linuxefi" %else CD_MODULES="${CD_MODULES} linux" @@ -712,7 +725,7 @@ GRUB_MODULES="${CD_MODULES} ${FS_MODULES} ${PXE_MODULES} ${CRYPTO_MODULES} mdrai # ext2 btrfs normal chain boot configfile linux appleldr minicmd \ # loadbios reboot halt search font gfxterm -%ifarch x86_64 +%ifarch x86_64 aarch64 %if 0%{?suse_version} >= 1230 || 0%{?suse_version} == 1110 if test -e %{_sourcedir}/_projectcert.crt ; then prjsubject=$(openssl x509 -in %{_sourcedir}/_projectcert.crt -noout -subject_hash) @@ -793,7 +806,7 @@ install -m 644 grub.efi grub-tpm.efi $RPM_BUILD_ROOT%{_libdir}/%{name}/%{grubefi install -d $RPM_BUILD_ROOT%{sysefidir} ln -sf ../../../%{_libdir}/%{name}/%{grubefiarch}/grub.efi $RPM_BUILD_ROOT%{sysefidir}/grub.efi -%ifarch x86_64 +%ifarch x86_64 aarch64 %if 0%{?suse_version} >= 1230 || 0%{?suse_version} == 1110 export BRP_PESIGN_FILES="%{_libdir}/%{name}/%{grubefiarch}/grub.efi %{_libdir}/%{name}/%{grubefiarch}/grub-tpm.efi" install -m 444 grub.der $RPM_BUILD_ROOT%{sysefidir}/ @@ -1197,7 +1210,7 @@ fi %dir %{sysefidir} %{sysefidir}/grub.efi -%ifarch x86_64 +%ifarch x86_64 aarch64 %if 0%{?suse_version} >= 1230 || 0%{?suse_version} == 1110 %{sysefidir}/grub.der %endif From 04ef4f73ca9d87c8ad3cd6b7ae2e06009cfa4b94ae5efa12356b330c4de6c2a6 Mon Sep 17 00:00:00 2001 From: Stephan Kulow Date: Wed, 6 Feb 2019 14:44:34 +0000 Subject: [PATCH 44/57] Accepting request 669452 from Base:System OBS-URL: https://build.opensuse.org/request/show/669452 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=198 --- grub2-efi-xen-chainload.patch | 56 +++- grub2-efi-xen-removable.patch | 24 +- ...-support-scrolling-menu-entry-s-text.patch | 267 ++++++++++++++++++ grub2-move-initrd-upper.patch | 33 +++ grub2-rpmlintrc | 1 - ...-the-resolution-for-fixed-bimap-font.patch | 59 ++++ grub2.changes | 28 ++ grub2.rpmlintrc | 4 + grub2.spec | 220 +++++++++------ 9 files changed, 581 insertions(+), 111 deletions(-) create mode 100644 grub2-gfxmenu-support-scrolling-menu-entry-s-text.patch create mode 100644 grub2-move-initrd-upper.patch delete mode 100644 grub2-rpmlintrc create mode 100644 grub2-video-limit-the-resolution-for-fixed-bimap-font.patch diff --git a/grub2-efi-xen-chainload.patch b/grub2-efi-xen-chainload.patch index 298b40e..beb18f2 100644 --- a/grub2-efi-xen-chainload.patch +++ b/grub2-efi-xen-chainload.patch @@ -19,15 +19,15 @@ V2: XEN hypervisor version with sections for different kernels, avoiding useless duplicates for sym-linked hypervisors. and removing previously installed files from ESP. +V3: +- support move to '/usr/share/efi/$machine' for EFI-binaries. (bsc#1122563) --- - util/grub.d/20_linux_xen.in | 88 +++++++++++++++++++++++++++++++++++++++++++- - 1 file changed, 86 insertions(+), 2 deletions(-) + util/grub.d/20_linux_xen.in | 109 +++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 97 insertions(+), 12 deletions(-) -Index: grub-2.02~beta2/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 +--- a/util/grub.d/20_linux_xen.in ++++ b/util/grub.d/20_linux_xen.in @@ -21,6 +21,8 @@ prefix="@prefix@" exec_prefix="@exec_prefix@" datarootdir="@datarootdir@" @@ -37,7 +37,7 @@ Index: grub-2.02~beta2/util/grub.d/20_linux_xen.in . "$pkgdatadir/grub-mkconfig_lib" export TEXTDOMAIN=@PACKAGE@ -@@ -36,9 +38,11 @@ CLASS="--class gnu-linux --class gnu --c +@@ -36,11 +38,23 @@ CLASS="--class gnu-linux --class gnu --c if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then OS=GNU/Linux @@ -49,8 +49,20 @@ Index: grub-2.02~beta2/util/grub.d/20_linux_xen.in + CLASS="--class ${os} ${CLASS}" fi ++machine=`uname -m` ++ ++case "$machine" in ++ i?86) GENKERNEL_ARCH="x86" ;; ++ mips|mips64) GENKERNEL_ARCH="mips" ;; ++ mipsel|mips64el) GENKERNEL_ARCH="mipsel" ;; ++ arm*) GENKERNEL_ARCH="arm" ;; ++ *) GENKERNEL_ARCH="$machine" ;; ++esac ++ # loop-AES arranges things so that /dev/loop/X can be our root device, but -@@ -85,6 +89,31 @@ esac + # the initrds that Linux uses don't like that. + case ${GRUB_DEVICE} in +@@ -87,6 +101,32 @@ esac title_correction_code= @@ -59,7 +71,8 @@ Index: grub-2.02~beta2/util/grub.d/20_linux_xen.in + err_msg="" + efi_dir="/boot/efi/efi/${os}" + grub_dir=/boot/@PACKAGE@ -+ xen_dir=/usr/lib64/efi ++ xen_dir=/usr/share/efi/$machine ++ [ -d $xen_dir ] || xen_dir=/usr/lib64/efi + for d in $grub_dir $efi_dir $xen_dir; do + [ ! -d "$d" ] || continue + err_msg="${err_msg}$ME: Essential directory '$d' not found!\n" @@ -82,7 +95,7 @@ Index: grub-2.02~beta2/util/grub.d/20_linux_xen.in linux_entry () { os="$1" -@@ -122,6 +151,40 @@ linux_entry () +@@ -124,6 +164,40 @@ linux_entry () save_default_entry | grub_add_tab | sed "s/^/$submenu_indentation/" fi @@ -123,7 +136,24 @@ Index: grub-2.02~beta2/util/grub.d/20_linux_xen.in if [ -z "${prepare_boot_cache}" ]; then prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | grub_add_tab)" fi -@@ -219,6 +282,24 @@ while [ "x${xen_list}" != "x" ] ; do +@@ -200,16 +274,6 @@ boot_device_id= + + title_correction_code= + +-machine=`uname -m` +- +-case "$machine" in +- i?86) GENKERNEL_ARCH="x86" ;; +- mips|mips64) GENKERNEL_ARCH="mips" ;; +- mipsel|mips64el) GENKERNEL_ARCH="mipsel" ;; +- arm*) GENKERNEL_ARCH="arm" ;; +- *) GENKERNEL_ARCH="$machine" ;; +-esac +- + # Extra indentation to add to menu entries in a submenu. We're not in a submenu + # yet, so it's empty. In a submenu it will be equal to '\t' (one tab). + submenu_indentation="" +@@ -223,6 +287,24 @@ while [ "x${xen_list}" != "x" ] ; do xen_dirname=`dirname ${current_xen}` rel_xen_dirname=`make_system_path_relative_to_its_root $xen_dirname` xen_version=`echo $xen_basename | sed -e "s,.gz$,,g;s,^xen-,,g"` @@ -148,7 +178,7 @@ Index: grub-2.02~beta2/util/grub.d/20_linux_xen.in if [ -z "$boot_device_id" ]; then boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")" fi -@@ -283,7 +364,6 @@ while [ "x${xen_list}" != "x" ] ; do +@@ -287,7 +369,6 @@ while [ "x${xen_list}" != "x" ] ; do if [ x"$is_top_level" != xtrue ]; then echo ' }' fi @@ -156,7 +186,7 @@ Index: grub-2.02~beta2/util/grub.d/20_linux_xen.in done # If at least one kernel was found, then we need to -@@ -293,3 +373,7 @@ if [ x"$is_top_level" != xtrue ]; then +@@ -297,3 +378,7 @@ if [ x"$is_top_level" != xtrue ]; then fi echo "$title_correction_code" diff --git a/grub2-efi-xen-removable.patch b/grub2-efi-xen-removable.patch index 6380b93..5bfc2dd 100644 --- a/grub2-efi-xen-removable.patch +++ b/grub2-efi-xen-removable.patch @@ -16,11 +16,13 @@ This patch fixes the problem by ensuring the directory available to Xen installation if any Xen hypervisor found and independent to grub boot path $cmdpath to work. -Index: grub-2.02/util/grub.d/20_linux_xen.in -=================================================================== ---- grub-2.02.orig/util/grub.d/20_linux_xen.in -+++ grub-2.02/util/grub.d/20_linux_xen.in -@@ -91,31 +91,6 @@ esac +--- + util/grub.d/20_linux_xen.in | 62 ++++++++++++++++++++++++-------------------- + 1 file changed, 35 insertions(+), 27 deletions(-) + +--- a/util/grub.d/20_linux_xen.in ++++ b/util/grub.d/20_linux_xen.in +@@ -101,32 +101,6 @@ esac title_correction_code= @@ -29,7 +31,8 @@ Index: grub-2.02/util/grub.d/20_linux_xen.in - err_msg="" - efi_dir="/boot/efi/efi/${os}" - grub_dir=/boot/@PACKAGE@ -- xen_dir=/usr/lib64/efi +- xen_dir=/usr/share/efi/$machine +- [ -d $xen_dir ] || xen_dir=/usr/lib64/efi - for d in $grub_dir $efi_dir $xen_dir; do - [ ! -d "$d" ] || continue - err_msg="${err_msg}$ME: Essential directory '$d' not found!\n" @@ -52,7 +55,7 @@ Index: grub-2.02/util/grub.d/20_linux_xen.in grub2_unquote () { awk ' -@@ -223,10 +198,15 @@ linux_entry () +@@ -234,10 +208,15 @@ linux_entry () kernel=${basename} root=${linux_root_device_thisversion} ${args_unq} ramdisk=${initrd} EOF @@ -69,7 +72,7 @@ Index: grub-2.02/util/grub.d/20_linux_xen.in } EOF for f in ${grub_dir}/$xen_cfg ${xen_dir}/${xen_basename} ${dirname}/${basename} ${dirname}/${initrd}; do -@@ -307,6 +287,7 @@ else +@@ -318,6 +297,7 @@ else done fi prepare_boot_cache= @@ -77,7 +80,7 @@ Index: grub-2.02/util/grub.d/20_linux_xen.in boot_device_id= title_correction_code= -@@ -327,6 +308,33 @@ submenu_indentation="" +@@ -328,6 +308,34 @@ submenu_indentation="" is_top_level=true @@ -86,7 +89,8 @@ Index: grub-2.02/util/grub.d/20_linux_xen.in + err_msg="" + efi_dir="/boot/efi/efi/${os}" + grub_dir=/boot/grub2 -+ xen_dir=/usr/lib64/efi ++ xen_dir=/usr/share/efi/$machine ++ [ -d $xen_dir ] || xen_dir=/usr/lib64/efi + for d in $grub_dir $xen_dir; do + [ ! -d "$d" ] || continue + err_msg="${err_msg}$ME: Essential directory '$d' not found!\n" diff --git a/grub2-gfxmenu-support-scrolling-menu-entry-s-text.patch b/grub2-gfxmenu-support-scrolling-menu-entry-s-text.patch new file mode 100644 index 0000000..471debc --- /dev/null +++ b/grub2-gfxmenu-support-scrolling-menu-entry-s-text.patch @@ -0,0 +1,267 @@ +From b4c5f80fbfaf912553eca1b12da6fc49de4ae37f Mon Sep 17 00:00:00 2001 +From: Michael Chang +Date: Mon, 7 Jan 2019 17:55:05 +0800 +Subject: [PATCH] gfxmenu: support scrolling menu entry's text + +If menu entry's title text is longer than its display width, the +overlong text simply get truncated. The only possible way to view the +full text is through the menu editing mode, but is a hassle switching +over the mode back and forth. Also menu editing mode could be password +protected which makes it not generally available to everyone. + +This patch implemented scrolling text support to the title of grub's +gfxmenu to make it convenient for viewing the truncated text by pressing +the ctrl+l and ctrl+r to scroll the highlighted text left and right. The +scrolled result will remain in place to help memorizing it after +changing highlight to other entry. +--- + grub-core/gfxmenu/gfxmenu.c | 3 +++ + grub-core/gfxmenu/gui_label.c | 2 ++ + grub-core/gfxmenu/gui_list.c | 38 ++++++++++++++++++++++++++++++++++ + grub-core/gfxmenu/view.c | 48 +++++++++++++++++++++++++++++++++++++++++++ + grub-core/normal/menu.c | 16 +++++++++++++++ + include/grub/gfxmenu_view.h | 4 ++++ + include/grub/menu_viewer.h | 1 + + 7 files changed, 112 insertions(+) + +diff --git a/grub-core/gfxmenu/gfxmenu.c b/grub-core/gfxmenu/gfxmenu.c +index 8a17dda2c..e834895fb 100644 +--- a/grub-core/gfxmenu/gfxmenu.c ++++ b/grub-core/gfxmenu/gfxmenu.c +@@ -108,6 +108,8 @@ grub_gfxmenu_try (int entry, grub_menu_t menu, int nested) + view->menu = menu; + view->nested = nested; + view->first_timeout = -1; ++ if (menu->size) ++ view->menu_title_offset = grub_zalloc (sizeof (*view->menu_title_offset) * menu->size); + + grub_video_set_viewport (0, 0, mode_info.width, mode_info.height); + if (view->double_repaint) +@@ -123,6 +125,7 @@ grub_gfxmenu_try (int entry, grub_menu_t menu, int nested) + instance->fini = grub_gfxmenu_viewer_fini; + instance->print_timeout = grub_gfxmenu_print_timeout; + instance->clear_timeout = grub_gfxmenu_clear_timeout; ++ instance->scroll_chosen_entry = grub_gfxmenu_scroll_chosen_entry; + + grub_menu_register_viewer (instance); + +diff --git a/grub-core/gfxmenu/gui_label.c b/grub-core/gfxmenu/gui_label.c +index a4c817891..8b1358dd4 100644 +--- a/grub-core/gfxmenu/gui_label.c ++++ b/grub-core/gfxmenu/gui_label.c +@@ -192,6 +192,8 @@ label_set_property (void *vself, const char *name, const char *value) + "or `c' for a command-line."); + else if (grub_strcmp (value, "@KEYMAP_SHORT@") == 0) + value = _("enter: boot, `e': options, `c': cmd-line"); ++ else if (grub_strcmp (value, "@SUSE_KEYMAP_SCROLL_ENTRY@") == 0) ++ value = _("ctrl+l: scroll entry left, ctrl+r: scroll entry right"); + /* FIXME: Add more templates here if needed. */ + self->template = grub_strdup (value); + self->text = grub_xasprintf (value, self->value); +diff --git a/grub-core/gfxmenu/gui_list.c b/grub-core/gfxmenu/gui_list.c +index 01477cdf2..90487aef4 100644 +--- a/grub-core/gfxmenu/gui_list.c ++++ b/grub-core/gfxmenu/gui_list.c +@@ -24,6 +24,7 @@ + #include + #include + #include ++#include + + enum scrollbar_slice_mode { + SCROLLBAR_SLICE_WEST, +@@ -314,6 +315,33 @@ draw_scrollbar (list_impl_t self, + thumb->draw (thumb, thumbx, thumby); + } + ++static const char * ++grub_utf8_offset_code (const char *src, grub_size_t srcsize, int num) ++{ ++ int count = 0; ++ grub_uint32_t code = 0; ++ ++ while (srcsize && num) ++ { ++ if (srcsize != (grub_size_t)-1) ++ srcsize--; ++ if (!grub_utf8_process ((grub_uint8_t)*src++, &code, &count)) ++ return 0; ++ if (count != 0) ++ continue; ++ if (code == 0) ++ return 0; ++ if (code > GRUB_UNICODE_LAST_VALID) ++ return 0; ++ --num; ++ } ++ ++ if (!num) ++ return src; ++ ++ return 0; ++} ++ + /* Draw the list of items. */ + static void + draw_menu (list_impl_t self, int num_shown_items) +@@ -433,6 +461,16 @@ draw_menu (list_impl_t self, int num_shown_items) + const char *item_title = + grub_menu_get_entry (self->view->menu, menu_index)->title; + ++ { ++ int off = self->view->menu_title_offset[menu_index]; ++ const char *scrolled_title; ++ ++ scrolled_title = grub_utf8_offset_code (item_title, grub_strlen (item_title), off); ++ ++ if (scrolled_title) ++ item_title = scrolled_title; ++ } ++ + sviewport.y = item_top + top_pad; + sviewport.width = viewport_width; + grub_gui_set_viewport (&sviewport, &svpsave); +diff --git a/grub-core/gfxmenu/view.c b/grub-core/gfxmenu/view.c +index ad5e82b81..7aed7faa1 100644 +--- a/grub-core/gfxmenu/view.c ++++ b/grub-core/gfxmenu/view.c +@@ -37,6 +37,7 @@ + #include + #include + #include ++#include + + static void + init_terminal (grub_gfxmenu_view_t view); +@@ -142,6 +143,7 @@ grub_gfxmenu_view_destroy (grub_gfxmenu_view_t view) + grub_free (view->title_text); + grub_free (view->progress_message_text); + grub_free (view->theme_path); ++ grub_free (view->menu_title_offset); + if (view->canvas) + view->canvas->component.ops->destroy (view->canvas); + grub_free (view); +@@ -410,6 +412,52 @@ grub_gfxmenu_set_chosen_entry (int entry, void *data) + grub_gfxmenu_redraw_menu (view); + } + ++static int ++grub_utf8_get_num_code (const char *src, grub_size_t srcsize) ++{ ++ int count = 0; ++ grub_uint32_t code = 0; ++ int num = 0; ++ ++ while (srcsize) ++ { ++ if (srcsize != (grub_size_t)-1) ++ srcsize--; ++ if (!grub_utf8_process ((grub_uint8_t)*src++, &code, &count)) ++ return 0; ++ if (count != 0) ++ continue; ++ if (code == 0) ++ return num; ++ if (code > GRUB_UNICODE_LAST_VALID) ++ return 0; ++ ++num; ++ } ++ ++ return num; ++} ++ ++void ++grub_gfxmenu_scroll_chosen_entry (void *data, int diren) ++{ ++ grub_gfxmenu_view_t view = data; ++ const char *item_title; ++ int off; ++ ++ if (!view->menu->size) ++ return; ++ ++ item_title =grub_menu_get_entry (view->menu, view->selected)->title; ++ off = view->menu_title_offset[view->selected] + diren; ++ ++ if (off < 0 ++ || off > grub_utf8_get_num_code (item_title, grub_strlen(item_title))) ++ return; ++ ++ view->menu_title_offset[view->selected] = off; ++ grub_gfxmenu_redraw_menu (view); ++} ++ + static void + grub_gfxmenu_draw_terminal_box (void) + { +diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c +index e7a83c2d6..0af20d052 100644 +--- a/grub-core/normal/menu.c ++++ b/grub-core/normal/menu.c +@@ -376,6 +376,15 @@ menu_set_chosen_entry (int entry) + cur->set_chosen_entry (entry, cur->data); + } + ++static void ++menu_scroll_chosen_entry (int diren) ++{ ++ struct grub_menu_viewer *cur; ++ for (cur = viewers; cur; cur = cur->next) ++ if (cur->scroll_chosen_entry) ++ cur->scroll_chosen_entry (cur->data, diren); ++} ++ + static void + menu_print_timeout (int timeout) + { +@@ -755,6 +764,13 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot) + menu_set_chosen_entry (current_entry); + break; + ++ case GRUB_TERM_CTRL | 'l': ++ menu_scroll_chosen_entry (1); ++ break; ++ case GRUB_TERM_CTRL | 'r': ++ menu_scroll_chosen_entry (-1); ++ break; ++ + case '\n': + case '\r': + case GRUB_TERM_KEY_RIGHT: +diff --git a/include/grub/gfxmenu_view.h b/include/grub/gfxmenu_view.h +index 4203c8fb9..56c0d17ae 100644 +--- a/include/grub/gfxmenu_view.h ++++ b/include/grub/gfxmenu_view.h +@@ -61,6 +61,8 @@ void + grub_gfxmenu_print_timeout (int timeout, void *data); + void + grub_gfxmenu_set_chosen_entry (int entry, void *data); ++void ++grub_gfxmenu_scroll_chosen_entry (void *data, int diren); + + grub_err_t grub_font_draw_string (const char *str, + grub_font_t font, +@@ -119,6 +121,8 @@ struct grub_gfxmenu_view + int nested; + + int first_timeout; ++ ++ int *menu_title_offset; + }; + + #endif /* ! GRUB_GFXMENU_VIEW_HEADER */ +diff --git a/include/grub/menu_viewer.h b/include/grub/menu_viewer.h +index c6513c4e8..5f2a39dc9 100644 +--- a/include/grub/menu_viewer.h ++++ b/include/grub/menu_viewer.h +@@ -33,6 +33,7 @@ struct grub_menu_viewer + void (*set_chosen_entry) (int entry, void *data); + void (*print_timeout) (int timeout, void *data); + void (*clear_timeout) (void *data); ++ void (*scroll_chosen_entry) (void *data, int diren); + void (*fini) (void *fini); + }; + +-- +2.16.4 + diff --git a/grub2-move-initrd-upper.patch b/grub2-move-initrd-upper.patch new file mode 100644 index 0000000..36f4ce9 --- /dev/null +++ b/grub2-move-initrd-upper.patch @@ -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 + # 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 diff --git a/grub2-rpmlintrc b/grub2-rpmlintrc deleted file mode 100644 index 17aba33..0000000 --- a/grub2-rpmlintrc +++ /dev/null @@ -1 +0,0 @@ -addFilter('arch-independent-package-contains-binary-or-object') diff --git a/grub2-video-limit-the-resolution-for-fixed-bimap-font.patch b/grub2-video-limit-the-resolution-for-fixed-bimap-font.patch new file mode 100644 index 0000000..363b08a --- /dev/null +++ b/grub2-video-limit-the-resolution-for-fixed-bimap-font.patch @@ -0,0 +1,59 @@ +From 5f7f27d1198ef425f4943cc10132509415bbaf55 Mon Sep 17 00:00:00 2001 +From: Michael Chang +Date: Thu, 24 Jan 2019 16:41:04 +0800 +Subject: [PATCH] video: limit the resolution for fixed bimap font + +As grub uses fixed bitmap font and also its size is a fixed property, it is not +possible to accommodate to all resolutions, therefore we raise some limit to +the preferred resolution as most themes are designed on popular device and the +resolution in its prime, which is supposedly Full HD. + +This change also makes grub font readable on hiDPI device without going through +the steps in. + +https://wiki.archlinux.org/index.php/HiDPI#GRUB +--- + grub-core/video/efi_gop.c | 7 +++++++ + grub-core/video/i386/pc/vbe.c | 8 +++++++- + 2 files changed, 14 insertions(+), 1 deletion(-) + +diff --git a/grub-core/video/efi_gop.c b/grub-core/video/efi_gop.c +index 1e7b396..1db39e7 100644 +--- a/grub-core/video/efi_gop.c ++++ b/grub-core/video/efi_gop.c +@@ -377,6 +377,13 @@ grub_video_gop_setup (unsigned int width, unsigned int height, + preferred_height = 600; + grub_errno = GRUB_ERR_NONE; + } ++ else ++ { ++ /* Limit the range of preferred resolution not exceeding FHD ++ to keep the fixed bitmap font readable */ ++ preferred_width = (preferred_width < 1920) ? preferred_width : 1920; ++ preferred_height = (preferred_height < 1080) ? preferred_height : 1080; ++ } + } + + again: +diff --git a/grub-core/video/i386/pc/vbe.c b/grub-core/video/i386/pc/vbe.c +index b0d3190..68700ec 100644 +--- a/grub-core/video/i386/pc/vbe.c ++++ b/grub-core/video/i386/pc/vbe.c +@@ -994,7 +994,13 @@ grub_video_vbe_setup (unsigned int width, unsigned int height, + { + grub_vbe_get_preferred_mode (&width, &height); + if (grub_errno == GRUB_ERR_NONE) +- preferred_mode = 1; ++ { ++ preferred_mode = 1; ++ /* Limit the range of preferred resolution not exceeding FHD ++ to keep the fixed bitmap font readable */ ++ width = (width < 1920) ? width : 1920; ++ height = (height < 1080) ? height : 1080; ++ } + else + { + /* Fall back to 640x480. This is conservative, but the largest +-- +2.12.3 + diff --git a/grub2.changes b/grub2.changes index de01bf0..bd0af25 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,31 @@ +------------------------------------------------------------------- +Mon Jan 28 14:12:05 UTC 2019 - Guillaume GARDET + +- Add patch to fix ARM boot, when kernel become too big: + * grub2-move-initrd-upper.patch (boo#1123350) + +------------------------------------------------------------------- +Fri Jan 25 07:08:32 UTC 2019 - mchang@suse.com + +- Support long menu entry by scrolling its text left and right through + the key stroke ctrl+l and ctrl+r (FATE#325760) + * grub2-gfxmenu-support-scrolling-menu-entry-s-text.patch + +------------------------------------------------------------------- +Thu Jan 24 09:26:09 UTC 2019 - mchang@suse.com + +- Improved hiDPI device support (FATE#326680) + * grub2-video-limit-the-resolution-for-fixed-bimap-font.patch + +------------------------------------------------------------------- +Wed Jan 23 10:44:09 UTC 2019 - rw@suse.com + +- Build platform-packages 'noarch' and move to '/usr/share/efi' + for SUSE Manager. (FATE#326960) + * grub2-efi-xen-chainload.patch (bsc#1122563) + * grub2-efi-xen-removable.patch (refresh) + + ------------------------------------------------------------------- Thu Dec 20 09:21:27 UTC 2018 - mchang@suse.com diff --git a/grub2.rpmlintrc b/grub2.rpmlintrc index de32ae2..5bf2298 100644 --- a/grub2.rpmlintrc +++ b/grub2.rpmlintrc @@ -7,3 +7,7 @@ addFilter("statically-linked-binary .*/grub2/*/kernel.img") addFilter("unstripped-binary-or-object .*/grub2/*/.*.mod") # TODO: s390 Experts: is this sensible?! addFilter("s390x: W: executable-stack") +# +addFilter("suse-filelist-forbidden-noarch") +# +addFilter('arch-independent-package-contains-binary-or-object') diff --git a/grub2.spec b/grub2.spec index c750ad6..efd563d 100644 --- a/grub2.spec +++ b/grub2.spec @@ -1,7 +1,7 @@ # # spec file for package grub2 # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -12,11 +12,13 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # # needssslcertforbuild +%define _binaries_in_noarch_package_terminate_build 0 + Name: grub2 %ifarch x86_64 ppc64 BuildRequires: gcc-32bit @@ -28,13 +30,13 @@ BuildRequires: glibc-devel %endif BuildRequires: automake BuildRequires: bison -BuildRequires: dejavu-fonts BuildRequires: device-mapper-devel BuildRequires: fdupes BuildRequires: flex BuildRequires: freetype2-devel BuildRequires: fuse-devel %if 0%{?suse_version} >= 1140 +BuildRequires: dejavu-fonts BuildRequires: gnu-unifont %endif BuildRequires: help2man @@ -44,7 +46,11 @@ BuildRequires: makeinfo %else BuildRequires: texinfo %endif -BuildRequires: python3 +%if %{defined pythons} +BuildRequires: %{pythons} +%else +BuildRequires: python +%endif BuildRequires: xz-devel %ifarch x86_64 aarch64 %if 0%{?suse_version} >= 1230 || 0%{?suse_version} == 1110 @@ -127,7 +133,7 @@ BuildRequires: update-bootloader-rpm-macros %endif %if %{platform} == emu -# force %{emu} to 1, e.g. for s390 +# force %%{emu} to 1, e.g. for s390 %define emu 1 %endif @@ -161,7 +167,6 @@ Source16: grub2-xen-pv-firmware.cfg # required hook for systemd-sleep (bsc#941758) Source17: grub2-systemd-sleep.sh Source18: grub2-check-default.sh -Source999: grub2-rpmlintrc Source1000: PATCH_POLICY Patch1: rename-grub-info-file-to-grub2.patch Patch2: grub2-linux.patch @@ -250,6 +255,8 @@ 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 @@ -308,6 +315,10 @@ Patch455: 0006-Add-support-for-EFI-handover-on-ARM64.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 Requires: gettext-runtime %if 0%{?suse_version} >= 1140 @@ -324,6 +335,17 @@ Requires(preun):/sbin/install-info %if ! 0%{?only_efi:1} Requires: grub2-%{grubarch} = %{version}-%{release} %endif +%ifarch s390x +# required utilities by grub2-s390x-04-grub2-install.patch +# use 'showconsole' to determine console device. (bnc#876743) +Requires: /sbin/showconsole +Requires: kexec-tools +# for /sbin/zipl used by grub2-zipl-setup +Requires: s390-tools +%endif +%ifarch ppc64 ppc64le +Requires: powerpc-utils +%endif BuildRoot: %{_tmppath}/%{name}-%{version}-build @@ -356,7 +378,7 @@ Authors: Summary: Upstream branding for GRUB2's graphical console Group: System/Fhs -Requires: %{name} = %{version}-%{release} +Requires: %{name} = %{version} %description branding-upstream Upstream branding for GRUB2's graphical console @@ -366,25 +388,17 @@ Upstream branding for GRUB2's graphical console Summary: Bootloader with support for Linux, Multiboot and more Group: System/Boot -Requires: %{name} = %{version}-%{release} -Requires(post): %{name} = %{version}-%{release} +%if %{platform} != emu +BuildArch: noarch +%endif +Requires: %{name} = %{version} +Requires(post): %{name} = %{version} %if 0%{?update_bootloader_requires:1} %update_bootloader_requires %else Requires: perl-Bootloader Requires(post): perl-Bootloader %endif -%ifarch s390x -# required utilities by grub2-s390x-04-grub2-install.patch -# use 'showconsole' to determine console device. (bnc#876743) -Requires: /sbin/showconsole -Requires: kexec-tools -# for /sbin/zipl used by grub2-zipl-setup -Requires: s390-tools -%endif -%ifarch ppc64 ppc64le -Requires: powerpc-utils -%endif %description %{grubarch} The GRand Unified Bootloader (GRUB) is a highly configurable and customizable @@ -402,10 +416,11 @@ Summary: Bootloader with support for Linux, Multiboot and more # Require efibootmgr # Without it grub-install is broken so break the package as well if unavailable Group: System/Boot +BuildArch: noarch Requires: efibootmgr Requires(post): efibootmgr -Requires: %{name} = %{version}-%{release} -Requires(post): %{name} = %{version}-%{release} +Requires: %{name} = %{version} +Requires(post): %{name} = %{version} %if 0%{?update_bootloader_requires:1} %update_bootloader_requires %else @@ -445,7 +460,7 @@ provides support for XEN systems. Summary: Grub2's snapper plugin Group: System/Fhs -Requires: %{name} = %{version}-%{release} +Requires: %{name} = %{version} Requires: libxml2-tools Supplements: packageand(snapper:grub2) BuildArch: noarch @@ -554,6 +569,7 @@ swap partition while in resuming %patch151 -p1 %patch163 -p1 %patch164 -p1 +%patch180 -p1 %patch205 -p1 %patch207 -p1 %patch210 -p1 @@ -602,8 +618,12 @@ swap partition while in resuming %patch455 -p1 %patch500 -p1 %patch501 -p1 +%patch510 -p1 +%patch511 -p1 %build +# collect evidence to debug spurious build failure on SLE15 +ulimit -a # patches above may update the timestamp of grub.texi # and via build-aux/mdate-sh they end up in grub2.info, breaking build-compare [ -z "$SOURCE_DATE_EPOCH" ] ||\ @@ -635,6 +655,7 @@ mkdir build-emu %endif export PYTHON=%{_bindir}/python3 +[ -x $PYTHON ] || unset PYTHON # try 'python', if 'python3' is unavailable # autogen calls autoreconf -vi ./autogen.sh # Not yet: @@ -651,12 +672,13 @@ export CFLAGS CXXFLAGS FFLAGS %if %{emu} cd build-emu %define arch_specific --enable-device-mapper --disable-grub-mount -TFLAGS="-fPIC" +TLFLAGS="-fPIC" # -static is needed so that autoconf script is able to link # test that looks for _start symbol on 64 bit platforms -../configure TARGET_LDFLAGS=$TFLAGS \ +../configure TARGET_LDFLAGS=$TLFLAGS \ --prefix=%{_prefix} \ + --libdir=%{_datadir} \ --sysconfdir=%{_sysconfdir} \ --target=%{_target_platform} \ --with-platform=emu \ @@ -675,9 +697,9 @@ cd build-xen ../configure \ TARGET_LDFLAGS=-static \ --prefix=%{_prefix} \ + --libdir=%{_datadir} \ --sysconfdir=%{_sysconfdir} \ --target=%{_target_platform} \ - --libdir=%{_libdir} \ --with-platform=xen \ --program-transform-name=s,grub,%{name}, make %{?_smp_mflags} @@ -692,16 +714,16 @@ cd build-efi ../configure \ TARGET_LDFLAGS=-static \ --prefix=%{_prefix} \ + --libdir=%{_datadir} \ --sysconfdir=%{_sysconfdir} \ --target=%{_target_platform} \ - --libdir=%{_libdir} \ --with-platform=efi \ --program-transform-name=s,grub,%{name}, make %{?_smp_mflags} #TODO: add efifwsetup module -FS_MODULES="ext2 btrfs ext2 xfs jfs reiserfs" +FS_MODULES="btrfs ext2 xfs jfs reiserfs" CD_MODULES=" all_video boot cat chain configfile echo true \ efinet font gfxmenu gfxterm gzio halt iso9660 \ jpeg minicmd normal part_apple part_msdos part_gpt \ @@ -721,9 +743,6 @@ GRUB_MODULES="${CD_MODULES} ${FS_MODULES} ${PXE_MODULES} ${CRYPTO_MODULES} mdrai -d grub-core ${GRUB_MODULES} ./grub-mkimage -O %{grubefiarch} -o grub-tpm.efi --prefix= \ -d grub-core ${GRUB_MODULES} tpm -#./grub-mkimage -O %{grubefiarch} -o grub.efi -d grub-core part_gpt hfsplus fat \ -# ext2 btrfs normal chain boot configfile linux appleldr minicmd \ -# loadbios reboot halt search font gfxterm %ifarch x86_64 aarch64 %if 0%{?suse_version} >= 1230 || 0%{?suse_version} == 1110 @@ -765,12 +784,13 @@ cd build %if %{platform} != "emu" %define arch_specific --enable-device-mapper -TFLAGS="-static" +TLFLAGS="-static" # -static is needed so that autoconf script is able to link # test that looks for _start symbol on 64 bit platforms -../configure TARGET_LDFLAGS=$TFLAGS \ +../configure TARGET_LDFLAGS="$TLFLAGS" \ --prefix=%{_prefix} \ + --libdir=%{_datadir} \ --sysconfdir=%{_sysconfdir} \ --target=%{_target_platform} \ --with-platform=%{platform} \ @@ -786,7 +806,7 @@ cd .. %ifarch %{ix86} x86_64 cd build-xen make DESTDIR=$RPM_BUILD_ROOT install -install -m 644 grub.xen $RPM_BUILD_ROOT%{_libdir}/%{name}/%{grubxenarch}/. +install -m 644 grub.xen $RPM_BUILD_ROOT%{_datadir}/%{name}/%{grubxenarch}/. cd .. %endif @@ -794,21 +814,28 @@ cd .. cd build-efi make DESTDIR=$RPM_BUILD_ROOT install -install -m 644 grub.efi grub-tpm.efi $RPM_BUILD_ROOT%{_libdir}/%{name}/%{grubefiarch}/. +install -m 644 grub.efi grub-tpm.efi $RPM_BUILD_ROOT%{_datadir}/%{name}/%{grubefiarch}/. # Create grub.efi link to system efi directory # This is for tools like kiwi not fiddling with the path -%if "%{grubefiarch}" == "x86_64-efi" -%define sysefidir %{_exec_prefix}/lib64/efi -%else -%define sysefidir %{_libdir}/efi -%endif +%define sysefibasedir %{_datadir}/efi +%define sysefidir %{sysefibasedir}/%{_target_cpu} install -d $RPM_BUILD_ROOT%{sysefidir} -ln -sf ../../../%{_libdir}/%{name}/%{grubefiarch}/grub.efi $RPM_BUILD_ROOT%{sysefidir}/grub.efi +ln -sr $RPM_BUILD_ROOT%{_datadir}/%{name}/%{grubefiarch}/grub.efi $RPM_BUILD_ROOT%{sysefidir}/grub.efi +%ifarch x86_64 +# provide compatibility sym-link for previous shim-install and the like +install -d $RPM_BUILD_ROOT/usr/lib64/efi +ln -srf $RPM_BUILD_ROOT%{_datadir}/%{name}/%{grubefiarch}/grub.efi $RPM_BUILD_ROOT/usr/lib64/efi/grub.efi +cat <<-EoM > $RPM_BUILD_ROOT/usr/lib64/efi/DEPRECATED + This directory and it's contents was moved to %{_datadir}/efi/x86_64. + Individual symbolic links are provided for a smooth transition and + may vanish at any point in time. Please use the new location! +EoM +%endif %ifarch x86_64 aarch64 %if 0%{?suse_version} >= 1230 || 0%{?suse_version} == 1110 -export BRP_PESIGN_FILES="%{_libdir}/%{name}/%{grubefiarch}/grub.efi %{_libdir}/%{name}/%{grubefiarch}/grub-tpm.efi" +export BRP_PESIGN_FILES="%{_datadir}/%{name}/%{grubefiarch}/grub.efi %{_datadir}/%{name}/%{grubefiarch}/grub-tpm.efi" install -m 444 grub.der $RPM_BUILD_ROOT%{sysefidir}/ %endif %endif @@ -822,17 +849,25 @@ make DESTDIR=$RPM_BUILD_ROOT install cd .. %endif -if [ -d build-emu/grub-core ]; then +if [ "%{platform}" = "emu" ]; then + # emu-lite is currently broken (and not needed), don't install! + rm -f $RPM_BUILD_ROOT%{_bindir}/%{name}-emu-lite +elif [ -d build-emu/grub-core ]; then cd build-emu/grub-core install -m 755 grub-emu $RPM_BUILD_ROOT%{_bindir}/%{name}-emu - install -m 755 grub-emu-lite $RPM_BUILD_ROOT%{_bindir}/%{name}-emu-lite + if false; then + # this needs to go to '-emu'-package; until that is ready, don't install! + install -m 755 grub-emu-lite $RPM_BUILD_ROOT%{_bindir}/%{name}-emu-lite + else + rm -f $RPM_BUILD_ROOT%{_bindir}/%{name}-emu-lite + fi install -m 644 grub-emu.1 $RPM_BUILD_ROOT%{_mandir}/man1/%{name}-emu.1 cd ../.. fi # *.module files are installed with executable bits due to the way grub2 build # system works. Clear executable bits to not confuse find-debuginfo.sh -find $RPM_BUILD_ROOT%{_libdir}/%{name} \ +find $RPM_BUILD_ROOT%{_datadir}/%{name} \ \( -name '*.module' -o -name '*.image' -o -name '*.exec' \) -print0 | \ xargs --no-run-if-empty -0 chmod a-x @@ -847,7 +882,7 @@ install -d $RPM_BUILD_ROOT/boot/%{name} touch $RPM_BUILD_ROOT/boot/%{name}/grub.cfg # Remove devel files -rm $RPM_BUILD_ROOT/%{_libdir}/%{name}/*/*.h +rm $RPM_BUILD_ROOT/%{_datadir}/%{name}/*/*.h %if 0%{?suse_version} >= 1140 rm $RPM_BUILD_ROOT%{_datadir}/%{name}/*.h %endif @@ -882,7 +917,7 @@ chmod 600 $R%{_sysconfdir}/default/zipl2grub.conf.in %define dracutgrubmoddir %{dracutlibdir}/modules.d/99grub2 install -m 755 -d $R%{dracutgrubmoddir} for f in module-setup.sh grub2.sh; do - mv $R%{_libdir}/%{name}/%{grubarch}/dracut-$f $R%{dracutgrubmoddir}/$f + mv $R%{_datadir}/%{name}/%{grubarch}/dracut-$f $R%{dracutgrubmoddir}/$f done rm -f $R%{_sysconfdir}/grub.d/30_os-prober @@ -908,6 +943,7 @@ perl -ni -e ' %find_lang %{name} %fdupes %buildroot%{_bindir} %fdupes %buildroot%{_libdir} +%fdupes %buildroot%{_datadir} %pre %service_add_pre grub2-once.service @@ -1019,8 +1055,8 @@ if [ $1 = 0 ]; then /sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || : # We did not add core.img to grub1 menu.lst in new update-bootloader macro as what -# the old %post ever did, then the %preun counterpart which removed the added core.img -# entry from old %post can be skipped entirely if having new macro in use. +# the old %%post ever did, then the %%preun counterpart which removed the added core.img +# entry from old %%post can be skipped entirely if having new macro in use. %if ! 0%{?update_bootloader_posttrans:1}%{?only_efi:1} # To check by current loader settings if [ -f %{_sysconfdir}/sysconfig/bootloader ]; then @@ -1077,6 +1113,17 @@ fi %config(noreplace) %{_sysconfdir}/grub.d/41_custom %config(noreplace) %{_sysconfdir}/grub.d/90_persistent %config(noreplace) %{_sysconfdir}/grub.d/95_textmode +%ifarch %{ix86} x86_64 +%config(noreplace) %{_sysconfdir}/grub.d/20_memtest86+ +%endif +%ifarch ppc ppc64 ppc64le +%config(noreplace) %{_sysconfdir}/grub.d/20_ppc_terminfo +%endif +%ifarch s390x +%config(noreplace) %{_sysconfdir}/default/zipl2grub.conf.in +%{dracutlibdir} +%{_sbindir}/%{name}-zipl-setup +%endif %{_sbindir}/%{name}-install %{_sbindir}/%{name}-mkconfig %{_sbindir}/%{name}-once @@ -1103,7 +1150,6 @@ fi %if 0%{?has_systemd:1} %{_unitdir}/grub2-once.service %endif -%dir %{_libdir}/%{name} %dir %{_datadir}/%{name} %dir %{_datadir}/%{name}/themes %if 0%{?suse_version} >= 1140 @@ -1134,7 +1180,7 @@ fi %{_mandir}/man8/%{name}-reboot.8.* %{_mandir}/man8/%{name}-set-default.8.* %if %{emu} -%{_bindir}/%{name}-emu* +%{_bindir}/%{name}-emu %{_mandir}/man1/%{name}-emu.1.* %endif %ifnarch s390x @@ -1161,54 +1207,54 @@ fi %files %{grubarch} %defattr(-,root,root,-) -%ifarch %{ix86} x86_64 -%config(noreplace) %{_sysconfdir}/grub.d/20_memtest86+ -%endif -%dir %{_libdir}/%{name}/%{grubarch} +%dir %{_datadir}/%{name}/%{grubarch} %ifarch ppc ppc64 ppc64le -%config(noreplace) %{_sysconfdir}/grub.d/20_ppc_terminfo -# This is intentionally "grub.chrp" and not "%{name}.chrp" -%{_libdir}/%{name}/%{grubarch}/grub.chrp -%{_libdir}/%{name}/%{grubarch}/bootinfo.txt +# This is intentionally "grub.chrp" and not "%%{name}.chrp" +%{_datadir}/%{name}/%{grubarch}/grub.chrp +%{_datadir}/%{name}/%{grubarch}/bootinfo.txt %endif %ifnarch ppc ppc64 ppc64le s390x %{arm} -%{_libdir}/%{name}/%{grubarch}/*.image +%{_datadir}/%{name}/%{grubarch}/*.image %endif -%{_libdir}/%{name}/%{grubarch}/*.img -%{_libdir}/%{name}/%{grubarch}/*.lst -%{_libdir}/%{name}/%{grubarch}/*.mod -%{_libdir}/%{name}/%{grubarch}/*.module +%{_datadir}/%{name}/%{grubarch}/*.img +%{_datadir}/%{name}/%{grubarch}/*.lst +%{_datadir}/%{name}/%{grubarch}/*.mod +%{_datadir}/%{name}/%{grubarch}/*.module %ifarch x86_64 -%{_libdir}/%{name}/%{grubarch}/efiemu*.o +%{_datadir}/%{name}/%{grubarch}/efiemu*.o %endif -%{_libdir}/%{name}/%{grubarch}/gdb_grub -%{_libdir}/%{name}/%{grubarch}/gmodule.pl -%{_libdir}/%{name}/%{grubarch}/kernel.exec -%{_libdir}/%{name}/%{grubarch}/modinfo.sh -%endif -%ifarch s390x -%{_sbindir}/%{name}-zipl-setup -%config(noreplace) %{_sysconfdir}/default/zipl2grub.conf.in -%{dracutlibdir} +%{_datadir}/%{name}/%{grubarch}/gdb_grub +%{_datadir}/%{name}/%{grubarch}/gmodule.pl +%{_datadir}/%{name}/%{grubarch}/kernel.exec +%{_datadir}/%{name}/%{grubarch}/modinfo.sh %endif %ifarch %{efi} %files %{grubefiarch} %defattr(-,root,root,-) -%dir %{_libdir}/%{name}/%{grubefiarch} -%{_libdir}/%{name}/%{grubefiarch}/grub.efi -%{_libdir}/%{name}/%{grubefiarch}/grub-tpm.efi -%{_libdir}/%{name}/%{grubefiarch}/*.img -%{_libdir}/%{name}/%{grubefiarch}/*.lst -%{_libdir}/%{name}/%{grubefiarch}/*.mod -%{_libdir}/%{name}/%{grubefiarch}/*.module -%{_libdir}/%{name}/%{grubefiarch}/gdb_grub -%{_libdir}/%{name}/%{grubefiarch}/gmodule.pl -%{_libdir}/%{name}/%{grubefiarch}/kernel.exec -%{_libdir}/%{name}/%{grubefiarch}/modinfo.sh +%dir %{_datadir}/%{name}/%{grubefiarch} +%{_datadir}/%{name}/%{grubefiarch}/grub.efi +%{_datadir}/%{name}/%{grubefiarch}/grub-tpm.efi +%{_datadir}/%{name}/%{grubefiarch}/*.img +%{_datadir}/%{name}/%{grubefiarch}/*.lst +%{_datadir}/%{name}/%{grubefiarch}/*.mod +%{_datadir}/%{name}/%{grubefiarch}/*.module +%{_datadir}/%{name}/%{grubefiarch}/gdb_grub +%{_datadir}/%{name}/%{grubefiarch}/gmodule.pl +%{_datadir}/%{name}/%{grubefiarch}/kernel.exec +%{_datadir}/%{name}/%{grubefiarch}/modinfo.sh +%dir %{sysefibasedir} %dir %{sysefidir} %{sysefidir}/grub.efi +%if 0%{?suse_version} < 1600 +%ifarch x86_64 +# provide compatibility sym-link for previous shim-install and kiwi +%dir /usr/lib64/efi +/usr/lib64/efi/DEPRECATED +/usr/lib64/efi/grub.efi +%endif +%endif %ifarch x86_64 aarch64 %if 0%{?suse_version} >= 1230 || 0%{?suse_version} == 1110 @@ -1226,8 +1272,8 @@ fi %ifarch %{ix86} x86_64 %files %{grubxenarch} -%dir %{_libdir}/%{name}/%{grubxenarch} -%{_libdir}/%{name}/%{grubxenarch}/* +%dir %{_datadir}/%{name}/%{grubxenarch} +%{_datadir}/%{name}/%{grubxenarch}/* %endif %if 0%{?has_systemd:1} From 5df9c64bda1f35616b2e74858ea530684688b539b2664db14c10c1b87d32789c Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Thu, 14 Feb 2019 13:12:45 +0000 Subject: [PATCH 45/57] Accepting request 673568 from Base:System OBS-URL: https://build.opensuse.org/request/show/673568 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=199 --- grub2.changes | 181 ++++++++++++++++++++++++++------------------------ grub2.spec | 67 +++++++++---------- 2 files changed, 126 insertions(+), 122 deletions(-) diff --git a/grub2.changes b/grub2.changes index bd0af25..f448844 100644 --- a/grub2.changes +++ b/grub2.changes @@ -4,18 +4,23 @@ Mon Jan 28 14:12:05 UTC 2019 - Guillaume GARDET - Add patch to fix ARM boot, when kernel become too big: * grub2-move-initrd-upper.patch (boo#1123350) +------------------------------------------------------------------- +Fri Jan 25 22:20:36 UTC 2019 - Jan Engelhardt + +- Replace old $RPM_* shell vars. + ------------------------------------------------------------------- Fri Jan 25 07:08:32 UTC 2019 - mchang@suse.com - Support long menu entry by scrolling its text left and right through - the key stroke ctrl+l and ctrl+r (FATE#325760) + the key stroke ctrl+l and ctrl+r (FATE#325760) * grub2-gfxmenu-support-scrolling-menu-entry-s-text.patch ------------------------------------------------------------------- Thu Jan 24 09:26:09 UTC 2019 - mchang@suse.com - Improved hiDPI device support (FATE#326680) - * grub2-video-limit-the-resolution-for-fixed-bimap-font.patch + * grub2-video-limit-the-resolution-for-fixed-bimap-font.patch ------------------------------------------------------------------- Wed Jan 23 10:44:09 UTC 2019 - rw@suse.com @@ -71,7 +76,7 @@ Wed Sep 26 08:01:05 UTC 2018 - mchang@suse.com ------------------------------------------------------------------- Thu Sep 13 08:38:01 UTC 2018 - mchang@suse.com -- Fix broken network interface with random address and same name (bsc#1084508) +- Fix broken network interface with random address and same name (bsc#1084508) * 0001-ofnet-Initialize-structs-in-bootpath-parser.patch ------------------------------------------------------------------- @@ -79,7 +84,7 @@ Fri Aug 31 10:06:56 UTC 2018 - mchang@suse.com - Fix outputting invalid btrfs subvol path on non btrfs filesystem due to bogus return code handling. (bsc#1106381) - * modified grub2-btrfs-10-config-directory.patch + * modified grub2-btrfs-10-config-directory.patch ------------------------------------------------------------------- Thu Aug 23 08:37:15 UTC 2018 - mchang@suse.com @@ -113,13 +118,13 @@ Mon Aug 6 09:02:45 UTC 2018 - josef.moellers@suse.com Tue Jul 24 07:56:02 UTC 2018 - mchang@suse.com - Fix config_directory on btrfs to follow path scheme (bsc#1063443) - * grub2-btrfs-10-config-directory.patch + * grub2-btrfs-10-config-directory.patch - Fix grub2-install --root-directory does not work for /boot/grub2/ on - separate btrfs subvolume (boo#1098420) + separate btrfs subvolume (boo#1098420) * grub2-btrfs-06-subvol-mount.patch - Fix setparams doesn't work as expected from boot-last-label NVRAM var, after inital CAS reboot on ieee1275 (bsc#1088830) - * grub2-ppc64-cas-new-scope.patch + * grub2-ppc64-cas-new-scope.patch ------------------------------------------------------------------- Mon Jul 16 07:53:19 UTC 2018 - mchang@suse.com @@ -202,7 +207,7 @@ Mon Apr 2 08:30:05 UTC 2018 - mchang@suse.com - Fix Nvidia GPU in legacy I/O slot 2 disappears during system startup (bsc#1082914) - * 0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch + * 0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch ------------------------------------------------------------------- Fri Mar 30 09:16:06 UTC 2018 - mchang@suse.com @@ -220,7 +225,7 @@ Mon Mar 26 11:37:13 UTC 2018 - msuchanek@suse.com Mon Mar 12 07:31:10 UTC 2018 - mchang@suse.com - Fix UEFI HTTPS Boot from ISO installation image (bsc#1076132) - * 0001-add-support-for-UEFI-network-protocols.patch + * 0001-add-support-for-UEFI-network-protocols.patch ------------------------------------------------------------------- Tue Mar 6 08:21:43 UTC 2018 - mchang@suse.com @@ -242,18 +247,18 @@ Thu Mar 1 18:36:33 UTC 2018 - iforster@suse.com Tue Feb 13 09:05:45 UTC 2018 - mchang@suse.com - Fix incorrect check preventing the script from running (bsc#1078481) - * 80_suse_btrfs_snapshot + * 80_suse_btrfs_snapshot ------------------------------------------------------------------- Wed Feb 7 09:58:26 UTC 2018 - mchang@suse.com - Fix disappeared snapshot menu entry (bsc#1078481) - * 80_suse_btrfs_snapshot + * 80_suse_btrfs_snapshot ------------------------------------------------------------------- Tue Feb 6 09:44:26 UTC 2018 - mchang@suse.com -- Fix unquoted string error and add some more checks (bsc#1079330) +- Fix unquoted string error and add some more checks (bsc#1079330) * grub2-check-default.sh ------------------------------------------------------------------- @@ -284,7 +289,7 @@ Fri Dec 8 09:30:46 UTC 2017 - mchang@suse.com Tue Nov 28 09:35:48 UTC 2017 - mchang@suse.com - Fix http(s) boot security review (bsc#1058090) - * 0002-AUDIT-0-http-boot-tracker-bug.patch + * 0002-AUDIT-0-http-boot-tracker-bug.patch ------------------------------------------------------------------- Tue Nov 14 09:02:19 UTC 2017 - mchang@suse.com @@ -319,7 +324,7 @@ Tue Sep 26 06:35:50 UTC 2017 - mchang@suse.com - Build diskboot_tpm.img as separate image to diskboot.img to prevent failure in booting on some bogus firmware. To use the TPM image you have to use suse-enable-tpm option of grub2-install (bsc#1052401) - * 0013-tpm-i386-pc-diskboot-img.patch + * 0013-tpm-i386-pc-diskboot-img.patch ------------------------------------------------------------------- Wed Sep 20 22:17:10 UTC 2017 - mlatimer@suse.com @@ -345,13 +350,13 @@ Sun Sep 3 12:12:21 UTC 2017 - mchang@suse.com - Add preliminary patch for UEFI HTTPS and related network protocol support (fate#320130) - * 0001-add-support-for-UEFI-network-protocols.patch + * 0001-add-support-for-UEFI-network-protocols.patch ------------------------------------------------------------------- Sun Sep 3 11:41:42 UTC 2017 - mchang@suse.com - grub2-s390x-04-grub2-install.patch : remove arybase dependency in - grub2-zipl-setup by not referencing to $[ (bsc#1055280) + grub2-zipl-setup by not referencing to $[ (bsc#1055280) ------------------------------------------------------------------- Wed Aug 23 17:52:32 UTC 2017 - rw@suse.com @@ -375,7 +380,7 @@ Tue Jul 4 16:56:33 UTC 2017 - arvidjaar@gmail.com Thu Jun 1 09:45:44 UTC 2017 - mchang@suse.com - Support LVM physical volume created without metadatacopies (bsc#1027526) - * grub2-diskfilter-support-pv-without-metadatacopies.patch + * grub2-diskfilter-support-pv-without-metadatacopies.patch - Fix page fault exception when grub loads with Nvidia cards (bsc#1038533) * grub2-efi-uga-64bit-fb.patch - Require 'kexec-tools' for System z. (bsc#944358) @@ -420,13 +425,13 @@ Mon Mar 20 09:43:58 UTC 2017 - mchang@suse.com - Fix out of memory error on lvm detection (bsc#1016536) (bsc#1027401) * grub2-lvm-allocate-metadata-buffer-from-raw-contents.patch - Fix boot failure if /boot is separate btrfs partition (bsc#1023160) - * grub2-btrfs-06-subvol-mount.patch + * grub2-btrfs-06-subvol-mount.patch ------------------------------------------------------------------- Fri Mar 17 06:22:42 UTC 2017 - mchang@suse.com - 0004-tpm-Rework-linux-command.patch : Fix out of bound memory copy - (bsc#1029187) + (bsc#1029187) ------------------------------------------------------------------- Thu Mar 16 16:32:54 UTC 2017 - arvidjaar@gmail.com @@ -473,13 +478,13 @@ Wed Mar 1 10:29:46 UTC 2017 - mchang@suse.com - Fix for openQA UEFI USB Boot failure with upstream patch (bsc#1026344) * added 0001-efi-strip-off-final-NULL-from-File-Path-in-grub_efi_.patch - * removed 0001-Revert-efi-properly-terminate-filepath-with-NULL-in-.patch + * removed 0001-Revert-efi-properly-terminate-filepath-with-NULL-in-.patch ------------------------------------------------------------------- Thu Feb 23 15:06:44 UTC 2017 - mchang@suse.com - Temporary fix for openQA UEFI USB Boot failure (bsc#1026344) - * 0001-Revert-efi-properly-terminate-filepath-with-NULL-in-.patch + * 0001-Revert-efi-properly-terminate-filepath-with-NULL-in-.patch ------------------------------------------------------------------- Fri Feb 17 06:46:11 UTC 2017 - mchang@suse.com @@ -610,8 +615,8 @@ Fri Dec 30 14:47:39 UTC 2016 - sor.alexei@meowr.ru ------------------------------------------------------------------- Fri Oct 28 04:08:19 UTC 2016 - mchang@suse.com -- Fix new line character in distributor (bsc#1007212) - * modified grub2-default-distributor.patch +- Fix new line character in distributor (bsc#1007212) + * modified grub2-default-distributor.patch ------------------------------------------------------------------- Fri Oct 21 09:34:58 UTC 2016 - mchang@suse.com @@ -641,7 +646,7 @@ Fri Sep 2 03:24:19 UTC 2016 - mchang@suse.com - use $PRETTY_NAME instead of $NAME $VERSION for $GRUB_DISTRIBUTOR in openSUSE Tumbleweed (bsc#995549) - * modified grub2-default-distributor.patch + * modified grub2-default-distributor.patch - grub2.spec: add http module to grub.efi (fate#320129) ------------------------------------------------------------------- @@ -704,16 +709,16 @@ Tue Aug 2 09:05:11 UTC 2016 - mchang@suse.com ------------------------------------------------------------------- Tue Jun 28 00:31:47 CEST 2016 - ro@suse.de -- fix filelist for s390x +- fix filelist for s390x ------------------------------------------------------------------- Tue Jun 21 06:19:27 UTC 2016 - mchang@suse.com -- Fix grub2-editenv error on encrypted lvm installation (bsc#981621) +- Fix grub2-editenv error on encrypted lvm installation (bsc#981621) * modified grub2-btrfs-workaround-grub2-once.patch - Add missing closing bracket in 'grub2-snapper-plugin.sh'. - Fix snapshot booting on s390x (bsc#955115) - * modified grub2-snapper-plugin.sh + * modified grub2-snapper-plugin.sh - Fallback to old subvol name scheme to support old snapshot config (bsc#953538) * added grub2-btrfs-07-subvol-fallback.patch @@ -752,7 +757,7 @@ Thu Apr 28 09:06:11 UTC 2016 - agraf@suse.com ------------------------------------------------------------------- Tue Apr 19 08:21:24 UTC 2016 - mchang@suse.com -- Correct show user defined comments in menu for snapshots (bsc#956698) +- Correct show user defined comments in menu for snapshots (bsc#956698) * modified grub2-snapper-plugin.sh ------------------------------------------------------------------- @@ -868,7 +873,7 @@ Sun Feb 28 23:10:06 UTC 2016 - agraf@suse.com Fri Jan 29 03:54:15 UTC 2016 - mchang@suse.com - Add config option to set efi xen loader command line option (bsc#957383) - * added grub2-efi-xen-cmdline.patch + * added grub2-efi-xen-cmdline.patch ------------------------------------------------------------------- Thu Jan 28 12:27:27 UTC 2016 - dvaleev@suse.com @@ -955,7 +960,7 @@ Fri Dec 4 17:06:17 UTC 2015 - olaf@aepfle.de Thu Nov 26 10:22:28 UTC 2015 - mchang@suse.com - Expand list of grub.cfg search path in PV Xen guest for systems - installed to btrfs snapshot. (bsc#946148) (bsc#952539) + installed to btrfs snapshot. (bsc#946148) (bsc#952539) * modified grub2-xen.cfg - drop grub2-fix-Grub2-with-SUSE-Xen-package-install.patch (bsc#774666) @@ -976,14 +981,14 @@ Mon Nov 1 21:30:02 UTC 2015 - arvidjaar@gmail.com ------------------------------------------------------------------- Fri Oct 30 10:09:02 UTC 2015 - mchang@suse.com -- Allow to execute menuentry unrestricted as default (fate#318574) - * added grub2-menu-unrestricted.patch +- Allow to execute menuentry unrestricted as default (fate#318574) + * added grub2-menu-unrestricted.patch ------------------------------------------------------------------- Thu Oct 29 04:17:08 UTC 2015 - mchang@suse.com - Add missing quoting for linuxefi (bsc#951962) - * modified grub2-secureboot-use-linuxefi-on-uefi.patch + * modified grub2-secureboot-use-linuxefi-on-uefi.patch * refreshed grub2-secureboot-provide-linuxefi-config.patch ------------------------------------------------------------------- @@ -995,7 +1000,7 @@ Sun Oct 18 11:45:10 UTC 2015 - eich@suse.com ------------------------------------------------------------------- Wed Oct 7 09:01:37 UTC 2015 - mchang@suse.com -- Upstream patches for fixing file descriptor leakage (bsc#943784) +- Upstream patches for fixing file descriptor leakage (bsc#943784) * added 0001-unix-password-Fix-file-descriptor-leak.patch * added 0002-linux-getroot-fix-descriptor-leak.patch * added 0003-util-grub-mount-fix-descriptor-leak.patch @@ -1020,16 +1025,16 @@ Wed Sep 23 20:02:47 UTC 2015 - dmueller@suse.com ------------------------------------------------------------------- Mon Sep 14 06:36:04 UTC 2015 - mchang@suse.com -- Set default GRUB_DISTRIBUTOR from /etc/os-release if it is empty +- Set default GRUB_DISTRIBUTOR from /etc/os-release if it is empty or not set by user (bsc#942519) - * added grub2-default-distributor.patch + * added grub2-default-distributor.patch * modified grub.default ------------------------------------------------------------------- Tue Aug 18 09:53:54 UTC 2015 - mchang@suse.com -- add systemd-sleep-plugin subpackage (bsc#941758) -- evaluate the menu entry's title string by printf +- add systemd-sleep-plugin subpackage (bsc#941758) +- evaluate the menu entry's title string by printf * modified grub2-once * added grub2-systemd-sleep.sh @@ -1129,12 +1134,12 @@ Wed Apr 15 06:02:36 UTC 2015 - mchang@suse.com Thu Apr 2 04:25:52 UTC 2015 - mchang@suse.com - Merge changes from SLE12 -- Do not pass root= when root is on nfs (bnc#894374) +- Do not pass root= when root is on nfs (bnc#894374) * modified grub2-pass-corret-root-for-nfsroot.patch * modified grub2-secureboot-provide-linuxefi-config.patch * modified grub2-secureboot-use-linuxefi-on-uefi.patch - Fix xen pvops kernel not appear on menu (bnc#895286) - * modified grub2-fix-menu-in-xen-host-server.patch + * modified grub2-fix-menu-in-xen-host-server.patch - Workaround grub2-once (bnc#892358) * added grub2-btrfs-workaround-grub2-once.patch * added grub2-once.service @@ -1144,8 +1149,8 @@ Thu Apr 2 04:25:52 UTC 2015 - mchang@suse.com - Add warning in grubenv file about editing it directly (bnc#887008) * added grub2-editenv-add-warning-message.patch - Fix broken graphics with efifb on QEMU/KVM and nomodeset (bnc#884558) - * added grub2-efi-disable-video-cirrus-and-bochus.patch -- Disable video support on Power (bnc#877142) + * added grub2-efi-disable-video-cirrus-and-bochus.patch +- Disable video support on Power (bnc#877142) * added grub2-ppc64le-disable-video.patch - Track occupied memory so it can be released on exit (bnc#885026) * added grub2-ppc64le-memory-map.patch @@ -1167,7 +1172,7 @@ Thu Apr 2 04:25:52 UTC 2015 - mchang@suse.com * added grub2-getroot-treat-mdadm-ddf-as-simple-device.patch - Fix booting from NVMe device (bnc#873132) * added grub2-getroot-support-NVMe-device-names.patch -- Document peculiarities of s390 terminals +- Document peculiarities of s390 terminals * added README.ibm3215 - Grub2 for System z (fate#314213) * added grub2-s390x-02-kexec-module-added-to-emu.patch @@ -1197,7 +1202,7 @@ Mon Feb 16 16:25:50 UTC 2015 - arvidjaar@gmail.com ------------------------------------------------------------------- Thu Feb 5 09:37:46 UTC 2015 - mchang@suse.com -- enable i386-xen (boo#891043) +- enable i386-xen (boo#891043) ------------------------------------------------------------------- Wed Feb 4 07:43:27 UTC 2015 - mchang@suse.com @@ -1208,12 +1213,12 @@ Wed Feb 4 07:43:27 UTC 2015 - mchang@suse.com Thu Dec 25 08:52:12 UTC 2014 - mchang@suse.com - grub2-snapper-plugin.sh: cleanup grub-snapshot.cfg not referring - to any snapshot (boo#909359) + to any snapshot (boo#909359) ------------------------------------------------------------------- Thu Dec 25 08:34:49 UTC 2014 - mpluskal@suse.com -- Require efibootmgr also on i586 +- Require efibootmgr also on i586 ------------------------------------------------------------------- Tue Dec 16 10:41:08 UTC 2014 - schwab@suse.de @@ -1261,10 +1266,10 @@ Thu Oct 30 07:36:15 UTC 2014 - mchang@suse.com - fix errors when boot is btrfs with Windows partition scheme. The first partition is created on cylinder boundary that can't offer - enough room for core.img and also the installation has to be in + enough room for core.img and also the installation has to be in logical paritition which made MBR the only location to install. (bnc#841247) - * add grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch + * add grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch ------------------------------------------------------------------- Tue Sep 30 03:45:04 UTC 2014 - mchang@suse.com @@ -1316,13 +1321,13 @@ Mon Sep 15 15:30:03 UTC 2014 - arvidjaar@gmail.com Fri Sep 12 04:14:38 UTC 2014 - mchang@suse.com - fix xen pvops kernel not appear on menu (bnc#895286) - * refresh grub2-fix-menu-in-xen-host-server.patch + * refresh grub2-fix-menu-in-xen-host-server.patch ------------------------------------------------------------------- Wed Sep 10 10:34:47 UTC 2014 - mchang@suse.com - fix extraneous comma in printf shell command (bnc#895884) - * refresh grub2-btrfs-04-grub2-install.patch + * refresh grub2-btrfs-04-grub2-install.patch ------------------------------------------------------------------- Wed Aug 27 07:53:35 UTC 2014 - schwab@suse.de @@ -1341,13 +1346,13 @@ Mon Aug 25 03:10:18 UTC 2014 - mchang@suse.com Fri Aug 22 10:05:13 UTC 2014 - mchang@suse.com - fix openqa boot error on separate boot partition - * refresh grub2-btrfs-05-grub2-mkconfig.patch + * refresh grub2-btrfs-05-grub2-mkconfig.patch ------------------------------------------------------------------- Thu Aug 21 06:10:07 UTC 2014 - mchang@suse.com - update snapper plugin for rollback support - * refresh grub2-snapper-plugin.sh + * refresh grub2-snapper-plugin.sh ------------------------------------------------------------------- Fri Aug 15 07:55:54 UTC 2014 - mchang@suse.com @@ -1361,23 +1366,23 @@ Fri Aug 15 07:55:54 UTC 2014 - mchang@suse.com - added patches * grub2-btrfs-03-follow_default.patch * grub2-btrfs-04-grub2-install.patch - * grub2-btrfs-05-grub2-mkconfig.patch + * grub2-btrfs-05-grub2-mkconfig.patch - remove patch * 0003-cmdline-add-envvar-loader_cmdline_append.patch - + ------------------------------------------------------------------- Thu Aug 14 06:35:58 UTC 2014 - mchang@suse.com - grub2-btrfs-fix-incorrect-address-reference.patch * Fix incorrect address reference in GRUB_BTRFS_EXTENT_REGULAR - range check (bnc#869748) + range check (bnc#869748) ------------------------------------------------------------------- Wed Aug 13 02:56:22 UTC 2014 - mchang@suse.com - grub2-vbe-blacklist-preferred-1440x900x32.patch - * Blacklist preferred resolution 1440x900x32 which is broken on - many Thinkpads (bnc#888727) + * Blacklist preferred resolution 1440x900x32 which is broken on + many Thinkpads (bnc#888727) ------------------------------------------------------------------- Tue Aug 12 12:56:29 UTC 2014 - schwab@suse.de @@ -1390,20 +1395,20 @@ Tue Aug 12 12:56:29 UTC 2014 - schwab@suse.de Mon Aug 11 14:34:55 UTC 2014 - dvaleev@suse.com - Fix the 64-bit trampoline code in dynamic linker (bnc#890999) - grub2-ppc64le-fix-64bit-trampoline-in-dyn-linker.patch + grub2-ppc64le-fix-64bit-trampoline-in-dyn-linker.patch ------------------------------------------------------------------- Tue Jul 29 11:46:54 CEST 2014 - tiwai@suse.de - Prefer a higher resolution in efi_gop driver if the mode taking over is too small like 640x480 (bnc#887972): - grub2-efi_gop-avoid-low-resolution.patch + grub2-efi_gop-avoid-low-resolution.patch ------------------------------------------------------------------- Wed Jul 9 16:26:35 UTC 2014 - dvlaeev@suse.com -- Fix ppc64le build by fixing - grub2-xfs-V5-filesystem-format-support.patch +- Fix ppc64le build by fixing + grub2-xfs-V5-filesystem-format-support.patch ------------------------------------------------------------------- Wed Jun 25 09:20:16 UTC 2014 - jack@suse.cz @@ -1496,11 +1501,11 @@ Mon Feb 24 07:28:42 UTC 2014 - mchang@suse.com - refresh grub2-fix-menu-in-xen-host-server.patch (bnc#859361) * prevent 10_linux from booting xen kernel without pv_opt support - on systems other than xen PV domU guest + on systems other than xen PV domU guest * prevent 20_linux_xen.in from setting up nested virt running from Xen domU - refresh grub2-fix-Grub2-with-SUSE-Xen-package-install.patch - * adjust accordingly + * adjust accordingly ------------------------------------------------------------------- Thu Feb 20 14:43:21 UTC 2014 - jw@suse.com @@ -1588,7 +1593,7 @@ Wed Jan 15 06:18:10 UTC 2014 - mchang@suse.com - add new patches for booting btrfs snapshot (fate#316522) (fate#316232) * 0001-script-provide-overridable-root-by-subvol.patch * 0002-script-create-menus-for-btrfs-snapshot.patch - + ------------------------------------------------------------------- Fri Dec 27 16:36:40 UTC 2013 - arvidjaar@gmail.com @@ -1614,10 +1619,10 @@ Fri Dec 27 16:36:40 UTC 2013 - arvidjaar@gmail.com - grub2-secureboot-provide-linuxefi-config.patch - grub2-pass-corret-root-for-nfsroot.patch - 0002-btrfs-add-ability-to-boot-from-subvolumes.patch - - grub2-fix-menu-in-xen-host-server.patch + - grub2-fix-menu-in-xen-host-server.patch - grub2-fix-Grub2-with-SUSE-Xen-package-install.patch - grub2-secureboot-add-linuxefi.patch - - grub2-secureboot-no-insmod-on-sb.patch + - grub2-secureboot-no-insmod-on-sb.patch - rename-grub-info-file-to-grub2.patch * drop Makefile.util.am and Makefile.core.am, they are now generated during build @@ -1684,7 +1689,7 @@ Sat Jul 27 10:12:36 UTC 2013 - arvidjaar@gmail.com Tue Jul 9 10:54:41 UTC 2013 - mchang@suse.com - refresh grub2-fix-menu-in-xen-host-server.patch: In domU we - have to add xen kernel to config. (bnc#825528) + have to add xen kernel to config. (bnc#825528) ------------------------------------------------------------------- Wed Jun 26 17:02:08 UTC 2013 - elchevive@opensuse.org @@ -1713,7 +1718,7 @@ Sun Jun 16 12:42:33 UTC 2013 - arvidjaar@gmail.com - grub2-linux.patch - use-grub2-as-a-package-name.patch - grub2-iterate-and-hook-for-extended-partition.patch - - grub2-secureboot-add-linuxefi.patch + - grub2-secureboot-add-linuxefi.patch - grub2-secureboot-no-insmod-on-sb.patch - grub2-secureboot-chainloader.patch * add @@ -1750,7 +1755,7 @@ Wed Apr 3 17:56:20 UTC 2013 - arvidjaar@gmail.com Wed Apr 3 06:55:52 UTC 2013 - mchang@suse.com - refresh grub2-secureboot-chainloader.patch: Fix wrongly aligned - buffer address (bnc#811608) + buffer address (bnc#811608) ------------------------------------------------------------------- Thu Mar 28 02:57:47 UTC 2013 - mchang@suse.com @@ -1764,7 +1769,7 @@ Thu Mar 28 02:57:47 UTC 2013 - mchang@suse.com ------------------------------------------------------------------- Mon Mar 25 17:37:59 UTC 2013 - dvaleev@suse.com -- extraconfigure macro is not defined on ppc +- extraconfigure macro is not defined on ppc ------------------------------------------------------------------- Sat Mar 23 18:31:07 UTC 2013 - arvidjaar@gmail.com @@ -1773,8 +1778,8 @@ Sat Mar 23 18:31:07 UTC 2013 - arvidjaar@gmail.com ------------------------------------------------------------------- Wed Mar 13 11:30:52 UTC 2013 - mchang@suse.com - -- remove all compatible links in grub2-efi as now all concerned + +- remove all compatible links in grub2-efi as now all concerned utilities are fixed - superseding grub2-efi by grub2-x86_64-efi and grub2-i386-efi on x86_64 and ix86 respectively @@ -1839,7 +1844,7 @@ Tue Feb 19 15:38:04 UTC 2013 - duwe@suse.com ------------------------------------------------------------------- Thu Feb 14 11:42:40 UTC 2013 - duwe@suse.com -- merge internal+external BS changes into superset spec file, +- merge internal+external BS changes into superset spec file, remove obsolete dependencies - merge SLES+openSUSE patches, restrict "grub-efi" to 12.2 - add efidisk-ahci-workaround (bnc#794674) @@ -1947,7 +1952,7 @@ Tue Dec 18 03:43:38 UTC 2012 - mchang@suse.com ------------------------------------------------------------------- Fri Nov 30 06:39:15 UTC 2012 - mchang@suse.com -- replace %{sles_version} by %{suse_version} +- replace %{sles_version} by %{suse_version} - use correct product name ------------------------------------------------------------------- @@ -1981,7 +1986,7 @@ Thu Nov 22 07:01:31 UTC 2012 - mchang@suse.com meet the requirement. - grub2 : common utilties and config etc - grub2-efi : provide compatibilty to grub2-efi package - - grub2-i386-pc : binaries for x86 legacy pc firmware + - grub2-i386-pc : binaries for x86 legacy pc firmware - grub2-i386-efi : binaries for ia32 EFI firmware - grub2-x86_64-efi : binaries for x86_64 firmware - grub2-powerpc-ieee1275: binaries for powerpc open firmware @@ -2006,7 +2011,7 @@ Thu Nov 1 08:10:12 UTC 2012 - mchang@suse.com - ship a Secure Boot UEFI compatible bootloader (fate#314485) - Secure boot support in installer DVD (fate#314489) -- prime support for package on SLE-11 (SP3) +- prime support for package on SLE-11 (SP3) - remove buildrequire to libuse and ncurses 32-bit devel packages as they are needed by grub-emu which we don't support - remove buildrequire to freetype2-devel-32bit as it's not need @@ -2053,23 +2058,23 @@ Thu Oct 18 16:10:02 UTC 2012 - arvidjaar@gmail.com Wed Sep 26 08:04:48 UTC 2012 - mchang@suse.com - refresh grub2-fix-locale-en.mo.gz-not-found-error-message.patch - with the correct fix in upstream bugzilla #35880 by Colin Watson + with the correct fix in upstream bugzilla #35880 by Colin Watson (bnc#771393) ------------------------------------------------------------------- Fri Sep 21 07:37:53 UTC 2012 - mchang@suse.com -- grub2-fix-locale-en.mo.gz-not-found-error-message.patch (bnc#771393) +- grub2-fix-locale-en.mo.gz-not-found-error-message.patch (bnc#771393) ------------------------------------------------------------------- Wed Sep 19 18:54:34 UTC 2012 - arvidjaar@gmail.com -- add 20_memtest86+ (bnc#780622) +- add 20_memtest86+ (bnc#780622) ------------------------------------------------------------------- Tue Sep 18 09:26:29 UTC 2012 - mchang@suse.com -- Fix un-bootable grub2 testing entry in grub's menu.lst (bnc#779370) +- Fix un-bootable grub2 testing entry in grub's menu.lst (bnc#779370) - Not add new grub2 testing entry if it's not found in menu.lst - Update grub2 stuff and config if there's grub2 entry in menu.lst - Check for current bootloader as update-bootloader acts on it @@ -2084,7 +2089,7 @@ Thu Aug 30 08:00:54 UTC 2012 - mchang@suse.com Mon Aug 20 06:27:23 UTC 2012 - mchang@suse.com - disable grub2-enable-theme-for-terminal-window.patch to use - default black background due to current background has poor + default black background due to current background has poor contrast to the font color (bnc#776244). ------------------------------------------------------------------- @@ -2134,8 +2139,8 @@ Fri Jul 6 08:09:16 UTC 2012 - mchang@suse.com - grub2-GRUB_CMDLINE_LINUX_RECOVERY-for-recovery-mode.patch. We don't run in sigle user mode for recovery, instead use different - set kernel command line options which could be specified by this - GRUB_CMDLINE_LINUX_RECOVERY setting. + set kernel command line options which could be specified by this + GRUB_CMDLINE_LINUX_RECOVERY setting. ------------------------------------------------------------------- Wed Jul 4 06:20:23 UTC 2012 - mchang@suse.com @@ -2146,7 +2151,7 @@ Wed Jul 4 06:20:23 UTC 2012 - mchang@suse.com Fri Jun 29 10:02:08 UTC 2012 - dvaleev@suse.com - Add configuration support for serial terminal consoles. This will - set the maximum screen size so that text is not overwritten. + set the maximum screen size so that text is not overwritten. ------------------------------------------------------------------- Fri Jun 29 09:51:59 UTC 2012 - dvaleev@suse.com @@ -2194,8 +2199,8 @@ Thu Apr 19 11:28:44 UTC 2012 - mchang@suse.com - grub2-probe-disk-mountby.patch : fix grub2-probe fails on probing mount-by devices under /dev/disk/by-(id|uuid|path). - (bnc#757746) - + (bnc#757746) + ------------------------------------------------------------------- Thu Mar 29 07:08:38 UTC 2012 - mchang@suse.com @@ -2222,7 +2227,7 @@ Tue Mar 13 04:06:06 UTC 2012 - mchang@suse.com ------------------------------------------------------------------- Mon Mar 12 09:34:40 UTC 2012 - tittiatcoke@gmail.com -- Added BuildRequires for gnu-unifont in order to create the +- Added BuildRequires for gnu-unifont in order to create the necessary fonts for a graphical boot menu. ------------------------------------------------------------------- @@ -2291,7 +2296,7 @@ Tue Aug 23 12:46:43 UTC 2011 - aj@suse.de Tue Aug 2 12:10:39 UTC 2011 - dvaleev@novell.com - enable ppc build -- patch unused-but-set-variable +- patch unused-but-set-variable ------------------------------------------------------------------- Tue Jul 12 14:03:05 UTC 2011 - aj@suse.de diff --git a/grub2.spec b/grub2.spec index efd563d..3bd8e2d 100644 --- a/grub2.spec +++ b/grub2.spec @@ -805,29 +805,28 @@ cd .. %ifarch %{ix86} x86_64 cd build-xen -make DESTDIR=$RPM_BUILD_ROOT install -install -m 644 grub.xen $RPM_BUILD_ROOT%{_datadir}/%{name}/%{grubxenarch}/. +%make_install +install -m 644 grub.xen %{buildroot}/%{_datadir}/%{name}/%{grubxenarch}/. cd .. %endif %ifarch %{efi} cd build-efi -make DESTDIR=$RPM_BUILD_ROOT install - -install -m 644 grub.efi grub-tpm.efi $RPM_BUILD_ROOT%{_datadir}/%{name}/%{grubefiarch}/. +%make_install +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 %define sysefibasedir %{_datadir}/efi %define sysefidir %{sysefibasedir}/%{_target_cpu} -install -d $RPM_BUILD_ROOT%{sysefidir} -ln -sr $RPM_BUILD_ROOT%{_datadir}/%{name}/%{grubefiarch}/grub.efi $RPM_BUILD_ROOT%{sysefidir}/grub.efi +install -d %{buildroot}/%{sysefidir} +ln -sr %{buildroot}/%{_datadir}/%{name}/%{grubefiarch}/grub.efi %{buildroot}/%{sysefidir}/grub.efi %ifarch x86_64 # provide compatibility sym-link for previous shim-install and the like -install -d $RPM_BUILD_ROOT/usr/lib64/efi -ln -srf $RPM_BUILD_ROOT%{_datadir}/%{name}/%{grubefiarch}/grub.efi $RPM_BUILD_ROOT/usr/lib64/efi/grub.efi -cat <<-EoM > $RPM_BUILD_ROOT/usr/lib64/efi/DEPRECATED - This directory and it's contents was moved to %{_datadir}/efi/x86_64. +install -d %{buildroot}/usr/lib64/efi +ln -srf %{buildroot}/%{_datadir}/%{name}/%{grubefiarch}/grub.efi %{buildroot}/usr/lib64/efi/grub.efi +cat <<-EoM >%{buildroot}/usr/lib64/efi/DEPRECATED + This directory and its contents was moved to %{_datadir}/efi/x86_64. Individual symbolic links are provided for a smooth transition and may vanish at any point in time. Please use the new location! EoM @@ -836,7 +835,7 @@ EoM %ifarch x86_64 aarch64 %if 0%{?suse_version} >= 1230 || 0%{?suse_version} == 1110 export BRP_PESIGN_FILES="%{_datadir}/%{name}/%{grubefiarch}/grub.efi %{_datadir}/%{name}/%{grubefiarch}/grub-tpm.efi" -install -m 444 grub.der $RPM_BUILD_ROOT%{sysefidir}/ +install -m 444 grub.der %{buildroot}/%{sysefidir}/ %endif %endif @@ -845,60 +844,60 @@ cd .. %if ! 0%{?only_efi:1} cd build -make DESTDIR=$RPM_BUILD_ROOT install +%make_install cd .. %endif if [ "%{platform}" = "emu" ]; then # emu-lite is currently broken (and not needed), don't install! - rm -f $RPM_BUILD_ROOT%{_bindir}/%{name}-emu-lite + rm -f %{buildroot}/%{_bindir}/%{name}-emu-lite elif [ -d build-emu/grub-core ]; then cd build-emu/grub-core - install -m 755 grub-emu $RPM_BUILD_ROOT%{_bindir}/%{name}-emu + install -m 755 grub-emu %{buildroot}/%{_bindir}/%{name}-emu if false; then # this needs to go to '-emu'-package; until that is ready, don't install! - install -m 755 grub-emu-lite $RPM_BUILD_ROOT%{_bindir}/%{name}-emu-lite + install -m 755 grub-emu-lite %{buildroot}/%{_bindir}/%{name}-emu-lite else - rm -f $RPM_BUILD_ROOT%{_bindir}/%{name}-emu-lite + rm -f %{buildroot}/%{_bindir}/%{name}-emu-lite fi - install -m 644 grub-emu.1 $RPM_BUILD_ROOT%{_mandir}/man1/%{name}-emu.1 + install -m 644 grub-emu.1 %{buildroot}/%{_mandir}/man1/%{name}-emu.1 cd ../.. fi # *.module files are installed with executable bits due to the way grub2 build # system works. Clear executable bits to not confuse find-debuginfo.sh -find $RPM_BUILD_ROOT%{_datadir}/%{name} \ +find %{buildroot}/%{_datadir}/%{name} \ \( -name '*.module' -o -name '*.image' -o -name '*.exec' \) -print0 | \ xargs --no-run-if-empty -0 chmod a-x # Script that makes part of grub.cfg persist across updates -install -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/grub.d/ +install -m 755 %{SOURCE1} %{buildroot}/%{_sysconfdir}/grub.d/ # Script to generate memtest86+ menu entry -install -m 755 %{SOURCE7} $RPM_BUILD_ROOT%{_sysconfdir}/grub.d/ +install -m 755 %{SOURCE7} %{buildroot}/%{_sysconfdir}/grub.d/ # Ghost config file -install -d $RPM_BUILD_ROOT/boot/%{name} -touch $RPM_BUILD_ROOT/boot/%{name}/grub.cfg +install -d %{buildroot}/boot/%{name} +touch %{buildroot}/boot/%{name}/grub.cfg # Remove devel files -rm $RPM_BUILD_ROOT/%{_datadir}/%{name}/*/*.h +rm %{buildroot}/%{_datadir}/%{name}/*/*.h %if 0%{?suse_version} >= 1140 -rm $RPM_BUILD_ROOT%{_datadir}/%{name}/*.h +rm %{buildroot}/%{_datadir}/%{name}/*.h %endif # Defaults -install -m 644 -D %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/default/grub -install -m 755 -D %{SOURCE6} $RPM_BUILD_ROOT%{_sbindir}/grub2-once -install -m 755 -D %{SOURCE12} $RPM_BUILD_ROOT%{_libdir}/snapper/plugins/grub -install -m 755 -D %{SOURCE14} $RPM_BUILD_ROOT%{_sysconfdir}/grub.d/80_suse_btrfs_snapshot +install -m 644 -D %{SOURCE2} %{buildroot}/%{_sysconfdir}/default/grub +install -m 755 -D %{SOURCE6} %{buildroot}/%{_sbindir}/grub2-once +install -m 755 -D %{SOURCE12} %{buildroot}/%{_libdir}/snapper/plugins/grub +install -m 755 -D %{SOURCE14} %{buildroot}/%{_sysconfdir}/grub.d/80_suse_btrfs_snapshot %if 0%{?has_systemd:1} -install -m 644 -D %{SOURCE15} $RPM_BUILD_ROOT%{_unitdir}/grub2-once.service -install -m 755 -D %{SOURCE17} $RPM_BUILD_ROOT%{_libdir}/systemd/system-sleep/grub2.sleep +install -m 644 -D %{SOURCE15} %{buildroot}/%{_unitdir}/grub2-once.service +install -m 755 -D %{SOURCE17} %{buildroot}/%{_libdir}/systemd/system-sleep/grub2.sleep %endif -install -m 755 -D %{SOURCE18} $RPM_BUILD_ROOT%{_sbindir}/grub2-check-default +install -m 755 -D %{SOURCE18} %{buildroot}/%{_sbindir}/grub2-check-default -R=$RPM_BUILD_ROOT +R="%{buildroot}" %ifarch %{ix86} x86_64 %else rm -f $R%{_sysconfdir}/grub.d/20_memtest86+ @@ -936,7 +935,7 @@ perl -ni -e ' } s{openSUSE}{SUSE Linux Enterprise Server} if (m{^GRUB_DISTRIBUTOR}); print; -' $RPM_BUILD_ROOT%{_sysconfdir}/default/grub +' %{buildroot}/%{_sysconfdir}/default/grub %else %endif From 3dcc817fb5d081ab3a0f879113332e6ee1f4a3aace720ebed8db16453665dd95 Mon Sep 17 00:00:00 2001 From: Stephan Kulow Date: Sun, 17 Feb 2019 11:18:40 +0000 Subject: [PATCH 46/57] Accepting request 676194 from Base:System - Create compatibility sym-link of grub.xen in the old location to which old VM definition is pointing (bsc#1123942) OBS-URL: https://build.opensuse.org/request/show/676194 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=200 --- grub2.changes | 7 ++++++- grub2.spec | 14 +++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/grub2.changes b/grub2.changes index f448844..93fc136 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Tue Feb 12 08:57:03 UTC 2019 - mchang@suse.com + +- Create compatibility sym-link of grub.xen in the old location to which + old VM definition is pointing (bsc#1123942) + ------------------------------------------------------------------- Mon Jan 28 14:12:05 UTC 2019 - Guillaume GARDET @@ -30,7 +36,6 @@ Wed Jan 23 10:44:09 UTC 2019 - rw@suse.com * grub2-efi-xen-chainload.patch (bsc#1122563) * grub2-efi-xen-removable.patch (refresh) - ------------------------------------------------------------------- Thu Dec 20 09:21:27 UTC 2018 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 3bd8e2d..05ad9f4 100644 --- a/grub2.spec +++ b/grub2.spec @@ -807,6 +807,14 @@ cd .. cd build-xen %make_install install -m 644 grub.xen %{buildroot}/%{_datadir}/%{name}/%{grubxenarch}/. +# provide compatibility sym-link for VM definitions pointing to old location +install -d %{buildroot}%{_libdir}/%{name}/%{grubxenarch} +ln -srf %{buildroot}%{_datadir}/%{name}/%{grubxenarch}/grub.xen %{buildroot}%{_libdir}/%{name}/%{grubxenarch}/grub.xen +cat <<-EoM >%{buildroot}%{_libdir}/%{name}/%{grubxenarch}/DEPRECATED + This directory and its contents was moved to %{_datadir}/%{name}/%{grubxenarch}. + Individual symbolic links are provided for a smooth transition. + Please update your VM definition files to use the new location! +EoM cd .. %endif @@ -820,7 +828,7 @@ install -m 644 grub.efi grub-tpm.efi %{buildroot}/%{_datadir}/%{name}/%{grubefia %define sysefibasedir %{_datadir}/efi %define sysefidir %{sysefibasedir}/%{_target_cpu} install -d %{buildroot}/%{sysefidir} -ln -sr %{buildroot}/%{_datadir}/%{name}/%{grubefiarch}/grub.efi %{buildroot}/%{sysefidir}/grub.efi +ln -sr %{buildroot}/%{_datadir}/%{name}/%{grubefiarch}/grub.efi %{buildroot}%{sysefidir}/grub.efi %ifarch x86_64 # provide compatibility sym-link for previous shim-install and the like install -d %{buildroot}/usr/lib64/efi @@ -1271,8 +1279,12 @@ fi %ifarch %{ix86} x86_64 %files %{grubxenarch} +%defattr(-,root,root,-) %dir %{_datadir}/%{name}/%{grubxenarch} %{_datadir}/%{name}/%{grubxenarch}/* +# provide compatibility sym-link for VM definitions pointing to old location +%dir %{_libdir}/%{name} +%{_libdir}/%{name}/%{grubxenarch} %endif %if 0%{?has_systemd:1} From 697f0a4ca5ab7c466cd7273632418c484c109ea1e853bc198cf9031ba2561c29 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Tue, 12 Mar 2019 08:49:46 +0000 Subject: [PATCH 47/57] Accepting request 683534 from Base:System OBS-URL: https://build.opensuse.org/request/show/683534 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=201 --- grub2-once | 21 ++++++++++++++------- grub2.changes | 5 +++++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/grub2-once b/grub2-once index 3a402c6..112f7f9 100644 --- a/grub2-once +++ b/grub2-once @@ -199,17 +199,24 @@ open(SYSCONF, ") { - if (/^#/) { - next - }; - if (/LOADER_TYPE="(.*)"/) { - my $bl = $1; - if ($bl eq "grub2" || $bl eq "grub2-efi") { + chomp; + next if ( /^\s*#/ ); + if ( /LOADER_TYPE=(\'|\"|)([^\'\"\s]+)\1(\s*|\s+#.*)$/ ) { + dPrint("OK : $2\n"); + if ($2 eq "grub2" || $2 eq "grub2-efi") { + # Found grub2 to be the incumbent loader ... $grub2_dir = "/boot/grub2"; $grub2_reboot = "/usr/sbin/grub2-reboot"; $grub2_editenv = "/usr/bin/grub2-editenv"; + # Note : Here we continues rather than exiting the loop, which + # results in different behavior than previous "the first wins". Now + # the latest defined LOADER_TYPE can be used to override any + # previous one, which is identical to the result of regular shell + # variable expansion to meet most people's expectation. } - last; + } else { + next if ( /^\s*$/ ); + dPrint("SKIP: <$_>\n"); } } diff --git a/grub2.changes b/grub2.changes index 93fc136..903a2f8 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Wed Feb 20 08:38:55 UTC 2019 - mchang@suse.com + +- Fix LOADER_TYPE parsing in grub2-once (boo#1122569) + ------------------------------------------------------------------- Tue Feb 12 08:57:03 UTC 2019 - mchang@suse.com From a12921113e167e13d7352d4af63aad75d2b28a05c394d28a91fc6745a6674b12 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Sun, 24 Mar 2019 13:55:49 +0000 Subject: [PATCH 48/57] Accepting request 686300 from Base:System OBS-URL: https://build.opensuse.org/request/show/686300 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=202 --- ...ee1275-FCP-methods-for-WWPN-and-LUNs.patch | 93 ++++++++++++------- grub2-ieee1275-open-raw-mode.patch | 60 ------------ grub2.changes | 16 ++++ grub2.spec | 6 +- 4 files changed, 78 insertions(+), 97 deletions(-) delete mode 100644 grub2-ieee1275-open-raw-mode.patch diff --git a/grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch b/grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch index 9913742..054aaf0 100644 --- a/grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch +++ b/grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch @@ -1,8 +1,7 @@ +From a7a3ad361b4a75d052e9b4389b44a9f3848f3b9f Mon Sep 17 00:00:00 2001 From: Diego Domingos Date: Fri, 10 Aug 2018 16:29:50 -0400 -Subject: ieee1275: implement FCP methods for WWPN and LUNs -References: bsc#1093145 -Patch-mainline: not yet +Subject: [PATCH] ieee1275: implement FCP methods for WWPN and LUNs This patch enables the fcp-targets and fcp-luns methods which are responsible to get WWPNs and LUNs for fibre channel devices. @@ -13,21 +12,21 @@ to find the WWPNs and LUNs when called by searchfs.uuid tool. Signed-off-by: Diego Domingos --- - grub-core/disk/ieee1275/ofdisk.c | 89 +++++++++++++++++++++++++++++++++++++++- - 1 file changed, 88 insertions(+), 1 deletion(-) + grub-core/disk/ieee1275/ofdisk.c | 109 ++++++++++++++++++++++++++++++++++++++- + 1 file changed, 108 insertions(+), 1 deletion(-) -diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c -index 235c0fe..bb213f1 100644 ---- a/grub-core/disk/ieee1275/ofdisk.c -+++ b/grub-core/disk/ieee1275/ofdisk.c -@@ -209,7 +209,94 @@ dev_iterate_real (const char *name, const char *path) +Index: grub-2.02/grub-core/disk/ieee1275/ofdisk.c +=================================================================== +--- grub-2.02.orig/grub-core/disk/ieee1275/ofdisk.c ++++ grub-2.02/grub-core/disk/ieee1275/ofdisk.c +@@ -209,7 +209,118 @@ dev_iterate_real (const char *name, cons static void dev_iterate (const struct grub_ieee1275_devalias *alias) { - if (grub_strcmp (alias->type, "vscsi") == 0) + if (grub_strcmp (alias->type, "fcp") == 0){ + -+ /* If we are dealing with fcp devices, we need ++ /* If we are dealing with fcp devices, we need + * to find the WWPNs and LUNs to iterate them */ + grub_ieee1275_ihandle_t ihandle; + grub_uint64_t *ptr_targets, *ptr_luns; @@ -56,7 +55,11 @@ index 235c0fe..bb213f1 100644 + grub_ieee1275_cell_t table; + } args_luns; + -+ grub_ieee1275_open (alias->path, &ihandle); ++ if(grub_ieee1275_open (alias->path, &ihandle)) ++ { ++ grub_dprintf("disk", "failed to open the disk while iterating FCP disk path=%s\n", alias->path); ++ return; ++ } + + INIT_IEEE1275_COMMON (&args_targets.common, "call-method", 2, 3); + args_targets.method = (grub_ieee1275_cell_t) "fcp-targets"; @@ -70,41 +73,61 @@ index 235c0fe..bb213f1 100644 + args_luns.table = 0; + args_luns.nentries = 0; + -+ IEEE1275_CALL_ENTRY_FN (&args_targets); ++ if (IEEE1275_CALL_ENTRY_FN (&args_targets) == -1) ++ { ++ grub_dprintf("disk", "failed to get the targets while iterating FCP disk path=%s\n", alias->path); ++ grub_ieee1275_close(ihandle); ++ return; ++ } + + buf = grub_malloc (grub_strlen (alias->path) + 32 + 32); + + if (!buf) -+ return; ++ { ++ grub_ieee1275_close(ihandle); ++ return; ++ } + + bufptr = grub_stpcpy (buf, alias->path); + + /* For each WWPN discovered we need to find his associated LUNS + * calling the fcp-luns method */ -+ for (i=0; i< args_targets.nentries; i++){ -+ ptr_targets = *(grub_uint64_t **) (args_targets.table + 4 + 8 * i); -+ while(*ptr_targets){ -+ args_luns.wwpn_l = (grub_ieee1275_cell_t) (*ptr_targets); -+ args_luns.wwpn_h = (grub_ieee1275_cell_t) (*ptr_targets >> 32); -+ pos=grub_snprintf (bufptr, 32, "/disk@%" PRIxGRUB_UINT64_T, ++ for (i=0; i< args_targets.nentries; i++) ++ { ++ ptr_targets = *(grub_uint64_t **) (args_targets.table + 4 + 8 * i); ++ while(*ptr_targets) ++ { ++ args_luns.wwpn_l = (grub_ieee1275_cell_t) (*ptr_targets); ++ args_luns.wwpn_h = (grub_ieee1275_cell_t) (*ptr_targets >> 32); ++ pos=grub_snprintf (bufptr, 32, "/disk@%" PRIxGRUB_UINT64_T, + *ptr_targets++); -+ IEEE1275_CALL_ENTRY_FN (&args_luns); -+ ptr_luns = *(grub_uint64_t **) (args_luns.table); + -+ for(j=0;j - #include -+#include -+#include - - #define IEEE1275_PHANDLE_INVALID ((grub_ieee1275_cell_t) -1) - #define IEEE1275_IHANDLE_INVALID ((grub_ieee1275_cell_t) 0) -@@ -458,8 +460,31 @@ grub_ieee1275_open (const char *path, gr - if (IEEE1275_CALL_ENTRY_FN (&args) == -1) - return -1; - *result = args.result; -- if (args.result == IEEE1275_IHANDLE_INVALID) -- return -1; -+ if (args.result == IEEE1275_IHANDLE_INVALID){ -+ -+ int path_len = grub_strlen(path); -+ if ((path[path_len-3] == ':') && (path[path_len-2] == '0')){ -+ return -1; -+ } -+ -+ char *new_path = grub_malloc(grub_strlen(path) + 3); -+ char *optr; -+ optr = grub_stpcpy (new_path, path); -+ *optr++ = ':'; -+ *optr++ = '0'; -+ *optr++ = '\0'; -+ -+ args.path = (grub_ieee1275_cell_t) new_path; -+ -+ if (IEEE1275_CALL_ENTRY_FN (&args) == -1) -+ return -1; -+ -+ *result = args.result; -+ if (args.result == IEEE1275_IHANDLE_INVALID) -+ return -1; -+ -+ } -+ - return 0; - } - diff --git a/grub2.changes b/grub2.changes index 903a2f8..5504257 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,19 @@ +------------------------------------------------------------------- +Tue Mar 19 06:14:47 UTC 2019 - mchang + +- Use %doc for older products for compatibility, or may end up with + unsuccessful build result + * grub2.spec + +------------------------------------------------------------------- +Tue Mar 19 04:18:46 UTC 2019 - mchang + +- Revert grub2-ieee1275-open-raw-mode.patch for regression of crashing lvm on + multipath SAN (bsc#1113702) + * deleted grub2-ieee1275-open-raw-mode.patch +- Add exception handling to FCP lun enumeration (bsc#1113702) + * grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch + ------------------------------------------------------------------- Wed Feb 20 08:38:55 UTC 2019 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index 05ad9f4..985417e 100644 --- a/grub2.spec +++ b/grub2.spec @@ -265,7 +265,6 @@ 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 -Patch214: grub2-ieee1275-open-raw-mode.patch Patch215: grub2-ppc64-cas-new-scope.patch Patch216: 0001-ofnet-Initialize-structs-in-bootpath-parser.patch Patch217: grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch @@ -576,7 +575,6 @@ swap partition while in resuming %patch211 -p1 %patch212 -p1 %patch213 -p1 -%patch214 -p1 %patch215 -p1 %patch216 -p1 %patch217 -p1 @@ -1100,7 +1098,11 @@ fi %files -f %{name}.lang %defattr(-,root,root,-) +%if 0%{?suse_version} < 1500 +%doc COPYING +%else %license COPYING +%endif %doc NEWS README %doc THANKS TODO ChangeLog %doc docs/autoiso.cfg docs/osdetect.cfg From aae815a241355fa761fd71872b1f4659bcb99c00943ffbe02a847a33c39b341a Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Thu, 9 May 2019 08:01:05 +0000 Subject: [PATCH 49/57] Accepting request 700269 from Base:System OBS-URL: https://build.opensuse.org/request/show/700269 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=203 --- ...sable-gcc9-Waddress-of-packed-member.patch | 75 +++++++++ ...sable-gcc9-Waddress-of-packed-member.patch | 55 +++++++ ...gcc9-error-Waddress-of-packed-member.patch | 37 +++++ ...-error-with-Waddress-of-packed-membe.patch | 148 ++++++++++++++++++ ...gcc9-error-Waddress-of-packed-member.patch | 52 ++++++ ...sable-gcc9-Waddress-of-packed-member.patch | 51 ++++++ ...gcc9-error-Waddress-of-packed-member.patch | 64 ++++++++ ...gcc9-error-Waddress-of-packed-member.patch | 83 ++++++++++ grub2.changes | 13 ++ grub2.spec | 17 ++ 10 files changed, 595 insertions(+) create mode 100644 0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch create mode 100644 0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch create mode 100644 0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch create mode 100644 0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch create mode 100644 0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch create mode 100644 0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch create mode 100644 0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch create mode 100644 0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch diff --git a/0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch b/0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch new file mode 100644 index 0000000..15b5321 --- /dev/null +++ b/0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch @@ -0,0 +1,75 @@ +From 7ea474c68847757d4c67ffc67f7d714b77c41578 Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Reviewed-by: Daniel Kiper +--- + 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 + diff --git a/0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch b/0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch new file mode 100644 index 0000000..ed3a280 --- /dev/null +++ b/0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch @@ -0,0 +1,55 @@ +From 4f4128defdec0958f7a38736e2c9be2368a5a6da Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Reviewed-by: Daniel Kiper +--- + 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 + diff --git a/0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch b/0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch new file mode 100644 index 0000000..8b5753c --- /dev/null +++ b/0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch @@ -0,0 +1,37 @@ +From 0e49748fad8e036d9875785e57c577214e699941 Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Reviewed-by: Daniel Kiper +--- + 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 + diff --git a/0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch b/0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch new file mode 100644 index 0000000..cce9e47 --- /dev/null +++ b/0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch @@ -0,0 +1,148 @@ +From 621024090b7729c8c698c8ab916d792846d20818 Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Reviewed-by: Daniel Kiper +--- + 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 + diff --git a/0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch b/0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch new file mode 100644 index 0000000..9d3a6ca --- /dev/null +++ b/0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch @@ -0,0 +1,52 @@ +From 0b1bf3932f1b1700d3c8a997e4850fb9a013569d Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Reviewed-by: Daniel Kiper +--- + 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 + diff --git a/0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch b/0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch new file mode 100644 index 0000000..a33cb2f --- /dev/null +++ b/0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch @@ -0,0 +1,51 @@ +From 85e08e174e15c497c4387c16e92243e6ed05feb6 Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Reviewed-by: Daniel Kiper +--- + 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 + diff --git a/0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch b/0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch new file mode 100644 index 0000000..cd4596c --- /dev/null +++ b/0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch @@ -0,0 +1,64 @@ +From 4868e17507dfebf2894079ad6b4876e612706f30 Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Reviewed-by: Daniel Kiper +--- + 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 + diff --git a/0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch b/0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch new file mode 100644 index 0000000..1304fb3 --- /dev/null +++ b/0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch @@ -0,0 +1,83 @@ +From 4dd4ceec023111a4ccf69f8de6fa0885c6847a35 Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Reviewed-by: Daniel Kiper +--- + 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 + diff --git a/grub2.changes b/grub2.changes index 5504257..2631671 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,16 @@ +------------------------------------------------------------------- +Fri May 3 02:42:27 UTC 2019 - mchang + +- Fix GCC 9 build failure (bsc#1121208) + * 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 Mar 19 06:14:47 UTC 2019 - mchang diff --git a/grub2.spec b/grub2.spec index 985417e..38a02c0 100644 --- a/grub2.spec +++ b/grub2.spec @@ -318,6 +318,15 @@ Patch501: grub2-btrfs-help-on-snapper-rollback.patch 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 @@ -618,6 +627,14 @@ swap partition while in resuming %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 From 76d055654538b24459c1c6321033adb4b48444af55dd74819dc851d8c1cf4a0d Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Wed, 22 May 2019 08:53:49 +0000 Subject: [PATCH 50/57] Accepting request 704131 from Base:System OBS-URL: https://build.opensuse.org/request/show/704131 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=204 --- grub2-s390x-04-grub2-install.patch | 325 +++++++++++++++---- grub2-s390x-09-improve-zipl-setup.patch | 157 ++++++++- grub2-systemd-sleep.sh | 41 ++- grub2-zipl-setup-fix-btrfs-multipledev.patch | 14 +- grub2.changes | 18 + grub2.spec | 3 + 6 files changed, 464 insertions(+), 94 deletions(-) diff --git a/grub2-s390x-04-grub2-install.patch b/grub2-s390x-04-grub2-install.patch index 857fe90..2c75a20 100644 --- a/grub2-s390x-04-grub2-install.patch +++ b/grub2-s390x-04-grub2-install.patch @@ -47,27 +47,30 @@ V16: * dracut-grub2.sh: force read-only '/usr' for kexec. [bsc#932951] V17: * grub2-zipl-setup: remove arybase dependency by not referencing $[. [bsc#1055280] +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 --- - Makefile.util.def | 39 +++ - configure.ac | 9 - grub-core/Makefile.core.def | 7 - grub-core/osdep/basic/no_platform.c | 7 - grub-core/osdep/unix/platform.c | 11 - grub-core/osdep/windows/platform.c | 6 - include/grub/util/install.h | 4 - util/grub-install-common.c | 1 - util/grub-install.c | 43 +++ - util/s390x/dracut-grub2.sh.in | 110 +++++++++ - util/s390x/dracut-module-setup.sh.in | 19 + - util/s390x/zipl2grub.conf.in | 26 ++ - util/s390x/zipl2grub.pl.in | 424 +++++++++++++++++++++++++++++++++++ - 13 files changed, 702 insertions(+), 4 deletions(-) + Makefile.util.def | 46 +++ + configure.ac | 9 + grub-core/Makefile.core.def | 7 + grub-core/osdep/basic/no_platform.c | 7 + grub-core/osdep/unix/platform.c | 11 + grub-core/osdep/windows/platform.c | 6 + include/grub/util/install.h | 4 + util/grub-install-common.c | 1 + util/grub-install.c | 43 +++ + util/s390x/dracut-grub2.sh.in | 126 +++++++++ + util/s390x/dracut-module-setup.sh.in | 19 + + util/s390x/dracut-zipl-refresh.sh.in | 183 ++++++++++++++ + util/s390x/zipl2grub.conf.in | 26 ++ + util/s390x/zipl2grub.pl.in | 423 +++++++++++++++++++++++++++++++++ + 14 files changed, 908 insertions(+), 3 deletions(-) -Index: grub-2.02/Makefile.util.def -=================================================================== ---- grub-2.02.orig/Makefile.util.def -+++ grub-2.02/Makefile.util.def +--- 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)'; @@ -108,7 +111,7 @@ Index: grub-2.02/Makefile.util.def common = grub-core/kern/emu/argp_common.c; common = grub-core/osdep/init.c; -@@ -697,6 +702,38 @@ script = { +@@ -697,6 +702,46 @@ script = { }; script = { @@ -143,11 +146,19 @@ Index: grub-2.02/Makefile.util.def + installdir = platform; +}; + ++script = { ++ name = dracut-zipl-refresh; ++ common = util/s390x/dracut-zipl-refresh.sh.in; ++ enable = emu; ++ emu_condition = COND_s390x; ++ installdir = platform; ++}; ++ +script = { name = grub-mkconfig_lib; common = util/grub-mkconfig_lib.in; installdir = noinst; -@@ -1308,6 +1345,7 @@ program = { +@@ -1308,6 +1353,7 @@ program = { ldadd = libgrubkern.a; ldadd = grub-core/gnulib/libgnu.a; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; @@ -155,10 +166,8 @@ Index: grub-2.02/Makefile.util.def }; program = { -Index: grub-2.02/configure.ac -=================================================================== ---- grub-2.02.orig/configure.ac -+++ grub-2.02/configure.ac +--- a/configure.ac ++++ b/configure.ac @@ -181,9 +181,9 @@ if test x$platform != xemu ; then esac fi @@ -182,10 +191,8 @@ Index: grub-2.02/configure.ac AM_CONDITIONAL([COND_HOST_HURD], [test x$host_kernel = xhurd]) AM_CONDITIONAL([COND_HOST_LINUX], [test x$host_kernel = xlinux]) -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 +--- a/grub-core/Makefile.core.def ++++ b/grub-core/Makefile.core.def @@ -1057,6 +1057,7 @@ module = { module = { name = videotest; @@ -240,10 +247,8 @@ Index: grub-2.02/grub-core/Makefile.core.def }; module = { -Index: grub-2.02/grub-core/osdep/basic/no_platform.c -=================================================================== ---- grub-2.02.orig/grub-core/osdep/basic/no_platform.c -+++ grub-2.02/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")); @@ -255,10 +260,8 @@ Index: grub-2.02/grub-core/osdep/basic/no_platform.c + grub_util_error ("%s", _("no zIPL routines are available for your platform")); +} + -Index: grub-2.02/grub-core/osdep/unix/platform.c -=================================================================== ---- grub-2.02.orig/grub-core/osdep/unix/platform.c -+++ grub-2.02/grub-core/osdep/unix/platform.c +--- 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.")); @@ -274,10 +277,8 @@ Index: grub-2.02/grub-core/osdep/unix/platform.c + "-z", dest, NULL })) + grub_util_error (_("`%s' failed.\n"), PACKAGE"-zipl-setup"); +} -Index: grub-2.02/grub-core/osdep/windows/platform.c -=================================================================== ---- grub-2.02.orig/grub-core/osdep/windows/platform.c -+++ grub-2.02/grub-core/osdep/windows/platform.c +--- 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")); @@ -288,10 +289,8 @@ Index: grub-2.02/grub-core/osdep/windows/platform.c +{ + grub_util_error ("%s", _("no zIPL routines are available for your platform")); +} -Index: grub-2.02/include/grub/util/install.h -=================================================================== ---- grub-2.02.orig/include/grub/util/install.h -+++ grub-2.02/include/grub/util/install.h +--- 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, @@ -310,10 +309,8 @@ Index: grub-2.02/include/grub/util/install.h int grub_install_compress_gzip (const char *src, const char *dest); int -Index: grub-2.02/util/grub-install-common.c -=================================================================== ---- grub-2.02.orig/util/grub-install-common.c -+++ grub-2.02/util/grub-install-common.c +--- 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" }, @@ -322,10 +319,8 @@ Index: grub-2.02/util/grub-install-common.c }; char * -Index: grub-2.02/util/grub-install.c -=================================================================== ---- grub-2.02.orig/util/grub-install.c -+++ grub-2.02/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; @@ -467,11 +462,9 @@ Index: grub-2.02/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.02/util/s390x/dracut-grub2.sh.in -=================================================================== --- /dev/null -+++ grub-2.02/util/s390x/dracut-grub2.sh.in -@@ -0,0 +1,110 @@ ++++ b/util/s390x/dracut-grub2.sh.in +@@ -0,0 +1,126 @@ +#!/bin/sh +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# ex: ts=8 sw=4 sts=4 et filetype=sh @@ -566,8 +559,23 @@ Index: grub-2.02/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 [ -e /grub2force ] && [ $(cat /sys/kernel/kexec_loaded) = 1 ]; then -+ systemctl kexec ++ ++ 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 ++ else ++ echo "+ reboot" >& $_ctty ++ sleep 3 ++ reboot ++ fi ++ else ++ echo " ++ Attention: 'grub2' failed to start the target kernel and 'zipl-refresh' ++ is not available. This should never happen. Please contact support." >& $_ctty ++ warn "Not continuing" ++ emergency_shell -n grub2-emu-kexec + fi + + $grub2snap || umount /sysroot/.snapshots @@ -578,14 +586,13 @@ Index: grub-2.02/util/s390x/dracut-grub2.sh.in + $grub2roufs || mount -o remount,rw /sysroot/usr + $grub2rofs || mount -o remount,rw /sysroot + else -+ info "No $bindir/grub2-emu in /sysroot--trying to proceed without kexec..." ++ warn "No $bindir/grub2-emu in /sysroot--dropping to emergency shell..." ++ emergency_shell -n no-grub2-emu + fi +fi + -Index: grub-2.02/util/s390x/dracut-module-setup.sh.in -=================================================================== --- /dev/null -+++ grub-2.02/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; -*- @@ -606,10 +613,8 @@ Index: grub-2.02/util/s390x/dracut-module-setup.sh.in + #inst_multiple grub2-emu kexec +} + -Index: grub-2.02/util/s390x/zipl2grub.conf.in -=================================================================== --- /dev/null -+++ grub-2.02/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. @@ -637,10 +642,8 @@ Index: grub-2.02/util/s390x/zipl2grub.conf.in + 1 = grub2 + 2 = skip-grub2 + -Index: grub-2.02/util/s390x/zipl2grub.pl.in -=================================================================== --- /dev/null -+++ grub-2.02/util/s390x/zipl2grub.pl.in ++++ b/util/s390x/zipl2grub.pl.in @@ -0,0 +1,423 @@ +#!/usr/bin/perl +use strict; @@ -1065,3 +1068,189 @@ Index: grub-2.02/util/s390x/zipl2grub.pl.in +System( @C); +exit( $miss); + +--- /dev/null ++++ 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=60 ++[ -n "$SYSROOT" ] || ++SYSROOT=/sysroot ++[ -d $SYSROOT/boot ] || SYSROOT= ++ ++sync() { $SYSROOT/usr/bin/sync "$@"; } ++readlink() { $SYSROOT/usr/bin/readlink "$@"; } ++newline() { echo ""; } ++verbose() { ++ local a ++ local m ++ [ -n "$*" ] || return 0 ++ m="+" ++ for a in "$@"; do ++ case "$a" in ++ (*" "*|*" "*|"") m="$m '$a'";; ++ (*) m="$m $a";; ++ esac ++ done ++ echo "$m" ++ [ -n "$SYSROOT" -o "$1" = "chroot" ] || return 0 ++ "$@" ++} ++ ++SYSK="$(readlink $SYSROOT/boot/image)" ++SYSK="${SYSK#image-}" ++ZIPK="$(readlink $SYSROOT/boot/zipl/image)" ++ZIPK="${ZIPK#image-}" ++PRVK="$(readlink $SYSROOT/boot/zipl/image.prev 2> /dev/null)" ++PRVK="${PRVK#image-}" ++RUNK="$(uname -r)" ++# if /boot/zipl is not accessible ZIPK will be empty, assume running kernel ++[ -n "$ZIPK" ] || ZIPK="$RUNK" ++ ++[ -n "$SYSROOT" ] || { ++ echo "$0 is not intended for interactive use!" ++ $debug || ++ exit 0 ++ ## test: ++ TIMEOUT=6 ++ RUNK=110; ZIPK=110; PRVK=101; SYSK=194 ++ ##RUNK=$PRVK; ZIPK=$SYSK # previous booted, newest is default ++ ##t=$ZIPK; ZIPK=$PRVK; PRVK=$t; SYSK=$PRVK # unknown booted ++ ##ZIPK=$SYSK; PRVK="" # no update ++ ##ZIPK=$SYSK # try previous ++ echo "R=$RUNK S=$SYSK Z=$ZIPK P=$PRVK" ++ #verbose echo "a b" z ++ #verbose echo "^h ^j" ^z ++} ++ ++trap newline EXIT ++ ++echo -n " ++ Attention: 'grub2' failed to start the target kernel" ++ ++if [ "$ZIPK" != "$RUNK" -a "$RUNK" != "$SYSK" ]; then ++ # i.e. "previous" has been selected via zipl, but it fails!? ++ [ "$RUNK" = "$PRVK" ] && ++ echo " from previous" || ++ echo " from unknown" ++ ++ echo " ZIPL kernel ($RUNK). If default ($ZIPK) ++ fails as well, please contact support." ++ exit 1 ++fi ++echo "." ++if [ "$ZIPK" = "$SYSK" ]; then ++ [ -z "$PRVK" ] && ++ echo " ++ No kernel update readily available/installed. Please contact support." || ++ echo " ++ You may want to try the previous kernel ($PRVK) with ++ 'IPL ... LOADPARM 4', as no update kernel is readily available/installed." ++ exit 1 ++fi ++ ++echo " ++ A newer kernel ($SYSK) is available and will be deployed ++ in $TIMEOUT seconds. To facilitate this, the affected file-systems have ++ 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... " ++ ++trap interrupted=1 INT ++interrupted=0 ++input="" ++read -t $TIMEOUT input ++case "$input" in ++ ([Cc]) interrupted=2 ;; ++esac ++if [ $interrupted != 0 ]; then ++ echo " ++ Automatic update cancelled..." ++ exit 1 ++fi ++trap - INT ++echo " ++ Attempting automatic update..." ++ ++ismounted() { ++ local mode="$1" ++ local tgt="$2" ++ local dev mp fs opts dc ++ while read dev mp fs opts dc; do ++ [ "$mp" = "$tgt" ] || continue ++ case ",$opts," in ++ (*,$mode,*) return 0;; ++ esac ++ done < /proc/mounts ++ return 1 ++} ++ismp() { ++ local sysr="$1" ++ local tgt="$2" ++ local dev mp fs opts dc ++ while read dev mp fs opts dc; do ++ case "$dev" in ++ ("#"*) continue;; ++ esac ++ [ "$mp" = "$tgt" ] || continue ++ return 0 ++ done < $sysr/etc/fstab ++ return 1 ++} ++chroot() { ++ local tgt="$1"; shift ++ if [ -z "$tgt" ]; then ++ echo -n "+" ++ verbose "$@" ++ else ++ /usr/bin/chroot "$tgt" "$@" ++ fi ++} ++cleanup() { ++ local mp ++ echo " # cleanup" ++ for mp in $UMOUNT; do ++ verbose chroot "$SYSROOT" umount $mp ++ done ++ for mp in $WMOUNT; do ++ verbose mount -o remount,ro $mp ++ done ++ sync; sync ++ [ -z "$EXIT" ] || echo "$EXIT" ++ echo "" ++} ++trap cleanup EXIT ++UMOUNT="" ++WMOUNT="" ++EXIT="" ++ ++echo " # prepare" ++# remount $SYSROOT{,/boot{,/zipl}} read-write ++for mp in {"",/boot{,/zipl}}; do ++ [ -n "$SYSROOT$mp" ] || continue ++ if ismounted rw $SYSROOT$mp; then ++ echo " # $mp: already read-write: ignore" ++ elif ismounted ro $SYSROOT$mp; then ++ verbose mount -o remount,rw $SYSROOT$mp ++ WMOUNT="$SYSROOT$mp $WMOUNT" ++ elif ismp "$SYSROOT" $mp; then ++ verbose chroot "$SYSROOT" mount -w $mp || exit 1 ++ UMOUNT="$mp $UMOUNT" ++ fi ++done ++if [ ! -w $SYSROOT/boot/zipl/config ]; then ++ EXIT="ERROR: $SYSROOT/boot/zipl/config not writable! Aborting..." ++ exit 1 ++fi ++echo " # action" ++verbose chroot "$SYSROOT" grub2-zipl-setup --force ++ret=$? ++if [ $ret != 0 ]; then ++ EXIT=" # failed ($ret)" ++else ++ EXIT=" # done" ++fi ++exit $ret diff --git a/grub2-s390x-09-improve-zipl-setup.patch b/grub2-s390x-09-improve-zipl-setup.patch index a312a4f..c664831 100644 --- a/grub2-s390x-09-improve-zipl-setup.patch +++ b/grub2-s390x-09-improve-zipl-setup.patch @@ -1,22 +1,68 @@ --- - util/s390x/zipl2grub.conf.in | 2 +- - util/s390x/zipl2grub.pl.in | 19 +++++++++++-------- - 2 files changed, 12 insertions(+), 9 deletions(-) + util/s390x/zipl2grub.conf.in | 30 +++++++++++++++++++- + util/s390x/zipl2grub.pl.in | 64 +++++++++++++++++++++++++++++-------------- + 2 files changed, 73 insertions(+), 21 deletions(-) --- a/util/s390x/zipl2grub.conf.in +++ b/util/s390x/zipl2grub.conf.in -@@ -8,7 +8,7 @@ defaultmenu = menu +@@ -10,17 +10,45 @@ defaultmenu = menu + image = @zipldir@/image + parameters = "root=@GRUB_DEVICE@ @GRUB_EMU_CONMODE@ @GRUB_CMDLINE_LINUX@ @GRUB_CMDLINE_LINUX_DEFAULT@ initgrub quiet splash=silent plymouth.enable=0 " + ++[grub2-mem1G] ++ target = @zipldir@ ++ image = @zipldir@/image ++ ramdisk = @zipldir@/initrd,0x2000000 ++ parameters = "root=@GRUB_DEVICE@ @GRUB_EMU_CONMODE@ @GRUB_CMDLINE_LINUX@ @GRUB_CMDLINE_LINUX_DEFAULT@ initgrub quiet splash=silent plymouth.enable=0 mem=1G " ++ + [skip-grub2] target = @zipldir@ ramdisk = @zipldir@/initrd,0x2000000 image = @zipldir@/image -- parameters = "root=@GRUB_DEVICE@ @GRUB_EMU_CONMODE@ @GRUB_CMDLINE_LINUX@ @GRUB_CMDLINE_LINUX_DEFAULT@ initgrub quiet splash=silent plymouth.enable=0 " -+ parameters = "root=@GRUB_DEVICE@ @GRUB_EMU_CONMODE@ @GRUB_CMDLINE_LINUX@ @GRUB_CMDLINE_LINUX_DEFAULT@ initgrub quiet splash=silent plymouth.enable=0 mem=1G " + parameters = "root=@GRUB_DEVICE@ @GRUB_CONMODE@ @GRUB_CMDLINE_LINUX@ @GRUB_CMDLINE_LINUX_DEFAULT@ " ++#@ ++#@[grub2-previous] ++#@ target = @zipldir@ ++#@ image = @zipldir@/image.prev ++#@ ramdisk = @zipldir@/initrd.prev,0x2000000 ++#@ parameters = "root=@GRUB_DEVICE@ @GRUB_EMU_CONMODE@ @GRUB_CMDLINE_LINUX@ @GRUB_CMDLINE_LINUX_DEFAULT@ initgrub quiet splash=silent plymouth.enable=0 " ++#@ ++#@[grub2-mem1G-previous] ++#@ target = @zipldir@ ++#@ image = @zipldir@/image.prev ++#@ ramdisk = @zipldir@/initrd.prev,0x2000000 ++#@ parameters = "root=@GRUB_DEVICE@ @GRUB_EMU_CONMODE@ @GRUB_CMDLINE_LINUX@ @GRUB_CMDLINE_LINUX_DEFAULT@ initgrub quiet splash=silent plymouth.enable=0 mem=1G " ++#@ ++#@[skip-grub2-previous] ++#@ target = @zipldir@ ++#@ image = @zipldir@/image.prev ++#@ ramdisk = @zipldir@/initrd.prev,0x2000000 ++#@ parameters = "root=@GRUB_DEVICE@ @GRUB_CONMODE@ @GRUB_CMDLINE_LINUX@ @GRUB_CMDLINE_LINUX_DEFAULT@ " - [skip-grub2] + :menu target = @zipldir@ +- timeout = 16 ++ timeout = 60 + default = 1 + prompt = 0 + 1 = grub2 + 2 = skip-grub2 ++ 3 = grub2-mem1G ++#@ 4 = grub2-previous ++#@ 5 = skip-grub2-previous ++#@ 6 = grub2-mem1G-previous + --- a/util/s390x/zipl2grub.pl.in +++ b/util/s390x/zipl2grub.pl.in -@@ -44,12 +44,12 @@ sub System(@) { +@@ -10,6 +10,7 @@ my $sysconfbl = '@sysconfdir@/sysconfig/ + my $defimage = "/boot/image"; + my $definitrd = "/boot/initrd"; + my $Image = "$defimage"; ++my $previous = ".prev"; + my $zipldir = ""; + my $running = ""; + my $refresh = 1; # needs to default to "on" until most bugs are shaken out! +@@ -44,12 +45,12 @@ sub System(@) { return 0 if ($debug); system( @C); if ($? == -1) { @@ -32,7 +78,46 @@ } return( 0); } -@@ -166,7 +166,9 @@ sub Usage($) { +@@ -74,11 +75,13 @@ sub ln($$) { + unlink( $_[1]) || Panic( 1, "$C: unlink: $!.\n") if ( -e $_[1]); + symlink($_[0], $_[1]) || Panic( 1, "$C: symlink: $!.\n"); + } +-sub BootCopy($$$) { ++ ++sub ManagePrev($$$){ + my( $file, $dir, $tgt) = @_; + my $curr = "$dir/$tgt"; +- my $prev = "$dir/$tgt.prev"; +- Info(4, "Copy /boot/$file $dir $tgt\n"); ++ my $prev = "$dir/$tgt$previous"; ++ my $ret = 0; ++ Info(2, "Manage $prev\n"); + if ( -l $curr ) { + my $curf = readlink( $curr); + if ( $curf ne $file ) { +@@ -88,7 +91,21 @@ sub BootCopy($$$) { + rm( $pref); + } + mv( $curr, $prev); ++ $ret = 1; ++ } else { ++ Info(2, " nothing to do ($curr -> $file).\n"); + } ++ } else { ++ Info(2, " nothing to do ($curr no sym-link).\n"); ++ } ++ return $ret; ++} ++sub BootCopy($$$) { ++ my( $file, $dir, $tgt) = @_; ++ my $curr = "$dir/$tgt"; ++ Info(4, "Copy /boot/$file $dir $tgt\n"); ++ if ( $tgt eq "image" && ManagePrev( $file, $dir, $tgt)) { ++ ManagePrev( $file, $dir, "initrd") + } + cp( "/boot/$file", "$dir/$file"); + ln( $file, $curr); +@@ -163,7 +180,9 @@ sub Usage($) { "zIPL directory missing.", "Configuration template missing.", "Configuration template unreadable.", @@ -43,7 +128,7 @@ "" ); my $msg = ""; -@@ -190,7 +192,8 @@ while ( $#ARGV >= 0 ) { +@@ -186,7 +205,8 @@ while ( $#ARGV >= 0 ) { (/^--?help/ || /^-h/) && (Usage(0)); (/^--zipldir$/ || /^-z$/) && ($zipldir = shift || Usage(2), next); (/^--template$/ || /^-T$/) && ($in = shift || Usage(3), next); @@ -53,7 +138,39 @@ (/^-/) && (Usage(1)); Usage(1); } -@@ -403,15 +406,15 @@ if ( -l $Image ) { +@@ -345,7 +365,7 @@ if ( $debug && $verbose > 2 ) { + open( IN, "< $in") || + Panic( 1, "$C: Failed to open 'zipl.conf' template: $!.\n"); + while ( ) { +- Info( 3, "$.. <$_$.. >"); ++ Info( 4, "$.. <$_$.. >"); + if ( $. == 1 && m{^## This} ) { + $_ = "## This file was written by 'grub2-install/$C'\n" . + "## filling '$in' as template\n"; +@@ -366,7 +386,7 @@ while ( ) { + } + s{\@$k\@}{$v}g; + } +- Info( 2, $_); ++ Info( 3, $_); + $cfg .= $_; + } + if ( $miss ) { +@@ -374,13 +394,6 @@ if ( $miss ) { + Panic( 1, "$C: 'zipl.conf' template could not be filled. \n"); + } + +-my $ziplconf = "$zipldir/config"; +-if ( ! $debug ) { +- open( OUT, "> $ziplconf") || die; +- print( OUT $cfg) || die; +- close( OUT); +-} +- + # copy out kernel and initrd + my $ziplimage = "$zipldir/image"; + my $ziplinitrd = "$zipldir/initrd"; +@@ -399,15 +412,15 @@ if ( -l $Image ) { $Image = readlink( $Image); } my ($image, $version) = ($Image =~ m{^(?:/boot/)?([^-]+-(.+))$}); @@ -72,3 +189,21 @@ } if ( $refresh || ChkInitrd( $zipldir, "initrd") <= 0 ) { MkInitrd( $initrd, $zipldir, $version); +@@ -417,6 +430,17 @@ if ( ChkInitrd( $zipldir, "initrd") == 0 + $miss++; + } + ++# write zipl config file ++my $ziplconf = "$zipldir/config"; ++$cfg =~ s{#@}{}g if ( -r "$ziplimage$previous" && -r "$ziplinitrd$previous" ); ++if ( ! $debug ) { ++ open( OUT, "> $ziplconf") || die; ++ print( OUT $cfg) || die; ++ close( OUT); ++} else { ++ print( STDERR $cfg); ++} ++ + # now: go for it! + my @C = ( "/sbin/zipl", (($verbose) ? "-Vnc" : "-nc"), "$ziplconf" ); + System( @C); diff --git a/grub2-systemd-sleep.sh b/grub2-systemd-sleep.sh index 354991f..4cb7bbb 100644 --- a/grub2-systemd-sleep.sh +++ b/grub2-systemd-sleep.sh @@ -8,7 +8,14 @@ GRUB_ONCE="/usr/sbin/grub2-once" GRUB_ENV="/boot/grub2/grubenv" GRUB_EDITENV="/usr/bin/grub2-editenv" GRUB_CONF="/boot/grub2/grub.cfg" +GRUB_SETUP= BLKID="/usr/sbin/blkid" +ARCH=`uname -m` +VMLINUZ="vmlinuz" +case $ARCH in + ppc*) VMLINUZ="vmlinux" ;; + s390*) VMLINUZ="image"; GRUB_SETUP="/usr/sbin/grub2-zipl-setup" ;; +esac error_quit() { @@ -117,7 +124,6 @@ grub-once-restore() find-kernel-entry() { NEXT_BOOT="" - ARCH=`uname -m` declare -i I=0 # DEBUG "running kernel: $RUNNING" DIAG while [ -n "${KERNELS[$I]}" ]; do @@ -126,10 +132,7 @@ find-kernel-entry() # DEBUG "Found kernel symlink $BOOTING => $IMAGE" INFO BOOTING=$IMAGE fi - case $ARCH in - ppc*) BOOTING="${BOOTING#*vmlinux-}" ;; - *) BOOTING="${BOOTING#*vmlinuz-}" ;; - esac + BOOTING="${BOOTING#*${VMLINUZ}-}" if [ "$RUNNING" == "$BOOTING" -a -n "${MENU_ENTRIES[$I]}" ]; then NEXT_BOOT="${MENU_ENTRIES[$I]}" echo " running kernel is grub menu entry $NEXT_BOOT (${KERNELS[$I]})" @@ -149,7 +152,7 @@ find-kernel-entry() # if we did not find a kernel (or BOOT_LOADER is not GRUB) check, # if the running kernel is still the one that will (probably) be booted for # resume (default entry in menu.lst or, if there is none, the kernel file -# /boot/vmlinuz points to.) +# /boot/${VMLINUZ} points to.) # This will only work, if you use "original" SUSE kernels. # you can always override with the config variable set to "yes" prepare-grub() @@ -164,13 +167,14 @@ prepare-grub() # which kernel is booted with the default entry? BOOTING="${KERNELS[$DEFAULT_BOOT]}" # if there is no default entry (no menu.lst?) we fall back to - # the default of /boot/vmlinuz. - [ -z "$BOOTING" ] && BOOTING="vmlinuz" + # the default of /boot/${VMLINUZ}. + [ -z "$BOOTING" ] && BOOTING="${VMLINUZ}" if IMAGE=`readlink /boot/$BOOTING` && [ -e "/boot/${IMAGE##*/}" ]; then BOOTING=$IMAGE fi - BOOTING="${BOOTING#*vmlinuz-}" + BOOTING="${BOOTING#*${VMLINUZ}-}" echo "running kernel: '$RUNNING', probably booting kernel: '$BOOTING'" + check-setup "$RUNNING" if [ "$BOOTING" != "$RUNNING" ]; then error_quit "ERROR: kernel version mismatch, cannot suspend to disk" fi @@ -180,6 +184,7 @@ prepare-grub() T1=`date +"%s%N"` sync; sync; sync # this is needed to speed up grub-once on reiserfs T2=`date +"%s%N"` + check-setup "$RUNNING" echo " running $GRUB_ONCE \"${NEXT_BOOT}\"" ${GRUB_ONCE} "$NEXT_BOOT" T3=`date +"%s%N"` @@ -191,6 +196,24 @@ prepare-grub() echo "INFO: Done." } +############################################################################# +check-setup() +{ + local WANT="$VMLINUZ-$1" + + [ -n "$GRUB_SETUP" ] || return + # implementation below is s390x-only (for now) + echo "INFO: check-setup \"$WANT\" .." + HAVE="/boot/zipl/$VMLINUZ" + [ -r "$HAVE" ] || + error_quit "ERROR: no zipl kernel, cannot suspend to disk" + HAVE=$(readlink $HAVE) || + error_quit "ERROR: zipl kernel no sym-link, cannot suspend to disk" + [ "$HAVE" != "$WANT" ] || + { echo " zipl kernel already in sync, nothing to do"; return; } + echo " running $GRUB_SETUP # (incl. dracut!)" # no --image as running is preferred! + ${GRUB_SETUP} > /dev/null 2>&1 +} ###### main() diff --git a/grub2-zipl-setup-fix-btrfs-multipledev.patch b/grub2-zipl-setup-fix-btrfs-multipledev.patch index 8fd7b5c..d185727 100644 --- a/grub2-zipl-setup-fix-btrfs-multipledev.patch +++ b/grub2-zipl-setup-fix-btrfs-multipledev.patch @@ -1,8 +1,10 @@ -Index: grub-2.02~beta2/util/s390x/zipl2grub.pl.in -=================================================================== ---- grub-2.02~beta2.orig/util/s390x/zipl2grub.pl.in -+++ grub-2.02~beta2/util/s390x/zipl2grub.pl.in -@@ -361,6 +361,10 @@ while ( ) { +--- + util/s390x/zipl2grub.pl.in | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/util/s390x/zipl2grub.pl.in ++++ b/util/s390x/zipl2grub.pl.in +@@ -384,6 +384,10 @@ while ( ) { } else { $v = ""; } @@ -12,4 +14,4 @@ Index: grub-2.02~beta2/util/s390x/zipl2grub.pl.in + } s{\@$k\@}{$v}g; } - Info( 2, $_); + Info( 3, $_); diff --git a/grub2.changes b/grub2.changes index 2631671..b31531b 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,21 @@ +------------------------------------------------------------------- +Fri May 17 13:57:29 UTC 2019 - rw@suse.com + +- Check/refresh zipl-kernel before hibernate on s390x. (bsc#940457) + (Getting rid of hardcoded 'vmlinuz', which failed on PPC as well.) + * grub2-systemd-sleep.sh + +------------------------------------------------------------------- +Fri May 17 12:22:55 UTC 2019 - rw@suse.com + +- Try to refresh zipl-kernel on failed kexec. (bsc#1127293) + * grub2-s390x-04-grub2-install.patch +- Fully support "previous" zipl-kernel, + with 'mem=1G' being available on dedicated entries. (bsc#928131) + * grub2-s390x-09-improve-zipl-setup.patch +- Refresh + * grub2-zipl-setup-fix-btrfs-multipledev.patch + ------------------------------------------------------------------- Fri May 3 02:42:27 UTC 2019 - mchang diff --git a/grub2.spec b/grub2.spec index 38a02c0..d971e57 100644 --- a/grub2.spec +++ b/grub2.spec @@ -941,6 +941,8 @@ install -m 755 -d $R%{dracutgrubmoddir} for f in module-setup.sh grub2.sh; do mv $R%{_datadir}/%{name}/%{grubarch}/dracut-$f $R%{dracutgrubmoddir}/$f done +mv $R%{_datadir}/%{name}/%{grubarch}/dracut-zipl-refresh \ + $R%{_datadir}/%{name}/zipl-refresh rm -f $R%{_sysconfdir}/grub.d/30_os-prober perl -ni -e ' @@ -1149,6 +1151,7 @@ fi %config(noreplace) %{_sysconfdir}/default/zipl2grub.conf.in %{dracutlibdir} %{_sbindir}/%{name}-zipl-setup +%{_datadir}/%{name}/zipl-refresh %endif %{_sbindir}/%{name}-install %{_sbindir}/%{name}-mkconfig From 02de06da153fa5872c7c1bec1a1bd2a615831feea23bdcd8031e78bf31aada92 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Tue, 18 Jun 2019 12:53:30 +0000 Subject: [PATCH 51/57] Accepting request 709900 from Base:System OBS-URL: https://build.opensuse.org/request/show/709900 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=205 --- grub2-grubenv-in-btrfs-header.patch | 17 ++++-- ...-the-resolution-for-fixed-bimap-font.patch | 57 ++++++++++++++----- grub2.changes | 8 +++ 3 files changed, 64 insertions(+), 18 deletions(-) diff --git a/grub2-grubenv-in-btrfs-header.patch b/grub2-grubenv-in-btrfs-header.patch index 3311068..61ebb4c 100644 --- a/grub2-grubenv-in-btrfs-header.patch +++ b/grub2-grubenv-in-btrfs-header.patch @@ -2,6 +2,8 @@ GRUB cannot write Btrfs file systems from the bootloader, so it cannot modify values set from userspace (e.g. "next_entry" set by grub2-once). As a workaround use the Btrfs header to store known data of the GRUB environment block. + +v2: export env_block and make sure to use the device of grubenv --- Index: grub-2.02/grub-core/kern/fs.c =================================================================== @@ -447,19 +449,21 @@ Index: grub-2.02/util/grub.d/00_header.in =================================================================== --- grub-2.02.orig/util/grub.d/00_header.in +++ grub-2.02/util/grub.d/00_header.in -@@ -46,6 +46,11 @@ cat << EOF +@@ -46,6 +46,13 @@ cat << EOF if [ -s \$prefix/grubenv ]; then load_env fi + +if [ "\${env_block}" ] ; then ++ set env_block="(\${root})\${env_block}" ++ export env_block + load_env -f "\${env_block}" +fi + EOF if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then cat <mode->info && +- (!avoid_low_resolution || +- (gop->mode->info->width >= 800 && gop->mode->info->height >= 600))) ++ (!avoid_extreme_resolution || ++ ((gop->mode->info->width >= 800 && gop->mode->info->height >= 600) && ++ (gop->mode->info->width <= 1920 && gop->mode->info->height <= 1080)))) + { + bpp = grub_video_gop_get_bpp (gop->mode->info); + if (bpp && ((width == gop->mode->info->width +@@ -456,9 +464,9 @@ again: + + if (!found) + { +- if (avoid_low_resolution && gop->mode->info) ++ if (avoid_extreme_resolution && gop->mode->info) + { +- avoid_low_resolution = 0; ++ avoid_extreme_resolution = 0; + goto again; + } + grub_dprintf ("video", "GOP: no mode found\n"); +Index: grub-2.02/grub-core/video/i386/pc/vbe.c +=================================================================== +--- grub-2.02.orig/grub-core/video/i386/pc/vbe.c ++++ grub-2.02/grub-core/video/i386/pc/vbe.c +@@ -994,7 +994,13 @@ grub_video_vbe_setup (unsigned int width { grub_vbe_get_preferred_mode (&width, &height); if (grub_errno == GRUB_ERR_NONE) @@ -54,6 +88,3 @@ index b0d3190..68700ec 100644 else { /* Fall back to 640x480. This is conservative, but the largest --- -2.12.3 - diff --git a/grub2.changes b/grub2.changes index b31531b..dece89e 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Fri Jun 14 06:13:58 UTC 2019 - mchang@suse.com + +- 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 + ------------------------------------------------------------------- Fri May 17 13:57:29 UTC 2019 - rw@suse.com From 3526839e5f873970f9a0eafa825ecfdd1b5cd4eab71f11f5ea7b866dd1a30a70 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Mon, 8 Jul 2019 13:01:22 +0000 Subject: [PATCH 52/57] Accepting request 713148 from Base:System OBS-URL: https://build.opensuse.org/request/show/713148 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=206 --- ...efi-refactor-grub_efi_allocate_pages.patch | 120 ----- 0002-Remove-grub_efi_allocate_pages.patch | 267 ---------- ...EFI_PAGE-definitions-to-efi-memory.h.patch | 90 ---- ...tral-copy-of-grub_efi_find_mmap_size.patch | 65 --- ..._efi_get_ram_base-function-for-arm64.patch | 75 --- ...dd-support-for-EFI-handover-on-ARM64.patch | 489 ------------------ grub2-secureboot-install-signed-grub.patch | 228 ++++++++ grub2.changes | 14 + grub2.spec | 14 +- 9 files changed, 244 insertions(+), 1118 deletions(-) delete mode 100644 0001-efi-refactor-grub_efi_allocate_pages.patch delete mode 100644 0002-Remove-grub_efi_allocate_pages.patch delete mode 100644 0003-arm64-efi-move-EFI_PAGE-definitions-to-efi-memory.h.patch delete mode 100644 0004-efi-Add-central-copy-of-grub_efi_find_mmap_size.patch delete mode 100644 0005-efi-Add-grub_efi_get_ram_base-function-for-arm64.patch delete mode 100644 0006-Add-support-for-EFI-handover-on-ARM64.patch create mode 100644 grub2-secureboot-install-signed-grub.patch diff --git a/0001-efi-refactor-grub_efi_allocate_pages.patch b/0001-efi-refactor-grub_efi_allocate_pages.patch deleted file mode 100644 index 883954a..0000000 --- a/0001-efi-refactor-grub_efi_allocate_pages.patch +++ /dev/null @@ -1,120 +0,0 @@ -From f44433a343f4b10b8682f44937e929fb94dda642 Mon Sep 17 00:00:00 2001 -From: Leif Lindholm -Date: Thu, 3 Aug 2017 11:04:23 +0100 -Subject: [PATCH 1/6] efi: refactor grub_efi_allocate_pages - -Expose a new function, grub_efi_allocate_pages_real(), making it possible -to specify allocation type and memory type as supported by the UEFI -AllocatePages boot service. - -Make grub_efi_allocate_pages() a consumer of the new function, -maintaining its old functionality. - -Also delete some left-around #if 1/#else blocks in the affected -functions. - -Signed-off-by: Leif Lindholm ---- - grub-core/kern/efi/mm.c | 46 ++++++++++++++++++++++++---------------------- - include/grub/efi/efi.h | 5 +++++ - 2 files changed, 29 insertions(+), 22 deletions(-) - -diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c -index 04ad549f4..a03a44e71 100644 ---- a/grub-core/kern/efi/mm.c -+++ b/grub-core/kern/efi/mm.c -@@ -147,36 +147,20 @@ grub_efi_allocate_pages_max (grub_efi_physical_address_t max, - - /* Allocate pages. Return the pointer to the first of allocated pages. */ - void * --grub_efi_allocate_pages (grub_efi_physical_address_t address, -- grub_efi_uintn_t pages) -+grub_efi_allocate_pages_real (grub_efi_physical_address_t address, -+ grub_efi_uintn_t pages, -+ grub_efi_allocate_type_t alloctype, -+ grub_efi_memory_type_t memtype) - { -- grub_efi_allocate_type_t type; - grub_efi_status_t status; - grub_efi_boot_services_t *b; - --#if 1 - /* Limit the memory access to less than 4GB for 32-bit platforms. */ - if (address > GRUB_EFI_MAX_USABLE_ADDRESS) - return 0; --#endif -- --#if 1 -- if (address == 0) -- { -- type = GRUB_EFI_ALLOCATE_MAX_ADDRESS; -- address = GRUB_EFI_MAX_USABLE_ADDRESS; -- } -- else -- type = GRUB_EFI_ALLOCATE_ADDRESS; --#else -- if (address == 0) -- type = GRUB_EFI_ALLOCATE_ANY_PAGES; -- else -- type = GRUB_EFI_ALLOCATE_ADDRESS; --#endif - - b = grub_efi_system_table->boot_services; -- status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA, pages, &address); -+ status = efi_call_4 (b->allocate_pages, alloctype, memtype, pages, &address); - if (status != GRUB_EFI_SUCCESS) - return 0; - -@@ -185,7 +169,7 @@ grub_efi_allocate_pages (grub_efi_physical_address_t address, - /* Uggh, the address 0 was allocated... This is too annoying, - so reallocate another one. */ - address = GRUB_EFI_MAX_USABLE_ADDRESS; -- status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA, pages, &address); -+ status = efi_call_4 (b->allocate_pages, alloctype, memtype, pages, &address); - grub_efi_free_pages (0, pages); - if (status != GRUB_EFI_SUCCESS) - return 0; -@@ -194,6 +178,24 @@ grub_efi_allocate_pages (grub_efi_physical_address_t address, - return (void *) ((grub_addr_t) address); - } - -+void * -+grub_efi_allocate_pages (grub_efi_physical_address_t address, -+ grub_efi_uintn_t pages) -+{ -+ grub_efi_allocate_type_t alloctype; -+ -+ if (address == 0) -+ { -+ alloctype = GRUB_EFI_ALLOCATE_MAX_ADDRESS; -+ address = GRUB_EFI_MAX_USABLE_ADDRESS; -+ } -+ else -+ alloctype = GRUB_EFI_ALLOCATE_ADDRESS; -+ -+ return grub_efi_allocate_pages_real (address, pages, alloctype, -+ GRUB_EFI_LOADER_DATA); -+} -+ - /* Free pages starting from ADDRESS. */ - void - grub_efi_free_pages (grub_efi_physical_address_t address, -diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h -index a4ea7831b..c7f2fe6c3 100644 ---- a/include/grub/efi/efi.h -+++ b/include/grub/efi/efi.h -@@ -38,6 +38,11 @@ void *EXPORT_FUNC(grub_efi_open_protocol) (grub_efi_handle_t handle, - int EXPORT_FUNC(grub_efi_set_text_mode) (int on); - void EXPORT_FUNC(grub_efi_stall) (grub_efi_uintn_t microseconds); - void * -+EXPORT_FUNC(grub_efi_allocate_pages_real) (grub_efi_physical_address_t address, -+ grub_efi_uintn_t pages, -+ grub_efi_allocate_type_t alloctype, -+ grub_efi_memory_type_t memtype); -+void * - EXPORT_FUNC(grub_efi_allocate_pages) (grub_efi_physical_address_t address, - grub_efi_uintn_t pages); - void * --- -2.16.4 - diff --git a/0002-Remove-grub_efi_allocate_pages.patch b/0002-Remove-grub_efi_allocate_pages.patch deleted file mode 100644 index f09905c..0000000 --- a/0002-Remove-grub_efi_allocate_pages.patch +++ /dev/null @@ -1,267 +0,0 @@ -From bb4cb6d374625d3716380affda56dc4c20da36db Mon Sep 17 00:00:00 2001 -From: Vladimir Serbinenko -Date: Mon, 7 Aug 2017 18:33:29 +0200 -Subject: [PATCH 2/6] Remove grub_efi_allocate_pages. - -grub_efi_allocate_pages Essentially does 2 unrelated things: -* Allocate at fixed address. -* Allocate at any address. - -To switch between 2 different functions it uses address == 0 as magic -value which is wrong as 0 is a perfectly valid fixed adress to allocate at. ---- - grub-core/kern/arm/efi/misc.c | 4 ++-- - grub-core/kern/efi/mm.c | 30 ++++++++++++++---------------- - grub-core/loader/arm64/fdt.c | 2 +- - grub-core/loader/arm64/linux.c | 7 +++---- - grub-core/loader/arm64/xen_boot.c | 7 +++---- - grub-core/loader/i386/efi/linux.c | 2 +- - grub-core/loader/ia64/efi/linux.c | 10 +++++----- - include/grub/autoefi.h | 2 +- - include/grub/efi/efi.h | 4 +++- - 9 files changed, 33 insertions(+), 35 deletions(-) - -diff --git a/grub-core/kern/arm/efi/misc.c b/grub-core/kern/arm/efi/misc.c -index 7cd41842a..c95e8299d 100644 ---- a/grub-core/kern/arm/efi/misc.c -+++ b/grub-core/kern/arm/efi/misc.c -@@ -146,7 +146,7 @@ grub_efi_allocate_loader_memory (grub_uint32_t min_offset, grub_uint32_t size) - continue; - grub_dprintf("mm", "%s: let's allocate some (0x%x) pages @ 0x%08x...\n", - __FUNCTION__, (size >> PAGE_SHIFT), (grub_addr_t) start); -- mem = grub_efi_allocate_pages (start, (size >> PAGE_SHIFT) + 1); -+ mem = grub_efi_allocate_fixed (start, (size >> PAGE_SHIFT) + 1); - grub_dprintf("mm", "%s: retval=0x%08x\n", - __FUNCTION__, (grub_addr_t) mem); - if (! mem) -@@ -189,7 +189,7 @@ grub_efi_prepare_platform (void) - mmap_size = find_mmap_size (); - if (! mmap_size) - return GRUB_ERR_OUT_OF_MEMORY; -- mmap_buf = grub_efi_allocate_pages (0, page_align (mmap_size) >> 12); -+ mmap_buf = grub_efi_allocate_any_pages (page_align (mmap_size) >> 12); - if (! mmap_buf) - return GRUB_ERR_OUT_OF_MEMORY; - -diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c -index a03a44e71..4226f34ec 100644 ---- a/grub-core/kern/efi/mm.c -+++ b/grub-core/kern/efi/mm.c -@@ -179,20 +179,19 @@ grub_efi_allocate_pages_real (grub_efi_physical_address_t address, - } - - void * --grub_efi_allocate_pages (grub_efi_physical_address_t address, -- grub_efi_uintn_t pages) -+grub_efi_allocate_any_pages (grub_efi_uintn_t pages) - { -- grub_efi_allocate_type_t alloctype; -- -- if (address == 0) -- { -- alloctype = GRUB_EFI_ALLOCATE_MAX_ADDRESS; -- address = GRUB_EFI_MAX_USABLE_ADDRESS; -- } -- else -- alloctype = GRUB_EFI_ALLOCATE_ADDRESS; -+ return grub_efi_allocate_pages_real (GRUB_EFI_MAX_USABLE_ADDRESS, -+ pages, GRUB_EFI_ALLOCATE_MAX_ADDRESS, -+ GRUB_EFI_LOADER_DATA); -+} - -- return grub_efi_allocate_pages_real (address, pages, alloctype, -+void * -+grub_efi_allocate_fixed (grub_efi_physical_address_t address, -+ grub_efi_uintn_t pages) -+{ -+ return grub_efi_allocate_pages_real (address, pages, -+ GRUB_EFI_ALLOCATE_ADDRESS, - GRUB_EFI_LOADER_DATA); - } - -@@ -501,7 +500,7 @@ add_memory_regions (grub_efi_memory_descriptor_t *memory_map, - pages = required_pages; - } - -- addr = grub_efi_allocate_pages (start, pages); -+ addr = grub_efi_allocate_fixed (start, pages); - if (! addr) - grub_fatal ("cannot allocate conventional memory %p with %u pages", - (void *) ((grub_addr_t) start), -@@ -567,8 +566,7 @@ grub_efi_mm_init (void) - int mm_status; - - /* Prepare a memory region to store two memory maps. */ -- memory_map = grub_efi_allocate_pages (0, -- 2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE)); -+ memory_map = grub_efi_allocate_any_pages (2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE)); - if (! memory_map) - grub_fatal ("cannot allocate memory"); - -@@ -586,7 +584,7 @@ grub_efi_mm_init (void) - /* Freeing/allocating operations may increase memory map size. */ - map_size += desc_size * 32; - -- memory_map = grub_efi_allocate_pages (0, 2 * BYTES_TO_PAGES (map_size)); -+ memory_map = grub_efi_allocate_any_pages (2 * BYTES_TO_PAGES (map_size)); - if (! memory_map) - grub_fatal ("cannot allocate memory"); - -diff --git a/grub-core/loader/arm64/fdt.c b/grub-core/loader/arm64/fdt.c -index db49cf649..368001696 100644 ---- a/grub-core/loader/arm64/fdt.c -+++ b/grub-core/loader/arm64/fdt.c -@@ -50,7 +50,7 @@ grub_fdt_load (grub_size_t additional_size) - size += additional_size; - - grub_dprintf ("linux", "allocating %ld bytes for fdt\n", size); -- fdt = grub_efi_allocate_pages (0, GRUB_EFI_BYTES_TO_PAGES (size)); -+ fdt = grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (size)); - if (!fdt) - return NULL; - -diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c -index 9519d2e4d..ee3fcaa86 100644 ---- a/grub-core/loader/arm64/linux.c -+++ b/grub-core/loader/arm64/linux.c -@@ -148,8 +148,7 @@ grub_arm64_uefi_boot_image (grub_addr_t addr, grub_size_t size, char *args) - loaded_image->load_options_size = len = - (grub_strlen (args) + 1) * sizeof (grub_efi_char16_t); - loaded_image->load_options = -- grub_efi_allocate_pages (0, -- GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size)); -+ grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size)); - if (!loaded_image->load_options) - return grub_errno; - -@@ -223,7 +222,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), - grub_dprintf ("linux", "Loading initrd\n"); - - initrd_pages = (GRUB_EFI_BYTES_TO_PAGES (initrd_size)); -- initrd_mem = grub_efi_allocate_pages (0, initrd_pages); -+ initrd_mem = grub_efi_allocate_any_pages (initrd_pages); - if (!initrd_mem) - { - grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory")); -@@ -277,7 +276,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - grub_loader_unset(); - - grub_dprintf ("linux", "kernel file size: %lld\n", (long long) kernel_size); -- kernel_addr = grub_efi_allocate_pages (0, GRUB_EFI_BYTES_TO_PAGES (kernel_size)); -+ kernel_addr = grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (kernel_size)); - grub_dprintf ("linux", "kernel numpages: %lld\n", - (long long) GRUB_EFI_BYTES_TO_PAGES (kernel_size)); - if (!kernel_addr) -diff --git a/grub-core/loader/arm64/xen_boot.c b/grub-core/loader/arm64/xen_boot.c -index a914eb8e2..ab7c2f850 100644 ---- a/grub-core/loader/arm64/xen_boot.c -+++ b/grub-core/loader/arm64/xen_boot.c -@@ -324,10 +324,9 @@ xen_boot_binary_load (struct xen_boot_binary *binary, grub_file_t file, - grub_dprintf ("xen_loader", "Xen_boot file size: 0x%lx\n", binary->size); - - binary->start -- = (grub_addr_t) grub_efi_allocate_pages (0, -- GRUB_EFI_BYTES_TO_PAGES -- (binary->size + -- binary->align)); -+ = (grub_addr_t) grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES -+ (binary->size + -+ binary->align)); - if (!binary->start) - { - grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory")); -diff --git a/grub-core/loader/i386/efi/linux.c b/grub-core/loader/i386/efi/linux.c -index 549989d1d..27dea343c 100644 ---- a/grub-core/loader/i386/efi/linux.c -+++ b/grub-core/loader/i386/efi/linux.c -@@ -295,7 +295,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - start = (lh.setup_sects + 1) * 512; - len = grub_file_size(file) - start; - -- kernel_mem = grub_efi_allocate_pages(lh.pref_address, -+ kernel_mem = grub_efi_allocate_fixed(lh.pref_address, - BYTES_TO_PAGES(lh.init_size)); - - if (!kernel_mem) -diff --git a/grub-core/loader/ia64/efi/linux.c b/grub-core/loader/ia64/efi/linux.c -index efaa42ccd..750330d45 100644 ---- a/grub-core/loader/ia64/efi/linux.c -+++ b/grub-core/loader/ia64/efi/linux.c -@@ -252,7 +252,7 @@ allocate_pages (grub_uint64_t align, grub_uint64_t size_pages, - aligned_start += align; - if (aligned_start + size > end) - continue; -- mem = grub_efi_allocate_pages (aligned_start, size_pages); -+ mem = grub_efi_allocate_fixed (aligned_start, size_pages); - if (! mem) - { - grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate memory"); -@@ -326,7 +326,7 @@ grub_linux_boot (void) - mmap_size = find_mmap_size (); - if (! mmap_size) - return grub_errno; -- mmap_buf = grub_efi_allocate_pages (0, page_align (mmap_size) >> 12); -+ mmap_buf = grub_efi_allocate_any_pages (page_align (mmap_size) >> 12); - if (! mmap_buf) - return grub_error (GRUB_ERR_IO, "cannot allocate memory map"); - err = grub_efi_finish_boot_services (&mmap_size, mmap_buf, &map_key, -@@ -422,7 +422,7 @@ grub_load_elf64 (grub_file_t file, void *buffer, const char *filename) - relocate = grub_env_get ("linux_relocate"); - if (!relocate || grub_strcmp (relocate, "force") != 0) - { -- kernel_mem = grub_efi_allocate_pages (low_addr, kernel_pages); -+ kernel_mem = grub_efi_allocate_fixed (low_addr, kernel_pages); - reloc_offset = 0; - } - /* Try to relocate. */ -@@ -524,7 +524,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - len += grub_strlen (argv[i]) + 1; - len += sizeof (struct ia64_boot_param) + 512; /* Room for extensions. */ - boot_param_pages = page_align (len) >> 12; -- boot_param = grub_efi_allocate_pages (0, boot_param_pages); -+ boot_param = grub_efi_allocate_any_pages (boot_param_pages); - if (boot_param == 0) - { - grub_error (GRUB_ERR_OUT_OF_MEMORY, -@@ -589,7 +589,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), - grub_dprintf ("linux", "Loading initrd\n"); - - initrd_pages = (page_align (initrd_size) >> 12); -- initrd_mem = grub_efi_allocate_pages (0, initrd_pages); -+ initrd_mem = grub_efi_allocate_any_pages (initrd_pages); - if (! initrd_mem) - { - grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate pages"); -diff --git a/include/grub/autoefi.h b/include/grub/autoefi.h -index b75591176..b7a252e07 100644 ---- a/include/grub/autoefi.h -+++ b/include/grub/autoefi.h -@@ -55,7 +55,7 @@ static inline grub_err_t grub_autoefi_prepare (void) - # define SYSTEM_TABLE_PTR GRUB_EFIEMU_SYSTEM_TABLE_PTR - # define SIZEOF_OF_UINTN GRUB_EFIEMU_SIZEOF_OF_UINTN - # define SYSTEM_TABLE GRUB_EFIEMU_SYSTEM_TABLE --# define grub_efi_allocate_pages(x,y) (x) -+# define grub_efi_allocate_fixed(x,y) (x) - # define grub_efi_free_pages(x,y) GRUB_EFI_SUCCESS - # define grub_autoefi_finish_boot_services grub_efiemu_finish_boot_services - # define EFI_PRESENT 1 -diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h -index c7f2fe6c3..f68a19de4 100644 ---- a/include/grub/efi/efi.h -+++ b/include/grub/efi/efi.h -@@ -43,9 +43,11 @@ EXPORT_FUNC(grub_efi_allocate_pages_real) (grub_efi_physical_address_t address, - grub_efi_allocate_type_t alloctype, - grub_efi_memory_type_t memtype); - void * --EXPORT_FUNC(grub_efi_allocate_pages) (grub_efi_physical_address_t address, -+EXPORT_FUNC(grub_efi_allocate_fixed) (grub_efi_physical_address_t address, - grub_efi_uintn_t pages); - void * -+EXPORT_FUNC(grub_efi_allocate_any_pages) (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, --- -2.16.4 - diff --git a/0003-arm64-efi-move-EFI_PAGE-definitions-to-efi-memory.h.patch b/0003-arm64-efi-move-EFI_PAGE-definitions-to-efi-memory.h.patch deleted file mode 100644 index 0240283..0000000 --- a/0003-arm64-efi-move-EFI_PAGE-definitions-to-efi-memory.h.patch +++ /dev/null @@ -1,90 +0,0 @@ -From 8a84e87b34eeb2e7a8f4ea4036f124c1209c6026 Mon Sep 17 00:00:00 2001 -From: Leif Lindholm -Date: Thu, 1 Feb 2018 18:18:49 +0000 -Subject: [PATCH 3/6] arm64/efi: move EFI_PAGE definitions to efi/memory.h - -The EFI page definitions and macros are generic and should not be confined -to arm64 headers - so move to efi/memory.h. -Also add EFI_PAGE_SIZE macro. - -Update loader sources to reflect new header location. - -Signed-off-by: Leif Lindholm -Reviewed-by: Daniel Kiper ---- - grub-core/loader/arm64/fdt.c | 1 + - grub-core/loader/arm64/linux.c | 1 + - grub-core/loader/arm64/xen_boot.c | 1 + - include/grub/arm64/fdtload.h | 3 --- - include/grub/efi/memory.h | 7 +++++++ - 5 files changed, 10 insertions(+), 3 deletions(-) - -diff --git a/grub-core/loader/arm64/fdt.c b/grub-core/loader/arm64/fdt.c -index 368001696..c61adbe67 100644 ---- a/grub-core/loader/arm64/fdt.c -+++ b/grub-core/loader/arm64/fdt.c -@@ -24,6 +24,7 @@ - #include - #include - #include -+#include - - static void *loaded_fdt; - static void *fdt; -diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c -index ee3fcaa86..364fbb6e6 100644 ---- a/grub-core/loader/arm64/linux.c -+++ b/grub-core/loader/arm64/linux.c -@@ -28,6 +28,7 @@ - #include - #include - #include -+#include - #include - #include - #include -diff --git a/grub-core/loader/arm64/xen_boot.c b/grub-core/loader/arm64/xen_boot.c -index ab7c2f850..f1363024b 100644 ---- a/grub-core/loader/arm64/xen_boot.c -+++ b/grub-core/loader/arm64/xen_boot.c -@@ -30,6 +30,7 @@ - #include - #include - #include -+#include - #include /* required by struct xen_hypervisor_header */ - #include - #include -diff --git a/include/grub/arm64/fdtload.h b/include/grub/arm64/fdtload.h -index 7b9ddba91..713c9424d 100644 ---- a/include/grub/arm64/fdtload.h -+++ b/include/grub/arm64/fdtload.h -@@ -29,7 +29,4 @@ grub_fdt_unload (void); - grub_err_t - grub_fdt_install (void); - --#define GRUB_EFI_PAGE_SHIFT 12 --#define GRUB_EFI_BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> GRUB_EFI_PAGE_SHIFT) -- - #endif -diff --git a/include/grub/efi/memory.h b/include/grub/efi/memory.h -index 20526b146..08fe62277 100644 ---- a/include/grub/efi/memory.h -+++ b/include/grub/efi/memory.h -@@ -22,6 +22,13 @@ - #include - #include - -+/* The term "page" in UEFI refers only to a 4 KiB-aligned 4 KiB size region of -+ memory. It is not concerned with underlying translation management concepts, -+ but only used as the granule for memory allocations. */ -+#define GRUB_EFI_PAGE_SHIFT 12 -+#define GRUB_EFI_PAGE_SIZE (1 << GRUB_EFI_PAGE_SHIFT) -+#define GRUB_EFI_BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> GRUB_EFI_PAGE_SHIFT) -+ - #define GRUB_MMAP_REGISTER_BY_FIRMWARE 1 - - grub_err_t grub_machine_mmap_register (grub_uint64_t start, grub_uint64_t size, --- -2.16.4 - diff --git a/0004-efi-Add-central-copy-of-grub_efi_find_mmap_size.patch b/0004-efi-Add-central-copy-of-grub_efi_find_mmap_size.patch deleted file mode 100644 index 6af3dae..0000000 --- a/0004-efi-Add-central-copy-of-grub_efi_find_mmap_size.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 6ca50ac741b8c826f953b0905d736006b895f912 Mon Sep 17 00:00:00 2001 -From: Leif Lindholm -Date: Mon, 9 Jul 2018 18:33:00 +0100 -Subject: [PATCH 4/6] efi: Add central copy of grub_efi_find_mmap_size - -There are several implementations of this function in the tree. -Add a central version in grub-core/efi/mm.c. - -Signed-off-by: Leif Lindholm -Reviewed-by: Daniel Kiper ---- - grub-core/kern/efi/mm.c | 24 ++++++++++++++++++++++++ - include/grub/efi/efi.h | 1 + - 2 files changed, 25 insertions(+) - -diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c -index 4226f34ec..021d750b6 100644 ---- a/grub-core/kern/efi/mm.c -+++ b/grub-core/kern/efi/mm.c -@@ -315,6 +315,30 @@ grub_efi_finish_boot_services (grub_efi_uintn_t *outbuf_size, void *outbuf, - return GRUB_ERR_NONE; - } - -+/* -+ * To obtain the UEFI memory map, we must pass a buffer of sufficient size -+ * to hold the entire map. This function returns a sane start value for -+ * buffer size. -+ */ -+grub_efi_uintn_t -+grub_efi_find_mmap_size (void) -+{ -+ grub_efi_uintn_t mmap_size = 0; -+ grub_efi_uintn_t desc_size; -+ -+ if (grub_efi_get_memory_map (&mmap_size, NULL, NULL, &desc_size, 0) < 0) -+ { -+ grub_error (GRUB_ERR_IO, "cannot get EFI memory map size"); -+ return 0; -+ } -+ -+ /* -+ * Add an extra page, since UEFI can alter the memory map itself on -+ * callbacks or explicit calls, including console output. -+ */ -+ return ALIGN_UP (mmap_size + GRUB_EFI_PAGE_SIZE, GRUB_EFI_PAGE_SIZE); -+} -+ - /* Get the memory map as defined in the EFI spec. Return 1 if successful, - return 0 if partial, or return -1 if an error occurs. */ - int -diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h -index f68a19de4..e8ae60931 100644 ---- a/include/grub/efi/efi.h -+++ b/include/grub/efi/efi.h -@@ -52,6 +52,7 @@ 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 - EXPORT_FUNC(grub_efi_get_memory_map) (grub_efi_uintn_t *memory_map_size, - grub_efi_memory_descriptor_t *memory_map, --- -2.16.4 - diff --git a/0005-efi-Add-grub_efi_get_ram_base-function-for-arm64.patch b/0005-efi-Add-grub_efi_get_ram_base-function-for-arm64.patch deleted file mode 100644 index 1ebb443..0000000 --- a/0005-efi-Add-grub_efi_get_ram_base-function-for-arm64.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 226e83d10e35d1a76e93114366740f994548fe04 Mon Sep 17 00:00:00 2001 -From: Leif Lindholm -Date: Mon, 9 Jul 2018 18:33:01 +0100 -Subject: [PATCH 5/6] efi: Add grub_efi_get_ram_base() function for arm64 - -Since ARM platforms do not have a common memory map, add a helper -function that finds the lowest address region with the EFI_MEMORY_WB -attribute set in the UEFI memory map. - -Required for the arm64 efi linux loader to restrict the initrd -location to where it will be accessible by the kernel at runtime. - -Signed-off-by: Leif Lindholm -Reviewed-by: Daniel Kiper ---- - grub-core/kern/efi/mm.c | 31 +++++++++++++++++++++++++++++++ - include/grub/efi/efi.h | 3 +++ - 2 files changed, 34 insertions(+) - -diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c -index 021d750b6..270d0b8cc 100644 ---- a/grub-core/kern/efi/mm.c -+++ b/grub-core/kern/efi/mm.c -@@ -660,3 +660,34 @@ grub_efi_mm_init (void) - grub_efi_free_pages ((grub_addr_t) memory_map, - 2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE)); - } -+ -+#if defined (__aarch64__) -+grub_err_t -+grub_efi_get_ram_base(grub_addr_t *base_addr) -+{ -+ grub_efi_memory_descriptor_t *memory_map, *desc; -+ grub_efi_uintn_t memory_map_size, desc_size; -+ int ret; -+ -+ memory_map_size = grub_efi_find_mmap_size(); -+ -+ memory_map = grub_malloc (memory_map_size); -+ if (! memory_map) -+ return GRUB_ERR_OUT_OF_MEMORY; -+ ret = grub_efi_get_memory_map (&memory_map_size, memory_map, NULL, -+ &desc_size, NULL); -+ -+ if (ret < 1) -+ return GRUB_ERR_BUG; -+ -+ for (desc = memory_map, *base_addr = GRUB_UINT_MAX; -+ (grub_addr_t) desc < ((grub_addr_t) memory_map + memory_map_size); -+ desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size)) -+ if (desc->attribute & GRUB_EFI_MEMORY_WB) -+ *base_addr = grub_min (*base_addr, desc->physical_start); -+ -+ grub_free(memory_map); -+ -+ return GRUB_ERR_NONE; -+} -+#endif -diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h -index e8ae60931..13bc67d57 100644 ---- a/include/grub/efi/efi.h -+++ b/include/grub/efi/efi.h -@@ -97,6 +97,9 @@ extern void (*EXPORT_VAR(grub_efi_net_config)) (grub_efi_handle_t hnd, - #if defined(__arm__) || defined(__aarch64__) - void *EXPORT_FUNC(grub_efi_get_firmware_fdt)(void); - #endif -+#if defined(__aarch64__) -+grub_err_t EXPORT_FUNC(grub_efi_get_ram_base)(grub_addr_t *); -+#endif - - grub_addr_t grub_efi_modules_addr (void); - --- -2.16.4 - diff --git a/0006-Add-support-for-EFI-handover-on-ARM64.patch b/0006-Add-support-for-EFI-handover-on-ARM64.patch deleted file mode 100644 index da89f5c..0000000 --- a/0006-Add-support-for-EFI-handover-on-ARM64.patch +++ /dev/null @@ -1,489 +0,0 @@ -From 17667c24295a4b105bf20a3bd5bb19ef0acaebba Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -Date: Fri, 21 Dec 2018 14:36:10 +0800 -Subject: [PATCH 6/6] Add support for EFI handover on ARM64 - -Add support for EFI handover on ARM64 for loading linux kernel. ---- - grub-core/Makefile.core.def | 9 +- - grub-core/loader/arm64/efi/linux.c | 448 +++++++++++++++++++++++++++++++++++++ - 2 files changed, 453 insertions(+), 4 deletions(-) - create mode 100644 grub-core/loader/arm64/efi/linux.c - -diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index 1269f372c..f306311e6 100644 ---- a/grub-core/Makefile.core.def -+++ b/grub-core/Makefile.core.def -@@ -1761,10 +1761,11 @@ module = { - - module = { - name = linuxefi; -- efi = loader/i386/efi/linux.c; -- efi = lib/cmdline.c; -- enable = i386_efi; -- enable = x86_64_efi; -+ arm64 = loader/arm64/efi/linux.c; -+ x86_64 = loader/i386/efi/linux.c; -+ common = lib/cmdline.c; -+ enable = x86_64; -+ enable = arm64; - }; - - module = { -diff --git a/grub-core/loader/arm64/efi/linux.c b/grub-core/loader/arm64/efi/linux.c -new file mode 100644 -index 000000000..4a5c70e4b ---- /dev/null -+++ b/grub-core/loader/arm64/efi/linux.c -@@ -0,0 +1,448 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2013 Free Software Foundation, Inc. -+ * -+ * GRUB is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation, either version 3 of the License, or -+ * (at your option) any later version. -+ * -+ * GRUB is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with GRUB. If not, see . -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+GRUB_MOD_LICENSE ("GPLv3+"); -+ -+static grub_dl_t my_mod; -+static int loaded; -+ -+static void *kernel_addr; -+static grub_uint64_t kernel_size; -+static grub_uint32_t handover_offset; -+ -+static char *linux_args; -+static grub_uint32_t cmdline_size; -+ -+static grub_addr_t initrd_start; -+static grub_addr_t initrd_end; -+ -+struct grub_arm64_linux_pe_header -+{ -+ grub_uint32_t magic; -+ struct grub_pe32_coff_header coff; -+ struct grub_pe64_optional_header opt; -+}; -+ -+#if defined(__aarch64__) -+# define GRUB_LINUX_ARMXX_MAGIC_SIGNATURE GRUB_ARM64_LINUX_MAGIC -+# define linux_armxx_kernel_header grub_arm64_linux_kernel_header -+# define grub_armxx_linux_pe_header grub_arm64_linux_pe_header -+#endif -+ -+#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; -+} -+ -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wcast-align" -+ -+typedef void (*handover_func) (void *, grub_efi_system_table_t *, void *); -+ -+static grub_err_t -+grub_efi_linux_boot (void *kernel_address, grub_off_t offset, -+ void *kernel_params) -+{ -+ handover_func hf; -+ -+ hf = (handover_func)((char *)kernel_address + offset); -+ hf (grub_efi_image_handle, grub_efi_system_table, kernel_params); -+ -+ return GRUB_ERR_BUG; -+} -+ -+#pragma GCC diagnostic pop -+static grub_err_t -+grub_armxx_efi_linux_check_image (struct linux_armxx_kernel_header * lh) -+{ -+ if (lh->magic != GRUB_LINUX_ARMXX_MAGIC_SIGNATURE) -+ return grub_error(GRUB_ERR_BAD_OS, "invalid magic number"); -+ -+ if ((lh->code0 & 0xffff) != GRUB_EFI_PE_MAGIC) -+ return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, -+ N_("plain image kernel not supported - rebuild with CONFIG_(U)EFI_STUB enabled")); -+ -+ grub_dprintf ("linux", "UEFI stub kernel:\n"); -+ grub_dprintf ("linux", "PE/COFF header @ %08x\n", lh->hdr_offset); -+ -+ return GRUB_ERR_NONE; -+} -+ -+static grub_err_t -+finalize_params_linux (void) -+{ -+ grub_efi_loaded_image_t *loaded_image = NULL; -+ int node, retval, len; -+ -+ void *fdt; -+ -+ fdt = grub_fdt_load (0x400); -+ -+ if (!fdt) -+ goto failure; -+ -+ node = grub_fdt_find_subnode (fdt, 0, "chosen"); -+ if (node < 0) -+ node = grub_fdt_add_subnode (fdt, 0, "chosen"); -+ -+ if (node < 1) -+ goto failure; -+ -+ /* Set initrd info */ -+ if (initrd_start && initrd_end > initrd_start) -+ { -+ grub_dprintf ("linux", "Initrd @ %p-%p\n", -+ (void *) initrd_start, (void *) initrd_end); -+ -+ retval = grub_fdt_set_prop64 (fdt, node, "linux,initrd-start", -+ initrd_start); -+ if (retval) -+ goto failure; -+ retval = grub_fdt_set_prop64 (fdt, node, "linux,initrd-end", -+ initrd_end); -+ if (retval) -+ goto failure; -+ } -+ -+ if (grub_fdt_install() != GRUB_ERR_NONE) -+ goto failure; -+ -+ grub_dprintf ("linux", "Installed/updated FDT configuration table @ %p\n", -+ fdt); -+ -+ /* Convert command line to UCS-2 */ -+ loaded_image = grub_efi_get_loaded_image (grub_efi_image_handle); -+ if (!loaded_image) -+ goto failure; -+ -+ loaded_image->load_options_size = len = -+ (grub_strlen (linux_args) + 1) * sizeof (grub_efi_char16_t); -+ loaded_image->load_options = -+ grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size)); -+ if (!loaded_image->load_options) -+ return grub_error(GRUB_ERR_BAD_OS, "failed to create kernel parameters"); -+ -+ loaded_image->load_options_size = -+ 2 * grub_utf8_to_utf16 (loaded_image->load_options, len, -+ (grub_uint8_t *) linux_args, len, NULL); -+ -+ return GRUB_ERR_NONE; -+ -+failure: -+ grub_fdt_unload(); -+ return grub_error(GRUB_ERR_BAD_OS, "failed to install/update FDT"); -+} -+ -+static void -+free_params (void) -+{ -+ grub_efi_loaded_image_t *loaded_image = NULL; -+ -+ loaded_image = grub_efi_get_loaded_image (grub_efi_image_handle); -+ if (loaded_image) -+ { -+ if (loaded_image->load_options) -+ grub_efi_free_pages ((grub_efi_physical_address_t)(grub_efi_uintn_t)loaded_image->load_options, -+ GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size)); -+ loaded_image->load_options = NULL; -+ loaded_image->load_options_size = 0; -+ } -+} -+ -+static grub_err_t -+grub_armxx_efi_linux_boot_image (grub_addr_t addr, char *args) -+{ -+ grub_err_t retval; -+ -+ retval = finalize_params_linux (); -+ if (retval != GRUB_ERR_NONE) -+ return grub_errno; -+ -+ grub_dprintf ("linux", "linux command line: '%s'\n", args); -+ -+ retval = grub_efi_linux_boot ((char *)addr, handover_offset, (void *)addr); -+ -+ /* Never reached... */ -+ free_params(); -+ return retval; -+} -+ -+static grub_err_t -+grub_linux_boot (void) -+{ -+ return grub_armxx_efi_linux_boot_image((grub_addr_t)kernel_addr, linux_args); -+} -+ -+static grub_err_t -+grub_linux_unload (void) -+{ -+ grub_dl_unref (my_mod); -+ loaded = 0; -+ if (initrd_start) -+ grub_efi_free_pages ((grub_efi_physical_address_t) initrd_start, -+ GRUB_EFI_BYTES_TO_PAGES (initrd_end - initrd_start)); -+ initrd_start = initrd_end = 0; -+ grub_free (linux_args); -+ if (kernel_addr) -+ grub_efi_free_pages ((grub_addr_t) kernel_addr, -+ GRUB_EFI_BYTES_TO_PAGES (kernel_size)); -+ grub_fdt_unload (); -+ return GRUB_ERR_NONE; -+} -+ -+/* -+ * As per linux/Documentation/arm/Booting -+ * ARM initrd needs to be covered by kernel linear mapping, -+ * so place it in the first 512MB of DRAM. -+ * -+ * As per linux/Documentation/arm64/booting.txt -+ * ARM64 initrd needs to be contained entirely within a 1GB aligned window -+ * of up to 32GB of size that covers the kernel image as well. -+ * Since the EFI stub loader will attempt to load the kernel near start of -+ * RAM, place the buffer in the first 32GB of RAM. -+ */ -+#ifdef __arm__ -+#define INITRD_MAX_ADDRESS_OFFSET (512U * 1024 * 1024) -+#else /* __aarch64__ */ -+#define INITRD_MAX_ADDRESS_OFFSET (32ULL * 1024 * 1024 * 1024) -+#endif -+ -+/* -+ * This function returns a pointer to a legally allocated initrd buffer, -+ * or NULL if unsuccessful -+ */ -+static void * -+allocate_initrd_mem (int initrd_pages) -+{ -+ grub_addr_t max_addr; -+ -+ if (grub_efi_get_ram_base (&max_addr) != GRUB_ERR_NONE) -+ return NULL; -+ -+ max_addr += INITRD_MAX_ADDRESS_OFFSET - 1; -+ -+ return grub_efi_allocate_pages_real (max_addr, initrd_pages, -+ GRUB_EFI_ALLOCATE_MAX_ADDRESS, -+ GRUB_EFI_LOADER_DATA); -+} -+ -+static grub_err_t -+grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), -+ int argc, char *argv[]) -+{ -+ struct grub_linux_initrd_context initrd_ctx = { 0, 0, 0 }; -+ int initrd_size, initrd_pages; -+ void *initrd_mem = NULL; -+ -+ if (argc == 0) -+ { -+ grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); -+ goto fail; -+ } -+ -+ if (!loaded) -+ { -+ grub_error (GRUB_ERR_BAD_ARGUMENT, -+ N_("you need to load the kernel first")); -+ goto fail; -+ } -+ -+ if (grub_initrd_init (argc, argv, &initrd_ctx)) -+ goto fail; -+ -+ initrd_size = grub_get_initrd_size (&initrd_ctx); -+ grub_dprintf ("linux", "Loading initrd\n"); -+ -+ initrd_pages = (GRUB_EFI_BYTES_TO_PAGES (initrd_size)); -+ initrd_mem = allocate_initrd_mem (initrd_pages); -+ -+ if (!initrd_mem) -+ { -+ grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory")); -+ goto fail; -+ } -+ -+ if (grub_initrd_load (&initrd_ctx, argv, initrd_mem)) -+ goto fail; -+ -+ initrd_start = (grub_addr_t) initrd_mem; -+ initrd_end = initrd_start + initrd_size; -+ grub_dprintf ("linux", "[addr=%p, size=0x%x]\n", -+ (void *) initrd_start, initrd_size); -+ -+ fail: -+ grub_initrd_close (&initrd_ctx); -+ if (initrd_mem && !initrd_start) -+ grub_efi_free_pages ((grub_addr_t) initrd_mem, initrd_pages); -+ -+ return grub_errno; -+} -+ -+static grub_err_t -+grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), -+ int argc, char *argv[]) -+{ -+ grub_file_t file = 0; -+ struct linux_armxx_kernel_header lh; -+ struct grub_armxx_linux_pe_header *pe; -+ -+ grub_dl_ref (my_mod); -+ -+ if (argc == 0) -+ { -+ grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); -+ goto fail; -+ } -+ -+ file = grub_file_open (argv[0]); -+ if (!file) -+ goto fail; -+ -+ kernel_size = grub_file_size (file); -+ -+ if (grub_file_read (file, &lh, sizeof (lh)) < (long) sizeof (lh)) -+ return grub_errno; -+ -+ if (grub_armxx_efi_linux_check_image (&lh) != GRUB_ERR_NONE) -+ goto fail; -+ -+ grub_loader_unset(); -+ -+ grub_dprintf ("linux", "kernel file size: %lld\n", (long long) kernel_size); -+ kernel_addr = grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (kernel_size)); -+ grub_dprintf ("linux", "kernel numpages: %lld\n", -+ (long long) GRUB_EFI_BYTES_TO_PAGES (kernel_size)); -+ if (!kernel_addr) -+ { -+ grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory")); -+ goto fail; -+ } -+ -+ grub_file_seek (file, 0); -+ if (grub_file_read (file, kernel_addr, kernel_size) -+ < (grub_int64_t) kernel_size) -+ { -+ if (!grub_errno) -+ grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"), argv[0]); -+ goto fail; -+ } -+ -+ grub_dprintf ("linux", "kernel @ %p\n", kernel_addr); -+ -+ if (!grub_linuxefi_secure_validate (kernel_addr, kernel_size)) -+ { -+ grub_error (GRUB_ERR_INVALID_COMMAND, N_("%s has invalid signature"), argv[0]); -+ goto fail; -+ } -+ -+ pe = (void *)((unsigned long)kernel_addr + lh.hdr_offset); -+ handover_offset = pe->opt.entry_addr; -+ -+ cmdline_size = grub_loader_cmdline_size (argc, argv) + sizeof (LINUX_IMAGE); -+ linux_args = grub_malloc (cmdline_size); -+ if (!linux_args) -+ { -+ grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory")); -+ goto fail; -+ } -+ grub_memcpy (linux_args, LINUX_IMAGE, sizeof (LINUX_IMAGE)); -+ grub_create_loader_cmdline (argc, argv, -+ linux_args + sizeof (LINUX_IMAGE) - 1, -+ cmdline_size); -+ -+ if (grub_errno == GRUB_ERR_NONE) -+ { -+ grub_loader_set (grub_linux_boot, grub_linux_unload, 0); -+ loaded = 1; -+ } -+ -+fail: -+ if (file) -+ grub_file_close (file); -+ -+ if (grub_errno != GRUB_ERR_NONE) -+ { -+ grub_dl_unref (my_mod); -+ loaded = 0; -+ } -+ -+ if (linux_args && !loaded) -+ grub_free (linux_args); -+ -+ if (kernel_addr && !loaded) -+ grub_efi_free_pages ((grub_addr_t) kernel_addr, -+ GRUB_EFI_BYTES_TO_PAGES (kernel_size)); -+ -+ return grub_errno; -+} -+ -+ -+static grub_command_t cmd_linux, cmd_initrd; -+ -+GRUB_MOD_INIT (linux) -+{ -+ cmd_linux = grub_register_command ("linuxefi", grub_cmd_linux, 0, -+ N_("Load Linux.")); -+ cmd_initrd = grub_register_command ("initrdefi", grub_cmd_initrd, 0, -+ N_("Load initrd.")); -+ my_mod = mod; -+} -+ -+GRUB_MOD_FINI (linux) -+{ -+ grub_unregister_command (cmd_linux); -+ grub_unregister_command (cmd_initrd); -+} --- -2.16.4 - diff --git a/grub2-secureboot-install-signed-grub.patch b/grub2-secureboot-install-signed-grub.patch new file mode 100644 index 0000000..09e19c1 --- /dev/null +++ b/grub2-secureboot-install-signed-grub.patch @@ -0,0 +1,228 @@ +From 1ff2f31d12f7235423a1eb8a117e0c6f8b2f41c7 Mon Sep 17 00:00:00 2001 +From: Michael Chang +Date: Tue, 4 Jun 2019 12:32:35 +0800 +Subject: [PATCH] grub-install: handle signed grub installation on arm64-efi + +Use grub2-install to handle signed grub installation for arm64 UEFI secure +boot, the default behavior is auto, which will install signed grub whenever +detected. + +Two options, --suse-force-signed and --suse-inhibit-signed, can be used to +override the default auto detecting behavior. The former will force to use +prebuilt signed image and thus will fail if missing, the latter will always use +'mkimage' to create unsigned core image per the user's running environment. + +Signed-off-by: Michael Chang +--- + util/grub-install.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 85 insertions(+), 1 deletion(-) + +Index: grub-2.02/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 + { ++ SIGNED_GRUB_INHIBIT, ++ SIGNED_GRUB_AUTO, ++ SIGNED_GRUB_FORCE ++ }; ++ ++static int signed_grub_mode = SIGNED_GRUB_AUTO; ++ ++enum ++ { + OPTION_BOOT_DIRECTORY = 0x301, + OPTION_ROOT_DIRECTORY, + OPTION_TARGET, +@@ -108,6 +117,8 @@ enum + OPTION_NO_BOOTSECTOR, + OPTION_NO_RS_CODES, + OPTION_SUSE_ENABLE_TPM, ++ OPTION_SUSE_FORCE_SIGNED, ++ OPTION_SUSE_INHIBIT_SIGNED, + OPTION_MACPPC_DIRECTORY, + OPTION_ZIPL_DIRECTORY, + OPTION_LABEL_FONT, +@@ -237,6 +248,14 @@ argp_parser (int key, char *arg, struct + suse_enable_tpm = 1; + return 0; + ++ case OPTION_SUSE_FORCE_SIGNED: ++ signed_grub_mode = SIGNED_GRUB_FORCE; ++ return 0; ++ ++ case OPTION_SUSE_INHIBIT_SIGNED: ++ signed_grub_mode = SIGNED_GRUB_INHIBIT; ++ return 0; ++ + case OPTION_DEBUG: + verbosity++; + return 0; +@@ -299,7 +318,12 @@ static struct argp_option options[] = { + N_("Do not apply any reed-solomon codes when embedding core.img. " + "This option is only available on x86 BIOS targets."), 0}, + {"suse-enable-tpm", OPTION_SUSE_ENABLE_TPM, 0, 0, N_("install TPM modules"), 0}, +- ++ {"suse-force-signed", OPTION_SUSE_FORCE_SIGNED, 0, 0, ++ N_("force installation of signed grub" "%s." ++ "This option is only available on ARM64 EFI targets."), 0}, ++ {"suse-inhibit-signed", OPTION_SUSE_INHIBIT_SIGNED, 0, 0, ++ N_("inhibit installation of signed grub. " ++ "This option is only available on ARM64 EFI targets."), 0}, + {"debug", OPTION_DEBUG, 0, OPTION_HIDDEN, 0, 2}, + {"no-floppy", OPTION_NO_FLOPPY, 0, OPTION_HIDDEN, 0, 2}, + {"debug-image", OPTION_DEBUG_IMAGE, N_("STRING"), OPTION_HIDDEN, 0, 2}, +@@ -364,6 +388,22 @@ help_filter (int key, const char *text, + free (plats); + return ret; + } ++ case OPTION_SUSE_FORCE_SIGNED: ++ { ++ const char *t = get_default_platform (); ++ char *ret; ++ if (grub_strcmp (t, "arm64-efi") == 0) ++ { ++ char *s = grub_util_path_concat (3, grub_util_get_pkglibdir (), t, "grub.efi"); ++ char *text2 = xasprintf (" [default=%s]", s); ++ ret = xasprintf (text, text2); ++ free (text2); ++ free (s); ++ } ++ else ++ ret = xasprintf (text, ""); ++ return ret; ++ } + case ARGP_KEY_HELP_POST_DOC: + return xasprintf (text, program_name, GRUB_BOOT_DIR_NAME "/" GRUB_DIR_NAME); + default: +@@ -1596,13 +1636,34 @@ main (int argc, char *argv[]) + + char mkimage_target[200]; + const char *core_name = NULL; ++ char *signed_imgfile = NULL; + + switch (platform) + { +- case GRUB_INSTALL_PLATFORM_I386_EFI: ++ case GRUB_INSTALL_PLATFORM_ARM64_EFI: ++ ++ if (signed_grub_mode > SIGNED_GRUB_INHIBIT) ++ { ++ signed_imgfile = grub_util_path_concat (2, grub_install_source_directory, "grub.efi"); ++ if (!grub_util_is_regular (signed_imgfile)) ++ { ++ if (signed_grub_mode >= SIGNED_GRUB_FORCE) ++ grub_util_error ("signed image `%s' does not exist\n", signed_imgfile); ++ else ++ { ++ free (signed_imgfile); ++ signed_imgfile = NULL; ++ } ++ } ++ } ++ ++ if (signed_imgfile) ++ fprintf (stderr, _("Use signed file in %s for installation.\n"), signed_imgfile); ++ ++ /* fallthrough. */ + 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_IA64_EFI: + 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); +- if (core_name != mkimage_target) ++ char *grub_efi_cfg = NULL; ++ ++ if ((core_name != mkimage_target) && !signed_imgfile) + grub_install_make_image_wrap (/* source dir */ grub_install_source_directory, + /*prefix */ prefix, + /* output */ imgfile, + /* memdisk */ NULL, + have_load_cfg ? load_cfg : NULL, + /* image target */ mkimage_target, 0); ++ else if (signed_imgfile) ++ { ++ FILE *grub_cfg_f; ++ ++ grub_install_copy_file (signed_imgfile, imgfile, 1); ++ grub_efi_cfg = grub_util_path_concat (2, platdir, "grub.cfg"); ++ grub_cfg_f = grub_util_fopen (grub_efi_cfg, "wb"); ++ if (!grub_cfg_f) ++ grub_util_error (_("Can't create file: %s"), strerror (errno)); ++ ++ if (have_abstractions) ++ { ++ fprintf (grub_cfg_f, "set prefix=(%s)%s\n", grub_drives[0], relative_grubdir); ++ fprintf (grub_cfg_f, "set root=%s\n", grub_drives[0]); ++ } ++ else if (prefix_drive) ++ { ++ char *uuid = NULL; ++ if (grub_fs->uuid && grub_fs->uuid (grub_dev, &uuid)) ++ { ++ grub_print_error (); ++ grub_errno = 0; ++ uuid = NULL; ++ } ++ if (!uuid) ++ grub_util_error ("cannot find fs uuid for %s", grub_fs->name); ++ ++ fprintf (grub_cfg_f, "search --fs-uuid --set=root %s\n", uuid); ++ fprintf (grub_cfg_f, "set prefix=($root)%s\n", relative_grubdir); ++ } ++ ++ if (have_load_cfg) ++ { ++ size_t len; ++ char *buf; ++ ++ FILE *fp = grub_util_fopen (load_cfg, "rb"); ++ if (!fp) ++ grub_util_error (_("Can't read file: %s"), strerror (errno)); ++ ++ fseek (fp, 0, SEEK_END); ++ len = ftell (fp); ++ fseek (fp, 0, SEEK_SET); ++ buf = xmalloc (len); ++ ++ if (fread (buf, 1, len, fp) != len) ++ grub_util_error (_("cannot read `%s': %s"), load_cfg, strerror (errno)); ++ ++ if (fwrite (buf, 1, len, grub_cfg_f) != len) ++ grub_util_error (_("cannot write `%s': %s"), grub_efi_cfg, strerror (errno)); ++ ++ free (buf); ++ fclose (fp); ++ } ++ ++ fprintf (grub_cfg_f, "source ${prefix}/grub.cfg\n"); ++ fclose (grub_cfg_f); ++ free (signed_imgfile); ++ signed_imgfile = NULL; ++ } + /* Backward-compatibility kludges. */ + switch (platform) + { +@@ -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); ++ if (grub_efi_cfg) ++ { ++ dst = grub_util_path_concat (2, efidir, "grub.cfg"); ++ grub_install_copy_file (grub_efi_cfg, dst, 1); ++ free (dst); ++ free (grub_efi_cfg); ++ } + } + if (!removable && update_nvram) + { diff --git a/grub2.changes b/grub2.changes index dece89e..a87a3f5 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,17 @@ +------------------------------------------------------------------- +Mon Jun 17 09:45:49 UTC 2019 - mchang@suse.com + +- Use grub2-install to handle signed grub installation for UEFI secure + boot and also provide options to override default (bsc#1136601) + * grub2-secureboot-install-signed-grub.patch +- Remove arm64 linuxefi patches as it's not needed for secure boot + * 0001-efi-refactor-grub_efi_allocate_pages.patch + * 0002-Remove-grub_efi_allocate_pages.patch + * 0003-arm64-efi-move-EFI_PAGE-definitions-to-efi-memory.h.patch + * 0004-efi-Add-central-copy-of-grub_efi_find_mmap_size.patch + * 0005-efi-Add-grub_efi_get_ram_base-function-for-arm64.patch + * 0006-Add-support-for-EFI-handover-on-ARM64.patch + ------------------------------------------------------------------- Fri Jun 14 06:13:58 UTC 2019 - mchang@suse.com diff --git a/grub2.spec b/grub2.spec index d971e57..203ffdc 100644 --- a/grub2.spec +++ b/grub2.spec @@ -305,12 +305,7 @@ Patch421: 0002-AUDIT-0-http-boot-tracker-bug.patch 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: 0001-efi-refactor-grub_efi_allocate_pages.patch -Patch451: 0002-Remove-grub_efi_allocate_pages.patch -Patch452: 0003-arm64-efi-move-EFI_PAGE-definitions-to-efi-memory.h.patch -Patch453: 0004-efi-Add-central-copy-of-grub_efi_find_mmap_size.patch -Patch454: 0005-efi-Add-grub_efi_get_ram_base-function-for-arm64.patch -Patch455: 0006-Add-support-for-EFI-handover-on-ARM64.patch +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 @@ -618,11 +613,6 @@ swap partition while in resuming %patch430 -p1 %patch431 -p1 %patch450 -p1 -%patch451 -p1 -%patch452 -p1 -%patch453 -p1 -%patch454 -p1 -%patch455 -p1 %patch500 -p1 %patch501 -p1 %patch510 -p1 @@ -747,7 +737,7 @@ CD_MODULES=" all_video boot cat chain configfile echo true \ PXE_MODULES="efinet tftp http" CRYPTO_MODULES="luks gcry_rijndael gcry_sha1 gcry_sha256" -%ifarch x86_64 aarch64 +%ifarch x86_64 CD_MODULES="${CD_MODULES} linuxefi" %else CD_MODULES="${CD_MODULES} linux" From 50492b68e2f596dadac7694caa9730ed55c233d8d6527eb99e0eab1788c7789f Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Tue, 16 Jul 2019 06:37:40 +0000 Subject: [PATCH 53/57] Accepting request 714608 from Base:System OBS-URL: https://build.opensuse.org/request/show/714608 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=207 --- ...ee1275-FCP-methods-for-WWPN-and-LUNs.patch | 217 +++++++++--------- grub2.changes | 6 + 2 files changed, 117 insertions(+), 106 deletions(-) diff --git a/grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch b/grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch index 054aaf0..749160e 100644 --- a/grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch +++ b/grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch @@ -1,6 +1,6 @@ -From a7a3ad361b4a75d052e9b4389b44a9f3848f3b9f Mon Sep 17 00:00:00 2001 -From: Diego Domingos -Date: Fri, 10 Aug 2018 16:29:50 -0400 +From 3540ebd05d545ba8f55b0f94983aeb82ad9232f3 Mon Sep 17 00:00:00 2001 +From: Diego Domingos +Date: Mon, 24 Jun 2019 10:15:56 -0400 Subject: [PATCH] ieee1275: implement FCP methods for WWPN and LUNs This patch enables the fcp-targets and fcp-luns methods which are @@ -9,133 +9,138 @@ responsible to get WWPNs and LUNs for fibre channel devices. Those methods are specially necessary if the boot directory and grub installation are in different FCP disks, allowing the dev_iterate() to find the WWPNs and LUNs when called by searchfs.uuid tool. - -Signed-off-by: Diego Domingos --- - grub-core/disk/ieee1275/ofdisk.c | 109 ++++++++++++++++++++++++++++++++++++++- - 1 file changed, 108 insertions(+), 1 deletion(-) + grub-core/disk/ieee1275/ofdisk.c | 117 ++++++++++++++++++++++++++++++++++++++- + 1 file changed, 116 insertions(+), 1 deletion(-) -Index: grub-2.02/grub-core/disk/ieee1275/ofdisk.c -=================================================================== ---- grub-2.02.orig/grub-core/disk/ieee1275/ofdisk.c -+++ grub-2.02/grub-core/disk/ieee1275/ofdisk.c -@@ -209,7 +209,118 @@ dev_iterate_real (const char *name, cons +diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c +index 235c0fe..eb907c3 100644 +--- a/grub-core/disk/ieee1275/ofdisk.c ++++ b/grub-core/disk/ieee1275/ofdisk.c +@@ -209,7 +209,122 @@ dev_iterate_real (const char *name, const char *path) static void dev_iterate (const struct grub_ieee1275_devalias *alias) { - if (grub_strcmp (alias->type, "vscsi") == 0) -+ if (grub_strcmp (alias->type, "fcp") == 0){ ++ if (grub_strcmp (alias->type, "fcp") == 0) ++ { + -+ /* If we are dealing with fcp devices, we need -+ * to find the WWPNs and LUNs to iterate them */ -+ grub_ieee1275_ihandle_t ihandle; -+ grub_uint64_t *ptr_targets, *ptr_luns; -+ unsigned int i, j, pos; -+ char *buf, *bufptr; ++ /* If we are dealing with fcp devices, we need ++ * to find the WWPNs and LUNs to iterate them */ ++ grub_ieee1275_ihandle_t ihandle; ++ grub_uint64_t *ptr_targets, *ptr_luns, k, l; ++ unsigned int i, j, pos; ++ char *buf, *bufptr; + -+ struct set_fcp_targets_args -+ { -+ struct grub_ieee1275_common_hdr common; -+ grub_ieee1275_cell_t method; -+ grub_ieee1275_cell_t ihandle; -+ grub_ieee1275_cell_t catch_result; -+ grub_ieee1275_cell_t nentries; -+ grub_ieee1275_cell_t table; -+ } args_targets; ++ struct set_fcp_targets_args ++ { ++ struct grub_ieee1275_common_hdr common; ++ grub_ieee1275_cell_t method; ++ grub_ieee1275_cell_t ihandle; ++ grub_ieee1275_cell_t catch_result; ++ grub_ieee1275_cell_t nentries; ++ grub_ieee1275_cell_t table; ++ } args_targets; + -+ struct set_fcp_luns_args -+ { -+ struct grub_ieee1275_common_hdr common; -+ grub_ieee1275_cell_t method; -+ grub_ieee1275_cell_t ihandle; -+ grub_ieee1275_cell_t wwpn_h; -+ grub_ieee1275_cell_t wwpn_l; -+ grub_ieee1275_cell_t catch_result; -+ grub_ieee1275_cell_t nentries; -+ grub_ieee1275_cell_t table; -+ } args_luns; ++ struct set_fcp_luns_args ++ { ++ struct grub_ieee1275_common_hdr common; ++ grub_ieee1275_cell_t method; ++ grub_ieee1275_cell_t ihandle; ++ grub_ieee1275_cell_t wwpn_h; ++ grub_ieee1275_cell_t wwpn_l; ++ grub_ieee1275_cell_t catch_result; ++ grub_ieee1275_cell_t nentries; ++ grub_ieee1275_cell_t table; ++ } args_luns; + -+ if(grub_ieee1275_open (alias->path, &ihandle)) -+ { -+ grub_dprintf("disk", "failed to open the disk while iterating FCP disk path=%s\n", alias->path); -+ return; -+ } ++ struct args_ret ++ { ++ grub_uint64_t addr; ++ grub_uint64_t len; ++ }; + -+ INIT_IEEE1275_COMMON (&args_targets.common, "call-method", 2, 3); -+ args_targets.method = (grub_ieee1275_cell_t) "fcp-targets"; -+ args_targets.ihandle = ihandle; -+ args_targets.table = 0; -+ args_targets.nentries = 0; ++ if(grub_ieee1275_open (alias->path, &ihandle)) ++ { ++ grub_dprintf("disk", "failed to open the disk while iterating FCP disk path=%s\n", alias->path); ++ return; ++ } + -+ INIT_IEEE1275_COMMON (&args_luns.common, "call-method", 4, 3); -+ args_luns.method = (grub_ieee1275_cell_t) "fcp-luns"; -+ args_luns.ihandle = ihandle; -+ args_luns.table = 0; -+ args_luns.nentries = 0; ++ /* Setup the fcp-targets method to call via pfw*/ ++ INIT_IEEE1275_COMMON (&args_targets.common, "call-method", 2, 3); ++ args_targets.method = (grub_ieee1275_cell_t) "fcp-targets"; ++ args_targets.ihandle = ihandle; + -+ if (IEEE1275_CALL_ENTRY_FN (&args_targets) == -1) -+ { -+ grub_dprintf("disk", "failed to get the targets while iterating FCP disk path=%s\n", alias->path); -+ grub_ieee1275_close(ihandle); -+ return; -+ } ++ /* Setup the fcp-luns method to call via pfw */ ++ INIT_IEEE1275_COMMON (&args_luns.common, "call-method", 4, 3); ++ args_luns.method = (grub_ieee1275_cell_t) "fcp-luns"; ++ args_luns.ihandle = ihandle; + -+ buf = grub_malloc (grub_strlen (alias->path) + 32 + 32); ++ if (IEEE1275_CALL_ENTRY_FN (&args_targets) == -1) ++ { ++ grub_dprintf("disk", "failed to get the targets while iterating FCP disk path=%s\n", alias->path); ++ grub_ieee1275_close(ihandle); ++ return; ++ } + -+ if (!buf) -+ { -+ grub_ieee1275_close(ihandle); -+ return; -+ } ++ buf = grub_malloc (grub_strlen (alias->path) + 32 + 32); + -+ bufptr = grub_stpcpy (buf, alias->path); ++ if (!buf) ++ { ++ grub_ieee1275_close(ihandle); ++ return; ++ } + -+ /* For each WWPN discovered we need to find his associated LUNS -+ * calling the fcp-luns method */ -+ for (i=0; i< args_targets.nentries; i++) -+ { -+ ptr_targets = *(grub_uint64_t **) (args_targets.table + 4 + 8 * i); -+ while(*ptr_targets) -+ { -+ args_luns.wwpn_l = (grub_ieee1275_cell_t) (*ptr_targets); -+ args_luns.wwpn_h = (grub_ieee1275_cell_t) (*ptr_targets >> 32); -+ pos=grub_snprintf (bufptr, 32, "/disk@%" PRIxGRUB_UINT64_T, -+ *ptr_targets++); ++ bufptr = grub_stpcpy (buf, alias->path); + -+ if (IEEE1275_CALL_ENTRY_FN (&args_luns) == -1) -+ { -+ grub_dprintf("disk", "failed to get the LUNS while iterating FCP disk path=%s\n", buf); -+ grub_ieee1275_close (ihandle); -+ grub_free (buf); -+ return; -+ } ++ /* Iterate over entries returned by pfw. Each entry contains a ++ * pointer to wwpn table and his length. */ ++ struct args_ret *targets_table = (struct args_ret *)(args_targets.table); ++ for (i=0; i< args_targets.nentries; i++) ++ { ++ ptr_targets = (grub_uint64_t*)(grub_uint32_t) targets_table[i].addr; ++ /* Iterate over all wwpns in given table */ ++ for(k=0;k> 32); ++ pos=grub_snprintf (bufptr, 32, "/disk@%" PRIxGRUB_UINT64_T, ++ *ptr_targets++); ++ /* Get the luns for given wwpn target */ ++ if (IEEE1275_CALL_ENTRY_FN (&args_luns) == -1) ++ { ++ grub_dprintf("disk", "failed to get the LUNS while iterating FCP disk path=%s\n", buf); ++ grub_ieee1275_close (ihandle); ++ grub_free (buf); ++ return; ++ } + -+ for(j=0;jtype, "vscsi") == 0) { static grub_ieee1275_ihandle_t ihandle; struct set_color_args +-- +2.16.4 + diff --git a/grub2.changes b/grub2.changes index a87a3f5..532d0f5 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Mon Jun 24 17:56:12 UTC 2019 - Michal Suchanek + +- Fix iteration of FCP LUNs (bsc#1134287, bsc#1139345, LTC#177836, LTC#174229). + * Refresh grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch + ------------------------------------------------------------------- Mon Jun 17 09:45:49 UTC 2019 - mchang@suse.com From e4d4d15f022c6613eaca7e67a03c7068974b39f58458a815d34c115b1e73ff6e Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Tue, 23 Jul 2019 20:32:21 +0000 Subject: [PATCH 54/57] Accepting request 716998 from Base:System OBS-URL: https://build.opensuse.org/request/show/716998 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=208 --- ...ee1275-FCP-methods-for-WWPN-and-LUNs.patch | 146 ------------------ grub2.changes | 6 + grub2.spec | 2 - 3 files changed, 6 insertions(+), 148 deletions(-) delete mode 100644 grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch diff --git a/grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch b/grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch deleted file mode 100644 index 749160e..0000000 --- a/grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch +++ /dev/null @@ -1,146 +0,0 @@ -From 3540ebd05d545ba8f55b0f94983aeb82ad9232f3 Mon Sep 17 00:00:00 2001 -From: Diego Domingos -Date: Mon, 24 Jun 2019 10:15:56 -0400 -Subject: [PATCH] ieee1275: implement FCP methods for WWPN and LUNs - -This patch enables the fcp-targets and fcp-luns methods which are -responsible to get WWPNs and LUNs for fibre channel devices. - -Those methods are specially necessary if the boot directory and grub -installation are in different FCP disks, allowing the dev_iterate() -to find the WWPNs and LUNs when called by searchfs.uuid tool. ---- - grub-core/disk/ieee1275/ofdisk.c | 117 ++++++++++++++++++++++++++++++++++++++- - 1 file changed, 116 insertions(+), 1 deletion(-) - -diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c -index 235c0fe..eb907c3 100644 ---- a/grub-core/disk/ieee1275/ofdisk.c -+++ b/grub-core/disk/ieee1275/ofdisk.c -@@ -209,7 +209,122 @@ dev_iterate_real (const char *name, const char *path) - static void - dev_iterate (const struct grub_ieee1275_devalias *alias) - { -- if (grub_strcmp (alias->type, "vscsi") == 0) -+ if (grub_strcmp (alias->type, "fcp") == 0) -+ { -+ -+ /* If we are dealing with fcp devices, we need -+ * to find the WWPNs and LUNs to iterate them */ -+ grub_ieee1275_ihandle_t ihandle; -+ grub_uint64_t *ptr_targets, *ptr_luns, k, l; -+ unsigned int i, j, pos; -+ char *buf, *bufptr; -+ -+ struct set_fcp_targets_args -+ { -+ struct grub_ieee1275_common_hdr common; -+ grub_ieee1275_cell_t method; -+ grub_ieee1275_cell_t ihandle; -+ grub_ieee1275_cell_t catch_result; -+ grub_ieee1275_cell_t nentries; -+ grub_ieee1275_cell_t table; -+ } args_targets; -+ -+ struct set_fcp_luns_args -+ { -+ struct grub_ieee1275_common_hdr common; -+ grub_ieee1275_cell_t method; -+ grub_ieee1275_cell_t ihandle; -+ grub_ieee1275_cell_t wwpn_h; -+ grub_ieee1275_cell_t wwpn_l; -+ grub_ieee1275_cell_t catch_result; -+ grub_ieee1275_cell_t nentries; -+ grub_ieee1275_cell_t table; -+ } args_luns; -+ -+ struct args_ret -+ { -+ grub_uint64_t addr; -+ grub_uint64_t len; -+ }; -+ -+ if(grub_ieee1275_open (alias->path, &ihandle)) -+ { -+ grub_dprintf("disk", "failed to open the disk while iterating FCP disk path=%s\n", alias->path); -+ return; -+ } -+ -+ /* Setup the fcp-targets method to call via pfw*/ -+ INIT_IEEE1275_COMMON (&args_targets.common, "call-method", 2, 3); -+ args_targets.method = (grub_ieee1275_cell_t) "fcp-targets"; -+ args_targets.ihandle = ihandle; -+ -+ /* Setup the fcp-luns method to call via pfw */ -+ INIT_IEEE1275_COMMON (&args_luns.common, "call-method", 4, 3); -+ args_luns.method = (grub_ieee1275_cell_t) "fcp-luns"; -+ args_luns.ihandle = ihandle; -+ -+ if (IEEE1275_CALL_ENTRY_FN (&args_targets) == -1) -+ { -+ grub_dprintf("disk", "failed to get the targets while iterating FCP disk path=%s\n", alias->path); -+ grub_ieee1275_close(ihandle); -+ return; -+ } -+ -+ buf = grub_malloc (grub_strlen (alias->path) + 32 + 32); -+ -+ if (!buf) -+ { -+ grub_ieee1275_close(ihandle); -+ return; -+ } -+ -+ bufptr = grub_stpcpy (buf, alias->path); -+ -+ /* Iterate over entries returned by pfw. Each entry contains a -+ * pointer to wwpn table and his length. */ -+ struct args_ret *targets_table = (struct args_ret *)(args_targets.table); -+ for (i=0; i< args_targets.nentries; i++) -+ { -+ ptr_targets = (grub_uint64_t*)(grub_uint32_t) targets_table[i].addr; -+ /* Iterate over all wwpns in given table */ -+ for(k=0;k> 32); -+ pos=grub_snprintf (bufptr, 32, "/disk@%" PRIxGRUB_UINT64_T, -+ *ptr_targets++); -+ /* Get the luns for given wwpn target */ -+ if (IEEE1275_CALL_ENTRY_FN (&args_luns) == -1) -+ { -+ grub_dprintf("disk", "failed to get the LUNS while iterating FCP disk path=%s\n", buf); -+ grub_ieee1275_close (ihandle); -+ grub_free (buf); -+ return; -+ } -+ -+ struct args_ret *luns_table = (struct args_ret *)(args_luns.table); -+ -+ /* Iterate over all LUNs */ -+ for(j=0;jtype, "vscsi") == 0) - { - static grub_ieee1275_ihandle_t ihandle; - struct set_color_args --- -2.16.4 - diff --git a/grub2.changes b/grub2.changes index 532d0f5..344c544 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Thu Jul 18 09:54:14 UTC 2019 - mchang@suse.com + +- Revert grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch until merged by + upstream (bsc#1134287, bsc#1139345, LTC#177836, LTC#174229). + ------------------------------------------------------------------- Mon Jun 24 17:56:12 UTC 2019 - Michal Suchanek diff --git a/grub2.spec b/grub2.spec index 203ffdc..f0bd007 100644 --- a/grub2.spec +++ b/grub2.spec @@ -267,7 +267,6 @@ 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 -Patch217: grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.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 @@ -581,7 +580,6 @@ swap partition while in resuming %patch213 -p1 %patch215 -p1 %patch216 -p1 -%patch217 -p1 %patch218 -p1 %patch233 -p1 %patch234 -p1 From 803003ed0d970241f6f9d08b2af45544890ce0deb44c984ee9407d62ccdad475 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Mon, 23 Sep 2019 10:00:21 +0000 Subject: [PATCH 55/57] Accepting request 730301 from Base:System OBS-URL: https://build.opensuse.org/request/show/730301 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=209 --- grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch | 12 ++++++------ grub2.changes | 6 ++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch b/grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch index 5cbe066..7f0febd 100644 --- a/grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch +++ b/grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch @@ -1,8 +1,8 @@ -Index: grub-2.02~beta2/util/setup.c +Index: grub-2.02/util/setup.c =================================================================== ---- grub-2.02~beta2.orig/util/setup.c -+++ grub-2.02~beta2/util/setup.c -@@ -501,8 +501,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, §ors); else if (ctx.dest_partmap) @@ -12,7 +12,7 @@ Index: grub-2.02~beta2/util/setup.c + err = ctx.dest_partmap->embed (dest_dev->disk, &nsec, maxsec, + GRUB_EMBED_PCBIOS, §ors); +#ifdef GRUB_SETUP_BIOS -+ if (err == GRUB_ERR_OUT_OF_RANGE ++ if ((err == GRUB_ERR_OUT_OF_RANGE || err == GRUB_ERR_FILE_NOT_FOUND) + && dest_dev->disk->id == root_dev->disk->id + && dest_dev->disk->dev->id == root_dev->disk->dev->id) + { @@ -47,7 +47,7 @@ Index: grub-2.02~beta2/util/setup.c else err = fs->embed (dest_dev, &nsec, maxsec, GRUB_EMBED_PCBIOS, §ors); -@@ -584,7 +618,7 @@ SETUP (const char *dir, +@@ -594,7 +628,7 @@ SETUP (const char *dir, /* Write the core image onto the disk. */ for (i = 0; i < nsec; i++) diff --git a/grub2.changes b/grub2.changes index 344c544..e15ff15 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Fri Aug 16 04:51:16 UTC 2019 - Michael Chang + +- Fix fallback embed doesn't work when no post mbr gap at all (boo#1142229) + * Refresh grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch + ------------------------------------------------------------------- Thu Jul 18 09:54:14 UTC 2019 - mchang@suse.com From e5c6623c1401d7aa197e08416129ac521db33f3a3cff4e72a3fb5f623074ce0c Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Mon, 21 Oct 2019 10:26:22 +0000 Subject: [PATCH 56/57] Accepting request 741040 from Base:System OBS-URL: https://build.opensuse.org/request/show/741040 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=210 --- ...n-GRUB2-accesses-non-enabled-MMIO-da.patch | 46 - ...ix-packed-not-aligned-error-on-GCC-8.patch | 67 -- ...d-support-for-UEFI-network-protocols.patch | 330 ++------ ...sable-gcc9-Waddress-of-packed-member.patch | 75 -- ...lid-character-recongition-in-strto-l.patch | 37 - ...nitialize-structs-in-bootpath-parser.patch | 36 - 0001-tpm-Core-TPM-support.patch | 785 ------------------ ...lt-tsc-calibration-method-to-pmtimer.patch | 29 - ...Accept-filesystem-with-sparse-inodes.patch | 57 -- 0002-Add-Virtual-LAN-support.patch | 360 -------- ...sable-gcc9-Waddress-of-packed-member.patch | 55 -- 0002-tpm-Measure-kernel-initrd.patch | 39 - 0003-bootp-New-net_bootp6-command.patch | 65 +- ...gcc9-error-Waddress-of-packed-member.patch | 37 - 0003-tpm-Add-BIOS-boot-measurement.patch | 179 ---- ...-error-with-Waddress-of-packed-membe.patch | 148 ---- 0004-tpm-Rework-linux-command.patch | 104 --- ...gcc9-error-Waddress-of-packed-member.patch | 52 -- 0005-tpm-Rework-linux16-command.patch | 101 --- ...essing-DHCPACK-packet-from-HTTP-Boot.patch | 106 +-- ...re-kernel-and-initrd-on-BIOS-systems.patch | 84 -- ...sable-gcc9-Waddress-of-packed-member.patch | 51 -- ...gcc9-error-Waddress-of-packed-member.patch | 64 -- 0007-tpm-Measure-the-kernel-commandline.patch | 43 - ...gcc9-error-Waddress-of-packed-member.patch | 83 -- ...etting-DNS-server-from-UEFI-protocol.patch | 31 +- 0008-tpm-Measure-commands.patch | 60 -- ...Measure-multiboot-images-and-modules.patch | 73 -- 0010-tpm-Fix-boot-when-there-s-no-TPM.patch | 29 - 0011-tpm-Fix-build-error.patch | 74 -- 0012-tpm-Build-tpm-as-module.patch | 463 +---------- 0013-tpm-i386-pc-diskboot-img.patch | 148 ---- grub-2.02.tar.xz | 3 - grub-2.04.tar.xz | 3 + grub2-Fix-incorrect-netmask-on-ppc64.patch | 15 +- grub2-accept-empty-module.patch | 22 - grub2-binutils2.31.patch | 74 -- ...-add-ability-to-boot-from-subvolumes.patch | 46 +- grub2-btrfs-09-get-default-subvolume.patch | 14 +- ...mands-introduce-read_file-subcommand.patch | 24 +- grub2-efi-Free-malloc-regions-on-exit.patch | 186 ----- grub2-efi-HP-workaround.patch | 16 +- grub2-efi-Move-grub_reboot-into-kernel.patch | 122 --- grub2-efi-chainloader-root.patch | 10 +- grub2-emu-4-all.patch | 62 +- grub2-fix-build-with-flex-2.6.4.patch | 24 - ...ale-en.mo.gz-not-found-error-message.patch | 37 - grub2-freetype-pkgconfig.patch | 165 ---- grub2-linux.patch | 22 +- grub2-move-initrd-upper.patch | 33 - grub2-msdos-fix-overflow.patch | 46 - grub2-pass-corret-root-for-nfsroot.patch | 54 +- grub2-ppc64-cas-fix-double-free.patch | 29 +- grub2-ppc64-cas-reboot-support.patch | 42 +- grub2-ppc64le-disable-video.patch | 26 +- grub2-ppc64le-memory-map.patch | 24 +- ...-files-added-in-order-to-allow-s390x.patch | 80 +- ...2-s390x-02-kexec-module-added-to-emu.patch | 78 +- grub2-s390x-04-grub2-install.patch | 182 ++-- grub2-secureboot-add-linuxefi.patch | 112 +-- grub2-secureboot-chainloader.patch | 26 +- grub2-secureboot-install-signed-grub.patch | 21 +- grub2-secureboot-no-insmod-on-sb.patch | 26 +- ...2-secureboot-provide-linuxefi-config.patch | 26 +- grub2-secureboot-use-linuxefi-on-uefi.patch | 16 +- ...up-try-fs-embed-if-mbr-gap-too-small.patch | 23 +- grub2.changes | 91 +- grub2.spec | 112 +-- translations-20170427.tar.xz | 3 - ...oid-atexit-handlers-when-child-exits.patch | 70 -- use-grub2-as-a-package-name.patch | 10 +- 71 files changed, 791 insertions(+), 5095 deletions(-) delete mode 100644 0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch delete mode 100644 0001-Fix-packed-not-aligned-error-on-GCC-8.patch delete mode 100644 0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch delete mode 100644 0001-misc-fix-invalid-character-recongition-in-strto-l.patch delete mode 100644 0001-ofnet-Initialize-structs-in-bootpath-parser.patch delete mode 100644 0001-tpm-Core-TPM-support.patch delete mode 100644 0001-tsc-Change-default-tsc-calibration-method-to-pmtimer.patch delete mode 100644 0001-xfs-Accept-filesystem-with-sparse-inodes.patch delete mode 100644 0002-Add-Virtual-LAN-support.patch delete mode 100644 0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch delete mode 100644 0002-tpm-Measure-kernel-initrd.patch delete mode 100644 0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch delete mode 100644 0003-tpm-Add-BIOS-boot-measurement.patch delete mode 100644 0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch delete mode 100644 0004-tpm-Rework-linux-command.patch delete mode 100644 0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch delete mode 100644 0005-tpm-Rework-linux16-command.patch delete mode 100644 0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch delete mode 100644 0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch delete mode 100644 0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch delete mode 100644 0007-tpm-Measure-the-kernel-commandline.patch delete mode 100644 0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch delete mode 100644 0008-tpm-Measure-commands.patch delete mode 100644 0009-tpm-Measure-multiboot-images-and-modules.patch delete mode 100644 0010-tpm-Fix-boot-when-there-s-no-TPM.patch delete mode 100644 0011-tpm-Fix-build-error.patch delete mode 100644 0013-tpm-i386-pc-diskboot-img.patch delete mode 100644 grub-2.02.tar.xz create mode 100644 grub-2.04.tar.xz delete mode 100644 grub2-accept-empty-module.patch delete mode 100644 grub2-binutils2.31.patch delete mode 100644 grub2-efi-Free-malloc-regions-on-exit.patch delete mode 100644 grub2-efi-Move-grub_reboot-into-kernel.patch delete mode 100644 grub2-fix-build-with-flex-2.6.4.patch delete mode 100644 grub2-fix-locale-en.mo.gz-not-found-error-message.patch delete mode 100644 grub2-freetype-pkgconfig.patch delete mode 100644 grub2-move-initrd-upper.patch delete mode 100644 grub2-msdos-fix-overflow.patch delete mode 100644 translations-20170427.tar.xz delete mode 100644 unix-exec-avoid-atexit-handlers-when-child-exits.patch diff --git a/0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch b/0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch deleted file mode 100644 index fe17577..0000000 --- a/0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 2f06e09673e48f6a91486a8ad38f45c160d537fe Mon Sep 17 00:00:00 2001 -From: "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 ---- - 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 - diff --git a/0001-Fix-packed-not-aligned-error-on-GCC-8.patch b/0001-Fix-packed-not-aligned-error-on-GCC-8.patch deleted file mode 100644 index 73efa00..0000000 --- a/0001-Fix-packed-not-aligned-error-on-GCC-8.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 721f75ff7de467717658d2de9c20bbb18145790a Mon Sep 17 00:00:00 2001 -From: Michael Chang -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 -Tested-by: Michael Chang ---- - 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 - diff --git a/0001-add-support-for-UEFI-network-protocols.patch b/0001-add-support-for-UEFI-network-protocols.patch index 0e31f3f..7e3344a 100644 --- a/0001-add-support-for-UEFI-network-protocols.patch +++ b/0001-add-support-for-UEFI-network-protocols.patch @@ -23,6 +23,10 @@ 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 +- @@ -53,30 +57,19 @@ V3: create mode 100644 include/grub/efi/http.h create mode 100644 include/grub/net/efi.h -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 = { - }; - +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 = 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 = { + name = linuxefi; + efi = loader/i386/efi/linux.c; +- efi = lib/cmdline.c; + enable = i386_efi; + enable = x86_64_efi; + }; +@@ -2283,6 +2282,12 @@ module = { common = net/ethernet.c; common = net/arp.c; common = net/netbuff.c; @@ -89,11 +82,11 @@ index a65c27f7f..e93c77255 100644 }; module = { -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) +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 return res; /* Need to read some more. */ @@ -102,11 +95,11 @@ index 22438277d..d0b0f71b6 100644 /* Now read between file->offset + res and bufio->buffer_at. */ if (file->offset + res < next_buf) { -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) +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 { grub_efi_ipv4_device_path_t *ipv4 = (grub_efi_ipv4_device_path_t *) dp; @@ -115,7 +108,7 @@ index d467785fc..0ceaa487c 100644 (unsigned) ipv4->local_ip_address[0], (unsigned) ipv4->local_ip_address[1], (unsigned) ipv4->local_ip_address[2], -@@ -685,33 +685,60 @@ grub_efi_print_device_path (grub_efi_device_path_t *dp) +@@ -735,33 +735,60 @@ grub_efi_print_device_path (grub_efi_dev (unsigned) ipv4->remote_port, (unsigned) ipv4->protocol, (unsigned) ipv4->static_ip_address); @@ -193,7 +186,7 @@ index d467785fc..0ceaa487c 100644 } break; case GRUB_EFI_INFINIBAND_DEVICE_PATH_SUBTYPE: -@@ -751,6 +778,39 @@ grub_efi_print_device_path (grub_efi_device_path_t *dp) +@@ -801,6 +828,39 @@ grub_efi_print_device_path (grub_efi_dev dump_vendor_path ("Messaging", (grub_efi_vendor_device_path_t *) dp); break; @@ -233,10 +226,10 @@ index d467785fc..0ceaa487c 100644 default: grub_printf ("/UnknownMessaging(%x)", (unsigned) subtype); break; -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 +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 @@ -24,6 +24,7 @@ #include #include @@ -245,7 +238,7 @@ index 82a28fb6e..f189209ba 100644 GRUB_MOD_LICENSE ("GPLv3+"); -@@ -481,6 +482,17 @@ grub_efinet_create_dhcp_ack_from_device_path (grub_efi_device_path_t *dp, int *u +@@ -481,6 +482,17 @@ grub_efinet_create_dhcp_ack_from_device_ ldp = grub_efi_find_last_device_path (ddp); @@ -263,7 +256,7 @@ index 82a28fb6e..f189209ba 100644 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_handle_t hnd, char **device, +@@ -744,6 +756,7 @@ grub_efi_net_config_real (grub_efi_handl 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 @@ -271,7 +264,7 @@ index 82a28fb6e..f189209ba 100644 && 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_handle_t hnd, char **device, +@@ -759,6 +772,15 @@ grub_efi_net_config_real (grub_efi_handl } dup_ldp = grub_efi_find_last_device_path (dup_dp); @@ -287,7 +280,7 @@ index 82a28fb6e..f189209ba 100644 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_handle_t hnd, char **device, +@@ -816,6 +838,9 @@ grub_efi_net_config_real (grub_efi_handl GRUB_MOD_INIT(efinet) { @@ -305,11 +298,10 @@ index 82a28fb6e..f189209ba 100644 + grub_efi_net_config = NULL; } -diff --git a/grub-core/net/efi/dhcp.c b/grub-core/net/efi/dhcp.c -new file mode 100644 -index 000000000..dbef63d8c +Index: grub-2.04~rc1/grub-core/net/efi/dhcp.c +=================================================================== --- /dev/null -+++ b/grub-core/net/efi/dhcp.c ++++ grub-2.04~rc1/grub-core/net/efi/dhcp.c @@ -0,0 +1,397 @@ +#include +#include @@ -708,74 +700,10 @@ index 000000000..dbef63d8c + +grub_command_func_t grub_efi_net_bootp = grub_cmd_efi_bootp; +grub_command_func_t grub_efi_net_bootp6 = grub_cmd_efi_bootp6; -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 +Index: grub-2.04~rc1/grub-core/net/efi/http.c +=================================================================== --- /dev/null -+++ b/grub-core/net/efi/efi_netfs.c -@@ -0,0 +1,57 @@ -+#include -+#include -+#define EFI_NET_CMD_PREFIX "net_efi" -+#include -+ -+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 ++++ grub-2.04~rc1/grub-core/net/efi/http.c @@ -0,0 +1,419 @@ + +#include @@ -1196,11 +1124,10 @@ index 000000000..3f61fd2fa + .read = grub_efihttp_read, + .close = grub_efihttp_close + }; -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 +Index: grub-2.04~rc1/grub-core/net/efi/ip4_config.c +=================================================================== --- /dev/null -+++ b/grub-core/net/efi/ip4_config.c ++++ grub-2.04~rc1/grub-core/net/efi/ip4_config.c @@ -0,0 +1,398 @@ + +#include @@ -1600,11 +1527,10 @@ index 000000000..b711a5d94 + .set_gateway = grub_efi_ip4_interface_set_gateway, + .set_dns = grub_efi_ip4_interface_set_dns + }; -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 +Index: grub-2.04~rc1/grub-core/net/efi/ip6_config.c +=================================================================== --- /dev/null -+++ b/grub-core/net/efi/ip6_config.c ++++ grub-2.04~rc1/grub-core/net/efi/ip6_config.c @@ -0,0 +1,422 @@ +#include +#include @@ -2028,11 +1954,10 @@ index 000000000..017c4d05b + .set_gateway = grub_efi_ip6_interface_set_gateway, + .set_dns = grub_efi_ip6_interface_set_dns + }; -diff --git a/grub-core/net/efi/net.c b/grub-core/net/efi/net.c -new file mode 100644 -index 000000000..0bac343b4 +Index: grub-2.04~rc1/grub-core/net/efi/net.c +=================================================================== --- /dev/null -+++ b/grub-core/net/efi/net.c ++++ grub-2.04~rc1/grub-core/net/efi/net.c @@ -0,0 +1,1428 @@ +#include +#include @@ -3327,13 +3252,13 @@ index 000000000..0bac343b4 +static struct grub_fs grub_efi_netfs = + { + .name = "efi netfs", -+ .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, ++ .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, + }; + +int @@ -3462,11 +3387,10 @@ index 000000000..0bac343b4 + grub_net_open = NULL; + grub_fs_unregister (&grub_efi_netfs); +} -diff --git a/grub-core/net/efi/pxe.c b/grub-core/net/efi/pxe.c -new file mode 100644 -index 000000000..4b6b48cb1 +Index: grub-2.04~rc1/grub-core/net/efi/pxe.c +=================================================================== --- /dev/null -+++ b/grub-core/net/efi/pxe.c ++++ grub-2.04~rc1/grub-core/net/efi/pxe.c @@ -0,0 +1,424 @@ + +#include @@ -3892,10 +3816,10 @@ index 000000000..4b6b48cb1 + .close = pxe_close + }; + -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 +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 @@ -32,6 +32,9 @@ #include #include @@ -3906,7 +3830,7 @@ index 5cc0d2f3b..02bbe956b 100644 GRUB_MOD_LICENSE ("GPLv3+"); -@@ -1817,8 +1820,49 @@ static grub_command_t cmd_addaddr, cmd_deladdr, cmd_addroute, cmd_delroute; +@@ -1817,8 +1820,49 @@ static grub_command_t cmd_addaddr, cmd_d static grub_command_t cmd_lsroutes, cmd_lscards; static grub_command_t cmd_lsaddr, cmd_slaac; @@ -4002,11 +3926,11 @@ index 5cc0d2f3b..02bbe956b 100644 + init_mode = INIT_MODE_NONE; +#endif } -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]; +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 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; @@ -4079,7 +4003,7 @@ index 99ba068e3..cfedd7895 100644 struct grub_efi_open_protocol_information_entry { grub_efi_handle_t agent_handle; -@@ -1473,23 +1518,28 @@ typedef struct grub_efi_simple_text_output_interface grub_efi_simple_text_output +@@ -1473,23 +1518,28 @@ typedef struct grub_efi_simple_text_outp typedef grub_uint8_t grub_efi_pxe_packet_t[1472]; @@ -4251,13 +4175,12 @@ index 99ba068e3..cfedd7895 100644 +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__) - -diff --git a/include/grub/efi/dhcp.h b/include/grub/efi/dhcp.h -new file mode 100644 -index 000000000..fdb88eb81 + || defined (__aarch64__) || defined (__MINGW64__) || defined (__CYGWIN__) \ + || defined(__riscv) +Index: grub-2.04~rc1/include/grub/efi/dhcp.h +=================================================================== --- /dev/null -+++ b/include/grub/efi/dhcp.h ++++ grub-2.04~rc1/include/grub/efi/dhcp.h @@ -0,0 +1,343 @@ +#ifndef GRUB_EFI_DHCP_HEADER +#define GRUB_EFI_DHCP_HEADER 1 @@ -4602,11 +4525,10 @@ index 000000000..fdb88eb81 +}; + +#endif /* ! GRUB_EFI_DHCP_HEADER */ -diff --git a/include/grub/efi/http.h b/include/grub/efi/http.h -new file mode 100644 -index 000000000..c5e9a89f5 +Index: grub-2.04~rc1/include/grub/efi/http.h +=================================================================== --- /dev/null -+++ b/include/grub/efi/http.h ++++ grub-2.04~rc1/include/grub/efi/http.h @@ -0,0 +1,215 @@ +/* + * GRUB -- GRand Unified Bootloader @@ -4823,11 +4745,10 @@ index 000000000..c5e9a89f5 +typedef struct grub_efi_http grub_efi_http_t; + +#endif /* !GRUB_EFI_HTTP_HEADER */ -diff --git a/include/grub/net/efi.h b/include/grub/net/efi.h -new file mode 100644 -index 000000000..de90d223e +Index: grub-2.04~rc1/include/grub/net/efi.h +=================================================================== --- /dev/null -+++ b/include/grub/net/efi.h ++++ grub-2.04~rc1/include/grub/net/efi.h @@ -0,0 +1,144 @@ +#ifndef GRUB_NET_EFI_HEADER +#define GRUB_NET_EFI_HEADER 1 @@ -4973,88 +4894,3 @@ index 000000000..de90d223e +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 - diff --git a/0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch b/0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch deleted file mode 100644 index 15b5321..0000000 --- a/0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 7ea474c68847757d4c67ffc67f7d714b77c41578 Mon Sep 17 00:00:00 2001 -From: Michael Chang -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 -Reviewed-by: Daniel Kiper ---- - 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 - diff --git a/0001-misc-fix-invalid-character-recongition-in-strto-l.patch b/0001-misc-fix-invalid-character-recongition-in-strto-l.patch deleted file mode 100644 index a54e3d3..0000000 --- a/0001-misc-fix-invalid-character-recongition-in-strto-l.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 0155e49166494624e9fb6ef113ed2c16d4accbb3 Mon Sep 17 00:00:00 2001 -From: Michael Chang -Date: Fri, 29 Jul 2016 17:41:27 +0800 -Subject: [PATCH 1/8] misc: fix invalid character recongition in strto*l - -From: Aaron Miller - -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 - diff --git a/0001-ofnet-Initialize-structs-in-bootpath-parser.patch b/0001-ofnet-Initialize-structs-in-bootpath-parser.patch deleted file mode 100644 index e815b26..0000000 --- a/0001-ofnet-Initialize-structs-in-bootpath-parser.patch +++ /dev/null @@ -1,36 +0,0 @@ -From ddd47864e98cb32a718075bab4462dc56919ec6c Mon Sep 17 00:00:00 2001 -From: Julian Andres Klode -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 ---- - 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; diff --git a/0001-tpm-Core-TPM-support.patch b/0001-tpm-Core-TPM-support.patch deleted file mode 100644 index 103b6cf..0000000 --- a/0001-tpm-Core-TPM-support.patch +++ /dev/null @@ -1,785 +0,0 @@ -From 866eb2103187d84f2e02c262cfdd1a388acfec15 Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - #include - #include -+#include - - /* 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 -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+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 -+#include -+#include -+#include -+#include -+#include -+ -+#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, ®s); -+ -+ 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, ®s); -+ -+ 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, ®s); -+ -+ 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 -+#include -+#include -+#include -+#include -+#include -+ -+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 . -+ */ -+ -+#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 . -+ */ -+ -+#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 diff --git a/0001-tsc-Change-default-tsc-calibration-method-to-pmtimer.patch b/0001-tsc-Change-default-tsc-calibration-method-to-pmtimer.patch deleted file mode 100644 index 4180f5f..0000000 --- a/0001-tsc-Change-default-tsc-calibration-method-to-pmtimer.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 446794de8da4329ea532cbee4ca877bcafd0e534 Mon Sep 17 00:00:00 2001 -From: "David E. Box" -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 -Reviewed-by: Daniel Kiper ---- - 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 diff --git a/0001-xfs-Accept-filesystem-with-sparse-inodes.patch b/0001-xfs-Accept-filesystem-with-sparse-inodes.patch deleted file mode 100644 index a28b11a..0000000 --- a/0001-xfs-Accept-filesystem-with-sparse-inodes.patch +++ /dev/null @@ -1,57 +0,0 @@ -From cda0a857dd7a27cd5d621747464bfe71e8727fff Mon Sep 17 00:00:00 2001 -From: Daniel Kiper -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 -Reviewed-by: Daniel Kiper -Tested-by: Chris Murphy ---- - 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 diff --git a/0002-Add-Virtual-LAN-support.patch b/0002-Add-Virtual-LAN-support.patch deleted file mode 100644 index 541f2ee..0000000 --- a/0002-Add-Virtual-LAN-support.patch +++ /dev/null @@ -1,360 +0,0 @@ -From d17c80ca8de35f8cb06175965d428bdabbda3c19 Mon Sep 17 00:00:00 2001 -From: Paulo Flabiano Smorigo -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 - #include -+#include - #include - #include - #include -@@ -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 - - 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, diff --git a/0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch b/0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch deleted file mode 100644 index ed3a280..0000000 --- a/0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 4f4128defdec0958f7a38736e2c9be2368a5a6da Mon Sep 17 00:00:00 2001 -From: Michael Chang -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 -Reviewed-by: Daniel Kiper ---- - 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 - diff --git a/0002-tpm-Measure-kernel-initrd.patch b/0002-tpm-Measure-kernel-initrd.patch deleted file mode 100644 index c865b07..0000000 --- a/0002-tpm-Measure-kernel-initrd.patch +++ /dev/null @@ -1,39 +0,0 @@ -From b3afe6ad07192d3f38875e30b57a785ac3b1ea27 Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - #include - #include -+#include - - 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]); diff --git a/0003-bootp-New-net_bootp6-command.patch b/0003-bootp-New-net_bootp6-command.patch index 79edd45..35cede2 100644 --- a/0003-bootp-New-net_bootp6-command.patch +++ b/0003-bootp-New-net_bootp6-command.patch @@ -14,10 +14,10 @@ Signed-off-by: Ken Lin include/grub/net.h | 72 ++++ 3 files changed, 1018 insertions(+), 1 deletion(-) -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 +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 @@ -24,6 +24,98 @@ #include #include @@ -115,10 +115,10 @@ index 189551a..81173b4 100644 + return 1; +} - 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; + struct grub_dhcp_discover_options + { +@@ -563,6 +655,578 @@ out: + return err; } +/* The default netbuff size for sending DHCPv6 packets which should be @@ -693,10 +693,10 @@ index 189551a..81173b4 100644 + return inf; +} + - 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, + /* + * 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 } } @@ -774,11 +774,11 @@ index 189551a..81173b4 100644 static char hexdigit (grub_uint8_t val) { -@@ -578,7 +1313,174 @@ grub_cmd_bootp (struct grub_command *cmd __attribute__ ((unused)), +@@ -864,7 +1599,174 @@ grub_cmd_bootp (struct grub_command *cmd return err; } --static grub_command_t cmd_getdhcp, cmd_bootp; +-static grub_command_t cmd_getdhcp, cmd_bootp, cmd_dhcp; +static grub_err_t +grub_cmd_bootp6 (struct grub_command *cmd __attribute__ ((unused)), + int argc, char **args) @@ -946,11 +946,11 @@ index 189551a..81173b4 100644 + return err; +} + -+static grub_command_t cmd_getdhcp, cmd_bootp, cmd_bootp6; ++static grub_command_t cmd_getdhcp, cmd_bootp, cmd_dhcp, cmd_bootp6; void grub_bootp_init (void) -@@ -589,6 +1491,9 @@ grub_bootp_init (void) +@@ -878,6 +1780,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 189551a..81173b4 100644 } void -@@ -596,4 +1501,5 @@ grub_bootp_fini (void) - { +@@ -886,4 +1791,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); } -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, +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, { struct udphdr *udph; udph = (struct udphdr *) nb->data; @@ -1016,11 +1016,11 @@ index 8c56baa..2a239b5 100644 if (proto == GRUB_NET_IP_UDP && grub_be_to_cpu16 (udph->dst) == 68) { const struct grub_net_bootp_packet *bootp; -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 +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 grub_uint8_t vendor[0]; } GRUB_PACKED; @@ -1087,7 +1087,7 @@ index ccc169c..38a3973 100644 #define GRUB_NET_BOOTP_RFC1048_MAGIC_0 0x63 #define GRUB_NET_BOOTP_RFC1048_MAGIC_1 0x82 #define GRUB_NET_BOOTP_RFC1048_MAGIC_2 0x53 -@@ -468,6 +528,14 @@ grub_net_configure_by_dhcp_ack (const char *name, +@@ -481,6 +541,14 @@ grub_net_configure_by_dhcp_ack (const ch grub_size_t size, int is_def, char **device, char **path); @@ -1102,9 +1102,9 @@ index ccc169c..38a3973 100644 grub_err_t grub_net_add_ipv4_local (struct grub_net_network_level_interface *inf, int mask); -@@ -476,6 +544,10 @@ void +@@ -489,6 +557,10 @@ void grub_net_process_dhcp (struct grub_net_buff *nb, - struct grub_net_card *card); + struct grub_net_network_level_interface *iface); +grub_err_t +grub_net_process_dhcp6 (struct grub_net_buff *nb, @@ -1113,6 +1113,3 @@ index ccc169c..38a3973 100644 int grub_net_hwaddr_cmp (const grub_net_link_level_address_t *a, const grub_net_link_level_address_t *b); --- -2.6.6 - diff --git a/0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch b/0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch deleted file mode 100644 index 8b5753c..0000000 --- a/0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 0e49748fad8e036d9875785e57c577214e699941 Mon Sep 17 00:00:00 2001 -From: Michael Chang -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 -Reviewed-by: Daniel Kiper ---- - 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 - diff --git a/0003-tpm-Add-BIOS-boot-measurement.patch b/0003-tpm-Add-BIOS-boot-measurement.patch deleted file mode 100644 index 21ce113..0000000 --- a/0003-tpm-Add-BIOS-boot-measurement.patch +++ /dev/null @@ -1,179 +0,0 @@ -From e12373683b894f22c2e35dc3732440a4e9053d61 Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - #include - -+#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 - diff --git a/0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch b/0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch deleted file mode 100644 index cce9e47..0000000 --- a/0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch +++ /dev/null @@ -1,148 +0,0 @@ -From 621024090b7729c8c698c8ab916d792846d20818 Mon Sep 17 00:00:00 2001 -From: Michael Chang -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 -Reviewed-by: Daniel Kiper ---- - 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 - diff --git a/0004-tpm-Rework-linux-command.patch b/0004-tpm-Rework-linux-command.patch deleted file mode 100644 index e36626e..0000000 --- a/0004-tpm-Rework-linux-command.patch +++ /dev/null @@ -1,104 +0,0 @@ -From 9f12cf163e56d3b5f03c8a5da94dc501032312eb Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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); - diff --git a/0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch b/0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch deleted file mode 100644 index 9d3a6ca..0000000 --- a/0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 0b1bf3932f1b1700d3c8a997e4850fb9a013569d Mon Sep 17 00:00:00 2001 -From: Michael Chang -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 -Reviewed-by: Daniel Kiper ---- - 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 - diff --git a/0005-tpm-Rework-linux16-command.patch b/0005-tpm-Rework-linux16-command.patch deleted file mode 100644 index d97a195..0000000 --- a/0005-tpm-Rework-linux16-command.patch +++ /dev/null @@ -1,101 +0,0 @@ -From f8f66cdcb66dba05353887b3be0d715d54efdea8 Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - diff --git a/0006-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch b/0006-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch index fd0d536..a252ba4 100644 --- a/0006-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch +++ b/0006-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch @@ -21,32 +21,23 @@ Signed-off-by: Ken Lin include/grub/net.h | 1 + 2 files changed, 66 insertions(+), 2 deletions(-) -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 +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; ++ /* FIXME: Introduce new http flag for better synergy with existing tftp code base */ + if (size > OFFSET_OF (vendor, bp)) + { + char *cidvar; + const char *cid; + -+ parse_dhcp_vendor (name, &bp->vendor, size - OFFSET_OF (vendor, bp), &mask); ++ 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); + cidvar = grub_xasprintf ("net_%s_%s", name, "vendor_class_identifier"); + cid = grub_env_get (cidvar); + grub_free (cidvar); @@ -55,10 +46,12 @@ index 81173b4..04f9f3d 100644 + { + 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); @@ -70,61 +63,40 @@ index 81173b4..04f9f3d 100644 + *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); -+ grub_free (pa); -+ return inter; ++ ++ /* FIXME: NEED TO FREE boot_file */ ++ goto boot_file; + } + } + - 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; + 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 (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 + ++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 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_BOOTP_END = 0xff - }; - --- -2.6.6 - + GRUB_NET_DHCP_REQUESTED_IP_ADDRESS = 50, + GRUB_NET_DHCP_OVERLOAD = 52, + GRUB_NET_DHCP_MESSAGE_TYPE = 53, diff --git a/0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch b/0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch deleted file mode 100644 index 9148a83..0000000 --- a/0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch +++ /dev/null @@ -1,84 +0,0 @@ -From f0b411214ccc309f2f126d558e2777469d538ca2 Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - #include - #include -+#include - - 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 - #include - #include -+#include - - 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 - #include - #include -+#include - - 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) diff --git a/0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch b/0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch deleted file mode 100644 index a33cb2f..0000000 --- a/0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 85e08e174e15c497c4387c16e92243e6ed05feb6 Mon Sep 17 00:00:00 2001 -From: Michael Chang -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 -Reviewed-by: Daniel Kiper ---- - 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 - diff --git a/0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch b/0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch deleted file mode 100644 index cd4596c..0000000 --- a/0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 4868e17507dfebf2894079ad6b4876e612706f30 Mon Sep 17 00:00:00 2001 -From: Michael Chang -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 -Reviewed-by: Daniel Kiper ---- - 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 - diff --git a/0007-tpm-Measure-the-kernel-commandline.patch b/0007-tpm-Measure-the-kernel-commandline.patch deleted file mode 100644 index 87e0056..0000000 --- a/0007-tpm-Measure-the-kernel-commandline.patch +++ /dev/null @@ -1,43 +0,0 @@ -From aa88827e5b6ca073d0a67e86c5d6581445de988b Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - #include -+#include - - 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 - diff --git a/0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch b/0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch deleted file mode 100644 index 1304fb3..0000000 --- a/0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch +++ /dev/null @@ -1,83 +0,0 @@ -From 4dd4ceec023111a4ccf69f8de6fa0885c6847a35 Mon Sep 17 00:00:00 2001 -From: Michael Chang -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 -Reviewed-by: Daniel Kiper ---- - 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 - diff --git a/0008-efinet-Setting-DNS-server-from-UEFI-protocol.patch b/0008-efinet-Setting-DNS-server-from-UEFI-protocol.patch index 1818217..f3aebb8 100644 --- a/0008-efinet-Setting-DNS-server-from-UEFI-protocol.patch +++ b/0008-efinet-Setting-DNS-server-from-UEFI-protocol.patch @@ -32,10 +32,10 @@ Signed-off-by: Ken Lin include/grub/efi/api.h | 76 +++++++++++++++++ 2 files changed, 239 insertions(+) -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 +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 @@ -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 2d3b00f..82a28fb 100644 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_path (grub_efi_device_path_t *dp, int *u +@@ -377,6 +498,8 @@ grub_efinet_create_dhcp_ack_from_device_ 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 2d3b00f..82a28fb 100644 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_path (grub_efi_device_path_t *dp, int *u +@@ -438,6 +561,25 @@ grub_efinet_create_dhcp_ack_from_device_ *ptr++ = sizeof ("HTTPClient") - 1; grub_memcpy (ptr, "HTTPClient", sizeof ("HTTPClient") - 1); @@ -206,7 +206,7 @@ index 2d3b00f..82a28fb 100644 ptr = nb->tail; err = grub_netbuff_put (nb, 1); if (err) -@@ -470,6 +612,8 @@ grub_efinet_create_dhcp_ack_from_device_path (grub_efi_device_path_t *dp, int *u +@@ -470,6 +612,8 @@ grub_efinet_create_dhcp_ack_from_device_ 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 2d3b00f..82a28fb 100644 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_path (grub_efi_device_path_t *dp, int *u +@@ -533,6 +677,25 @@ grub_efinet_create_dhcp_ack_from_device_ opt->len = grub_cpu_to_be16 (uri_len); grub_memcpy (opt->data, uri_dp->uri, uri_len); @@ -241,10 +241,10 @@ index 2d3b00f..82a28fb 100644 *use_ipv6 = 1; } -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 +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 @@ -334,6 +334,16 @@ { 0x8B, 0x8C, 0xE2, 0x1B, 0x01, 0xAE, 0xF2, 0xB7 } \ } @@ -333,8 +333,5 @@ index d5a1256..99ba068 100644 +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__) - --- -2.6.6 - + || defined (__aarch64__) || defined (__MINGW64__) || defined (__CYGWIN__) \ + || defined(__riscv) diff --git a/0008-tpm-Measure-commands.patch b/0008-tpm-Measure-commands.patch deleted file mode 100644 index 607b0b3..0000000 --- a/0008-tpm-Measure-commands.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 959e235378adef1477d14d7546c549b7619eb5f1 Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - #endif -+#include - - /* 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; diff --git a/0009-tpm-Measure-multiboot-images-and-modules.patch b/0009-tpm-Measure-multiboot-images-and-modules.patch deleted file mode 100644 index 293fd0d..0000000 --- a/0009-tpm-Measure-multiboot-images-and-modules.patch +++ /dev/null @@ -1,73 +0,0 @@ -From fd82340829d9fce685f80163ddb6ee3399929c3c Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - #include - #include -+#include - - #ifdef GRUB_MACHINE_EFI - #include -@@ -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 - #include - #include -+#include - - 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 - #include - #include -+#include - - #if defined (GRUB_MACHINE_EFI) - #include -@@ -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) diff --git a/0010-tpm-Fix-boot-when-there-s-no-TPM.patch b/0010-tpm-Fix-boot-when-there-s-no-TPM.patch deleted file mode 100644 index d10fd00..0000000 --- a/0010-tpm-Fix-boot-when-there-s-no-TPM.patch +++ /dev/null @@ -1,29 +0,0 @@ -From c9016d2ae0abc5edcb4dcf4b1ce04f138f6e5a67 Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -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 - diff --git a/0011-tpm-Fix-build-error.patch b/0011-tpm-Fix-build-error.patch deleted file mode 100644 index 41542c9..0000000 --- a/0011-tpm-Fix-build-error.patch +++ /dev/null @@ -1,74 +0,0 @@ -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, diff --git a/0012-tpm-Build-tpm-as-module.patch b/0012-tpm-Build-tpm-as-module.patch index d95d9c3..f1007f9 100644 --- a/0012-tpm-Build-tpm-as-module.patch +++ b/0012-tpm-Build-tpm-as-module.patch @@ -1,442 +1,14 @@ From 54b6ba5f27dd9eb9ec2f1a41e7160964ab94451c Mon Sep 17 00:00:00 2001 From: Michael Chang Date: Wed, 23 Nov 2016 16:52:16 +0800 -Subject: [PATCH 11/11] Build tpm as module +Subject: Build tpm as module -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. +Add --suse-enable-tpm option to grub2-install. -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 +Index: 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 - #include - -+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 - #include - #include -+#include - --#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 - #include - -+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 +--- grub-2.04~rc1.orig/util/grub-install.c ++++ grub-2.04~rc1/util/grub-install.c @@ -80,6 +80,7 @@ static char *label_color; static char *label_bgcolor; static char *product_version; @@ -472,34 +44,13 @@ Index: grub-2.02~rc1/util/grub-install.c {"debug", OPTION_DEBUG, 0, OPTION_HIDDEN, 0, 2}, {"no-floppy", OPTION_NO_FLOPPY, 0, OPTION_HIDDEN, 0, 2}, -@@ -1322,6 +1329,9 @@ main (int argc, char *argv[]) +@@ -1320,6 +1327,9 @@ main (int argc, char *argv[]) else if (disk_module && disk_module[0]) grub_install_push_module (disk_module); -+ if (suse_enable_tpm && (is_efi || platform == GRUB_INSTALL_PLATFORM_I386_PC)) ++ if (suse_enable_tpm && platform == GRUB_INSTALL_PLATFORM_X86_64_EFI) + 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; diff --git a/0013-tpm-i386-pc-diskboot-img.patch b/0013-tpm-i386-pc-diskboot-img.patch deleted file mode 100644 index 473d1bb..0000000 --- a/0013-tpm-i386-pc-diskboot-img.patch +++ /dev/null @@ -1,148 +0,0 @@ -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 - #include - --#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"), diff --git a/grub-2.02.tar.xz b/grub-2.02.tar.xz deleted file mode 100644 index 99e42af..0000000 --- a/grub-2.02.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:810b3798d316394f94096ec2797909dbf23c858e48f7b3830826b8daa06b7b0f -size 6113260 diff --git a/grub-2.04.tar.xz b/grub-2.04.tar.xz new file mode 100644 index 0000000..2ac8876 --- /dev/null +++ b/grub-2.04.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5292496995ad42dabe843a0192cf2a2c502e7ffcc7479398232b10a472df77d +size 6393864 diff --git a/grub2-Fix-incorrect-netmask-on-ppc64.patch b/grub2-Fix-incorrect-netmask-on-ppc64.patch index 3cf4ba6..009e1fb 100644 --- a/grub2-Fix-incorrect-netmask-on-ppc64.patch +++ b/grub2-Fix-incorrect-netmask-on-ppc64.patch @@ -26,15 +26,16 @@ 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(-) -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 @@ - } - +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; 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) diff --git a/grub2-accept-empty-module.patch b/grub2-accept-empty-module.patch deleted file mode 100644 index 302c9b5..0000000 --- a/grub2-accept-empty-module.patch +++ /dev/null @@ -1,22 +0,0 @@ -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"); diff --git a/grub2-binutils2.31.patch b/grub2-binutils2.31.patch deleted file mode 100644 index b11267a..0000000 --- a/grub2-binutils2.31.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 842c390469e2c2e10b5aa36700324cd3bde25875 Mon Sep 17 00:00:00 2001 -From: "H.J. Lu" -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 -Reviewed-by: Daniel Kiper ---- - 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 - - diff --git a/grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch b/grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch index 1de5274..e97077d 100644 --- a/grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch +++ b/grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch @@ -21,21 +21,21 @@ Signed-off-by: Jeff Mahoney grub-core/fs/btrfs.c | 529 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 518 insertions(+), 11 deletions(-) -Index: grub-2.02~beta2/grub-core/fs/btrfs.c +Index: grub-2.04~rc1/grub-core/fs/btrfs.c =================================================================== ---- grub-2.02~beta2.orig/grub-core/fs/btrfs.c -+++ grub-2.02~beta2/grub-core/fs/btrfs.c -@@ -29,6 +29,9 @@ - #include - #include +--- grub-2.04~rc1.orig/grub-core/fs/btrfs.c ++++ grub-2.04~rc1/grub-core/fs/btrfs.c +@@ -40,6 +40,9 @@ #include + #include + #include +#include +#include +#include GRUB_MOD_LICENSE ("GPLv3+"); -@@ -64,9 +67,11 @@ struct grub_btrfs_superblock +@@ -78,9 +81,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.02~beta2/grub-core/fs/btrfs.c struct grub_btrfs_device this_device; char label[0x100]; grub_uint8_t dummy4[0x100]; -@@ -105,6 +110,7 @@ struct grub_btrfs_data +@@ -120,6 +125,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.02~beta2/grub-core/fs/btrfs.c }; struct grub_btrfs_chunk_item -@@ -171,6 +177,14 @@ struct grub_btrfs_leaf_descriptor +@@ -188,6 +194,14 @@ struct grub_btrfs_leaf_descriptor } *data; }; @@ -72,7 +72,7 @@ Index: grub-2.02~beta2/grub-core/fs/btrfs.c struct grub_btrfs_time { grub_int64_t sec; -@@ -215,6 +229,14 @@ struct grub_btrfs_extent_data +@@ -233,6 +247,14 @@ struct grub_btrfs_extent_data #define GRUB_BTRFS_OBJECT_ID_CHUNK 0x100 @@ -87,7 +87,7 @@ Index: grub-2.02~beta2/grub-core/fs/btrfs.c static grub_disk_addr_t superblock_sectors[] = { 64 * 2, 64 * 1024 * 2, 256 * 1048576 * 2, 1048576ULL * 1048576ULL * 2 }; -@@ -830,6 +852,62 @@ grub_btrfs_read_logical (struct grub_btr +@@ -1153,6 +1175,62 @@ grub_btrfs_read_logical (struct grub_btr return GRUB_ERR_NONE; } @@ -150,7 +150,7 @@ Index: grub-2.02~beta2/grub-core/fs/btrfs.c static struct grub_btrfs_data * grub_btrfs_mount (grub_device_t dev) { -@@ -865,6 +943,13 @@ grub_btrfs_mount (grub_device_t dev) +@@ -1188,6 +1266,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.02~beta2/grub-core/fs/btrfs.c return data; } -@@ -1226,6 +1311,91 @@ get_root (struct grub_btrfs_data *data, +@@ -1654,6 +1739,91 @@ get_root (struct grub_btrfs_data *data, } static grub_err_t @@ -256,7 +256,7 @@ Index: grub-2.02~beta2/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) -@@ -1243,14 +1413,26 @@ find_path (struct grub_btrfs_data *data, +@@ -1671,14 +1841,26 @@ find_path (struct grub_btrfs_data *data, char *origpath = NULL; unsigned symlinks_max = 32; @@ -287,7 +287,7 @@ Index: grub-2.02~beta2/grub-core/fs/btrfs.c while (1) { while (path[0] == '/') -@@ -1423,9 +1605,21 @@ find_path (struct grub_btrfs_data *data, +@@ -1851,9 +2033,21 @@ find_path (struct grub_btrfs_data *data, path = path_alloc = tmp; if (path[0] == '/') { @@ -312,7 +312,7 @@ Index: grub-2.02~beta2/grub-core/fs/btrfs.c } continue; } -@@ -1666,6 +1860,20 @@ grub_btrfs_read (grub_file_t file, char +@@ -2094,6 +2288,20 @@ grub_btrfs_read (grub_file_t file, char data->tree, file->offset, buf, len); } @@ -333,7 +333,7 @@ Index: grub-2.02~beta2/grub-core/fs/btrfs.c static grub_err_t grub_btrfs_uuid (grub_device_t device, char **uuid) { -@@ -1677,15 +1885,7 @@ grub_btrfs_uuid (grub_device_t device, c +@@ -2105,15 +2313,7 @@ grub_btrfs_uuid (grub_device_t device, c if (!data) return grub_errno; @@ -350,7 +350,7 @@ Index: grub-2.02~beta2/grub-core/fs/btrfs.c grub_btrfs_unmount (data); -@@ -1742,6 +1942,242 @@ grub_btrfs_embed (grub_device_t device _ +@@ -2170,6 +2370,242 @@ grub_btrfs_embed (grub_device_t device _ } #endif @@ -592,8 +592,8 @@ Index: grub-2.02~beta2/grub-core/fs/btrfs.c + static struct grub_fs grub_btrfs_fs = { .name = "btrfs", - .dir = grub_btrfs_dir, -@@ -1757,12 +2193,88 @@ static struct grub_fs grub_btrfs_fs = { + .fs_dir = grub_btrfs_dir, +@@ -2185,12 +2621,88 @@ static struct grub_fs grub_btrfs_fs = { #endif }; @@ -682,10 +682,10 @@ Index: grub-2.02~beta2/grub-core/fs/btrfs.c } + +// vim: si et sw=2: -Index: grub-2.02~beta2/include/grub/btrfs.h +Index: 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 +--- grub-2.04~rc1.orig/include/grub/btrfs.h ++++ grub-2.04~rc1/include/grub/btrfs.h @@ -29,6 +29,7 @@ enum GRUB_BTRFS_ITEM_TYPE_ROOT_ITEM = 0x84, GRUB_BTRFS_ITEM_TYPE_ROOT_BACKREF = 0x90, diff --git a/grub2-btrfs-09-get-default-subvolume.patch b/grub2-btrfs-09-get-default-subvolume.patch index 5d039c2..d15f42a 100644 --- a/grub2-btrfs-09-get-default-subvolume.patch +++ b/grub2-btrfs-09-get-default-subvolume.patch @@ -1,8 +1,8 @@ -Index: grub-2.02/grub-core/fs/btrfs.c +Index: grub-2.04~rc1/grub-core/fs/btrfs.c =================================================================== ---- grub-2.02.orig/grub-core/fs/btrfs.c -+++ grub-2.02/grub-core/fs/btrfs.c -@@ -2446,6 +2446,242 @@ out: +--- grub-2.04~rc1.orig/grub-core/fs/btrfs.c ++++ grub-2.04~rc1/grub-core/fs/btrfs.c +@@ -2867,6 +2867,242 @@ out: return 0; } @@ -244,8 +244,8 @@ Index: grub-2.02/grub-core/fs/btrfs.c + static struct grub_fs grub_btrfs_fs = { .name = "btrfs", - .dir = grub_btrfs_dir, -@@ -2464,6 +2700,7 @@ static struct grub_fs grub_btrfs_fs = { + .fs_dir = grub_btrfs_dir, +@@ -2885,6 +3121,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.02/grub-core/fs/btrfs.c static char * subvolid_set_env (struct grub_env_var *var __attribute__ ((unused)), -@@ -2534,6 +2771,11 @@ GRUB_MOD_INIT (btrfs) +@@ -2955,6 +3192,11 @@ GRUB_MOD_INIT (btrfs) "[-p|-n] [-o var] DEVICE", "Print list of BtrFS subvolumes on " "DEVICE.", options); diff --git a/grub2-commands-introduce-read_file-subcommand.patch b/grub2-commands-introduce-read_file-subcommand.patch index a82ebbc..7190920 100644 --- a/grub2-commands-introduce-read_file-subcommand.patch +++ b/grub2-commands-introduce-read_file-subcommand.patch @@ -4,12 +4,18 @@ 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(+) ---- a/grub-core/commands/read.c -+++ b/grub-core/commands/read.c +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 @@ -20,6 +20,7 @@ #include #include @@ -33,7 +39,7 @@ Needed to allow s390x-emu to be telecontrolled via LOADPARM. + 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++]); ++ file = grub_file_open (args[i++], GRUB_FILE_TYPE_READ_ENVVAR); + if (! file) + return grub_errno; + while ( i < argc ) @@ -68,3 +74,15 @@ Needed to allow s390x-emu to be telecontrolled via LOADPARM. 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, diff --git a/grub2-efi-Free-malloc-regions-on-exit.patch b/grub2-efi-Free-malloc-regions-on-exit.patch deleted file mode 100644 index c0dc400..0000000 --- a/grub2-efi-Free-malloc-regions-on-exit.patch +++ /dev/null @@ -1,186 +0,0 @@ -From 33298c813c36a50ccc881c33c9b6eacfb830c21a Mon Sep 17 00:00:00 2001 -From: Alexander Graf -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 - ---- - -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 - diff --git a/grub2-efi-HP-workaround.patch b/grub2-efi-HP-workaround.patch index 5b53090..932f534 100644 --- a/grub2-efi-HP-workaround.patch +++ b/grub2-efi-HP-workaround.patch @@ -1,7 +1,11 @@ -Index: grub-2.02~beta2/grub-core/kern/efi/init.c + +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 =================================================================== ---- grub-2.02~beta2.orig/grub-core/kern/efi/init.c -+++ 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 @@ -25,6 +25,7 @@ #include #include @@ -32,7 +36,7 @@ Index: grub-2.02~beta2/grub-core/kern/efi/init.c + goto quit; + + config = grub_xasprintf ("(%s)%s/grub.cfg", device, path); -+ config_fd = grub_file_open (config); ++ config_fd = grub_file_open (config, GRUB_FILE_TYPE_CONFIG); + + /* everything's fine, so quit the workaround */ + if (config_fd) @@ -53,7 +57,7 @@ Index: grub-2.02~beta2/grub-core/kern/efi/init.c + if (! config_upper) + goto quit; + -+ config_fd = grub_file_open (config_upper); ++ config_fd = grub_file_open (config_upper, GRUB_FILE_TYPE_CONFIG); + + /* if config can be found by the upper case path, return it */ + if (config_fd) @@ -78,7 +82,7 @@ Index: grub-2.02~beta2/grub-core/kern/efi/init.c void grub_machine_get_bootlocation (char **device, char **path) -@@ -69,6 +131,12 @@ grub_machine_get_bootlocation (char **de +@@ -72,6 +134,12 @@ grub_machine_get_bootlocation (char **de p = grub_strrchr (*path, '/'); if (p) *p = '\0'; diff --git a/grub2-efi-Move-grub_reboot-into-kernel.patch b/grub2-efi-Move-grub_reboot-into-kernel.patch deleted file mode 100644 index 11cb458..0000000 --- a/grub2-efi-Move-grub_reboot-into-kernel.patch +++ /dev/null @@ -1,122 +0,0 @@ -From dee74e9bd88aa31e38b1e77dc7845930aa1cd60f Mon Sep 17 00:00:00 2001 -From: Alexander Graf -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 - ---- - -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 . -- */ -- --#include --#include --#include --#include --#include --#include -- --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 - diff --git a/grub2-efi-chainloader-root.patch b/grub2-efi-chainloader-root.patch index 0c588a1..be29084 100644 --- a/grub2-efi-chainloader-root.patch +++ b/grub2-efi-chainloader-root.patch @@ -14,16 +14,16 @@ Signed-off-by: Michael Chang grub-core/loader/efi/chainloader.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) -Index: grub-2.02~beta2/grub-core/loader/efi/chainloader.c +Index: 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 -@@ -706,12 +706,16 @@ grub_cmd_chainloader (grub_command_t cmd +--- 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 *(--p16) = 0; } + grub_dprintf ("chain", "cmd='%s'\n", filename); - file = grub_file_open (filename); + file = grub_file_open (filename, GRUB_FILE_TYPE_EFI_CHAINLOADED_IMAGE); if (! file) goto fail; diff --git a/grub2-emu-4-all.patch b/grub2-emu-4-all.patch index 38ff1ee..fcc1c09 100644 --- a/grub2-emu-4-all.patch +++ b/grub2-emu-4-all.patch @@ -5,12 +5,12 @@ grub-core/osdep/unix/emuconsole.c | 5 +++-- 4 files changed, 14 insertions(+), 16 deletions(-) -Index: grub-2.02~rc1/Makefile.util.def +Index: grub-2.04~rc1/Makefile.util.def =================================================================== ---- 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; +--- 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; 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.02~rc1/Makefile.util.def }; program = { -@@ -373,7 +373,7 @@ program = { - ldadd = grub-core/gnulib/libgnu.a; +@@ -383,7 +383,7 @@ program = { + ldadd = grub-core/lib/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.02~rc1/Makefile.util.def }; program = { -@@ -389,7 +389,7 @@ program = { +@@ -399,7 +399,7 @@ program = { ldadd = libgrubkern.a; - ldadd = grub-core/gnulib/libgnu.a; + ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; - emu_condition = COND_NOT_s390x; + emu_condition = COND_NOT_emu; }; program = { -@@ -420,7 +420,7 @@ program = { +@@ -430,7 +430,7 @@ program = { ldadd = libgrubkern.a; - ldadd = grub-core/gnulib/libgnu.a; + ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; - emu_condition = COND_NOT_s390x; + emu_condition = COND_NOT_emu; }; data = { -@@ -1345,7 +1345,7 @@ program = { +@@ -1361,7 +1361,7 @@ program = { ldadd = libgrubkern.a; - ldadd = grub-core/gnulib/libgnu.a; + ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; - emu_condition = COND_NOT_s390x; + emu_condition = COND_NOT_emu; }; program = { -Index: grub-2.02~rc1/grub-core/Makefile.core.def +Index: grub-2.04~rc1/grub-core/Makefile.core.def =================================================================== ---- grub-2.02~rc1.orig/grub-core/Makefile.core.def -+++ grub-2.02~rc1/grub-core/Makefile.core.def -@@ -1057,7 +1057,7 @@ module = { +--- grub-2.04~rc1.orig/grub-core/Makefile.core.def ++++ grub-2.04~rc1/grub-core/Makefile.core.def +@@ -1139,7 +1139,7 @@ module = { module = { name = videotest; common = commands/videotest.c; @@ -67,7 +67,7 @@ Index: grub-2.02~rc1/grub-core/Makefile.core.def }; module = { -@@ -1470,7 +1470,7 @@ module = { +@@ -1572,7 +1572,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.02~rc1/grub-core/Makefile.core.def }; module = { -@@ -1886,13 +1886,13 @@ module = { +@@ -2008,13 +2008,13 @@ module = { name = gfxterm; common = term/gfxterm.c; enable = videomodules; @@ -92,8 +92,8 @@ Index: grub-2.02~rc1/grub-core/Makefile.core.def }; module = { -@@ -2005,9 +2005,7 @@ module = { - enable = i386_pc; +@@ -2133,9 +2133,7 @@ module = { + enable = i386_xen_pvh; enable = i386_efi; enable = x86_64_efi; - enable = emu; @@ -102,7 +102,7 @@ Index: grub-2.02~rc1/grub-core/Makefile.core.def }; module = { -@@ -2054,7 +2052,7 @@ module = { +@@ -2182,7 +2180,7 @@ module = { module = { name = gfxterm_menu; common = tests/gfxterm_menu.c; @@ -111,8 +111,8 @@ Index: grub-2.02~rc1/grub-core/Makefile.core.def }; module = { -@@ -2205,9 +2203,7 @@ module = { - enable = i386_pc; +@@ -2334,9 +2332,7 @@ module = { + enable = i386_xen_pvh; enable = i386_efi; enable = x86_64_efi; - enable = emu; @@ -121,11 +121,11 @@ Index: grub-2.02~rc1/grub-core/Makefile.core.def }; module = { -Index: grub-2.02~rc1/configure.ac +Index: grub-2.04~rc1/configure.ac =================================================================== ---- grub-2.02~rc1.orig/configure.ac -+++ grub-2.02~rc1/configure.ac -@@ -1884,6 +1884,7 @@ AC_SUBST(BUILD_LIBM) +--- grub-2.04~rc1.orig/configure.ac ++++ grub-2.04~rc1/configure.ac +@@ -1911,6 +1911,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.02~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.02~rc1/grub-core/osdep/unix/emuconsole.c +Index: 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 +--- grub-2.04~rc1.orig/grub-core/osdep/unix/emuconsole.c ++++ grub-2.04~rc1/grub-core/osdep/unix/emuconsole.c @@ -50,13 +50,12 @@ static struct termios new_tty; static int console_mode = 0; diff --git a/grub2-fix-build-with-flex-2.6.4.patch b/grub2-fix-build-with-flex-2.6.4.patch deleted file mode 100644 index d7c2d55..0000000 --- a/grub2-fix-build-with-flex-2.6.4.patch +++ /dev/null @@ -1,24 +0,0 @@ -From: Andrei Borzenkov - -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 - diff --git a/grub2-fix-locale-en.mo.gz-not-found-error-message.patch b/grub2-fix-locale-en.mo.gz-not-found-error-message.patch deleted file mode 100644 index df09541..0000000 --- a/grub2-fix-locale-en.mo.gz-not-found-error-message.patch +++ /dev/null @@ -1,37 +0,0 @@ -From e7500166b343874447e6abf385a791998c77f4c4 Mon Sep 17 00:00:00 2001 -From: Michael Chang -Date: Wed, 26 Sep 2012 15:55:44 +0800 -Subject: [PATCH] Silence error messages when translations are unavailable - -From: Colin Watson - -References: bnc#771393 - https://savannah.gnu.org/bugs/?35880 -Patch-Mainline: no - -Signed-off-by: Michael Chang ---- - 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; - } - diff --git a/grub2-freetype-pkgconfig.patch b/grub2-freetype-pkgconfig.patch deleted file mode 100644 index 068792a..0000000 --- a/grub2-freetype-pkgconfig.patch +++ /dev/null @@ -1,165 +0,0 @@ -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; - }; diff --git a/grub2-linux.patch b/grub2-linux.patch index 6463296..446b82b 100644 --- a/grub2-linux.patch +++ b/grub2-linux.patch @@ -1,7 +1,7 @@ -Index: grub-2.02~beta2/util/grub.d/10_linux.in +Index: 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 +--- grub-2.04rc1.orig/util/grub.d/10_linux.in ++++ grub-2.04rc1/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.02~beta2/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 -@@ -129,7 +129,7 @@ linux_entry () +@@ -141,7 +141,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.02~beta2/util/grub.d/10_linux.in EOF if test -n "${initrd}" ; then # TRANSLATORS: ramdisk isn't identifier. Should be translated. -Index: grub-2.02~beta2/util/grub.d/20_linux_xen.in +Index: 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 +--- grub-2.04rc1.orig/util/grub.d/20_linux_xen.in ++++ grub-2.04rc1/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.02~beta2/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 -@@ -122,7 +122,7 @@ linux_entry () +@@ -134,7 +134,7 @@ linux_entry () fi - multiboot ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts} + ${xen_loader} ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts} echo '$(echo "$lmessage" | grub_quote)' -- module ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ro ${args} -+ module ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ${args} +- ${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} EOF if test -n "${initrd}" ; then # TRANSLATORS: ramdisk isn't identifier. Should be translated. diff --git a/grub2-move-initrd-upper.patch b/grub2-move-initrd-upper.patch deleted file mode 100644 index 36f4ce9..0000000 --- a/grub2-move-initrd-upper.patch +++ /dev/null @@ -1,33 +0,0 @@ -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 - # 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 diff --git a/grub2-msdos-fix-overflow.patch b/grub2-msdos-fix-overflow.patch deleted file mode 100644 index 886150f..0000000 --- a/grub2-msdos-fix-overflow.patch +++ /dev/null @@ -1,46 +0,0 @@ -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; diff --git a/grub2-pass-corret-root-for-nfsroot.patch b/grub2-pass-corret-root-for-nfsroot.patch index fd893c6..372a3fb 100644 --- a/grub2-pass-corret-root-for-nfsroot.patch +++ b/grub2-pass-corret-root-for-nfsroot.patch @@ -18,17 +18,18 @@ 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.02/util/grub-mkconfig.in +Index: grub-2.04~rc1/util/grub-mkconfig.in =================================================================== ---- grub-2.02.orig/util/grub-mkconfig.in -+++ grub-2.02/util/grub-mkconfig.in -@@ -131,22 +131,47 @@ else +--- grub-2.04~rc1.orig/util/grub-mkconfig.in ++++ grub-2.04~rc1/util/grub-mkconfig.in +@@ -131,23 +131,51 @@ 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! - .*$!!'` @@ -54,23 +55,24 @@ Index: grub-2.02/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 --printf=%T / || echo unknown)" -+ +- GRUB_FS="$(stat -f -c %T / || echo unknown)" + if [ x"$GRUB_FS" = x ] || [ x"$GRUB_FS" = xunknown ]; then -+ GRUB_FS="$(stat -f --printf=%T / || echo unknown)" ++ GRUB_FS="$(stat -f -c %T / || echo unknown)" + fi fi @@ -78,14 +80,14 @@ Index: grub-2.02/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 + - if test -f ${sysconfdir}/default/grub ; then - . ${sysconfdir}/default/grub - fi -Index: grub-2.02/util/grub.d/10_linux.in + # 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 =================================================================== ---- 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 () +--- 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 () type="$3" args="$4" @@ -98,7 +100,7 @@ Index: grub-2.02/util/grub.d/10_linux.in if [ -z "$boot_device_id" ]; then boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")" fi -@@ -131,7 +137,7 @@ linux_entry () +@@ -141,7 +147,7 @@ linux_entry () message="$(gettext_printf "Loading Linux %s ..." ${version})" sed "s/^/$submenu_indentation/" << EOF echo '$(echo "$message" | grub_quote)' @@ -107,11 +109,11 @@ Index: grub-2.02/util/grub.d/10_linux.in EOF if test -n "${initrd}" ; then # TRANSLATORS: ramdisk isn't identifier. Should be translated. -Index: grub-2.02/util/grub.d/20_linux_xen.in +Index: grub-2.04~rc1/util/grub.d/20_linux_xen.in =================================================================== ---- 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 () +--- 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 () type="$4" args="$5" xen_args="$6" @@ -123,12 +125,12 @@ Index: grub-2.02/util/grub.d/20_linux_xen.in if [ -z "$boot_device_id" ]; then boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")" fi -@@ -130,7 +135,7 @@ linux_entry () +@@ -140,7 +145,7 @@ linux_entry () fi - multiboot ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts} + ${xen_loader} ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts} echo '$(echo "$lmessage" | grub_quote)' -- module ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ${args} -+ module ${rel_dirname}/${basename} placeholder ${root_device} ${args} +- ${module_loader} ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ${args} ++ ${module_loader} ${rel_dirname}/${basename} placeholder ${root_device} ${args} EOF if test -n "${initrd}" ; then # TRANSLATORS: ramdisk isn't identifier. Should be translated. diff --git a/grub2-ppc64-cas-fix-double-free.patch b/grub2-ppc64-cas-fix-double-free.patch index b086a81..5f8146b 100644 --- a/grub2-ppc64-cas-fix-double-free.patch +++ b/grub2-ppc64-cas-fix-double-free.patch @@ -1,8 +1,8 @@ -Index: grub-2.02/grub-core/kern/ieee1275/openfw.c +Index: grub-2.04~rc1/grub-core/kern/ieee1275/openfw.c =================================================================== ---- 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 +--- 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 /* Check if it's a CAS reboot. If so, set the script to be executed. */ int @@ -11,7 +11,7 @@ Index: grub-2.02/grub-core/kern/ieee1275/openfw.c { grub_uint32_t ibm_ca_support_reboot; grub_uint32_t ibm_fw_nbr_reboots; -@@ -625,16 +625,37 @@ grub_ieee1275_cas_reboot (char *script) +@@ -628,16 +628,37 @@ grub_ieee1275_cas_reboot (char *script) if (ibm_ca_support_reboot || ibm_fw_nbr_reboots) { @@ -57,7 +57,7 @@ Index: grub-2.02/grub-core/kern/ieee1275/openfw.c grub_ieee1275_set_boot_last_label (""); return -1; -@@ -648,7 +669,8 @@ int grub_ieee1275_set_boot_last_label (c +@@ -651,8 +672,9 @@ 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,10 +67,11 @@ Index: grub-2.02/grub-core/kern/ieee1275/openfw.c + grub_strlen (text) + 1, &actual); return 0; } -Index: grub-2.02/grub-core/normal/main.c + +Index: 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 +--- grub-2.04~rc1.orig/grub-core/normal/main.c ++++ grub-2.04~rc1/grub-core/normal/main.c @@ -281,10 +281,9 @@ grub_normal_execute (const char *config, #ifdef GRUB_MACHINE_IEEE1275 int boot; @@ -84,11 +85,11 @@ Index: grub-2.02/grub-core/normal/main.c { if (! grub_script_execute_new_scope (script, 0, dummy)) boot = 1; -Index: grub-2.02/include/grub/ieee1275/ieee1275.h +Index: grub-2.04~rc1/include/grub/ieee1275/ieee1275.h =================================================================== ---- 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 +--- 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 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); @@ -96,4 +97,4 @@ Index: grub-2.02/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); - #define FOR_IEEE1275_DEVALIASES(alias) for (grub_ieee1275_devalias_init_iterator (&(alias)); grub_ieee1275_devalias_next (&(alias));) + char *EXPORT_FUNC(grub_ieee1275_get_boot_dev) (void); diff --git a/grub2-ppc64-cas-reboot-support.patch b/grub2-ppc64-cas-reboot-support.patch index 422dd2a..40063f0 100644 --- a/grub2-ppc64-cas-reboot-support.patch +++ b/grub2-ppc64-cas-reboot-support.patch @@ -24,11 +24,11 @@ parameters include/grub/ieee1275/ieee1275.h | 2 ++ 4 files changed, 90 insertions(+) -Index: grub-2.02~beta2/grub-core/kern/ieee1275/openfw.c +Index: grub-2.04~rc1/grub-core/kern/ieee1275/openfw.c =================================================================== ---- 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 @@ +--- 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 return NULL; } @@ -94,10 +94,14 @@ Index: grub-2.02~beta2/grub-core/kern/ieee1275/openfw.c + grub_strlen (text), &actual); + return 0; +} -Index: grub-2.02~beta2/grub-core/normal/main.c ++ + char * + grub_ieee1275_get_boot_dev (void) + { +Index: 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 +--- grub-2.04~rc1.orig/grub-core/normal/main.c ++++ grub-2.04~rc1/grub-core/normal/main.c @@ -33,6 +33,9 @@ #include #include @@ -108,7 +112,7 @@ Index: grub-2.02~beta2/grub-core/normal/main.c GRUB_MOD_LICENSE ("GPLv3+"); -@@ -275,6 +278,21 @@ +@@ -275,6 +278,21 @@ grub_normal_execute (const char *config, { menu = read_config_file (config); @@ -130,21 +134,21 @@ Index: grub-2.02~beta2/grub-core/normal/main.c /* Ignore any error. */ grub_errno = GRUB_ERR_NONE; } -Index: grub-2.02~beta2/grub-core/script/execute.c +Index: grub-2.04~rc1/grub-core/script/execute.c =================================================================== ---- 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-2.04~rc1.orig/grub-core/script/execute.c ++++ grub-2.04~rc1/grub-core/script/execute.c +@@ -28,6 +28,9 @@ #include #include + #include +#ifdef GRUB_MACHINE_IEEE1275 +#include +#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. */ -@@ -877,6 +880,10 @@ +@@ -878,6 +881,10 @@ grub_script_execute_sourcecode (const ch grub_err_t ret = 0; struct grub_script *parsed_script; @@ -155,16 +159,16 @@ Index: grub-2.02~beta2/grub-core/script/execute.c while (source) { char *line; -Index: grub-2.02~beta2/include/grub/ieee1275/ieee1275.h +Index: grub-2.04~rc1/include/grub/ieee1275/ieee1275.h =================================================================== ---- 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 @@ +--- 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 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); - #define FOR_IEEE1275_DEVALIASES(alias) for (grub_ieee1275_devalias_init_iterator (&(alias)); grub_ieee1275_devalias_next (&(alias));) + char *EXPORT_FUNC(grub_ieee1275_get_boot_dev) (void); diff --git a/grub2-ppc64le-disable-video.patch b/grub2-ppc64le-disable-video.patch index 24ddbcb..2380032 100644 --- a/grub2-ppc64le-disable-video.patch +++ b/grub2-ppc64le-disable-video.patch @@ -1,7 +1,7 @@ -Index: grub-2.02~beta2/grub-core/kern/ieee1275/cmain.c +Index: 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 +--- grub-2.04~rc1.orig/grub-core/kern/ieee1275/cmain.c ++++ grub-2.04~rc1/grub-core/kern/ieee1275/cmain.c @@ -90,7 +90,10 @@ grub_ieee1275_find_options (void) } @@ -14,11 +14,11 @@ Index: grub-2.02~beta2/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.02~beta2/grub-core/video/ieee1275.c +Index: grub-2.04~rc1/grub-core/video/ieee1275.c =================================================================== ---- 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-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_MOD_INIT(ieee1275_fb) { @@ -34,14 +34,14 @@ Index: grub-2.02~beta2/grub-core/video/ieee1275.c } GRUB_MOD_FINI(ieee1275_fb) -Index: grub-2.02~beta2/include/grub/ieee1275/ieee1275.h +Index: 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 -@@ -145,6 +145,8 @@ enum grub_ieee1275_flag - GRUB_IEEE1275_FLAG_BROKEN_REPEAT, - +--- 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_IEEE1275_FLAG_RAW_DEVNAMES, + + GRUB_IEEE1275_FLAG_DISABLE_VIDEO_SUPPORT }; diff --git a/grub2-ppc64le-memory-map.patch b/grub2-ppc64le-memory-map.patch index 5642585..44ac4a7 100644 --- a/grub2-ppc64le-memory-map.patch +++ b/grub2-ppc64le-memory-map.patch @@ -1,7 +1,7 @@ -Index: grub-2.02~beta2/grub-core/kern/ieee1275/openfw.c +Index: 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 +--- grub-2.04~rc1.orig/grub-core/kern/ieee1275/openfw.c ++++ grub-2.04~rc1/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.02~beta2/grub-core/kern/ieee1275/openfw.c return GRUB_ERR_NONE; } -Index: grub-2.02~beta2/include/grub/ieee1275/ieee1275.h +Index: 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 +--- grub-2.04~rc1.orig/include/grub/ieee1275/ieee1275.h ++++ grub-2.04~rc1/include/grub/ieee1275/ieee1275.h @@ -30,6 +30,12 @@ struct grub_ieee1275_mem_region unsigned int size; }; @@ -62,19 +62,19 @@ Index: grub-2.02~beta2/include/grub/ieee1275/ieee1275.h #define IEEE1275_MAX_PROP_LEN 8192 #define IEEE1275_MAX_PATH_LEN 256 -@@ -214,6 +220,7 @@ int EXPORT_FUNC(grub_ieee1275_millisecon - +@@ -235,6 +241,7 @@ char *EXPORT_FUNC(grub_ieee1275_encode_u + int EXPORT_FUNC(grub_ieee1275_get_block_size) (grub_ieee1275_ihandle_t ihandle); 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.02~beta2/grub-core/kern/ieee1275/init.c +Index: grub-2.04~rc1/grub-core/kern/ieee1275/init.c =================================================================== ---- 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 +--- 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 void grub_exit (void) { diff --git a/grub2-s390x-01-Changes-made-and-files-added-in-order-to-allow-s390x.patch b/grub2-s390x-01-Changes-made-and-files-added-in-order-to-allow-s390x.patch index 9c2ebe2..e110910 100644 --- a/grub2-s390x-01-Changes-made-and-files-added-in-order-to-allow-s390x.patch +++ b/grub2-s390x-01-Changes-made-and-files-added-in-order-to-allow-s390x.patch @@ -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.02~beta2/grub-core/kern/emu/cache_s.S +Index: grub-2.04~rc1/grub-core/kern/emu/cache_s.S =================================================================== ---- 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__) +--- 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 @@ #include "../powerpc/cache.S" - #elif defined(__ia64__) || defined(__arm__) || defined(__aarch64__) || defined(__mips__) + #elif defined(__ia64__) || defined(__arm__) || defined(__aarch64__) || \ + defined(__mips__) || defined(__riscv) +#elif defined(__s390x__) #else #error "No target cpu type is defined" #endif -Index: grub-2.02~beta2/grub-core/kern/emu/lite.c +Index: grub-2.04~rc1/grub-core/kern/emu/lite.c =================================================================== ---- 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" +--- 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 @@ #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.02~beta2/grub-core/kern/dl.c +Index: 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 +--- grub-2.04~rc1.orig/grub-core/kern/dl.c ++++ grub-2.04~rc1/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__) -+#if !defined (__i386__) && !defined (__x86_64__) && !defined (__s390x__) +-#if !defined (__i386__) && !defined (__x86_64__) && !defined(__riscv) ++#if !defined (__i386__) && !defined (__x86_64__) && !defined(__riscv) && !defined (__s390x__) grub_size_t tramp; grub_size_t got; grub_err_t err; @@ -63,8 +63,8 @@ Index: grub-2.02~beta2/grub-core/kern/dl.c talign = s->sh_addralign; } --#if !defined (__i386__) && !defined (__x86_64__) -+#if !defined (__i386__) && !defined (__x86_64__) && !defined (__s390x__) +-#if !defined (__i386__) && !defined (__x86_64__) && !defined(__riscv) ++#if !defined (__i386__) && !defined (__x86_64__) && !defined(__riscv) && !defined (__s390x__) err = grub_arch_dl_get_tramp_got_size (e, &tramp, &got); if (err) return err; @@ -72,15 +72,15 @@ Index: grub-2.02~beta2/grub-core/kern/dl.c mod->segment = seg; } } --#if !defined (__i386__) && !defined (__x86_64__) -+#if !defined (__i386__) && !defined (__x86_64__) && !defined (__s390x__) +-#if !defined (__i386__) && !defined (__x86_64__) && !defined(__riscv) ++#if !defined (__i386__) && !defined (__x86_64__) && !defined(__riscv) && !defined (__s390x__) ptr = (char *) ALIGN_UP ((grub_addr_t) ptr, GRUB_ARCH_DL_TRAMP_ALIGN); mod->tramp = ptr; mod->trampptr = ptr; -Index: grub-2.02~beta2/grub-core/kern/s390x/dl.c +Index: grub-2.04~rc1/grub-core/kern/s390x/dl.c =================================================================== --- /dev/null -+++ grub-2.02~beta2/grub-core/kern/s390x/dl.c ++++ grub-2.04~rc1/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.02~beta2/grub-core/kern/s390x/dl.c + (void)(seg); + return GRUB_ERR_BUG; +} -Index: grub-2.02~beta2/grub-core/lib/s390x/setjmp.S +Index: grub-2.04~rc1/grub-core/lib/s390x/setjmp.S =================================================================== --- /dev/null -+++ grub-2.02~beta2/grub-core/lib/s390x/setjmp.S ++++ grub-2.04~rc1/grub-core/lib/s390x/setjmp.S @@ -0,0 +1,46 @@ +/* + * GRUB -- GRand Unified Bootloader @@ -173,23 +173,23 @@ Index: grub-2.02~beta2/grub-core/lib/s390x/setjmp.S + lmg %r11,%r15,0(%r2) + lgr %r2,%r3 + br %r14 -Index: grub-2.02~beta2/grub-core/lib/setjmp.S +Index: grub-2.04~rc1/grub-core/lib/setjmp.S =================================================================== ---- 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__) +--- grub-2.04~rc1.orig/grub-core/lib/setjmp.S ++++ grub-2.04~rc1/grub-core/lib/setjmp.S +@@ -17,6 +17,8 @@ #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.02~beta2/include/grub/cache.h +Index: 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 +--- grub-2.04~rc1.orig/include/grub/cache.h ++++ grub-2.04~rc1/include/grub/cache.h @@ -23,7 +23,7 @@ #include #include @@ -199,10 +199,10 @@ Index: grub-2.02~beta2/include/grub/cache.h static inline void grub_arch_sync_caches (void *address __attribute__ ((unused)), grub_size_t len __attribute__ ((unused))) -Index: grub-2.02~beta2/include/grub/s390x/setjmp.h +Index: grub-2.04~rc1/include/grub/s390x/setjmp.h =================================================================== --- /dev/null -+++ grub-2.02~beta2/include/grub/s390x/setjmp.h ++++ grub-2.04~rc1/include/grub/s390x/setjmp.h @@ -0,0 +1,29 @@ +/* + * GRUB -- GRand Unified Bootloader @@ -233,10 +233,10 @@ Index: grub-2.02~beta2/include/grub/s390x/setjmp.h +void grub_longjmp (grub_jmp_buf env, int val) __attribute__ ((noreturn)); + +#endif /* ! GRUB_SETJMP_CPU_HEADER */ -Index: grub-2.02~beta2/include/grub/s390x/time.h +Index: grub-2.04~rc1/include/grub/s390x/time.h =================================================================== --- /dev/null -+++ grub-2.02~beta2/include/grub/s390x/time.h ++++ grub-2.04~rc1/include/grub/s390x/time.h @@ -0,0 +1,27 @@ +/* + * GRUB -- GRand Unified Bootloader @@ -265,10 +265,10 @@ Index: grub-2.02~beta2/include/grub/s390x/time.h +} + +#endif /* ! KERNEL_CPU_TIME_HEADER */ -Index: grub-2.02~beta2/include/grub/s390x/types.h +Index: grub-2.04~rc1/include/grub/s390x/types.h =================================================================== --- /dev/null -+++ grub-2.02~beta2/include/grub/s390x/types.h ++++ grub-2.04~rc1/include/grub/s390x/types.h @@ -0,0 +1,32 @@ +/* + * GRUB -- GRand Unified Bootloader diff --git a/grub2-s390x-02-kexec-module-added-to-emu.patch b/grub2-s390x-02-kexec-module-added-to-emu.patch index 0e60963..a23b780 100644 --- a/grub2-s390x-02-kexec-module-added-to-emu.patch +++ b/grub2-s390x-02-kexec-module-added-to-emu.patch @@ -9,14 +9,14 @@ include/grub/emu/misc.h | 3 8 files changed, 204 insertions(+), 4 deletions(-) -Index: grub-2.02~beta2/grub-core/Makefile.core.def +Index: grub-2.04~rc1/grub-core/Makefile.core.def =================================================================== ---- 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; +--- grub-2.04~rc1.orig/grub-core/Makefile.core.def ++++ grub-2.04~rc1/grub-core/Makefile.core.def +@@ -1786,9 +1786,9 @@ module = { 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.02~beta2/grub-core/Makefile.core.def }; module = { -Index: grub-2.02~beta2/grub-core/loader/emu/linux.c +Index: 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 +--- /dev/null ++++ grub-2.04~rc1/grub-core/loader/emu/linux.c @@ -0,0 +1,173 @@ +/* + * GRUB -- GRand Unified Bootloader @@ -202,10 +202,10 @@ Index: grub-2.02~beta2/grub-core/loader/emu/linux.c + grub_unregister_command (cmd_linux); + grub_unregister_command (cmd_initrd); +} -Index: grub-2.02~beta2/include/grub/emu/hostfile.h +Index: 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 +--- grub-2.04~rc1.orig/include/grub/emu/hostfile.h ++++ grub-2.04~rc1/include/grub/emu/hostfile.h @@ -22,6 +22,7 @@ #include #include @@ -214,7 +214,7 @@ Index: grub-2.02~beta2/include/grub/emu/hostfile.h #include int -@@ -29,7 +30,7 @@ +@@ -29,7 +30,7 @@ grub_util_is_directory (const char *path int grub_util_is_special_file (const char *path); int @@ -223,10 +223,10 @@ Index: grub-2.02~beta2/include/grub/emu/hostfile.h char * grub_util_path_concat (size_t n, ...); -Index: grub-2.02~beta2/include/grub/emu/exec.h +Index: 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 +--- grub-2.04~rc1.orig/include/grub/emu/exec.h ++++ grub-2.04~rc1/include/grub/emu/exec.h @@ -23,6 +23,8 @@ #include @@ -236,7 +236,7 @@ Index: grub-2.02~beta2/include/grub/emu/exec.h pid_t grub_util_exec_pipe (const char *const *argv, int *fd); pid_t -@@ -32,7 +34,7 @@ +@@ -32,7 +34,7 @@ int 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.02~beta2/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.02~beta2/grub-core/Makefile.am +Index: grub-2.04~rc1/grub-core/Makefile.am =================================================================== ---- 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 @@ +--- 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 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.02~beta2/grub-core/Makefile.am if COND_GRUB_EMU_SDL KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/sdl.h endif -Index: grub-2.02~beta2/grub-core/kern/emu/main.c +Index: grub-2.04~rc1/grub-core/kern/emu/main.c =================================================================== ---- 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 @@ +--- 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[] = { 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.02~beta2/grub-core/kern/emu/main.c { 0, 0, 0, 0, 0, 0 } }; -@@ -163,6 +164,9 @@ +@@ -164,6 +165,9 @@ argp_parser (int key, char *arg, struct case 'v': verbosity++; break; @@ -279,11 +279,11 @@ Index: grub-2.02~beta2/grub-core/kern/emu/main.c case ARGP_KEY_ARG: { -Index: grub-2.02~beta2/grub-core/kern/emu/misc.c +Index: grub-2.04~rc1/grub-core/kern/emu/misc.c =================================================================== ---- 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 @@ +--- 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 @@ #include int verbosity; @@ -291,7 +291,7 @@ Index: grub-2.02~beta2/grub-core/kern/emu/misc.c void grub_util_warn (const char *fmt, ...) -@@ -80,7 +81,7 @@ +@@ -82,7 +83,7 @@ grub_util_error (const char *fmt, ...) vfprintf (stderr, fmt, ap); va_end (ap); fprintf (stderr, ".\n"); @@ -300,7 +300,7 @@ Index: grub-2.02~beta2/grub-core/kern/emu/misc.c } void * -@@ -138,6 +139,9 @@ +@@ -141,6 +142,9 @@ xasprintf (const char *fmt, ...) void grub_exit (void) { @@ -310,7 +310,7 @@ Index: grub-2.02~beta2/grub-core/kern/emu/misc.c exit (1); } #endif -@@ -199,3 +203,15 @@ +@@ -202,3 +206,15 @@ grub_util_load_image (const char *path, fclose (fp); } @@ -326,13 +326,13 @@ Index: grub-2.02~beta2/grub-core/kern/emu/misc.c +{ + return kexecute; +} -Index: grub-2.02~beta2/include/grub/emu/misc.h +Index: grub-2.04~rc1/include/grub/emu/misc.h =================================================================== ---- 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)); +--- 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)); +void EXPORT_FUNC(grub_util_set_kexecute) (void); +int EXPORT_FUNC(grub_util_get_kexecute) (void) WARN_UNUSED_RESULT; diff --git a/grub2-s390x-04-grub2-install.patch b/grub2-s390x-04-grub2-install.patch index 2c75a20..0549122 100644 --- a/grub2-s390x-04-grub2-install.patch +++ b/grub2-s390x-04-grub2-install.patch @@ -51,6 +51,8 @@ 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 +++ @@ -69,41 +71,43 @@ V18: util/s390x/zipl2grub.pl.in | 423 +++++++++++++++++++++++++++++++++ 14 files changed, 908 insertions(+), 3 deletions(-) ---- a/Makefile.util.def -+++ b/Makefile.util.def -@@ -352,6 +352,7 @@ program = { - ldadd = grub-core/gnulib/libgnu.a; +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; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; cppflags = '-DGRUB_SETUP_FUNC=grub_util_bios_setup'; + emu_condition = COND_NOT_s390x; }; program = { -@@ -372,6 +373,7 @@ program = { - ldadd = grub-core/gnulib/libgnu.a; +@@ -382,6 +383,7 @@ program = { + ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; cppflags = '-DGRUB_SETUP_FUNC=grub_util_sparc_setup'; + emu_condition = COND_NOT_s390x; }; program = { -@@ -387,6 +389,7 @@ program = { +@@ -397,6 +399,7 @@ program = { ldadd = libgrubkern.a; - ldadd = grub-core/gnulib/libgnu.a; + ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; + emu_condition = COND_NOT_s390x; }; program = { -@@ -417,6 +420,7 @@ program = { +@@ -427,6 +430,7 @@ program = { ldadd = libgrubkern.a; - ldadd = grub-core/gnulib/libgnu.a; + ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; + emu_condition = COND_NOT_s390x; }; data = { -@@ -628,6 +632,7 @@ program = { +@@ -638,6 +642,7 @@ program = { common = grub-core/disk/host.c; common = util/resolve.c; @@ -111,7 +115,7 @@ V18: common = grub-core/kern/emu/argp_common.c; common = grub-core/osdep/init.c; -@@ -697,6 +702,46 @@ script = { +@@ -707,6 +712,46 @@ script = { }; script = { @@ -158,17 +162,19 @@ V18: name = grub-mkconfig_lib; common = util/grub-mkconfig_lib.in; installdir = noinst; -@@ -1308,6 +1353,7 @@ program = { +@@ -1324,6 +1369,7 @@ program = { ldadd = libgrubkern.a; - ldadd = grub-core/gnulib/libgnu.a; + ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; + emu_condition = COND_NOT_s390x; }; program = { ---- a/configure.ac -+++ b/configure.ac -@@ -181,9 +181,9 @@ if test x$platform != xemu ; then +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 esac fi @@ -181,19 +187,21 @@ V18: case "$target_os" in windows* | mingw32*) target_os=cygwin ;; -@@ -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]) +@@ -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]) +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]) ---- a/grub-core/Makefile.core.def -+++ b/grub-core/Makefile.core.def -@@ -1057,6 +1057,7 @@ module = { +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 = { module = { name = videotest; common = commands/videotest.c; @@ -201,7 +209,7 @@ V18: }; module = { -@@ -1469,6 +1470,7 @@ module = { +@@ -1571,6 +1572,7 @@ module = { common = gfxmenu/gui_progress_bar.c; common = gfxmenu/gui_util.c; common = gfxmenu/gui_string_util.c; @@ -209,7 +217,7 @@ V18: }; module = { -@@ -1884,11 +1886,13 @@ module = { +@@ -2006,11 +2008,13 @@ module = { name = gfxterm; common = term/gfxterm.c; enable = videomodules; @@ -223,7 +231,7 @@ V18: }; module = { -@@ -2003,6 +2007,7 @@ module = { +@@ -2131,6 +2135,7 @@ module = { enable = x86_64_efi; enable = emu; enable = xen; @@ -231,7 +239,7 @@ V18: }; module = { -@@ -2049,6 +2054,7 @@ module = { +@@ -2177,6 +2182,7 @@ module = { module = { name = gfxterm_menu; common = tests/gfxterm_menu.c; @@ -239,7 +247,7 @@ V18: }; module = { -@@ -2201,6 +2207,7 @@ module = { +@@ -2330,6 +2336,7 @@ module = { enable = x86_64_efi; enable = emu; enable = xen; @@ -247,8 +255,10 @@ V18: }; module = { ---- a/grub-core/osdep/basic/no_platform.c -+++ b/grub-core/osdep/basic/no_platform.c +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 @@ -44,3 +44,10 @@ grub_install_sgi_setup (const char *inst { grub_util_error ("%s", _("no SGI routines are available for your platform")); @@ -260,9 +270,11 @@ V18: + grub_util_error ("%s", _("no zIPL routines are available for your platform")); +} + ---- 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 +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 imgfile, destname, NULL }); grub_util_warn ("%s", _("You will have to set `SystemPartition' and `OSLoader' manually.")); } @@ -277,9 +289,11 @@ V18: + "-z", dest, NULL })) + grub_util_error (_("`%s' failed.\n"), PACKAGE"-zipl-setup"); +} ---- 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 +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 { grub_util_error ("%s", _("no SGI routines are available for your platform")); } @@ -289,17 +303,19 @@ V18: +{ + grub_util_error ("%s", _("no zIPL routines are available for your platform")); +} ---- 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, +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, + GRUB_INSTALL_PLATFORM_S390X_EMU, GRUB_INSTALL_PLATFORM_MAX }; -@@ -219,6 +220,9 @@ void +@@ -229,6 +230,9 @@ void grub_install_sgi_setup (const char *install_device, const char *imgfile, const char *destname); @@ -309,18 +325,22 @@ V18: int grub_install_compress_gzip (const char *src, const char *dest); int ---- 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" }, +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" }, + [GRUB_INSTALL_PLATFORM_S390X_EMU] = { "s390x", "emu" }, }; char * ---- a/util/grub-install.c -+++ b/util/grub-install.c +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 @@ -66,6 +66,7 @@ static int force_file_id = 0; static char *disk_module = NULL; static char *efidir = NULL; @@ -367,32 +387,32 @@ V18: #else return NULL; #endif -@@ -495,6 +506,8 @@ have_bootdev (enum grub_install_plat pl) - +@@ -499,6 +510,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. */ -@@ -907,6 +920,7 @@ main (int argc, char *argv[]) - case GRUB_INSTALL_PLATFORM_ARM_UBOOT: +@@ -914,6 +927,7 @@ main (int argc, char *argv[]) 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: -@@ -952,6 +966,7 @@ main (int argc, char *argv[]) - case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS: +@@ -964,6 +978,7 @@ main (int argc, char *argv[]) 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; -@@ -1213,6 +1228,20 @@ main (int argc, char *argv[]) +@@ -1239,6 +1254,20 @@ main (int argc, char *argv[]) } } @@ -413,15 +433,15 @@ V18: grub_install_copy_files (grub_install_source_directory, grubdir, platform); -@@ -1458,6 +1487,7 @@ main (int argc, char *argv[]) - case GRUB_INSTALL_PLATFORM_ARM_UBOOT: +@@ -1488,6 +1517,7 @@ main (int argc, char *argv[]) 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. */ -@@ -1570,6 +1600,10 @@ main (int argc, char *argv[]) +@@ -1605,6 +1635,10 @@ main (int argc, char *argv[]) strcpy (mkimage_target, "sparc64-ieee1275-raw"); core_name = "core.img"; break; @@ -432,7 +452,7 @@ V18: /* pacify warning. */ case GRUB_INSTALL_PLATFORM_MAX: break; -@@ -1585,6 +1619,7 @@ main (int argc, char *argv[]) +@@ -1620,6 +1654,7 @@ main (int argc, char *argv[]) core_name); char *prefix = xasprintf ("%s%s", prefix_drive ? : "", relative_grubdir); @@ -440,7 +460,7 @@ V18: grub_install_make_image_wrap (/* source dir */ grub_install_source_directory, /*prefix */ prefix, /* output */ imgfile, -@@ -1623,6 +1658,10 @@ main (int argc, char *argv[]) +@@ -1658,6 +1693,10 @@ main (int argc, char *argv[]) /* image target */ mkimage_target, 0); } break; @@ -450,8 +470,8 @@ V18: + case GRUB_INSTALL_PLATFORM_ARM_EFI: case GRUB_INSTALL_PLATFORM_ARM64_EFI: - case GRUB_INSTALL_PLATFORM_IA64_EFI: -@@ -1885,6 +1924,10 @@ main (int argc, char *argv[]) + case GRUB_INSTALL_PLATFORM_RISCV32_EFI: +@@ -1934,6 +1973,10 @@ main (int argc, char *argv[]) } break; @@ -462,8 +482,10 @@ V18: 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 -+++ b/util/s390x/dracut-grub2.sh.in ++++ grub-2.04~rc1/util/s390x/dracut-grub2.sh.in @@ -0,0 +1,126 @@ +#!/bin/sh +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- @@ -494,7 +516,7 @@ V18: + checksnap() { + if [ -e /sysroot/.snapshots/grub-snapshot.cfg ]; then + echo true -+ elif grep -qE '^[^#\s]+\s+/.snapshots\s+' /sysroot/etc/fstab; then ++ elif grep -qP '^[^#\s]+\s+/.snapshots\s+' /sysroot/etc/fstab; then + echo false + else + echo true @@ -560,8 +582,8 @@ V18: + 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/usr/share/grub2/zipl-refresh ]; then -+ setsid $CTTY -- /sysroot/usr/share/grub2/zipl-refresh 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 [ $? != 0 ]; then + warn "Not continuing" + emergency_shell -n grub2-emu-zipl-refresh @@ -591,8 +613,10 @@ V18: + fi +fi + +Index: grub-2.04~rc1/util/s390x/dracut-module-setup.sh.in +=================================================================== --- /dev/null -+++ b/util/s390x/dracut-module-setup.sh.in ++++ grub-2.04~rc1/util/s390x/dracut-module-setup.sh.in @@ -0,0 +1,19 @@ +#!/bin/bash +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- @@ -613,8 +637,10 @@ V18: + #inst_multiple grub2-emu kexec +} + +Index: grub-2.04~rc1/util/s390x/zipl2grub.conf.in +=================================================================== --- /dev/null -+++ b/util/s390x/zipl2grub.conf.in ++++ grub-2.04~rc1/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. @@ -642,8 +668,10 @@ V18: + 1 = grub2 + 2 = skip-grub2 + +Index: grub-2.04~rc1/util/s390x/zipl2grub.pl.in +=================================================================== --- /dev/null -+++ b/util/s390x/zipl2grub.pl.in ++++ grub-2.04~rc1/util/s390x/zipl2grub.pl.in @@ -0,0 +1,423 @@ +#!/usr/bin/perl +use strict; @@ -1068,14 +1096,16 @@ V18: +System( @C); +exit( $miss); + +Index: grub-2.04~rc1/util/s390x/dracut-zipl-refresh.sh.in +=================================================================== --- /dev/null -+++ b/util/s390x/dracut-zipl-refresh.sh.in ++++ grub-2.04~rc1/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=60 ++TIMEOUT=300 +[ -n "$SYSROOT" ] || +SYSROOT=/sysroot +[ -d $SYSROOT/boot ] || SYSROOT= @@ -1157,7 +1187,7 @@ V18: + 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... " ++ Press 'c[Enter]' to interrupt, any other input will proceed... " + +trap interrupted=1 INT +interrupted=0 diff --git a/grub2-secureboot-add-linuxefi.patch b/grub2-secureboot-add-linuxefi.patch index d1a6eca..2035b3b 100644 --- a/grub2-secureboot-add-linuxefi.patch +++ b/grub2-secureboot-add-linuxefi.patch @@ -6,6 +6,13 @@ References: fate#314485 Patch-Mainline: no Signed-off-by: Michael Chang + +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 ++++ @@ -15,11 +22,11 @@ Signed-off-by: Michael Chang 5 files changed, 415 insertions(+), 0 deletions(-) create mode 100644 grub-core/loader/i386/efi/linux.c -Index: grub-2.02~beta2/grub-core/Makefile.core.def +Index: grub-2.04~rc1/grub-core/Makefile.core.def =================================================================== ---- grub-2.02~beta2.orig/grub-core/Makefile.core.def -+++ grub-2.02~beta2/grub-core/Makefile.core.def -@@ -1691,6 +1691,14 @@ module = { +--- grub-2.04~rc1.orig/grub-core/Makefile.core.def ++++ grub-2.04~rc1/grub-core/Makefile.core.def +@@ -1850,6 +1850,14 @@ module = { }; module = { @@ -34,13 +41,13 @@ Index: grub-2.02~beta2/grub-core/Makefile.core.def name = chain; efi = loader/efi/chainloader.c; i386_pc = loader/i386/pc/chainloader.c; -Index: grub-2.02~beta2/grub-core/kern/efi/mm.c +Index: grub-2.04~rc1/grub-core/kern/efi/mm.c =================================================================== ---- 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; +--- 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 + } + } +/* Allocate pages below a specified address */ +void * @@ -76,12 +83,12 @@ Index: grub-2.02~beta2/grub-core/kern/efi/mm.c + /* Allocate pages. Return the pointer to the first of allocated pages. */ void * - grub_efi_allocate_pages (grub_efi_physical_address_t address, -Index: grub-2.02~beta2/grub-core/loader/i386/efi/linux.c + grub_efi_allocate_pages_real (grub_efi_physical_address_t address, +Index: grub-2.04~rc1/grub-core/loader/i386/efi/linux.c =================================================================== --- /dev/null -+++ grub-2.02~beta2/grub-core/loader/i386/efi/linux.c -@@ -0,0 +1,371 @@ ++++ grub-2.04~rc1/grub-core/loader/i386/efi/linux.c +@@ -0,0 +1,342 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2012 Free Software Foundation, Inc. @@ -124,32 +131,6 @@ Index: grub-2.02~beta2/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 @@ -215,8 +196,8 @@ Index: grub-2.02~beta2/grub-core/loader/i386/efi/linux.c + + for (i = 0; i < argc; i++) + { -+ grub_file_filter_disable_compression (); -+ files[i] = grub_file_open (argv[i]); ++ files[i] = grub_file_open (argv[i], GRUB_FILE_TYPE_LINUX_INITRD ++ | GRUB_FILE_TYPE_NO_DECOMPRESS); + if (! files[i]) + goto fail; + nfiles++; @@ -269,9 +250,10 @@ Index: grub-2.02~beta2/grub-core/loader/i386/efi/linux.c + int argc, char *argv[]) +{ + grub_file_t file = 0; -+ struct linux_kernel_header lh; ++ struct linux_i386_kernel_header lh; + grub_ssize_t len, start, filelen; + void *kernel; ++ grub_err_t err; + + grub_dl_ref (my_mod); + @@ -281,7 +263,7 @@ Index: grub-2.02~beta2/grub-core/loader/i386/efi/linux.c + goto fail; + } + -+ file = grub_file_open (argv[0]); ++ file = grub_file_open (argv[0], GRUB_FILE_TYPE_LINUX_KERNEL); + if (! file) + goto fail; + @@ -301,13 +283,6 @@ Index: grub-2.02~beta2/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); @@ -364,9 +339,12 @@ Index: grub-2.02~beta2/grub-core/loader/i386/efi/linux.c + } + + grub_memcpy (linux_cmdline, LINUX_IMAGE, sizeof (LINUX_IMAGE)); -+ grub_create_loader_cmdline (argc, argv, ++ err = grub_create_loader_cmdline (argc, argv, + linux_cmdline + sizeof (LINUX_IMAGE) - 1, -+ lh.cmdline_size - (sizeof (LINUX_IMAGE) - 1)); ++ lh.cmdline_size - (sizeof (LINUX_IMAGE) - 1), ++ GRUB_VERIFY_KERNEL_CMDLINE); ++ if (err) ++ goto fail; + + lh.cmd_line_ptr = (grub_uint32_t)(grub_addr_t)linux_cmdline; + @@ -375,7 +353,7 @@ Index: grub-2.02~beta2/grub-core/loader/i386/efi/linux.c + start = (lh.setup_sects + 1) * 512; + len = grub_file_size(file) - start; + -+ kernel_mem = grub_efi_allocate_pages(lh.pref_address, ++ kernel_mem = grub_efi_allocate_fixed (lh.pref_address, + BYTES_TO_PAGES(lh.init_size)); + + if (!kernel_mem) @@ -453,29 +431,17 @@ Index: grub-2.02~beta2/grub-core/loader/i386/efi/linux.c + grub_unregister_command (cmd_linux); + grub_unregister_command (cmd_initrd); +} -Index: grub-2.02~beta2/include/grub/efi/efi.h +Index: grub-2.04~rc1/include/grub/efi/efi.h =================================================================== ---- 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_pages) (grub_efi_physical_address_t address, +--- 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); + void * + EXPORT_FUNC(grub_efi_allocate_any_pages) (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); - 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 + grub_efi_uintn_t EXPORT_FUNC(grub_efi_find_mmap_size) (void); diff --git a/grub2-secureboot-chainloader.patch b/grub2-secureboot-chainloader.patch index a6feafa..2d9ef24 100644 --- a/grub2-secureboot-chainloader.patch +++ b/grub2-secureboot-chainloader.patch @@ -21,10 +21,10 @@ Signed-off-by: Michael Chang grub-core/loader/efi/chainloader.c | 538 +++++++++++++++++++++++++++++++++-- 1 files changed, 507 insertions(+), 31 deletions(-) -Index: grub-2.02~beta2/grub-core/loader/efi/chainloader.c +Index: 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 +--- grub-2.04~rc1.orig/grub-core/loader/efi/chainloader.c ++++ grub-2.04~rc1/grub-core/loader/efi/chainloader.c @@ -40,15 +40,31 @@ #include #endif @@ -65,7 +65,7 @@ Index: grub-2.02~beta2/grub-core/loader/efi/chainloader.c grub_dl_unref (my_mod); return GRUB_ERR_NONE; -@@ -187,12 +204,460 @@ make_file_path (grub_efi_device_path_t * +@@ -197,12 +214,460 @@ make_file_path (grub_efi_device_path_t * return file_path; } @@ -527,7 +527,7 @@ Index: grub-2.02~beta2/grub-core/loader/efi/chainloader.c grub_efi_status_t status; grub_efi_boot_services_t *b; grub_device_t dev = 0; -@@ -200,7 +665,6 @@ grub_cmd_chainloader (grub_command_t cmd +@@ -210,7 +675,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.02~beta2/grub-core/loader/efi/chainloader.c if (argc == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); -@@ -212,9 +676,36 @@ grub_cmd_chainloader (grub_command_t cmd +@@ -222,9 +686,36 @@ grub_cmd_chainloader (grub_command_t cmd address = 0; image_handle = 0; file_path = 0; @@ -569,10 +569,10 @@ Index: grub-2.02~beta2/grub-core/loader/efi/chainloader.c + *(--p16) = 0; + } + - file = grub_file_open (filename); + file = grub_file_open (filename, GRUB_FILE_TYPE_EFI_CHAINLOADED_IMAGE); if (! file) goto fail; -@@ -260,14 +751,14 @@ grub_cmd_chainloader (grub_command_t cmd +@@ -270,14 +761,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.02~beta2/grub-core/loader/efi/chainloader.c status = efi_call_4 (b->allocate_pages, GRUB_EFI_ALLOCATE_ANY_PAGES, GRUB_EFI_LOADER_CODE, -@@ -281,7 +772,7 @@ grub_cmd_chainloader (grub_command_t cmd +@@ -291,7 +782,7 @@ grub_cmd_chainloader (grub_command_t cmd } boot_image = (void *) ((grub_addr_t) address); @@ -599,7 +599,7 @@ Index: grub-2.02~beta2/grub-core/loader/efi/chainloader.c { if (grub_errno == GRUB_ERR_NONE) grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"), -@@ -291,7 +782,7 @@ grub_cmd_chainloader (grub_command_t cmd +@@ -301,7 +792,7 @@ grub_cmd_chainloader (grub_command_t cmd } #if defined (__i386__) || defined (__x86_64__) @@ -608,7 +608,7 @@ Index: grub-2.02~beta2/grub-core/loader/efi/chainloader.c { struct grub_macho_fat_header *head = boot_image; if (head->magic -@@ -314,20 +805,30 @@ grub_cmd_chainloader (grub_command_t cmd +@@ -324,20 +815,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.02~beta2/grub-core/loader/efi/chainloader.c &image_handle); if (status != GRUB_EFI_SUCCESS) { -@@ -350,33 +851,10 @@ grub_cmd_chainloader (grub_command_t cmd +@@ -360,33 +861,10 @@ grub_cmd_chainloader (grub_command_t cmd } loaded_image->device_handle = dev_handle; @@ -678,7 +678,7 @@ Index: grub-2.02~beta2/grub-core/loader/efi/chainloader.c } grub_file_close (file); -@@ -398,6 +876,9 @@ grub_cmd_chainloader (grub_command_t cmd +@@ -408,6 +886,9 @@ grub_cmd_chainloader (grub_command_t cmd if (address) efi_call_2 (b->free_pages, address, pages); diff --git a/grub2-secureboot-install-signed-grub.patch b/grub2-secureboot-install-signed-grub.patch index 09e19c1..1de90a9 100644 --- a/grub2-secureboot-install-signed-grub.patch +++ b/grub2-secureboot-install-signed-grub.patch @@ -17,10 +17,10 @@ Signed-off-by: Michael Chang util/grub-install.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) -Index: grub-2.02/util/grub-install.c +Index: grub-2.04~rc1/util/grub-install.c =================================================================== ---- grub-2.02.orig/util/grub-install.c -+++ grub-2.02/util/grub-install.c +--- grub-2.04~rc1.orig/util/grub-install.c ++++ grub-2.04~rc1/util/grub-install.c @@ -84,6 +84,15 @@ static int suse_enable_tpm = 0; enum @@ -98,7 +98,7 @@ Index: grub-2.02/util/grub-install.c case ARGP_KEY_HELP_POST_DOC: return xasprintf (text, program_name, GRUB_BOOT_DIR_NAME "/" GRUB_DIR_NAME); default: -@@ -1596,13 +1636,34 @@ main (int argc, char *argv[]) +@@ -1627,13 +1667,34 @@ main (int argc, char *argv[]) char mkimage_target[200]; const char *core_name = NULL; @@ -106,7 +106,6 @@ Index: grub-2.02/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) @@ -128,14 +127,14 @@ Index: grub-2.02/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: - core_name = "core.efi"; - snprintf (mkimage_target, sizeof (mkimage_target), -@@ -1678,13 +1739,75 @@ main (int argc, char *argv[]) +@@ -1703,13 +1764,75 @@ main (int argc, char *argv[]) core_name); char *prefix = xasprintf ("%s%s", prefix_drive ? : "", relative_grubdir); @@ -167,7 +166,7 @@ Index: grub-2.02/util/grub-install.c + else if (prefix_drive) + { + char *uuid = NULL; -+ if (grub_fs->uuid && grub_fs->uuid (grub_dev, &uuid)) ++ if (grub_fs->fs_uuid && grub_fs->fs_uuid (grub_dev, &uuid)) + { + grub_print_error (); + grub_errno = 0; @@ -212,7 +211,7 @@ Index: grub-2.02/util/grub-install.c /* Backward-compatibility kludges. */ switch (platform) { -@@ -1950,6 +2073,13 @@ main (int argc, char *argv[]) +@@ -1985,6 +2108,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); diff --git a/grub2-secureboot-no-insmod-on-sb.patch b/grub2-secureboot-no-insmod-on-sb.patch index 79d5a02..68fec61 100644 --- a/grub2-secureboot-no-insmod-on-sb.patch +++ b/grub2-secureboot-no-insmod-on-sb.patch @@ -13,10 +13,10 @@ Signed-off-by: Michael Chang include/grub/efi/efi.h | 1 + 3 files changed, 46 insertions(+) -Index: grub-2.02~beta2/grub-core/kern/dl.c +Index: 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 +--- grub-2.04~rc1.orig/grub-core/kern/dl.c ++++ grub-2.04~rc1/grub-core/kern/dl.c @@ -38,6 +38,10 @@ #define GRUB_MODULES_MACHINE_READONLY #endif @@ -28,7 +28,7 @@ Index: grub-2.02~beta2/grub-core/kern/dl.c #pragma GCC diagnostic ignored "-Wcast-align" -@@ -682,6 +686,19 @@ grub_dl_load_file (const char *filename) +@@ -688,6 +692,19 @@ grub_dl_load_file (const char *filename) grub_boot_time ("Loading module %s", filename); @@ -45,14 +45,14 @@ Index: grub-2.02~beta2/grub-core/kern/dl.c + } +#endif + - file = grub_file_open (filename); + file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE); if (! file) return 0; -Index: grub-2.02~beta2/grub-core/kern/efi/efi.c +Index: grub-2.04~rc1/grub-core/kern/efi/efi.c =================================================================== ---- 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, +--- 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, return NULL; } @@ -87,11 +87,11 @@ Index: grub-2.02~beta2/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.02~beta2/include/grub/efi/efi.h +Index: grub-2.04~rc1/include/grub/efi/efi.h =================================================================== ---- 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 +--- 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 const grub_efi_guid_t *guid, void *data, grub_size_t datasize); diff --git a/grub2-secureboot-provide-linuxefi-config.patch b/grub2-secureboot-provide-linuxefi-config.patch index 3628b26..458d22e 100644 --- a/grub2-secureboot-provide-linuxefi-config.patch +++ b/grub2-secureboot-provide-linuxefi-config.patch @@ -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.02~beta2/util/grub-mkconfig.in +Index: grub-2.04~rc1/util/grub-mkconfig.in =================================================================== ---- 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-2.04~rc1.orig/util/grub-mkconfig.in ++++ grub-2.04~rc1/util/grub-mkconfig.in +@@ -271,7 +271,8 @@ export GRUB_DEFAULT \ GRUB_BADRAM \ GRUB_OS_PROBER_SKIP_LIST \ GRUB_DISABLE_SUBMENU \ @@ -39,11 +39,11 @@ Index: grub-2.02~beta2/util/grub-mkconfig.in if test "x${grub_cfg}" != "x"; then rm -f "${grub_cfg}.new" -Index: grub-2.02~beta2/util/grub.d/10_linux.in +Index: grub-2.04~rc1/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 -@@ -133,7 +133,7 @@ linux_entry () +--- 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 () 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.02~beta2/util/grub.d/10_linux.in sed "s/^/$submenu_indentation/" << EOF echo '$(echo "$message" | grub_quote)' linuxefi ${rel_dirname}/${basename} ${root_device} ${args} -@@ -147,7 +147,7 @@ EOF - if test -n "${initrd}" ; then - # TRANSLATORS: ramdisk isn't identifier. Should be translated. - message="$(gettext_printf "Loading initial ramdisk ...")" +@@ -163,7 +163,7 @@ EOF + for i in ${initrd}; do + initrd_path="${initrd_path} ${rel_dirname}/${i}" + done - 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 ${rel_dirname}/${initrd} + initrdefi $(echo $initrd_path) diff --git a/grub2-secureboot-use-linuxefi-on-uefi.patch b/grub2-secureboot-use-linuxefi-on-uefi.patch index 23c28a6..c417786 100644 --- a/grub2-secureboot-use-linuxefi-on-uefi.patch +++ b/grub2-secureboot-use-linuxefi-on-uefi.patch @@ -11,11 +11,11 @@ Signed-off-by: Michael Chang util/grub.d/10_linux.in | 18 ++++++++++++++++-- 1 files changed, 16 insertions(+), 2 deletions(-) -Index: grub-2.02~beta2/util/grub.d/10_linux.in +Index: grub-2.04~rc1/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 -@@ -133,17 +133,31 @@ linux_entry () +--- 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 () printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/" fi message="$(gettext_printf "Loading Linux %s ..." ${version})" @@ -34,16 +34,20 @@ Index: grub-2.02~beta2/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 ${rel_dirname}/${initrd} ++ initrdefi $(echo $initrd_path) +EOF + else + sed "s/^/$submenu_indentation/" << EOF echo '$(echo "$message" | grub_quote)' - initrd ${rel_dirname}/${initrd} + initrd $(echo $initrd_path) EOF + fi fi diff --git a/grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch b/grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch index 7f0febd..4d35d12 100644 --- a/grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch +++ b/grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch @@ -1,8 +1,11 @@ -Index: grub-2.02/util/setup.c + +V2: Add fs_ prefix to fs functions by upstream commit ad4bfee + +Index: grub-2.04/util/setup.c =================================================================== ---- grub-2.02.orig/util/setup.c -+++ grub-2.02/util/setup.c -@@ -511,8 +511,42 @@ SETUP (const char *dir, +--- grub-2.04.orig/util/setup.c ++++ grub-2.04/util/setup.c +@@ -526,8 +526,42 @@ SETUP (const char *dir, err = grub_util_ldm_embed (dest_dev->disk, &nsec, maxsec, GRUB_EMBED_PCBIOS, §ors); else if (ctx.dest_partmap) @@ -19,14 +22,14 @@ Index: grub-2.02/util/setup.c + grub_fs_t root_fs; + + root_fs = grub_fs_probe (root_dev); -+ if (root_fs && root_fs->embed) ++ if (root_fs && root_fs->fs_embed) + { + grub_disk_addr_t *fs_sectors; + unsigned int fs_nsec; + + fs_sectors = NULL; + fs_nsec = core_sectors; -+ err = root_fs->embed (root_dev, &fs_nsec, maxsec, ++ err = root_fs->fs_embed (root_dev, &fs_nsec, maxsec, + GRUB_EMBED_PCBIOS, &fs_sectors); + if (!err && fs_nsec >= core_sectors) + { @@ -45,9 +48,9 @@ Index: grub-2.02/util/setup.c +#endif + } else - err = fs->embed (dest_dev, &nsec, maxsec, - GRUB_EMBED_PCBIOS, §ors); -@@ -594,7 +628,7 @@ SETUP (const char *dir, + err = fs->fs_embed (dest_dev, &nsec, maxsec, + GRUB_EMBED_PCBIOS, §ors); +@@ -639,7 +673,7 @@ SETUP (const char *dir, /* Write the core image onto the disk. */ for (i = 0; i < nsec; i++) @@ -55,4 +58,4 @@ Index: grub-2.02/util/setup.c + grub_disk_write (core_dev->disk, sectors[i], 0, GRUB_DISK_SECTOR_SIZE, core_img + i * GRUB_DISK_SECTOR_SIZE); - + #endif diff --git a/grub2.changes b/grub2.changes index e15ff15..917c2c7 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,3 +1,92 @@ +------------------------------------------------------------------- +Thu Oct 17 06:34:52 UTC 2019 - Michael Chang + +- 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 @@ -33,7 +122,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 diff --git a/grub2.spec b/grub2.spec index f0bd007..c13a4aa 100644 --- a/grub2.spec +++ b/grub2.spec @@ -142,19 +142,16 @@ BuildRequires: update-bootloader-rpm-macros %define only_x86_64 %{nil} %endif -Version: 2.02 +Version: 2.04 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/ -%define rev 20120622 -Source0: grub-%{version}.tar.xz +Source0: https://ftp.gnu.org/gnu/grub/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 @@ -176,11 +173,9 @@ 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 @@ -208,7 +203,6 @@ 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 @@ -220,15 +214,8 @@ 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 @@ -249,30 +236,22 @@ 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 @@ -283,19 +262,7 @@ 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 @@ -305,22 +272,11 @@ 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 @@ -487,8 +443,7 @@ 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} -a 5 -(cd po && ls *.po | cut -d. -f1 | xargs) >po/LINGUAS +%setup -q -n grub-%{version} %patch1 -p1 %patch2 -p1 %patch3 -p1 @@ -497,11 +452,9 @@ 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 @@ -529,7 +482,6 @@ swap partition while in resuming %patch70 -p1 %patch71 -p1 %patch72 -p1 -%patch74 -p1 %patch75 -p1 %patch76 -p1 %patch77 -p1 @@ -541,15 +493,8 @@ 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 @@ -567,24 +512,18 @@ 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 @@ -593,36 +532,15 @@ 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 @@ -636,14 +554,6 @@ 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 @@ -736,7 +646,7 @@ PXE_MODULES="efinet tftp http" CRYPTO_MODULES="luks gcry_rijndael gcry_sha1 gcry_sha256" %ifarch x86_64 -CD_MODULES="${CD_MODULES} linuxefi" +CD_MODULES="${CD_MODULES} shim_lock linuxefi" %else CD_MODULES="${CD_MODULES} linux" %endif @@ -744,8 +654,10 @@ 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 @@ -824,7 +736,10 @@ cd .. %ifarch %{efi} cd build-efi %make_install -install -m 644 grub.efi grub-tpm.efi %{buildroot}/%{_datadir}/%{name}/%{grubefiarch}/. +install -m 644 grub.efi %{buildroot}/%{_datadir}/%{name}/%{grubefiarch}/. +%ifarch x86_64 +install -m 644 grub-tpm.efi %{buildroot}/%{_datadir}/%{name}/%{grubefiarch}/. +%endif # Create grub.efi link to system efi directory # This is for tools like kiwi not fiddling with the path @@ -845,7 +760,10 @@ EoM %ifarch x86_64 aarch64 %if 0%{?suse_version} >= 1230 || 0%{?suse_version} == 1110 -export BRP_PESIGN_FILES="%{_datadir}/%{name}/%{grubefiarch}/grub.efi %{_datadir}/%{name}/%{grubefiarch}/grub-tpm.efi" +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 install -m 444 grub.der %{buildroot}/%{sysefidir}/ %endif %endif @@ -1252,7 +1170,9 @@ 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 diff --git a/translations-20170427.tar.xz b/translations-20170427.tar.xz deleted file mode 100644 index ea0bb13..0000000 --- a/translations-20170427.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2793b20ede25e0d3a63ab5939a4fca6786d40d09946711350f8bf3cf9639f079 -size 585860 diff --git a/unix-exec-avoid-atexit-handlers-when-child-exits.patch b/unix-exec-avoid-atexit-handlers-when-child-exits.patch deleted file mode 100644 index 3a5fcfb..0000000 --- a/unix-exec-avoid-atexit-handlers-when-child-exits.patch +++ /dev/null @@ -1,70 +0,0 @@ -From: Patrick Steinhardt -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 ---- - 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)) diff --git a/use-grub2-as-a-package-name.patch b/use-grub2-as-a-package-name.patch index a8281a8..9639a42 100644 --- a/use-grub2-as-a-package-name.patch +++ b/use-grub2-as-a-package-name.patch @@ -12,16 +12,16 @@ Signed-off-by: Jiri Slaby configure.ac | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) -Index: grub-2.02/configure.ac +Index: grub-2.04/configure.ac =================================================================== ---- grub-2.02.orig/configure.ac -+++ grub-2.02/configure.ac +--- grub-2.04.orig/configure.ac ++++ grub-2.04/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.02],[bug-grub@gnu.org]) -+AC_INIT([GRUB2],[2.02],[bug-grub@gnu.org]) +-AC_INIT([GRUB],[2.04],[bug-grub@gnu.org]) ++AC_INIT([GRUB2],[2.04],[bug-grub@gnu.org]) AC_CONFIG_AUX_DIR([build-aux]) From e774d7b0f36d3c0b8013ed194812740806a6a6f4a6d7b05c093259fed118845d Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Wed, 23 Oct 2019 06:48:57 +0000 Subject: [PATCH 57/57] Accepting request 741989 from openSUSE:Factory Revert, https://bugzilla.opensuse.org/show_bug.cgi?id=1154809 OBS-URL: https://build.opensuse.org/request/show/741989 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=211 --- ...n-GRUB2-accesses-non-enabled-MMIO-da.patch | 46 + ...ix-packed-not-aligned-error-on-GCC-8.patch | 67 ++ ...d-support-for-UEFI-network-protocols.patch | 330 ++++++-- ...sable-gcc9-Waddress-of-packed-member.patch | 75 ++ ...lid-character-recongition-in-strto-l.patch | 37 + ...nitialize-structs-in-bootpath-parser.patch | 36 + 0001-tpm-Core-TPM-support.patch | 785 ++++++++++++++++++ ...lt-tsc-calibration-method-to-pmtimer.patch | 29 + ...Accept-filesystem-with-sparse-inodes.patch | 57 ++ 0002-Add-Virtual-LAN-support.patch | 360 ++++++++ ...sable-gcc9-Waddress-of-packed-member.patch | 55 ++ 0002-tpm-Measure-kernel-initrd.patch | 39 + 0003-bootp-New-net_bootp6-command.patch | 65 +- ...gcc9-error-Waddress-of-packed-member.patch | 37 + 0003-tpm-Add-BIOS-boot-measurement.patch | 179 ++++ ...-error-with-Waddress-of-packed-membe.patch | 148 ++++ 0004-tpm-Rework-linux-command.patch | 104 +++ ...gcc9-error-Waddress-of-packed-member.patch | 52 ++ 0005-tpm-Rework-linux16-command.patch | 101 +++ ...essing-DHCPACK-packet-from-HTTP-Boot.patch | 106 ++- ...re-kernel-and-initrd-on-BIOS-systems.patch | 84 ++ ...sable-gcc9-Waddress-of-packed-member.patch | 51 ++ ...gcc9-error-Waddress-of-packed-member.patch | 64 ++ 0007-tpm-Measure-the-kernel-commandline.patch | 43 + ...gcc9-error-Waddress-of-packed-member.patch | 83 ++ ...etting-DNS-server-from-UEFI-protocol.patch | 31 +- 0008-tpm-Measure-commands.patch | 60 ++ ...Measure-multiboot-images-and-modules.patch | 73 ++ 0010-tpm-Fix-boot-when-there-s-no-TPM.patch | 29 + 0011-tpm-Fix-build-error.patch | 74 ++ 0012-tpm-Build-tpm-as-module.patch | 463 ++++++++++- 0013-tpm-i386-pc-diskboot-img.patch | 148 ++++ grub-2.02.tar.xz | 3 + grub-2.04.tar.xz | 3 - grub2-Fix-incorrect-netmask-on-ppc64.patch | 15 +- grub2-accept-empty-module.patch | 22 + grub2-binutils2.31.patch | 74 ++ ...-add-ability-to-boot-from-subvolumes.patch | 46 +- grub2-btrfs-09-get-default-subvolume.patch | 14 +- ...mands-introduce-read_file-subcommand.patch | 24 +- grub2-efi-Free-malloc-regions-on-exit.patch | 186 +++++ grub2-efi-HP-workaround.patch | 16 +- grub2-efi-Move-grub_reboot-into-kernel.patch | 122 +++ grub2-efi-chainloader-root.patch | 10 +- grub2-emu-4-all.patch | 62 +- grub2-fix-build-with-flex-2.6.4.patch | 24 + ...ale-en.mo.gz-not-found-error-message.patch | 37 + grub2-freetype-pkgconfig.patch | 165 ++++ grub2-linux.patch | 22 +- grub2-move-initrd-upper.patch | 33 + grub2-msdos-fix-overflow.patch | 46 + grub2-pass-corret-root-for-nfsroot.patch | 54 +- grub2-ppc64-cas-fix-double-free.patch | 29 +- grub2-ppc64-cas-reboot-support.patch | 42 +- grub2-ppc64le-disable-video.patch | 26 +- grub2-ppc64le-memory-map.patch | 24 +- ...-files-added-in-order-to-allow-s390x.patch | 80 +- ...2-s390x-02-kexec-module-added-to-emu.patch | 78 +- grub2-s390x-04-grub2-install.patch | 182 ++-- grub2-secureboot-add-linuxefi.patch | 112 ++- grub2-secureboot-chainloader.patch | 26 +- grub2-secureboot-install-signed-grub.patch | 21 +- grub2-secureboot-no-insmod-on-sb.patch | 26 +- ...2-secureboot-provide-linuxefi-config.patch | 26 +- grub2-secureboot-use-linuxefi-on-uefi.patch | 16 +- ...up-try-fs-embed-if-mbr-gap-too-small.patch | 23 +- grub2.changes | 91 +- grub2.spec | 112 ++- translations-20170427.tar.xz | 3 + ...oid-atexit-handlers-when-child-exits.patch | 70 ++ use-grub2-as-a-package-name.patch | 10 +- 71 files changed, 5095 insertions(+), 791 deletions(-) create mode 100644 0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch create mode 100644 0001-Fix-packed-not-aligned-error-on-GCC-8.patch create mode 100644 0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch create mode 100644 0001-misc-fix-invalid-character-recongition-in-strto-l.patch create mode 100644 0001-ofnet-Initialize-structs-in-bootpath-parser.patch create mode 100644 0001-tpm-Core-TPM-support.patch create mode 100644 0001-tsc-Change-default-tsc-calibration-method-to-pmtimer.patch create mode 100644 0001-xfs-Accept-filesystem-with-sparse-inodes.patch create mode 100644 0002-Add-Virtual-LAN-support.patch create mode 100644 0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch create mode 100644 0002-tpm-Measure-kernel-initrd.patch create mode 100644 0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch create mode 100644 0003-tpm-Add-BIOS-boot-measurement.patch create mode 100644 0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch create mode 100644 0004-tpm-Rework-linux-command.patch create mode 100644 0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch create mode 100644 0005-tpm-Rework-linux16-command.patch create mode 100644 0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch create mode 100644 0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch create mode 100644 0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch create mode 100644 0007-tpm-Measure-the-kernel-commandline.patch create mode 100644 0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch create mode 100644 0008-tpm-Measure-commands.patch create mode 100644 0009-tpm-Measure-multiboot-images-and-modules.patch create mode 100644 0010-tpm-Fix-boot-when-there-s-no-TPM.patch create mode 100644 0011-tpm-Fix-build-error.patch create mode 100644 0013-tpm-i386-pc-diskboot-img.patch create mode 100644 grub-2.02.tar.xz delete mode 100644 grub-2.04.tar.xz create mode 100644 grub2-accept-empty-module.patch create mode 100644 grub2-binutils2.31.patch create mode 100644 grub2-efi-Free-malloc-regions-on-exit.patch create mode 100644 grub2-efi-Move-grub_reboot-into-kernel.patch create mode 100644 grub2-fix-build-with-flex-2.6.4.patch create mode 100644 grub2-fix-locale-en.mo.gz-not-found-error-message.patch create mode 100644 grub2-freetype-pkgconfig.patch create mode 100644 grub2-move-initrd-upper.patch create mode 100644 grub2-msdos-fix-overflow.patch create mode 100644 translations-20170427.tar.xz create mode 100644 unix-exec-avoid-atexit-handlers-when-child-exits.patch diff --git a/0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch b/0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch new file mode 100644 index 0000000..fe17577 --- /dev/null +++ b/0001-Fix-PCIe-LER-when-GRUB2-accesses-non-enabled-MMIO-da.patch @@ -0,0 +1,46 @@ +From 2f06e09673e48f6a91486a8ad38f45c160d537fe Mon Sep 17 00:00:00 2001 +From: "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 +--- + 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 + diff --git a/0001-Fix-packed-not-aligned-error-on-GCC-8.patch b/0001-Fix-packed-not-aligned-error-on-GCC-8.patch new file mode 100644 index 0000000..73efa00 --- /dev/null +++ b/0001-Fix-packed-not-aligned-error-on-GCC-8.patch @@ -0,0 +1,67 @@ +From 721f75ff7de467717658d2de9c20bbb18145790a Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Tested-by: Michael Chang +--- + 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 + diff --git a/0001-add-support-for-UEFI-network-protocols.patch b/0001-add-support-for-UEFI-network-protocols.patch index 7e3344a..0e31f3f 100644 --- a/0001-add-support-for-UEFI-network-protocols.patch +++ b/0001-add-support-for-UEFI-network-protocols.patch @@ -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 #include @@ -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 +#include @@ -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 ++#include ++#define EFI_NET_CMD_PREFIX "net_efi" ++#include ++ ++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 @@ -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 @@ -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 +#include @@ -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 +#include @@ -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 @@ -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 #include @@ -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 + diff --git a/0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch b/0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch new file mode 100644 index 0000000..15b5321 --- /dev/null +++ b/0001-cpio-Disable-gcc9-Waddress-of-packed-member.patch @@ -0,0 +1,75 @@ +From 7ea474c68847757d4c67ffc67f7d714b77c41578 Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Reviewed-by: Daniel Kiper +--- + 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 + diff --git a/0001-misc-fix-invalid-character-recongition-in-strto-l.patch b/0001-misc-fix-invalid-character-recongition-in-strto-l.patch new file mode 100644 index 0000000..a54e3d3 --- /dev/null +++ b/0001-misc-fix-invalid-character-recongition-in-strto-l.patch @@ -0,0 +1,37 @@ +From 0155e49166494624e9fb6ef113ed2c16d4accbb3 Mon Sep 17 00:00:00 2001 +From: Michael Chang +Date: Fri, 29 Jul 2016 17:41:27 +0800 +Subject: [PATCH 1/8] misc: fix invalid character recongition in strto*l + +From: Aaron Miller + +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 + diff --git a/0001-ofnet-Initialize-structs-in-bootpath-parser.patch b/0001-ofnet-Initialize-structs-in-bootpath-parser.patch new file mode 100644 index 0000000..e815b26 --- /dev/null +++ b/0001-ofnet-Initialize-structs-in-bootpath-parser.patch @@ -0,0 +1,36 @@ +From ddd47864e98cb32a718075bab4462dc56919ec6c Mon Sep 17 00:00:00 2001 +From: Julian Andres Klode +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 +--- + 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; diff --git a/0001-tpm-Core-TPM-support.patch b/0001-tpm-Core-TPM-support.patch new file mode 100644 index 0000000..103b6cf --- /dev/null +++ b/0001-tpm-Core-TPM-support.patch @@ -0,0 +1,785 @@ +From 866eb2103187d84f2e02c262cfdd1a388acfec15 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include + #include ++#include + + /* 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++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 ++#include ++#include ++#include ++#include ++#include ++ ++#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, ®s); ++ ++ 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, ®s); ++ ++ 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, ®s); ++ ++ 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 ++#include ++#include ++#include ++#include ++#include ++ ++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 . ++ */ ++ ++#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 . ++ */ ++ ++#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 diff --git a/0001-tsc-Change-default-tsc-calibration-method-to-pmtimer.patch b/0001-tsc-Change-default-tsc-calibration-method-to-pmtimer.patch new file mode 100644 index 0000000..4180f5f --- /dev/null +++ b/0001-tsc-Change-default-tsc-calibration-method-to-pmtimer.patch @@ -0,0 +1,29 @@ +From 446794de8da4329ea532cbee4ca877bcafd0e534 Mon Sep 17 00:00:00 2001 +From: "David E. Box" +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 +Reviewed-by: Daniel Kiper +--- + 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 diff --git a/0001-xfs-Accept-filesystem-with-sparse-inodes.patch b/0001-xfs-Accept-filesystem-with-sparse-inodes.patch new file mode 100644 index 0000000..a28b11a --- /dev/null +++ b/0001-xfs-Accept-filesystem-with-sparse-inodes.patch @@ -0,0 +1,57 @@ +From cda0a857dd7a27cd5d621747464bfe71e8727fff Mon Sep 17 00:00:00 2001 +From: Daniel Kiper +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 +Reviewed-by: Daniel Kiper +Tested-by: Chris Murphy +--- + 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 diff --git a/0002-Add-Virtual-LAN-support.patch b/0002-Add-Virtual-LAN-support.patch new file mode 100644 index 0000000..541f2ee --- /dev/null +++ b/0002-Add-Virtual-LAN-support.patch @@ -0,0 +1,360 @@ +From d17c80ca8de35f8cb06175965d428bdabbda3c19 Mon Sep 17 00:00:00 2001 +From: Paulo Flabiano Smorigo +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 + #include ++#include + #include + #include + #include +@@ -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 + + 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, diff --git a/0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch b/0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch new file mode 100644 index 0000000..ed3a280 --- /dev/null +++ b/0002-jfs-Disable-gcc9-Waddress-of-packed-member.patch @@ -0,0 +1,55 @@ +From 4f4128defdec0958f7a38736e2c9be2368a5a6da Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Reviewed-by: Daniel Kiper +--- + 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 + diff --git a/0002-tpm-Measure-kernel-initrd.patch b/0002-tpm-Measure-kernel-initrd.patch new file mode 100644 index 0000000..c865b07 --- /dev/null +++ b/0002-tpm-Measure-kernel-initrd.patch @@ -0,0 +1,39 @@ +From b3afe6ad07192d3f38875e30b57a785ac3b1ea27 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include + #include ++#include + + 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]); diff --git a/0003-bootp-New-net_bootp6-command.patch b/0003-bootp-New-net_bootp6-command.patch index 35cede2..79edd45 100644 --- a/0003-bootp-New-net_bootp6-command.patch +++ b/0003-bootp-New-net_bootp6-command.patch @@ -14,10 +14,10 @@ Signed-off-by: Ken Lin 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 #include @@ -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 + diff --git a/0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch b/0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch new file mode 100644 index 0000000..8b5753c --- /dev/null +++ b/0003-hfs-Fix-gcc9-error-Waddress-of-packed-member.patch @@ -0,0 +1,37 @@ +From 0e49748fad8e036d9875785e57c577214e699941 Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Reviewed-by: Daniel Kiper +--- + 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 + diff --git a/0003-tpm-Add-BIOS-boot-measurement.patch b/0003-tpm-Add-BIOS-boot-measurement.patch new file mode 100644 index 0000000..21ce113 --- /dev/null +++ b/0003-tpm-Add-BIOS-boot-measurement.patch @@ -0,0 +1,179 @@ +From e12373683b894f22c2e35dc3732440a4e9053d61 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include + ++#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 + diff --git a/0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch b/0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch new file mode 100644 index 0000000..cce9e47 --- /dev/null +++ b/0004-hfsplus-Fix-gcc9-error-with-Waddress-of-packed-membe.patch @@ -0,0 +1,148 @@ +From 621024090b7729c8c698c8ab916d792846d20818 Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Reviewed-by: Daniel Kiper +--- + 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 + diff --git a/0004-tpm-Rework-linux-command.patch b/0004-tpm-Rework-linux-command.patch new file mode 100644 index 0000000..e36626e --- /dev/null +++ b/0004-tpm-Rework-linux-command.patch @@ -0,0 +1,104 @@ +From 9f12cf163e56d3b5f03c8a5da94dc501032312eb Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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); + diff --git a/0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch b/0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch new file mode 100644 index 0000000..9d3a6ca --- /dev/null +++ b/0005-acpi-Fix-gcc9-error-Waddress-of-packed-member.patch @@ -0,0 +1,52 @@ +From 0b1bf3932f1b1700d3c8a997e4850fb9a013569d Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Reviewed-by: Daniel Kiper +--- + 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 + diff --git a/0005-tpm-Rework-linux16-command.patch b/0005-tpm-Rework-linux16-command.patch new file mode 100644 index 0000000..d97a195 --- /dev/null +++ b/0005-tpm-Rework-linux16-command.patch @@ -0,0 +1,101 @@ +From f8f66cdcb66dba05353887b3be0d715d54efdea8 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + diff --git a/0006-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch b/0006-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch index a252ba4..fd0d536 100644 --- a/0006-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch +++ b/0006-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch @@ -21,23 +21,32 @@ Signed-off-by: Ken Lin 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 + diff --git a/0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch b/0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch new file mode 100644 index 0000000..9148a83 --- /dev/null +++ b/0006-tpm-Measure-kernel-and-initrd-on-BIOS-systems.patch @@ -0,0 +1,84 @@ +From f0b411214ccc309f2f126d558e2777469d538ca2 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include + #include ++#include + + 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 + #include + #include ++#include + + 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 + #include + #include ++#include + + 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) diff --git a/0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch b/0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch new file mode 100644 index 0000000..a33cb2f --- /dev/null +++ b/0006-usbtest-Disable-gcc9-Waddress-of-packed-member.patch @@ -0,0 +1,51 @@ +From 85e08e174e15c497c4387c16e92243e6ed05feb6 Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Reviewed-by: Daniel Kiper +--- + 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 + diff --git a/0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch b/0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch new file mode 100644 index 0000000..cd4596c --- /dev/null +++ b/0007-chainloader-Fix-gcc9-error-Waddress-of-packed-member.patch @@ -0,0 +1,64 @@ +From 4868e17507dfebf2894079ad6b4876e612706f30 Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Reviewed-by: Daniel Kiper +--- + 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 + diff --git a/0007-tpm-Measure-the-kernel-commandline.patch b/0007-tpm-Measure-the-kernel-commandline.patch new file mode 100644 index 0000000..87e0056 --- /dev/null +++ b/0007-tpm-Measure-the-kernel-commandline.patch @@ -0,0 +1,43 @@ +From aa88827e5b6ca073d0a67e86c5d6581445de988b Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include ++#include + + 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 + diff --git a/0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch b/0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch new file mode 100644 index 0000000..1304fb3 --- /dev/null +++ b/0008-efi-Fix-gcc9-error-Waddress-of-packed-member.patch @@ -0,0 +1,83 @@ +From 4dd4ceec023111a4ccf69f8de6fa0885c6847a35 Mon Sep 17 00:00:00 2001 +From: Michael Chang +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 +Reviewed-by: Daniel Kiper +--- + 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 + diff --git a/0008-efinet-Setting-DNS-server-from-UEFI-protocol.patch b/0008-efinet-Setting-DNS-server-from-UEFI-protocol.patch index f3aebb8..1818217 100644 --- a/0008-efinet-Setting-DNS-server-from-UEFI-protocol.patch +++ b/0008-efinet-Setting-DNS-server-from-UEFI-protocol.patch @@ -32,10 +32,10 @@ Signed-off-by: Ken Lin 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 + diff --git a/0008-tpm-Measure-commands.patch b/0008-tpm-Measure-commands.patch new file mode 100644 index 0000000..607b0b3 --- /dev/null +++ b/0008-tpm-Measure-commands.patch @@ -0,0 +1,60 @@ +From 959e235378adef1477d14d7546c549b7619eb5f1 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #endif ++#include + + /* 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; diff --git a/0009-tpm-Measure-multiboot-images-and-modules.patch b/0009-tpm-Measure-multiboot-images-and-modules.patch new file mode 100644 index 0000000..293fd0d --- /dev/null +++ b/0009-tpm-Measure-multiboot-images-and-modules.patch @@ -0,0 +1,73 @@ +From fd82340829d9fce685f80163ddb6ee3399929c3c Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + #include + #include ++#include + + #ifdef GRUB_MACHINE_EFI + #include +@@ -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 + #include + #include ++#include + + 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 + #include + #include ++#include + + #if defined (GRUB_MACHINE_EFI) + #include +@@ -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) diff --git a/0010-tpm-Fix-boot-when-there-s-no-TPM.patch b/0010-tpm-Fix-boot-when-there-s-no-TPM.patch new file mode 100644 index 0000000..d10fd00 --- /dev/null +++ b/0010-tpm-Fix-boot-when-there-s-no-TPM.patch @@ -0,0 +1,29 @@ +From c9016d2ae0abc5edcb4dcf4b1ce04f138f6e5a67 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +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 + diff --git a/0011-tpm-Fix-build-error.patch b/0011-tpm-Fix-build-error.patch new file mode 100644 index 0000000..41542c9 --- /dev/null +++ b/0011-tpm-Fix-build-error.patch @@ -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, diff --git a/0012-tpm-Build-tpm-as-module.patch b/0012-tpm-Build-tpm-as-module.patch index f1007f9..d95d9c3 100644 --- a/0012-tpm-Build-tpm-as-module.patch +++ b/0012-tpm-Build-tpm-as-module.patch @@ -1,14 +1,442 @@ From 54b6ba5f27dd9eb9ec2f1a41e7160964ab94451c Mon Sep 17 00:00:00 2001 From: Michael Chang 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 + #include + ++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 + #include + #include ++#include + +-#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 + #include + ++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; diff --git a/0013-tpm-i386-pc-diskboot-img.patch b/0013-tpm-i386-pc-diskboot-img.patch new file mode 100644 index 0000000..473d1bb --- /dev/null +++ b/0013-tpm-i386-pc-diskboot-img.patch @@ -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 + #include + +-#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"), diff --git a/grub-2.02.tar.xz b/grub-2.02.tar.xz new file mode 100644 index 0000000..99e42af --- /dev/null +++ b/grub-2.02.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:810b3798d316394f94096ec2797909dbf23c858e48f7b3830826b8daa06b7b0f +size 6113260 diff --git a/grub-2.04.tar.xz b/grub-2.04.tar.xz deleted file mode 100644 index 2ac8876..0000000 --- a/grub-2.04.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5292496995ad42dabe843a0192cf2a2c502e7ffcc7479398232b10a472df77d -size 6393864 diff --git a/grub2-Fix-incorrect-netmask-on-ppc64.patch b/grub2-Fix-incorrect-netmask-on-ppc64.patch index 009e1fb..3cf4ba6 100644 --- a/grub2-Fix-incorrect-netmask-on-ppc64.patch +++ b/grub2-Fix-incorrect-netmask-on-ppc64.patch @@ -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) diff --git a/grub2-accept-empty-module.patch b/grub2-accept-empty-module.patch new file mode 100644 index 0000000..302c9b5 --- /dev/null +++ b/grub2-accept-empty-module.patch @@ -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"); diff --git a/grub2-binutils2.31.patch b/grub2-binutils2.31.patch new file mode 100644 index 0000000..b11267a --- /dev/null +++ b/grub2-binutils2.31.patch @@ -0,0 +1,74 @@ +From 842c390469e2c2e10b5aa36700324cd3bde25875 Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" +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 +Reviewed-by: Daniel Kiper +--- + 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 + + diff --git a/grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch b/grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch index e97077d..1de5274 100644 --- a/grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch +++ b/grub2-btrfs-01-add-ability-to-boot-from-subvolumes.patch @@ -21,21 +21,21 @@ Signed-off-by: Jeff Mahoney 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 + #include #include - #include - #include +#include +#include +#include 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, diff --git a/grub2-btrfs-09-get-default-subvolume.patch b/grub2-btrfs-09-get-default-subvolume.patch index d15f42a..5d039c2 100644 --- a/grub2-btrfs-09-get-default-subvolume.patch +++ b/grub2-btrfs-09-get-default-subvolume.patch @@ -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); diff --git a/grub2-commands-introduce-read_file-subcommand.patch b/grub2-commands-introduce-read_file-subcommand.patch index 7190920..a82ebbc 100644 --- a/grub2-commands-introduce-read_file-subcommand.patch +++ b/grub2-commands-introduce-read_file-subcommand.patch @@ -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 #include @@ -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, diff --git a/grub2-efi-Free-malloc-regions-on-exit.patch b/grub2-efi-Free-malloc-regions-on-exit.patch new file mode 100644 index 0000000..c0dc400 --- /dev/null +++ b/grub2-efi-Free-malloc-regions-on-exit.patch @@ -0,0 +1,186 @@ +From 33298c813c36a50ccc881c33c9b6eacfb830c21a Mon Sep 17 00:00:00 2001 +From: Alexander Graf +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 + +--- + +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 + diff --git a/grub2-efi-HP-workaround.patch b/grub2-efi-HP-workaround.patch index 932f534..5b53090 100644 --- a/grub2-efi-HP-workaround.patch +++ b/grub2-efi-HP-workaround.patch @@ -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 #include @@ -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'; diff --git a/grub2-efi-Move-grub_reboot-into-kernel.patch b/grub2-efi-Move-grub_reboot-into-kernel.patch new file mode 100644 index 0000000..11cb458 --- /dev/null +++ b/grub2-efi-Move-grub_reboot-into-kernel.patch @@ -0,0 +1,122 @@ +From dee74e9bd88aa31e38b1e77dc7845930aa1cd60f Mon Sep 17 00:00:00 2001 +From: Alexander Graf +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 + +--- + +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 . +- */ +- +-#include +-#include +-#include +-#include +-#include +-#include +- +-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 + diff --git a/grub2-efi-chainloader-root.patch b/grub2-efi-chainloader-root.patch index be29084..0c588a1 100644 --- a/grub2-efi-chainloader-root.patch +++ b/grub2-efi-chainloader-root.patch @@ -14,16 +14,16 @@ Signed-off-by: Michael Chang 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; diff --git a/grub2-emu-4-all.patch b/grub2-emu-4-all.patch index fcc1c09..38ff1ee 100644 --- a/grub2-emu-4-all.patch +++ b/grub2-emu-4-all.patch @@ -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; diff --git a/grub2-fix-build-with-flex-2.6.4.patch b/grub2-fix-build-with-flex-2.6.4.patch new file mode 100644 index 0000000..d7c2d55 --- /dev/null +++ b/grub2-fix-build-with-flex-2.6.4.patch @@ -0,0 +1,24 @@ +From: Andrei Borzenkov + +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 + diff --git a/grub2-fix-locale-en.mo.gz-not-found-error-message.patch b/grub2-fix-locale-en.mo.gz-not-found-error-message.patch new file mode 100644 index 0000000..df09541 --- /dev/null +++ b/grub2-fix-locale-en.mo.gz-not-found-error-message.patch @@ -0,0 +1,37 @@ +From e7500166b343874447e6abf385a791998c77f4c4 Mon Sep 17 00:00:00 2001 +From: Michael Chang +Date: Wed, 26 Sep 2012 15:55:44 +0800 +Subject: [PATCH] Silence error messages when translations are unavailable + +From: Colin Watson + +References: bnc#771393 + https://savannah.gnu.org/bugs/?35880 +Patch-Mainline: no + +Signed-off-by: Michael Chang +--- + 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; + } + diff --git a/grub2-freetype-pkgconfig.patch b/grub2-freetype-pkgconfig.patch new file mode 100644 index 0000000..068792a --- /dev/null +++ b/grub2-freetype-pkgconfig.patch @@ -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; + }; diff --git a/grub2-linux.patch b/grub2-linux.patch index 446b82b..6463296 100644 --- a/grub2-linux.patch +++ b/grub2-linux.patch @@ -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. diff --git a/grub2-move-initrd-upper.patch b/grub2-move-initrd-upper.patch new file mode 100644 index 0000000..36f4ce9 --- /dev/null +++ b/grub2-move-initrd-upper.patch @@ -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 + # 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 diff --git a/grub2-msdos-fix-overflow.patch b/grub2-msdos-fix-overflow.patch new file mode 100644 index 0000000..886150f --- /dev/null +++ b/grub2-msdos-fix-overflow.patch @@ -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; diff --git a/grub2-pass-corret-root-for-nfsroot.patch b/grub2-pass-corret-root-for-nfsroot.patch index 372a3fb..fd893c6 100644 --- a/grub2-pass-corret-root-for-nfsroot.patch +++ b/grub2-pass-corret-root-for-nfsroot.patch @@ -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. diff --git a/grub2-ppc64-cas-fix-double-free.patch b/grub2-ppc64-cas-fix-double-free.patch index 5f8146b..b086a81 100644 --- a/grub2-ppc64-cas-fix-double-free.patch +++ b/grub2-ppc64-cas-fix-double-free.patch @@ -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));) diff --git a/grub2-ppc64-cas-reboot-support.patch b/grub2-ppc64-cas-reboot-support.patch index 40063f0..422dd2a 100644 --- a/grub2-ppc64-cas-reboot-support.patch +++ b/grub2-ppc64-cas-reboot-support.patch @@ -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 #include @@ -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 #include #include - #include +#ifdef GRUB_MACHINE_IEEE1275 +#include +#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));) diff --git a/grub2-ppc64le-disable-video.patch b/grub2-ppc64le-disable-video.patch index 2380032..24ddbcb 100644 --- a/grub2-ppc64le-disable-video.patch +++ b/grub2-ppc64le-disable-video.patch @@ -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 }; diff --git a/grub2-ppc64le-memory-map.patch b/grub2-ppc64le-memory-map.patch index 44ac4a7..5642585 100644 --- a/grub2-ppc64le-memory-map.patch +++ b/grub2-ppc64le-memory-map.patch @@ -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) { diff --git a/grub2-s390x-01-Changes-made-and-files-added-in-order-to-allow-s390x.patch b/grub2-s390x-01-Changes-made-and-files-added-in-order-to-allow-s390x.patch index e110910..9c2ebe2 100644 --- a/grub2-s390x-01-Changes-made-and-files-added-in-order-to-allow-s390x.patch +++ b/grub2-s390x-01-Changes-made-and-files-added-in-order-to-allow-s390x.patch @@ -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 #include @@ -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 diff --git a/grub2-s390x-02-kexec-module-added-to-emu.patch b/grub2-s390x-02-kexec-module-added-to-emu.patch index a23b780..0e60963 100644 --- a/grub2-s390x-02-kexec-module-added-to-emu.patch +++ b/grub2-s390x-02-kexec-module-added-to-emu.patch @@ -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 #include @@ -214,7 +214,7 @@ Index: grub-2.04~rc1/include/grub/emu/hostfile.h #include 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 @@ -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 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; diff --git a/grub2-s390x-04-grub2-install.patch b/grub2-s390x-04-grub2-install.patch index 0549122..2c75a20 100644 --- a/grub2-s390x-04-grub2-install.patch +++ b/grub2-s390x-04-grub2-install.patch @@ -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 diff --git a/grub2-secureboot-add-linuxefi.patch b/grub2-secureboot-add-linuxefi.patch index 2035b3b..d1a6eca 100644 --- a/grub2-secureboot-add-linuxefi.patch +++ b/grub2-secureboot-add-linuxefi.patch @@ -6,13 +6,6 @@ References: fate#314485 Patch-Mainline: no Signed-off-by: Michael Chang - -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 diff --git a/grub2-secureboot-chainloader.patch b/grub2-secureboot-chainloader.patch index 2d9ef24..a6feafa 100644 --- a/grub2-secureboot-chainloader.patch +++ b/grub2-secureboot-chainloader.patch @@ -21,10 +21,10 @@ Signed-off-by: Michael Chang 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 #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); diff --git a/grub2-secureboot-install-signed-grub.patch b/grub2-secureboot-install-signed-grub.patch index 1de90a9..09e19c1 100644 --- a/grub2-secureboot-install-signed-grub.patch +++ b/grub2-secureboot-install-signed-grub.patch @@ -17,10 +17,10 @@ Signed-off-by: Michael Chang 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); diff --git a/grub2-secureboot-no-insmod-on-sb.patch b/grub2-secureboot-no-insmod-on-sb.patch index 68fec61..79d5a02 100644 --- a/grub2-secureboot-no-insmod-on-sb.patch +++ b/grub2-secureboot-no-insmod-on-sb.patch @@ -13,10 +13,10 @@ Signed-off-by: Michael Chang 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); diff --git a/grub2-secureboot-provide-linuxefi-config.patch b/grub2-secureboot-provide-linuxefi-config.patch index 458d22e..3628b26 100644 --- a/grub2-secureboot-provide-linuxefi-config.patch +++ b/grub2-secureboot-provide-linuxefi-config.patch @@ -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} diff --git a/grub2-secureboot-use-linuxefi-on-uefi.patch b/grub2-secureboot-use-linuxefi-on-uefi.patch index c417786..23c28a6 100644 --- a/grub2-secureboot-use-linuxefi-on-uefi.patch +++ b/grub2-secureboot-use-linuxefi-on-uefi.patch @@ -11,11 +11,11 @@ Signed-off-by: Michael Chang 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 diff --git a/grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch b/grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch index 4d35d12..7f0febd 100644 --- a/grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch +++ b/grub2-setup-try-fs-embed-if-mbr-gap-too-small.patch @@ -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, §ors); 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, §ors); -@@ -639,7 +673,7 @@ SETUP (const char *dir, + err = fs->embed (dest_dev, &nsec, maxsec, + GRUB_EMBED_PCBIOS, §ors); +@@ -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 + diff --git a/grub2.changes b/grub2.changes index 917c2c7..e15ff15 100644 --- a/grub2.changes +++ b/grub2.changes @@ -1,92 +1,3 @@ -------------------------------------------------------------------- -Thu Oct 17 06:34:52 UTC 2019 - Michael Chang - -- 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 @@ -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 diff --git a/grub2.spec b/grub2.spec index c13a4aa..f0bd007 100644 --- a/grub2.spec +++ b/grub2.spec @@ -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 diff --git a/translations-20170427.tar.xz b/translations-20170427.tar.xz new file mode 100644 index 0000000..ea0bb13 --- /dev/null +++ b/translations-20170427.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2793b20ede25e0d3a63ab5939a4fca6786d40d09946711350f8bf3cf9639f079 +size 585860 diff --git a/unix-exec-avoid-atexit-handlers-when-child-exits.patch b/unix-exec-avoid-atexit-handlers-when-child-exits.patch new file mode 100644 index 0000000..3a5fcfb --- /dev/null +++ b/unix-exec-avoid-atexit-handlers-when-child-exits.patch @@ -0,0 +1,70 @@ +From: Patrick Steinhardt +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 +--- + 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)) diff --git a/use-grub2-as-a-package-name.patch b/use-grub2-as-a-package-name.patch index 9639a42..a8281a8 100644 --- a/use-grub2-as-a-package-name.patch +++ b/use-grub2-as-a-package-name.patch @@ -12,16 +12,16 @@ Signed-off-by: Jiri Slaby 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])