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 33*a107ddbbSRebecca Cran: ${TMPDIR:="/tmp"} 34*a107ddbbSRebecca 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 54db8b5613SRebecca Cranif [ "$(uname -m)" = "arm64" ] || [ "$X86_BOOTMETHOD" = "UEFI" ]; then 55*a107ddbbSRebecca Cran UFSBOOT_ESPS=$(cat $TMPDIR/bsdinstall-esps 2>/dev/null) 56*a107ddbbSRebecca 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 104*a107ddbbSRebecca 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 127db8b5613SRebecca Cran for esp in $ESPS; do 128a89559c2SYuri Pankov f_dprintf "Formatting /dev/${esp} as FAT32" 129db8b5613SRebecca Cran newfs_msdos -F 32 -c 1 -L EFISYS "/dev/$esp" > /dev/null 2>&1 130db8b5613SRebecca Cran if [ $? -ne 0 ]; then 131db8b5613SRebecca Cran die "Failed to format ESP $esp as FAT32" 132db8b5613SRebecca Cran fi 133db8b5613SRebecca Cran 134*a107ddbbSRebecca Cran mntpt=$(mktemp -d $TMPDIR/stand-test.XXXXXX) 135a89559c2SYuri Pankov f_dprintf "Mounting ESP /dev/${esp}" 136db8b5613SRebecca Cran mount -t msdosfs "/dev/${esp}" "${mntpt}" 137db8b5613SRebecca Cran if [ $? -ne 0 ]; then 138db8b5613SRebecca Cran die "Failed to mount ESP ${dev} on ${mntpt}" 139db8b5613SRebecca Cran fi 140db8b5613SRebecca Cran 141a89559c2SYuri Pankov f_dprintf "Installing loader.efi onto ESP" 142db8b5613SRebecca Cran mkdir -p "$mntpt/EFI/freebsd" 143db8b5613SRebecca Cran cp "$BSDINSTALL_CHROOT/boot/loader.efi" "${mntpt}/EFI/freebsd/loader.efi" 144db8b5613SRebecca Cran 145db8b5613SRebecca Cran if [ "$num_esps" -gt 1 ]; then 146db8b5613SRebecca Cran bootlabel="FreeBSD (${esp})" 147db8b5613SRebecca Cran else 148db8b5613SRebecca Cran bootlabel="FreeBSD" 149db8b5613SRebecca Cran fi 150db8b5613SRebecca Cran 151a89559c2SYuri Pankov f_dprintf "Creating UEFI boot entry" 1527e02f8b3SRebecca Cran efibootmgr --create --activate --label "$bootlabel" --loader "${mntpt}/EFI/freebsd/loader.efi" > /dev/null 153db8b5613SRebecca Cran 154a89559c2SYuri Pankov f_dprintf "Unmounting ESP" 155db8b5613SRebecca Cran umount "${mntpt}" 156db8b5613SRebecca Cran rmdir "${mntpt}" 157db8b5613SRebecca Cran 158a89559c2SYuri Pankov f_dprintf "Finished configuring /dev/${esp} as ESP" 159db8b5613SRebecca Cran done 160db8b5613SRebecca Cranfi 161db8b5613SRebecca Cran 162db8b5613SRebecca Cran# Add boot0cfg for MBR BIOS booting? 163