1
0
Fork 0
mirror of https://github.com/Ysurac/openmptcprouter.git synced 2025-02-12 19:31:52 +00:00
openmptcprouter/patches/uefi.patch
Ycarus (Yannick Chabanois) 1dfc55f12f Update OpenWrt
2020-03-30 15:13:13 +02:00

1323 lines
44 KiB
Diff

From 964f624954b5e4ea83a4f05a57d79a6af6836d13 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=9B=BD?= <uxgood.org@gmail.com>
Date: Thu, 4 Apr 2019 02:40:15 +0000
Subject: [PATCH 1/8] firmware-utils: ptgen: add GPT support
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Add GPT support to ptgen, so we can generate EFI bootable images.
Introduced two options:
-g generate GPT partition table
-G GUID use GUID for disk and increase last bit for all partitions
We drop The alternate partition table to reduce size, This may cause
problems when generate vmdk images or vdi images. We must pad enough
sectors when generate these images.
Signed-off-by: 李国 <uxgood.org@gmail.com>
---
tools/firmware-utils/Makefile | 2 +-
tools/firmware-utils/src/ptgen.c | 337 ++++++++++++++++++++++++++++---
2 files changed, 314 insertions(+), 25 deletions(-)
diff --git a/tools/firmware-utils/Makefile b/tools/firmware-utils/Makefile
index 97c89eec279..561d6d868fe 100644
--- a/tools/firmware-utils/Makefile
+++ b/tools/firmware-utils/Makefile
@@ -32,7 +32,7 @@ define Host/Compile
$(call cc,dgfirmware)
$(call cc,mksenaofw md5, -Wall --std=gnu99)
$(call cc,trx2usr)
- $(call cc,ptgen)
+ $(call cc,ptgen cyg_crc32)
$(call cc,srec2bin)
$(call cc,mkmylofw)
$(call cc,mkcsysimg)
diff --git a/tools/firmware-utils/src/ptgen.c b/tools/firmware-utils/src/ptgen.c
index 0192bb65e51..caee0f94190 100644
--- a/tools/firmware-utils/src/ptgen.c
+++ b/tools/firmware-utils/src/ptgen.c
@@ -31,15 +31,62 @@
#include <ctype.h>
#include <fcntl.h>
#include <stdint.h>
+#include <linux/uuid.h>
+#include "cyg_crc.h"
#if __BYTE_ORDER == __BIG_ENDIAN
+#define cpu_to_le16(x) bswap_16(x)
#define cpu_to_le32(x) bswap_32(x)
+#define cpu_to_le64(x) bswap_64(x)
#elif __BYTE_ORDER == __LITTLE_ENDIAN
+#define cpu_to_le16(x) (x)
#define cpu_to_le32(x) (x)
+#define cpu_to_le64(x) (x)
#else
#error unknown endianness!
#endif
+#define swap(a, b) \
+ do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
+
+#ifndef GUID_INIT
+typedef uuid_le guid_t;
+#define GUID_INIT(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7) \
+ UUID_LE(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7)
+#endif
+
+#define GUID_STRING_LENGTH 36
+
+#define GPT_SIGNATURE 0x5452415020494645ULL
+#define GPT_REVISION 0x00010000
+
+#define GUID_PARTITION_SYSTEM \
+ GUID_INIT( 0xC12A7328, 0xF81F, 0x11d2, \
+ 0xBA, 0x4B, 0x00, 0xA0, 0xC9, 0x3E, 0xC9, 0x3B)
+
+#define GUID_PARTITION_BASIC_DATA \
+ GUID_INIT( 0xEBD0A0A2, 0xB9E5, 0x4433, \
+ 0x87, 0xC0, 0x68, 0xB6, 0xB7, 0x26, 0x99, 0xC7)
+
+#define GUID_PARTITION_BIOS_BOOT \
+ GUID_INIT( 0x21686148, 0x6449, 0x6E6F, \
+ 0x74, 0x4E, 0x65, 0x65, 0x64, 0x45, 0x46, 0x49)
+
+#define GPT_HEADER_SIZE 92
+#define GPT_ENTRY_SIZE 128
+#define GPT_ENTRY_MAX 128
+#define GPT_ENTRY_NAME_SIZE 72
+
+#define GPT_HEADER_SECTOR 1
+#define GPT_FIRST_ENTRY_SECTOR 2
+
+#define MBR_ENTRY_MAX 4
+#define MBR_DISK_SIGNATURE_OFFSET 440
+#define MBR_PARTITION_ENTRY_OFFSET 446
+#define MBR_BOOT_SIGNATURE_OFFSET 510
+
+#define DISK_SECTOR_SIZE 512
+
/* Partition table entry */
struct pte {
uint8_t active;
@@ -55,13 +102,43 @@ struct partinfo {
int type;
};
+/* GPT Partition table header */
+struct gpth {
+ uint64_t signature;
+ uint32_t revision;
+ uint32_t size;
+ uint32_t crc32;
+ uint32_t reserved;
+ uint64_t self;
+ uint64_t alternate;
+ uint64_t first_usable;
+ uint64_t last_usable;
+ guid_t disk_guid;
+ uint64_t first_entry;
+ uint32_t entry_num;
+ uint32_t entry_size;
+ uint32_t entry_crc32;
+} __attribute__((packed));
+
+/* GPT Partition table entry */
+struct gpte {
+ guid_t type;
+ guid_t guid;
+ uint64_t start;
+ uint64_t end;
+ uint64_t attr;
+ uint16_t name[GPT_ENTRY_NAME_SIZE / sizeof(uint16_t)];
+} __attribute__((packed));
+
+
int verbose = 0;
int active = 1;
int heads = -1;
int sectors = -1;
int kb_align = 0;
bool ignore_null_sized_partition = false;
-struct partinfo parts[4];
+bool use_guid_partition_table = false;
+struct partinfo parts[GPT_ENTRY_MAX];
char *filename = NULL;
@@ -91,7 +168,7 @@ static long to_kbytes(const char *string)
end++;
if (*end) {
- fprintf(stderr, "garbage after end of number\n");
+ fputs("garbage after end of number\n", stderr);
return 0;
}
@@ -132,20 +209,73 @@ static inline unsigned long round_to_kb(long sect) {
return ((sect - 1) / kb_align + 1) * kb_align;
}
+/* Compute a CRC for guid partition table */
+static inline unsigned long gpt_crc32(void *buf, unsigned long len)
+{
+ return cyg_crc32_accumulate(~0L, buf, len) ^ ~0L;
+}
+
+/* Parse a guid string to guid_t struct */
+static inline int guid_parse(char *buf, guid_t *guid)
+{
+ char b[4] = {0};
+ char *p = buf;
+ unsigned i = 0;
+ if (strnlen(buf, GUID_STRING_LENGTH) != GUID_STRING_LENGTH)
+ return -1;
+ for (i = 0; i < sizeof(guid_t); i++) {
+ if (*p == '-')
+ p++;
+ if (*p == '\0')
+ return -1;
+ memcpy(b, p, 2);
+ guid->b[i] = strtol(b, 0, 16);
+ p += 2;
+ }
+ swap(guid->b[0], guid->b[3]);
+ swap(guid->b[1], guid->b[2]);
+ swap(guid->b[4], guid->b[5]);
+ swap(guid->b[6], guid->b[7]);
+ return 0;
+}
+
+/* init an utf-16 string from utf-8 string */
+static inline void init_utf16(char *str, uint16_t *buf, unsigned bufsize)
+{
+ unsigned i, n = 0;
+ for (i = 0; i < bufsize; i++) {
+ if (str[n] == 0x00) {
+ buf[i] = 0x00;
+ return ;
+ } else if ((str[n] & 0x80) == 0x00) {//0xxxxxxx
+ buf[i] = cpu_to_le16(str[n++]);
+ } else if ((str[n] & 0xE0) == 0xC0) {//110xxxxx
+ buf[i] = cpu_to_le16((str[n] & 0x1F) << 6 | str[n + 1] & 0x3F);
+ n += 2;
+ } else if ((str[n] & 0xF0) == 0xE0) {//1110xxxx
+ buf[i] = cpu_to_le16((str[n] & 0x0F) << 12 | (str[n + 1] & 0x3F) << 6 | str[n + 2] & 0x3F);
+ n += 3;
+ } else {
+ buf[i] = cpu_to_le16('?');
+ n++;
+ }
+ }
+}
+
/* check the partition sizes and write the partition table */
static int gen_ptable(uint32_t signature, int nr)
{
- struct pte pte[4];
- unsigned long sect = 0;
- int i, fd, ret = -1, start, len;
+ struct pte pte[MBR_ENTRY_MAX];
+ unsigned long start, len, sect = 0;
+ int i, fd, ret = -1;
- memset(pte, 0, sizeof(struct pte) * 4);
+ memset(pte, 0, sizeof(struct pte) * MBR_ENTRY_MAX);
for (i = 0; i < nr; i++) {
if (!parts[i].size) {
if (ignore_null_sized_partition)
continue;
fprintf(stderr, "Invalid size in partition %d!\n", i);
- return -1;
+ return ret;
}
pte[i].active = ((i + 1) == active) ? 0x80 : 0;
@@ -165,30 +295,34 @@ static int gen_ptable(uint32_t signature, int nr)
to_chs(start + len - 1, pte[i].chs_end);
if (verbose)
- fprintf(stderr, "Partition %d: start=%ld, end=%ld, size=%ld\n", i, (long)start * 512, ((long)start + (long)len) * 512, (long)len * 512);
- printf("%ld\n", (long)start * 512);
- printf("%ld\n", (long)len * 512);
+ fprintf(stderr, "Partition %d: start=%ld, end=%ld, size=%ld\n",
+ i,
+ (long)start * DISK_SECTOR_SIZE,
+ (long)(start + len) * DISK_SECTOR_SIZE,
+ (long)len * DISK_SECTOR_SIZE);
+ printf("%ld\n", (long)start * DISK_SECTOR_SIZE);
+ printf("%ld\n", (long)len * DISK_SECTOR_SIZE);
}
if ((fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0644)) < 0) {
fprintf(stderr, "Can't open output file '%s'\n",filename);
- return -1;
+ return ret;
}
- lseek(fd, 440, SEEK_SET);
+ lseek(fd, MBR_DISK_SIGNATURE_OFFSET, SEEK_SET);
if (write(fd, &signature, sizeof(signature)) != sizeof(signature)) {
- fprintf(stderr, "write failed.\n");
+ fputs("write failed.\n", stderr);
goto fail;
}
- lseek(fd, 446, SEEK_SET);
- if (write(fd, pte, sizeof(struct pte) * 4) != sizeof(struct pte) * 4) {
- fprintf(stderr, "write failed.\n");
+ lseek(fd, MBR_PARTITION_ENTRY_OFFSET, SEEK_SET);
+ if (write(fd, pte, sizeof(struct pte) * MBR_ENTRY_MAX) != sizeof(struct pte) * MBR_ENTRY_MAX) {
+ fputs("write failed.\n", stderr);
goto fail;
}
- lseek(fd, 510, SEEK_SET);
+ lseek(fd, MBR_BOOT_SIGNATURE_OFFSET, SEEK_SET);
if (write(fd, "\x55\xaa", 2) != 2) {
- fprintf(stderr, "write failed.\n");
+ fputs("write failed.\n", stderr);
goto fail;
}
@@ -198,20 +332,162 @@ static int gen_ptable(uint32_t signature, int nr)
return ret;
}
+/* check the partition sizes and write the guid partition table */
+static int gen_gptable(uint32_t signature, guid_t guid, unsigned nr)
+{
+ struct pte pte;
+ struct gpth gpth = {
+ .signature = cpu_to_le64(GPT_SIGNATURE),
+ .revision = cpu_to_le32(GPT_REVISION),
+ .size = cpu_to_le32(GPT_HEADER_SIZE),
+ .self = cpu_to_le64(GPT_HEADER_SECTOR),
+ .first_usable = cpu_to_le64(GPT_FIRST_ENTRY_SECTOR + GPT_ENTRY_SIZE * GPT_ENTRY_MAX / DISK_SECTOR_SIZE),
+ .first_entry = cpu_to_le64(GPT_FIRST_ENTRY_SECTOR),
+ .disk_guid = guid,
+ .entry_num = cpu_to_le32(GPT_ENTRY_MAX),
+ .entry_size = cpu_to_le32(GPT_ENTRY_SIZE),
+ };
+ struct gpte gpte[GPT_ENTRY_MAX];
+ uint64_t start, end, sect = 0;
+ int fd, ret = -1;
+ unsigned i;
+
+ memset(gpte, 0, GPT_ENTRY_SIZE * GPT_ENTRY_MAX);
+ for (i = 0; i < nr; i++) {
+ if (!parts[i].size) {
+ if (ignore_null_sized_partition)
+ continue;
+ fprintf(stderr, "Invalid size in partition %d!\n", i);
+ return ret;
+ }
+ start = sect + sectors;
+ if (kb_align != 0)
+ start = round_to_kb(start);
+ gpte[i].start = cpu_to_le64(start);
+
+ sect = start + parts[i].size * 2;
+ if (kb_align == 0)
+ sect = round_to_cyl(sect);
+ gpte[i].end = cpu_to_le64(sect -1);
+ gpte[i].guid = guid;
+ gpte[i].guid.b[sizeof(guid_t) -1] += i + 1;
+ if (parts[i].type == 0xEF || (i + 1) == active) {
+ gpte[i].type = GUID_PARTITION_SYSTEM;
+ init_utf16("EFI System Partition", gpte[i].name, GPT_ENTRY_NAME_SIZE / sizeof(uint16_t));
+ } else {
+ gpte[i].type = GUID_PARTITION_BASIC_DATA;
+ }
+
+ if (verbose)
+ fprintf(stderr, "Partition %d: start=%lld, end=%lld, size=%lld\n",
+ i,
+ start * DISK_SECTOR_SIZE, sect * DISK_SECTOR_SIZE,
+ (sect - start) * DISK_SECTOR_SIZE);
+ printf("%lld\n", start * DISK_SECTOR_SIZE);
+ printf("%lld\n", (sect - start) * DISK_SECTOR_SIZE);
+ }
+
+ gpte[GPT_ENTRY_MAX - 1].start = cpu_to_le64(GPT_FIRST_ENTRY_SECTOR + GPT_ENTRY_SIZE * GPT_ENTRY_MAX / DISK_SECTOR_SIZE);
+ gpte[GPT_ENTRY_MAX - 1].end = cpu_to_le64((kb_align ? round_to_kb(sectors) : sectors) - 1);
+ gpte[GPT_ENTRY_MAX - 1].type = GUID_PARTITION_BIOS_BOOT;
+ gpte[GPT_ENTRY_MAX - 1].guid = guid;
+ gpte[GPT_ENTRY_MAX - 1].guid.b[sizeof(guid_t) -1] += GPT_ENTRY_MAX;
+
+ end = sect + sectors - 1;
+
+ pte.type = 0xEE;
+ pte.start = cpu_to_le32(GPT_HEADER_SECTOR);
+ pte.length = cpu_to_le32(end);
+ to_chs(GPT_HEADER_SECTOR, pte.chs_start);
+ to_chs(end, pte.chs_end);
+
+ gpth.last_usable = cpu_to_le64(end - GPT_ENTRY_SIZE * GPT_ENTRY_MAX / DISK_SECTOR_SIZE - 1);
+ gpth.alternate = cpu_to_le64(end);
+ gpth.entry_crc32 = cpu_to_le32(gpt_crc32(gpte, GPT_ENTRY_SIZE * GPT_ENTRY_MAX));
+ gpth.crc32 = cpu_to_le32(gpt_crc32((char *)&gpth, GPT_HEADER_SIZE));
+
+ if ((fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0644)) < 0) {
+ fprintf(stderr, "Can't open output file '%s'\n",filename);
+ return ret;
+ }
+
+ lseek(fd, MBR_DISK_SIGNATURE_OFFSET, SEEK_SET);
+ if (write(fd, &signature, sizeof(signature)) != sizeof(signature)) {
+ fputs("write failed.\n", stderr);
+ goto fail;
+ }
+
+ lseek(fd, MBR_PARTITION_ENTRY_OFFSET, SEEK_SET);
+ if (write(fd, &pte, sizeof(struct pte)) != sizeof(struct pte)) {
+ fputs("write failed.\n", stderr);
+ goto fail;
+ }
+
+ lseek(fd, MBR_BOOT_SIGNATURE_OFFSET, SEEK_SET);
+ if (write(fd, "\x55\xaa", 2) != 2) {
+ fputs("write failed.\n", stderr);
+ goto fail;
+ }
+
+ //lseek(fd, GPT_HEADER_SECTOR * DISK_SECTOR_SIZE, SEEK_SET);
+ if (write(fd, &gpth, GPT_HEADER_SIZE) != GPT_HEADER_SIZE) {
+ fputs("write failed.\n", stderr);
+ goto fail;
+ }
+
+ lseek(fd, GPT_FIRST_ENTRY_SECTOR * DISK_SECTOR_SIZE, SEEK_SET);
+ if (write(fd, &gpte, GPT_ENTRY_SIZE * GPT_ENTRY_MAX) != GPT_ENTRY_SIZE * GPT_ENTRY_MAX) {
+ fputs("write failed.\n", stderr);
+ goto fail;
+ }
+
+#if 0
+ /* The alternate partition table (We omit it) */
+ swap(gpth.self, gpth.alternate);
+ gpth.first_entry = cpu_to_le64(end - GPT_ENTRY_SIZE * GPT_ENTRY_MAX / DISK_SECTOR_SIZE),
+ gpth.crc32 = 0;
+ gpth.crc32 = cpu_to_le32(gpt_crc32(&gpth, GPT_HEADER_SIZE));
+
+ lseek(fd, end * DISK_SECTOR_SIZE - GPT_ENTRY_SIZE * GPT_ENTRY_MAX, SEEK_SET);
+ if (write(fd, &gpte, GPT_ENTRY_SIZE * GPT_ENTRY_MAX) != GPT_ENTRY_SIZE * GPT_ENTRY_MAX) {
+ fputs("write failed.\n", stderr);
+ goto fail;
+ }
+
+ lseek(fd, end * DISK_SECTOR_SIZE, SEEK_SET);
+ if (write(fd, &gpth, GPT_HEADER_SIZE) != GPT_HEADER_SIZE) {
+ fputs("write failed.\n", stderr);
+ goto fail;
+ }
+ lseek(fd, (end + 1) * DISK_SECTOR_SIZE -1, SEEK_SET);
+ if (write(fd, "\x00", 1) != 1) {
+ fputs("write failed.\n", stderr);
+ goto fail;
+ }
+#endif
+
+ ret = 0;
+fail:
+ close(fd);
+ return ret;
+}
+
static void usage(char *prog)
{
- fprintf(stderr, "Usage: %s [-v] [-n] -h <heads> -s <sectors> -o <outputfile> [-a 0..4] [-l <align kB>] [[-t <type>] -p <size>...] \n", prog);
+ fprintf(stderr, "Usage: %s [-v] [-n] [-g] -h <heads> -s <sectors> -o <outputfile> [-a 0..4] [-l <align kB>] [-G <guid>] [[-t <type>] -p <size>...] \n", prog);
exit(EXIT_FAILURE);
}
int main (int argc, char **argv)
{
- char type = 0x83;
+ unsigned char type = 0x83;
int ch;
int part = 0;
uint32_t signature = 0x5452574F; /* 'OWRT' */
+ guid_t guid = GUID_INIT( signature, 0x2211, 0x4433, \
+ 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0x00);
- while ((ch = getopt(argc, argv, "h:s:p:a:t:o:vnl:S:")) != -1) {
+ while ((ch = getopt(argc, argv, "h:s:p:a:t:o:vngl:S:G:")) != -1) {
switch (ch) {
case 'o':
filename = optarg;
@@ -222,6 +498,9 @@ int main (int argc, char **argv)
case 'n':
ignore_null_sized_partition = true;
break;
+ case 'g':
+ use_guid_partition_table = 1;
+ break;
case 'h':
heads = (int)strtoul(optarg, NULL, 0);
break;
@@ -229,8 +508,8 @@ int main (int argc, char **argv)
sectors = (int)strtoul(optarg, NULL, 0);
break;
case 'p':
- if (part > 3) {
- fprintf(stderr, "Too many partitions\n");
+ if (part > GPT_ENTRY_MAX - 1 || (!use_guid_partition_table && part > 3)) {
+ fputs("Too many partitions\n", stderr);
exit(EXIT_FAILURE);
}
parts[part].size = to_kbytes(optarg);
@@ -250,6 +529,12 @@ int main (int argc, char **argv)
case 'S':
signature = strtoul(optarg, NULL, 0);
break;
+ case 'G':
+ if (guid_parse(optarg, &guid)) {
+ fputs("Invalid guid string\n", stderr);
+ exit(EXIT_FAILURE);
+ }
+ break;
case '?':
default:
usage(argv[0]);
@@ -259,5 +544,9 @@ int main (int argc, char **argv)
if (argc || (heads <= 0) || (sectors <= 0) || !filename)
usage(argv[0]);
- return gen_ptable(signature, part) ? EXIT_FAILURE : EXIT_SUCCESS;
+ if (use_guid_partition_table) {
+ return gen_gptable(signature, guid, part) ? EXIT_FAILURE : EXIT_SUCCESS;
+ } else {
+ return gen_ptable(signature, part) ? EXIT_FAILURE : EXIT_SUCCESS;
+ }
}
From c634da575c221e6a340884219d78978f56f23976 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=9B=BD?= <uxgood.org@gmail.com>
Date: Thu, 4 Apr 2019 03:17:01 +0000
Subject: [PATCH 2/8] grub2: split to grub2 and grub2-efi packages
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
EFI bootable images need grub2 host packages with efi platform,
but grub2 can not build efi platform and pc platform together,
so we split it to grub2 and grub2-efi packages.
Signed-off-by: 李国 <uxgood.org@gmail.com>
---
package/boot/grub2/common.mk | 54 +++++++++++++++++++++++++
package/boot/grub2/grub2-efi/Makefile | 19 +++++++++
package/boot/grub2/{ => grub2}/Makefile | 50 +----------------------
3 files changed, 75 insertions(+), 48 deletions(-)
create mode 100644 package/boot/grub2/common.mk
create mode 100644 package/boot/grub2/grub2-efi/Makefile
rename package/boot/grub2/{ => grub2}/Makefile (66%)
diff --git a/package/boot/grub2/common.mk b/package/boot/grub2/common.mk
new file mode 100644
index 00000000000..53ee26552f8
--- /dev/null
+++ b/package/boot/grub2/common.mk
@@ -0,0 +1,54 @@
+#
+# Copyright (C) 2006-2015 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+include $(INCLUDE_DIR)/kernel.mk
+
+PKG_NAME:=grub
+PKG_CPE_ID:=cpe:/a:gnu:grub2
+PKG_VERSION:=2.04
+PKG_RELEASE:=2
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
+PKG_SOURCE_URL:=@GNU/grub
+PKG_HASH:=e5292496995ad42dabe843a0192cf2a2c502e7ffcc7479398232b10a472df77d
+
+HOST_BUILD_PARALLEL:=1
+
+PKG_SSP:=0
+
+PKG_FLAGS:=nonshared
+
+PATCH_DIR:=../patches
+
+HOST_BUILD_DIR ?= $(BUILD_DIR_HOST)/$(PKG_NAME)-$(GRUB_PLATFORM)/$(PKG_NAME)$(if $(PKG_VERSION),-$(PKG_VERSION))
+HOST_BUILD_PREFIX := $(STAGING_DIR_HOST)
+
+include $(INCLUDE_DIR)/host-build.mk
+include $(INCLUDE_DIR)/package.mk
+
+
+HOST_CONFIGURE_VARS += \
+ grub_build_mkfont_excuse="don't want fonts"
+
+HOST_CONFIGURE_ARGS += \
+ --disable-grub-mkfont \
+ --target=$(REAL_GNU_TARGET_NAME) \
+ --sbindir="$(STAGING_DIR_HOST)/bin" \
+ --disable-werror \
+ --disable-libzfs \
+ --disable-nls \
+ --with-platform=$(GRUB_PLATFORM)
+
+HOST_MAKE_FLAGS += \
+ TARGET_RANLIB=$(TARGET_RANLIB) \
+ LIBLZMA=$(STAGING_DIR_HOST)/lib/liblzma.a
+
+define Host/Configure
+ $(SED) 's,(RANLIB),(TARGET_RANLIB),' $(HOST_BUILD_DIR)/grub-core/Makefile.in
+ $(Host/Configure/Default)
+endef
diff --git a/package/boot/grub2/grub2-efi/Makefile b/package/boot/grub2/grub2-efi/Makefile
new file mode 100644
index 00000000000..2fc21fdb890
--- /dev/null
+++ b/package/boot/grub2/grub2-efi/Makefile
@@ -0,0 +1,19 @@
+GRUB_PLATFORM:=efi
+
+PKG_BUILD_DEPENDS:=grub2-efi/host
+include ../common.mk
+
+define Package/grub2-efi
+ CATEGORY:=Boot Loaders
+ SECTION:=boot
+ TITLE:=GRand Unified Bootloader(EFI)
+ URL:=http://www.gnu.org/software/grub/
+ DEPENDS:=@TARGET_x86
+endef
+
+define Host/Install
+ $(call Host/Compile/Default,install-data)
+endef
+
+$(eval $(call HostBuild))
+$(eval $(call BuildPackage,grub2-efi))
diff --git a/package/boot/grub2/Makefile b/package/boot/grub2/grub2/Makefile
similarity index 66%
rename from package/boot/grub2/Makefile
rename to package/boot/grub2/grub2/Makefile
index 980a6e372a3..7126beab4cf 100644
--- a/package/boot/grub2/Makefile
+++ b/package/boot/grub2/grub2/Makefile
@@ -1,31 +1,7 @@
-#
-# Copyright (C) 2006-2015 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
+GRUB_PLATFORM:=pc
-include $(TOPDIR)/rules.mk
-include $(INCLUDE_DIR)/kernel.mk
-
-PKG_NAME:=grub
-PKG_CPE_ID:=cpe:/a:gnu:grub2
-PKG_VERSION:=2.04
-PKG_RELEASE:=1
-
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
-PKG_SOURCE_URL:=@GNU/grub
-PKG_HASH:=e5292496995ad42dabe843a0192cf2a2c502e7ffcc7479398232b10a472df77d
-
-HOST_BUILD_PARALLEL:=1
PKG_BUILD_DEPENDS:=grub2/host
-
-PKG_SSP:=0
-
-PKG_FLAGS:=nonshared
-
-include $(INCLUDE_DIR)/host-build.mk
-include $(INCLUDE_DIR)/package.mk
+include ../common.mk
define Package/grub2
CATEGORY:=Boot Loaders
@@ -48,8 +24,6 @@ define Package/grub2-editenv/description
Edit grub2 environment files.
endef
-HOST_BUILD_PREFIX := $(STAGING_DIR_HOST)
-
CONFIGURE_VARS += \
grub_build_mkfont_excuse="don't want fonts"
@@ -62,26 +36,6 @@ CONFIGURE_ARGS += \
--disable-grub-mkfont \
--with-platform=none
-HOST_CONFIGURE_VARS += \
- grub_build_mkfont_excuse="don't want fonts"
-
-HOST_CONFIGURE_ARGS += \
- --disable-grub-mkfont \
- --target=$(REAL_GNU_TARGET_NAME) \
- --sbindir="$(STAGING_DIR_HOST)/bin" \
- --disable-werror \
- --disable-libzfs \
- --disable-nls
-
-HOST_MAKE_FLAGS += \
- TARGET_RANLIB=$(TARGET_RANLIB) \
- LIBLZMA=$(STAGING_DIR_HOST)/lib/liblzma.a
-
-define Host/Configure
- $(SED) 's,(RANLIB),(TARGET_RANLIB),' $(HOST_BUILD_DIR)/grub-core/Makefile.in
- $(Host/Configure/Default)
-endef
-
define Host/Install
$(call Host/Install/Default)
From 15212ac11ac95a57f75317fff83bb7d53b581a93 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=9B=BD?= <uxgood.org@gmail.com>
Date: Thu, 4 Apr 2019 03:42:16 +0000
Subject: [PATCH 3/8] x86: add EFI images and make iso images EFI bootable
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Add EFI bootable images for x86 platforms. These images can also
boot from legacy BIOS. And iso images can boot from EFI now.
EFI System Partition need to be fat12/fat16/fat32 (not need to load
filesystem drivers), so the first partition of EFI images are not ext4
filesystem any more.
GPT partition table has an alternate partition table, we did not
generate it. This may cause problems when use these images as qemu disk,
kernel can not find rootfs, we pad enough sectors will be ok.
Signed-off-by: 李国 <uxgood.org@gmail.com>
---
config/Config-images.in | 23 +++++++++++++------
.../base-files/files/lib/upgrade/common.sh | 11 +++++++++
scripts/gen_image_generic.sh | 10 ++++++--
.../x86/base-files/lib/preinit/79_move_config | 6 +++--
.../x86/base-files/lib/upgrade/platform.sh | 6 +++--
target/linux/x86/generic/config-4.19 | 1 +
target/linux/x86/generic/config-5.4 | 1 +
target/linux/x86/image/Makefile | 3 +++
target/linux/x86/image/grub-iso.cfg | 7 +++++-
9 files changed, 54 insertions(+), 14 deletions(-)
diff --git a/config/Config-images.in b/config/Config-images.in
index e4db0482ce2..16b575247ea 100644
--- a/config/Config-images.in
+++ b/config/Config-images.in
@@ -188,19 +188,28 @@ menu "Target Images"
select PACKAGE_grub2
default y
+ config EFI_IMAGES
+ bool "Build EFI images (Linux x86 or x86_64 host only)"
+ depends on TARGET_x86
+ depends on TARGET_ROOTFS_EXT4FS || TARGET_ROOTFS_ISO || TARGET_ROOTFS_JFFS2 || TARGET_ROOTFS_SQUASHFS
+ select PACKAGE_grub2
+ select PACKAGE_grub2-efi
+ select PACKAGE_kmod-fs-vfat
+ default n
+
config GRUB_CONSOLE
bool "Use Console Terminal (in addition to Serial)"
- depends on GRUB_IMAGES
+ depends on GRUB_IMAGES || EFI_IMAGES
default y
config GRUB_SERIAL
string "Serial port device"
- depends on GRUB_IMAGES
+ depends on GRUB_IMAGES || EFI_IMAGES
default "ttyS0"
config GRUB_BAUDRATE
int "Serial port baud rate"
- depends on GRUB_IMAGES
+ depends on GRUB_IMAGES || EFI_IMAGES
default 38400 if TARGET_x86_generic
default 115200
@@ -211,20 +220,20 @@ menu "Target Images"
config GRUB_BOOTOPTS
string "Extra kernel boot options"
- depends on GRUB_IMAGES
+ depends on GRUB_IMAGES || EFI_IMAGES
help
If you don't know, just leave it blank.
config GRUB_TIMEOUT
string "Seconds to wait before booting the default entry"
- depends on GRUB_IMAGES
+ depends on GRUB_IMAGES || EFI_IMAGES
default "5"
help
If you don't know, 5 seconds is a reasonable default.
config GRUB_TITLE
string "Title for the menu entry in GRUB"
- depends on GRUB_IMAGES
+ depends on GRUB_IMAGES || EFI_IMAGES
default "OpenWrt"
help
This is the title of the GRUB menu entry.
@@ -272,7 +281,7 @@ menu "Target Images"
config TARGET_ROOTFS_PARTNAME
string "Root partition on target device"
- depends on GRUB_IMAGES
+ depends on GRUB_IMAGES || EFI_IMAGES
help
Override the root partition on the final device. If left empty,
it will be mounted by PARTUUID which makes the kernel find the
diff --git a/package/base-files/files/lib/upgrade/common.sh b/package/base-files/files/lib/upgrade/common.sh
index a986cc0b5c7..6e967aeffe8 100644
--- a/package/base-files/files/lib/upgrade/common.sh
+++ b/package/base-files/files/lib/upgrade/common.sh
@@ -136,6 +136,17 @@ export_bootdevice() {
fi
done
;;
+ PARTUUID=????????-????-????-????-??????????02)
+ uuid="${rootpart#PARTUUID=}"
+ uuid="${uuid%02}00"
+ for disk in $(find /dev -type b); do
+ set -- $(dd if=$disk bs=1 skip=568 count=16 2>/dev/null | hexdump -v -e '8/1 "%02x "" "2/1 "%02x""-"6/1 "%02x"')
+ if [ "$4$3$2$1-$6$5-$8$7-$9" = "$uuid" ]; then
+ uevent="/sys/class/block/${disk##*/}/uevent"
+ break
+ fi
+ done
+ ;;
/dev/*)
uevent="/sys/class/block/${rootpart##*/}/../uevent"
;;
diff --git a/scripts/gen_image_generic.sh b/scripts/gen_image_generic.sh
index 2c57d56f073..1df4d0673b3 100755
--- a/scripts/gen_image_generic.sh
+++ b/scripts/gen_image_generic.sh
@@ -20,7 +20,7 @@ sect=63
cyl=$(( (KERNELSIZE + ROOTFSSIZE) * 1024 * 1024 / (head * sect * 512)))
# create partition table
-set $(ptgen -o "$OUTPUT" -h $head -s $sect -p ${KERNELSIZE}m -p ${ROOTFSSIZE}m ${ALIGN:+-l $ALIGN} ${SIGNATURE:+-S 0x$SIGNATURE})
+set $(ptgen -o "$OUTPUT" -h $head -s $sect ${EFI_SIGNATURE:+-g} -p ${KERNELSIZE}m -p ${ROOTFSSIZE}m ${ALIGN:+-l $ALIGN} ${SIGNATURE:+-S 0x$SIGNATURE} ${EFI_SIGNATURE:+-G $EFI_SIGNATURE})
KERNELOFFSET="$(($1 / 512))"
KERNELSIZE="$2"
@@ -30,6 +30,12 @@ ROOTFSSIZE="$(($4 / 512))"
[ -n "$PADDING" ] && dd if=/dev/zero of="$OUTPUT" bs=512 seek="$ROOTFSOFFSET" conv=notrunc count="$ROOTFSSIZE"
dd if="$ROOTFSIMAGE" of="$OUTPUT" bs=512 seek="$ROOTFSOFFSET" conv=notrunc
-make_ext4fs -J -L kernel -l "$KERNELSIZE" "$OUTPUT.kernel" "$KERNELDIR"
+if [ -n "$EFI_SIGNATURE" ]; then
+ [ -n "$PADDING" ] && dd if=/dev/zero of="$OUTPUT" bs=512 seek="$(($ROOTFSOFFSET + $ROOTFSSIZE))" conv=notrunc count="$sect"
+ mkfs.fat -n kernel -C "$OUTPUT.kernel" -S 512 "$(($KERNELSIZE / 1024))"
+ mcopy -s -i "$OUTPUT.kernel" "$KERNELDIR"/* ::/
+else
+ make_ext4fs -J -L kernel -l "$KERNELSIZE" "$OUTPUT.kernel" "$KERNELDIR"
+fi
dd if="$OUTPUT.kernel" of="$OUTPUT" bs=512 seek="$KERNELOFFSET" conv=notrunc
rm -f "$OUTPUT.kernel"
diff --git a/target/linux/x86/base-files/lib/preinit/79_move_config b/target/linux/x86/base-files/lib/preinit/79_move_config
index 702da9e873d..015efcf748b 100644
--- a/target/linux/x86/base-files/lib/preinit/79_move_config
+++ b/target/linux/x86/base-files/lib/preinit/79_move_config
@@ -2,13 +2,15 @@
# Copyright (C) 2012-2015 OpenWrt.org
move_config() {
- local partdev
+ local partdev magic parttype=ext4
. /lib/upgrade/common.sh
if export_bootdevice && export_partdevice partdev 1; then
mkdir -p /boot
- mount -t ext4 -o rw,noatime "/dev/$partdev" /boot
+ magic=$(dd if="/dev/$partdev" bs=1 count=3 skip=54 2>/dev/null)
+ [ "$magic" = "FAT" ] && parttype=vfat
+ mount -t $parttype -o rw,noatime "/dev/$partdev" /boot
if [ -f "/boot/$BACKUP_FILE" ]; then
mv -f "/boot/$BACKUP_FILE" /
fi
diff --git a/target/linux/x86/base-files/lib/upgrade/platform.sh b/target/linux/x86/base-files/lib/upgrade/platform.sh
index 53c751861cc..1c93f5bd9b9 100644
--- a/target/linux/x86/base-files/lib/upgrade/platform.sh
+++ b/target/linux/x86/base-files/lib/upgrade/platform.sh
@@ -37,10 +37,12 @@ platform_check_image() {
}
platform_copy_config() {
- local partdev
+ local partdev magic parttype=ext4
if export_partdevice partdev 1; then
- mount -t ext4 -o rw,noatime "/dev/$partdev" /mnt
+ magic=$(dd if="/dev/$partdev" bs=1 count=3 skip=54 2>/dev/null)
+ [ "$magic" = "FAT" ] && parttype=vfat
+ mount -t $parttype -o rw,noatime "/dev/$partdev" /mnt
cp -af "$UPGRADE_BACKUP" "/mnt/$BACKUP_FILE"
umount /mnt
fi
diff --git a/target/linux/x86/generic/config-4.19 b/target/linux/x86/generic/config-4.19
index 4a689ca026c..ada81ce04ea 100644
--- a/target/linux/x86/generic/config-4.19
+++ b/target/linux/x86/generic/config-4.19
@@ -139,6 +139,7 @@ CONFIG_FB_DEFERRED_IO=y
CONFIG_FB_EFI=y
CONFIG_FB_HYPERV=y
# CONFIG_FB_I810 is not set
+CONFIG_FB_SIMPLE=y
CONFIG_FB_SYS_COPYAREA=y
CONFIG_FB_SYS_FILLRECT=y
CONFIG_FB_SYS_FOPS=y
diff --git a/target/linux/x86/generic/config-5.4 b/target/linux/x86/generic/config-5.4
index 4a689ca026c..ada81ce04ea 100644
--- a/target/linux/x86/generic/config-5.4
+++ b/target/linux/x86/generic/config-5.4
@@ -139,6 +139,7 @@ CONFIG_FB_DEFERRED_IO=y
CONFIG_FB_EFI=y
CONFIG_FB_HYPERV=y
# CONFIG_FB_I810 is not set
+CONFIG_FB_SIMPLE=y
CONFIG_FB_SYS_COPYAREA=y
CONFIG_FB_SYS_FILLRECT=y
CONFIG_FB_SYS_FOPS=y
diff --git a/target/linux/x86/image/Makefile b/target/linux/x86/image/Makefile
index c2961e5b9c9..aa80d77b978 100644
--- a/target/linux/x86/image/Makefile
+++ b/target/linux/x86/image/Makefile
@@ -38,6 +38,9 @@ endif
ROOTPART:=$(call qstrip,$(CONFIG_TARGET_ROOTFS_PARTNAME))
ROOTPART:=$(if $(ROOTPART),$(ROOTPART),PARTUUID=$(IMG_PART_SIGNATURE)-02)
+EFI_SIGNATURE:=$(strip $(shell uuidgen | sed -r 's/[a-zA-Z0-9]{2}$$/00/'))
+EFI_ROOTPART:=$(call qstrip,$(CONFIG_TARGET_ROOTFS_PARTNAME))
+EFI_ROOTPART:=$(if $(EFI_ROOTPART),$(EFI_ROOTPART),PARTUUID=$(shell echo $(EFI_SIGNATURE) | sed 's/00$$/02/'))
GRUB_TIMEOUT:=$(call qstrip,$(CONFIG_GRUB_TIMEOUT))
GRUB_TITLE:=$(call qstrip,$(CONFIG_GRUB_TITLE))
diff --git a/target/linux/x86/image/grub-iso.cfg b/target/linux/x86/image/grub-iso.cfg
index f5848b38534..4bef492a414 100644
--- a/target/linux/x86/image/grub-iso.cfg
+++ b/target/linux/x86/image/grub-iso.cfg
@@ -3,7 +3,12 @@
set default="0"
set timeout="@TIMEOUT@"
-set root='(cd)'
+
+if [ "${grub_platform}" = "efi" ]; then
+ set root='(cd0)'
+else
+ set root='(cd)'
+fi
menuentry "@TITLE@" {
linux /boot/vmlinuz root=/dev/sr0 rootfstype=iso9660 rootwait @CMDLINE@ noinitrd
From c24086b352f6f773c07f15f85b0e5ffe26e206af Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=9B=BD?= <uxgood.org@gmail.com>
Date: Sat, 31 Aug 2019 13:28:05 +0000
Subject: [PATCH 4/8] x86: fix sysupgrade for EFI images
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. make function get_partitions support GPT disks
2. get more bytes from image to get GPT partition table
3. update the original PARTUUID to new grub.cfg
Signed-off-by: 李国 <uxgood.org@gmail.com>
---
.../base-files/files/lib/upgrade/common.sh | 40 ++++++++++++++-----
.../x86/base-files/lib/upgrade/platform.sh | 20 ++++++++--
2 files changed, 45 insertions(+), 15 deletions(-)
diff --git a/package/base-files/files/lib/upgrade/common.sh b/package/base-files/files/lib/upgrade/common.sh
index 6e967aeffe8..1324b98ed2f 100644
--- a/package/base-files/files/lib/upgrade/common.sh
+++ b/package/base-files/files/lib/upgrade/common.sh
@@ -218,17 +218,35 @@ get_partitions() { # <device> <filename>
rm -f "/tmp/partmap.$filename"
local part
- for part in 1 2 3 4; do
- set -- $(hexdump -v -n 12 -s "$((0x1B2 + $part * 16))" -e '3/4 "0x%08X "' "$disk")
-
- local type="$(( $(hex_le32_to_cpu $1) % 256))"
- local lba="$(( $(hex_le32_to_cpu $2) ))"
- local num="$(( $(hex_le32_to_cpu $3) ))"
-
- [ $type -gt 0 ] || continue
-
- printf "%2d %5d %7d\n" $part $lba $num >> "/tmp/partmap.$filename"
- done
+ local magic=$(dd if="$disk" bs=8 count=1 skip=64 2>/dev/null)
+ if [ "$magic" = "EFI PART" ]; then
+ #export_partdevice will fail when partition number is greater than 15, as
+ #the partition major device number is not equal to the disk major device number
+ for part in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15; do
+ set -- $(hexdump -v -n 48 -s "$((0x380 + $part * 0x80))" -e '4/4 "%08x"" "4/4 "%08x"" "4/4 "0x%08X "' "$disk")
+
+ local type="$1"
+ local lba="$(( $(hex_le32_to_cpu $4) * 0x100000000 + $(hex_le32_to_cpu $3) ))"
+ local end="$(( $(hex_le32_to_cpu $6) * 0x100000000 + $(hex_le32_to_cpu $5) ))"
+ local num="$(( $end - $lba ))"
+
+ [ "$type" = "00000000000000000000000000000000" ] && continue
+
+ printf "%2d %5d %7d\n" $part $lba $num >> "/tmp/partmap.$filename"
+ done
+ else
+ for part in 1 2 3 4; do
+ set -- $(hexdump -v -n 12 -s "$((0x1B2 + $part * 16))" -e '3/4 "0x%08X "' "$disk")
+
+ local type="$(( $(hex_le32_to_cpu $1) % 256))"
+ local lba="$(( $(hex_le32_to_cpu $2) ))"
+ local num="$(( $(hex_le32_to_cpu $3) ))"
+
+ [ $type -gt 0 ] || continue
+
+ printf "%2d %5d %7d\n" $part $lba $num >> "/tmp/partmap.$filename"
+ done
+ fi
fi
}
diff --git a/target/linux/x86/base-files/lib/upgrade/platform.sh b/target/linux/x86/base-files/lib/upgrade/platform.sh
index 1c93f5bd9b9..3acee2c7a9c 100644
--- a/target/linux/x86/base-files/lib/upgrade/platform.sh
+++ b/target/linux/x86/base-files/lib/upgrade/platform.sh
@@ -20,7 +20,7 @@ platform_check_image() {
get_partitions "/dev/$diskdev" bootdisk
#extract the boot sector from the image
- get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b 2>/dev/null
+ get_image "$@" | dd of=/tmp/image.bs count=63 bs=512b 2>/dev/null
get_partitions /tmp/image.bs image
@@ -40,7 +40,7 @@ platform_copy_config() {
local partdev magic parttype=ext4
if export_partdevice partdev 1; then
- magic=$(dd if="/dev/$partdev" bs=1 count=3 skip=54 2>/dev/null)
+ magic="$(dd if="/dev/$partdev" bs=1 count=3 skip=54 2>/dev/null)"
[ "$magic" = "FAT" ] && parttype=vfat
mount -t $parttype -o rw,noatime "/dev/$partdev" /mnt
cp -af "$UPGRADE_BACKUP" "/mnt/$BACKUP_FILE"
@@ -83,7 +83,7 @@ platform_do_upgrade() {
get_partitions "/dev/$diskdev" bootdisk
#extract the boot sector from the image
- get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b
+ get_image "$@" | dd of=/tmp/image.bs count=63 bs=512b >/dev/null
get_partitions /tmp/image.bs image
@@ -108,7 +108,7 @@ platform_do_upgrade() {
while read part start size; do
if export_partdevice partdev $part; then
echo "Writing image to /dev/$partdev..."
- get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
+ get_image "$@" | dd of="/dev/$partdev" ibs=512 obs=1M skip="$start" count="$size" conv=fsync
else
echo "Unable to find partition $part device, skipped."
fi
@@ -119,4 +119,16 @@ platform_do_upgrade() {
get_image "$@" | dd of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync
platform_do_bootloader_upgrade "$diskdev"
+ local magic parttype=ext4
+ magic="$(dd if="/dev/$diskdev" bs=8 count=1 skip=64 2>/dev/null)"
+ [ "$magic" = "EFI PART" ] || return 0
+ if export_partdevice partdev 1; then
+ magic="$(dd if="/dev/$partdev" bs=1 count=3 skip=54 2>/dev/null)"
+ [ "$magic" = "FAT" ] && parttype=vfat
+ mount -t $parttype -o rw,noatime "/dev/$partdev" /mnt
+ set -- $(dd if="/dev/$diskdev" bs=1 skip=1168 count=16 2>/dev/null | hexdump -v -e '8/1 "%02x "" "2/1 "%02x""-"6/1 "%02x"')
+ sed -i "s/\(PARTUUID=\)[a-f0-9-]\+/\1$4$3$2$1-$6$5-$8$7-$9/ig" /mnt/boot/grub/grub.cfg
+ umount /mnt
+ fi
+
}
From b915dff5280cc48a2331f01961f2504b9b12f245 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=9B=BD?= <uxgood.org@gmail.com>
Date: Tue, 24 Mar 2020 17:12:22 +0800
Subject: [PATCH 5/8] grub2: grub-early.cfg auto detect efi platform
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: 李国 <uxgood.org@gmail.com>
---
package/boot/grub2/files/grub-early.cfg | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/package/boot/grub2/files/grub-early.cfg b/package/boot/grub2/files/grub-early.cfg
index 4a5b5a60927..9e7cad47607 100644
--- a/package/boot/grub2/files/grub-early.cfg
+++ b/package/boot/grub2/files/grub-early.cfg
@@ -1 +1,5 @@
-configfile (hd0,msdos1)/boot/grub/grub.cfg
+if [ "${grub_platform}" = "efi" ]; then
+ configfile (hd0,gpt1)/boot/grub/grub.cfg
+else
+ configfile (hd0,msdos1)/boot/grub/grub.cfg
+fi
From dce4fc3201395f886e496c3bb5f6ffd979558aa3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=9B=BD?= <uxgood.org@gmail.com>
Date: Tue, 24 Mar 2020 17:13:27 +0800
Subject: [PATCH 6/8] x86: add efi images
---
include/image.mk | 1 +
scripts/gen_image_generic.sh | 4 ++--
target/linux/x86/image/Makefile | 34 +++++++++++++++++++++++++----
target/linux/x86/image/grub-efi.cfg | 13 +++++++++++
4 files changed, 46 insertions(+), 6 deletions(-)
create mode 100644 target/linux/x86/image/grub-efi.cfg
diff --git a/include/image.mk b/include/image.mk
index 8af5905c600..051a6206cef 100644
--- a/include/image.mk
+++ b/include/image.mk
@@ -45,6 +45,7 @@ IMG_PREFIX:=$(VERSION_DIST_SANITIZED)-$(IMG_PREFIX_VERNUM)$(IMG_PREFIX_VERCODE)$
IMG_ROOTFS:=$(IMG_PREFIX)-rootfs
IMG_COMBINED:=$(IMG_PREFIX)-combined
IMG_PART_SIGNATURE:=$(shell echo $(SOURCE_DATE_EPOCH)$(LINUX_VERMAGIC) | mkhash md5 | cut -b1-8)
+IMG_PART_UUID:=$(shell echo $(SOURCE_DATE_EPOCH)$(LINUX_VERMAGIC) | mkhash md5 | sed -r 's/(.{8})(.{4})(.{4})(.{4})(.{10})../\1-\2-\3-\4-\500/')
MKFS_DEVTABLE_OPT := -D $(INCLUDE_DIR)/device_table.txt
diff --git a/scripts/gen_image_generic.sh b/scripts/gen_image_generic.sh
index 1df4d0673b3..e45a8dd417e 100755
--- a/scripts/gen_image_generic.sh
+++ b/scripts/gen_image_generic.sh
@@ -20,7 +20,7 @@ sect=63
cyl=$(( (KERNELSIZE + ROOTFSSIZE) * 1024 * 1024 / (head * sect * 512)))
# create partition table
-set $(ptgen -o "$OUTPUT" -h $head -s $sect ${EFI_SIGNATURE:+-g} -p ${KERNELSIZE}m -p ${ROOTFSSIZE}m ${ALIGN:+-l $ALIGN} ${SIGNATURE:+-S 0x$SIGNATURE} ${EFI_SIGNATURE:+-G $EFI_SIGNATURE})
+set $(ptgen -o "$OUTPUT" -h $head -s $sect ${UUID:+-g} -p ${KERNELSIZE}m -p ${ROOTFSSIZE}m ${ALIGN:+-l $ALIGN} ${SIGNATURE:+-S 0x$SIGNATURE} ${UUID:+-G $UUID})
KERNELOFFSET="$(($1 / 512))"
KERNELSIZE="$2"
@@ -30,7 +30,7 @@ ROOTFSSIZE="$(($4 / 512))"
[ -n "$PADDING" ] && dd if=/dev/zero of="$OUTPUT" bs=512 seek="$ROOTFSOFFSET" conv=notrunc count="$ROOTFSSIZE"
dd if="$ROOTFSIMAGE" of="$OUTPUT" bs=512 seek="$ROOTFSOFFSET" conv=notrunc
-if [ -n "$EFI_SIGNATURE" ]; then
+if [ -n "$UUID" ]; then
[ -n "$PADDING" ] && dd if=/dev/zero of="$OUTPUT" bs=512 seek="$(($ROOTFSOFFSET + $ROOTFSSIZE))" conv=notrunc count="$sect"
mkfs.fat -n kernel -C "$OUTPUT.kernel" -S 512 "$(($KERNELSIZE / 1024))"
mcopy -s -i "$OUTPUT.kernel" "$KERNELDIR"/* ::/
diff --git a/target/linux/x86/image/Makefile b/target/linux/x86/image/Makefile
index aa80d77b978..efb0b1cff99 100644
--- a/target/linux/x86/image/Makefile
+++ b/target/linux/x86/image/Makefile
@@ -38,9 +38,8 @@ endif
ROOTPART:=$(call qstrip,$(CONFIG_TARGET_ROOTFS_PARTNAME))
ROOTPART:=$(if $(ROOTPART),$(ROOTPART),PARTUUID=$(IMG_PART_SIGNATURE)-02)
-EFI_SIGNATURE:=$(strip $(shell uuidgen | sed -r 's/[a-zA-Z0-9]{2}$$/00/'))
EFI_ROOTPART:=$(call qstrip,$(CONFIG_TARGET_ROOTFS_PARTNAME))
-EFI_ROOTPART:=$(if $(EFI_ROOTPART),$(EFI_ROOTPART),PARTUUID=$(shell echo $(EFI_SIGNATURE) | sed 's/00$$/02/'))
+EFI_ROOTPART:=$(if $(EFI_ROOTPART),$(EFI_ROOTPART),PARTUUID=$(shell echo $(IMG_PART_UUID) | sed 's/00$$/02/'))
GRUB_TIMEOUT:=$(call qstrip,$(CONFIG_GRUB_TIMEOUT))
GRUB_TITLE:=$(call qstrip,$(CONFIG_GRUB_TITLE))
@@ -50,7 +49,8 @@ BOOTOPTS:=$(call qstrip,$(CONFIG_GRUB_BOOTOPTS))
define Build/combined
$(CP) $(KDIR)/$(KERNEL_NAME) $@.boot/boot/vmlinuz
-$(CP) $(STAGING_DIR_ROOT)/boot/. $@.boot/boot/
- PADDING="1" SIGNATURE="$(IMG_PART_SIGNATURE)" $(SCRIPT_DIR)/gen_image_generic.sh \
+ PADDING="1" SIGNATURE="$(IMG_PART_SIGNATURE)" \
+ $(if $(filter $(1),efi),UUID="$(IMG_PART_UUID)") $(SCRIPT_DIR)/gen_image_generic.sh \
$@ \
$(CONFIG_TARGET_KERNEL_PARTSIZE) $@.boot \
$(CONFIG_TARGET_ROOTFS_PARTSIZE) $(IMAGE_ROOTFS) \
@@ -64,6 +64,7 @@ define Build/grub-config
-e 's#@SERIAL_CONFIG@#$(strip $(GRUB_SERIAL_CONFIG))#g' \
-e 's#@TERMINAL_CONFIG@#$(strip $(GRUB_TERMINAL_CONFIG))#g' \
-e 's#@ROOTPART@#root=$(ROOTPART) rootwait#g' \
+ -e 's#@EFI_ROOTPART@#root=$(EFI_ROOTPART) rootwait#g' \
-e 's#@CMDLINE@#$(BOOTOPTS) $(GRUB_CONSOLE_CMDLINE)#g' \
-e 's#@TIMEOUT@#$(GRUB_TIMEOUT)#g' \
-e 's#@TITLE@#$(GRUB_TITLE)#g' \
@@ -80,7 +81,7 @@ define Build/grub-install
$(STAGING_DIR_HOST)/bin/grub-bios-setup \
-m "$@.grub2/device.map" \
-d "$@.grub2" \
- -r "hd0,msdos1" \
+ -r "hd0,$(if $(filter $(1),efi),gpt1,msdos1)" \
$@
endef
@@ -91,7 +92,9 @@ define Build/iso
$(STAGING_DIR_HOST)/lib/grub/grub2-iso/eltorito.img \
> $@.boot/boot/grub/eltorito.img
-$(CP) $(STAGING_DIR_ROOT)/boot/. $@.boot/boot/
+ $(if $(filter $(1),efi),$(CP) $(STAGING_DIR_HOST)/lib/grub/grub2-iso/efiboot.img $@.boot/boot/grub/)
mkisofs -R -b boot/grub/eltorito.img -no-emul-boot -boot-info-table \
+ $(if $(filter $(1),efi),-boot-load-size 4 -c boot.cat -eltorito-alt-boot -e boot/grub/efiboot.img -no-emul-boot) \
-o $@ $@.boot $(TARGET_DIR)
endef
@@ -102,13 +105,25 @@ define Device/Default
IMAGE/combined.img.gz := grub-config pc | combined | grub-install | gzip
IMAGE/combined.vdi := grub-config pc | combined | grub-install | qemu-image vdi
IMAGE/combined.vmdk := grub-config pc | combined | grub-install | qemu-image vmdk
IMAGE/rootfs.img := append-rootfs
IMAGE/rootfs.img.gz := append-rootfs | gzip
+ ARTIFACT/image-efi.iso := grub-config iso | iso efi
+ IMAGE/combined-efi.img := grub-config efi | combined efi | grub-install efi
+ IMAGE/combined-efi.img.gz := grub-config efi | combined efi | grub-install efi | gzip
+ IMAGE/combined-efi.vdi := grub-config efi | combined efi | grub-install efi | qemu-image vdi
+ IMAGE/combined-efi.vmdk := grub-config efi | combined efi | grub-install efi | qemu-image vmdk
ifeq ($(CONFIG_TARGET_IMAGES_GZIP),y)
IMAGES := combined.img.gz rootfs.img.gz
else
IMAGES := combined.img rootfs.img
endif
+ ifeq $(CONFIG_EFI_IMAGES)
+ ifeq ($(CONFIG_TARGET_IMAGES_GZIP),y)
+ IMAGES += combined-efi.img.gz
+ else
+ IMAGES += combined-efi.img
+ endif
+ endif
KERNEL := kernel-bin
KERNEL_INSTALL := 1
KERNEL_NAME := bzImage
@@ -119,6 +134,17 @@ define Device/Default
ifeq ($(CONFIG_VMDK_IMAGES),y)
IMAGES += combined.vmdk
endif
+ ifeq $(CONFIG_EFI_IMAGES)
+ ifeq ($(CONFIG_ISO_IMAGES),y)
+ ARTIFACTS += image-efi.iso
+ endif
+ ifeq ($(CONFIG_VDI_IMAGES),y)
+ IMAGES += combined-efi.vdi
+ endif
+ ifeq ($(CONFIG_VMDK_IMAGES),y)
+ IMAGES += combined-efi.vmdk
+ endif
+ endif
endef
$(eval $(call Image/gzip-ext4-padded-squashfs))
diff --git a/target/linux/x86/image/grub-efi.cfg b/target/linux/x86/image/grub-efi.cfg
new file mode 100644
index 00000000000..f3f6a02c021
--- /dev/null
+++ b/target/linux/x86/image/grub-efi.cfg
@@ -0,0 +1,13 @@
+@SERIAL_CONFIG@
+@TERMINAL_CONFIG@
+
+set default="0"
+set timeout="@TIMEOUT@"
+set root='(hd0,gpt1)'
+
+menuentry "@TITLE@" {
+ linux /boot/vmlinuz @EFI_ROOTPART@ @CMDLINE@ noinitrd
+}
+menuentry "@TITLE@ (failsafe)" {
+ linux /boot/vmlinuz failsafe=true @EFI_ROOTPART@ @CMDLINE@ noinitrd
+}
From 317bb3e99c4ad67e6e5680d0fbf03d65294aac2f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=9B=BD?= <uxgood.org@gmail.com>
Date: Tue, 24 Mar 2020 18:01:39 +0800
Subject: [PATCH 7/8] grub2: fix path
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: 李国 <uxgood.org@gmail.com>
---
package/boot/grub2/grub2/Makefile | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/package/boot/grub2/grub2/Makefile b/package/boot/grub2/grub2/Makefile
index 7126beab4cf..3302838d719 100644
--- a/package/boot/grub2/grub2/Makefile
+++ b/package/boot/grub2/grub2/Makefile
@@ -44,7 +44,7 @@ define Host/Install
-d $(STAGING_DIR_HOST)/lib/grub/i386-pc \
-p /boot/grub \
-O i386-pc \
- -c ./files/grub-early.cfg \
+ -c ../files/grub-early.cfg \
-o $(STAGING_DIR_HOST)/lib/grub/grub2-generic/core.img \
at_keyboard biosdisk boot chain configfile ext2 linux ls part_msdos reboot serial vga
@@ -53,7 +53,7 @@ define Host/Install
-d $(STAGING_DIR_HOST)/lib/grub/i386-pc \
-p /boot/grub \
-O i386-pc \
- -c ./files/grub-early.cfg \
+ -c ../files/grub-early.cfg \
-o $(STAGING_DIR_HOST)/lib/grub/grub2-iso/eltorito.img \
at_keyboard biosdisk boot chain configfile iso9660 linux ls part_msdos reboot serial vga
@@ -62,7 +62,7 @@ define Host/Install
-d $(STAGING_DIR_HOST)/lib/grub/i386-pc \
-p /boot/grub \
-O i386-pc \
- -c ./files/grub-early.cfg \
+ -c ../files/grub-early.cfg \
-o $(STAGING_DIR_HOST)/lib/grub/grub2-legacy/core.img \
biosdisk boot chain configfile ext2 linux ls part_msdos reboot serial vga
endef
From 784fcc94242d146f2ef2c31e292ace8816985d62 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=9B=BD?= <uxgood.org@gmail.com>
Date: Tue, 24 Mar 2020 18:02:57 +0800
Subject: [PATCH 8/8] x86: fix
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: 李国 <uxgood.org@gmail.com>
---
target/linux/x86/image/Makefile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/target/linux/x86/image/Makefile b/target/linux/x86/image/Makefile
index efb0b1cff99..ff964cde8ab 100644
--- a/target/linux/x86/image/Makefile
+++ b/target/linux/x86/image/Makefile
@@ -115,7 +115,7 @@ define Device/Default
else
IMAGES := combined.img
endif
- ifeq $(CONFIG_EFI_IMAGES)
+ ifeq ($(CONFIG_EFI_IMAGES),y)
ifeq ($(CONFIG_TARGET_IMAGES_GZIP),y)
IMAGES += combined-efi.img.gz
else
@@ -134,7 +134,7 @@ define Device/Default
ifeq ($(CONFIG_VMDK_IMAGES),y)
IMAGES += combined.vmdk
endif
- ifeq $(CONFIG_EFI_IMAGES)
+ ifeq ($(CONFIG_EFI_IMAGES),y)
ifeq ($(CONFIG_ISO_IMAGES),y)
ARTIFACTS += image-efi.iso
endif