From 5e66298138a2243c9de66734e678ec0c3ff2ec08 Mon Sep 17 00:00:00 2001 From: Ed Maste Date: Mon, 11 Sep 2017 00:37:00 +0000 Subject: [PATCH] boot1 generate-fat: generate all templates at once In advance of other changes to the fat template generation process, have generate-fat.sh create all template files at the same time so that they cannot get out of sync. Also correct a longstanding but where BOOT1_OFFSET was overwritten on each invocation. A previous version of this patch stored a per-arch offset (e.g. BOOT1_arm64_OFFSET) but that was deemed unnecessary. Instead just hardcode the known offset that applies to all archs (0x2d) and fail if the offset happens to be different. Ongiong work (using newfs_msdos in bsdinstall and adding msdosfs support to makefs) will eventually allow us to do away with this fat template hack altogether, but in the near term we have a few improvements that will build on this. Reviewed by: allanjude, imp, Eric McCorkle MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D10931 --- sys/boot/efi/boot1/generate-fat.sh | 97 +++++++++++++++--------------- 1 file changed, 50 insertions(+), 47 deletions(-) diff --git a/sys/boot/efi/boot1/generate-fat.sh b/sys/boot/efi/boot1/generate-fat.sh index d9dfb27de25..4b4b9a17ec1 100755 --- a/sys/boot/efi/boot1/generate-fat.sh +++ b/sys/boot/efi/boot1/generate-fat.sh @@ -13,50 +13,14 @@ FAT_SIZE=1600 #Size in 512-byte blocks of the produced image +BOOT1_OFFSET=2d BOOT1_SIZE=128k -# -# Known filenames -# amd64: BOOTx64.efi -# arm64: BOOTaa64.efi -# arm: BOOTarm.efi -# i386: BOOTia32.efi -# -if [ -z "$2" ]; then - echo "Usage: $0 arch boot-filename" +if [ $(id -u) != 0 ]; then + echo "${0##*/}: must run as root" >&2 exit 1 fi -ARCH=$1 -FILENAME=$2 - -# Generate 800K FAT image -OUTPUT_FILE=fat-${ARCH}.tmpl - -dd if=/dev/zero of=$OUTPUT_FILE bs=512 count=$FAT_SIZE -DEVICE=`mdconfig -a -f $OUTPUT_FILE` -newfs_msdos -F 12 -L EFI $DEVICE -mkdir stub -mount -t msdosfs /dev/$DEVICE stub - -# Create and bless a directory for the boot loader -mkdir -p stub/efi/boot - -# Make a dummy file for boot1 -echo 'Boot1 START' | dd of=stub/efi/boot/$FILENAME cbs=$BOOT1_SIZE count=1 conv=block -# Provide a fallback startup.nsh -echo $FILENAME > stub/efi/boot/startup.nsh - -umount stub -mdconfig -d -u $DEVICE -rmdir stub - -# Locate the offset of the fake file -BOOT1_OFFSET=$(hd $OUTPUT_FILE | grep 'Boot1 START' | cut -f 1 -d ' ') - -# Convert to number of blocks -BOOT1_OFFSET=$(echo 0x$BOOT1_OFFSET | awk '{printf("%x\n",$1/512);}') - # Record maximum boot1 size in bytes case $BOOT1_SIZE in *k) @@ -72,11 +36,50 @@ echo "# \$FreeBSD\$" >> Makefile.fat echo "BOOT1_OFFSET=0x$BOOT1_OFFSET" >> Makefile.fat echo "BOOT1_MAXSIZE=$BOOT1_MAXSIZE" >> Makefile.fat -bzip2 $OUTPUT_FILE -echo 'FAT template boot filesystem created by generate-fat.sh' > $OUTPUT_FILE.bz2.uu -echo 'DO NOT EDIT' >> $OUTPUT_FILE.bz2.uu -echo "\$FreeBSD\$" >> $OUTPUT_FILE.bz2.uu - -uuencode $OUTPUT_FILE.bz2 $OUTPUT_FILE.bz2 >> $OUTPUT_FILE.bz2.uu -rm $OUTPUT_FILE.bz2 - +while read ARCH FILENAME; do + # Generate 800K FAT image + OUTPUT_FILE=fat-${ARCH}.tmpl + + dd if=/dev/zero of=$OUTPUT_FILE bs=512 count=$FAT_SIZE + DEVICE=`mdconfig -a -f $OUTPUT_FILE` + newfs_msdos -F 12 -L EFI $DEVICE + mkdir stub + mount -t msdosfs /dev/$DEVICE stub + + # Create and bless a directory for the boot loader + mkdir -p stub/efi/boot + + # Make a dummy file for boot1 + echo 'Boot1 START' | dd of=stub/efi/boot/$FILENAME cbs=$BOOT1_SIZE count=1 conv=block + # Provide a fallback startup.nsh + echo $FILENAME > stub/efi/boot/startup.nsh + + umount stub + mdconfig -d -u $DEVICE + rmdir stub + + # Locate the offset of the fake file + OFFSET=$(hd $OUTPUT_FILE | grep 'Boot1 START' | cut -f 1 -d ' ') + + # Convert to number of blocks + OFFSET=$(echo 0x$OFFSET | awk '{printf("%x\n",$1/512);}') + + # Validate the offset + if [ $OFFSET != $BOOT1_OFFSET ]; then + echo "Incorrect offset $OFFSET != $BOOT1_OFFSET" >&2 + exit 1 + fi + + bzip2 $OUTPUT_FILE + echo 'FAT template boot filesystem created by generate-fat.sh' > $OUTPUT_FILE.bz2.uu + echo 'DO NOT EDIT' >> $OUTPUT_FILE.bz2.uu + echo "\$FreeBSD\$" >> $OUTPUT_FILE.bz2.uu + + uuencode $OUTPUT_FILE.bz2 $OUTPUT_FILE.bz2 >> $OUTPUT_FILE.bz2.uu + rm $OUTPUT_FILE.bz2 +done <