18befcf7bSNathan Whitehorn#!/bin/sh 28befcf7bSNathan Whitehorn#- 3*db8b5613SRebecca 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 30*db8b5613SRebecca Crandie() { 31*db8b5613SRebecca Cran echo $* 32*db8b5613SRebecca Cran exit 1 33*db8b5613SRebecca Cran} 34*db8b5613SRebecca Cran 358befcf7bSNathan Whitehornif [ `uname -m` == powerpc ]; then 368befcf7bSNathan Whitehorn platform=`sysctl -n hw.platform` 378befcf7bSNathan Whitehorn if [ "$platform" == ps3 -o "$platform" == powernv ]; then 388befcf7bSNathan Whitehorn rootpart=$(awk '{ if($2 == "/") printf("%s:%s\n", $3, $1); }' $PATH_FSTAB) 398befcf7bSNathan Whitehorn mkdir -p $BSDINSTALL_CHROOT/boot/etc/ 40fdb600afSJustin Hibbits echo FreeBSD=\'/kernel/kernel kernelname=/boot/kernel/kernel vfs.root.mountfrom=${rootpart}\' > $BSDINSTALL_CHROOT/boot/etc/kboot.conf 418befcf7bSNathan Whitehorn fi 428befcf7bSNathan Whitehornfi 438befcf7bSNathan Whitehorn 44*db8b5613SRebecca Cran# Update the ESP (EFI System Partition) with the new bootloader 45*db8b5613SRebecca Cranif [ "$(uname -m)" = "amd64" ] || [ "$(uname -m)" = "i386" ]; then 46*db8b5613SRebecca Cran X86_BOOTMETHOD=$(sysctl -n machdep.bootmethod) 47*db8b5613SRebecca Cranfi 488befcf7bSNathan Whitehorn 49*db8b5613SRebecca Cranif [ "$(uname -m)" = "arm64" ] || [ "$X86_BOOTMETHOD" = "UEFI" ]; then 50*db8b5613SRebecca Cran UFSBOOT_ESPS=$(cat /tmp/bsdinstall-esps) 51*db8b5613SRebecca Cran num_esps=0 52*db8b5613SRebecca Cran 53*db8b5613SRebecca Cran if [ -n "$ZFSBOOT_DISKS" ]; then 54*db8b5613SRebecca Cran # We're in a ZFS install environment 55*db8b5613SRebecca Cran for disk in $ZFSBOOT_DISKS; do 56*db8b5613SRebecca Cran index=$(gpart show "$disk" | cut -w -f 4,5 | grep "efi" | cut -w -f 1) 57*db8b5613SRebecca Cran # Check that $index is an integer 58*db8b5613SRebecca Cran [ -n "$index" ] && [ "$index" -eq "$index" ] && [ "$index" -ge 0 ] 2> /dev/null 59*db8b5613SRebecca Cran if [ $? -ne 0 ]; then 60*db8b5613SRebecca Cran continue 61*db8b5613SRebecca Cran fi 62*db8b5613SRebecca Cran 63*db8b5613SRebecca Cran if [ -e "/dev/${disk}p${index}" ]; then 64*db8b5613SRebecca Cran ESPS="$ESPS ${disk}p${index}" 65*db8b5613SRebecca Cran elif [ -e "/dev/${disk}s${index}" ]; then 66*db8b5613SRebecca Cran ESPS="$ESPS ${disk}s${index}" 67*db8b5613SRebecca Cran else 68*db8b5613SRebecca Cran continue 69*db8b5613SRebecca Cran fi 70*db8b5613SRebecca Cran 71*db8b5613SRebecca Cran num_esps=$((num_esps + 1)) 72*db8b5613SRebecca Cran done 73*db8b5613SRebecca Cran fi 74*db8b5613SRebecca Cran 75*db8b5613SRebecca Cran if [ -n "$UFSBOOT_ESPS" ]; then 76*db8b5613SRebecca Cran # We're in a UFS install environment 77*db8b5613SRebecca Cran for partition in $UFSBOOT_ESPS; do 78*db8b5613SRebecca Cran ESPS="$ESPS $partition" 79*db8b5613SRebecca Cran num_esps=$((num_esps + 1)) 80*db8b5613SRebecca Cran done 81*db8b5613SRebecca Cran fi 82*db8b5613SRebecca Cran 83*db8b5613SRebecca Cran if [ -z "$ESPS" ]; then 84*db8b5613SRebecca Cran # The installer hasn't given us any ESPs to use. 85*db8b5613SRebecca Cran # Try and figure out which to use by looking for an 86*db8b5613SRebecca Cran # unformatted efi partition 87*db8b5613SRebecca Cran for disk in $(sysctl -n kern.disks); do 88*db8b5613SRebecca Cran hasfreebsd=$(gpart show "$disk" | cut -w -f 4,5 | grep "freebsd") 89*db8b5613SRebecca Cran if [ -n "$hasfreebsd" ]; then 90*db8b5613SRebecca Cran index=$(gpart show "$disk" | cut -w -f 4,5 | grep "efi" | cut -w -f 1) 91*db8b5613SRebecca Cran # Check that $index is a valid integer 92*db8b5613SRebecca Cran [ -n "$index" ] && [ "$index" -eq "$index" ] && [ "$index" -ge 0 ] 2> /dev/null 93*db8b5613SRebecca Cran if [ $? -ne 0 ]; then 94*db8b5613SRebecca Cran continue 95*db8b5613SRebecca Cran fi 96*db8b5613SRebecca Cran 97*db8b5613SRebecca Cran mntpt=$(mktemp -d /tmp/stand-test.XXXXXX) 98*db8b5613SRebecca Cran if [ -e "/dev/${disk}p${index}" ]; then 99*db8b5613SRebecca Cran dev=${disk}p${index} 100*db8b5613SRebecca Cran elif [ -e "/dev/${disk}s${index}" ]; then 101*db8b5613SRebecca Cran dev=/${disk}s${index} 102*db8b5613SRebecca Cran else 103*db8b5613SRebecca Cran continue 104*db8b5613SRebecca Cran fi 105*db8b5613SRebecca Cran 106*db8b5613SRebecca Cran # Try and mount it. If it fails, assume it's 107*db8b5613SRebecca Cran # unformatted and should be used. 108*db8b5613SRebecca Cran mount -t msdosfs "/dev/${dev}" "${mntpt}" 109*db8b5613SRebecca Cran if [ $? -ne 0 ]; then 110*db8b5613SRebecca Cran ESPS="$ESPS ${dev}" 111*db8b5613SRebecca Cran num_esps=$((num_esps + 1)) 112*db8b5613SRebecca Cran else 113*db8b5613SRebecca Cran umount "${mntpt}" 114*db8b5613SRebecca Cran fi 115*db8b5613SRebecca Cran rmdir "${mntpt}" 116*db8b5613SRebecca Cran fi 117*db8b5613SRebecca Cran done 118*db8b5613SRebecca Cran fi 119*db8b5613SRebecca Cran 120*db8b5613SRebecca Cran for esp in $ESPS; do 121*db8b5613SRebecca Cran newfs_msdos -F 32 -c 1 -L EFISYS "/dev/$esp" > /dev/null 2>&1 122*db8b5613SRebecca Cran if [ $? -ne 0 ]; then 123*db8b5613SRebecca Cran die "Failed to format ESP $esp as FAT32" 124*db8b5613SRebecca Cran fi 125*db8b5613SRebecca Cran 126*db8b5613SRebecca Cran mntpt=$(mktemp -d /tmp/stand-test.XXXXXX) 127*db8b5613SRebecca Cran mount -t msdosfs "/dev/${esp}" "${mntpt}" 128*db8b5613SRebecca Cran if [ $? -ne 0 ]; then 129*db8b5613SRebecca Cran die "Failed to mount ESP ${dev} on ${mntpt}" 130*db8b5613SRebecca Cran fi 131*db8b5613SRebecca Cran 132*db8b5613SRebecca Cran mkdir -p "$mntpt/EFI/freebsd" 133*db8b5613SRebecca Cran cp "$BSDINSTALL_CHROOT/boot/loader.efi" "${mntpt}/EFI/freebsd/loader.efi" 134*db8b5613SRebecca Cran 135*db8b5613SRebecca Cran if [ "$num_esps" -gt 1 ]; then 136*db8b5613SRebecca Cran bootlabel="FreeBSD (${esp})" 137*db8b5613SRebecca Cran else 138*db8b5613SRebecca Cran bootlabel="FreeBSD" 139*db8b5613SRebecca Cran fi 140*db8b5613SRebecca Cran 141*db8b5613SRebecca Cran efibootmgr --create --label "$bootlabel" --loader "${mntpt}/EFI/freebsd/loader.efi" > /dev/null 142*db8b5613SRebecca Cran 143*db8b5613SRebecca Cran umount "${mntpt}" 144*db8b5613SRebecca Cran rmdir "${mntpt}" 145*db8b5613SRebecca Cran 146*db8b5613SRebecca Cran # When creating new entries, efibootmgr doesn't mark them active, so we need to 147*db8b5613SRebecca Cran # do so. It doesn't make it easy to find which entry it just added, so rely on 148*db8b5613SRebecca Cran # the fact that it places the new entry first in BootOrder. 149*db8b5613SRebecca Cran bootorder=$(efivar --name 8be4df61-93ca-11d2-aa0d-00e098032b8c-BootOrder --print --no-name --hex | head -1) 150*db8b5613SRebecca Cran bootentry=$(echo "$bootorder" | cut -w -f 3)$(echo "$bootorder" | cut -w -f 2) 151*db8b5613SRebecca Cran efibootmgr --activate "$bootentry" > /dev/null 152*db8b5613SRebecca Cran done 153*db8b5613SRebecca Cranfi 154*db8b5613SRebecca Cran 155*db8b5613SRebecca Cran# Add boot0cfg for MBR BIOS booting? 156