18befcf7bSNathan Whitehorn#!/bin/sh 28befcf7bSNathan Whitehorn#- 3db8b5613SRebecca Cran# Copyright (c) 2018 Rebecca Cran 48befcf7bSNathan Whitehorn# Copyright (c) 2017 Nathan Whitehorn 58befcf7bSNathan Whitehorn# All rights reserved. 68befcf7bSNathan Whitehorn# 78befcf7bSNathan Whitehorn# Redistribution and use in source and binary forms, with or without 88befcf7bSNathan Whitehorn# modification, are permitted provided that the following conditions 98befcf7bSNathan Whitehorn# are met: 108befcf7bSNathan Whitehorn# 1. Redistributions of source code must retain the above copyright 118befcf7bSNathan Whitehorn# notice, this list of conditions and the following disclaimer. 128befcf7bSNathan Whitehorn# 2. Redistributions in binary form must reproduce the above copyright 138befcf7bSNathan Whitehorn# notice, this list of conditions and the following disclaimer in the 148befcf7bSNathan Whitehorn# documentation and/or other materials provided with the distribution. 158befcf7bSNathan Whitehorn# 168befcf7bSNathan Whitehorn# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 178befcf7bSNathan Whitehorn# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 188befcf7bSNathan Whitehorn# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 198befcf7bSNathan Whitehorn# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 208befcf7bSNathan Whitehorn# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 218befcf7bSNathan Whitehorn# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 228befcf7bSNathan Whitehorn# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 238befcf7bSNathan Whitehorn# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 248befcf7bSNathan Whitehorn# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 258befcf7bSNathan Whitehorn# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 268befcf7bSNathan Whitehorn# SUCH DAMAGE. 278befcf7bSNathan Whitehorn# 288befcf7bSNathan Whitehorn# $FreeBSD$ 298befcf7bSNathan Whitehorn 30a89559c2SYuri PankovBSDCFG_SHARE="/usr/share/bsdconfig" 31a89559c2SYuri Pankov. $BSDCFG_SHARE/common.subr || exit 1 32a89559c2SYuri Pankov 33a107ddbbSRebecca Cran: ${TMPDIR:="/tmp"} 34a107ddbbSRebecca Cran 35db8b5613SRebecca Crandie() { 36db8b5613SRebecca Cran echo $* 37db8b5613SRebecca Cran exit 1 38db8b5613SRebecca Cran} 39db8b5613SRebecca Cran 408befcf7bSNathan Whitehornif [ `uname -m` == powerpc ]; then 418befcf7bSNathan Whitehorn platform=`sysctl -n hw.platform` 428befcf7bSNathan Whitehorn if [ "$platform" == ps3 -o "$platform" == powernv ]; then 438befcf7bSNathan Whitehorn rootpart=$(awk '{ if($2 == "/") printf("%s:%s\n", $3, $1); }' $PATH_FSTAB) 448befcf7bSNathan Whitehorn mkdir -p $BSDINSTALL_CHROOT/boot/etc/ 45fdb600afSJustin Hibbits echo FreeBSD=\'/kernel/kernel kernelname=/boot/kernel/kernel vfs.root.mountfrom=${rootpart}\' > $BSDINSTALL_CHROOT/boot/etc/kboot.conf 468befcf7bSNathan Whitehorn fi 478befcf7bSNathan Whitehornfi 488befcf7bSNathan Whitehorn 49db8b5613SRebecca Cran# Update the ESP (EFI System Partition) with the new bootloader 50db8b5613SRebecca Cranif [ "$(uname -m)" = "amd64" ] || [ "$(uname -m)" = "i386" ]; then 51db8b5613SRebecca Cran X86_BOOTMETHOD=$(sysctl -n machdep.bootmethod) 52db8b5613SRebecca Cranfi 538befcf7bSNathan Whitehorn 54*7b08a307SMitchell Horneif [ "$(uname -m)" = "arm64" ] || [ "$(uname -m)" = "riscv" ] || [ "$X86_BOOTMETHOD" = "UEFI" ]; then 55a107ddbbSRebecca Cran UFSBOOT_ESPS=$(cat $TMPDIR/bsdinstall-esps 2>/dev/null) 56a107ddbbSRebecca Cran ZFSBOOT_DISKS=$(cat $TMPDIR/bsdinstall-zfsboot 2>/dev/null) 57db8b5613SRebecca Cran num_esps=0 58db8b5613SRebecca Cran 59db8b5613SRebecca Cran if [ -n "$ZFSBOOT_DISKS" ]; then 60db8b5613SRebecca Cran # We're in a ZFS install environment 61db8b5613SRebecca Cran for disk in $ZFSBOOT_DISKS; do 62db8b5613SRebecca Cran index=$(gpart show "$disk" | cut -w -f 4,5 | grep "efi" | cut -w -f 1) 63db8b5613SRebecca Cran # Check that $index is an integer 64db8b5613SRebecca Cran [ -n "$index" ] && [ "$index" -eq "$index" ] && [ "$index" -ge 0 ] 2> /dev/null 65db8b5613SRebecca Cran if [ $? -ne 0 ]; then 66db8b5613SRebecca Cran continue 67db8b5613SRebecca Cran fi 68db8b5613SRebecca Cran 69db8b5613SRebecca Cran if [ -e "/dev/${disk}p${index}" ]; then 70db8b5613SRebecca Cran ESPS="$ESPS ${disk}p${index}" 71db8b5613SRebecca Cran elif [ -e "/dev/${disk}s${index}" ]; then 72db8b5613SRebecca Cran ESPS="$ESPS ${disk}s${index}" 73db8b5613SRebecca Cran else 74db8b5613SRebecca Cran continue 75db8b5613SRebecca Cran fi 76db8b5613SRebecca Cran 77db8b5613SRebecca Cran num_esps=$((num_esps + 1)) 78db8b5613SRebecca Cran done 79db8b5613SRebecca Cran fi 80db8b5613SRebecca Cran 81db8b5613SRebecca Cran if [ -n "$UFSBOOT_ESPS" ]; then 82db8b5613SRebecca Cran # We're in a UFS install environment 83db8b5613SRebecca Cran for partition in $UFSBOOT_ESPS; do 84db8b5613SRebecca Cran ESPS="$ESPS $partition" 85db8b5613SRebecca Cran num_esps=$((num_esps + 1)) 86db8b5613SRebecca Cran done 87db8b5613SRebecca Cran fi 88db8b5613SRebecca Cran 89db8b5613SRebecca Cran if [ -z "$ESPS" ]; then 90db8b5613SRebecca Cran # The installer hasn't given us any ESPs to use. 91db8b5613SRebecca Cran # Try and figure out which to use by looking for an 92db8b5613SRebecca Cran # unformatted efi partition 935fa62a93SRebecca Cran 945fa62a93SRebecca Cran for geom in $(gpart status -sg | awk '{print $1}'); do 955fa62a93SRebecca Cran hasfreebsd=$(gpart show "${geom}" | cut -w -f 4,5 | grep "freebsd") 96db8b5613SRebecca Cran if [ -n "$hasfreebsd" ]; then 975fa62a93SRebecca Cran index=$(gpart show "${geom}" | cut -w -f 4,5 | grep "efi" | cut -w -f 1) 98db8b5613SRebecca Cran # Check that $index is a valid integer 99db8b5613SRebecca Cran [ -n "$index" ] && [ "$index" -eq "$index" ] && [ "$index" -ge 0 ] 2> /dev/null 100db8b5613SRebecca Cran if [ $? -ne 0 ]; then 101db8b5613SRebecca Cran continue 102db8b5613SRebecca Cran fi 103db8b5613SRebecca Cran 104a107ddbbSRebecca Cran mntpt=$(mktemp -d $TMPDIR/stand-test.XXXXXX) 1055fa62a93SRebecca Cran if [ -e "/dev/${geom}p${index}" ]; then 1065fa62a93SRebecca Cran dev=${geom}p${index} 1075fa62a93SRebecca Cran elif [ -e "/dev/${geom}s${index}" ]; then 1085fa62a93SRebecca Cran dev=/${geom}s${index} 109db8b5613SRebecca Cran else 110db8b5613SRebecca Cran continue 111db8b5613SRebecca Cran fi 112db8b5613SRebecca Cran 113db8b5613SRebecca Cran # Try and mount it. If it fails, assume it's 114db8b5613SRebecca Cran # unformatted and should be used. 1155fa62a93SRebecca Cran mount -t msdosfs -o ro "/dev/${dev}" "${mntpt}" 116db8b5613SRebecca Cran if [ $? -ne 0 ]; then 117db8b5613SRebecca Cran ESPS="$ESPS ${dev}" 118db8b5613SRebecca Cran num_esps=$((num_esps + 1)) 119db8b5613SRebecca Cran else 120db8b5613SRebecca Cran umount "${mntpt}" 121db8b5613SRebecca Cran fi 122db8b5613SRebecca Cran rmdir "${mntpt}" 123db8b5613SRebecca Cran fi 124db8b5613SRebecca Cran done 125db8b5613SRebecca Cran fi 126db8b5613SRebecca Cran 127c6d56081SWarner Losh case $(uname -m) in 128c6d56081SWarner Losh arm64) ARCHBOOTNAME=aa64 ;; 129c6d56081SWarner Losh amd64) ARCHBOOTNAME=x64 ;; 130*7b08a307SMitchell Horne riscv) ARCHBOOTNAME=riscv64 ;; 131c6d56081SWarner Losh # arm) ARCHBOOTNAME=arm ;; # No other support for arm install 132c6d56081SWarner Losh # i386) ARCHBOOTNAME=ia32 ;; # no support for this in i386 kernels, rare machines 133c6d56081SWarner Losh *) die "Unsupported arch $(uname -m) for UEFI install" 134c6d56081SWarner Losh esac 135676b7d07SMitchell Horne BOOTDIR="/efi/boot" 136676b7d07SMitchell Horne BOOTNAME="${BOOTDIR}/boot${ARCHBOOTNAME}.efi" 137676b7d07SMitchell Horne FREEBSD_BOOTDIR="/efi/freebsd" 138676b7d07SMitchell Horne FREEBSD_BOOTNAME="${FREEBSD_BOOTDIR}/loader.efi" 139c6d56081SWarner Losh 140db8b5613SRebecca Cran for esp in $ESPS; do 141a89559c2SYuri Pankov f_dprintf "Formatting /dev/${esp} as FAT32" 142db8b5613SRebecca Cran newfs_msdos -F 32 -c 1 -L EFISYS "/dev/$esp" > /dev/null 2>&1 143db8b5613SRebecca Cran if [ $? -ne 0 ]; then 144db8b5613SRebecca Cran die "Failed to format ESP $esp as FAT32" 145db8b5613SRebecca Cran fi 146db8b5613SRebecca Cran 147a107ddbbSRebecca Cran mntpt=$(mktemp -d $TMPDIR/stand-test.XXXXXX) 148a89559c2SYuri Pankov f_dprintf "Mounting ESP /dev/${esp}" 149db8b5613SRebecca Cran mount -t msdosfs "/dev/${esp}" "${mntpt}" 150db8b5613SRebecca Cran if [ $? -ne 0 ]; then 151db8b5613SRebecca Cran die "Failed to mount ESP ${dev} on ${mntpt}" 152db8b5613SRebecca Cran fi 153db8b5613SRebecca Cran 154a89559c2SYuri Pankov f_dprintf "Installing loader.efi onto ESP" 155676b7d07SMitchell Horne mkdir -p "${mntpt}/${FREEBSD_BOOTDIR}" "${mntpt}/${BOOTDIR}" 156676b7d07SMitchell Horne cp "$BSDINSTALL_CHROOT/boot/loader.efi" "${mntpt}/${FREEBSD_BOOTNAME}" 157db8b5613SRebecca Cran 158c6d56081SWarner Losh # 159c6d56081SWarner Losh # The following shouldn't be necessary. UEFI defines a way to 160c6d56081SWarner Losh # specifically select what to boot (which we do via 161c6d56081SWarner Losh # efibootmgr). However, virtual environments often times lack 162c6d56081SWarner Losh # support for the NV variables efibootmgr sets. In addition, 163c6d56081SWarner Losh # some UEFI implementations have features that interfere with 164c6d56081SWarner Losh # the setting of these variables. To combat that, we install the 165c6d56081SWarner Losh # default removable media boot file as a fallback if it doesn't 166c6d56081SWarner Losh # exist. We don't install it all the time since that can 167c6d56081SWarner Losh # interfere with other installations on the drive (like rEFInd). 168c6d56081SWarner Losh # 169c6d56081SWarner Losh if [ ! -f "${mntpt}/${BOOTNAME}" ]; then 170c6d56081SWarner Losh cp "$BSDINSTALL_CHROOT/boot/loader.efi" "${mntpt}/${BOOTNAME}" 171c6d56081SWarner Losh fi 172c6d56081SWarner Losh 173db8b5613SRebecca Cran if [ "$num_esps" -gt 1 ]; then 174db8b5613SRebecca Cran bootlabel="FreeBSD (${esp})" 175db8b5613SRebecca Cran else 176db8b5613SRebecca Cran bootlabel="FreeBSD" 177db8b5613SRebecca Cran fi 178db8b5613SRebecca Cran 179a89559c2SYuri Pankov f_dprintf "Creating UEFI boot entry" 180676b7d07SMitchell Horne efibootmgr --create --activate --label "$bootlabel" --loader "${mntpt}/${FREEBSD_BOOTNAME}" > /dev/null 181db8b5613SRebecca Cran 182a89559c2SYuri Pankov f_dprintf "Unmounting ESP" 183db8b5613SRebecca Cran umount "${mntpt}" 184db8b5613SRebecca Cran rmdir "${mntpt}" 185db8b5613SRebecca Cran 186a89559c2SYuri Pankov f_dprintf "Finished configuring /dev/${esp} as ESP" 187db8b5613SRebecca Cran done 188db8b5613SRebecca Cranfi 189db8b5613SRebecca Cran 190db8b5613SRebecca Cran# Add boot0cfg for MBR BIOS booting? 191