aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Lo <kevlo@FreeBSD.org>2021-07-06 11:57:08 +0000
committerKevin Lo <kevlo@FreeBSD.org>2021-07-06 11:57:08 +0000
commit310466c582bf8c7b816ecdf1d26234189aaa3c11 (patch)
tree05aae9b561d28d97f62c59638add200bedeb26e1
parentc0e6f62c86b7a687a2101c83b2f2f140fccff9a0 (diff)
downloadports-310466c582bf8c7b816ecdf1d26234189aaa3c11.tar.gz
ports-310466c582bf8c7b816ecdf1d26234189aaa3c11.zip
sysutils/grub2-pcbsd: fix build with gcc10
Revive grub2-pcbsd and grub2-efi ports. Thanks to lwhsu for valuable input. Approved by: lwhsu
-rw-r--r--MOVED2
-rw-r--r--sysutils/Makefile2
-rw-r--r--sysutils/grub2-efi/Makefile55
-rw-r--r--sysutils/grub2-efi/distinfo3
-rw-r--r--sysutils/grub2-efi/files/patch-grub-core_disk_geli.c12
-rw-r--r--sysutils/grub2-efi/files/patch-grub-core_lib_libgcrypt_src_types.h11
-rw-r--r--sysutils/grub2-efi/files/patch-grub-core_loader_i386_bsd.c185
-rw-r--r--sysutils/grub2-efi/files/patch-grub-core_partmap_gpt.c20
-rw-r--r--sysutils/grub2-efi/files/patch-include_grub_gpt__partition.h17
-rw-r--r--sysutils/grub2-efi/files/patch-include_grub_i386_bsd.h10
-rw-r--r--sysutils/grub2-efi/files/patch-include_grub_i386_freebsd__bootinfo.h36
-rw-r--r--sysutils/grub2-efi/files/patch-po_LINGUAS5
-rw-r--r--sysutils/grub2-efi/pkg-descr8
-rw-r--r--sysutils/grub2-efi/pkg-plist521
-rw-r--r--sysutils/grub2-pcbsd/Makefile91
-rw-r--r--sysutils/grub2-pcbsd/distinfo3
-rw-r--r--sysutils/grub2-pcbsd/files/00_header.in361
-rw-r--r--sysutils/grub2-pcbsd/files/10_kfreebsd.in247
-rw-r--r--sysutils/grub2-pcbsd/files/10_ktrueos.in389
-rw-r--r--sysutils/grub2-pcbsd/files/30_os-prober.in140
-rw-r--r--sysutils/grub2-pcbsd/files/50_otherbe.in396
-rw-r--r--sysutils/grub2-pcbsd/files/patch-configure.ac20
-rw-r--r--sysutils/grub2-pcbsd/files/patch-grub-core_disk_geli.c12
-rw-r--r--sysutils/grub2-pcbsd/files/patch-grub-core_lib_libgcrypt_src_types.h11
-rw-r--r--sysutils/grub2-pcbsd/files/patch-grub-core_loader_i386_bsd.c18
-rw-r--r--sysutils/grub2-pcbsd/files/patch-grub-core_osdep_freebsd_getroot.c108
-rw-r--r--sysutils/grub2-pcbsd/files/patch-grub-core_osdep_unix_getroot.c15
-rw-r--r--sysutils/grub2-pcbsd/files/patch-grub-core_osdep_unix_platform.c100
-rw-r--r--sysutils/grub2-pcbsd/files/patch-grub-core_partmap_gpt.c20
-rw-r--r--sysutils/grub2-pcbsd/files/patch-include_grub_efiemu_runtime.h11
-rw-r--r--sysutils/grub2-pcbsd/files/patch-include_grub_emu_getroot.h11
-rw-r--r--sysutils/grub2-pcbsd/files/patch-include_grub_gpt__partition.h17
-rw-r--r--sysutils/grub2-pcbsd/files/patch-po_LINGUAS5
-rw-r--r--sysutils/grub2-pcbsd/files/patch-util_grub-install.c19
-rw-r--r--sysutils/grub2-pcbsd/files/patch-util_grub-mkconfig.in14
-rw-r--r--sysutils/grub2-pcbsd/files/patch-util_grub-mkconfig__lib.in21
-rw-r--r--sysutils/grub2-pcbsd/files/patch-util_grub-probe.c19
-rw-r--r--sysutils/grub2-pcbsd/pkg-descr11
-rw-r--r--sysutils/grub2-pcbsd/pkg-message40
-rw-r--r--sysutils/grub2-pcbsd/pkg-plist681
40 files changed, 3665 insertions, 2 deletions
diff --git a/MOVED b/MOVED
index ae51b0932fb9..ea9ffff7949e 100644
--- a/MOVED
+++ b/MOVED
@@ -12656,8 +12656,6 @@ net/linuxigd||2019-05-09|Has expired: Abandonware; use net/miniupnpd instead
net/openafs||2019-05-09|Has expired: Broken for more than 6 months
security/quantis||2019-05-09|Has expired: Broken for more than 6 months
sysutils/boxbackup||2019-05-09|Has expired: Broken for more than 6 months
-sysutils/grub2-efi||2019-05-09|Has expired: Broken for more than 6 months
-sysutils/grub2-pcbsd||2019-05-09|Has expired: Broken for more than 6 months
sysutils/mdcp||2019-05-09|Has expired: Broken for more than 6 months
sysutils/sbsigntool||2019-05-09|Has expired: Broken for more than 6 months
www/py-cherrypy-old||2019-05-09|Has expired: Lates version is in tree and no dependent ports
diff --git a/sysutils/Makefile b/sysutils/Makefile
index 9e85976162b9..9151f2c32bb8 100644
--- a/sysutils/Makefile
+++ b/sysutils/Makefile
@@ -472,6 +472,8 @@
SUBDIR += graveman
SUBDIR += graylog
SUBDIR += grub2-bhyve
+ SUBDIR += grub2-efi
+ SUBDIR += grub2-pcbsd
SUBDIR += gsh
SUBDIR += gsmartcontrol
SUBDIR += gstopd
diff --git a/sysutils/grub2-efi/Makefile b/sysutils/grub2-efi/Makefile
new file mode 100644
index 000000000000..29b6bcd71ef4
--- /dev/null
+++ b/sysutils/grub2-efi/Makefile
@@ -0,0 +1,55 @@
+# Created by: kmoore@FreeBSD.org
+
+PORTNAME= grub2-efi
+PORTVERSION= 2.02
+PORTREVISION= 20
+CATEGORIES= sysutils
+MASTER_SITES= LOCAL/kevlo
+DISTNAME= grub-${PORTVERSION}_7
+
+MAINTAINER= kevlo@FreeBSD.org
+COMMENT= Multiboot EFI boot loader
+
+LICENSE= GPLv3
+
+RUN_DEPENDS= ${LOCALBASE}/bin/mformat:emulators/mtools \
+ ${LOCALBASE}/bin/grub-mkrescue:sysutils/grub2-pcbsd
+BUILD_DEPENDS= ${LOCALBASE}/bin/flex:textproc/flex \
+ ${LOCALBASE}/bin/bash:shells/bash \
+ help2man:misc/help2man
+
+ONLY_FOR_ARCHS= amd64
+USES= autoreconf:build bison cpe gettext gmake python tar:xz
+
+WRKSRC= ${WRKDIR}/grub-${PORTVERSION}
+SSP_UNSAFE= yes
+USE_GCC= yes
+GNU_CONFIGURE= yes
+MAKE_JOBS_UNSAFE= yes
+
+CPE_PRODUCT= grub
+CPE_VENDOR= gnu
+
+CONFIGURE_ARGS= --with-platform=efi --disable-werror --localedir=${PREFIX}/share/locale
+CONFIGURE_ENV= CPP="${CC} -E" \
+ LEX=${LOCALBASE}/bin/flex
+
+.include <bsd.port.pre.mk>
+
+post-patch:
+ @${LN} -s ${LOCALBASE}/share/fonts/dejavu/DejaVuSans.ttf ${WRKSRC}
+ @${TOUCH} -t 200001010000 ${WRKSRC}/Makefile.util.def
+
+pre-configure:
+ @${REINPLACE_CMD} -e 's|python|${PYTHON_CMD}|g' ${WRKSRC}/autogen.sh
+ cd ${WRKSRC} && ./autogen.sh
+
+post-configure:
+ @${LN} -sfh /usr/include/machine /usr/include/sys /usr/include/x86 ${WRKSRC}/grub-core
+
+do-install:
+ @cd ${WRKSRC}/grub-core && ${GMAKE} install DESTDIR=${STAGEDIR}
+
+RUN_DEPENDS:= ${RUN_DEPENDS:Ngcc*}
+
+.include <bsd.port.post.mk>
diff --git a/sysutils/grub2-efi/distinfo b/sysutils/grub2-efi/distinfo
new file mode 100644
index 000000000000..8c609472f8d1
--- /dev/null
+++ b/sysutils/grub2-efi/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1625569310
+SHA256 (grub-2.02_7.tar.xz) = 044588d9754142f2982478cb4e7289ab1521fd4412b2a0804ce647c3ff73feff
+SIZE (grub-2.02_7.tar.xz) = 5019120
diff --git a/sysutils/grub2-efi/files/patch-grub-core_disk_geli.c b/sysutils/grub2-efi/files/patch-grub-core_disk_geli.c
new file mode 100644
index 000000000000..f8d1f9bed333
--- /dev/null
+++ b/sysutils/grub2-efi/files/patch-grub-core_disk_geli.c
@@ -0,0 +1,12 @@
+--- grub-core/disk/geli.c.orig 2015-01-30 16:34:55 UTC
++++ grub-core/disk/geli.c
+@@ -445,6 +445,9 @@ recover_key (grub_disk_t source, grub_cr
+ if (!grub_password_get (passphrase, MAX_PASSPHRASE))
+ return grub_error (GRUB_ERR_BAD_ARGUMENT, "Passphrase not supplied");
+
++ /* Set the GELI passphrase to GRUB env, for passing to FreeBSD kernel */
++ grub_env_set ("gelipassphrase", passphrase);
++
+ /* Calculate the PBKDF2 of the user supplied passphrase. */
+ if (grub_le_to_cpu32 (header.niter) != 0)
+ {
diff --git a/sysutils/grub2-efi/files/patch-grub-core_lib_libgcrypt_src_types.h b/sysutils/grub2-efi/files/patch-grub-core_lib_libgcrypt_src_types.h
new file mode 100644
index 000000000000..9b353e42f498
--- /dev/null
+++ b/sysutils/grub2-efi/files/patch-grub-core_lib_libgcrypt_src_types.h
@@ -0,0 +1,11 @@
+--- grub-core/lib/libgcrypt/src/types.h.orig 2014-03-03 16:00:26 UTC
++++ grub-core/lib/libgcrypt/src/types.h
+@@ -113,6 +113,8 @@
+ #endif
+ #endif
+
++typedef uint64_t u64;
++
+ typedef union {
+ int a;
+ short b;
diff --git a/sysutils/grub2-efi/files/patch-grub-core_loader_i386_bsd.c b/sysutils/grub2-efi/files/patch-grub-core_loader_i386_bsd.c
new file mode 100644
index 000000000000..a69efa6d22b2
--- /dev/null
+++ b/sysutils/grub2-efi/files/patch-grub-core_loader_i386_bsd.c
@@ -0,0 +1,185 @@
+--- grub-core/loader/i386/bsd.c.orig 2015-01-30 16:34:55 UTC
++++ grub-core/loader/i386/bsd.c
+@@ -42,12 +42,14 @@
+ GRUB_MOD_LICENSE ("GPLv3+");
+
+ #include <grub/video.h>
++#include <grub/acpi.h>
+ #ifdef GRUB_MACHINE_PCBIOS
+ #include <grub/machine/biosnum.h>
+ #endif
+ #ifdef GRUB_MACHINE_EFI
+ #include <grub/efi/efi.h>
+ #define NETBSD_DEFAULT_VIDEO_MODE "800x600"
++#define FREEBSD_DEFAULT_VIDEO_MODE "auto"
+ #else
+ #define NETBSD_DEFAULT_VIDEO_MODE "text"
+ #include <grub/i386/pc/vbe.h>
+@@ -585,6 +587,72 @@ freebsd_get_zfs (void)
+ grub_free (uuid);
+ }
+
++#ifdef GRUB_MACHINE_EFI
++
++static grub_err_t
++grub_freebsd_setup_video (void)
++{
++ struct grub_video_mode_info mode_info;
++ void *framebuffer;
++ const char *modevar;
++ struct grub_freebsd_btinfo_framebuf efifb;
++ grub_err_t err;
++ grub_video_driver_id_t driv_id;
++
++ modevar = grub_env_get ("gfxpayload");
++
++ /* Now all graphical modes are acceptable.
++ May change in future if we have modes without framebuffer. */
++ if (modevar && *modevar != 0)
++ {
++ char *tmp;
++ tmp = grub_xasprintf ("%s;" FREEBSD_DEFAULT_VIDEO_MODE, modevar);
++ if (! tmp)
++ return grub_errno;
++ err = grub_video_set_mode (tmp, 0, 0);
++ grub_free (tmp);
++ }
++ else
++ err = grub_video_set_mode (FREEBSD_DEFAULT_VIDEO_MODE, 0, 0);
++
++ if (err)
++ return err;
++
++ driv_id = grub_video_get_driver_id ();
++ if (driv_id == GRUB_VIDEO_DRIVER_NONE)
++ return GRUB_ERR_NONE;
++
++ err = grub_video_get_info_and_fini (&mode_info, &framebuffer);
++
++ if (err)
++ return err;
++
++ efifb.fb_width = mode_info.width;
++ efifb.fb_height = mode_info.height;
++ efifb.fb_stride = mode_info.pitch / mode_info.bytes_per_pixel;
++
++ efifb.fb_addr = (grub_addr_t) framebuffer;
++ efifb.fb_size = ALIGN_UP (mode_info.pitch * efifb.fb_height, 65536);
++
++ if ( mode_info.blue_field_pos == 16 ) {
++ efifb.fb_mask_red = 0x000000ff;
++ efifb.fb_mask_green = 0x0000ff00;
++ efifb.fb_mask_blue = 0x00ff0000;
++ }
++
++ if ( mode_info.blue_field_pos == 0 ) {
++ efifb.fb_mask_red = 0x00ff0000;
++ efifb.fb_mask_green = 0x0000ff00;
++ efifb.fb_mask_blue = 0x000000ff;
++ }
++
++ efifb.fb_mask_reserved = 0xff000000;
++
++ err = grub_bsd_add_meta ( FREEBSD_MODINFO_METADATA | FREEBSD_BTINFO_FRAMEBUF, &efifb, sizeof (efifb));
++ return err;
++}
++#endif
++
+ static grub_err_t
+ grub_freebsd_boot (void)
+ {
+@@ -603,6 +671,55 @@ grub_freebsd_boot (void)
+
+ bi.boot_device = freebsd_biosdev;
+
++#ifdef GRUB_MACHINE_EFI
++ /* When booting in EFI mode, we need to export some additional kernel ACPI hints */
++ struct grub_acpi_rsdp_v10 *v1;
++ struct grub_acpi_rsdp_v20 *v2;
++ v1 = grub_acpi_get_rsdpv1 ();
++ v2 = grub_acpi_get_rsdpv2 ();
++ if (v2 && v2->length > 40)
++ v2 = 0;
++
++ int revision;
++ char acpiBuf[24];
++
++ if (v1)
++ {
++ revision = v1->revision;
++ if ( revision == 0 )
++ revision = 1;
++ grub_snprintf (acpiBuf, sizeof (acpiBuf), "%d", revision);
++ grub_env_set("kFreeBSD.hint.acpi.0.revision", acpiBuf);
++
++ grub_snprintf (acpiBuf, sizeof (acpiBuf), "%s", v1->oemid);
++ grub_env_set("kFreeBSD.hint.acpi.0.oem", acpiBuf);
++
++ grub_snprintf (acpiBuf, sizeof (acpiBuf), "0x%016x", v1->rsdt_addr);
++ grub_env_set("kFreeBSD.hint.acpi.0.rsdt", acpiBuf);
++
++ grub_snprintf (acpiBuf, sizeof (acpiBuf), "0x%016llx", (unsigned long long)v1);
++ grub_env_set("kFreeBSD.hint.acpi.0.rsdp", acpiBuf);
++ }
++
++ if (v2)
++ {
++ revision = v2->rsdpv1.revision;
++ if ( revision == 0 )
++ revision = 1;
++
++ grub_snprintf (acpiBuf, sizeof (acpiBuf), "%d", revision);
++ grub_env_set("kFreeBSD.hint.acpi.0.revision", acpiBuf);
++
++ grub_snprintf (acpiBuf, sizeof (acpiBuf), "0x%016llx", (unsigned long long)v2->xsdt_addr);
++ grub_env_set("kFreeBSD.hint.acpi.0.xsdt", acpiBuf);
++
++ grub_snprintf (acpiBuf, sizeof (acpiBuf), "%d", v2->length);
++ grub_env_set("kFreeBSD.hint.acpi.0.xsdt_length", acpiBuf);
++ }
++
++
++#endif
++
+ p_size = 0;
+ FOR_SORTED_ENV (var)
+ if ((grub_memcmp (var->name, "kFreeBSD.", sizeof("kFreeBSD.") - 1) == 0) && (var->name[sizeof("kFreeBSD.") - 1]))
+@@ -688,6 +805,10 @@ grub_freebsd_boot (void)
+ *(grub_uint32_t *) p_tag = bootflags;
+ break;
+
++ case FREEBSD_MODINFO_METADATA | FREEBSD_BTINFO_FRAMEBUF:
++ grub_memcpy (p_tag, tag->data, tag->len);
++ break;
++
+ case FREEBSD_MODINFO_METADATA | FREEBSD_MODINFOMD_ENVP:
+ if (is_64bit)
+ *(grub_uint64_t *) p_tag = bi.environment;
+@@ -717,7 +838,10 @@ grub_freebsd_boot (void)
+
+ bi.kern_end = kern_end;
+
++#ifndef GRUB_MACHINE_EFI
++ /* Don't set text mode on EFI boot */
+ grub_video_set_mode ("text", 0, 0);
++#endif
+
+ if (is_64bit)
+ {
+@@ -1561,6 +1685,16 @@ grub_cmd_freebsd (grub_extcmd_context_t
+ FREEBSD_MODINFOMD_KERNEND, &data, len);
+ if (err)
+ return err;
++
++#ifdef GRUB_MACHINE_EFI
++ err = grub_freebsd_setup_video ();
++ if (err)
++ {
++ grub_print_error ();
++ grub_puts_ (N_("Booting in EFI blind mode"));
++ grub_errno = GRUB_ERR_NONE;
++ }
++#endif
+ }
+ grub_bsd_get_device (&freebsd_biosdev, &unit, &slice, &part);
+ freebsd_zfsguid = 0;
diff --git a/sysutils/grub2-efi/files/patch-grub-core_partmap_gpt.c b/sysutils/grub2-efi/files/patch-grub-core_partmap_gpt.c
new file mode 100644
index 000000000000..5ed32e5fd0ae
--- /dev/null
+++ b/sysutils/grub2-efi/files/patch-grub-core_partmap_gpt.c
@@ -0,0 +1,20 @@
+--- grub-core/partmap/gpt.c.orig 2014-10-20 16:16:07 UTC
++++ grub-core/partmap/gpt.c
+@@ -37,6 +37,7 @@ static const grub_gpt_part_type_t grub_g
+
+ #ifdef GRUB_UTIL
+ static const grub_gpt_part_type_t grub_gpt_partition_type_bios_boot = GRUB_GPT_PARTITION_TYPE_BIOS_BOOT;
++static const grub_gpt_part_type_t grub_gpt_partition_type_freebsd_boot = GRUB_GPT_PARTITION_TYPE_FREEBSD_BOOT;
+ #endif
+
+ /* 512 << 7 = 65536 byte sectors. */
+@@ -155,7 +156,8 @@ find_usable_region (grub_disk_t disk __a
+ disk->partition = p2;
+
+ /* If there's an embed region, it is in a dedicated partition. */
+- if (! grub_memcmp (&gptdata.type, &grub_gpt_partition_type_bios_boot, 16))
++ if (! grub_memcmp (&gptdata.type, &grub_gpt_partition_type_bios_boot, 16) ||
++ ! grub_memcmp (&gptdata.type, &grub_gpt_partition_type_freebsd_boot, 16))
+ {
+ ctx->start = p->start;
+ ctx->len = p->len;
diff --git a/sysutils/grub2-efi/files/patch-include_grub_gpt__partition.h b/sysutils/grub2-efi/files/patch-include_grub_gpt__partition.h
new file mode 100644
index 000000000000..d8da78eea7b3
--- /dev/null
+++ b/sysutils/grub2-efi/files/patch-include_grub_gpt__partition.h
@@ -0,0 +1,17 @@
+--- include/grub/gpt_partition.h.orig 2014-03-03 16:00:26 UTC
++++ include/grub/gpt_partition.h
+@@ -43,6 +43,14 @@ typedef struct grub_gpt_part_type grub_g
+ { 0x74, 0x4e, 0x65, 0x65, 0x64, 0x45, 0x46, 0x49 } \
+ }
+
++#define GRUB_GPT_PARTITION_TYPE_FREEBSD_BOOT \
++ { grub_cpu_to_le32_compile_time (0x83bd6b9d), \
++ grub_cpu_to_le16_compile_time (0x7f41), \
++ grub_cpu_to_le16_compile_time (0x11dc), \
++ { 0xbe, 0x0b, 0x00, 0x15, 0x60, 0xb8, 0x4f, 0x0f } \
++ }
++
++
+ #define GRUB_GPT_PARTITION_TYPE_LDM \
+ { grub_cpu_to_le32_compile_time (0x5808C8AAU),\
+ grub_cpu_to_le16_compile_time (0x7E8F), \
diff --git a/sysutils/grub2-efi/files/patch-include_grub_i386_bsd.h b/sysutils/grub2-efi/files/patch-include_grub_i386_bsd.h
new file mode 100644
index 000000000000..3de8d0bb203e
--- /dev/null
+++ b/sysutils/grub2-efi/files/patch-include_grub_i386_bsd.h
@@ -0,0 +1,10 @@
+--- include/grub/i386/bsd.h.orig 2014-12-30 21:10:24 UTC
++++ include/grub/i386/bsd.h
+@@ -26,6 +26,7 @@
+ #include <grub/i386/netbsd_reboot.h>
+ #include <grub/i386/openbsd_reboot.h>
+ #include <grub/i386/freebsd_linker.h>
++#include <grub/i386/freebsd_bootinfo.h>
+ #include <grub/i386/netbsd_bootinfo.h>
+ #include <grub/i386/openbsd_bootarg.h>
+
diff --git a/sysutils/grub2-efi/files/patch-include_grub_i386_freebsd__bootinfo.h b/sysutils/grub2-efi/files/patch-include_grub_i386_freebsd__bootinfo.h
new file mode 100644
index 000000000000..359342e38066
--- /dev/null
+++ b/sysutils/grub2-efi/files/patch-include_grub_i386_freebsd__bootinfo.h
@@ -0,0 +1,36 @@
+--- include/grub/i386/freebsd_bootinfo.h.orig 2015-06-07 21:44:01 UTC
++++ include/grub/i386/freebsd_bootinfo.h
+@@ -0,0 +1,33 @@
++/*
++ * GRUB -- GRand Unified Bootloader
++ * Copyright (C) 2008,2009 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/types.h>
++
++#define FREEBSD_BTINFO_FRAMEBUF 0x1005
++
++struct grub_freebsd_btinfo_framebuf {
++ grub_uint64_t fb_addr;
++ grub_uint64_t fb_size;
++ grub_int32_t fb_height;
++ grub_int32_t fb_width;
++ grub_int32_t fb_stride;
++ grub_uint32_t fb_mask_red;
++ grub_uint32_t fb_mask_green;
++ grub_uint32_t fb_mask_blue;
++ grub_uint32_t fb_mask_reserved;
++};
diff --git a/sysutils/grub2-efi/files/patch-po_LINGUAS b/sysutils/grub2-efi/files/patch-po_LINGUAS
new file mode 100644
index 000000000000..2dbcb6e4d4cc
--- /dev/null
+++ b/sysutils/grub2-efi/files/patch-po_LINGUAS
@@ -0,0 +1,5 @@
+--- po/LINGUAS.orig 2015-01-30 16:30:32 UTC
++++ po/LINGUAS
+@@ -1 +1 @@
+-ast ca da de de@hebrew de_CH en@arabic en@cyrillic en@greek en@hebrew en@piglatin en@quot eo es fi fr gl hu id it ja lt nb nl pa pl pt_BR ru sl sv tr uk vi zh_CN zh_TW
++ast ca da de eo es fi fr gl hu id it ja lt nb nl pa pl pt_BR ru sl sv tr uk vi zh_CN zh_TW
diff --git a/sysutils/grub2-efi/pkg-descr b/sysutils/grub2-efi/pkg-descr
new file mode 100644
index 000000000000..9960c6e8f4bd
--- /dev/null
+++ b/sysutils/grub2-efi/pkg-descr
@@ -0,0 +1,8 @@
+GNU GRUB is a multiboot boot loader. It was derived from GRUB, the GRand
+Unified Bootloader, which was originally designed and implemented by Erich
+Stefan Boleyn.
+
+This port builds the GRUB x86_64-efi boot modules, allowing grub-install
+or grub-mkrescue to install with EFI support.
+
+WWW: http://www.gnu.org/software/grub/
diff --git a/sysutils/grub2-efi/pkg-plist b/sysutils/grub2-efi/pkg-plist
new file mode 100644
index 000000000000..c512c40925dc
--- /dev/null
+++ b/sysutils/grub2-efi/pkg-plist
@@ -0,0 +1,521 @@
+lib/grub/x86_64-efi/acpi.mod
+lib/grub/x86_64-efi/acpi.module
+lib/grub/x86_64-efi/adler32.mod
+lib/grub/x86_64-efi/adler32.module
+lib/grub/x86_64-efi/affs.mod
+lib/grub/x86_64-efi/affs.module
+lib/grub/x86_64-efi/afs.mod
+lib/grub/x86_64-efi/afs.module
+lib/grub/x86_64-efi/ahci.mod
+lib/grub/x86_64-efi/ahci.module
+lib/grub/x86_64-efi/all_video.mod
+lib/grub/x86_64-efi/all_video.module
+lib/grub/x86_64-efi/aout.mod
+lib/grub/x86_64-efi/aout.module
+lib/grub/x86_64-efi/appleldr.mod
+lib/grub/x86_64-efi/appleldr.module
+lib/grub/x86_64-efi/archelp.mod
+lib/grub/x86_64-efi/archelp.module
+lib/grub/x86_64-efi/at_keyboard.mod
+lib/grub/x86_64-efi/at_keyboard.module
+lib/grub/x86_64-efi/ata.mod
+lib/grub/x86_64-efi/ata.module
+lib/grub/x86_64-efi/backtrace.mod
+lib/grub/x86_64-efi/backtrace.module
+lib/grub/x86_64-efi/bfs.mod
+lib/grub/x86_64-efi/bfs.module
+lib/grub/x86_64-efi/bitmap.mod
+lib/grub/x86_64-efi/bitmap.module
+lib/grub/x86_64-efi/bitmap_scale.mod
+lib/grub/x86_64-efi/bitmap_scale.module
+lib/grub/x86_64-efi/blocklist.mod
+lib/grub/x86_64-efi/blocklist.module
+lib/grub/x86_64-efi/boot.mod
+lib/grub/x86_64-efi/boot.module
+lib/grub/x86_64-efi/bsd.mod
+lib/grub/x86_64-efi/bsd.module
+lib/grub/x86_64-efi/bswap_test.mod
+lib/grub/x86_64-efi/bswap_test.module
+lib/grub/x86_64-efi/btrfs.mod
+lib/grub/x86_64-efi/btrfs.module
+lib/grub/x86_64-efi/bufio.mod
+lib/grub/x86_64-efi/bufio.module
+lib/grub/x86_64-efi/cat.mod
+lib/grub/x86_64-efi/cat.module
+lib/grub/x86_64-efi/cbfs.mod
+lib/grub/x86_64-efi/cbfs.module
+lib/grub/x86_64-efi/cbls.mod
+lib/grub/x86_64-efi/cbls.module
+lib/grub/x86_64-efi/cbmemc.mod
+lib/grub/x86_64-efi/cbmemc.module
+lib/grub/x86_64-efi/cbtable.mod
+lib/grub/x86_64-efi/cbtable.module
+lib/grub/x86_64-efi/cbtime.mod
+lib/grub/x86_64-efi/cbtime.module
+lib/grub/x86_64-efi/chain.mod
+lib/grub/x86_64-efi/chain.module
+lib/grub/x86_64-efi/cmdline_cat_test.mod
+lib/grub/x86_64-efi/cmdline_cat_test.module
+lib/grub/x86_64-efi/cmp.mod
+lib/grub/x86_64-efi/cmp.module
+lib/grub/x86_64-efi/cmp_test.mod
+lib/grub/x86_64-efi/cmp_test.module
+lib/grub/x86_64-efi/command.lst
+lib/grub/x86_64-efi/configfile.mod
+lib/grub/x86_64-efi/configfile.module
+lib/grub/x86_64-efi/cpio.mod
+lib/grub/x86_64-efi/cpio.module
+lib/grub/x86_64-efi/cpio_be.mod
+lib/grub/x86_64-efi/cpio_be.module
+lib/grub/x86_64-efi/cpuid.mod
+lib/grub/x86_64-efi/cpuid.module
+lib/grub/x86_64-efi/crc64.mod
+lib/grub/x86_64-efi/crc64.module
+lib/grub/x86_64-efi/crypto.lst
+lib/grub/x86_64-efi/crypto.mod
+lib/grub/x86_64-efi/crypto.module
+lib/grub/x86_64-efi/cryptodisk.mod
+lib/grub/x86_64-efi/cryptodisk.module
+lib/grub/x86_64-efi/cs5536.mod
+lib/grub/x86_64-efi/cs5536.module
+lib/grub/x86_64-efi/ctz_test.mod
+lib/grub/x86_64-efi/ctz_test.module
+lib/grub/x86_64-efi/date.mod
+lib/grub/x86_64-efi/date.module
+lib/grub/x86_64-efi/datehook.mod
+lib/grub/x86_64-efi/datehook.module
+lib/grub/x86_64-efi/datetime.mod
+lib/grub/x86_64-efi/datetime.module
+lib/grub/x86_64-efi/disk.mod
+lib/grub/x86_64-efi/disk.module
+lib/grub/x86_64-efi/diskfilter.mod
+lib/grub/x86_64-efi/diskfilter.module
+lib/grub/x86_64-efi/div.mod
+lib/grub/x86_64-efi/div.module
+lib/grub/x86_64-efi/div_test.mod
+lib/grub/x86_64-efi/div_test.module
+lib/grub/x86_64-efi/dm_nv.mod
+lib/grub/x86_64-efi/dm_nv.module
+lib/grub/x86_64-efi/echo.mod
+lib/grub/x86_64-efi/echo.module
+lib/grub/x86_64-efi/efi_gop.mod
+lib/grub/x86_64-efi/efi_gop.module
+lib/grub/x86_64-efi/efi_uga.mod
+lib/grub/x86_64-efi/efi_uga.module
+lib/grub/x86_64-efi/efifwsetup.mod
+lib/grub/x86_64-efi/efifwsetup.module
+lib/grub/x86_64-efi/efinet.mod
+lib/grub/x86_64-efi/efinet.module
+lib/grub/x86_64-efi/ehci.mod
+lib/grub/x86_64-efi/ehci.module
+lib/grub/x86_64-efi/elf.mod
+lib/grub/x86_64-efi/elf.module
+lib/grub/x86_64-efi/eval.mod
+lib/grub/x86_64-efi/eval.module
+lib/grub/x86_64-efi/exfat.mod
+lib/grub/x86_64-efi/exfat.module
+lib/grub/x86_64-efi/exfctest.mod
+lib/grub/x86_64-efi/exfctest.module
+lib/grub/x86_64-efi/ext2.mod
+lib/grub/x86_64-efi/ext2.module
+lib/grub/x86_64-efi/extcmd.mod
+lib/grub/x86_64-efi/extcmd.module
+lib/grub/x86_64-efi/fat.mod
+lib/grub/x86_64-efi/fat.module
+lib/grub/x86_64-efi/file.mod
+lib/grub/x86_64-efi/file.module
+lib/grub/x86_64-efi/fixvideo.mod
+lib/grub/x86_64-efi/fixvideo.module
+lib/grub/x86_64-efi/font.mod
+lib/grub/x86_64-efi/font.module
+lib/grub/x86_64-efi/fs.lst
+lib/grub/x86_64-efi/fshelp.mod
+lib/grub/x86_64-efi/fshelp.module
+lib/grub/x86_64-efi/functional_test.mod
+lib/grub/x86_64-efi/functional_test.module
+lib/grub/x86_64-efi/gcry_arcfour.mod
+lib/grub/x86_64-efi/gcry_arcfour.module
+lib/grub/x86_64-efi/gcry_blowfish.mod
+lib/grub/x86_64-efi/gcry_blowfish.module
+lib/grub/x86_64-efi/gcry_camellia.mod
+lib/grub/x86_64-efi/gcry_camellia.module
+lib/grub/x86_64-efi/gcry_cast5.mod
+lib/grub/x86_64-efi/gcry_cast5.module
+lib/grub/x86_64-efi/gcry_crc.mod
+lib/grub/x86_64-efi/gcry_crc.module
+lib/grub/x86_64-efi/gcry_des.mod
+lib/grub/x86_64-efi/gcry_des.module
+lib/grub/x86_64-efi/gcry_dsa.mod
+lib/grub/x86_64-efi/gcry_dsa.module
+lib/grub/x86_64-efi/gcry_idea.mod
+lib/grub/x86_64-efi/gcry_idea.module
+lib/grub/x86_64-efi/gcry_md4.mod
+lib/grub/x86_64-efi/gcry_md4.module
+lib/grub/x86_64-efi/gcry_md5.mod
+lib/grub/x86_64-efi/gcry_md5.module
+lib/grub/x86_64-efi/gcry_rfc2268.mod
+lib/grub/x86_64-efi/gcry_rfc2268.module
+lib/grub/x86_64-efi/gcry_rijndael.mod
+lib/grub/x86_64-efi/gcry_rijndael.module
+lib/grub/x86_64-efi/gcry_rmd160.mod
+lib/grub/x86_64-efi/gcry_rmd160.module
+lib/grub/x86_64-efi/gcry_rsa.mod
+lib/grub/x86_64-efi/gcry_rsa.module
+lib/grub/x86_64-efi/gcry_seed.mod
+lib/grub/x86_64-efi/gcry_seed.module
+lib/grub/x86_64-efi/gcry_serpent.mod
+lib/grub/x86_64-efi/gcry_serpent.module
+lib/grub/x86_64-efi/gcry_sha1.mod
+lib/grub/x86_64-efi/gcry_sha1.module
+lib/grub/x86_64-efi/gcry_sha256.mod
+lib/grub/x86_64-efi/gcry_sha256.module
+lib/grub/x86_64-efi/gcry_sha512.mod
+lib/grub/x86_64-efi/gcry_sha512.module
+lib/grub/x86_64-efi/gcry_tiger.mod
+lib/grub/x86_64-efi/gcry_tiger.module
+lib/grub/x86_64-efi/gcry_twofish.mod
+lib/grub/x86_64-efi/gcry_twofish.module
+lib/grub/x86_64-efi/gcry_whirlpool.mod
+lib/grub/x86_64-efi/gcry_whirlpool.module
+lib/grub/x86_64-efi/gdb_grub
+lib/grub/x86_64-efi/geli.mod
+lib/grub/x86_64-efi/geli.module
+lib/grub/x86_64-efi/gettext.mod
+lib/grub/x86_64-efi/gettext.module
+lib/grub/x86_64-efi/gfxmenu.mod
+lib/grub/x86_64-efi/gfxmenu.module
+lib/grub/x86_64-efi/gfxterm.mod
+lib/grub/x86_64-efi/gfxterm.module
+lib/grub/x86_64-efi/gfxterm_background.mod
+lib/grub/x86_64-efi/gfxterm_background.module
+lib/grub/x86_64-efi/gfxterm_menu.mod
+lib/grub/x86_64-efi/gfxterm_menu.module
+lib/grub/x86_64-efi/gmodule.pl
+lib/grub/x86_64-efi/gptsync.mod
+lib/grub/x86_64-efi/gptsync.module
+lib/grub/x86_64-efi/gzio.mod
+lib/grub/x86_64-efi/gzio.module
+lib/grub/x86_64-efi/halt.mod
+lib/grub/x86_64-efi/halt.module
+lib/grub/x86_64-efi/hashsum.mod
+lib/grub/x86_64-efi/hashsum.module
+lib/grub/x86_64-efi/hdparm.mod
+lib/grub/x86_64-efi/hdparm.module
+lib/grub/x86_64-efi/hello.mod
+lib/grub/x86_64-efi/hello.module
+lib/grub/x86_64-efi/help.mod
+lib/grub/x86_64-efi/help.module
+lib/grub/x86_64-efi/hexdump.mod
+lib/grub/x86_64-efi/hexdump.module
+lib/grub/x86_64-efi/hfs.mod
+lib/grub/x86_64-efi/hfs.module
+lib/grub/x86_64-efi/hfsplus.mod
+lib/grub/x86_64-efi/hfsplus.module
+lib/grub/x86_64-efi/hfspluscomp.mod
+lib/grub/x86_64-efi/hfspluscomp.module
+lib/grub/x86_64-efi/http.mod
+lib/grub/x86_64-efi/http.module
+lib/grub/x86_64-efi/iorw.mod
+lib/grub/x86_64-efi/iorw.module
+lib/grub/x86_64-efi/iso9660.mod
+lib/grub/x86_64-efi/iso9660.module
+lib/grub/x86_64-efi/jfs.mod
+lib/grub/x86_64-efi/jfs.module
+lib/grub/x86_64-efi/jpeg.mod
+lib/grub/x86_64-efi/jpeg.module
+lib/grub/x86_64-efi/kernel.exec
+lib/grub/x86_64-efi/kernel.img
+lib/grub/x86_64-efi/keylayouts.mod
+lib/grub/x86_64-efi/keylayouts.module
+lib/grub/x86_64-efi/keystatus.mod
+lib/grub/x86_64-efi/keystatus.module
+lib/grub/x86_64-efi/ldm.mod
+lib/grub/x86_64-efi/ldm.module
+lib/grub/x86_64-efi/legacy_password_test.mod
+lib/grub/x86_64-efi/legacy_password_test.module
+lib/grub/x86_64-efi/legacycfg.mod
+lib/grub/x86_64-efi/legacycfg.module
+lib/grub/x86_64-efi/linux.mod
+lib/grub/x86_64-efi/linux.module
+lib/grub/x86_64-efi/linux16.mod
+lib/grub/x86_64-efi/linux16.module
+lib/grub/x86_64-efi/loadbios.mod
+lib/grub/x86_64-efi/loadbios.module
+lib/grub/x86_64-efi/loadenv.mod
+lib/grub/x86_64-efi/loadenv.module
+lib/grub/x86_64-efi/loopback.mod
+lib/grub/x86_64-efi/loopback.module
+lib/grub/x86_64-efi/ls.mod
+lib/grub/x86_64-efi/ls.module
+lib/grub/x86_64-efi/lsacpi.mod
+lib/grub/x86_64-efi/lsacpi.module
+lib/grub/x86_64-efi/lsefi.mod
+lib/grub/x86_64-efi/lsefi.module
+lib/grub/x86_64-efi/lsefimmap.mod
+lib/grub/x86_64-efi/lsefimmap.module
+lib/grub/x86_64-efi/lsefisystab.mod
+lib/grub/x86_64-efi/lsefisystab.module
+lib/grub/x86_64-efi/lsmmap.mod
+lib/grub/x86_64-efi/lsmmap.module
+lib/grub/x86_64-efi/lspci.mod
+lib/grub/x86_64-efi/lspci.module
+lib/grub/x86_64-efi/lssal.mod
+lib/grub/x86_64-efi/lssal.module
+lib/grub/x86_64-efi/luks.mod
+lib/grub/x86_64-efi/luks.module
+lib/grub/x86_64-efi/lvm.mod
+lib/grub/x86_64-efi/lvm.module
+lib/grub/x86_64-efi/lzopio.mod
+lib/grub/x86_64-efi/lzopio.module
+lib/grub/x86_64-efi/macbless.mod
+lib/grub/x86_64-efi/macbless.module
+lib/grub/x86_64-efi/macho.mod
+lib/grub/x86_64-efi/macho.module
+lib/grub/x86_64-efi/mdraid09.mod
+lib/grub/x86_64-efi/mdraid09.module
+lib/grub/x86_64-efi/mdraid09_be.mod
+lib/grub/x86_64-efi/mdraid09_be.module
+lib/grub/x86_64-efi/mdraid1x.mod
+lib/grub/x86_64-efi/mdraid1x.module
+lib/grub/x86_64-efi/memdisk.mod
+lib/grub/x86_64-efi/memdisk.module
+lib/grub/x86_64-efi/memrw.mod
+lib/grub/x86_64-efi/memrw.module
+lib/grub/x86_64-efi/minicmd.mod
+lib/grub/x86_64-efi/minicmd.module
+lib/grub/x86_64-efi/minix.mod
+lib/grub/x86_64-efi/minix.module
+lib/grub/x86_64-efi/minix2.mod
+lib/grub/x86_64-efi/minix2.module
+lib/grub/x86_64-efi/minix2_be.mod
+lib/grub/x86_64-efi/minix2_be.module
+lib/grub/x86_64-efi/minix3.mod
+lib/grub/x86_64-efi/minix3.module
+lib/grub/x86_64-efi/minix3_be.mod
+lib/grub/x86_64-efi/minix3_be.module
+lib/grub/x86_64-efi/minix_be.mod
+lib/grub/x86_64-efi/minix_be.module
+lib/grub/x86_64-efi/mmap.mod
+lib/grub/x86_64-efi/mmap.module
+lib/grub/x86_64-efi/moddep.lst
+lib/grub/x86_64-efi/modinfo.sh
+lib/grub/x86_64-efi/morse.mod
+lib/grub/x86_64-efi/morse.module
+lib/grub/x86_64-efi/mpi.mod
+lib/grub/x86_64-efi/mpi.module
+lib/grub/x86_64-efi/msdospart.mod
+lib/grub/x86_64-efi/msdospart.module
+lib/grub/x86_64-efi/mul_test.mod
+lib/grub/x86_64-efi/mul_test.module
+lib/grub/x86_64-efi/multiboot.mod
+lib/grub/x86_64-efi/multiboot.module
+lib/grub/x86_64-efi/multiboot2.mod
+lib/grub/x86_64-efi/multiboot2.module
+lib/grub/x86_64-efi/nativedisk.mod
+lib/grub/x86_64-efi/nativedisk.module
+lib/grub/x86_64-efi/net.mod
+lib/grub/x86_64-efi/net.module
+lib/grub/x86_64-efi/newc.mod
+lib/grub/x86_64-efi/newc.module
+lib/grub/x86_64-efi/nilfs2.mod
+lib/grub/x86_64-efi/nilfs2.module
+lib/grub/x86_64-efi/normal.mod
+lib/grub/x86_64-efi/normal.module
+lib/grub/x86_64-efi/ntfs.mod
+lib/grub/x86_64-efi/ntfs.module
+lib/grub/x86_64-efi/ntfscomp.mod
+lib/grub/x86_64-efi/ntfscomp.module
+lib/grub/x86_64-efi/odc.mod
+lib/grub/x86_64-efi/odc.module
+lib/grub/x86_64-efi/offsetio.mod
+lib/grub/x86_64-efi/offsetio.module
+lib/grub/x86_64-efi/ohci.mod
+lib/grub/x86_64-efi/ohci.module
+lib/grub/x86_64-efi/part_acorn.mod
+lib/grub/x86_64-efi/part_acorn.module
+lib/grub/x86_64-efi/part_amiga.mod
+lib/grub/x86_64-efi/part_amiga.module
+lib/grub/x86_64-efi/part_apple.mod
+lib/grub/x86_64-efi/part_apple.module
+lib/grub/x86_64-efi/part_bsd.mod
+lib/grub/x86_64-efi/part_bsd.module
+lib/grub/x86_64-efi/part_dfly.mod
+lib/grub/x86_64-efi/part_dfly.module
+lib/grub/x86_64-efi/part_dvh.mod
+lib/grub/x86_64-efi/part_dvh.module
+lib/grub/x86_64-efi/part_gpt.mod
+lib/grub/x86_64-efi/part_gpt.module
+lib/grub/x86_64-efi/part_msdos.mod
+lib/grub/x86_64-efi/part_msdos.module
+lib/grub/x86_64-efi/part_plan.mod
+lib/grub/x86_64-efi/part_plan.module
+lib/grub/x86_64-efi/part_sun.mod
+lib/grub/x86_64-efi/part_sun.module
+lib/grub/x86_64-efi/part_sunpc.mod
+lib/grub/x86_64-efi/part_sunpc.module
+lib/grub/x86_64-efi/partmap.lst
+lib/grub/x86_64-efi/parttool.lst
+lib/grub/x86_64-efi/parttool.mod
+lib/grub/x86_64-efi/parttool.module
+lib/grub/x86_64-efi/password.mod
+lib/grub/x86_64-efi/password.module
+lib/grub/x86_64-efi/password_pbkdf2.mod
+lib/grub/x86_64-efi/password_pbkdf2.module
+lib/grub/x86_64-efi/pata.mod
+lib/grub/x86_64-efi/pata.module
+lib/grub/x86_64-efi/pbkdf2.mod
+lib/grub/x86_64-efi/pbkdf2.module
+lib/grub/x86_64-efi/pbkdf2_test.mod
+lib/grub/x86_64-efi/pbkdf2_test.module
+lib/grub/x86_64-efi/pcidump.mod
+lib/grub/x86_64-efi/pcidump.module
+lib/grub/x86_64-efi/play.mod
+lib/grub/x86_64-efi/play.module
+lib/grub/x86_64-efi/png.mod
+lib/grub/x86_64-efi/png.module
+lib/grub/x86_64-efi/priority_queue.mod
+lib/grub/x86_64-efi/priority_queue.module
+lib/grub/x86_64-efi/probe.mod
+lib/grub/x86_64-efi/probe.module
+lib/grub/x86_64-efi/procfs.mod
+lib/grub/x86_64-efi/procfs.module
+lib/grub/x86_64-efi/progress.mod
+lib/grub/x86_64-efi/progress.module
+lib/grub/x86_64-efi/raid5rec.mod
+lib/grub/x86_64-efi/raid5rec.module
+lib/grub/x86_64-efi/raid6rec.mod
+lib/grub/x86_64-efi/raid6rec.module
+lib/grub/x86_64-efi/read.mod
+lib/grub/x86_64-efi/read.module
+lib/grub/x86_64-efi/reboot.mod
+lib/grub/x86_64-efi/reboot.module
+lib/grub/x86_64-efi/regexp.mod
+lib/grub/x86_64-efi/regexp.module
+lib/grub/x86_64-efi/reiserfs.mod
+lib/grub/x86_64-efi/reiserfs.module
+lib/grub/x86_64-efi/relocator.mod
+lib/grub/x86_64-efi/relocator.module
+lib/grub/x86_64-efi/romfs.mod
+lib/grub/x86_64-efi/romfs.module
+lib/grub/x86_64-efi/scsi.mod
+lib/grub/x86_64-efi/scsi.module
+lib/grub/x86_64-efi/search.mod
+lib/grub/x86_64-efi/search.module
+lib/grub/x86_64-efi/search_fs_file.mod
+lib/grub/x86_64-efi/search_fs_file.module
+lib/grub/x86_64-efi/search_fs_uuid.mod
+lib/grub/x86_64-efi/search_fs_uuid.module
+lib/grub/x86_64-efi/search_label.mod
+lib/grub/x86_64-efi/search_label.module
+lib/grub/x86_64-efi/serial.mod
+lib/grub/x86_64-efi/serial.module
+lib/grub/x86_64-efi/setjmp.mod
+lib/grub/x86_64-efi/setjmp.module
+lib/grub/x86_64-efi/setjmp_test.mod
+lib/grub/x86_64-efi/setjmp_test.module
+lib/grub/x86_64-efi/setpci.mod
+lib/grub/x86_64-efi/setpci.module
+lib/grub/x86_64-efi/sfs.mod
+lib/grub/x86_64-efi/sfs.module
+lib/grub/x86_64-efi/shift_test.mod
+lib/grub/x86_64-efi/shift_test.module
+lib/grub/x86_64-efi/signature_test.mod
+lib/grub/x86_64-efi/signature_test.module
+lib/grub/x86_64-efi/sleep.mod
+lib/grub/x86_64-efi/sleep.module
+lib/grub/x86_64-efi/sleep_test.mod
+lib/grub/x86_64-efi/sleep_test.module
+lib/grub/x86_64-efi/spkmodem.mod
+lib/grub/x86_64-efi/spkmodem.module
+lib/grub/x86_64-efi/squash4.mod
+lib/grub/x86_64-efi/squash4.module
+lib/grub/x86_64-efi/syslinuxcfg.mod
+lib/grub/x86_64-efi/syslinuxcfg.module
+lib/grub/x86_64-efi/tar.mod
+lib/grub/x86_64-efi/tar.module
+lib/grub/x86_64-efi/terminal.lst
+lib/grub/x86_64-efi/terminal.mod
+lib/grub/x86_64-efi/terminal.module
+lib/grub/x86_64-efi/terminfo.mod
+lib/grub/x86_64-efi/terminfo.module
+lib/grub/x86_64-efi/test.mod
+lib/grub/x86_64-efi/test.module
+lib/grub/x86_64-efi/test_blockarg.mod
+lib/grub/x86_64-efi/test_blockarg.module
+lib/grub/x86_64-efi/testload.mod
+lib/grub/x86_64-efi/testload.module
+lib/grub/x86_64-efi/testspeed.mod
+lib/grub/x86_64-efi/testspeed.module
+lib/grub/x86_64-efi/tftp.mod
+lib/grub/x86_64-efi/tftp.module
+lib/grub/x86_64-efi/tga.mod
+lib/grub/x86_64-efi/tga.module
+lib/grub/x86_64-efi/time.mod
+lib/grub/x86_64-efi/time.module
+lib/grub/x86_64-efi/tr.mod
+lib/grub/x86_64-efi/tr.module
+lib/grub/x86_64-efi/trig.mod
+lib/grub/x86_64-efi/trig.module
+lib/grub/x86_64-efi/true.mod
+lib/grub/x86_64-efi/true.module
+lib/grub/x86_64-efi/udf.mod
+lib/grub/x86_64-efi/udf.module
+lib/grub/x86_64-efi/ufs1.mod
+lib/grub/x86_64-efi/ufs1.module
+lib/grub/x86_64-efi/ufs1_be.mod
+lib/grub/x86_64-efi/ufs1_be.module
+lib/grub/x86_64-efi/ufs2.mod
+lib/grub/x86_64-efi/ufs2.module
+lib/grub/x86_64-efi/uhci.mod
+lib/grub/x86_64-efi/uhci.module
+lib/grub/x86_64-efi/usb.mod
+lib/grub/x86_64-efi/usb.module
+lib/grub/x86_64-efi/usb_keyboard.mod
+lib/grub/x86_64-efi/usb_keyboard.module
+lib/grub/x86_64-efi/usbms.mod
+lib/grub/x86_64-efi/usbms.module
+lib/grub/x86_64-efi/usbserial_common.mod
+lib/grub/x86_64-efi/usbserial_common.module
+lib/grub/x86_64-efi/usbserial_ftdi.mod
+lib/grub/x86_64-efi/usbserial_ftdi.module
+lib/grub/x86_64-efi/usbserial_pl2303.mod
+lib/grub/x86_64-efi/usbserial_pl2303.module
+lib/grub/x86_64-efi/usbserial_usbdebug.mod
+lib/grub/x86_64-efi/usbserial_usbdebug.module
+lib/grub/x86_64-efi/usbtest.mod
+lib/grub/x86_64-efi/usbtest.module
+lib/grub/x86_64-efi/verify.mod
+lib/grub/x86_64-efi/verify.module
+lib/grub/x86_64-efi/video.lst
+lib/grub/x86_64-efi/video.mod
+lib/grub/x86_64-efi/video.module
+lib/grub/x86_64-efi/video_bochs.mod
+lib/grub/x86_64-efi/video_bochs.module
+lib/grub/x86_64-efi/video_cirrus.mod
+lib/grub/x86_64-efi/video_cirrus.module
+lib/grub/x86_64-efi/video_colors.mod
+lib/grub/x86_64-efi/video_colors.module
+lib/grub/x86_64-efi/video_fb.mod
+lib/grub/x86_64-efi/video_fb.module
+lib/grub/x86_64-efi/videoinfo.mod
+lib/grub/x86_64-efi/videoinfo.module
+lib/grub/x86_64-efi/videotest.mod
+lib/grub/x86_64-efi/videotest.module
+lib/grub/x86_64-efi/videotest_checksum.mod
+lib/grub/x86_64-efi/videotest_checksum.module
+lib/grub/x86_64-efi/xfs.mod
+lib/grub/x86_64-efi/xfs.module
+lib/grub/x86_64-efi/xnu.mod
+lib/grub/x86_64-efi/xnu.module
+lib/grub/x86_64-efi/xnu_uuid.mod
+lib/grub/x86_64-efi/xnu_uuid.module
+lib/grub/x86_64-efi/xnu_uuid_test.mod
+lib/grub/x86_64-efi/xnu_uuid_test.module
+lib/grub/x86_64-efi/xzio.mod
+lib/grub/x86_64-efi/xzio.module
+lib/grub/x86_64-efi/zfs.mod
+lib/grub/x86_64-efi/zfs.module
+lib/grub/x86_64-efi/zfscrypt.mod
+lib/grub/x86_64-efi/zfscrypt.module
+lib/grub/x86_64-efi/zfsinfo.mod
+lib/grub/x86_64-efi/zfsinfo.module
diff --git a/sysutils/grub2-pcbsd/Makefile b/sysutils/grub2-pcbsd/Makefile
new file mode 100644
index 000000000000..2e679d8edd63
--- /dev/null
+++ b/sysutils/grub2-pcbsd/Makefile
@@ -0,0 +1,91 @@
+# Created by: kmoore@FreeBSD.org
+
+PORTNAME= grub2-pcbsd
+PORTVERSION= 2.02q
+PORTREVISION= 17
+CATEGORIES= sysutils
+MASTER_SITES= LOCAL/kevlo
+DISTNAME= grub-2.02_8
+
+MAINTAINER= kevlo@FreeBSD.org
+COMMENT= Multiboot boot loader
+
+LICENSE= GPLv3
+
+BUILD_DEPENDS= ${LOCALBASE}/bin/flex:textproc/flex \
+ ${LOCALBASE}/bin/bash:shells/bash \
+ help2man:misc/help2man
+
+ONLY_FOR_ARCHS= amd64
+USES= autoreconf:build bison cpe gettext gmake makeinfo python tar:xz
+
+WRKSRC= ${WRKDIR}/grub-2.02
+CONFLICTS= grub2-2*
+SSP_UNSAFE= yes
+USE_GCC= yes
+GNU_CONFIGURE= yes
+INFO= grub grub-dev
+MAKE_JOBS_UNSAFE= yes
+
+CPE_PRODUCT= grub
+CPE_VENDOR= gnu
+
+CONFIGURE_ARGS= --disable-werror --localedir=${PREFIX}/share/locale
+CONFIGURE_ENV= CPP="${CC} -E" \
+ LEX=${LOCALBASE}/bin/flex
+
+SUB_FILES= 00_header 10_kfreebsd 10_ktrueos 30_os-prober 50_otherbe
+
+OPTIONS_DEFINE= MKFONT FUSE
+OPTIONS_DEFAULT=MKFONT
+OPTIONS_SUB= yes
+
+MKFONT_DESC= Build grub-mkfont (require freetype2)
+FUSE_DESC= Build grub-mount (require FUSE)
+
+.include <bsd.port.pre.mk>
+
+.if ${ARCH} != "amd64"
+EFIEMU= "@comment "
+.endif
+
+PLIST_SUB+= EFIEMU=${EFIEMU}
+
+.if ${PORT_OPTIONS:MMKFONT}
+LIB_DEPENDS+= libfreetype.so:print/freetype2
+BUILD_DEPENDS+= ${LOCALBASE}/share/fonts/dejavu/DejaVuSans.ttf:x11-fonts/dejavu \
+ ${LOCALBASE}/share/fonts/gnu-unifont/unifont.pcf.gz:x11-fonts/gnu-unifont
+CONFIGURE_ARGS+= --enable-grub-mkfont
+.else
+CONFIGURE_ARGS+= --disable-grub-mkfont
+.endif
+
+.if ${PORT_OPTIONS:MFUSE}
+LIB_DEPENDS+= libfuse.so:sysutils/fusefs-libs
+CONFIGURE_ARGS+= --enable-grub-mount
+.else
+CONFIGURE_ARGS+= --disable-grub-mount
+.endif
+
+post-patch:
+ @${TOUCH} -t 200001010000 ${WRKSRC}/Makefile.util.def
+
+pre-configure:
+ @${REINPLACE_CMD} -e 's|python|${PYTHON_CMD}|g' ${WRKSRC}/autogen.sh
+ cd ${WRKSRC} && ./autogen.sh
+
+post-configure:
+ @${LN} -sfh /usr/include/machine /usr/include/sys /usr/include/x86 ${WRKSRC}/grub-core
+
+post-install:
+ ${RM} -r ${STAGEDIR}${PREFIX}/lib/charset.alias
+ ${INSTALL_SCRIPT} ${WRKDIR}/00_header ${STAGEDIR}${PREFIX}/etc/grub.d/
+ ${INSTALL_SCRIPT} ${WRKDIR}/10_kfreebsd ${STAGEDIR}${PREFIX}/etc/grub.d/
+ ${INSTALL_SCRIPT} ${WRKDIR}/10_ktrueos ${STAGEDIR}${PREFIX}/etc/grub.d/
+ ${INSTALL_SCRIPT} ${WRKDIR}/30_os-prober ${STAGEDIR}${PREFIX}/etc/grub.d/
+ ${INSTALL_SCRIPT} ${WRKDIR}/50_otherbe ${STAGEDIR}${PREFIX}/etc/grub.d/
+ ${MV} ${STAGEDIR}${PREFIX}/etc/grub.d/40_custom ${STAGEDIR}/${PREFIX}/etc/grub.d/40_custom.dist
+
+RUN_DEPENDS:= ${RUN_DEPENDS:Ngcc*}
+
+.include <bsd.port.post.mk>
diff --git a/sysutils/grub2-pcbsd/distinfo b/sysutils/grub2-pcbsd/distinfo
new file mode 100644
index 000000000000..400036de8064
--- /dev/null
+++ b/sysutils/grub2-pcbsd/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1625569318
+SHA256 (grub-2.02_8.tar.xz) = 3b5382f3b2aa467dbfa1a0d53f97e24ccc1b24cdea67056fd3227c57f4c69088
+SIZE (grub-2.02_8.tar.xz) = 5022808
diff --git a/sysutils/grub2-pcbsd/files/00_header.in b/sysutils/grub2-pcbsd/files/00_header.in
new file mode 100644
index 000000000000..e3d1cec6c2fd
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/00_header.in
@@ -0,0 +1,361 @@
+#! /bin/sh
+set -e
+
+# grub-mkconfig helper script.
+# Copyright (C) 2006,2007,2008,2009,2010 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/>.
+
+transform="s,x,x,"
+
+prefix="/usr/local"
+exec_prefix="${prefix}"
+datarootdir="${prefix}/share"
+grub_lang=`echo $LANG | cut -d . -f 1`
+
+export TEXTDOMAIN=grub
+export TEXTDOMAINDIR="/usr/local/share/locale"
+
+. "${datarootdir}/grub/grub-mkconfig_lib"
+
+# Set indicator that we haven't written device access yet
+haveDevAccess=0
+
+# Work-around for systems with GPTID enabled still
+echo "insmod part_gpt"
+
+# Do this as early as possible, since other commands might depend on it.
+# (e.g. the `loadfont' command might need lvm or raid modules)
+for i in ${GRUB_PRELOAD_MODULES} ; do
+ echo "insmod $i"
+done
+
+if [ -e "/root/beadm.install" ] ; then
+ BEADM="/root/beadm.install"
+else
+ BEADM="beadm"
+fi
+
+if [ "x${GRUB_DEFAULT}" = "x" ] ; then
+ GRUB_DEFAULT=0
+fi
+if [ "x${GRUB_DEFAULT}" = "xsaved" ] ; then GRUB_DEFAULT='${saved_entry}' ; fi
+if [ "x${GRUB_TIMEOUT}" = "x" ] ; then GRUB_TIMEOUT=5 ; fi
+if [ "x${GRUB_GFXMODE}" = "x" ] ; then GRUB_GFXMODE=auto ; fi
+
+# Check if we have more than one BE, and need to show the menu by default
+beNum=`$BEADM list 2>/dev/null | grep -v 'Mountpoint' | wc -l | awk '{print $1}'`
+if [ $beNum -gt 1 ] ; then GRUB_HIDDEN_TIMEOUT=""; fi
+
+if [ "x${GRUB_DEFAULT_BUTTON}" = "x" ] ; then GRUB_DEFAULT_BUTTON="$GRUB_DEFAULT" ; fi
+if [ "x${GRUB_DEFAULT_BUTTON}" = "xsaved" ] ; then GRUB_DEFAULT_BUTTON='${saved_entry}' ; fi
+if [ "x${GRUB_TIMEOUT_BUTTON}" = "x" ] ; then GRUB_TIMEOUT_BUTTON="$GRUB_TIMEOUT" ; fi
+
+cat << EOF
+if [ -s \$prefix/grubenv ]; then
+ load_env
+fi
+EOF
+if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then
+ cat <<EOF
+if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then
+ set default="${GRUB_DEFAULT_BUTTON}"
+else
+ set default="${GRUB_DEFAULT}"
+fi
+EOF
+else
+ cat <<EOF
+set default="${GRUB_DEFAULT}"
+EOF
+fi
+cat <<EOF
+
+if [ x"\${feature_menuentry_id}" = xy ]; then
+ menuentry_id_option="--id"
+else
+ menuentry_id_option=""
+fi
+
+export menuentry_id_option
+
+if [ x"\${gelipassphrase}" != x ]; then
+ set pass="\$gelipassphrase"
+ export pass
+fi
+
+if [ "\${prev_saved_entry}" ]; then
+ set saved_entry="\${prev_saved_entry}"
+ save_env saved_entry
+ set prev_saved_entry=
+ save_env prev_saved_entry
+ set boot_once=true
+fi
+
+function savedefault {
+ if [ -z "\${boot_once}" ]; then
+ saved_entry="\${chosen}"
+ save_env saved_entry
+ fi
+}
+
+function load_video {
+EOF
+if [ -n "${GRUB_VIDEO_BACKEND}" ]; then
+ cat <<EOF
+ insmod ${GRUB_VIDEO_BACKEND}
+EOF
+else
+# If all_video.mod isn't available load all modules available
+# with versions prior to introduction of all_video.mod
+cat <<EOF
+ insmod vbe
+ insmod vga
+ insmod video_bochs
+ insmod video_cirrus
+EOF
+fi
+cat <<EOF
+}
+
+EOF
+
+serial=0;
+gfxterm=0;
+for x in ${GRUB_TERMINAL_INPUT} ${GRUB_TERMINAL_OUTPUT}; do
+ if [ xserial = "x$x" ]; then
+ serial=1;
+ fi
+ if [ xgfxterm = "x$x" ]; then
+ gfxterm=1;
+ fi
+done
+
+if [ "x$serial" = x1 ]; then
+ if [ "x${GRUB_SERIAL_COMMAND}" = "x" ] ; then
+ grub_warn "$(gettext "Requested serial terminal but GRUB_SERIAL_COMMAND is unspecified. Default parameters will be used.")"
+ GRUB_SERIAL_COMMAND=serial
+ fi
+ echo "${GRUB_SERIAL_COMMAND}"
+fi
+
+if [ "x$gfxterm" = x1 ]; then
+ if [ -n "$GRUB_FONT" ] ; then
+ # Make the font accessible
+ if [ $haveDevAccess -ne 1 ] ; then
+ haveDevAccess=1
+ prepare_grub_to_access_device `${grub_probe} --target=device "${GRUB_FONT}"`
+ fi
+ cat << EOF
+if loadfont `make_system_path_relative_to_its_root "${GRUB_FONT}"` ; then
+EOF
+ else
+ for dir in "${pkgdatadir}" "`echo '/boot/grub' | sed "s,//*,/,g"`" /usr/share/grub ; do
+ for basename in unicode unifont ascii; do
+ path="${dir}/${basename}.pf2"
+ if is_path_readable_by_grub "${path}" > /dev/null ; then
+ font_path="${path}"
+ else
+ continue
+ fi
+ break 2
+ done
+ done
+ if [ -n "${font_path}" ] ; then
+ cat << EOF
+if [ x\$feature_default_font_path = xy ] ; then
+ font=unicode
+else
+EOF
+ # Make the font accessible
+ if [ $haveDevAccess -ne 1 ] ; then
+ haveDevAccess=1
+ prepare_grub_to_access_device `${grub_probe} --target=device "${font_path}"`
+ fi
+ cat << EOF
+ font="`make_system_path_relative_to_its_root "${font_path}"`"
+fi
+
+if loadfont \$font ; then
+EOF
+ else
+ cat << EOF
+if loadfont unicode ; then
+EOF
+ fi
+ fi
+
+ cat << EOF
+ if [ x"\${grub_platform}" = xpc ] ; then
+ set gfxmode=${GRUB_GFXMODE}
+ load_video
+ insmod gfxterm
+ else
+ # EFI
+ insmod efi_gop
+ insmod gfxterm
+ insmod font
+ insmod videotest
+ insmod videoinfo
+ set gfxmode=${GRUB_GFXMODE}
+ fi
+EOF
+
+# Gettext variables and module
+if [ "x${LANG}" != "xC" -a "x${grub_lang}" != "xen_US" ] ; then
+ cat << EOF
+ set locale_dir=\$prefix/locale
+ set lang=${grub_lang}
+ insmod gettext
+EOF
+fi
+
+cat <<EOF
+fi
+EOF
+fi
+
+case x${GRUB_TERMINAL_INPUT} in
+ x)
+ # Just use the native terminal
+ ;;
+ x*)
+ cat << EOF
+terminal_input ${GRUB_TERMINAL_INPUT}
+EOF
+ ;;
+esac
+
+case x${GRUB_TERMINAL_OUTPUT} in
+ x)
+ # Just use the native terminal
+ ;;
+ x*)
+ cat << EOF
+terminal_output ${GRUB_TERMINAL_OUTPUT}
+EOF
+ ;;
+esac
+
+if [ "x$gfxterm" = x1 ]; then
+ if [ "x$GRUB_THEME" != x ] && [ -f "$GRUB_THEME" ] \
+ && is_path_readable_by_grub "$GRUB_THEME"; then
+ gettext_printf "Found theme: %s\n" "$GRUB_THEME" >&2
+
+ if [ $haveDevAccess -ne 1 ] ; then
+ haveDevAccess=1
+ prepare_grub_to_access_device `${grub_probe} --target=device "$GRUB_THEME"`
+ fi
+ cat << EOF
+insmod gfxmenu
+EOF
+ themedir="`dirname "$GRUB_THEME"`"
+ for x in "$themedir"/*.pf2 "$themedir"/f/*.pf2; do
+ if [ -f "$x" ]; then
+ cat << EOF
+loadfont (\$root)`make_system_path_relative_to_its_root $x`
+EOF
+ fi
+ done
+ if [ x"`echo "$themedir"/*.jpg`" != x"$themedir/*.jpg" ] || [ x"`echo "$themedir"/*.jpeg`" != x"$themedir/*.jpeg" ]; then
+ cat << EOF
+insmod jpeg
+EOF
+ fi
+ if [ x"`echo "$themedir"/*.png`" != x"$themedir/*.png" ]; then
+ cat << EOF
+insmod png
+EOF
+ fi
+ if [ x"`echo "$themedir"/*.tga`" != x"$themedir/*.tga" ]; then
+ cat << EOF
+insmod tga
+EOF
+ fi
+
+ cat << EOF
+set theme=(\$root)`make_system_path_relative_to_its_root $GRUB_THEME`
+export theme
+EOF
+ elif [ "x$GRUB_BACKGROUND" != x ] && [ -f "$GRUB_BACKGROUND" ] \
+ && is_path_readable_by_grub "$GRUB_BACKGROUND"; then
+ gettext_printf "Found background: %s\n" "$GRUB_BACKGROUND" >&2
+ case "$GRUB_BACKGROUND" in
+ *.png) reader=png ;;
+ *.tga) reader=tga ;;
+ *.jpg|*.jpeg) reader=jpeg ;;
+ *) gettext "Unsupported image format" >&2; echo >&2; exit 1 ;;
+ esac
+ if [ $haveDevAccess -ne 1 ] ; then
+ haveDevAccess=1
+ prepare_grub_to_access_device `${grub_probe} --target=device "$GRUB_BACKGROUND"`
+ fi
+ cat << EOF
+insmod $reader
+background_image -m stretch `make_system_path_relative_to_its_root "$GRUB_BACKGROUND"`
+EOF
+ fi
+fi
+
+make_timeout ()
+{
+ if [ "x${1}" != "x" ] ; then
+ if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then
+ verbose=
+ else
+ verbose=" --verbose"
+ fi
+ cat << EOF
+echo "Hold Left-Shift for menu.."
+if sleep$verbose --interruptible ${1} ; then
+ if keystatus --shift; then
+ set timeout=-1
+ else
+ set timeout=0
+ fi
+fi
+EOF
+ else
+ cat << EOF
+set timeout=${2}
+EOF
+ fi
+}
+
+if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then
+ cat <<EOF
+if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then
+EOF
+make_timeout "${GRUB_HIDDEN_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_BUTTON}"
+echo else
+make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}"
+echo fi
+else
+make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}"
+fi
+
+if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ] && [ "x$GRUB_BUTTON_CMOS_CLEAN" = "xyes" ]; then
+ cat <<EOF
+cmosclean $GRUB_BUTTON_CMOS_ADDRESS
+EOF
+fi
+
+# Play an initial tune
+if [ "x${GRUB_INIT_TUNE}" != "x" ] ; then
+ echo "play ${GRUB_INIT_TUNE}"
+fi
+
+if [ "x${GRUB_BADRAM}" != "x" ] ; then
+ echo "badram ${GRUB_BADRAM}"
+fi
diff --git a/sysutils/grub2-pcbsd/files/10_kfreebsd.in b/sysutils/grub2-pcbsd/files/10_kfreebsd.in
new file mode 100644
index 000000000000..d9d0dfb0009d
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/10_kfreebsd.in
@@ -0,0 +1,247 @@
+#! /bin/sh
+set -e
+
+# grub-mkconfig helper script.
+# Copyright (C) 2006,2007,2008,2009,2010,2011 Free Software Foundation, Inc.
+#
+# GRUB is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# GRUB is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+
+# Check if we have beadm installed, if not do normal freebsd detection
+if [ -e "/usr/local/sbin/beadm" ] ; then exit 0; fi
+
+prefix="@prefix@"
+exec_prefix="@exec_prefix@"
+datarootdir="@datarootdir@"
+. "$pkgdatadir/grub-mkconfig_lib"
+
+export TEXTDOMAIN=@PACKAGE@
+export TEXTDOMAINDIR="@localedir@"
+
+CLASS="--class os"
+
+case "${GRUB_DISTRIBUTOR}" in
+ Debian)
+ OS="${GRUB_DISTRIBUTOR} GNU/kFreeBSD"
+ CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') --class gnu-kfreebsd --class gnu ${CLASS}"
+ ;;
+ *)
+ OS="FreeBSD"
+ CLASS="--class freebsd --class bsd ${CLASS}"
+ ;;
+esac
+
+load_kfreebsd_module ()
+{
+ mod="$1"
+ allow_fail="$2"
+
+ if ! test -e "${module_dir}/${mod}.ko" ; then
+ if [ "${allow_fail}" = "true" ] ; then
+ # Return silently
+ return
+ else
+ # Print an error and fail.
+ ls "${module_dir}/${mod}.ko" > /dev/null
+ fi
+ fi
+
+ if [ -z "${prepare_module_dir_cache}" ]; then
+ prepare_module_dir_cache="$(prepare_grub_to_access_device $(${grub_probe} -t device "${module_dir}") | grub_add_tab)"
+ fi
+
+ printf '%s\n' "${prepare_module_dir_cache}"
+ cat << EOF
+ kfreebsd_module_elf ${module_dir_rel}/${mod}.ko
+EOF
+}
+
+title_correction_code=
+
+kfreebsd_entry ()
+{
+ os="$1"
+ version="$2"
+ type="$3"
+ args="$4"
+ if [ -z "$boot_device_id" ]; then
+ boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
+ fi
+ if [ x$type != xsimple ] ; then
+ if [ x$type = xrecovery ] ; then
+ title="$(gettext_printf "%s, with kFreeBSD %s (recovery mode)" "${os}" "${version}")"
+ else
+ title="$(gettext_printf "%s, with kFreeBSD %s" "${os}" "${version}")"
+ fi
+ replacement_title="$(echo "Advanced options for ${OS}" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')"
+ if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
+ quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)"
+ title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;"
+ grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "kfreebsd-advanced-$boot_device_id>kfreebsd-$version-$type-$boot_device_id")"
+ fi
+ echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'kfreebsd-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
+ else
+ echo "menuentry '$(echo "$OS" | grub_quote)' ${CLASS} \$menuentry_id_option 'kfreebsd-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
+ fi
+ if [ x$type != xrecovery ] ; then
+ save_default_entry | grub_add_tab | sed "s/^/$submenu_indentation/"
+ fi
+ if [ -z "${prepare_boot_cache}" ]; then
+ prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | grub_add_tab)"
+ fi
+
+ printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
+ message="$(gettext_printf "Loading kernel of FreeBSD %s ..." ${version})"
+ sed "s/^/$submenu_indentation/" << EOF
+ echo '$(echo "$message" | grub_quote)'
+ kfreebsd ${rel_dirname}/${basename} ${args}
+EOF
+
+ if test -n "${devices}" ; then
+ sed "s/^/$submenu_indentation/" << EOF
+ kfreebsd_loadenv ${devices_rel_dirname}/${devices_basename}
+EOF
+ fi
+
+ load_kfreebsd_module acpi true
+
+ for abstraction in dummy $(${grub_probe} -t abstraction --device ${GRUB_DEVICE}) ; do
+ case $abstraction in
+ lvm) load_kfreebsd_module geom_linux_lvm false ;;
+ esac
+ done
+
+ case "${kfreebsd_fs}" in
+ zfs)
+ load_kfreebsd_module opensolaris false
+
+ ls "/boot/zfs/zpool.cache" > /dev/null
+ printf '%s\n' "${prepare_boot_cache}"
+ sed "s/^/$submenu_indentation/" << EOF
+ kfreebsd_module $(make_system_path_relative_to_its_root /boot)/zfs/zpool.cache type=/boot/zfs/zpool.cache
+EOF
+ ;;
+ esac
+
+ if [ x${kfreebsd_fs} = xufs ]; then
+ load_kfreebsd_module ${kfreebsd_fs} true | sed "s/^/$submenu_indentation/"
+ else
+ load_kfreebsd_module ${kfreebsd_fs} false | sed "s/^/$submenu_indentation/"
+ fi
+
+ sed "s/^/$submenu_indentation/" << EOF
+ set kFreeBSD.vfs.root.mountfrom=${kfreebsd_fs}:${kfreebsd_device}
+ set kFreeBSD.vfs.root.mountfrom.options=rw
+}
+EOF
+}
+
+list=
+for i in /boot/kfreebsd-* /boot/kernel/kernel ; do
+ if grub_file_is_not_garbage "$i" ; then
+ list="$list $i"
+ fi
+done
+prepare_boot_cache=
+boot_device_id=
+title_correction_code=
+
+# 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=""
+
+is_top_level=true
+
+while [ "x$list" != "x" ] ; do
+ kfreebsd=`version_find_latest $list`
+ gettext_printf "Found kernel of FreeBSD: %s\n" "$kfreebsd" >&2
+ basename=`basename $kfreebsd`
+ dirname=`dirname $kfreebsd`
+ rel_dirname=`make_system_path_relative_to_its_root $dirname`
+
+ if [ -f /boot/device.hints ] ; then
+ devices=/boot/device.hints
+ devices_basename=`basename $devices`
+ devices_dirname=`dirname $devices`
+ devices_rel_dirname=`make_system_path_relative_to_its_root $devices_dirname`
+ fi
+
+ case ${GRUB_FS} in
+ ufs1 | ufs2) kfreebsd_fs=ufs ;;
+ ext2) kfreebsd_fs=ext2fs ;;
+ *) kfreebsd_fs=${GRUB_FS} ;;
+ esac
+
+ case ${GRUB_FS} in
+ zfs)
+ # zpool name
+ kfreebsd_device=$(${grub_probe} -t fs_label --device ${GRUB_DEVICE})
+ # filesystem name (empty string for the main filesystem)
+ kfreebsd_device="${kfreebsd_device}$(${grub_mkrelpath} / | sed -e "s,/*@$,,")"
+ ;;
+ *)
+ kfreebsd_device=${kfreebsd_fs}id/${GRUB_DEVICE_UUID}
+ # Debian GNU/kFreeBSD can't remount root if it's supplied as UUID but
+ # as an UUID
+ if [ "x${GRUB_DISTRIBUTOR}" = "xDebian" ] \
+ && ! (cat /etc/fstab | awk '!/^[[:space:]]*#/ && $2=="/" { print $1; }' \
+ | grep "${kfreebsd_fs}id/${GRUB_DEVICE_UUID}" > /dev/null); then
+ kfreebsd_device=${GRUB_DEVICE}
+ fi
+ ;;
+ esac
+
+ version=`echo $basename | sed -e "s,^[^0-9]*-,,g;s/\.gz$//g"`
+ alt_version=`echo $version | sed -e "s,\.old$,,g"`
+
+ module_dir=
+ for i in "/lib/modules/${version}" "/lib/modules/${alt_version}" \
+ "/boot/kernel"; do
+ if test -e "$i" ; then
+ module_dir="$i"
+ break
+ fi
+ done
+ if test -n "${module_dir}" ; then
+ gettext_printf "Found kernel module directory: %s\n" "${module_dir}" >&2
+ module_dir_rel=$(make_system_path_relative_to_its_root $module_dir)
+ fi
+
+ if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xy ]; then
+ kfreebsd_entry "${OS}" "${version}" simple
+ submenu_indentation="$grub_tab"
+
+ if [ -z "$boot_device_id" ]; then
+ boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
+ fi
+ # TRANSLATORS: %s is replaced with an OS name
+ echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'kfreebsd-advanced-$boot_device_id' {"
+ is_top_level=false
+ fi
+
+ kfreebsd_entry "${OS}" "${version}" advanced
+ if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
+ kfreebsd_entry "${OS}" "${version}" recovery "-s"
+ fi
+
+ list=`echo $list | tr ' ' '\n' | fgrep -vx "$kfreebsd" | tr '\n' ' '`
+done
+
+# If at least one kernel was found, then we need to
+# add a closing '}' for the submenu command.
+if [ x"$is_top_level" != xtrue ]; then
+ echo '}'
+fi
+
+echo "$title_correction_code"
+
diff --git a/sysutils/grub2-pcbsd/files/10_ktrueos.in b/sysutils/grub2-pcbsd/files/10_ktrueos.in
new file mode 100644
index 000000000000..15410ac18d8a
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/10_ktrueos.in
@@ -0,0 +1,389 @@
+#!/bin/sh
+#
+# Copyright 2015 iXsystems (Kris Moore)
+# All rights reserved
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted providing that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Script to detect TrueOS / PC-BSD disk installations and create grub
+# entries for them
+
+# Check if we have beadm installed, if not skip this file
+if [ ! -e "/usr/local/sbin/beadm" ] ; then exit 0; fi
+
+ROOTFS=`mount | awk '/ \/ / {print $1}'`
+BEDS="$( echo ${ROOTFS} | awk -F '/' '{print $2}' )"
+if [ "$BEDS" = "dev" ] ; then BEDS="ROOT"; fi
+
+serial=0;
+console=0;
+for x in ${GRUB_TERMINAL_OUTPUT}; do
+ if [ xserial = "x$x" ]; then
+ serial=1;
+ fi
+ if [ xgfxterm = "x$x" ]; then
+ console=1;
+ fi
+ if [ xconsole = "x$x" ]; then
+ console=1;
+ fi
+done
+
+if [ "x$serial" = "x1" ]; then
+ if [ "x$console" = "x1" ]; then
+ out="-Dh"
+ else
+ out="-h"
+ fi
+fi
+
+display_loaderopts()
+{
+ # Optional ARG1, set to a ZFS dataset to mount and read values from
+ if [ -n "$1" ] ; then
+ fMnt="/mnt.$$"
+ mkdir $fMnt
+ mount -t zfs ${1} $fMnt >/dev/null
+ if [ $? -ne 0 ] ; then
+ echo "Failed to mount ${1}" >&2
+ return
+ fi
+ else
+ fMnt=""
+ fi
+
+ # Create our placeholder to save _load entries to parse
+ touch /tmp/.lRObjs.$$
+ touch /tmp/.lSysCtls.$$
+
+ # Loader files, in order of which to read them
+ lFiles="${fMnt}/boot/loader.conf.local ${fMnt}/boot/loader.conf ${fMnt}/boot/loader.conf.trueos ${fMnt}/boot/loader.conf.pcbsd"
+ for f in $lFiles
+ do
+ if [ ! -e "$f" ] ; then continue ; fi
+
+ # Lets parse any of the _load= lines
+ grep "_load=" ${f} | grep -v "^#" >/tmp/.lObjs.$$
+ while read line
+ do
+ loadVal="`echo $line | cut -d '=' -f 1`"
+ # Is this value already set in a higher priority file?
+ grep -q "^${loadVal}" /tmp/.lRObjs.$$
+ if [ $? -eq 0 ];then continue; fi
+
+ # Save this value for later
+ echo "$line" >> /tmp/.lRObjs.$$
+ haveObjs=1
+
+ done < /tmp/.lObjs.$$
+ rm /tmp/.lObjs.$$
+
+ # Lets look for any sysctls to set
+ grep "." ${f} | grep "=" | grep -v "^#" | grep -v "_load" >/tmp/.sObjs.$$
+ while read line
+ do
+ loadVal="`echo $line | cut -d '=' -f 1`"
+ # Is this value already set in a higher priority file?
+ grep -q "^${loadVal}" /tmp/.lSysCtls.$$
+ if [ $? -eq 0 ];then continue; fi
+
+ # Save this value for later
+ echo "$line" >> /tmp/.lSysCtls.$$
+ haveSysCtls=1
+
+ done < /tmp/.sObjs.$$
+ rm /tmp/.sObjs.$$
+ done
+
+ # Using GELI encryption?
+ haveGELI="false"
+
+ # Now lets echo out the modules to load
+ if [ "$haveObjs" = "1" ] ; then
+ while read line
+ do
+ echo "$line" | grep -q '"YES"'
+ if [ $? -ne 0 ] ; then continue ; fi
+ module="`echo $line | cut -d '=' -f 1 | sed 's|_load||g'`"
+ # Try to locate module now
+ if [ -e "${fMnt}/boot/kernel/${module}.ko" ] ; then
+ mPath="kernel"
+ elif [ -e "${fMnt}/boot/modules/${module}.ko" ] ; then
+ mPath="modules"
+ else
+ # This isn't a module that we can see, lets set it as a variable
+ #echo "No such module $line, setting as a variable" >&2
+ echo "$line" >> /tmp/.lSysCtls.$$
+ continue
+ fi
+
+ # Are we loading GELI module?
+ if [ "$module" = "geom_eli" ] ; then haveGELI="true" ; fi
+
+ echo " kfreebsd_module_elf ${loadPrefix}/@/boot/${mPath}/${module}.ko"
+ done < /tmp/.lRObjs.$$
+ fi
+
+ # Add our compat kenv lines
+ echo " set kFreeBSD.bootfile=\"kernel\""
+ echo " set kFreeBSD.kernel=\"kernel\""
+ echo " set kFreeBSD.kernel_options=\"\""
+ echo " set kFreeBSD.kernelname=\"/boot/kernel/kernel\""
+ echo " set kFreeBSD.module_path=\"/boot/kernel;/boot/modules\""
+
+ # Any kenv to set?
+ if [ "$haveSysCtls" = "1" ] ; then
+ while read line
+ do
+ # Strip out the vfs.root.mountfrom, we set that elsewhere
+ echo "$line" | grep -q "vfs.root.mountfrom"
+ if [ $? -eq 0 ] ; then continue ; fi
+
+ line="`echo $line | sed 's|"||g'`"
+ key="`echo $line | cut -d '=' -f 1`"
+ val="`echo $line | cut -d '=' -f 2`"
+ if [ -z "$key" -o -z "$val" ] ; then continue ; fi
+ echo " set kFreeBSD.${key}=\"${val}\""
+ done < /tmp/.lSysCtls.$$
+ fi
+
+ rm /tmp/.lRObjs.$$
+ rm /tmp/.lSysCtls.$$
+ if [ -n "$1" ] ; then
+ umount /mnt.$$ >/dev/null
+ rmdir /mnt.$$ >/dev/null
+ fi
+
+ # Set the grub.platform kenv variable
+ echo " set kFreeBSD.grub.platform=\"\$grub_platform\""
+
+ # See if we need to do GELI passphrase passthrough
+ if [ "$haveGELI" = "true" ] ; then
+ echo " set kFreeBSD.kern.geom.eli.passphrase=\"\$pass\""
+ fi
+}
+
+detect_beadm()
+{
+ /usr/bin/which -s beadm >/dev/null 2>/dev/null
+ if [ $? -ne 0 ] ; then return 0; fi
+
+ # Check if we are running from the installer and use its beadm
+ if [ -e "/root/beadm.install" ] ; then
+ BEADM="/root/beadm.install"
+
+ # Check if this is valid
+ testBE=`$BEADM list`
+ if [ -z "$testBE" ] ; then
+ # No BE's, lets switch back to regular mode
+ BEADM="`/usr/bin/which beadm`"
+ fi
+ else
+ BEADM="`/usr/bin/which beadm`"
+ fi
+
+ ${BEADM} list >/dev/null 2>/dev/null
+ if [ $? -ne 0 ] ; then return 0; fi
+
+
+ if [ -e "/etc/defaults/pcbsd" ] ; then
+ NICK="PC-BSD"
+ else
+ NICK="TrueOS"
+ fi
+
+ # Only list the default BE here
+ $BEADM list -H >/tmp/.grub-beadm.$$ 2>/dev/null
+ while read line
+ do
+ be=`echo $line | awk '{print $1}'`
+ flags=`echo $line | awk '{print $2}'`
+
+ # Is this BE marked as wanting to be used for next boot? Make it the first one if so
+ if [ "$flags" = "NR" -o "$flags" = "R" ] ; then
+ BE_LIST="$be"
+ break
+ fi
+ done < /tmp/.grub-beadm.$$
+ rm /tmp/.grub-beadm.$$
+
+ # Get list of beadm datasets
+ for b in $BE_LIST
+ do
+ # Got a beadm snapshot, lets get the complete dataset name
+ beLine=`${BEADM} list -a | grep "/$BEDS/${b}[[:space:]]"`
+ cdataset=`echo $beLine | awk '{print $1}'`
+ cdatadate=`echo $beLine | awk '{print $5}'`
+ cdatatime=`echo $beLine | awk '{print $6}'`
+ ztank=`echo $cdataset | cut -d '/' -f 1`
+ shortdataset="/`echo $cdataset | cut -d '/' -f 2-5`"
+ # Get the BE nickname if it exists
+ beNickName=`${BEADM} list | grep "^${b} " | tr -s ' ' | cut -d ' ' -f 7-12`
+ if [ -z "$beNickName" ] ; then
+ beNickName="$b"
+ fi
+
+ # First part of this dataset
+ cat > /tmp/.grubdataset.$$.1 << EOF
+ insmod zfs
+ search --no-floppy -s -l $ztank
+EOF
+
+ # Second part of loader to save
+ cat > /tmp/.grubdataset.$$.2 << EOF
+ kfreebsd_module ${shortdataset}/@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache
+ set kFreeBSD.vfs.root.mountfrom=zfs:$cdataset
+EOF
+
+ # Now lets look for options in loader.conf to load
+ loadPrefix="${shortdataset}"
+ # If this is the current mounted dataset, we can skip mounting it
+ mount | grep -q -e "$cdataset on / (" -e "$cdataset on /mnt ("
+ if [ $? -eq 0 ] ; then
+ display_loaderopts >>/tmp/.grubdataset.$$.2
+ else
+ display_loaderopts $cdataset >> /tmp/.grubdataset.$$.2
+ fi
+
+ # Lets start a submenu for each BE
+cat << EOF
+
+submenu "${NICK} (${beNickName}) - ${cdatadate} ${cdatatime}" {
+EOF
+
+ # Lets do the default entry first
+ #################################
+ cat << EOF
+ menuentry "Normal Bootup" {
+EOF
+ # Get the dataset guts
+ cat /tmp/.grubdataset.$$.1
+ echo " kfreebsd ${shortdataset}/@/boot/kernel/kernel ${out}"
+ echo " kfreebsd_loadenv ${shortdataset}@/boot/device.hints"
+ cat /tmp/.grubdataset.$$.2
+
+ # Set any options
+ cat << EOF
+ }
+EOF
+
+ # Next lets do single user mode
+ #################################
+ cat << EOF
+ menuentry "Single User Mode" {
+EOF
+ # Get the dataset guts
+ cat /tmp/.grubdataset.$$.1
+ echo " kfreebsd ${shortdataset}/@/boot/kernel/kernel ${out} -s"
+ echo " kfreebsd_loadenv ${shortdataset}@/boot/device.hints"
+ cat /tmp/.grubdataset.$$.2
+
+ # Set any options
+ cat << EOF
+ }
+EOF
+
+ # Next lets do verbose mode
+ #################################
+ cat << EOF
+ menuentry "Verbose Mode" {
+EOF
+ # Get the dataset guts
+ cat /tmp/.grubdataset.$$.1
+ echo " kfreebsd ${shortdataset}/@/boot/kernel/kernel ${out} -v"
+ echo " kfreebsd_loadenv ${shortdataset}@/boot/device.hints"
+ cat /tmp/.grubdataset.$$.2
+
+ # Set any options
+ cat << EOF
+ }
+EOF
+
+ if [ -e "/etc/defaults/pcbsd" ] ; then
+ # Next lets do display wizard
+ #################################
+ cat << EOF
+ menuentry "Run the Display Wizard" {
+EOF
+ # Get the dataset guts
+ cat /tmp/.grubdataset.$$.1
+ echo " kfreebsd ${shortdataset}/@/boot/kernel/kernel ${out}"
+ echo " kfreebsd_loadenv ${shortdataset}@/boot/device.hints"
+ cat /tmp/.grubdataset.$$.2
+
+ # Set any options
+ cat << EOF
+ set kFreeBSD.runwiz=YES
+ }
+EOF
+ # Now for vesa mode
+ #################################
+ cat << EOF
+ menuentry "Run X in vesa mode" {
+EOF
+ # Get the dataset guts
+ cat /tmp/.grubdataset.$$.1
+ echo " kfreebsd ${shortdataset}/@/boot/kernel/kernel ${out}"
+ echo " kfreebsd_loadenv ${shortdataset}@/boot/device.hints"
+ cat /tmp/.grubdataset.$$.2
+
+ # Set any options
+ cat << EOF
+ set kFreeBSD.xvesa=YES
+ }
+EOF
+ # Now for non-xorg mode
+ #################################
+ cat << EOF
+ menuentry "Boot to console (Disable X)" {
+EOF
+ # Get the dataset guts
+ cat /tmp/.grubdataset.$$.1
+ echo " kfreebsd ${shortdataset}/@/boot/kernel/kernel ${out}"
+ echo " kfreebsd_loadenv ${shortdataset}@/boot/device.hints"
+ cat /tmp/.grubdataset.$$.2
+
+ # Set any options
+ cat << EOF
+ set kFreeBSD.noxorg=YES
+ }
+EOF
+ fi
+
+
+ # Lastly lets close the submenu section
+ cat << EOF
+}
+
+EOF
+ done
+
+ # Cleanup after ourselves
+ if [ -e "/tmp/.grubdataset.$$.1" ] ; then
+ rm /tmp/.grubdataset.$$.1
+ rm /tmp/.grubdataset.$$.2
+ fi
+}
+
+# Detect our types of disk layouts
+detect_beadm
+
diff --git a/sysutils/grub2-pcbsd/files/30_os-prober.in b/sysutils/grub2-pcbsd/files/30_os-prober.in
new file mode 100644
index 000000000000..4a58fdecd57f
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/30_os-prober.in
@@ -0,0 +1,140 @@
+#!/bin/sh
+#
+# Copyright 2015 iXsystems (Kris Moore)
+# All rights reserved
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted providing that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Check if we have beadm installed, if not skip this file
+if [ ! -e "/usr/local/sbin/beadm" ] ; then exit 0; fi
+
+# Script to detect other NON BSD OS's and add to grub.cfg
+
+check_ntfs_part()
+{
+ local disk="$1"
+
+ fs_uuid=`grub-probe --device /dev/${disk} --target=fs_uuid 2>/dev/null`
+ if [ -z "$fs_uuid" ] ; then
+ echo "Warning: Could not get fs_uuid for $disk"
+ return
+ fi
+
+ cat << EOF
+menuentry "Microsoft Windows ($disk)" {
+ search --no-floppy --fs-uuid --set=root $fs_uuid
+ chainloader +1
+}
+EOF
+}
+
+print_uefichain() {
+ cat << EOF
+menuentry "Chainload Disk (hd${hdnum} - $1)" {
+ set root=('hd${hdnum},${rootpre}1')
+ chainloader $1
+}
+
+EOF
+}
+
+if [ -e "/usr/local/etc/default/grub" ] ; then
+ . /usr/local/etc/default/grub
+fi
+if [ -n "$GRUB_NODUALBOOT" ] ; then
+ exit 0
+fi
+
+# Look for file-systems on the zpool disk
+for disk in `zpool status | grep ONLINE | grep -v "state:" | awk '{print $1}'`
+do
+ disk="`echo $disk | sed 's|.eli||g'`"
+ if [ ! -e "/dev/$disk" ] ; then continue ; fi
+
+ # Get the parent disk name
+ parentdisk=`grub-probe --target=disk --device /dev/$disk 2>/dev/null`
+ parentdisk="`echo $parentdisk | sed 's|/dev/||g'`"
+ if [ ! -e "/dev/$parentdisk" ] ; then continue ; fi
+
+ for ldisk in `cd /dev/ && ls ${parentdisk}s[0-9] ${parentdisk}p[0-99] 2>/dev/null`
+ do
+ fs_type=`grub-probe --device /dev/${ldisk} --target=fs 2>/dev/null`
+ case $fs_type in
+ ntfs) check_ntfs_part "$ldisk" ;; # Start checking for NTFS
+ *) ;; # Unknown for now, add more!
+ esac
+ done
+done
+
+# Look for other disks to chainload
+hdnum=0
+for disk in `cd /dev/ && ls ada[0-9] da[0-9] 2>/dev/null`
+do
+ # Skip disks apart of zpool
+ zpool status | grep ONLINE | grep -v "state:" | grep -q "$disk"
+ if [ $? -eq 0 ] ; then
+ hdnum=`expr $hdnum + 1`
+ continue
+ fi
+
+ # Check if the first partition on this disk is EFI
+ if [ -e "/dev/${disk}s1" ] ; then
+ fp="/dev/${disk}s1"
+ rootpre=""
+ else
+ fp="/dev/${disk}p1"
+ rootpre="gpt"
+ fi
+
+ # Add UEFI chainloader
+ if [ "`grub-probe --device -t fs $fp 2>/dev/null`" = "fat" ] ; then
+
+ # Lets mount the FAT partition and look for UEFI boots
+ uefimnt="/tmp/.grub-uefi.$$"
+ if [ ! -d "$uefimnt" ] ; then mkdir $uefimnt; fi
+ mount_msdosfs $fp $uefimnt
+ if [ $? -eq 0 ] ; then
+ if [ -e "${uefimnt}/EFI/Boot/bootx64.efi" ] ; then
+ print_uefichain "/EFI/Boot/bootx64.efi"
+ fi
+ cd $uefimnt
+ for i in `find . | grep \.efi$ | grep -v "./EFI/Boot/bootx64.efi"`
+ do
+ i="`echo $i | sed 's|\./|/|g'`"
+ print_uefichain "$i"
+ done
+ cd /dev
+ umount $uefimnt
+ rmdir $uefimnt
+ fi
+
+ else
+ # Add BIOS chainloader
+ cat << EOF
+menuentry "Chainload Disk (hd${hdnum})" {
+ set root=(hd${hdnum})
+ chainloader +1
+}
+EOF
+ fi
+ hdnum=`expr $hdnum + 1`
+done
diff --git a/sysutils/grub2-pcbsd/files/50_otherbe.in b/sysutils/grub2-pcbsd/files/50_otherbe.in
new file mode 100644
index 000000000000..6d527cf68b82
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/50_otherbe.in
@@ -0,0 +1,396 @@
+#!/bin/sh
+#
+# Copyright 2015 iXsystems (Kris Moore)
+# All rights reserved
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted providing that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Script to detect TrueOS / PC-BSD disk installations and create grub
+# entries for them
+
+# Check if we have beadm installed, if not skip this file
+if [ ! -e "/usr/local/sbin/beadm" ] ; then exit 0; fi
+
+ROOTFS=`mount | awk '/ \/ / {print $1}'`
+BEDS="$( echo ${ROOTFS} | awk -F '/' '{print $2}' )"
+if [ "$BEDS" = "dev" ] ; then BEDS="ROOT"; fi
+
+serial=0;
+console=0;
+for x in ${GRUB_TERMINAL_OUTPUT}; do
+ if [ xserial = "x$x" ]; then
+ serial=1;
+ fi
+ if [ xgfxterm = "x$x" ]; then
+ console=1;
+ fi
+ if [ xconsole = "x$x" ]; then
+ console=1;
+ fi
+done
+
+if [ "x$serial" = "x1" ]; then
+ if [ "x$console" = "x1" ]; then
+ out="-Dh"
+ else
+ out="-h"
+ fi
+fi
+
+display_loaderopts()
+{
+ # Optional ARG1, set to a ZFS dataset to mount and read values from
+ if [ -n "$1" ] ; then
+ fMnt="/mnt.$$"
+ mkdir $fMnt
+ mount -t zfs ${1} $fMnt >/dev/null
+ if [ $? -ne 0 ] ; then
+ echo "Failed to mount ${1}" >&2
+ return
+ fi
+ else
+ fMnt=""
+ fi
+
+ # Create our placeholder to save _load entries to parse
+ touch /tmp/.lRObjs.$$
+ touch /tmp/.lSysCtls.$$
+
+ # Loader files, in order of which to read them
+ lFiles="${fMnt}/boot/loader.conf.local ${fMnt}/boot/loader.conf ${fMnt}/boot/loader.conf.trueos ${fMnt}/boot/loader.conf.pcbsd"
+ for f in $lFiles
+ do
+ if [ ! -e "$f" ] ; then continue ; fi
+
+ # Lets parse any of the _load= lines
+ grep "_load=" ${f} | grep -v "^#" >/tmp/.lObjs.$$
+ while read line
+ do
+ loadVal="`echo $line | cut -d '=' -f 1`"
+ # Is this value already set in a higher priority file?
+ grep -q "^${loadVal}" /tmp/.lRObjs.$$
+ if [ $? -eq 0 ];then continue; fi
+
+ # Save this value for later
+ echo "$line" >> /tmp/.lRObjs.$$
+ haveObjs=1
+
+ done < /tmp/.lObjs.$$
+ rm /tmp/.lObjs.$$
+
+ # Lets look for any sysctls to set
+ grep "." ${f} | grep "=" | grep -v "^#" | grep -v "_load" >/tmp/.sObjs.$$
+ while read line
+ do
+ loadVal="`echo $line | cut -d '=' -f 1`"
+ # Is this value already set in a higher priority file?
+ grep -q "^${loadVal}" /tmp/.lSysCtls.$$
+ if [ $? -eq 0 ];then continue; fi
+
+ # Save this value for later
+ echo "$line" >> /tmp/.lSysCtls.$$
+ haveSysCtls=1
+
+ done < /tmp/.sObjs.$$
+ rm /tmp/.sObjs.$$
+ done
+
+ # Using GELI encryption?
+ haveGELI="false"
+
+ # Now lets echo out the modules to load
+ if [ "$haveObjs" = "1" ] ; then
+ while read line
+ do
+ echo "$line" | grep -q '"YES"'
+ if [ $? -ne 0 ] ; then continue ; fi
+ module="`echo $line | cut -d '=' -f 1 | sed 's|_load||g'`"
+ # Try to locate module now
+ if [ -e "${fMnt}/boot/kernel/${module}.ko" ] ; then
+ mPath="kernel"
+ elif [ -e "${fMnt}/boot/modules/${module}.ko" ] ; then
+ mPath="modules"
+ else
+ # This isn't a module that we can see, lets set it as a variable
+ #echo "No such module $line, setting as a variable" >&2
+ echo "$line" >> /tmp/.lSysCtls.$$
+ continue
+ fi
+
+ # Are we loading GELI module?
+ if [ "$module" = "geom_eli" ] ; then haveGELI="true" ; fi
+
+ echo " kfreebsd_module_elf ${loadPrefix}/@/boot/${mPath}/${module}.ko"
+ done < /tmp/.lRObjs.$$
+ fi
+
+ # Add our compat kenv lines
+ echo " set kFreeBSD.bootfile=\"kernel\""
+ echo " set kFreeBSD.kernel=\"kernel\""
+ echo " set kFreeBSD.kernel_options=\"\""
+ echo " set kFreeBSD.kernelname=\"/boot/kernel/kernel\""
+ echo " set kFreeBSD.module_path=\"/boot/kernel;/boot/modules\""
+
+ # Any kenv to set?
+ if [ "$haveSysCtls" = "1" ] ; then
+ while read line
+ do
+ # Strip out the vfs.root.mountfrom, we set that elsewhere
+ echo "$line" | grep -q "vfs.root.mountfrom"
+ if [ $? -eq 0 ] ; then continue ; fi
+
+ line="`echo $line | sed 's|"||g'`"
+ key="`echo $line | cut -d '=' -f 1`"
+ val="`echo $line | cut -d '=' -f 2`"
+ if [ -z "$key" -o -z "$val" ] ; then continue ; fi
+ echo " set kFreeBSD.${key}=\"${val}\""
+ done < /tmp/.lSysCtls.$$
+ fi
+
+ rm /tmp/.lRObjs.$$
+ rm /tmp/.lSysCtls.$$
+ if [ -n "$1" ] ; then
+ umount /mnt.$$ >/dev/null
+ rmdir /mnt.$$ >/dev/null
+ fi
+
+ # Set the grub.platform kenv variable
+ echo " set kFreeBSD.grub.platform=\"\$grub_platform\""
+
+ # See if we need to do GELI passphrase passthrough
+ if [ "$haveGELI" = "true" ] ; then
+ echo " set kFreeBSD.kern.geom.eli.passphrase=\"\$pass\""
+ fi
+}
+
+detect_beadm()
+{
+ /usr/bin/which -s beadm >/dev/null 2>/dev/null
+ if [ $? -ne 0 ] ; then return 0; fi
+
+ # Check if we are running from the installer and use its beadm
+ if [ -e "/root/beadm.install" ] ; then
+ BEADM="/root/beadm.install"
+
+ # Check if this is valid
+ testBE=`$BEADM list`
+ if [ -z "$testBE" ] ; then
+ # No BE's, lets switch back to regular mode
+ BEADM="`/usr/bin/which beadm`"
+ fi
+ else
+ BEADM="`/usr/bin/which beadm`"
+ fi
+
+ ${BEADM} list >/dev/null 2>/dev/null
+ if [ $? -ne 0 ] ; then return 0; fi
+
+
+ if [ -e "/etc/defaults/pcbsd" ] ; then
+ NICK="PC-BSD"
+ else
+ NICK="TrueOS"
+ fi
+
+ # Now we will list all the non-default BEs
+ $BEADM list -H >/tmp/.grub-beadm.$$ 2>/dev/null
+ while read line
+ do
+ be=`echo $line | awk '{print $1}'`
+ flags=`echo $line | awk '{print $2}'`
+
+ # Skip the active BE
+ if [ "$flags" = "NR" -o "$flags" = "R" ] ; then
+ continue
+ fi
+ BE_LIST="${be} ${BE_LIST}"
+ done < /tmp/.grub-beadm.$$
+ rm /tmp/.grub-beadm.$$
+
+ if [ -z "$BE_LIST" ] ; then return; fi
+
+ echo "submenu \"Boot Environment Menu\" {"
+
+ # Get list of beadm datasets
+ for b in $BE_LIST
+ do
+ # Got a beadm snapshot, lets get the complete dataset name
+ beLine=`${BEADM} list -a | grep "/$BEDS/${b}"`
+ cdataset=`echo $beLine | awk '{print $1}'`
+ cdatadate=`echo $beLine | awk '{print $5}'`
+ cdatatime=`echo $beLine | awk '{print $6}'`
+ ztank=`echo $cdataset | cut -d '/' -f 1`
+ shortdataset="/`echo $cdataset | cut -d '/' -f 2-5`"
+ # Get the BE nickname if it exists
+ beNickName=`${BEADM} list | grep "^${b} " | tr -s ' ' | cut -d ' ' -f 7-12`
+ if [ -z "$beNickName" ] ; then
+ beNickName="$b"
+ fi
+
+ # First part of this dataset
+ cat > /tmp/.grubdataset.$$.1 << EOF
+ insmod zfs
+ search --no-floppy -s -l $ztank
+EOF
+
+ # Second part of loader to save
+ cat > /tmp/.grubdataset.$$.2 << EOF
+ kfreebsd_module ${shortdataset}/@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache
+ set kFreeBSD.vfs.root.mountfrom=zfs:$cdataset
+EOF
+
+ # Now lets look for options in loader.conf to load
+ loadPrefix="${shortdataset}"
+ # If this is the current mounted dataset, we can skip mounting it
+ mount | grep -q -e "$cdataset on / (" -e "$cdataset on /mnt ("
+ if [ $? -eq 0 ] ; then
+ display_loaderopts >>/tmp/.grubdataset.$$.2
+ else
+ display_loaderopts $cdataset >> /tmp/.grubdataset.$$.2
+ fi
+
+ # Lets start a submenu for each BE
+cat << EOF
+
+submenu "${NICK} (${beNickName}) - ${cdatadate} ${cdatatime}" {
+EOF
+
+ # Lets do the default entry first
+ #################################
+ cat << EOF
+ menuentry "Normal Bootup" {
+EOF
+ # Get the dataset guts
+ cat /tmp/.grubdataset.$$.1
+ echo " kfreebsd ${shortdataset}/@/boot/kernel/kernel ${out}"
+ echo " kfreebsd_loadenv ${shortdataset}@/boot/device.hints"
+ cat /tmp/.grubdataset.$$.2
+
+ # Set any options
+ cat << EOF
+ }
+EOF
+
+ # Next lets do single user mode
+ #################################
+ cat << EOF
+ menuentry "Single User Mode" {
+EOF
+ # Get the dataset guts
+ cat /tmp/.grubdataset.$$.1
+ echo " kfreebsd ${shortdataset}/@/boot/kernel/kernel ${out} -s"
+ echo " kfreebsd_loadenv ${shortdataset}@/boot/device.hints"
+ cat /tmp/.grubdataset.$$.2
+
+ # Set any options
+ cat << EOF
+ }
+EOF
+
+ # Next lets do verbose mode
+ #################################
+ cat << EOF
+ menuentry "Verbose Mode" {
+EOF
+ # Get the dataset guts
+ cat /tmp/.grubdataset.$$.1
+ echo " kfreebsd ${shortdataset}/@/boot/kernel/kernel ${out} -v"
+ echo " kfreebsd_loadenv ${shortdataset}@/boot/device.hints"
+ cat /tmp/.grubdataset.$$.2
+
+ # Set any options
+ cat << EOF
+ }
+EOF
+
+ if [ -e "/etc/defaults/pcbsd" ] ; then
+ # Next lets do display wizard
+ #################################
+ cat << EOF
+ menuentry "Run the Display Wizard" {
+EOF
+ # Get the dataset guts
+ cat /tmp/.grubdataset.$$.1
+ echo " kfreebsd ${shortdataset}/@/boot/kernel/kernel ${out}"
+ echo " kfreebsd_loadenv ${shortdataset}@/boot/device.hints"
+ cat /tmp/.grubdataset.$$.2
+
+ # Set any options
+ cat << EOF
+ set kFreeBSD.runwiz=YES
+ }
+EOF
+ # Now for vesa mode
+ #################################
+ cat << EOF
+ menuentry "Run X in vesa mode" {
+EOF
+ # Get the dataset guts
+ cat /tmp/.grubdataset.$$.1
+ echo " kfreebsd ${shortdataset}/@/boot/kernel/kernel ${out}"
+ echo " kfreebsd_loadenv ${shortdataset}@/boot/device.hints"
+ cat /tmp/.grubdataset.$$.2
+
+ # Set any options
+ cat << EOF
+ set kFreeBSD.xvesa=YES
+ }
+EOF
+ # Now for non-xorg mode
+ #################################
+ cat << EOF
+ menuentry "Boot to console (Disable X)" {
+EOF
+ # Get the dataset guts
+ cat /tmp/.grubdataset.$$.1
+ echo " kfreebsd ${shortdataset}/@/boot/kernel/kernel ${out}"
+ echo " kfreebsd_loadenv ${shortdataset}@/boot/device.hints"
+ cat /tmp/.grubdataset.$$.2
+
+ # Set any options
+ cat << EOF
+ set kFreeBSD.noxorg=YES
+ }
+EOF
+ fi
+
+
+ # Lastly lets close the submenu section
+ cat << EOF
+}
+
+EOF
+ done
+
+ echo "}"
+ echo ""
+
+ # Cleanup after ourselves
+ if [ -e "/tmp/.grubdataset.$$.1" ] ; then
+ rm /tmp/.grubdataset.$$.1
+ rm /tmp/.grubdataset.$$.2
+ fi
+}
+
+# Detect our types of disk layouts
+detect_beadm
+
diff --git a/sysutils/grub2-pcbsd/files/patch-configure.ac b/sysutils/grub2-pcbsd/files/patch-configure.ac
new file mode 100644
index 000000000000..0410fc189060
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/patch-configure.ac
@@ -0,0 +1,20 @@
+--- configure.ac.orig 2015-06-03 14:54:01 UTC
++++ configure.ac
+@@ -1459,7 +1459,7 @@ fi
+
+ if test x"$starfield_excuse" = x; then
+ for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do
+- for dir in . /usr/src /usr/share/fonts/X11/misc /usr/share/fonts/truetype/ttf-dejavu /usr/share/fonts/dejavu /usr/share/fonts/truetype; do
++ for dir in . /usr/src /usr/local/lib/X11/fonts/dejavu /usr/share/fonts/truetype/ttf-dejavu /usr/local/share/fonts/dejavu /usr/share/fonts/truetype; do
+ if test -f "$dir/DejaVuSans.$ext"; then
+ DJVU_FONT_SOURCE="$dir/DejaVuSans.$ext"
+ break 2
+@@ -1481,7 +1481,7 @@ AC_SUBST([DJVU_FONT_SOURCE])
+ FONT_SOURCE=
+
+ for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do
+- for dir in . /usr/src /usr/share/fonts/X11/misc /usr/share/fonts/unifont /usr/share/fonts/uni /usr/share/fonts/truetype/unifont /usr/share/fonts/misc; do
++ for dir in . /usr/src /usr/local/lib/X11/fonts/local /usr/local/share/fonts/unifont /usr/local/share/fonts/gnu-unifont /usr/share/fonts/truetype/unifont /usr/share/fonts/misc; do
+ if test -f "$dir/unifont.$ext"; then
+ md5="$(md5sum "$dir/unifont.$ext"|awk '{ print $1; }')"
+ # PCF and BDF from version 6.3 isn't hanled properly by libfreetype.
diff --git a/sysutils/grub2-pcbsd/files/patch-grub-core_disk_geli.c b/sysutils/grub2-pcbsd/files/patch-grub-core_disk_geli.c
new file mode 100644
index 000000000000..f8d1f9bed333
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/patch-grub-core_disk_geli.c
@@ -0,0 +1,12 @@
+--- grub-core/disk/geli.c.orig 2015-01-30 16:34:55 UTC
++++ grub-core/disk/geli.c
+@@ -445,6 +445,9 @@ recover_key (grub_disk_t source, grub_cr
+ if (!grub_password_get (passphrase, MAX_PASSPHRASE))
+ return grub_error (GRUB_ERR_BAD_ARGUMENT, "Passphrase not supplied");
+
++ /* Set the GELI passphrase to GRUB env, for passing to FreeBSD kernel */
++ grub_env_set ("gelipassphrase", passphrase);
++
+ /* Calculate the PBKDF2 of the user supplied passphrase. */
+ if (grub_le_to_cpu32 (header.niter) != 0)
+ {
diff --git a/sysutils/grub2-pcbsd/files/patch-grub-core_lib_libgcrypt_src_types.h b/sysutils/grub2-pcbsd/files/patch-grub-core_lib_libgcrypt_src_types.h
new file mode 100644
index 000000000000..9b353e42f498
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/patch-grub-core_lib_libgcrypt_src_types.h
@@ -0,0 +1,11 @@
+--- grub-core/lib/libgcrypt/src/types.h.orig 2014-03-03 16:00:26 UTC
++++ grub-core/lib/libgcrypt/src/types.h
+@@ -113,6 +113,8 @@
+ #endif
+ #endif
+
++typedef uint64_t u64;
++
+ typedef union {
+ int a;
+ short b;
diff --git a/sysutils/grub2-pcbsd/files/patch-grub-core_loader_i386_bsd.c b/sysutils/grub2-pcbsd/files/patch-grub-core_loader_i386_bsd.c
new file mode 100644
index 000000000000..b2e3d9793f4f
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/patch-grub-core_loader_i386_bsd.c
@@ -0,0 +1,18 @@
+--- grub-core/loader/i386/bsd.c.orig 2015-01-30 16:34:55 UTC
++++ grub-core/loader/i386/bsd.c
+@@ -416,11 +416,14 @@ grub_freebsd_add_meta_module (const char
+ grub_addr_t addr, grub_uint32_t size)
+ {
+ const char *name;
+- name = grub_strrchr (filename, '/');
++ /* Don't strip the full path, some FreeBSD functionality, such
++ * as dtrace, rely on this. Instead only strip out the portion after ZFS @ sign */
++ name = grub_strrchr (filename, '@');
+ if (name)
+ name++;
+ else
+ name = filename;
++
+ if (grub_strcmp (type, "/boot/zfs/zpool.cache") == 0)
+ name = "/boot/zfs/zpool.cache";
+
diff --git a/sysutils/grub2-pcbsd/files/patch-grub-core_osdep_freebsd_getroot.c b/sysutils/grub2-pcbsd/files/patch-grub-core_osdep_freebsd_getroot.c
new file mode 100644
index 000000000000..a25e60121570
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/patch-grub-core_osdep_freebsd_getroot.c
@@ -0,0 +1,108 @@
+--- grub-core/osdep/freebsd/getroot.c.orig 2015-01-23 02:27:45 UTC
++++ grub-core/osdep/freebsd/getroot.c
+@@ -296,6 +296,105 @@ grub_util_get_grub_dev_os (const char *o
+ return grub_dev;
+ }
+
++int grub_util_check_geom_label(const char *name)
++{
++ struct gmesh mesh;
++ struct gclass *class;
++ struct ggeom *geom;
++ struct gprovider *pp;
++ struct gprovider *pplabel;
++ struct gconsumer *cp;
++ const char *geom_name;
++ const char *test_name;
++ int err;
++
++ err = geom_gettree (&mesh);
++ if (err != 0)
++ grub_util_error ("%s", _("couldn't open geom"));
++
++ LIST_FOREACH (class, &mesh.lg_class, lg_class)
++ if (strcasecmp (class->lg_name, "label") == 0)
++ break;
++ if (!class)
++ grub_util_error ("%s", _("couldn't find geom `label' class"));
++
++ if (strncmp (name, "/dev/", sizeof ("/dev/") - 1) == 0)
++ test_name = name + sizeof ("/dev/") - 1;
++ else
++ test_name = name;
++
++ LIST_FOREACH (geom, &class->lg_geom, lg_geom)
++ {
++ LIST_FOREACH(pp, &geom->lg_provider, lg_provider)
++ {
++ geom_name = pp->lg_name;
++ if (strcasecmp (geom_name, test_name) != 0)
++ continue;
++
++ LIST_FOREACH(cp, &geom->lg_consumer, lg_consumer)
++ {
++ pplabel = cp->lg_provider;
++ if (pplabel == NULL)
++ continue;
++ return 1;
++ }
++ }
++ }
++ return 0;
++}
++
++const char *
++grub_util_convert_geom_label_to_dev (const char *name, int *full_path)
++{
++ struct gmesh mesh;
++ struct gclass *class;
++ struct ggeom *geom;
++ struct gprovider *pp;
++ struct gprovider *pplabel;
++ struct gconsumer *cp;
++ static char buf[256];
++ const char *geom_name;
++ int err;
++
++ grub_util_info ("Converting label '%s' to device", name);
++
++ err = geom_gettree (&mesh);
++ if (err != 0)
++ grub_util_error ("%s", _("couldn't open geom"));
++
++ LIST_FOREACH (class, &mesh.lg_class, lg_class)
++ if (strcasecmp (class->lg_name, "label") == 0)
++ break;
++ if (!class)
++ grub_util_error ("%s", _("couldn't find geom `label' class"));
++
++
++ LIST_FOREACH (geom, &class->lg_geom, lg_geom)
++ {
++ LIST_FOREACH(pp, &geom->lg_provider, lg_provider)
++ {
++ geom_name = pp->lg_name;
++ if (strcasecmp (geom_name, name) != 0)
++ continue;
++
++ LIST_FOREACH(cp, &geom->lg_consumer, lg_consumer)
++ {
++ pplabel = cp->lg_provider;
++ if (pplabel == NULL)
++ continue;
++
++ if ( full_path )
++ snprintf(buf, sizeof(buf), "/dev/%s", pplabel->lg_name);
++ else
++ snprintf(buf, sizeof(buf), "%s", pplabel->lg_name);
++ return buf;
++ }
++ }
++ }
++ grub_util_error ("%s", _("couldn't convert gptid to real device name"));
++ return 0;
++}
++
+ /* FIXME: geom actually gives us the whole container hierarchy.
+ It can be used more efficiently than this. */
+ void
diff --git a/sysutils/grub2-pcbsd/files/patch-grub-core_osdep_unix_getroot.c b/sysutils/grub2-pcbsd/files/patch-grub-core_osdep_unix_getroot.c
new file mode 100644
index 000000000000..824a9c552c1e
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/patch-grub-core_osdep_unix_getroot.c
@@ -0,0 +1,15 @@
+--- grub-core/osdep/unix/getroot.c.orig 2015-06-03 14:54:01 UTC
++++ grub-core/osdep/unix/getroot.c
+@@ -507,6 +507,12 @@ grub_guess_root_devices (const char *dir
+ if (!os_dev)
+ os_dev = find_root_devices_from_libzfs (dir);
+
++#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
++ if (os_dev)
++ if ( grub_util_check_geom_label(os_dev) )
++ os_dev = grub_util_convert_geom_label_to_dev (os_dev + sizeof ("/dev/") - 1, 1);
++#endif
++
+ if (os_dev)
+ {
+ char **cur;
diff --git a/sysutils/grub2-pcbsd/files/patch-grub-core_osdep_unix_platform.c b/sysutils/grub2-pcbsd/files/patch-grub-core_osdep_unix_platform.c
new file mode 100644
index 000000000000..15b7cb871052
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/patch-grub-core_osdep_unix_platform.c
@@ -0,0 +1,100 @@
+--- grub-core/osdep/unix/platform.c.orig 2014-03-03 16:00:26 UTC
++++ grub-core/osdep/unix/platform.c
+@@ -81,52 +81,8 @@ get_ofpathname (const char *dev)
+ static void
+ grub_install_remove_efi_entries_by_distributor (const char *efi_distributor)
+ {
+- int fd;
+- pid_t pid = grub_util_exec_pipe ((const char * []){ "efibootmgr", NULL }, &fd);
+- char *line = NULL;
+- size_t len = 0;
+-
+- if (!pid)
+- {
+- grub_util_warn (_("Unable to open stream from %s: %s"),
+- "efibootmgr", strerror (errno));
+- return;
+- }
+-
+- FILE *fp = fdopen (fd, "r");
+- if (!fp)
+- {
+- grub_util_warn (_("Unable to open stream from %s: %s"),
+- "efibootmgr", strerror (errno));
+- return;
+- }
+-
+- line = xmalloc (80);
+- len = 80;
+- while (1)
+- {
+- int ret;
+- char *bootnum;
+- ret = getline (&line, &len, fp);
+- if (ret == -1)
+- break;
+- if (grub_memcmp (line, "Boot", sizeof ("Boot") - 1) != 0
+- || line[sizeof ("Boot") - 1] < '0'
+- || line[sizeof ("Boot") - 1] > '9')
+- continue;
+- if (!strcasestr (line, efi_distributor))
+- continue;
+- bootnum = line + sizeof ("Boot") - 1;
+- bootnum[4] = '\0';
+- if (!verbosity)
+- grub_util_exec ((const char * []){ "efibootmgr", "-q",
+- "-b", bootnum, "-B", NULL });
+- else
+- grub_util_exec ((const char * []){ "efibootmgr",
+- "-b", bootnum, "-B", NULL });
+- }
+-
+- free (line);
++ // We don't have efibootmgr on FreeBSD, have to set externally
++ return;
+ }
+
+ void
+@@ -134,40 +90,8 @@ grub_install_register_efi (grub_device_t
+ const char *efifile_path,
+ const char *efi_distributor)
+ {
+- const char * efidir_disk;
+- int efidir_part;
+- efidir_disk = grub_util_biosdisk_get_osdev (efidir_grub_dev->disk);
+- efidir_part = efidir_grub_dev->disk->partition ? efidir_grub_dev->disk->partition->number + 1 : 1;
+-
+- if (grub_util_exec_redirect_null ((const char * []){ "efibootmgr", "--version", NULL }))
+- {
+- /* TRANSLATORS: This message is shown when required executable `%s'
+- isn't found. */
+- grub_util_error (_("%s: not found"), "efibootmgr");
+- }
+-
+- /* On Linux, we need the efivars kernel modules. */
+-#ifdef __linux__
+- grub_util_exec ((const char * []){ "modprobe", "-q", "efivars", NULL });
+-#endif
+- /* Delete old entries from the same distributor. */
+- grub_install_remove_efi_entries_by_distributor (efi_distributor);
+-
+- char *efidir_part_str = xasprintf ("%d", efidir_part);
+-
+- if (!verbosity)
+- grub_util_exec ((const char * []){ "efibootmgr", "-q",
+- "-c", "-d", efidir_disk,
+- "-p", efidir_part_str, "-w",
+- "-L", efi_distributor, "-l",
+- efifile_path, NULL });
+- else
+- grub_util_exec ((const char * []){ "efibootmgr",
+- "-c", "-d", efidir_disk,
+- "-p", efidir_part_str, "-w",
+- "-L", efi_distributor, "-l",
+- efifile_path, NULL });
+- free (efidir_part_str);
++ // We don't have efibootmgr on FreeBSD, have to set externally
++ return;
+ }
+
+ void
diff --git a/sysutils/grub2-pcbsd/files/patch-grub-core_partmap_gpt.c b/sysutils/grub2-pcbsd/files/patch-grub-core_partmap_gpt.c
new file mode 100644
index 000000000000..5ed32e5fd0ae
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/patch-grub-core_partmap_gpt.c
@@ -0,0 +1,20 @@
+--- grub-core/partmap/gpt.c.orig 2014-10-20 16:16:07 UTC
++++ grub-core/partmap/gpt.c
+@@ -37,6 +37,7 @@ static const grub_gpt_part_type_t grub_g
+
+ #ifdef GRUB_UTIL
+ static const grub_gpt_part_type_t grub_gpt_partition_type_bios_boot = GRUB_GPT_PARTITION_TYPE_BIOS_BOOT;
++static const grub_gpt_part_type_t grub_gpt_partition_type_freebsd_boot = GRUB_GPT_PARTITION_TYPE_FREEBSD_BOOT;
+ #endif
+
+ /* 512 << 7 = 65536 byte sectors. */
+@@ -155,7 +156,8 @@ find_usable_region (grub_disk_t disk __a
+ disk->partition = p2;
+
+ /* If there's an embed region, it is in a dedicated partition. */
+- if (! grub_memcmp (&gptdata.type, &grub_gpt_partition_type_bios_boot, 16))
++ if (! grub_memcmp (&gptdata.type, &grub_gpt_partition_type_bios_boot, 16) ||
++ ! grub_memcmp (&gptdata.type, &grub_gpt_partition_type_freebsd_boot, 16))
+ {
+ ctx->start = p->start;
+ ctx->len = p->len;
diff --git a/sysutils/grub2-pcbsd/files/patch-include_grub_efiemu_runtime.h b/sysutils/grub2-pcbsd/files/patch-include_grub_efiemu_runtime.h
new file mode 100644
index 000000000000..272a7fc22e4a
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/patch-include_grub_efiemu_runtime.h
@@ -0,0 +1,11 @@
+--- include/grub/efiemu/runtime.h.orig 2021-07-05 10:59:57.352037000 +0000
++++ include/grub/efiemu/runtime.h 2021-07-05 11:02:38.126967000 +0000
+@@ -29,7 +29,7 @@
+
+ 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/sysutils/grub2-pcbsd/files/patch-include_grub_emu_getroot.h b/sysutils/grub2-pcbsd/files/patch-include_grub_emu_getroot.h
new file mode 100644
index 000000000000..10e7f60c58ae
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/patch-include_grub_emu_getroot.h
@@ -0,0 +1,11 @@
+--- include/grub/emu/getroot.h.orig 2015-01-23 02:27:45 UTC
++++ include/grub/emu/getroot.h
+@@ -44,6 +44,8 @@ char *grub_util_get_grub_dev (const char
+ #if defined (__FreeBSD__) || defined(__FreeBSD_kernel__)
+ void grub_util_follow_gpart_up (const char *name, grub_disk_addr_t *off_out,
+ char **name_out);
++int grub_util_check_geom_label(const char *name);
++const char *grub_util_convert_geom_label_to_dev (const char *name, int *full_path);
+ #endif
+
+ #include <sys/stat.h>
diff --git a/sysutils/grub2-pcbsd/files/patch-include_grub_gpt__partition.h b/sysutils/grub2-pcbsd/files/patch-include_grub_gpt__partition.h
new file mode 100644
index 000000000000..d8da78eea7b3
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/patch-include_grub_gpt__partition.h
@@ -0,0 +1,17 @@
+--- include/grub/gpt_partition.h.orig 2014-03-03 16:00:26 UTC
++++ include/grub/gpt_partition.h
+@@ -43,6 +43,14 @@ typedef struct grub_gpt_part_type grub_g
+ { 0x74, 0x4e, 0x65, 0x65, 0x64, 0x45, 0x46, 0x49 } \
+ }
+
++#define GRUB_GPT_PARTITION_TYPE_FREEBSD_BOOT \
++ { grub_cpu_to_le32_compile_time (0x83bd6b9d), \
++ grub_cpu_to_le16_compile_time (0x7f41), \
++ grub_cpu_to_le16_compile_time (0x11dc), \
++ { 0xbe, 0x0b, 0x00, 0x15, 0x60, 0xb8, 0x4f, 0x0f } \
++ }
++
++
+ #define GRUB_GPT_PARTITION_TYPE_LDM \
+ { grub_cpu_to_le32_compile_time (0x5808C8AAU),\
+ grub_cpu_to_le16_compile_time (0x7E8F), \
diff --git a/sysutils/grub2-pcbsd/files/patch-po_LINGUAS b/sysutils/grub2-pcbsd/files/patch-po_LINGUAS
new file mode 100644
index 000000000000..2dbcb6e4d4cc
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/patch-po_LINGUAS
@@ -0,0 +1,5 @@
+--- po/LINGUAS.orig 2015-01-30 16:30:32 UTC
++++ po/LINGUAS
+@@ -1 +1 @@
+-ast ca da de de@hebrew de_CH en@arabic en@cyrillic en@greek en@hebrew en@piglatin en@quot eo es fi fr gl hu id it ja lt nb nl pa pl pt_BR ru sl sv tr uk vi zh_CN zh_TW
++ast ca da de eo es fi fr gl hu id it ja lt nb nl pa pl pt_BR ru sl sv tr uk vi zh_CN zh_TW
diff --git a/sysutils/grub2-pcbsd/files/patch-util_grub-install.c b/sysutils/grub2-pcbsd/files/patch-util_grub-install.c
new file mode 100644
index 000000000000..bee5b764e6db
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/patch-util_grub-install.c
@@ -0,0 +1,19 @@
+--- util/grub-install.c.orig 2015-06-03 14:54:01 UTC
++++ util/grub-install.c
+@@ -236,7 +236,16 @@ argp_parser (int key, char *arg, struct
+ case ARGP_KEY_ARG:
+ if (install_device)
+ grub_util_error ("%s", _("More than one install device?"));
++#if defined (__FreeBSD__) || defined (__FreeBSD_kernel__)
++ /* Check if passing a FreeBSD geom label */
++ if ( grub_util_check_geom_label(arg) )
++ install_device = \
++ xstrdup(grub_util_convert_geom_label_to_dev (arg + sizeof ("/dev/") - 1, 1));
++ else
++ install_device = xstrdup (arg);
++#else
+ install_device = xstrdup (arg);
++#endif
+ return 0;
+
+ default:
diff --git a/sysutils/grub2-pcbsd/files/patch-util_grub-mkconfig.in b/sysutils/grub2-pcbsd/files/patch-util_grub-mkconfig.in
new file mode 100644
index 000000000000..3fb66966ecc0
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/patch-util_grub-mkconfig.in
@@ -0,0 +1,14 @@
+--- util/grub-mkconfig.in.orig 2015-06-03 14:54:01 UTC
++++ util/grub-mkconfig.in
+@@ -281,3 +281,11 @@ fi
+
+ gettext "done" >&2
+ echo >&2
++
++# If pcbsd-utils are installed, the restamp-grub command will exist
++# Use it to do the grub-install and copy grub.cfg to other BEs
++which restamp-grub >/dev/null 2>/dev/null
++if [ $? -eq 0 ] ; then
++ restamp-grub
++fi
++
diff --git a/sysutils/grub2-pcbsd/files/patch-util_grub-mkconfig__lib.in b/sysutils/grub2-pcbsd/files/patch-util_grub-mkconfig__lib.in
new file mode 100644
index 000000000000..219e3c95aee8
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/patch-util_grub-mkconfig__lib.in
@@ -0,0 +1,21 @@
+--- util/grub-mkconfig_lib.in.orig 2015-06-03 14:54:01 UTC
++++ util/grub-mkconfig_lib.in
+@@ -139,7 +139,17 @@ prepare_grub_to_access_device ()
+ echo "insmod ${module}"
+ done
+
+- fs="`"${grub_probe}" --device $@ --target=fs`"
++ # KPM - 6-24-2013
++ # Add this work-around since GRUB doesn't like to identify ZFS
++ # partitions which are in a raidz configuration, gives Unknown FS error
++ # We can instead look at zpool to see if this device is used though
++ zpool status 2>/dev/null | grep -q "`echo ${device} | sed 's|/dev/||g'`"
++ if [ $? -eq 0 ] ; then
++ fs="zfs"
++ else
++ fs="`"${grub_probe}" --device $@ --target=fs`"
++ fi
++
+ for module in ${fs} ; do
+ echo "insmod ${module}"
+ done
diff --git a/sysutils/grub2-pcbsd/files/patch-util_grub-probe.c b/sysutils/grub2-pcbsd/files/patch-util_grub-probe.c
new file mode 100644
index 000000000000..eb75b0c1587e
--- /dev/null
+++ b/sysutils/grub2-pcbsd/files/patch-util_grub-probe.c
@@ -0,0 +1,19 @@
+--- util/grub-probe.c.orig 2015-06-03 14:54:01 UTC
++++ util/grub-probe.c
+@@ -805,7 +805,16 @@ argp_parser (int key, char *arg, struct
+
+ case ARGP_KEY_ARG:
+ assert (arguments->ndevices < arguments->device_max);
++#if defined (__FreeBSD__) || defined (__FreeBSD_kernel__)
++ /* Check if passing a FreeBSD geom label */
++ if ( grub_util_check_geom_label(arg) )
++ arguments->devices[arguments->ndevices++] = \
++ xstrdup(grub_util_convert_geom_label_to_dev (arg + sizeof ("/dev/") - 1, 1));
++ else
++ arguments->devices[arguments->ndevices++] = xstrdup(arg);
++#else
+ arguments->devices[arguments->ndevices++] = xstrdup(arg);
++#endif
+ break;
+
+ default:
diff --git a/sysutils/grub2-pcbsd/pkg-descr b/sysutils/grub2-pcbsd/pkg-descr
new file mode 100644
index 000000000000..c0099fd599d2
--- /dev/null
+++ b/sysutils/grub2-pcbsd/pkg-descr
@@ -0,0 +1,11 @@
+GNU GRUB is a multiboot boot loader. It was derived from GRUB, the GRand
+Unified Bootloader, which was originally designed and implemented by Erich
+Stefan Boleyn.
+
+This port does not install GRUB on the master boot record of your hard drive.
+To do this you will need to read the info page that is installed by the port.
+
+This port includes additional patches and fixes making it work properly
+with ZFS boot-environments.
+
+WWW: http://www.gnu.org/software/grub/
diff --git a/sysutils/grub2-pcbsd/pkg-message b/sysutils/grub2-pcbsd/pkg-message
new file mode 100644
index 000000000000..8acdc7aa8683
--- /dev/null
+++ b/sysutils/grub2-pcbsd/pkg-message
@@ -0,0 +1,40 @@
+[
+{ type: install
+ message: <<EOM
+To install GRUB as your boot-loader, use the following command:
+
+# grub-install /dev/ada0 (replace ada0 with your disk)
+# grub-mkconfig -o /boot/grub/grub.cfg
+
+This version of GRUB can be used traditionally or with
+PC-BSD style boot environments.
+
+Additionally, when using GPT, you must have a created a
+"bios-boot" partition at install time. This partition is used
+for GRUB's modules for GELI/ZFS and related bits.
+
+Traditional Setup
+--
+
+When the "beadm" utility is not present, grub-mkconfig
+will use the standard GRUB detection scripts for setting
+up your /boot/grub/grub.cfg file.
+
+
+Boot Environment Setup
+--
+
+If the "beadm" command is installed on the system,
+grub-mkconfig will use it to setup /boot/grub/grub.cfg
+
+For it to properly detect / populate your BE menus you
+must have your root zpool setup in the following manner:
+
+<tank>/ROOT/<be>
+
+Where <tank> is your zpool, and <be> is your '/' mountpoint.
+The "beadm" utility must be installed and working before using
+GRUB utilities.
+EOM
+}
+]
diff --git a/sysutils/grub2-pcbsd/pkg-plist b/sysutils/grub2-pcbsd/pkg-plist
new file mode 100644
index 000000000000..f10e7b6213d7
--- /dev/null
+++ b/sysutils/grub2-pcbsd/pkg-plist
@@ -0,0 +1,681 @@
+%%FUSE%%bin/grub-mount
+%%FUSE%%man/man1/grub-mount.1.gz
+%%MKFONT%%bin/grub-mkfont
+%%MKFONT%%share/grub/themes/starfield/dejavu_10.pf2
+%%MKFONT%%share/grub/themes/starfield/dejavu_12.pf2
+%%MKFONT%%share/grub/themes/starfield/dejavu_bold_14.pf2
+%%MKFONT%%share/grub/themes/starfield/dejavu_14.pf2
+%%MKFONT%%share/grub/themes/starfield/dejavu_16.pf2
+%%MKFONT%%share/grub/themes/starfield/blob_w.png
+%%MKFONT%%share/grub/themes/starfield/boot_menu_c.png
+%%MKFONT%%share/grub/themes/starfield/boot_menu_e.png
+%%MKFONT%%share/grub/themes/starfield/boot_menu_ne.png
+%%MKFONT%%share/grub/themes/starfield/boot_menu_n.png
+%%MKFONT%%share/grub/themes/starfield/boot_menu_nw.png
+%%MKFONT%%share/grub/themes/starfield/boot_menu_se.png
+%%MKFONT%%share/grub/themes/starfield/boot_menu_s.png
+%%MKFONT%%share/grub/themes/starfield/boot_menu_sw.png
+%%MKFONT%%share/grub/themes/starfield/boot_menu_w.png
+%%MKFONT%%share/grub/themes/starfield/slider_c.png
+%%MKFONT%%share/grub/themes/starfield/slider_n.png
+%%MKFONT%%share/grub/themes/starfield/slider_s.png
+%%MKFONT%%share/grub/themes/starfield/starfield.png
+%%MKFONT%%share/grub/themes/starfield/README
+%%MKFONT%%share/grub/themes/starfield/terminal_box_c.png
+%%MKFONT%%share/grub/themes/starfield/terminal_box_e.png
+%%MKFONT%%share/grub/themes/starfield/terminal_box_ne.png
+%%MKFONT%%share/grub/themes/starfield/terminal_box_n.png
+%%MKFONT%%share/grub/themes/starfield/terminal_box_nw.png
+%%MKFONT%%share/grub/themes/starfield/terminal_box_se.png
+%%MKFONT%%share/grub/themes/starfield/terminal_box_s.png
+%%MKFONT%%share/grub/themes/starfield/terminal_box_sw.png
+%%MKFONT%%share/grub/themes/starfield/terminal_box_w.png
+%%MKFONT%%share/grub/themes/starfield/theme.txt
+%%MKFONT%%share/grub/themes/starfield/COPYING.CC-BY-SA-3.0
+%%MKFONT%%share/grub/ascii.h
+%%MKFONT%%share/grub/ascii.pf2
+%%MKFONT%%share/grub/euro.pf2
+%%MKFONT%%share/grub/unicode.pf2
+%%MKFONT%%share/grub/widthspec.h
+%%MKFONT%%man/man1/grub-mkfont.1.gz
+bin/grub-editenv
+bin/grub-file
+bin/grub-fstest
+bin/grub-glue-efi
+bin/grub-kbdcomp
+bin/grub-menulst2cfg
+bin/grub-mkimage
+bin/grub-mklayout
+bin/grub-mknetdir
+bin/grub-mkpasswd-pbkdf2
+bin/grub-mkrelpath
+bin/grub-mkrescue
+bin/grub-mkstandalone
+bin/grub-render-label
+bin/grub-script-check
+bin/grub-syslinux2cfg
+etc/bash_completion.d/grub
+etc/grub.d/00_header
+etc/grub.d/10_kfreebsd
+etc/grub.d/10_ktrueos
+etc/grub.d/30_os-prober
+etc/grub.d/40_custom.dist
+etc/grub.d/41_custom
+etc/grub.d/50_otherbe
+etc/grub.d/README
+lib/grub/i386-pc/acpi.mod
+lib/grub/i386-pc/acpi.module
+lib/grub/i386-pc/adler32.mod
+lib/grub/i386-pc/adler32.module
+lib/grub/i386-pc/affs.mod
+lib/grub/i386-pc/affs.module
+lib/grub/i386-pc/afs.mod
+lib/grub/i386-pc/afs.module
+lib/grub/i386-pc/ahci.mod
+lib/grub/i386-pc/ahci.module
+lib/grub/i386-pc/all_video.mod
+lib/grub/i386-pc/all_video.module
+lib/grub/i386-pc/aout.mod
+lib/grub/i386-pc/aout.module
+lib/grub/i386-pc/archelp.mod
+lib/grub/i386-pc/archelp.module
+lib/grub/i386-pc/at_keyboard.mod
+lib/grub/i386-pc/at_keyboard.module
+lib/grub/i386-pc/ata.mod
+lib/grub/i386-pc/ata.module
+lib/grub/i386-pc/backtrace.mod
+lib/grub/i386-pc/backtrace.module
+lib/grub/i386-pc/bfs.mod
+lib/grub/i386-pc/bfs.module
+lib/grub/i386-pc/biosdisk.mod
+lib/grub/i386-pc/biosdisk.module
+lib/grub/i386-pc/bitmap.mod
+lib/grub/i386-pc/bitmap.module
+lib/grub/i386-pc/bitmap_scale.mod
+lib/grub/i386-pc/bitmap_scale.module
+lib/grub/i386-pc/blocklist.mod
+lib/grub/i386-pc/blocklist.module
+lib/grub/i386-pc/boot.image
+lib/grub/i386-pc/boot.img
+lib/grub/i386-pc/boot.mod
+lib/grub/i386-pc/boot.module
+lib/grub/i386-pc/boot_hybrid.image
+lib/grub/i386-pc/boot_hybrid.img
+lib/grub/i386-pc/bsd.mod
+lib/grub/i386-pc/bsd.module
+lib/grub/i386-pc/bswap_test.mod
+lib/grub/i386-pc/bswap_test.module
+lib/grub/i386-pc/btrfs.mod
+lib/grub/i386-pc/btrfs.module
+lib/grub/i386-pc/bufio.mod
+lib/grub/i386-pc/bufio.module
+lib/grub/i386-pc/cat.mod
+lib/grub/i386-pc/cat.module
+lib/grub/i386-pc/cbfs.mod
+lib/grub/i386-pc/cbfs.module
+lib/grub/i386-pc/cbls.mod
+lib/grub/i386-pc/cbls.module
+lib/grub/i386-pc/cbmemc.mod
+lib/grub/i386-pc/cbmemc.module
+lib/grub/i386-pc/cbtable.mod
+lib/grub/i386-pc/cbtable.module
+lib/grub/i386-pc/cbtime.mod
+lib/grub/i386-pc/cbtime.module
+lib/grub/i386-pc/cdboot.image
+lib/grub/i386-pc/cdboot.img
+lib/grub/i386-pc/chain.mod
+lib/grub/i386-pc/chain.module
+lib/grub/i386-pc/cmdline_cat_test.mod
+lib/grub/i386-pc/cmdline_cat_test.module
+lib/grub/i386-pc/cmosdump.mod
+lib/grub/i386-pc/cmosdump.module
+lib/grub/i386-pc/cmostest.mod
+lib/grub/i386-pc/cmostest.module
+lib/grub/i386-pc/cmp.mod
+lib/grub/i386-pc/cmp.module
+lib/grub/i386-pc/cmp_test.mod
+lib/grub/i386-pc/cmp_test.module
+lib/grub/i386-pc/command.lst
+lib/grub/i386-pc/config.h
+lib/grub/i386-pc/configfile.mod
+lib/grub/i386-pc/configfile.module
+lib/grub/i386-pc/cpio.mod
+lib/grub/i386-pc/cpio.module
+lib/grub/i386-pc/cpio_be.mod
+lib/grub/i386-pc/cpio_be.module
+lib/grub/i386-pc/cpuid.mod
+lib/grub/i386-pc/cpuid.module
+lib/grub/i386-pc/crc64.mod
+lib/grub/i386-pc/crc64.module
+lib/grub/i386-pc/crypto.lst
+lib/grub/i386-pc/crypto.mod
+lib/grub/i386-pc/crypto.module
+lib/grub/i386-pc/cryptodisk.mod
+lib/grub/i386-pc/cryptodisk.module
+lib/grub/i386-pc/cs5536.mod
+lib/grub/i386-pc/cs5536.module
+lib/grub/i386-pc/ctz_test.mod
+lib/grub/i386-pc/ctz_test.module
+lib/grub/i386-pc/date.mod
+lib/grub/i386-pc/date.module
+lib/grub/i386-pc/datehook.mod
+lib/grub/i386-pc/datehook.module
+lib/grub/i386-pc/datetime.mod
+lib/grub/i386-pc/datetime.module
+lib/grub/i386-pc/disk.mod
+lib/grub/i386-pc/disk.module
+lib/grub/i386-pc/diskboot.image
+lib/grub/i386-pc/diskboot.img
+lib/grub/i386-pc/diskfilter.mod
+lib/grub/i386-pc/diskfilter.module
+lib/grub/i386-pc/div.mod
+lib/grub/i386-pc/div.module
+lib/grub/i386-pc/div_test.mod
+lib/grub/i386-pc/div_test.module
+lib/grub/i386-pc/dm_nv.mod
+lib/grub/i386-pc/dm_nv.module
+lib/grub/i386-pc/drivemap.mod
+lib/grub/i386-pc/drivemap.module
+lib/grub/i386-pc/echo.mod
+lib/grub/i386-pc/echo.module
+lib/grub/i386-pc/efiemu.mod
+lib/grub/i386-pc/efiemu.module
+%%EFIEMU%%lib/grub/i386-pc/efiemu32.o
+%%EFIEMU%%lib/grub/i386-pc/efiemu64.o
+lib/grub/i386-pc/ehci.mod
+lib/grub/i386-pc/ehci.module
+lib/grub/i386-pc/elf.mod
+lib/grub/i386-pc/elf.module
+lib/grub/i386-pc/eval.mod
+lib/grub/i386-pc/eval.module
+lib/grub/i386-pc/exfat.mod
+lib/grub/i386-pc/exfat.module
+lib/grub/i386-pc/exfctest.mod
+lib/grub/i386-pc/exfctest.module
+lib/grub/i386-pc/ext2.mod
+lib/grub/i386-pc/ext2.module
+lib/grub/i386-pc/extcmd.mod
+lib/grub/i386-pc/extcmd.module
+lib/grub/i386-pc/fat.mod
+lib/grub/i386-pc/fat.module
+lib/grub/i386-pc/file.mod
+lib/grub/i386-pc/file.module
+lib/grub/i386-pc/font.mod
+lib/grub/i386-pc/font.module
+lib/grub/i386-pc/freedos.mod
+lib/grub/i386-pc/freedos.module
+lib/grub/i386-pc/fs.lst
+lib/grub/i386-pc/fshelp.mod
+lib/grub/i386-pc/fshelp.module
+lib/grub/i386-pc/functional_test.mod
+lib/grub/i386-pc/functional_test.module
+lib/grub/i386-pc/gcry_arcfour.mod
+lib/grub/i386-pc/gcry_arcfour.module
+lib/grub/i386-pc/gcry_blowfish.mod
+lib/grub/i386-pc/gcry_blowfish.module
+lib/grub/i386-pc/gcry_camellia.mod
+lib/grub/i386-pc/gcry_camellia.module
+lib/grub/i386-pc/gcry_cast5.mod
+lib/grub/i386-pc/gcry_cast5.module
+lib/grub/i386-pc/gcry_crc.mod
+lib/grub/i386-pc/gcry_crc.module
+lib/grub/i386-pc/gcry_des.mod
+lib/grub/i386-pc/gcry_des.module
+lib/grub/i386-pc/gcry_dsa.mod
+lib/grub/i386-pc/gcry_dsa.module
+lib/grub/i386-pc/gcry_idea.mod
+lib/grub/i386-pc/gcry_idea.module
+lib/grub/i386-pc/gcry_md4.mod
+lib/grub/i386-pc/gcry_md4.module
+lib/grub/i386-pc/gcry_md5.mod
+lib/grub/i386-pc/gcry_md5.module
+lib/grub/i386-pc/gcry_rfc2268.mod
+lib/grub/i386-pc/gcry_rfc2268.module
+lib/grub/i386-pc/gcry_rijndael.mod
+lib/grub/i386-pc/gcry_rijndael.module
+lib/grub/i386-pc/gcry_rmd160.mod
+lib/grub/i386-pc/gcry_rmd160.module
+lib/grub/i386-pc/gcry_rsa.mod
+lib/grub/i386-pc/gcry_rsa.module
+lib/grub/i386-pc/gcry_seed.mod
+lib/grub/i386-pc/gcry_seed.module
+lib/grub/i386-pc/gcry_serpent.mod
+lib/grub/i386-pc/gcry_serpent.module
+lib/grub/i386-pc/gcry_sha1.mod
+lib/grub/i386-pc/gcry_sha1.module
+lib/grub/i386-pc/gcry_sha256.mod
+lib/grub/i386-pc/gcry_sha256.module
+lib/grub/i386-pc/gcry_sha512.mod
+lib/grub/i386-pc/gcry_sha512.module
+lib/grub/i386-pc/gcry_tiger.mod
+lib/grub/i386-pc/gcry_tiger.module
+lib/grub/i386-pc/gcry_twofish.mod
+lib/grub/i386-pc/gcry_twofish.module
+lib/grub/i386-pc/gcry_whirlpool.mod
+lib/grub/i386-pc/gcry_whirlpool.module
+lib/grub/i386-pc/gdb.mod
+lib/grub/i386-pc/gdb.module
+lib/grub/i386-pc/gdb_grub
+lib/grub/i386-pc/geli.mod
+lib/grub/i386-pc/geli.module
+lib/grub/i386-pc/gettext.mod
+lib/grub/i386-pc/gettext.module
+lib/grub/i386-pc/gfxmenu.mod
+lib/grub/i386-pc/gfxmenu.module
+lib/grub/i386-pc/gfxterm.mod
+lib/grub/i386-pc/gfxterm.module
+lib/grub/i386-pc/gfxterm_background.mod
+lib/grub/i386-pc/gfxterm_background.module
+lib/grub/i386-pc/gfxterm_menu.mod
+lib/grub/i386-pc/gfxterm_menu.module
+lib/grub/i386-pc/gmodule.pl
+lib/grub/i386-pc/gptsync.mod
+lib/grub/i386-pc/gptsync.module
+lib/grub/i386-pc/gzio.mod
+lib/grub/i386-pc/gzio.module
+lib/grub/i386-pc/halt.mod
+lib/grub/i386-pc/halt.module
+lib/grub/i386-pc/hashsum.mod
+lib/grub/i386-pc/hashsum.module
+lib/grub/i386-pc/hdparm.mod
+lib/grub/i386-pc/hdparm.module
+lib/grub/i386-pc/hello.mod
+lib/grub/i386-pc/hello.module
+lib/grub/i386-pc/help.mod
+lib/grub/i386-pc/help.module
+lib/grub/i386-pc/hexdump.mod
+lib/grub/i386-pc/hexdump.module
+lib/grub/i386-pc/hfs.mod
+lib/grub/i386-pc/hfs.module
+lib/grub/i386-pc/hfsplus.mod
+lib/grub/i386-pc/hfsplus.module
+lib/grub/i386-pc/hfspluscomp.mod
+lib/grub/i386-pc/hfspluscomp.module
+lib/grub/i386-pc/http.mod
+lib/grub/i386-pc/http.module
+lib/grub/i386-pc/iorw.mod
+lib/grub/i386-pc/iorw.module
+lib/grub/i386-pc/iso9660.mod
+lib/grub/i386-pc/iso9660.module
+lib/grub/i386-pc/jfs.mod
+lib/grub/i386-pc/jfs.module
+lib/grub/i386-pc/jpeg.mod
+lib/grub/i386-pc/jpeg.module
+lib/grub/i386-pc/kernel.exec
+lib/grub/i386-pc/kernel.img
+lib/grub/i386-pc/keylayouts.mod
+lib/grub/i386-pc/keylayouts.module
+lib/grub/i386-pc/keystatus.mod
+lib/grub/i386-pc/keystatus.module
+lib/grub/i386-pc/ldm.mod
+lib/grub/i386-pc/ldm.module
+lib/grub/i386-pc/legacy_password_test.mod
+lib/grub/i386-pc/legacy_password_test.module
+lib/grub/i386-pc/legacycfg.mod
+lib/grub/i386-pc/legacycfg.module
+lib/grub/i386-pc/linux.mod
+lib/grub/i386-pc/linux.module
+lib/grub/i386-pc/linux16.mod
+lib/grub/i386-pc/linux16.module
+lib/grub/i386-pc/lnxboot.image
+lib/grub/i386-pc/lnxboot.img
+lib/grub/i386-pc/loadenv.mod
+lib/grub/i386-pc/loadenv.module
+lib/grub/i386-pc/loopback.mod
+lib/grub/i386-pc/loopback.module
+lib/grub/i386-pc/ls.mod
+lib/grub/i386-pc/ls.module
+lib/grub/i386-pc/lsacpi.mod
+lib/grub/i386-pc/lsacpi.module
+lib/grub/i386-pc/lsapm.mod
+lib/grub/i386-pc/lsapm.module
+lib/grub/i386-pc/lsmmap.mod
+lib/grub/i386-pc/lsmmap.module
+lib/grub/i386-pc/lspci.mod
+lib/grub/i386-pc/lspci.module
+lib/grub/i386-pc/luks.mod
+lib/grub/i386-pc/luks.module
+lib/grub/i386-pc/lvm.mod
+lib/grub/i386-pc/lvm.module
+lib/grub/i386-pc/lzma_decompress.image
+lib/grub/i386-pc/lzma_decompress.img
+lib/grub/i386-pc/lzopio.mod
+lib/grub/i386-pc/lzopio.module
+lib/grub/i386-pc/macbless.mod
+lib/grub/i386-pc/macbless.module
+lib/grub/i386-pc/macho.mod
+lib/grub/i386-pc/macho.module
+lib/grub/i386-pc/mda_text.mod
+lib/grub/i386-pc/mda_text.module
+lib/grub/i386-pc/mdraid09.mod
+lib/grub/i386-pc/mdraid09.module
+lib/grub/i386-pc/mdraid09_be.mod
+lib/grub/i386-pc/mdraid09_be.module
+lib/grub/i386-pc/mdraid1x.mod
+lib/grub/i386-pc/mdraid1x.module
+lib/grub/i386-pc/memdisk.mod
+lib/grub/i386-pc/memdisk.module
+lib/grub/i386-pc/memrw.mod
+lib/grub/i386-pc/memrw.module
+lib/grub/i386-pc/minicmd.mod
+lib/grub/i386-pc/minicmd.module
+lib/grub/i386-pc/minix.mod
+lib/grub/i386-pc/minix.module
+lib/grub/i386-pc/minix2.mod
+lib/grub/i386-pc/minix2.module
+lib/grub/i386-pc/minix2_be.mod
+lib/grub/i386-pc/minix2_be.module
+lib/grub/i386-pc/minix3.mod
+lib/grub/i386-pc/minix3.module
+lib/grub/i386-pc/minix3_be.mod
+lib/grub/i386-pc/minix3_be.module
+lib/grub/i386-pc/minix_be.mod
+lib/grub/i386-pc/minix_be.module
+lib/grub/i386-pc/mmap.mod
+lib/grub/i386-pc/mmap.module
+lib/grub/i386-pc/moddep.lst
+lib/grub/i386-pc/modinfo.sh
+lib/grub/i386-pc/morse.mod
+lib/grub/i386-pc/morse.module
+lib/grub/i386-pc/mpi.mod
+lib/grub/i386-pc/mpi.module
+lib/grub/i386-pc/msdospart.mod
+lib/grub/i386-pc/msdospart.module
+lib/grub/i386-pc/mul_test.mod
+lib/grub/i386-pc/mul_test.module
+lib/grub/i386-pc/multiboot.mod
+lib/grub/i386-pc/multiboot.module
+lib/grub/i386-pc/multiboot2.mod
+lib/grub/i386-pc/multiboot2.module
+lib/grub/i386-pc/nativedisk.mod
+lib/grub/i386-pc/nativedisk.module
+lib/grub/i386-pc/net.mod
+lib/grub/i386-pc/net.module
+lib/grub/i386-pc/newc.mod
+lib/grub/i386-pc/newc.module
+lib/grub/i386-pc/nilfs2.mod
+lib/grub/i386-pc/nilfs2.module
+lib/grub/i386-pc/normal.mod
+lib/grub/i386-pc/normal.module
+lib/grub/i386-pc/ntfs.mod
+lib/grub/i386-pc/ntfs.module
+lib/grub/i386-pc/ntfscomp.mod
+lib/grub/i386-pc/ntfscomp.module
+lib/grub/i386-pc/ntldr.mod
+lib/grub/i386-pc/ntldr.module
+lib/grub/i386-pc/odc.mod
+lib/grub/i386-pc/odc.module
+lib/grub/i386-pc/offsetio.mod
+lib/grub/i386-pc/offsetio.module
+lib/grub/i386-pc/ohci.mod
+lib/grub/i386-pc/ohci.module
+lib/grub/i386-pc/part_acorn.mod
+lib/grub/i386-pc/part_acorn.module
+lib/grub/i386-pc/part_amiga.mod
+lib/grub/i386-pc/part_amiga.module
+lib/grub/i386-pc/part_apple.mod
+lib/grub/i386-pc/part_apple.module
+lib/grub/i386-pc/part_bsd.mod
+lib/grub/i386-pc/part_bsd.module
+lib/grub/i386-pc/part_dfly.mod
+lib/grub/i386-pc/part_dfly.module
+lib/grub/i386-pc/part_dvh.mod
+lib/grub/i386-pc/part_dvh.module
+lib/grub/i386-pc/part_gpt.mod
+lib/grub/i386-pc/part_gpt.module
+lib/grub/i386-pc/part_msdos.mod
+lib/grub/i386-pc/part_msdos.module
+lib/grub/i386-pc/part_plan.mod
+lib/grub/i386-pc/part_plan.module
+lib/grub/i386-pc/part_sun.mod
+lib/grub/i386-pc/part_sun.module
+lib/grub/i386-pc/part_sunpc.mod
+lib/grub/i386-pc/part_sunpc.module
+lib/grub/i386-pc/partmap.lst
+lib/grub/i386-pc/parttool.lst
+lib/grub/i386-pc/parttool.mod
+lib/grub/i386-pc/parttool.module
+lib/grub/i386-pc/password.mod
+lib/grub/i386-pc/password.module
+lib/grub/i386-pc/password_pbkdf2.mod
+lib/grub/i386-pc/password_pbkdf2.module
+lib/grub/i386-pc/pata.mod
+lib/grub/i386-pc/pata.module
+lib/grub/i386-pc/pbkdf2.mod
+lib/grub/i386-pc/pbkdf2.module
+lib/grub/i386-pc/pbkdf2_test.mod
+lib/grub/i386-pc/pbkdf2_test.module
+lib/grub/i386-pc/pci.mod
+lib/grub/i386-pc/pci.module
+lib/grub/i386-pc/pcidump.mod
+lib/grub/i386-pc/pcidump.module
+lib/grub/i386-pc/plan9.mod
+lib/grub/i386-pc/plan9.module
+lib/grub/i386-pc/play.mod
+lib/grub/i386-pc/play.module
+lib/grub/i386-pc/png.mod
+lib/grub/i386-pc/png.module
+lib/grub/i386-pc/priority_queue.mod
+lib/grub/i386-pc/priority_queue.module
+lib/grub/i386-pc/probe.mod
+lib/grub/i386-pc/probe.module
+lib/grub/i386-pc/procfs.mod
+lib/grub/i386-pc/procfs.module
+lib/grub/i386-pc/progress.mod
+lib/grub/i386-pc/progress.module
+lib/grub/i386-pc/pxe.mod
+lib/grub/i386-pc/pxe.module
+lib/grub/i386-pc/pxeboot.image
+lib/grub/i386-pc/pxeboot.img
+lib/grub/i386-pc/pxechain.mod
+lib/grub/i386-pc/pxechain.module
+lib/grub/i386-pc/raid5rec.mod
+lib/grub/i386-pc/raid5rec.module
+lib/grub/i386-pc/raid6rec.mod
+lib/grub/i386-pc/raid6rec.module
+lib/grub/i386-pc/read.mod
+lib/grub/i386-pc/read.module
+lib/grub/i386-pc/reboot.mod
+lib/grub/i386-pc/reboot.module
+lib/grub/i386-pc/regexp.mod
+lib/grub/i386-pc/regexp.module
+lib/grub/i386-pc/reiserfs.mod
+lib/grub/i386-pc/reiserfs.module
+lib/grub/i386-pc/relocator.mod
+lib/grub/i386-pc/relocator.module
+lib/grub/i386-pc/romfs.mod
+lib/grub/i386-pc/romfs.module
+lib/grub/i386-pc/scsi.mod
+lib/grub/i386-pc/scsi.module
+lib/grub/i386-pc/search.mod
+lib/grub/i386-pc/search.module
+lib/grub/i386-pc/search_fs_file.mod
+lib/grub/i386-pc/search_fs_file.module
+lib/grub/i386-pc/search_fs_uuid.mod
+lib/grub/i386-pc/search_fs_uuid.module
+lib/grub/i386-pc/search_label.mod
+lib/grub/i386-pc/search_label.module
+lib/grub/i386-pc/sendkey.mod
+lib/grub/i386-pc/sendkey.module
+lib/grub/i386-pc/serial.mod
+lib/grub/i386-pc/serial.module
+lib/grub/i386-pc/setjmp.mod
+lib/grub/i386-pc/setjmp.module
+lib/grub/i386-pc/setjmp_test.mod
+lib/grub/i386-pc/setjmp_test.module
+lib/grub/i386-pc/setpci.mod
+lib/grub/i386-pc/setpci.module
+lib/grub/i386-pc/sfs.mod
+lib/grub/i386-pc/sfs.module
+lib/grub/i386-pc/shift_test.mod
+lib/grub/i386-pc/shift_test.module
+lib/grub/i386-pc/signature_test.mod
+lib/grub/i386-pc/signature_test.module
+lib/grub/i386-pc/sleep.mod
+lib/grub/i386-pc/sleep.module
+lib/grub/i386-pc/sleep_test.mod
+lib/grub/i386-pc/sleep_test.module
+lib/grub/i386-pc/spkmodem.mod
+lib/grub/i386-pc/spkmodem.module
+lib/grub/i386-pc/squash4.mod
+lib/grub/i386-pc/squash4.module
+lib/grub/i386-pc/syslinuxcfg.mod
+lib/grub/i386-pc/syslinuxcfg.module
+lib/grub/i386-pc/tar.mod
+lib/grub/i386-pc/tar.module
+lib/grub/i386-pc/terminal.lst
+lib/grub/i386-pc/terminal.mod
+lib/grub/i386-pc/terminal.module
+lib/grub/i386-pc/terminfo.mod
+lib/grub/i386-pc/terminfo.module
+lib/grub/i386-pc/test.mod
+lib/grub/i386-pc/test.module
+lib/grub/i386-pc/test_blockarg.mod
+lib/grub/i386-pc/test_blockarg.module
+lib/grub/i386-pc/testload.mod
+lib/grub/i386-pc/testload.module
+lib/grub/i386-pc/testspeed.mod
+lib/grub/i386-pc/testspeed.module
+lib/grub/i386-pc/tftp.mod
+lib/grub/i386-pc/tftp.module
+lib/grub/i386-pc/tga.mod
+lib/grub/i386-pc/tga.module
+lib/grub/i386-pc/time.mod
+lib/grub/i386-pc/time.module
+lib/grub/i386-pc/tr.mod
+lib/grub/i386-pc/tr.module
+lib/grub/i386-pc/trig.mod
+lib/grub/i386-pc/trig.module
+lib/grub/i386-pc/true.mod
+lib/grub/i386-pc/true.module
+lib/grub/i386-pc/truecrypt.mod
+lib/grub/i386-pc/truecrypt.module
+lib/grub/i386-pc/udf.mod
+lib/grub/i386-pc/udf.module
+lib/grub/i386-pc/ufs1.mod
+lib/grub/i386-pc/ufs1.module
+lib/grub/i386-pc/ufs1_be.mod
+lib/grub/i386-pc/ufs1_be.module
+lib/grub/i386-pc/ufs2.mod
+lib/grub/i386-pc/ufs2.module
+lib/grub/i386-pc/uhci.mod
+lib/grub/i386-pc/uhci.module
+lib/grub/i386-pc/usb.mod
+lib/grub/i386-pc/usb.module
+lib/grub/i386-pc/usb_keyboard.mod
+lib/grub/i386-pc/usb_keyboard.module
+lib/grub/i386-pc/usbms.mod
+lib/grub/i386-pc/usbms.module
+lib/grub/i386-pc/usbserial_common.mod
+lib/grub/i386-pc/usbserial_common.module
+lib/grub/i386-pc/usbserial_ftdi.mod
+lib/grub/i386-pc/usbserial_ftdi.module
+lib/grub/i386-pc/usbserial_pl2303.mod
+lib/grub/i386-pc/usbserial_pl2303.module
+lib/grub/i386-pc/usbserial_usbdebug.mod
+lib/grub/i386-pc/usbserial_usbdebug.module
+lib/grub/i386-pc/usbtest.mod
+lib/grub/i386-pc/usbtest.module
+lib/grub/i386-pc/vbe.mod
+lib/grub/i386-pc/vbe.module
+lib/grub/i386-pc/verify.mod
+lib/grub/i386-pc/verify.module
+lib/grub/i386-pc/vga.mod
+lib/grub/i386-pc/vga.module
+lib/grub/i386-pc/vga_text.mod
+lib/grub/i386-pc/vga_text.module
+lib/grub/i386-pc/video.lst
+lib/grub/i386-pc/video.mod
+lib/grub/i386-pc/video.module
+lib/grub/i386-pc/video_bochs.mod
+lib/grub/i386-pc/video_bochs.module
+lib/grub/i386-pc/video_cirrus.mod
+lib/grub/i386-pc/video_cirrus.module
+lib/grub/i386-pc/video_colors.mod
+lib/grub/i386-pc/video_colors.module
+lib/grub/i386-pc/video_fb.mod
+lib/grub/i386-pc/video_fb.module
+lib/grub/i386-pc/videoinfo.mod
+lib/grub/i386-pc/videoinfo.module
+lib/grub/i386-pc/videotest.mod
+lib/grub/i386-pc/videotest.module
+lib/grub/i386-pc/videotest_checksum.mod
+lib/grub/i386-pc/videotest_checksum.module
+lib/grub/i386-pc/xfs.mod
+lib/grub/i386-pc/xfs.module
+lib/grub/i386-pc/xnu.mod
+lib/grub/i386-pc/xnu.module
+lib/grub/i386-pc/xnu_uuid.mod
+lib/grub/i386-pc/xnu_uuid.module
+lib/grub/i386-pc/xnu_uuid_test.mod
+lib/grub/i386-pc/xnu_uuid_test.module
+lib/grub/i386-pc/xzio.mod
+lib/grub/i386-pc/xzio.module
+lib/grub/i386-pc/zfs.mod
+lib/grub/i386-pc/zfs.module
+lib/grub/i386-pc/zfscrypt.mod
+lib/grub/i386-pc/zfscrypt.module
+lib/grub/i386-pc/zfsinfo.mod
+lib/grub/i386-pc/zfsinfo.module
+man/man1/grub-editenv.1.gz
+man/man1/grub-file.1.gz
+man/man1/grub-fstest.1.gz
+man/man1/grub-glue-efi.1.gz
+man/man1/grub-kbdcomp.1.gz
+man/man1/grub-menulst2cfg.1.gz
+man/man1/grub-mkimage.1.gz
+man/man1/grub-mklayout.1.gz
+man/man1/grub-mknetdir.1.gz
+man/man1/grub-mkpasswd-pbkdf2.1.gz
+man/man1/grub-mkrelpath.1.gz
+man/man1/grub-mkrescue.1.gz
+man/man1/grub-mkstandalone.1.gz
+man/man1/grub-render-label.1.gz
+man/man1/grub-script-check.1.gz
+man/man1/grub-syslinux2cfg.1.gz
+man/man8/grub-bios-setup.8.gz
+man/man8/grub-install.8.gz
+man/man8/grub-macbless.8.gz
+man/man8/grub-mkconfig.8.gz
+man/man8/grub-ofpathname.8.gz
+man/man8/grub-probe.8.gz
+man/man8/grub-reboot.8.gz
+man/man8/grub-set-default.8.gz
+man/man8/grub-sparc64-setup.8.gz
+sbin/grub-bios-setup
+sbin/grub-install
+sbin/grub-macbless
+sbin/grub-mkconfig
+sbin/grub-ofpathname
+sbin/grub-probe
+sbin/grub-reboot
+sbin/grub-set-default
+sbin/grub-sparc64-setup
+share/grub/grub-mkconfig_lib
+share/locale/ast/LC_MESSAGES/grub.mo
+share/locale/ca/LC_MESSAGES/grub.mo
+share/locale/da/LC_MESSAGES/grub.mo
+share/locale/de/LC_MESSAGES/grub.mo
+share/locale/eo/LC_MESSAGES/grub.mo
+share/locale/es/LC_MESSAGES/grub.mo
+share/locale/fi/LC_MESSAGES/grub.mo
+share/locale/fr/LC_MESSAGES/grub.mo
+share/locale/gl/LC_MESSAGES/grub.mo
+share/locale/hu/LC_MESSAGES/grub.mo
+share/locale/id/LC_MESSAGES/grub.mo
+share/locale/it/LC_MESSAGES/grub.mo
+share/locale/ja/LC_MESSAGES/grub.mo
+share/locale/lt/LC_MESSAGES/grub.mo
+share/locale/nb/LC_MESSAGES/grub.mo
+share/locale/nl/LC_MESSAGES/grub.mo
+share/locale/pa/LC_MESSAGES/grub.mo
+share/locale/pl/LC_MESSAGES/grub.mo
+share/locale/pt_BR/LC_MESSAGES/grub.mo
+share/locale/ru/LC_MESSAGES/grub.mo
+share/locale/sl/LC_MESSAGES/grub.mo
+share/locale/sv/LC_MESSAGES/grub.mo
+share/locale/tr/LC_MESSAGES/grub.mo
+share/locale/uk/LC_MESSAGES/grub.mo
+share/locale/vi/LC_MESSAGES/grub.mo
+share/locale/zh_CN/LC_MESSAGES/grub.mo
+share/locale/zh_TW/LC_MESSAGES/grub.mo