1*6eb072c2SAlexandru Elisei# The following parameters are enabled by default when running a test with 2*6eb072c2SAlexandru Elisei# kvmtool: 3*6eb072c2SAlexandru Elisei# --nodefaults: suppress VM configuration that cannot be disabled (like 4*6eb072c2SAlexandru Elisei# modifying the supplied kernel command line). Otherwise tests 5*6eb072c2SAlexandru Elisei# that use the command line will fail without this parameter. 6*6eb072c2SAlexandru Elisei# --network mode=none: do not create a network device. kvmtool tries to help the 7*6eb072c2SAlexandru Elisei# user by automatically create one, and then prints a warning 8*6eb072c2SAlexandru Elisei# when the VM terminates if the device hasn't been initialized. 9*6eb072c2SAlexandru Elisei# --loglevel=warning: reduce verbosity 10*6eb072c2SAlexandru Elisei: "${KVMTOOL_DEFAULT_OPTS:="--nodefaults --network mode=none --loglevel=warning"}" 11*6eb072c2SAlexandru Elisei 12db9c4e1cSAlexandru Elisei############################################################################## 13db9c4e1cSAlexandru Elisei# qemu_fixup_return_code translates the ambiguous exit status in Table1 to that 14db9c4e1cSAlexandru Elisei# in Table2. Table3 simply documents the complete status table. 15db9c4e1cSAlexandru Elisei# 16db9c4e1cSAlexandru Elisei# Table1: Before fixup 17db9c4e1cSAlexandru Elisei# -------------------- 18db9c4e1cSAlexandru Elisei# 0 - Unexpected exit from QEMU (possible signal), or the unittest did 19db9c4e1cSAlexandru Elisei# not use debug-exit 20db9c4e1cSAlexandru Elisei# 1 - most likely unittest succeeded, or QEMU failed 21db9c4e1cSAlexandru Elisei# 22db9c4e1cSAlexandru Elisei# Table2: After fixup 23db9c4e1cSAlexandru Elisei# ------------------- 24db9c4e1cSAlexandru Elisei# 0 - Everything succeeded 25db9c4e1cSAlexandru Elisei# 1 - most likely QEMU failed 26db9c4e1cSAlexandru Elisei# 27db9c4e1cSAlexandru Elisei# Table3: Complete table 28db9c4e1cSAlexandru Elisei# ---------------------- 29db9c4e1cSAlexandru Elisei# 0 - SUCCESS 30db9c4e1cSAlexandru Elisei# 1 - most likely QEMU failed 31db9c4e1cSAlexandru Elisei# 2 - most likely a run script failed 32db9c4e1cSAlexandru Elisei# 3 - most likely the unittest failed 33db9c4e1cSAlexandru Elisei# 124 - most likely the unittest timed out 34db9c4e1cSAlexandru Elisei# 127 - most likely the unittest called abort() 35db9c4e1cSAlexandru Elisei# 1..127 - FAILURE (could be QEMU, a run script, or the unittest) 36db9c4e1cSAlexandru Elisei# >= 128 - Signal (signum = status - 128) 37db9c4e1cSAlexandru Elisei############################################################################## 38db9c4e1cSAlexandru Eliseifunction qemu_fixup_return_code() 39db9c4e1cSAlexandru Elisei{ 40db9c4e1cSAlexandru Elisei local ret=$1 41db9c4e1cSAlexandru Elisei # Remove $ret from the list of arguments 42db9c4e1cSAlexandru Elisei shift 1 43db9c4e1cSAlexandru Elisei local errors=$* 44db9c4e1cSAlexandru Elisei local sig 45db9c4e1cSAlexandru Elisei 46db9c4e1cSAlexandru Elisei [ $ret -eq 134 ] && echo "QEMU Aborted" >&2 47db9c4e1cSAlexandru Elisei 48db9c4e1cSAlexandru Elisei if [ "$errors" ]; then 49db9c4e1cSAlexandru Elisei sig=$(grep 'terminating on signal' <<<"$errors") 50db9c4e1cSAlexandru Elisei if [ "$sig" ]; then 51db9c4e1cSAlexandru Elisei # This is too complex for ${var/search/replace} 52db9c4e1cSAlexandru Elisei # shellcheck disable=SC2001 53db9c4e1cSAlexandru Elisei sig=$(sed 's/.*terminating on signal \([0-9][0-9]*\).*/\1/' <<<"$sig") 54db9c4e1cSAlexandru Elisei fi 55db9c4e1cSAlexandru Elisei fi 56db9c4e1cSAlexandru Elisei 57db9c4e1cSAlexandru Elisei if [ $ret -eq 0 ]; then 58db9c4e1cSAlexandru Elisei # Some signals result in a zero return status, but the 59db9c4e1cSAlexandru Elisei # error log tells the truth. 60db9c4e1cSAlexandru Elisei if [ "$sig" ]; then 61db9c4e1cSAlexandru Elisei ((ret=sig+128)) 62db9c4e1cSAlexandru Elisei else 63db9c4e1cSAlexandru Elisei # Exiting with zero (non-debugexit) is an error 64db9c4e1cSAlexandru Elisei ret=1 65db9c4e1cSAlexandru Elisei fi 66db9c4e1cSAlexandru Elisei elif [ $ret -eq 1 ]; then 67db9c4e1cSAlexandru Elisei # Even when ret==1 (unittest success) if we also got stderr 68db9c4e1cSAlexandru Elisei # logs, then we assume a QEMU failure. Otherwise we translate 69db9c4e1cSAlexandru Elisei # status of 1 to 0 (SUCCESS) 70db9c4e1cSAlexandru Elisei if [ "$errors" ]; then 71db9c4e1cSAlexandru Elisei if ! grep -qvi warning <<<"$errors" ; then 72db9c4e1cSAlexandru Elisei ret=0 73db9c4e1cSAlexandru Elisei fi 74db9c4e1cSAlexandru Elisei else 75db9c4e1cSAlexandru Elisei ret=0 76db9c4e1cSAlexandru Elisei fi 77db9c4e1cSAlexandru Elisei fi 78db9c4e1cSAlexandru Elisei 79db9c4e1cSAlexandru Elisei echo $ret 80db9c4e1cSAlexandru Elisei} 81db9c4e1cSAlexandru Elisei 82db9c4e1cSAlexandru Eliseifunction kvmtool_fixup_return_code() 83db9c4e1cSAlexandru Elisei{ 84db9c4e1cSAlexandru Elisei local ret=$1 85db9c4e1cSAlexandru Elisei 86db9c4e1cSAlexandru Elisei # Force run_test_status() to interpret the STATUS line. 87db9c4e1cSAlexandru Elisei if [ $ret -eq 0 ]; then 88db9c4e1cSAlexandru Elisei ret=1 89db9c4e1cSAlexandru Elisei fi 90db9c4e1cSAlexandru Elisei 91db9c4e1cSAlexandru Elisei echo $ret 92db9c4e1cSAlexandru Elisei} 93db9c4e1cSAlexandru Elisei 9425c4b4b4SAlexandru Eliseideclare -A vmm_optname=( 9525c4b4b4SAlexandru Elisei [qemu,args]='-append' 96*6eb072c2SAlexandru Elisei [qemu,default_opts]='' 97db9c4e1cSAlexandru Elisei [qemu,fixup_return_code]=qemu_fixup_return_code 98db9c4e1cSAlexandru Elisei [qemu,initrd]='-initrd' 9925c4b4b4SAlexandru Elisei [qemu,nr_cpus]='-smp' 100db9c4e1cSAlexandru Elisei 101db9c4e1cSAlexandru Elisei [kvmtool,args]='--params' 102*6eb072c2SAlexandru Elisei [kvmtool,default_opts]="$KVMTOOL_DEFAULT_OPTS" 103db9c4e1cSAlexandru Elisei [kvmtool,fixup_return_code]=kvmtool_fixup_return_code 104db9c4e1cSAlexandru Elisei [kvmtool,initrd]='--initrd' 105db9c4e1cSAlexandru Elisei [kvmtool,nr_cpus]='--cpus' 10625c4b4b4SAlexandru Elisei) 10725c4b4b4SAlexandru Elisei 10825c4b4b4SAlexandru Eliseifunction vmm_optname_args() 10925c4b4b4SAlexandru Elisei{ 11025c4b4b4SAlexandru Elisei echo ${vmm_optname[$(vmm_get_target),args]} 11125c4b4b4SAlexandru Elisei} 11225c4b4b4SAlexandru Elisei 113*6eb072c2SAlexandru Eliseifunction vmm_default_opts() 114*6eb072c2SAlexandru Elisei{ 115*6eb072c2SAlexandru Elisei echo ${vmm_optname[$(vmm_get_target),default_opts]} 116*6eb072c2SAlexandru Elisei} 117*6eb072c2SAlexandru Elisei 118db9c4e1cSAlexandru Eliseifunction vmm_fixup_return_code() 119db9c4e1cSAlexandru Elisei{ 120db9c4e1cSAlexandru Elisei ${vmm_optname[$(vmm_get_target),fixup_return_code]} "$@" 121db9c4e1cSAlexandru Elisei} 122db9c4e1cSAlexandru Elisei 123db9c4e1cSAlexandru Eliseifunction vmm_optname_initrd() 124db9c4e1cSAlexandru Elisei{ 125db9c4e1cSAlexandru Elisei echo ${vmm_optname[$(vmm_get_target),initrd]} 126db9c4e1cSAlexandru Elisei} 127db9c4e1cSAlexandru Elisei 12825c4b4b4SAlexandru Eliseifunction vmm_optname_nr_cpus() 12925c4b4b4SAlexandru Elisei{ 13025c4b4b4SAlexandru Elisei echo ${vmm_optname[$(vmm_get_target),nr_cpus]} 13125c4b4b4SAlexandru Elisei} 13225c4b4b4SAlexandru Elisei 1339fcec1dbSAlexandru Eliseifunction vmm_get_target() 1349fcec1dbSAlexandru Elisei{ 1359fcec1dbSAlexandru Elisei if [[ -z "$TARGET" ]]; then 1369fcec1dbSAlexandru Elisei echo "qemu" 1379fcec1dbSAlexandru Elisei else 1389fcec1dbSAlexandru Elisei echo "$TARGET" 1399fcec1dbSAlexandru Elisei fi 1409fcec1dbSAlexandru Elisei} 1419fcec1dbSAlexandru Elisei 1429fcec1dbSAlexandru Eliseifunction vmm_check_supported() 1439fcec1dbSAlexandru Elisei{ 1449fcec1dbSAlexandru Elisei # We're not interested in the return code for vmm_get_target(). 1459fcec1dbSAlexandru Elisei # shellcheck disable=SC2155 1469fcec1dbSAlexandru Elisei local target=$(vmm_get_target) 1479fcec1dbSAlexandru Elisei 1489fcec1dbSAlexandru Elisei case "$target" in 1499fcec1dbSAlexandru Elisei qemu) 1509fcec1dbSAlexandru Elisei return 0 1519fcec1dbSAlexandru Elisei ;; 1529fcec1dbSAlexandru Elisei *) 1539fcec1dbSAlexandru Elisei echo "$0 does not support target '$target'" 1549fcec1dbSAlexandru Elisei exit 2 1559fcec1dbSAlexandru Elisei ;; 1569fcec1dbSAlexandru Elisei esac 1579fcec1dbSAlexandru Elisei} 158bd93a9c6SAlexandru Elisei 159bd93a9c6SAlexandru Eliseifunction vmm_unittest_params_name() 160bd93a9c6SAlexandru Elisei{ 161bd93a9c6SAlexandru Elisei # shellcheck disable=SC2155 162bd93a9c6SAlexandru Elisei local target=$(vmm_get_target) 163bd93a9c6SAlexandru Elisei 164bd93a9c6SAlexandru Elisei case "$target" in 165bd93a9c6SAlexandru Elisei qemu) 166bd93a9c6SAlexandru Elisei echo "extra_params|qemu_params" 167bd93a9c6SAlexandru Elisei ;; 168db9c4e1cSAlexandru Elisei kvmtool) 169db9c4e1cSAlexandru Elisei echo "kvmtool_params" 170db9c4e1cSAlexandru Elisei ;; 171bd93a9c6SAlexandru Elisei *) 172bd93a9c6SAlexandru Elisei echo "$0 does not support '$target'" 173bd93a9c6SAlexandru Elisei exit 2 174bd93a9c6SAlexandru Elisei ;; 175bd93a9c6SAlexandru Elisei esac 176bd93a9c6SAlexandru Elisei} 177