Skip to content

Commit b314b28

Browse files
author
olevole
committed
better LPC device management
moved the LPC devices to a separate table: lpc Now we can manage bootrom, TPM and Serial port more gracefully via * command line: bcreate ... com1=serial com2=stdio .. * config files ( e.g. global ~cbsd/etc/bhyve-default-default.conf ) * your own TUI configurator: cbsd blpc-tui To print current LPC: cbsd blpc --help TODO: support for tcp server in FreeBSD 15.0-CURRENT/HEAD !!:s^^ FYI @kraileth
1 parent dec0638 commit b314b28

File tree

10 files changed

+200
-133
lines changed

10 files changed

+200
-133
lines changed

bhyvectl/bconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ if [ -z "${cmd}" ]; then
6565
bhyve_vnc_resolution bhyve_vnc_tcp_bind bhyve_vnc_vgaconf bhyve_wire_memory bhyve_x2apic_mode cd_boot_firmware cd_vnc_wait cpuset \
6666
debug_engine hidden ip4_addr on_crash on_poweroff on_reboot protected vm_boot vm_cpu_topology vm_cpus vm_efi vm_hostbridge \
6767
vm_iso_path vm_ram vm_vnc_port vnc_password xhci tablet fbuf double_acpi virtio_rnd uuid hdd_boot_firmware bhyverun_wrapper \
68-
boot_delay bhyve_cmd efi_firmware bhyve_vnc_kbdlayout tpm"
68+
boot_delay bhyve_cmd bhyve_vnc_kbdlayout tpm"
6969

7070
# jailed for FreeBSD 12.0+
7171
[ ${freebsdhostversion} -gt 1200086 ] && myargs="${myargs} jailed"

bhyvectl/bconstruct-tui

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,6 @@ esac
372372
[ -z "${imgtype}" ] && imgtype="zvol"
373373
[ -z "${uuid}" ] && uuid="0"
374374
[ -z "${bhyve_vnc_kbdlayout}" ] && bhyve_vnc_kbdlayout="${default_bhyve_vnc_kbdlayout}"
375-
[ -z "${tpm}" ] && tpm="${default_tpm}"
376375

377376
baserw=1
378377
ip4_addr="DHCP"

bhyvectl/blpc-tui

Lines changed: 36 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
#!/usr/local/bin/cbsd
22
#v14.2.5
3-
MYARG=""
4-
MYOPTARG="jname"
3+
MYARG="jname"
4+
MYOPTARG=""
55
CBSDMODULE="bhyve"
6-
MYDESC="Ncurses based bhyve lpc configurator"
6+
MYDESC="Ncurses based bhyve LPC configurator"
77
EXTHELP="wf_jorder"
88

99
. ${subrdir}/nc.subr
@@ -16,60 +16,14 @@ EXTHELP="wf_jorder"
1616
. ${subrdir}/settings-tui-bhyve.subr
1717
. ${dialog}
1818

19-
load_table()
20-
{
21-
local jnum=0
22-
local sqldelimer=" "
23-
24-
eval $( cbsdsqlro local 'SELECT jname,b_order FROM jails WHERE status<2 AND emulator="bhyve" ORDER BY CAST(b_order AS int) ASC' |while read jname b_order; do
25-
echo "export jails_${jnum}_jname=\"${jname}\""
26-
echo "export jails_${jnum}_order=\"${b_order}\""
27-
jnum=$(( jnum + 1 ))
28-
done )
29-
}
30-
31-
32-
# $1 - jname
33-
# $2 - new order
34-
update_order()
35-
{
36-
[ -z "${1}" ] && return 1
37-
[ -z "${2}" ] && return 1
38-
39-
local jname="${1}"
40-
local order="${2}"
41-
42-
cbsdsqlrw local "UPDATE jails SET b_order='${order}' WHERE jname='${jname}' AND emulator='bhyve'"
43-
}
44-
45-
46-
# $1 - jname
47-
# $2 - index
48-
get_new_value()
49-
{
50-
local _input
51-
[ -z "${1}" ] && return 1
52-
local jname="${1}"
53-
54-
f_dialog_title " order "
55-
56-
f_dialog_input _input "Enter weight. Lower weight = higher priority, first boot: 0" "${index}" \
57-
"${_message}" || return $?
58-
59-
update_order ${jname} ${_input}
60-
}
61-
62-
6319
dialog_menu_main()
6420
{
6521
local title=" ${product} v${myversion} "
6622
local btitle="$DIALOG_BACKTITLE"
67-
local prompt="Use menu for select bhyve domain"
23+
local prompt="Use menu to configure LPC device for ${jname}"
6824
local defaultitem=
6925
local hline=
70-
local i jnum order
71-
72-
load_table
26+
local i= jnum=
7327

7428
local menu_list=" \
7529
'EXIT' '' \
@@ -93,67 +47,33 @@ dialog_menu_main()
9347

9448
IFS="${OIFS}"
9549

96-
echo "NUM: ${lpc_num}"
50+
# echo "NUM: ${lpc_num}"
51+
52+
item_num="0"
53+
local menu_list=""
9754

9855
for i in $( ${SEQ_CMD} 0 ${lpc_num} ); do
9956
eval name="\$lpc_${i}_name"
100-
echo "> ${name}"
57+
eval value="\$lpc_${i}_value"
58+
eval desc="\$lpc_${i}_desc"
59+
menu_list="${menu_list} '${item_num} ${name}' '${value}' '${desc}'"
60+
inc_menu_index item_num
10161
done
102-
exit 0
10362

104-
while [ -n "${jname}" ]; do
105-
eval order="\$jails_${jnum}_order"
106-
menu_list="$menu_list '${order} ${jname}' ''"
63+
menu_list="${menu_list} '-' '-' ''"
64+
menu_list="${menu_list} 'EXIT' 'EXIT' 'Exit from TUI'"
10765

108-
# if jname/selected passed, set's selector to this item
109-
if [ "${selected}" = "${jname}" ]; then
110-
defaultitem="${order} ${jname}"
111-
f_dialog_default_store "${defaultitem}"
112-
fi
66+
[ -n "${menu_choice}" ] && defaultitem="${menu_choice}"
11367

114-
jnum=$(( jnum + 1 ))
115-
unset jname order
116-
eval jname="\$jails_${jnum}_jname"
117-
eval order="\$jails_${jnum}_order"
118-
done
68+
#cbsd_menubox_with_help
69+
cbsd_menubox
70+
retval=$?
11971

120-
local height width rows
121-
eval f_dialog_menu_size height width rows \
122-
\"\$DIALOG_TITLE\" \
123-
\"\$DIALOG_BACKTITLE\" \
124-
\"\$prompt\" \
125-
\"\$hline\" \
126-
$menu_list
127-
128-
height=$(( height + 1 ))
129-
130-
# Obtain default-item from previously stored selection
131-
f_dialog_default_fetch defaultitem
132-
133-
local menu_choice
134-
menu_choice=$( eval $DIALOG \
135-
--title \"\$DIALOG_TITLE\" \
136-
--backtitle \"\$DIALOG_BACKTITLE\" \
137-
--hline \"\$hline\" \
138-
--ok-label \"\$msg_ok\" \
139-
--cancel-label \"\$msg_cancel\" \
140-
--default-item \"\$defaultitem\" \
141-
--menu \" \$prompt \" \
142-
$height $width $rows \
143-
$menu_list \
144-
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
145-
)
146-
147-
local retval=$?
14872
f_dialog_data_sanitize menu_choice
14973
f_dialog_menutag_store "$menu_choice"
74+
f_dialog_default_store "$menu_choice"
15075

151-
# Only update default-item on success
152-
if [ ${retval} -eq ${DIALOG_OK} ]; then
153-
selected=${menu_choice##* }
154-
fi
155-
156-
return $retval
76+
return ${retval}
15777
}
15878

15979

@@ -184,6 +104,21 @@ while [ 1 ]; do
184104
"-")
185105
continue
186106
;;
107+
bootrom)
108+
# bhyve form for $efi_firmware
109+
bootrom=$( cbsdsqlro ${jailsysdir}/${jname}/local.sqlite "SELECT lpcslot_value FROM lpc WHERE lpcslot_name='bootrom'" )
110+
obootrom="${bootrom}"
111+
get_construct_bootrom
112+
[ "${obootrom}" != "bootrom" ] && cbsdsqlrw ${jailsysdir}/${jname}/local.sqlite "UPDATE lpc SET lpcslot_value='${bootrom}' WHERE lpcslot_name='bootrom'"
113+
;;
114+
com*)
115+
eval cfg_name="\$mychoice"
116+
# bhyve form for $com
117+
com=$( cbsdsqlro ${jailsysdir}/${jname}/local.sqlite "SELECT lpcslot_value FROM lpc WHERE lpcslot_name='${cfg_name}'" )
118+
ocom="${orig_val}"
119+
get_construct_com "${cfg_name}"
120+
[ "${com}" != "${ocom}" ] && cbsdsqlrw ${jailsysdir}/${jname}/local.sqlite "UPDATE lpc SET lpcslot_value='${com}' WHERE lpcslot_name='${cfg_name}'"
121+
;;
187122
*)
188123
get_new_value ${mychoice} ${index}
189124
;;

bhyvectl/bsetup-tui

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ dialog_menu_main()
188188
menu_list="${menu_list} 'bhyve_controller' 'Controller config >>' 'cbsd bhyve-controller-tui'"
189189
menu_list="${menu_list} 'bhyvedsk' 'Storage config >>' 'cbsd bhyve-dsk-tui'"
190190
menu_list="${menu_list} 'bhyvenic' 'Network config >>' 'cbsd bhyve-nic-tui'"
191+
menu_list="${menu_list} 'LPC' 'LPC devices >>' 'cbsd blpc'"
191192

192193
# FreeBSD-13+ only
193194
if [ ${freebsdhostversion} -gt 1300033 ]; then
@@ -269,6 +270,9 @@ while [ 1 ]; do
269270
"bhyvenic")
270271
bhyve-nic-tui jname=${jname}
271272
;;
273+
"LPC")
274+
blpc-tui jname=${jname}
275+
;;
272276
"bhyvedsk")
273277
bhyve-dsk-tui jname=${jname}
274278
;;

etc/defaults/bhyve-default-default.conf

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,6 @@ default_bhyve_vnc_vgaconf="io"
111111
# '0' for disable (default)
112112
default_bhyve_vnc_kbdlayout="0"
113113

114-
# enable tpm?
115-
# /dev/tpm to pass
116-
# or
117-
# 'new' to emulate
118-
# '0' for disable
119-
default_tpm="0"
120-
121114
efi_firmware="/usr/local/cbsd/upgrade/patch/efi.fd"
122115
efi_firmware_csm="/usr/local/cbsd/upgrade/patch/efi_csm.fd"
123116

@@ -234,3 +227,18 @@ vm_arch="amd64"
234227
# max disk num: used in subr/virtual.subr -> get_next_free_dsk()
235228
max_dsk_count="48"
236229

230+
# LPT devices
231+
# enable tpm?
232+
# /dev/tpm to pass
233+
# or
234+
# 'new' to emulate
235+
# '0' for disable
236+
tpm=0
237+
# TTY-class devices, Serial
238+
# possible values: '0' (disable), 'stdio', 'serial' for nmdm and 'tcp' for TCP server
239+
com1="stdio"
240+
com2="0"
241+
com3="0"
242+
com4="0"
243+
# bootrom
244+
bootrom="${distdir}/upgrade/patch/efi.fd"

subr/bhyve.subr

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1240,6 +1240,8 @@ compile_lpc_args()
12401240
local _pcislot_function=
12411241
local _pcislot_pcislot=
12421242
local _pcislot_args=
1243+
local _sql= _res= _part= _items=
1244+
local _vnc_bind= _vnc_port=
12431245

12441246
# todo: backward order
12451247
_pcislot_bus="31" # 0 to 31
@@ -1258,7 +1260,77 @@ compile_lpc_args()
12581260
_pcislot_args="${_pcislot_args}:${i}"
12591261
done
12601262

1261-
lpc_args="-s ${_pcislot_args},lpc"
1263+
_sql="SELECT lpcslot_name,lpcslot_value FROM lpc WHERE lpcslot_value !='0'"
1264+
1265+
OIFS="${IFS}"
1266+
IFS="|"
1267+
sqldelimer="|"
1268+
1269+
_items=0
1270+
1271+
eval $( cbsdsqlro ${jailsysdir}/${jname}/local.sqlite ${_sql} | while read lpcslot_name lpcslot_value; do
1272+
IFS="${OIFS}"
1273+
echo "lpcslot_name${_items}=\"${lpcslot_name}\""
1274+
echo "lpcslot_value${_items}=\"${lpcslot_value}\""
1275+
echo "_items=${_items}"
1276+
_items=$(( _items + 1 ))
1277+
IFS="|"
1278+
done )
1279+
IFS="${OIFS}"
1280+
1281+
_res=
1282+
1283+
for i in $( ${SEQ_CMD} 0 ${_items} ); do
1284+
eval lpcslot_name="\$lpcslot_name${i}"
1285+
eval lpcslot_value="\$lpcslot_value${i}"
1286+
1287+
case "${lpcslot_name}" in
1288+
bootrom)
1289+
if [ -r ${jailsysdir}/${jname}/BHYVE_UEFI_VARS.fd ]; then
1290+
_part="-l ${lpcslot_name},${lpcslot_value},${jailsysdir}/${jname}/BHYVE_UEFI_VARS.fd,fwcfg=qemu"
1291+
else
1292+
_part="-l ${lpcslot_name},${lpcslot_value}"
1293+
fi
1294+
;;
1295+
com*)
1296+
case "${lpcslot_value}" in
1297+
serial)
1298+
if ! next_nmdm_id ; then
1299+
err 1 "${N1_COLOR}No such next_nmdm_id for VMs: ${N2_COLOR}${jname}${N0_COLOR}"
1300+
fi
1301+
_part="-l ${lpcslot_name},/dev/nmdm${nmdm_index}A"
1302+
if [ ${quiet} -ne 1 ]; then
1303+
[ -z "${_vnc_bind}" ] && _vnc_bind=$( ${HEAD_CMD} -1 ${jailsysdir}/${jname}/vnc_bind )
1304+
[ -z "${_vnc_port}" ] && _vnc_port=$( ${HEAD_CMD} -1 ${jailsysdir}/${jname}/vnc_port )
1305+
${ECHO} "${N1_COLOR}Serial console is enabled: ${N2_COLOR}/dev/nmdm${nmdm_index}B${N0_COLOR}"
1306+
if [ "${cd_vnc_wait}" = "1" ]; then
1307+
${ECHO} "${N1_COLOR}For attach Serial console, use: ${N2_COLOR}nc -z ${_vnc_bind} ${_vnc_port}; cu -l /dev/nmdm${nmdm_index}B${N1_COLOR} (to exit: ${N2_COLOR}~.${N1_COLOR})${N0_COLOR}"
1308+
else
1309+
${ECHO} "${N1_COLOR}For attach Serial console, use: ${N2_COLOR}cu -l /dev/nmdm${nmdm_index}B${N0_COLOR}"
1310+
fi
1311+
fi
1312+
;;
1313+
# tcp)
1314+
# # FreeBSD 15+
1315+
# _part="-l com1,tcp=127.0.0.1:1234"
1316+
# ;;
1317+
*)
1318+
_part="-l ${lpcslot_name},${lpcslot_value}"
1319+
;;
1320+
esac
1321+
;;
1322+
esac
1323+
if [ -n "${_res}" ]; then
1324+
_res="${_res} ${_part}"
1325+
else
1326+
_res="${_part}"
1327+
fi
1328+
done
1329+
1330+
1331+
# echo "MYLPC: [${_res}]" >> /tmp/lpc
1332+
1333+
lpc_args="-s ${_pcislot_args},lpc ${_res}"
12621334
store_bhyve_pci_slot -n lpc -a ${bhyve_pci_index}
12631335
}
12641336

@@ -1387,6 +1459,10 @@ compile_pci_passthru_args()
13871459
# export arguments for bhyve efi_args
13881460
compile_efi_args()
13891461
{
1462+
efi_args=
1463+
1464+
# obsolete
1465+
return 0
13901466
case "${vm_efi}" in
13911467
uefi)
13921468
[ ! -r "${efi_firmware}" ] && err 1 "${N1_COLOR}${CBSD_APP}: no such efi_firmware: ${N2_COLOR}${efi_firmware}${N0_COLOR}"
@@ -1413,6 +1489,9 @@ compile_console_args()
14131489
{
14141490
local com1=0 com2=0
14151491

1492+
# obsolete
1493+
return 0
1494+
14161495
# case "${vm_console}" in
14171496
# "nmdm")
14181497
#
@@ -1455,10 +1534,11 @@ compile_console_args()
14551534
return 0
14561535
}
14571536

1458-
# export arguments for bhyve virtio-rnd
1537+
# export arguments for bhyve virtiornd_args
14591538
compile_virtiornd_args()
14601539
{
14611540
local _pcislot_args=
1541+
virtiornd_args=
14621542

14631543
# this is feature of FreeBSD 10.1+
14641544
[ ${freebsdhostversion} -lt 1000730 ] && return 0

0 commit comments

Comments
 (0)