svn commit: r323407 - head/sys/boot/efi/boot1

Ed Maste emaste at FreeBSD.org
Mon Sep 11 00:37:01 UTC 2017


Author: emaste
Date: Mon Sep 11 00:37:00 2017
New Revision: 323407
URL: https://svnweb.freebsd.org/changeset/base/323407

Log:
  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

Modified:
  head/sys/boot/efi/boot1/generate-fat.sh

Modified: head/sys/boot/efi/boot1/generate-fat.sh
==============================================================================
--- head/sys/boot/efi/boot1/generate-fat.sh	Mon Sep 11 00:19:09 2017	(r323406)
+++ head/sys/boot/efi/boot1/generate-fat.sh	Mon Sep 11 00:37:00 2017	(r323407)
@@ -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
+while read ARCH FILENAME; do
+	# Generate 800K FAT image
+	OUTPUT_FILE=fat-${ARCH}.tmpl
 
-uuencode $OUTPUT_FILE.bz2 $OUTPUT_FILE.bz2 >> $OUTPUT_FILE.bz2.uu
-rm $OUTPUT_FILE.bz2
+	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 <<EOF
+	amd64	BOOTx64.efi
+	arm64	BOOTaa64.efi
+	arm	BOOTarm.efi
+	i386	BOOTia32.efi
+EOF


More information about the svn-src-head mailing list