Add UEFI support to vmrun.sh

Adds:
 -E: Use UEFI mode
 -f: path to UEFI firmware image (default: path to uefi-edk2-bhyve package)
 -F: UEFI framebuffer size (default: w=1024,h=768)
 -L: IP to listen for VNC connections on (default: 127.0.0.1)
 -P: Port to listen for VNC connections on (default: 5900)
 -T: Enable tablnet device (for VNC)
 -v: Wait for VNC client before booting VM

Submitted by:	Shawn Webb <shawn.webb@hardenedbsd.org>
MFC after:	2 weeks
Relnotes:	yes
Differential Revision:	https://reviews.freebsd.org/D10378
This commit is contained in:
Allan Jude 2017-04-13 00:07:39 +00:00
parent 0649fcaea5
commit 5bce363c41
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=316746

View File

@ -46,10 +46,12 @@ errmsg() {
usage() {
local msg=$1
echo "Usage: vmrun.sh [-ahi] [-c <CPUs>] [-C <console>] [-d <disk file>]"
echo " [-e <name=value>] [-g <gdbport> ] [-H <directory>]"
echo "Usage: vmrun.sh [-aEhiTv] [-c <CPUs>] [-C <console>] [-d <disk file>]"
echo " [-e <name=value>] [-f <path of firmware>] [-F <size>]"
echo " [-g <gdbport> ] [-H <directory>]"
echo " [-I <location of installation iso>] [-l <loader>]"
echo " [-m <memsize>] [-t <tapdev>] <vmname>"
echo " [-L <VNC IP for UEFI framebuffer>]"
echo " [-m <memsize>] [-P <port>] [-t <tapdev>] <vmname>"
echo ""
echo " -h: display this help message"
echo " -a: force memory mapped local APIC access"
@ -57,15 +59,22 @@ usage() {
echo " -C: console device (default is ${DEFAULT_CONSOLE})"
echo " -d: virtio diskdev file (default is ${DEFAULT_VIRTIO_DISK})"
echo " -e: set FreeBSD loader environment variable"
echo " -E: Use UEFI mode"
echo " -f: Use a specific UEFI firmware"
echo " -F: Use a custom UEFI GOP framebuffer size (default: w=1024,h=768)"
echo " -g: listen for connection from kgdb at <gdbport>"
echo " -H: host filesystem to export to the loader"
echo " -i: force boot of the Installation CDROM image"
echo " -I: Installation CDROM image location (default is ${DEFAULT_ISOFILE})"
echo " -l: the OS loader to use (default is /boot/userboot.so)"
echo " -L: IP address for UEFI GOP VNC server (default: 127.0.0.1)"
echo " -m: memory size (default is ${DEFAULT_MEMSIZE})"
echo " -p: pass-through a host PCI device at bus/slot/func (e.g. 10/0/0)"
echo " -P: UEFI GOP VNC port (default: 5900)"
echo " -t: tap device for virtio-net (default is $DEFAULT_TAPDEV)"
echo " -T: Enable tablet device (for UEFI GOP)"
echo " -u: RTC keeps UTC time"
echo " -v: Wait for VNC client connection before booting VM"
echo " -w: ignore unimplemented MSRs"
echo ""
[ -n "$msg" ] && errmsg "$msg"
@ -95,7 +104,16 @@ loader_opt=""
bhyverun_opt="-H -A -P"
pass_total=0
while getopts ac:C:d:e:g:hH:iI:l:m:p:t:uw c ; do
# EFI-specific options
efi_mode=0
efi_firmware="/usr/local/share/uefi-firmware/BHYVE_UEFI.fd"
vncwait=""
vnchost="127.0.0.1"
vncport=5900
fbsize="w=1024,h=768"
tablet=""
while getopts ac:C:d:e:Ef:F:g:hH:iI:l:m:p:P:t:Tuvw c ; do
case $c in
a)
bhyverun_opt="${bhyverun_opt} -a"
@ -116,6 +134,15 @@ while getopts ac:C:d:e:g:hH:iI:l:m:p:t:uw c ; do
e)
loader_opt="${loader_opt} -e ${OPTARG}"
;;
E)
efi_mode=1
;;
f)
efi_firmware="${OPTARG}"
;;
F)
fbsize="${OPTARG}"
;;
g)
gdbport=${OPTARG}
;;
@ -131,6 +158,9 @@ while getopts ac:C:d:e:g:hH:iI:l:m:p:t:uw c ; do
l)
loader_opt="${loader_opt} -l ${OPTARG}"
;;
L)
vnchost="${OPTARG}"
;;
m)
memsize=${OPTARG}
;;
@ -138,13 +168,22 @@ while getopts ac:C:d:e:g:hH:iI:l:m:p:t:uw c ; do
eval "pass_dev${pass_total}=\"${OPTARG}\""
pass_total=$(($pass_total + 1))
;;
P)
vncport="${OPTARG}"
;;
t)
eval "tap_dev${tap_total}=\"${OPTARG}\""
tap_total=$(($tap_total + 1))
;;
T)
tablet="-s 30,xhci,tablet"
;;
u)
bhyverun_opt="${bhyverun_opt} -u"
;;
v)
vncwait=",wait"
;;
w)
bhyverun_opt="${bhyverun_opt} -w"
;;
@ -181,6 +220,13 @@ if [ ${pass_total} -gt 0 ]; then
bhyverun_opt="${bhyverun_opt} -S"
fi
if [ ${efi_mode} -gt 0 ]; then
if [ ! -f ${efi_firmware} ]; then
echo "Error: EFI Firmware ${efi_firmware} doesn't exist. Try: pkg install uefi-edk2-bhyve"
exit 1
fi
fi
make_and_check_diskdev()
{
local virtio_diskdev="$1"
@ -243,11 +289,13 @@ while [ 1 ]; do
installer_opt=""
fi
${LOADER} -c ${console} -m ${memsize} ${BOOTDISKS} ${loader_opt} \
${vmname}
bhyve_exit=$?
if [ $bhyve_exit -ne 0 ]; then
break
if [ ${efi_mode} -eq 0 ]; then
${LOADER} -c ${console} -m ${memsize} ${BOOTDISKS} ${loader_opt} \
${vmname}
bhyve_exit=$?
if [ $bhyve_exit -ne 0 ]; then
break
fi
fi
#
@ -281,10 +329,18 @@ while [ 1 ]; do
i=$(($i + 1))
done
efiargs=""
if [ ${efi_mode} -gt 0 ]; then
efiargs="-s 29,fbuf,tcp=${vnchost}:${vncport},${fbsize}${vncwait}"
efiargs="${efiargs} -l bootrom,${efi_firmware}"
efiargs="${efiargs} ${tablet}"
fi
${FBSDRUN} -c ${cpus} -m ${memsize} ${bhyverun_opt} \
-g ${gdbport} \
-s 0:0,hostbridge \
-s 1:0,lpc \
${efiargs} \
${devargs} \
-l com1,${console} \
${installer_opt} \