build/serial: rebuild UEFI on FreeBSD 13

The .efifat files have been deleted from the distribution so they
need to be handrolled.  That's alright, but then mkimg doesn't work
on FreeBSD 13 because our STAGEDIR contains a ":" character.
Sidestep the issue by using a relative path inside STAGEDIR, but
also hoping that file names with ":" are not becoming second-class.

This should be compatible with 21.7 builds although we likely do not
need new images.

While here also convert dvd image with others to be done later.
This commit is contained in:
Franco Fichtner 2021-08-19 23:37:45 +02:00
parent 27bfcb143b
commit 06c8cd0ca9
3 changed files with 38 additions and 20 deletions

View File

@ -1111,6 +1111,26 @@ EOF
EOF
}
setup_efiboot()
{
local EFIFILE
if [ ${PRODUCT_ARCH} = "amd64" ]; then
EFIFILE=bootx64
elif [ ${PRODUCT_ARCH} = "aarch64" ]; then
EFIFILE=bootaa64
else
echo ">>> Unsupported UEFI architecture: ${PRODUCT_ARCH}" >&2
exit 1
fi
mkdir -p ${1}.d/EFI/LOADER
cp ${2} ${1}.d/EFI/LOADER/${EFIFILE}.efi
makefs -t msdos -o fat_type=32 -o sectors_per_cluster=1 \
-o volume_label=EFISYS -s 33292k ${1} ${1}.d
}
setup_stage()
{
echo ">>> Setting up stage in ${1}"

View File

@ -47,23 +47,14 @@ setup_mtree ${STAGEDIR}/work
setup_entropy ${STAGEDIR}/work
UEFIBOOT=
if [ ${PRODUCT_ARCH} = "amd64" -a -n "${PRODUCT_UEFI}" -a \
-z "${PRODUCT_UEFI%%*"${SELF}"*}" ]; then
dd if=/dev/zero of=${STAGEDIR}/efiboot.img bs=4k count=200
DEV=$(mdconfig -a -t vnode -f ${STAGEDIR}/efiboot.img)
newfs_msdos -F 12 -m 0xf8 /dev/${DEV}
mount -t msdosfs /dev/${DEV} ${STAGEDIR}/mnt
mkdir -p ${STAGEDIR}/mnt/efi/boot
cp ${STAGEDIR}/work/boot/loader.efi \
${STAGEDIR}/mnt/efi/boot/bootx64.efi
umount ${STAGEDIR}/mnt
mdconfig -d -u ${DEV}
if [ -n "${PRODUCT_UEFI}" -a -z "${PRODUCT_UEFI%%*"${SELF}"*}" ]; then
UEFIBOOT="-o bootimage=i386;${STAGEDIR}/efiboot.img"
UEFIBOOT="${UEFIBOOT} -o no-emul-boot -o platformid=efi"
fi
echo -n ">>> Building dvd image... "
setup_efiboot ${STAGEDIR}/efiboot.img \
${STAGEDIR}/work/boot/loader.efi
fi
cat > ${STAGEDIR}/work/etc/fstab << EOF
# Device Mountpoint FStype Options Dump Pass #
@ -71,6 +62,8 @@ cat > ${STAGEDIR}/work/etc/fstab << EOF
tmpfs /tmp tmpfs rw,mode=01777 0 0
EOF
echo -n ">>> Building dvd image... "
makefs -t cd9660 \
-o 'bootimage=i386;'"${STAGEDIR}"'/work/boot/cdboot' -o no-emul-boot \
${UEFIBOOT} -o label=${DVDLABEL} -o rockridge ${DVDIMAGE} ${STAGEDIR}/work

View File

@ -56,15 +56,20 @@ EOF
makefs -B little -o label=${SERIALLABEL} -o version=2 \
${STAGEDIR}/root.part ${STAGEDIR}/work
UEFIBOOT=
GPTDUMMY=
UEFIBOOT=
if [ ${PRODUCT_ARCH} = "amd64" -a -n "${PRODUCT_UEFI}" -a \
-z "${PRODUCT_UEFI%%*"${SELF}"*}" ]; then
UEFIBOOT="-p efi:=${STAGEDIR}/work/boot/boot1.efifat"
if [ "${PRODUCT_UEFI}" -a -z "${PRODUCT_UEFI%%*"${SELF}"*}" ]; then
GPTDUMMY="-p freebsd-swap::512k"
UEFIBOOT="-p efi:=efiboot.img"
setup_efiboot ${STAGEDIR}/efiboot.img \
${STAGEDIR}/work/boot/loader.efi
fi
mkimg -s gpt -o ${SERIALIMG} -b ${STAGEDIR}/work/boot/pmbr ${UEFIBOOT} \
-p freebsd-boot:=${STAGEDIR}/work/boot/gptboot ${GPTDUMMY} \
-p freebsd-ufs:=${STAGEDIR}/root.part
echo -n ">>> Building serial image... "
(cd ${STAGEDIR}; mkimg -s gpt -o ${SERIALIMG} -b work/boot/pmbr ${UEFIBOOT} \
-p freebsd-boot:=work/boot/gptboot ${GPTDUMMY} -p freebsd-ufs:=root.part)
echo "done"