From owner-svn-src-all@freebsd.org Fri Oct 9 00:16:27 2020 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 5430B435006; Fri, 9 Oct 2020 00:16:27 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C6pXC1cKVz4dxb; Fri, 9 Oct 2020 00:16:27 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 00E3110EC1; Fri, 9 Oct 2020 00:16:27 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0990GQDj080875; Fri, 9 Oct 2020 00:16:26 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0990GQq2080874; Fri, 9 Oct 2020 00:16:26 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010090016.0990GQq2080874@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Fri, 9 Oct 2020 00:16:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366554 - head/usr.sbin/bsdinstall/scripts X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: head/usr.sbin/bsdinstall/scripts X-SVN-Commit-Revision: 366554 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 09 Oct 2020 00:16:27 -0000 Author: imp Date: Fri Oct 9 00:16:26 2020 New Revision: 366554 URL: https://svnweb.freebsd.org/changeset/base/366554 Log: Initial support for implementing the bootXXX.efi workaround Too many version of UEFI firmware (so far only confirmed on amd64) don't really support efibootmgr selection of boot. That's the most reliable, when it works, since there's no guesswork. However, many do not save, unmolested, the variables that efibootmgr sets, so as a fallback we also install loader.efi as bootXXX.efi (where XXX is either aa64 or x64) if it doesn't already exist in /efi/boot on the ESP. The standard only defines this for removable devices, but it's almost ubiquitously used as a fallback. Many BIOSes implement a drive selection feature that takes over the efibootmgr protocol, rendinering it useless (either generally, or for those vendors not on the short list). bootxxx.efi works around this. However, we don't install it unconditionally there, as that breaks some popular multi-boot setups. MFC After: 1 week Differential Revision: https://reviews.freebsd.org/D26428 Modified: head/usr.sbin/bsdinstall/scripts/bootconfig Modified: head/usr.sbin/bsdinstall/scripts/bootconfig ============================================================================== --- head/usr.sbin/bsdinstall/scripts/bootconfig Thu Oct 8 23:59:58 2020 (r366553) +++ head/usr.sbin/bsdinstall/scripts/bootconfig Fri Oct 9 00:16:26 2020 (r366554) @@ -124,6 +124,15 @@ if [ "$(uname -m)" = "arm64" ] || [ "$X86_BOOTMETHOD" done fi + case $(uname -m) in + arm64) ARCHBOOTNAME=aa64 ;; + amd64) ARCHBOOTNAME=x64 ;; + # arm) ARCHBOOTNAME=arm ;; # No other support for arm install + # i386) ARCHBOOTNAME=ia32 ;; # no support for this in i386 kernels, rare machines + *) die "Unsupported arch $(uname -m) for UEFI install" + esac + BOOTNAME="/EFI/BOOT/BOOT${ARCHBOOTNAME}.EFI" + for esp in $ESPS; do f_dprintf "Formatting /dev/${esp} as FAT32" newfs_msdos -F 32 -c 1 -L EFISYS "/dev/$esp" > /dev/null 2>&1 @@ -141,6 +150,21 @@ if [ "$(uname -m)" = "arm64" ] || [ "$X86_BOOTMETHOD" f_dprintf "Installing loader.efi onto ESP" mkdir -p "$mntpt/EFI/freebsd" cp "$BSDINSTALL_CHROOT/boot/loader.efi" "${mntpt}/EFI/freebsd/loader.efi" + + # + # The following shouldn't be necessary. UEFI defines a way to + # specifically select what to boot (which we do via + # efibootmgr). However, virtual environments often times lack + # support for the NV variables efibootmgr sets. In addition, + # some UEFI implementations have features that interfere with + # the setting of these variables. To combat that, we install the + # default removable media boot file as a fallback if it doesn't + # exist. We don't install it all the time since that can + # interfere with other installations on the drive (like rEFInd). + # + if [ ! -f "${mntpt}/${BOOTNAME}" ]; then + cp "$BSDINSTALL_CHROOT/boot/loader.efi" "${mntpt}/${BOOTNAME}" + fi if [ "$num_esps" -gt 1 ]; then bootlabel="FreeBSD (${esp})"