summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2015-12-06 00:54:10 +0100
committerMichael Brown2015-12-07 14:08:22 +0100
commit7f65a08f3e2606a5102fb68acf6ccf5fc283ecb6 (patch)
tree714de0295e7977592c187e1c94b2172f8d8b3396
parent[bitops] Provide BIT_QWORD_PTR() (diff)
downloadipxe-7f65a08f3e2606a5102fb68acf6ccf5fc283ecb6.tar.gz
ipxe-7f65a08f3e2606a5102fb68acf6ccf5fc283ecb6.tar.xz
ipxe-7f65a08f3e2606a5102fb68acf6ccf5fc283ecb6.zip
[efi] Add %.usb target for building EFI-bootable USB (or other) disk images
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/arch/i386/Makefile.efi4
-rw-r--r--src/arch/x86/Makefile.efi4
-rw-r--r--src/arch/x86_64/Makefile.efi4
-rwxr-xr-xsrc/util/genefidsk60
4 files changed, 72 insertions, 0 deletions
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] <ipxe.efi>"
+ 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}