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
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to