From 7f65a08f3e2606a5102fb68acf6ccf5fc283ecb6 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sat, 5 Dec 2015 23:54:10 +0000 Subject: [PATCH] [efi] Add %.usb target for building EFI-bootable USB (or other) disk images Signed-off-by: Michael Brown --- src/arch/i386/Makefile.efi | 4 +++ src/arch/x86/Makefile.efi | 4 +++ src/arch/x86_64/Makefile.efi | 4 +++ src/util/genefidsk | 60 ++++++++++++++++++++++++++++++++++++ 4 files changed, 72 insertions(+) create mode 100755 src/util/genefidsk diff --git a/src/arch/i386/Makefile.efi b/src/arch/i386/Makefile.efi index aa809eb5..37ede65a 100644 --- a/src/arch/i386/Makefile.efi +++ b/src/arch/i386/Makefile.efi @@ -8,6 +8,10 @@ ELF2EFI = $(ELF2EFI32) # CFLAGS += -malign-double +# Specify EFI boot file +# +EFI_BOOT_FILE = bootia32.efi + # Include generic EFI Makefile # MAKEDEPS += arch/x86/Makefile.efi diff --git a/src/arch/x86/Makefile.efi b/src/arch/x86/Makefile.efi index f73bc7d5..c4bc2308 100644 --- a/src/arch/x86/Makefile.efi +++ b/src/arch/x86/Makefile.efi @@ -40,3 +40,7 @@ $(BIN)/%.efirom : $(BIN)/%.efidrv $(EFIROM) $(BIN)/efidrv.cab : $(BIN)/alldrv.efis # $(ALL_drv.efi) is not yet defined $(QM)$(ECHO) " [CAB] $@" $(Q)$(LCAB) -n -q $(ALL_drv.efi) $@ + +$(BIN)/%.usb : $(BIN)/%.efi + $(QM)$(ECHO) " [GENEFIDSK] $@" + $(Q)bash util/genefidsk -o $@ -b $(EFI_BOOT_FILE) $< diff --git a/src/arch/x86_64/Makefile.efi b/src/arch/x86_64/Makefile.efi index 26b71278..12408f86 100644 --- a/src/arch/x86_64/Makefile.efi +++ b/src/arch/x86_64/Makefile.efi @@ -8,6 +8,10 @@ CFLAGS += -mno-red-zone # ELF2EFI = $(ELF2EFI64) +# Specify EFI boot file +# +EFI_BOOT_FILE = bootx64.efi + # Include generic EFI Makefile # MAKEDEPS += arch/x86/Makefile.efi diff --git a/src/util/genefidsk b/src/util/genefidsk new file mode 100755 index 00000000..7064f99b --- /dev/null +++ b/src/util/genefidsk @@ -0,0 +1,60 @@ +#!/bin/sh +# +# Generate an EFI bootable disk image + +set -e + +function help() { + echo "Usage: ${0} [OPTIONS] " + echo + echo "where OPTIONS are:" + echo " -h Show this help" + echo " -b Specify boot file name (e.g. bootx64.efi)" + echo " -o FILE Save disk image to file" +} + +BOOT=bootx64.efi + +while getopts "hb:o:" opt; do + case ${opt} in + h) + help + exit 0 + ;; + b) + BOOT="${OPTARG}" + ;; + o) + OUT="${OPTARG}" + ;; + esac +done + +shift $((OPTIND - 1)) +IN=$1 + +if [ -z "${IN}" ]; then + echo "${0}: no input file given" >&2 + help + exit 1 +fi + +if [ -z "${OUT}" ]; then + echo "${0}: no output file given" >&2 + help + exit 1 +fi + +# Create sparse output file +rm -f ${OUT} +truncate -s 1440K ${OUT} + +# Format disk +mformat -i ${OUT} -f 1440 :: + +# Create directory structure +mmd -i ${OUT} ::efi +mmd -i ${OUT} ::efi/boot + +# Copy bootable image +mcopy -i ${OUT} ${IN} ::efi/boot/${BOOT}