16eb072c2SAlexandru Elisei# The following parameters are enabled by default when running a test with 26eb072c2SAlexandru Elisei# kvmtool: 36eb072c2SAlexandru Elisei# --nodefaults: suppress VM configuration that cannot be disabled (like 46eb072c2SAlexandru Elisei# modifying the supplied kernel command line). Otherwise tests 56eb072c2SAlexandru Elisei# that use the command line will fail without this parameter. 66eb072c2SAlexandru Elisei# --network mode=none: do not create a network device. kvmtool tries to help the 76eb072c2SAlexandru Elisei# user by automatically create one, and then prints a warning 86eb072c2SAlexandru Elisei# when the VM terminates if the device hasn't been initialized. 96eb072c2SAlexandru Elisei# --loglevel=warning: reduce verbosity 106eb072c2SAlexandru Elisei: "${KVMTOOL_DEFAULT_OPTS:="--nodefaults --network mode=none --loglevel=warning"}" 116eb072c2SAlexandru 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 82*34940cc9SAlexandru Eliseifunction qemu_parse_premature_failure() 83*34940cc9SAlexandru Elisei{ 84*34940cc9SAlexandru Elisei local log=$* 85*34940cc9SAlexandru Elisei 86*34940cc9SAlexandru Elisei echo "$log" | grep "_NO_FILE_4Uhere_" | 87*34940cc9SAlexandru Elisei grep -q -e "[Cc]ould not \(load\|open\) kernel" \ 88*34940cc9SAlexandru Elisei -e "error loading" \ 89*34940cc9SAlexandru Elisei -e "failed to load" && 90*34940cc9SAlexandru Elisei return 1 91*34940cc9SAlexandru Elisei return 0 92*34940cc9SAlexandru Elisei} 93*34940cc9SAlexandru Elisei 94db9c4e1cSAlexandru Eliseifunction kvmtool_fixup_return_code() 95db9c4e1cSAlexandru Elisei{ 96db9c4e1cSAlexandru Elisei local ret=$1 97db9c4e1cSAlexandru Elisei 98db9c4e1cSAlexandru Elisei # Force run_test_status() to interpret the STATUS line. 99db9c4e1cSAlexandru Elisei if [ $ret -eq 0 ]; then 100db9c4e1cSAlexandru Elisei ret=1 101db9c4e1cSAlexandru Elisei fi 102db9c4e1cSAlexandru Elisei 103db9c4e1cSAlexandru Elisei echo $ret 104db9c4e1cSAlexandru Elisei} 105db9c4e1cSAlexandru Elisei 106*34940cc9SAlexandru Eliseifunction kvmtool_parse_premature_failure() 107*34940cc9SAlexandru Elisei{ 108*34940cc9SAlexandru Elisei local log=$* 109*34940cc9SAlexandru Elisei 110*34940cc9SAlexandru Elisei echo "$log" | grep "Fatal: Unable to open kernel _NO_FILE_4Uhere_" && 111*34940cc9SAlexandru Elisei return 1 112*34940cc9SAlexandru Elisei return 0 113*34940cc9SAlexandru Elisei} 114*34940cc9SAlexandru Elisei 11525c4b4b4SAlexandru Eliseideclare -A vmm_optname=( 11625c4b4b4SAlexandru Elisei [qemu,args]='-append' 1176eb072c2SAlexandru Elisei [qemu,default_opts]='' 118db9c4e1cSAlexandru Elisei [qemu,fixup_return_code]=qemu_fixup_return_code 119db9c4e1cSAlexandru Elisei [qemu,initrd]='-initrd' 12025c4b4b4SAlexandru Elisei [qemu,nr_cpus]='-smp' 121*34940cc9SAlexandru Elisei [qemu,parse_premature_failure]=qemu_parse_premature_failure 122db9c4e1cSAlexandru Elisei 123db9c4e1cSAlexandru Elisei [kvmtool,args]='--params' 1246eb072c2SAlexandru Elisei [kvmtool,default_opts]="$KVMTOOL_DEFAULT_OPTS" 125db9c4e1cSAlexandru Elisei [kvmtool,fixup_return_code]=kvmtool_fixup_return_code 126db9c4e1cSAlexandru Elisei [kvmtool,initrd]='--initrd' 127db9c4e1cSAlexandru Elisei [kvmtool,nr_cpus]='--cpus' 128*34940cc9SAlexandru Elisei [kvmtool,parse_premature_failure]=kvmtool_parse_premature_failure 12925c4b4b4SAlexandru Elisei) 13025c4b4b4SAlexandru Elisei 13125c4b4b4SAlexandru Eliseifunction vmm_optname_args() 13225c4b4b4SAlexandru Elisei{ 13325c4b4b4SAlexandru Elisei echo ${vmm_optname[$(vmm_get_target),args]} 13425c4b4b4SAlexandru Elisei} 13525c4b4b4SAlexandru Elisei 1366eb072c2SAlexandru Eliseifunction vmm_default_opts() 1376eb072c2SAlexandru Elisei{ 1386eb072c2SAlexandru Elisei echo ${vmm_optname[$(vmm_get_target),default_opts]} 1396eb072c2SAlexandru Elisei} 1406eb072c2SAlexandru Elisei 141db9c4e1cSAlexandru Eliseifunction vmm_fixup_return_code() 142db9c4e1cSAlexandru Elisei{ 143db9c4e1cSAlexandru Elisei ${vmm_optname[$(vmm_get_target),fixup_return_code]} "$@" 144db9c4e1cSAlexandru Elisei} 145db9c4e1cSAlexandru Elisei 146db9c4e1cSAlexandru Eliseifunction vmm_optname_initrd() 147db9c4e1cSAlexandru Elisei{ 148db9c4e1cSAlexandru Elisei echo ${vmm_optname[$(vmm_get_target),initrd]} 149db9c4e1cSAlexandru Elisei} 150db9c4e1cSAlexandru Elisei 15125c4b4b4SAlexandru Eliseifunction vmm_optname_nr_cpus() 15225c4b4b4SAlexandru Elisei{ 15325c4b4b4SAlexandru Elisei echo ${vmm_optname[$(vmm_get_target),nr_cpus]} 15425c4b4b4SAlexandru Elisei} 15525c4b4b4SAlexandru Elisei 156*34940cc9SAlexandru Eliseifunction vmm_parse_premature_failure() 157*34940cc9SAlexandru Elisei{ 158*34940cc9SAlexandru Elisei ${vmm_optname[$(vmm_get_target),parse_premature_failure]} "$@" 159*34940cc9SAlexandru Elisei} 160*34940cc9SAlexandru Elisei 1619fcec1dbSAlexandru Eliseifunction vmm_get_target() 1629fcec1dbSAlexandru Elisei{ 1639fcec1dbSAlexandru Elisei if [[ -z "$TARGET" ]]; then 1649fcec1dbSAlexandru Elisei echo "qemu" 1659fcec1dbSAlexandru Elisei else 1669fcec1dbSAlexandru Elisei echo "$TARGET" 1679fcec1dbSAlexandru Elisei fi 1689fcec1dbSAlexandru Elisei} 1699fcec1dbSAlexandru Elisei 1709fcec1dbSAlexandru Eliseifunction vmm_check_supported() 1719fcec1dbSAlexandru Elisei{ 1729fcec1dbSAlexandru Elisei # We're not interested in the return code for vmm_get_target(). 1739fcec1dbSAlexandru Elisei # shellcheck disable=SC2155 1749fcec1dbSAlexandru Elisei local target=$(vmm_get_target) 1759fcec1dbSAlexandru Elisei 1769fcec1dbSAlexandru Elisei case "$target" in 1779fcec1dbSAlexandru Elisei qemu) 1789fcec1dbSAlexandru Elisei return 0 1799fcec1dbSAlexandru Elisei ;; 1809fcec1dbSAlexandru Elisei *) 1819fcec1dbSAlexandru Elisei echo "$0 does not support target '$target'" 1829fcec1dbSAlexandru Elisei exit 2 1839fcec1dbSAlexandru Elisei ;; 1849fcec1dbSAlexandru Elisei esac 1859fcec1dbSAlexandru Elisei} 186bd93a9c6SAlexandru Elisei 187bd93a9c6SAlexandru Eliseifunction vmm_unittest_params_name() 188bd93a9c6SAlexandru Elisei{ 189bd93a9c6SAlexandru Elisei # shellcheck disable=SC2155 190bd93a9c6SAlexandru Elisei local target=$(vmm_get_target) 191bd93a9c6SAlexandru Elisei 192bd93a9c6SAlexandru Elisei case "$target" in 193bd93a9c6SAlexandru Elisei qemu) 194bd93a9c6SAlexandru Elisei echo "extra_params|qemu_params" 195bd93a9c6SAlexandru Elisei ;; 196db9c4e1cSAlexandru Elisei kvmtool) 197db9c4e1cSAlexandru Elisei echo "kvmtool_params" 198db9c4e1cSAlexandru Elisei ;; 199bd93a9c6SAlexandru Elisei *) 200bd93a9c6SAlexandru Elisei echo "$0 does not support '$target'" 201bd93a9c6SAlexandru Elisei exit 2 202bd93a9c6SAlexandru Elisei ;; 203bd93a9c6SAlexandru Elisei esac 204bd93a9c6SAlexandru Elisei} 205