diff --git a/tools/mkimage-raw-efi/Dockerfile b/tools/mkimage-raw-efi/Dockerfile new file mode 100644 index 000000000..0474436d9 --- /dev/null +++ b/tools/mkimage-raw-efi/Dockerfile @@ -0,0 +1,66 @@ +FROM linuxkit/alpine:8b53d842a47fce43464e15f65ee2f68b82542330 AS grub-build + +RUN apk add \ + automake \ + make \ + bison \ + gettext \ + flex \ + gcc \ + git \ + libtool \ + libc-dev \ + linux-headers \ + python3 \ + + autoconf + +# because python is not available +RUN ln -s python3 /usr/bin/python + +ENV GRUB_MODULES="part_gpt fat ext2 iso9660 gzio linux acpi normal cpio crypto disk boot crc64 gpt \ +search_disk_uuid tftp verify xzio xfs video" +ENV GRUB_COMMIT=6782f6d431d22b4e9ab14e94d263795c7991e160 + +COPY patches/* /patches/ +RUN mkdir /grub-lib && \ + set -e && \ + git clone https://github.com/coreos/grub.git && \ + cd grub && \ + git checkout -b grub-build ${GRUB_COMMIT} && \ + for patch in /patches/*.patch; do \ + echo "Applying $patch"; \ + patch -p1 < "$patch"; \ + done && \ + ./autogen.sh && \ + ./configure --libdir=/grub-lib --with-platform=efi CFLAGS="-Os -Wno-unused-value" && \ + make -j "$(getconf _NPROCESSORS_ONLN)" && \ + make install && \ +# create the grub core image + case $(uname -m) in \ + x86_64) \ + ./grub-mkimage -O x86_64-efi -d /grub-lib/grub/x86_64-efi -o /grub-lib/BOOTX64.EFI -p /EFI/BOOT ${GRUB_MODULES} linuxefi; \ + ;; \ + aarch64) \ + ./grub-mkimage -O arm64-efi -d /grub-lib/grub/arm64-efi -o /grub-lib/BOOTAA64.EFI -p /EFI/BOOT ${GRUB_MODULES}; \ + ;; \ + esac + +FROM linuxkit/alpine:77287352db68b442534c0005edd6ff750c8189f3 AS make-img + +RUN \ + apk update && apk upgrade && \ + apk add --no-cache \ + dosfstools \ + libarchive-tools \ + binutils \ + mtools \ + sfdisk \ + sgdisk \ + xfsprogs \ + && true + +COPY . . +COPY --from=grub-build /grub-lib/BOOT*.EFI /usr/local/share/ + +ENTRYPOINT [ "/make-efi" ] diff --git a/tools/mkimage-raw-efi/build.yml b/tools/mkimage-raw-efi/build.yml new file mode 100644 index 000000000..5647b2574 --- /dev/null +++ b/tools/mkimage-raw-efi/build.yml @@ -0,0 +1,2 @@ +image: mkimage-raw-efi +network: true diff --git a/tools/mkimage-raw-efi/make-efi b/tools/mkimage-raw-efi/make-efi new file mode 100755 index 000000000..3c026c4db --- /dev/null +++ b/tools/mkimage-raw-efi/make-efi @@ -0,0 +1,124 @@ +#!/bin/sh + +set -e +# for debugging +[ -n "$DEBUG" ] && set -x + +IMGFILE=$PWD/disk.img + + +# we want everything except the final result to stderr +( exec 1>&2; + +ESP_FILE=$PWD/boot.img + + + +# get the GRUB2 boot file name +ARCH=`uname -m` +case $ARCH in +x86_64) + BOOTFILE=BOOTX64.EFI + LINUX_ENTRY=linuxefi + INITRD_ENTRY=initrdefi + ;; +aarch64) + BOOTFILE=BOOTAA64.EFI + LINUX_ENTRY=linux + INITRD_ENTRY=initrd + ;; +esac + +mkdir -p /tmp/efi +cd /tmp/efi + +# input is a tarball on stdin with kernel and cmdline in /boot +# output is an iso on stdout + +# extract. BSD tar auto recognises compression, unlike GNU tar +# only if stdin is a tty, if so need files volume mounted... +[ -t 0 ] || bsdtar xzf - + +INITRD="$(find . -name '*.img')" +KERNEL="$(find . -name kernel)" +CMDLINE_FILE="$(find . -name cmdline)" +CMDLINE="$(cat $CMDLINE_FILE )" + +# PARTUUID for root +PARTUUID=$(cat /proc/sys/kernel/random/uuid) + +cp /usr/local/share/$BOOTFILE . + +mkdir -p EFI/BOOT +cat >> EFI/BOOT/grub.cfg < /dev/null +echo "mtools_skip_check=1" >> /etc/mtools.conf && \ +mmd -i $ESP_FILE ::/EFI +mmd -i $ESP_FILE ::/EFI/BOOT +mcopy -i $ESP_FILE $BOOTFILE ::/EFI/BOOT/ +mcopy -i $ESP_FILE EFI/BOOT/grub.cfg ::/EFI/BOOT/ +mcopy -i $ESP_FILE $KERNEL ::/ +mcopy -i $ESP_FILE $INITRD ::/ + + +# now make our actual filesystem image +# how big an image do we want? +# it should be the size of our ESP file+1MB for BIOS boot + 1MB for MBR + 1MB for GPT +ONEMB=$(( 1024 * 1024 )) +SIZE_IN_BYTES=$(( $(stat -c %s "$ESP_FILE") + 4*$ONEMB )) + +# and make sure the ESP is bootable for BIOS mode +# settings +BLKSIZE=512 +MB_BLOCKS=$(( $SIZE_IN_BYTES / $ONEMB )) + +# make the image +dd if=/dev/zero of=$IMGFILE bs=1M count=$MB_BLOCKS + +ESP_SECTOR_START=2048 +ESP_SECTOR_END=$(( $ESP_SECTOR_START + $ESP_FILE_SIZE_SECTORS - 1 )) + +# create the partitions - size of the ESP must match our image +# and make sure the ESP is bootable for BIOS mode +sgdisk --clear \ + --new 1:$ESP_SECTOR_START:$ESP_SECTOR_END --typecode=1:ef00 --change-name=1:'EFI System' --partition-guid=1:$PARTUUID \ + --attributes 1:set:2 \ + $IMGFILE + +# copy in our EFI System Partition image +dd if=$ESP_FILE of=$IMGFILE bs=$BLKSIZE count=$ESP_FILE_SIZE_SECTORS conv=notrunc seek=$ESP_SECTOR_START + +) + +cat $IMGFILE diff --git a/tools/mkimage-raw-efi/patches/0001-TPM-build-issue-fixing.patch b/tools/mkimage-raw-efi/patches/0001-TPM-build-issue-fixing.patch new file mode 100644 index 000000000..1a17a57a9 --- /dev/null +++ b/tools/mkimage-raw-efi/patches/0001-TPM-build-issue-fixing.patch @@ -0,0 +1,72 @@ +From 617b08377dbaa9ea3876b5585fe0ba36286fbed6 Mon Sep 17 00:00:00 2001 +From: Dennis Chen +Date: Thu, 17 Aug 2017 05:47:55 +0000 +Subject: [PATCH] TPM: build issue fixing + +Fix the build issue on arm64 and amd64. + +Signed-off-by: Dennis Chen +--- + grub-core/kern/efi/tpm.c | 12 ++++++------ + include/grub/efi/tpm.h | 4 ++-- + 2 files changed, 8 insertions(+), 8 deletions(-) + +diff --git a/grub-core/kern/efi/tpm.c b/grub-core/kern/efi/tpm.c +index c9fb3c1..ed40f98 100644 +--- a/grub-core/kern/efi/tpm.c ++++ b/grub-core/kern/efi/tpm.c +@@ -175,7 +175,7 @@ grub_tpm1_log_event(grub_efi_handle_t tpm_handle, unsigned char *buf, + grub_size_t size, grub_uint8_t pcr, + const char *description) + { +- Event *event; ++ TCG_PCR_EVENT *event; + grub_efi_status_t status; + grub_efi_tpm_protocol_t *tpm; + grub_efi_physical_address_t lastevent; +@@ -188,15 +188,15 @@ grub_tpm1_log_event(grub_efi_handle_t tpm_handle, unsigned char *buf, + if (!grub_tpm_present(tpm)) + return 0; + +- event = grub_zalloc(sizeof (Event) + grub_strlen(description) + 1); ++ event = grub_zalloc(sizeof (TCG_PCR_EVENT) + grub_strlen(description) + 1); + if (!event) + return grub_error (GRUB_ERR_OUT_OF_MEMORY, + N_("cannot allocate TPM event buffer")); + +- event->pcrindex = pcr; +- event->eventtype = EV_IPL; +- event->eventsize = grub_strlen(description) + 1; +- grub_memcpy(event->event, description, event->eventsize); ++ event->PCRIndex = pcr; ++ event->EventType = EV_IPL; ++ event->EventSize = grub_strlen(description) + 1; ++ grub_memcpy(event->Event, description, event->EventSize); + + algorithm = TCG_ALG_SHA; + status = efi_call_7 (tpm->log_extend_event, tpm, buf, (grub_uint64_t) size, +diff --git a/include/grub/efi/tpm.h b/include/grub/efi/tpm.h +index e2aff4a..fb3bb0e 100644 +--- a/include/grub/efi/tpm.h ++++ b/include/grub/efi/tpm.h +@@ -69,7 +69,7 @@ struct grub_efi_tpm_protocol + grub_efi_uint32_t TpmOutputParameterBlockSize, + grub_efi_uint8_t *TpmOutputParameterBlock); + grub_efi_status_t (*log_extend_event) (struct grub_efi_tpm_protocol *this, +- grub_efi_physical_address_t HashData, ++ grub_efi_uint8_t *HashData, + grub_efi_uint64_t HashDataLen, + grub_efi_uint32_t AlgorithmId, + TCG_PCR_EVENT *TCGLogData, +@@ -129,7 +129,7 @@ struct grub_efi_tpm2_protocol + grub_efi_boolean_t *EventLogTruncated); + grub_efi_status_t (*hash_log_extend_event) (struct grub_efi_tpm2_protocol *this, + grub_efi_uint64_t Flags, +- grub_efi_physical_address_t *DataToHash, ++ grub_efi_uint8_t *DataToHash, + grub_efi_uint64_t DataToHashLen, + EFI_TCG2_EVENT *EfiTcgEvent); + grub_efi_status_t (*submit_command) (struct grub_efi_tpm2_protocol *this, +-- +2.7.4 + diff --git a/tools/mkimage-raw-efi/patches/0002-video-Allow-to-set-pure-text-mode-in-case-of-EFI.patch b/tools/mkimage-raw-efi/patches/0002-video-Allow-to-set-pure-text-mode-in-case-of-EFI.patch new file mode 100644 index 000000000..8cc747b6c --- /dev/null +++ b/tools/mkimage-raw-efi/patches/0002-video-Allow-to-set-pure-text-mode-in-case-of-EFI.patch @@ -0,0 +1,33 @@ +From ac7afa666cb2b7b133b6e27bcf22c9cd90a2936a Mon Sep 17 00:00:00 2001 +From: Dennis Chen +Date: Wed, 6 Sep 2017 09:06:54 +0000 +Subject: [PATCH] video: Allow to set pure 'text' mode in case of EFI + +Current code doesn't accept a pure text mode when booting +from UEFI firmware on i386 platform, this will result in +below error message even we already have 'set gfxpayload=text' +configured: "no suitable video mode found". This often happens +when we boot a VM which UEFI firmware doesn't include 'suitable' +video modes. + +Signed-off-by: Dennis Chen +--- + grub-core/loader/i386/linux.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c +index 5fdfea3..8cf1086 100644 +--- a/grub-core/loader/i386/linux.c ++++ b/grub-core/loader/i386/linux.c +@@ -49,7 +49,7 @@ GRUB_MOD_LICENSE ("GPLv3+"); + #include + #define HAS_VGA_TEXT 0 + #define DEFAULT_VIDEO_MODE "auto" +-#define ACCEPTS_PURE_TEXT 0 ++#define ACCEPTS_PURE_TEXT 1 + #elif defined (GRUB_MACHINE_IEEE1275) + #include + #define HAS_VGA_TEXT 0 +-- +2.7.4 +