aboutsummaryrefslogtreecommitdiffstats
path: root/sys-boot/grub
diff options
context:
space:
mode:
authorPA4WDH2021-07-13 19:47:04 +0200
committerPA4WDH2021-07-13 19:47:04 +0200
commit5884c94b1f92c00406d137c9f308c098e5268a59 (patch)
tree8483f1da04bf5cbed41220bafcffa502cae95eaa /sys-boot/grub
downloadunmatched-patchwork-5884c94b1f92c00406d137c9f308c098e5268a59.tar.gz
unmatched-patchwork-5884c94b1f92c00406d137c9f308c098e5268a59.tar.bz2
unmatched-patchwork-5884c94b1f92c00406d137c9f308c098e5268a59.zip
Initial commit
Diffstat (limited to 'sys-boot/grub')
-rw-r--r--sys-boot/grub/Manifest12
-rw-r--r--sys-boot/grub/files/gfxpayload.patch29
-rw-r--r--sys-boot/grub/files/grub-2.02_beta2-KERNEL_GLOBS.patch67
-rw-r--r--sys-boot/grub/files/grub-2.06-add-boot-hartid-to-fdt.patch35
-rw-r--r--sys-boot/grub/files/grub-2.06-linux-riscv.patch416
-rw-r--r--sys-boot/grub/files/grub-2.06-magic-number.patch42
-rw-r--r--sys-boot/grub/files/grub-2.06-test-words.patch25
-rw-r--r--sys-boot/grub/files/grub.default-373
-rw-r--r--sys-boot/grub/grub-2.06.ebuild308
-rw-r--r--sys-boot/grub/metadata.xml32
10 files changed, 1039 insertions, 0 deletions
diff --git a/sys-boot/grub/Manifest b/sys-boot/grub/Manifest
new file mode 100644
index 0000000..f61a2e5
--- /dev/null
+++ b/sys-boot/grub/Manifest
@@ -0,0 +1,12 @@
+AUX gfxpayload.patch 1118 BLAKE2B 4104fc696535b1c3feba5876bccc64f9b2e52319ee992c59e7f17b8310cc9addf7545630fff78c73ca3f4b0dcd44e1bf69f4df5264d6f58777f7e5aeae93cbcb SHA512 00324825c369902a0383b792cd21e161853eadccbdc5abe2420f2d443bf6a74f72be6c15243107b936acd38c3547387c3771dc2cb566003c4c754c9260b4aa00
+AUX grub-2.02_beta2-KERNEL_GLOBS.patch 2121 BLAKE2B 398195f59537d40a4f61eadf5be974b8f9eb56a4eb07b798f0dc18e29588b3a9f8daa8d6e64980a835ec1960fab60b8c96d6552ef2920fe6604170abf7d5e7da SHA512 f85bc538ae647c46efbe07d7b87acf49daa7b07e9752af3aa3f77019f48ea24cd1b6a095a6f9c19d50128701753f453c531b9b068e11ee22a259f3fdf8ac205e
+AUX grub-2.06-add-boot-hartid-to-fdt.patch 995 BLAKE2B 86ab277819eeab08d552e1d5300f8f5e798823e56e66d8dd39ae442b3b4777a22d155dd85f9b38778a644c7f52b61f673b6c856c66492da412d2ee2587125484 SHA512 5d334050165dd648bd3547ede9cc62380f75a5d9625a4282972a4e71e34e14d72cf6acb363c513942375c84c79a48acd6331bbcbc56f4999a339e29391fbb5ae
+AUX grub-2.06-linux-riscv.patch 12599 BLAKE2B bfbb85e8824586d1a13d142020d591e0e103c77c193ef7a82e1770b3ffcd23f6daec9729a9d1cb579d5dcaeb6be40f23682fdab8e2e5c7067b382362faee2c36 SHA512 5f964e98caff6c57fc4ac7d57bbd86c8cc1ab35ca25c58a1e8c7a2db232b7b1470b6fe8a6a372c62fc3bfe939ce64c75027ed4b3d3d4db141b73a709557275c1
+AUX grub-2.06-magic-number.patch 1826 BLAKE2B 83dc3e86b2ae3d96d3459641fda67b47178688410cacdc54ee79ccbab129cabfd1aa087ff1afc6fcdb607c1e183a7b55d54f5c0d5cbca951178129c50b26bb35 SHA512 44e03d1cbef8ca7128c4a91647d1095453f5f9c9aa9329f20bb5af178a766c6ed22b4c2ea3e515bac7b0c977f8248401590a6e76561d86146729c9cc1d931700
+AUX grub-2.06-test-words.patch 2553 BLAKE2B 21d6167945b461be7cc73198451ae0dc15ce0dfe2a301342f1a3bb75d6fcb5d73da9997fb8a93f36dffb43a351f056a1a4db9eed3147b0f3e77c65034b805c64 SHA512 627422377bdad97d0197f178814d6616a0f7ec07357182b00166a455d38ba0c5a60185c5febf4dfb7a11b35f26c7af607508cb5f418acdb7290517240fbd99e4
+AUX grub.default-3 2528 BLAKE2B c32de43644eca5fae8d8d727ff443600917a93e015f8a83dde555e3bca7506a817b08a2fc926970eeb5b7f40028f4951c6cdcd281f9fc0b6504f26c8e76bf0c5 SHA512 505960e62b44c70af0a90c7ff486bd57101831d7c6e9d80084013e374070ff02b40f77b0790aebb926e1e0854e375867cba1d4977dbb00c2ba54ebaa9f6a1a0b
+DIST dejavu-sans-ttf-2.37.zip 417746 BLAKE2B c8904f3cd5a49370a7dc10e456684c88aeae998a99090bf4d0a5baa4f36cc8fb8f70586cf6d610a5ffeee97261d28c80f55bbe9dcfc3ed796d5c2d60e79adb58 SHA512 ede5899daa1984c5aa8cacb1c850eb53f189dddef3d9bb78bf9774d8976b7c0d6eb0bcf86237cd7d11f5b36cf5b5058d42cd94d3bd76f2bd0931c7ceb1271fae
+DIST grub-2.06.tar.xz 6581924 BLAKE2B 2a40b9b03d7bb3b9e7b1309ab274d686f01b3c42e7035ebc6e5a0e59a59c3b7362ba518341664b314cb0dbc8222bb10ea05ce09f08ce9d58a293207cb909e417 SHA512 4f11c648f3078567e53fc0c74d5026fdc6da4be27d188975e79d9a4df817ade0fe5ad2ddd694238a07edc45adfa02943d83c57767dd51548102b375e529e8efe
+DIST unifont-12.1.02.pcf.gz 1335424 BLAKE2B 97080312468e3f3c8aa6f49cef08f5622641e8c9c035f3ede1e09d8d98de4e78d3b23c8aba2e8070eb46cbebd2d55e8568e467d7f15f35aa8fc8db792b7e5f14 SHA512 b280b2db7cf5f480b0668c331130dede2c0cc87d5e02e44566b77787113d0f6604d0105522858288f2ac6b8e77df7a2d9878725013a6c778dc5bfb183156e2f0
+EBUILD grub-2.06.ebuild 7548 BLAKE2B d8c7ba5110cd4b8483a80255e80f3d61c99d8ced45c862ac319c5b5196b3cc2f7d7a4b9eeae378d6c1da01863dec3a7e86ed092559db9c7f47ac46b6be515599 SHA512 aabf4dc758ed3a0fb07f57eede1130f9e48e92c20cfb1992e629c2b4bca0e8e446b28deb7c74f4230b74bbf6240a6e027955133126c9592158afed9ae17e8506
+MISC metadata.xml 985 BLAKE2B 36f108b5d3441f8576609c77ab3547c60ac2c508b55472bd0ec0e3af8d0fa018d305d7267c0e2e84c8526affced9ed5ce51738b9fcf05b31ac36c1b4d5c2702a SHA512 bd28dd88d4eb76a32cfa757eb5bf7641d033f670280ab7230b72a66b1bd8fd65c777473b1d7f81257004a215fe5a858a79a6a912e0ceaecd586867e9a76f6b4e
diff --git a/sys-boot/grub/files/gfxpayload.patch b/sys-boot/grub/files/gfxpayload.patch
new file mode 100644
index 0000000..6c63ef8
--- /dev/null
+++ b/sys-boot/grub/files/gfxpayload.patch
@@ -0,0 +1,29 @@
+From e2d5bf1bc6aaaabeba538c1ca94ea8601e4e1474 Mon Sep 17 00:00:00 2001
+From: Mike Gilbert <floppym@gentoo.org>
+Date: Thu, 16 Oct 2014 23:43:51 -0400
+Subject: [PATCH] 10_linux: Default gfxpayload=keep only when booting using efi
+
+vesafb seems to be unreliable when using BIOS compat mode.
+
+---
+ util/grub.d/10_linux.in | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
+index d2e2a8f..a54b888 100644
+--- a/util/grub.d/10_linux.in
++++ b/util/grub.d/10_linux.in
+@@ -104,7 +104,9 @@ linux_entry ()
+ echo " load_video" | sed "s/^/$submenu_indentation/"
+ if grep -qx "CONFIG_FB_EFI=y" "${config}" 2> /dev/null \
+ && grep -qx "CONFIG_VT_HW_CONSOLE_BINDING=y" "${config}" 2> /dev/null; then
+- echo " set gfxpayload=keep" | sed "s/^/$submenu_indentation/"
++ echo ' if [ "x$grub_platform" = xefi ]; then' | sed "s/^/$submenu_indentation/"
++ echo " set gfxpayload=keep" | sed "s/^/$submenu_indentation/"
++ echo ' fi' | sed "s/^/$submenu_indentation/"
+ fi
+ else
+ if [ "x$GRUB_GFXPAYLOAD_LINUX" != xtext ]; then
+--
+2.7.2
+
diff --git a/sys-boot/grub/files/grub-2.02_beta2-KERNEL_GLOBS.patch b/sys-boot/grub/files/grub-2.02_beta2-KERNEL_GLOBS.patch
new file mode 100644
index 0000000..c66ee68
--- /dev/null
+++ b/sys-boot/grub/files/grub-2.02_beta2-KERNEL_GLOBS.patch
@@ -0,0 +1,67 @@
+From 43e3295aaad5278a1e53c5282e2660b72cd76d28 Mon Sep 17 00:00:00 2001
+From: "Robin H. Johnson" <robbat2@gentoo.org>
+Date: Tue, 29 Dec 2015 15:29:14 -0800
+Subject: [PATCH] GRUB_LINUX_KERNEL_GLOBS: configurable kernel selection
+
+* util/grub.d/10_linux.in: Implement GRUB_LINUX_KERNEL_GLOBS
+* docs/grub.texi: Document GRUB_LINUX_KERNEL_GLOBS
+
+Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
+---
+ docs/grub.texi | 5 +++++
+ util/grub.d/10_linux.in | 21 +++++++++++----------
+ 2 files changed, 16 insertions(+), 10 deletions(-)
+
+diff --git a/docs/grub.texi b/docs/grub.texi
+index 9a25a0b..d1129ec 100644
+--- a/docs/grub.texi
++++ b/docs/grub.texi
+@@ -1490,6 +1490,11 @@ This option may be set to a list of GRUB module names separated by spaces.
+ Each module will be loaded as early as possible, at the start of
+ @file{grub.cfg}.
+
++@item GRUB_LINUX_KERNEL_GLOBS
++This option may be set to override the list of path globs used to find Linux
++kernels. The defaults vary by architecture, and generally include both
++@file{/boot} and @file{/}.
++
+ @end table
+
+ The following options are still accepted for compatibility with existing
+diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
+index 859b608..e5ac11d 100644
+--- a/util/grub.d/10_linux.in
++++ b/util/grub.d/10_linux.in
+@@ -145,18 +145,19 @@ EOF
+ }
+
+ machine=`uname -m`
+-case "x$machine" in
++globs="$GRUB_LINUX_KERNEL_GLOBS"
++[ -z "$globs" ] && case "x$machine" in
+ xi?86 | xx86_64)
+- list=
+- for i in /boot/vmlinuz-* /vmlinuz-* /boot/kernel-* ; do
+- if grub_file_is_not_garbage "$i" ; then list="$list $i" ; fi
+- done ;;
+- *)
+- list=
+- for i in /boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* /boot/kernel-* ; do
+- if grub_file_is_not_garbage "$i" ; then list="$list $i" ; fi
+- done ;;
++ globs="/boot/vmlinuz-* /vmlinuz-* /boot/kernel-*"
++ ;;
++ *)
++ globs="/boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* /boot/kernel-*"
++ ;;
+ esac
++list=
++for i in ${globs} ; do
++ if grub_file_is_not_garbage "$i" ; then list="$list $i" ; fi
++done
+
+ case "$machine" in
+ i?86) GENKERNEL_ARCH="x86" ;;
+--
+2.3.0
+
diff --git a/sys-boot/grub/files/grub-2.06-add-boot-hartid-to-fdt.patch b/sys-boot/grub/files/grub-2.06-add-boot-hartid-to-fdt.patch
new file mode 100644
index 0000000..3b6b464
--- /dev/null
+++ b/sys-boot/grub/files/grub-2.06-add-boot-hartid-to-fdt.patch
@@ -0,0 +1,35 @@
+diff -Naur grub-2.06/grub-core/loader/riscv64/linux.c grub-2.06-mod/grub-core/loader/riscv64/linux.c
+--- grub-2.06/grub-core/loader/riscv64/linux.c 2021-07-03 19:45:08.797409969 +0200
++++ grub-2.06-mod/grub-core/loader/riscv64/linux.c 2021-07-03 19:43:54.673239976 +0200
+@@ -48,6 +48,13 @@
+ static grub_addr_t initrd_start;
+ static grub_addr_t initrd_end;
+
++#define get_hartid(__v) \
++{ \
++ __asm__ __volatile__ ("mv %0, tp" \
++ : "=r" (__v) : \
++ : "memory"); \
++}
++
+ grub_err_t
+ grub_arch_efi_linux_check_image (struct linux_arch_kernel_header * lh)
+ {
+@@ -68,6 +75,7 @@
+ finalize_params_linux (void)
+ {
+ int node, retval;
++ int hartid;
+
+ void *fdt;
+
+@@ -83,6 +91,9 @@
+ if (node < 1)
+ goto failure;
+
++ get_hartid(hartid);
++ grub_fdt_set_prop32 (fdt, node, "boot-hartid", hartid);
++
+ /* Set initrd info */
+ if (initrd_start && initrd_end > initrd_start)
+ {
diff --git a/sys-boot/grub/files/grub-2.06-linux-riscv.patch b/sys-boot/grub/files/grub-2.06-linux-riscv.patch
new file mode 100644
index 0000000..cbc37f8
--- /dev/null
+++ b/sys-boot/grub/files/grub-2.06-linux-riscv.patch
@@ -0,0 +1,416 @@
+Signed-off-by: Nikita Ermakov <arei@altlinux.org>
+---
+ grub-core/Makefile.core.def | 4 +-
+ grub-core/loader/{riscv => riscv32}/linux.c | 0
+ grub-core/loader/riscv64/linux.c | 380 ++++++++++++++++++++
+ 3 files changed, 382 insertions(+), 2 deletions(-)
+ rename grub-core/loader/{riscv => riscv32}/linux.c (100%)
+ create mode 100644 grub-core/loader/riscv64/linux.c
+
+diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
+index 8022e1c0a..655a45de7 100644
+--- a/grub-core/Makefile.core.def
++++ b/grub-core/Makefile.core.def
+@@ -1809,8 +1809,8 @@ module = {
+ arm_efi = loader/arm64/linux.c;
+ arm_uboot = loader/arm/linux.c;
+ arm64 = loader/arm64/linux.c;
+- riscv32 = loader/riscv/linux.c;
+- riscv64 = loader/riscv/linux.c;
++ riscv32 = loader/riscv32/linux.c;
++ riscv64 = loader/riscv64/linux.c;
+ common = loader/linux.c;
+ common = lib/cmdline.c;
+ enable = noemu;
+diff --git a/grub-core/loader/riscv/linux.c b/grub-core/loader/riscv32/linux.c
+similarity index 100%
+rename from grub-core/loader/riscv/linux.c
+rename to grub-core/loader/riscv32/linux.c
+diff --git a/grub-core/loader/riscv64/linux.c b/grub-core/loader/riscv64/linux.c
+new file mode 100644
+index 000000000..630015495
+--- /dev/null
++++ b/grub-core/loader/riscv64/linux.c
+@@ -0,0 +1,380 @@
++/*
++ * GRUB -- GRand Unified Bootloader
++ * Copyright (C) 2018 Free Software Foundation, Inc.
++ *
++ * GRUB is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation, either version 3 of the License, or
++ * (at your option) any later version.
++ *
++ * GRUB is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
++ */
++
++#include <grub/charset.h>
++#include <grub/command.h>
++#include <grub/err.h>
++#include <grub/file.h>
++#include <grub/fdt.h>
++#include <grub/linux.h>
++#include <grub/loader.h>
++#include <grub/mm.h>
++#include <grub/types.h>
++#include <grub/cpu/linux.h>
++#include <grub/efi/efi.h>
++#include <grub/efi/fdtload.h>
++#include <grub/efi/memory.h>
++#include <grub/efi/pe32.h>
++#include <grub/i18n.h>
++#include <grub/lib/cmdline.h>
++#include <grub/verify.h>
++
++GRUB_MOD_LICENSE ("GPLv3+");
++
++static grub_dl_t my_mod;
++static int loaded;
++
++static void *kernel_addr;
++static grub_uint64_t kernel_size;
++
++static char *linux_args;
++static grub_uint32_t cmdline_size;
++
++static grub_addr_t initrd_start;
++static grub_addr_t initrd_end;
++
++grub_err_t
++grub_arch_efi_linux_check_image (struct linux_arch_kernel_header * lh)
++{
++ if (lh->magic != GRUB_LINUX_RISCV_MAGIC_SIGNATURE)
++ return grub_error(GRUB_ERR_BAD_OS, "invalid magic number");
++
++ if ((lh->code0 & 0xffff) != GRUB_PE32_MAGIC)
++ return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
++ N_("plain image kernel not supported - rebuild with CONFIG_(U)EFI_STUB enabled"));
++
++ grub_dprintf ("linux", "UEFI stub kernel:\n");
++ grub_dprintf ("linux", "PE/COFF header @ %08x\n", lh->hdr_offset);
++
++ return GRUB_ERR_NONE;
++}
++
++static grub_err_t
++finalize_params_linux (void)
++{
++ int node, retval;
++
++ void *fdt;
++
++ fdt = grub_fdt_load (GRUB_EFI_LINUX_FDT_EXTRA_SPACE);
++
++ 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;
++
++ return GRUB_ERR_NONE;
++
++failure:
++ grub_fdt_unload();
++ return grub_error(GRUB_ERR_BAD_OS, "failed to install/update FDT");
++}
++
++grub_err_t
++grub_arch_efi_linux_boot_image (grub_addr_t addr, grub_size_t size, char *args)
++{
++ grub_efi_loaded_image_t *loaded_image = NULL;
++ grub_efi_memory_mapped_device_path_t *mempath;
++ grub_efi_handle_t image_handle;
++ grub_efi_boot_services_t *b;
++ grub_efi_status_t status;
++ int len;
++
++ mempath = grub_malloc (2 * sizeof (grub_efi_memory_mapped_device_path_t));
++ if (!mempath)
++ return grub_errno;
++
++ mempath[0].header.type = GRUB_EFI_HARDWARE_DEVICE_PATH_TYPE;
++ mempath[0].header.subtype = GRUB_EFI_MEMORY_MAPPED_DEVICE_PATH_SUBTYPE;
++ mempath[0].header.length = grub_cpu_to_le16_compile_time (sizeof (*mempath));
++ mempath[0].memory_type = GRUB_EFI_LOADER_DATA;
++ mempath[0].start_address = addr;
++ mempath[0].end_address = addr + size;
++
++ mempath[1].header.type = GRUB_EFI_END_DEVICE_PATH_TYPE;
++ mempath[1].header.subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
++ mempath[1].header.length = sizeof (grub_efi_device_path_t);
++
++ b = grub_efi_system_table->boot_services;
++ status = b->load_image (0, grub_efi_image_handle,
++ (grub_efi_device_path_t *) mempath,
++ (void *) addr, size, &image_handle);
++ if (status != GRUB_EFI_SUCCESS)
++ return grub_error (GRUB_ERR_BAD_OS, "cannot load image");
++
++ grub_dprintf ("linux", "linux command line: '%s'\n", args);
++
++ /* Convert command line to UCS-2 */
++ loaded_image = grub_efi_get_loaded_image (image_handle);
++ if (!loaded_image)
++ return grub_error(GRUB_ERR_BAD_OS, "cannot get image");
++ loaded_image->load_options_size = len =
++ (grub_strlen (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_errno;
++
++ loaded_image->load_options_size =
++ 2 * grub_utf8_to_utf16 (loaded_image->load_options, len,
++ (grub_uint8_t *) args, len, NULL);
++
++ grub_dprintf ("linux", "starting image %p\n", image_handle);
++ status = b->start_image (image_handle, 0, NULL);
++
++ /* When successful, not reached */
++ b->unload_image (image_handle);
++ grub_efi_free_pages ((grub_addr_t) loaded_image->load_options,
++ GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size));
++
++ return grub_errno;
++}
++
++static grub_err_t
++grub_linux_boot (void)
++{
++ if (finalize_params_linux () != GRUB_ERR_NONE)
++ return grub_errno;
++
++ return (grub_arch_efi_linux_boot_image((grub_addr_t)kernel_addr,
++ kernel_size, 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;
++}
++
++/* According to the Linux arch/riscv/include/asm/efi.h */
++#define INITRD_MAX_ADDRESS_OFFSET (256ULL << 20)
++
++/*
++ * 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_arch_kernel_header lh;
++ grub_err_t err;
++
++ 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], GRUB_FILE_TYPE_LINUX_KERNEL);
++ if (!file)
++ goto fail;
++
++ kernel_size = grub_file_size (file);
++
++ if (grub_file_read (file, &lh, sizeof (lh)) < (long) sizeof (lh))
++ return grub_errno;
++
++ if (grub_arch_efi_linux_check_image (&lh) != GRUB_ERR_NONE)
++ goto fail;
++
++ grub_loader_unset();
++
++ grub_dprintf ("linux", "kernel file size: %lld\n", (long long) kernel_size);
++ kernel_addr = grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (kernel_size));
++ grub_dprintf ("linux", "kernel numpages: %lld\n",
++ (long long) GRUB_EFI_BYTES_TO_PAGES (kernel_size));
++ if (!kernel_addr)
++ {
++ 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);
++
++ 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));
++ err = grub_create_loader_cmdline (argc, argv,
++ linux_args + sizeof (LINUX_IMAGE) - 1,
++ cmdline_size,
++ GRUB_VERIFY_KERNEL_CMDLINE);
++ if (err)
++ goto fail;
++
++ 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 ("linux", grub_cmd_linux, 0,
++ N_("Load Linux."));
++ cmd_initrd = grub_register_command ("initrd", 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.25.4
diff --git a/sys-boot/grub/files/grub-2.06-magic-number.patch b/sys-boot/grub/files/grub-2.06-magic-number.patch
new file mode 100644
index 0000000..c43e771
--- /dev/null
+++ b/sys-boot/grub/files/grub-2.06-magic-number.patch
@@ -0,0 +1,42 @@
+diff -Naur grub-2.06~rc1/include/grub/riscv32/linux.h grub-2.06~rc1-mod/include/grub/riscv32/linux.h
+--- grub-2.06~rc1/include/grub/riscv32/linux.h 2019-04-23 10:54:47.000000000 +0200
++++ grub-2.06~rc1-mod/include/grub/riscv32/linux.h 2021-07-02 07:33:27.504051015 +0200
+@@ -19,7 +19,7 @@
+ #ifndef GRUB_RISCV32_LINUX_HEADER
+ #define GRUB_RISCV32_LINUX_HEADER 1
+
+-#define GRUB_LINUX_RISCV_MAGIC_SIGNATURE 0x52534356 /* 'RSCV' */
++#define GRUB_LINUX_RISCV_MAGIC_SIGNATURE 0x05435352 /* little endian, 'RSC\x05' */
+
+ /* From linux/Documentation/riscv/booting.txt */
+ struct linux_riscv_kernel_header
+@@ -32,7 +32,7 @@
+ grub_uint64_t res2; /* reserved */
+ grub_uint64_t res3; /* reserved */
+ grub_uint64_t res4; /* reserved */
+- grub_uint32_t magic; /* Magic number, little endian, "RSCV" */
++ grub_uint32_t magic; /* Magic number, little endian, "RSC\x05" */
+ grub_uint32_t hdr_offset; /* Offset of PE/COFF header */
+ };
+
+diff -Naur grub-2.06~rc1/include/grub/riscv64/linux.h grub-2.06~rc1-mod/include/grub/riscv64/linux.h
+--- grub-2.06~rc1/include/grub/riscv64/linux.h 2019-04-23 10:54:47.000000000 +0200
++++ grub-2.06~rc1-mod/include/grub/riscv64/linux.h 2021-07-02 07:35:33.173217754 +0200
+@@ -19,7 +19,7 @@
+ #ifndef GRUB_RISCV64_LINUX_HEADER
+ #define GRUB_RISCV64_LINUX_HEADER 1
+
+-#define GRUB_LINUX_RISCV_MAGIC_SIGNATURE 0x52534356 /* 'RSCV' */
++#define GRUB_LINUX_RISCV_MAGIC_SIGNATURE 0x05435352 /* little endian, 'RSC\x05' */
+
+ #define GRUB_EFI_PE_MAGIC 0x5A4D
+
+@@ -34,7 +34,7 @@
+ grub_uint64_t res2; /* reserved */
+ grub_uint64_t res3; /* reserved */
+ grub_uint64_t res4; /* reserved */
+- grub_uint32_t magic; /* Magic number, little endian, "RSCV" */
++ grub_uint32_t magic; /* Magic number, little endian, "RSC\x05" */
+ grub_uint32_t hdr_offset; /* Offset of PE/COFF header */
+ };
+
diff --git a/sys-boot/grub/files/grub-2.06-test-words.patch b/sys-boot/grub/files/grub-2.06-test-words.patch
new file mode 100644
index 0000000..a3fe060
--- /dev/null
+++ b/sys-boot/grub/files/grub-2.06-test-words.patch
@@ -0,0 +1,25 @@
+From 0f5080a2f3c952e2ee00bd271f42c56bb955dc19 Mon Sep 17 00:00:00 2001
+From: Mike Gilbert <floppym@gentoo.org>
+Date: Sun, 14 Mar 2021 12:44:52 -0400
+Subject: [PATCH] Use /usr/share/dict/words as a 'compressible' file
+
+---
+ tests/util/grub-fs-tester.in | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tests/util/grub-fs-tester.in b/tests/util/grub-fs-tester.in
+index bfc425e1f..efd2977b0 100644
+--- a/tests/util/grub-fs-tester.in
++++ b/tests/util/grub-fs-tester.in
+@@ -265,7 +265,7 @@ for LOGSECSIZE in $(range "$MINLOGSECSIZE" "$MAXLOGSECSIZE" 1); do
+ MASTER="${tempdir}/master"
+ FSLABEL="grub_;/testé莭莽茝😁киритi urewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfewceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfewrewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfewceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfew"
+ CFILESRC=
+- for cand in /usr/share/dict/american-english /usr/share/dict/linux.words /data/data/com.termux/files/usr/share/hunspell/en_US.dic; do
++ for cand in /usr/share/dict/words; do
+ if test -f "$cand" ; then
+ CFILESRC="$cand"
+ break
+--
+2.31.0.rc1
+
diff --git a/sys-boot/grub/files/grub.default-3 b/sys-boot/grub/files/grub.default-3
new file mode 100644
index 0000000..3faabf9
--- /dev/null
+++ b/sys-boot/grub/files/grub.default-3
@@ -0,0 +1,73 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+#
+# To populate all changes in this file you need to regenerate your
+# grub configuration file afterwards:
+# 'grub-mkconfig -o /boot/grub/grub.cfg'
+#
+# See the grub info page for documentation on possible variables and
+# their associated values.
+
+GRUB_DISTRIBUTOR="Gentoo"
+
+# Default menu entry
+#GRUB_DEFAULT=0
+
+# Boot the default entry this many seconds after the menu is displayed
+#GRUB_TIMEOUT=5
+#GRUB_TIMEOUT_STYLE=menu
+
+# Append parameters to the linux kernel command line
+#GRUB_CMDLINE_LINUX=""
+#
+# Examples:
+#
+# Boot with network interface renaming disabled
+# GRUB_CMDLINE_LINUX="net.ifnames=0"
+#
+# Boot with systemd instead of sysvinit (openrc)
+# GRUB_CMDLINE_LINUX="init=/usr/lib/systemd/systemd"
+
+# Append parameters to the linux kernel command line for non-recovery entries
+#GRUB_CMDLINE_LINUX_DEFAULT=""
+
+# Uncomment to disable graphical terminal (grub-pc only)
+#GRUB_TERMINAL=console
+
+# The resolution used on graphical terminal.
+# Note that you can use only modes which your graphic card supports via VBE.
+# You can see them in real GRUB with the command `vbeinfo'.
+#GRUB_GFXMODE=640x480
+
+# Set to 'text' to force the Linux kernel to boot in normal text
+# mode, 'keep' to preserve the graphics mode set using
+# 'GRUB_GFXMODE', 'WIDTHxHEIGHT'['xDEPTH'] to set a particular
+# graphics mode, or a sequence of these separated by commas or
+# semicolons to try several modes in sequence.
+#GRUB_GFXPAYLOAD_LINUX=
+
+# Path to theme spec txt file.
+# The starfield is by default provided with use truetype.
+# NOTE: when enabling custom theme, ensure you have required font/etc.
+#GRUB_THEME="/boot/grub/themes/starfield/theme.txt"
+
+# Background image used on graphical terminal.
+# Can be in various bitmap formats.
+#GRUB_BACKGROUND="/boot/grub/mybackground.png"
+
+# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to kernel
+#GRUB_DISABLE_LINUX_UUID=true
+
+# Uncomment to disable generation of recovery mode menu entries
+#GRUB_DISABLE_RECOVERY=true
+
+# Uncomment to disable generation of the submenu and put all choices on
+# the top-level menu.
+# Besides the visual affect of no sub menu, this makes navigation of the
+# menu easier for a user who can't see the screen.
+#GRUB_DISABLE_SUBMENU=y
+
+# Uncomment to play a tone when the main menu is displayed.
+# This is useful, for example, to allow users who can't see the screen
+# to know when they can make a choice on the menu.
+#GRUB_INIT_TUNE="60 800 1"
diff --git a/sys-boot/grub/grub-2.06.ebuild b/sys-boot/grub/grub-2.06.ebuild
new file mode 100644
index 0000000..15c765a
--- /dev/null
+++ b/sys-boot/grub/grub-2.06.ebuild
@@ -0,0 +1,308 @@
+# Copyright 1999-2021 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+if [[ ${PV} == 9999 ]]; then
+ GRUB_AUTORECONF=1
+ GRUB_BOOTSTRAP=1
+fi
+GRUB_AUTOGEN=1
+GRUB_AUTORECONF=1
+
+PYTHON_COMPAT=( python{2_7,3_{6,7,8,9}} )
+WANT_LIBTOOL=none
+
+if [[ -n ${GRUB_AUTOGEN} || -n ${GRUB_BOOTSTRAP} ]]; then
+ inherit python-any-r1
+fi
+
+if [[ -n ${GRUB_AUTORECONF} ]]; then
+ inherit autotools
+fi
+
+inherit bash-completion-r1 flag-o-matic multibuild optfeature pax-utils toolchain-funcs
+
+if [[ ${PV} != 9999 ]]; then
+ if [[ ${PV} == *_alpha* || ${PV} == *_beta* || ${PV} == *_rc* ]]; then
+ # The quote style is to work with <=bash-4.2 and >=bash-4.3 #503860
+ MY_P=${P/_/'~'}
+ SRC_URI="https://alpha.gnu.org/gnu/${PN}/${MY_P}.tar.xz"
+ S=${WORKDIR}/${MY_P}
+ else
+ SRC_URI="mirror://gnu/${PN}/${P}.tar.xz"
+ S=${WORKDIR}/${P%_*}
+ fi
+ KEYWORDS="~amd64 ~arm ~arm64 ~ia64 ~ppc ~ppc64 ~sparc ~x86"
+else
+ inherit git-r3
+ EGIT_REPO_URI="https://git.savannah.gnu.org/git/grub.git"
+fi
+
+PATCHES=(
+ "${FILESDIR}"/gfxpayload.patch
+ "${FILESDIR}"/grub-2.02_beta2-KERNEL_GLOBS.patch
+ "${FILESDIR}"/grub-2.06-test-words.patch
+ "${FILESDIR}"/grub-2.06-magic-number.patch
+ "${FILESDIR}"/grub-2.06-linux-riscv.patch
+ "${FILESDIR}"/grub-2.06-add-boot-hartid-to-fdt.patch
+)
+
+
+DEJAVU=dejavu-sans-ttf-2.37
+UNIFONT=unifont-12.1.02
+SRC_URI+=" fonts? ( mirror://gnu/unifont/${UNIFONT}/${UNIFONT}.pcf.gz )
+ themes? ( mirror://sourceforge/dejavu/${DEJAVU}.zip )"
+
+DESCRIPTION="GNU GRUB boot loader"
+HOMEPAGE="https://www.gnu.org/software/grub/"
+
+# Includes licenses for dejavu and unifont
+LICENSE="GPL-3+ BSD MIT fonts? ( GPL-2-with-font-exception ) themes? ( CC-BY-SA-3.0 BitstreamVera )"
+SLOT="2/${PVR}"
+IUSE="device-mapper doc efiemu +fonts mount nls sdl test +themes truetype libzfs"
+
+GRUB_ALL_PLATFORMS=( coreboot efi-32 efi-64 emu ieee1275 loongson multiboot qemu qemu-mips pc uboot xen xen-32 xen-pvh efi )
+IUSE+=" ${GRUB_ALL_PLATFORMS[@]/#/grub_platforms_}"
+
+REQUIRED_USE="
+ grub_platforms_coreboot? ( fonts )
+ grub_platforms_qemu? ( fonts )
+ grub_platforms_ieee1275? ( fonts )
+ grub_platforms_loongson? ( fonts )
+"
+
+BDEPEND="
+ ${PYTHON_DEPS}
+ app-misc/pax-utils
+ sys-devel/flex
+ sys-devel/bison
+ sys-apps/help2man
+ sys-apps/texinfo
+ fonts? (
+ media-libs/freetype:2
+ virtual/pkgconfig
+ )
+ test? (
+ app-admin/genromfs
+ app-arch/cpio
+ app-arch/lzop
+ app-emulation/qemu
+ dev-libs/libisoburn
+ sys-apps/miscfiles
+ sys-block/parted
+ sys-fs/squashfs-tools
+ )
+ themes? (
+ app-arch/unzip
+ media-libs/freetype:2
+ virtual/pkgconfig
+ )
+ truetype? ( virtual/pkgconfig )
+"
+DEPEND="
+ app-arch/xz-utils
+ >=sys-libs/ncurses-5.2-r5:0=
+ grub_platforms_emu? (
+ sdl? ( media-libs/libsdl )
+ )
+ device-mapper? ( >=sys-fs/lvm2-2.02.45 )
+ libzfs? ( sys-fs/zfs:= )
+ mount? ( sys-fs/fuse:0 )
+ truetype? ( media-libs/freetype:2= )
+ ppc? ( >=sys-apps/ibm-powerpc-utils-1.3.5 )
+ ppc64? ( >=sys-apps/ibm-powerpc-utils-1.3.5 )
+"
+RDEPEND="${DEPEND}
+ kernel_linux? (
+ grub_platforms_efi-32? ( sys-boot/efibootmgr )
+ grub_platforms_efi-64? ( sys-boot/efibootmgr )
+ )
+ !sys-boot/grub:0
+ nls? ( sys-devel/gettext )
+"
+
+RESTRICT="!test? ( test )"
+
+QA_EXECSTACK="usr/bin/grub-emu* usr/lib/grub/*"
+QA_PRESTRIPPED="usr/lib/grub/.*"
+QA_MULTILIB_PATHS="usr/lib/grub/.*"
+QA_WX_LOAD="usr/lib/grub/*"
+
+pkg_setup() {
+ :
+}
+
+src_unpack() {
+ if [[ ${PV} == 9999 ]]; then
+ git-r3_src_unpack
+ pushd "${P}" >/dev/null || die
+ local GNULIB_URI="https://git.savannah.gnu.org/git/gnulib.git"
+ local GNULIB_REVISION=$(source bootstrap.conf >/dev/null; echo "${GNULIB_REVISION}")
+ git-r3_fetch "${GNULIB_URI}" "${GNULIB_REVISION}"
+ git-r3_checkout "${GNULIB_URI}" gnulib
+ popd >/dev/null || die
+ fi
+ default
+}
+
+src_prepare() {
+ default
+
+ sed -i -e /autoreconf/d autogen.sh || die
+
+ if [[ -n ${GRUB_AUTOGEN} || -n ${GRUB_BOOTSTRAP} ]]; then
+ python_setup
+ else
+ export PYTHON=true
+ fi
+
+ if [[ -n ${GRUB_BOOTSTRAP} ]]; then
+ eautopoint --force
+ AUTOPOINT=: AUTORECONF=: ./bootstrap || die
+ elif [[ -n ${GRUB_AUTOGEN} ]]; then
+ ./autogen.sh || die
+ fi
+
+ if [[ -n ${GRUB_AUTORECONF} ]]; then
+ eautoreconf
+ fi
+}
+
+grub_do() {
+ multibuild_foreach_variant run_in_build_dir "$@"
+}
+
+grub_do_once() {
+ multibuild_for_best_variant run_in_build_dir "$@"
+}
+
+grub_configure() {
+ local platform
+
+ case ${MULTIBUILD_VARIANT} in
+ efi*) platform=efi ;;
+ xen-pvh) platform=xen_pvh ;;
+ xen*) platform=xen ;;
+ guessed) ;;
+ *) platform=${MULTIBUILD_VARIANT} ;;
+ esac
+
+ case ${MULTIBUILD_VARIANT} in
+ *-32)
+ if [[ ${CTARGET:-${CHOST}} == x86_64* ]]; then
+ local CTARGET=i386
+ fi ;;
+ *-64)
+ if [[ ${CTARGET:-${CHOST}} == i?86* ]]; then
+ local CTARGET=x86_64
+ local -x TARGET_CFLAGS="-Os -march=x86-64 ${TARGET_CFLAGS}"
+ local -x TARGET_CPPFLAGS="-march=x86-64 ${TARGET_CPPFLAGS}"
+ fi ;;
+ esac
+
+ local myeconfargs=(
+ --disable-werror
+ --program-prefix=
+ --libdir="${EPREFIX}"/usr/lib
+ $(use_enable device-mapper)
+ $(use_enable mount grub-mount)
+ $(use_enable nls)
+ $(use_enable themes grub-themes)
+ $(use_enable truetype grub-mkfont)
+ $(use_enable libzfs)
+ $(use_enable sdl grub-emu-sdl)
+ ${platform:+--with-platform=}${platform}
+
+ # Let configure detect this where supported
+ $(usex efiemu '' '--disable-efiemu')
+ )
+
+ if use fonts; then
+ ln -rs "${WORKDIR}/${UNIFONT}.pcf" unifont.pcf || die
+ fi
+
+ if use themes; then
+ ln -rs "${WORKDIR}/${DEJAVU}/ttf/DejaVuSans.ttf" DejaVuSans.ttf || die
+ fi
+
+ local ECONF_SOURCE="${S}"
+ econf "${myeconfargs[@]}"
+}
+
+src_configure() {
+ # Bug 508758.
+ replace-flags -O3 -O2
+
+ # We don't want to leak flags onto boot code.
+ export HOST_CCASFLAGS=${CCASFLAGS}
+ export HOST_CFLAGS=${CFLAGS}
+ export HOST_CPPFLAGS=${CPPFLAGS}
+ export HOST_LDFLAGS=${LDFLAGS}
+ unset CCASFLAGS CFLAGS CPPFLAGS LDFLAGS
+
+ tc-ld-disable-gold #439082 #466536 #526348
+ export TARGET_LDFLAGS="${TARGET_LDFLAGS} ${LDFLAGS}"
+ unset LDFLAGS
+
+ tc-export CC NM OBJCOPY RANLIB STRIP
+ tc-export BUILD_CC BUILD_PKG_CONFIG
+
+ MULTIBUILD_VARIANTS=()
+ local p
+ for p in "${GRUB_ALL_PLATFORMS[@]}"; do
+ use "grub_platforms_${p}" && MULTIBUILD_VARIANTS+=( "${p}" )
+ done
+ [[ ${#MULTIBUILD_VARIANTS[@]} -eq 0 ]] && MULTIBUILD_VARIANTS=( guessed )
+ grub_do grub_configure
+}
+
+src_compile() {
+ # Sandbox bug 404013.
+ use libzfs && addpredict /etc/dfs:/dev/zfs
+
+ grub_do emake
+
+ use doc && grub_do_once emake -C docs html
+}
+
+src_test() {
+ # The qemu dependency is a bit complex.
+ # You will need to adjust QEMU_SOFTMMU_TARGETS to match the cpu/platform.
+ grub_do emake check
+}
+
+src_install() {
+ grub_do emake install DESTDIR="${D}" bashcompletiondir="$(get_bashcompdir)"
+ use doc && grub_do_once emake -C docs install-html DESTDIR="${D}"
+
+ einstalldocs
+
+ insinto /etc/default
+ newins "${FILESDIR}"/grub.default-3 grub
+
+ # https://bugs.gentoo.org/231935
+ dostrip -x /usr/lib/grub
+}
+
+pkg_postinst() {
+ elog "For information on how to configure GRUB2 please refer to the guide:"
+ elog " https://wiki.gentoo.org/wiki/GRUB2_Quick_Start"
+
+ if has_version 'sys-boot/grub:0'; then
+ elog "A migration guide for GRUB Legacy users is available:"
+ elog " https://wiki.gentoo.org/wiki/GRUB2_Migration"
+ fi
+
+ if [[ -z ${REPLACING_VERSIONS} ]]; then
+ elog
+ optfeature "detecting other operating systems (grub-mkconfig)" sys-boot/os-prober
+ optfeature "creating rescue media (grub-mkrescue)" dev-libs/libisoburn
+ optfeature "enabling RAID device detection" sys-fs/mdadm
+ fi
+
+ if has_version sys-boot/os-prober; then
+ ewarn "Due to security concerns, os-prober is disabled by default."
+ ewarn "Set GRUB_DISABLE_OS_PROBER=false in /etc/default/grub to enable it."
+ fi
+}
diff --git a/sys-boot/grub/metadata.xml b/sys-boot/grub/metadata.xml
new file mode 100644
index 0000000..a2fdb7a
--- /dev/null
+++ b/sys-boot/grub/metadata.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+<maintainer type="person">
+ <email>floppym@gentoo.org</email>
+ <name>Mike Gilbert</name>
+</maintainer>
+<maintainer type="project">
+ <email>base-system@gentoo.org</email>
+ <name>Gentoo Base System</name>
+</maintainer>
+<use>
+ <flag name="device-mapper">
+ Enable support for device-mapper from <pkg>sys-fs/lvm2</pkg>
+ </flag>
+ <flag name="efiemu">
+ Build and install the efiemu runtimes
+ </flag>
+ <flag name="fonts">Build and install fonts for the gfxterm module</flag>
+ <flag name="mount">
+ Build and install the grub-mount utility
+ </flag>
+ <flag name="libzfs">
+ Enable support for <pkg>sys-fs/zfs</pkg>
+ </flag>
+ <flag name="themes">Build and install GRUB themes (starfield)</flag>
+ <flag name="truetype">Build and install grub-mkfont conversion utility</flag>
+</use>
+<upstream>
+ <remote-id type="cpe">cpe:/a:gnu:grub</remote-id>
+</upstream>
+</pkgmetadata>