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 8234940cc9SAlexandru Eliseifunction qemu_parse_premature_failure() 8334940cc9SAlexandru Elisei{ 8434940cc9SAlexandru Elisei local log=$* 8534940cc9SAlexandru Elisei 8634940cc9SAlexandru Elisei echo "$log" | grep "_NO_FILE_4Uhere_" | 8734940cc9SAlexandru Elisei grep -q -e "[Cc]ould not \(load\|open\) kernel" \ 8834940cc9SAlexandru Elisei -e "error loading" \ 8934940cc9SAlexandru Elisei -e "failed to load" && 9034940cc9SAlexandru Elisei return 1 9134940cc9SAlexandru Elisei return 0 9234940cc9SAlexandru Elisei} 9334940cc9SAlexandru Elisei 944bf367d9SAlexandru Elisei# 954bf367d9SAlexandru Elisei# Probe for MAX_SMP, in case it's less than the number of host cpus. 964bf367d9SAlexandru Elisei# 974bf367d9SAlexandru Eliseifunction qemu_probe_maxsmp() 984bf367d9SAlexandru Elisei{ 994bf367d9SAlexandru Elisei local runtime_arch_run="$1" 1004bf367d9SAlexandru Elisei local smp 1014bf367d9SAlexandru Elisei 1024bf367d9SAlexandru Elisei if smp=$($runtime_arch_run _NO_FILE_4Uhere_ -smp $MAX_SMP |& grep 'SMP CPUs'); then 1034bf367d9SAlexandru Elisei smp=${smp##* } 1044bf367d9SAlexandru Elisei smp=${smp/\(} 1054bf367d9SAlexandru Elisei smp=${smp/\)} 1064bf367d9SAlexandru Elisei echo "Restricting MAX_SMP from ($MAX_SMP) to the max supported ($smp)" >&2 1074bf367d9SAlexandru Elisei MAX_SMP=$smp 1084bf367d9SAlexandru Elisei fi 1094bf367d9SAlexandru Elisei} 1104bf367d9SAlexandru Elisei 111db9c4e1cSAlexandru Eliseifunction kvmtool_fixup_return_code() 112db9c4e1cSAlexandru Elisei{ 113db9c4e1cSAlexandru Elisei local ret=$1 114db9c4e1cSAlexandru Elisei 115db9c4e1cSAlexandru Elisei # Force run_test_status() to interpret the STATUS line. 116db9c4e1cSAlexandru Elisei if [ $ret -eq 0 ]; then 117db9c4e1cSAlexandru Elisei ret=1 118db9c4e1cSAlexandru Elisei fi 119db9c4e1cSAlexandru Elisei 120db9c4e1cSAlexandru Elisei echo $ret 121db9c4e1cSAlexandru Elisei} 122db9c4e1cSAlexandru Elisei 12334940cc9SAlexandru Eliseifunction kvmtool_parse_premature_failure() 12434940cc9SAlexandru Elisei{ 12534940cc9SAlexandru Elisei local log=$* 12634940cc9SAlexandru Elisei 12734940cc9SAlexandru Elisei echo "$log" | grep "Fatal: Unable to open kernel _NO_FILE_4Uhere_" && 12834940cc9SAlexandru Elisei return 1 12934940cc9SAlexandru Elisei return 0 13034940cc9SAlexandru Elisei} 13134940cc9SAlexandru Elisei 1324bf367d9SAlexandru Eliseifunction kvmtool_probe_maxsmp() 1334bf367d9SAlexandru Elisei{ 1344bf367d9SAlexandru Elisei echo "kvmtool automatically limits the number of VCPUs to maximum supported" 1354bf367d9SAlexandru Elisei echo "The 'smp' test parameter won't be modified" 1364bf367d9SAlexandru Elisei} 1374bf367d9SAlexandru Elisei 13825c4b4b4SAlexandru Eliseideclare -A vmm_optname=( 13925c4b4b4SAlexandru Elisei [qemu,args]='-append' 1406eb072c2SAlexandru Elisei [qemu,default_opts]='' 141db9c4e1cSAlexandru Elisei [qemu,fixup_return_code]=qemu_fixup_return_code 142db9c4e1cSAlexandru Elisei [qemu,initrd]='-initrd' 14325c4b4b4SAlexandru Elisei [qemu,nr_cpus]='-smp' 14434940cc9SAlexandru Elisei [qemu,parse_premature_failure]=qemu_parse_premature_failure 1454bf367d9SAlexandru Elisei [qemu,probe_maxsmp]=qemu_probe_maxsmp 146db9c4e1cSAlexandru Elisei 147db9c4e1cSAlexandru Elisei [kvmtool,args]='--params' 1486eb072c2SAlexandru Elisei [kvmtool,default_opts]="$KVMTOOL_DEFAULT_OPTS" 149db9c4e1cSAlexandru Elisei [kvmtool,fixup_return_code]=kvmtool_fixup_return_code 150db9c4e1cSAlexandru Elisei [kvmtool,initrd]='--initrd' 151db9c4e1cSAlexandru Elisei [kvmtool,nr_cpus]='--cpus' 15234940cc9SAlexandru Elisei [kvmtool,parse_premature_failure]=kvmtool_parse_premature_failure 1534bf367d9SAlexandru Elisei [kvmtool,probe_maxsmp]=kvmtool_probe_maxsmp 15425c4b4b4SAlexandru Elisei) 15525c4b4b4SAlexandru Elisei 15625c4b4b4SAlexandru Eliseifunction vmm_optname_args() 15725c4b4b4SAlexandru Elisei{ 15825c4b4b4SAlexandru Elisei echo ${vmm_optname[$(vmm_get_target),args]} 15925c4b4b4SAlexandru Elisei} 16025c4b4b4SAlexandru Elisei 1616eb072c2SAlexandru Eliseifunction vmm_default_opts() 1626eb072c2SAlexandru Elisei{ 1636eb072c2SAlexandru Elisei echo ${vmm_optname[$(vmm_get_target),default_opts]} 1646eb072c2SAlexandru Elisei} 1656eb072c2SAlexandru Elisei 166db9c4e1cSAlexandru Eliseifunction vmm_fixup_return_code() 167db9c4e1cSAlexandru Elisei{ 168db9c4e1cSAlexandru Elisei ${vmm_optname[$(vmm_get_target),fixup_return_code]} "$@" 169db9c4e1cSAlexandru Elisei} 170db9c4e1cSAlexandru Elisei 171db9c4e1cSAlexandru Eliseifunction vmm_optname_initrd() 172db9c4e1cSAlexandru Elisei{ 173db9c4e1cSAlexandru Elisei echo ${vmm_optname[$(vmm_get_target),initrd]} 174db9c4e1cSAlexandru Elisei} 175db9c4e1cSAlexandru Elisei 17625c4b4b4SAlexandru Eliseifunction vmm_optname_nr_cpus() 17725c4b4b4SAlexandru Elisei{ 17825c4b4b4SAlexandru Elisei echo ${vmm_optname[$(vmm_get_target),nr_cpus]} 17925c4b4b4SAlexandru Elisei} 18025c4b4b4SAlexandru Elisei 18134940cc9SAlexandru Eliseifunction vmm_parse_premature_failure() 18234940cc9SAlexandru Elisei{ 18334940cc9SAlexandru Elisei ${vmm_optname[$(vmm_get_target),parse_premature_failure]} "$@" 18434940cc9SAlexandru Elisei} 18534940cc9SAlexandru Elisei 1864bf367d9SAlexandru Eliseifunction vmm_probe_maxsmp() 1874bf367d9SAlexandru Elisei{ 1884bf367d9SAlexandru Elisei ${vmm_optname[$(vmm_get_target),probe_maxsmp]} "$1" 1894bf367d9SAlexandru Elisei} 1904bf367d9SAlexandru Elisei 1919fcec1dbSAlexandru Eliseifunction vmm_get_target() 1929fcec1dbSAlexandru Elisei{ 1939fcec1dbSAlexandru Elisei if [[ -z "$TARGET" ]]; then 1949fcec1dbSAlexandru Elisei echo "qemu" 1959fcec1dbSAlexandru Elisei else 1969fcec1dbSAlexandru Elisei echo "$TARGET" 1979fcec1dbSAlexandru Elisei fi 1989fcec1dbSAlexandru Elisei} 1999fcec1dbSAlexandru Elisei 2009fcec1dbSAlexandru Eliseifunction vmm_check_supported() 2019fcec1dbSAlexandru Elisei{ 2029fcec1dbSAlexandru Elisei # We're not interested in the return code for vmm_get_target(). 2039fcec1dbSAlexandru Elisei # shellcheck disable=SC2155 2049fcec1dbSAlexandru Elisei local target=$(vmm_get_target) 2059fcec1dbSAlexandru Elisei 2069fcec1dbSAlexandru Elisei case "$target" in 207*463cd0ffSAlexandru Elisei qemu | kvmtool) 2089fcec1dbSAlexandru Elisei return 0 2099fcec1dbSAlexandru Elisei ;; 2109fcec1dbSAlexandru Elisei *) 2119fcec1dbSAlexandru Elisei echo "$0 does not support target '$target'" 2129fcec1dbSAlexandru Elisei exit 2 2139fcec1dbSAlexandru Elisei ;; 2149fcec1dbSAlexandru Elisei esac 2159fcec1dbSAlexandru Elisei} 216bd93a9c6SAlexandru Elisei 217bd93a9c6SAlexandru Eliseifunction vmm_unittest_params_name() 218bd93a9c6SAlexandru Elisei{ 219bd93a9c6SAlexandru Elisei # shellcheck disable=SC2155 220bd93a9c6SAlexandru Elisei local target=$(vmm_get_target) 221bd93a9c6SAlexandru Elisei 222bd93a9c6SAlexandru Elisei case "$target" in 223bd93a9c6SAlexandru Elisei qemu) 224bd93a9c6SAlexandru Elisei echo "extra_params|qemu_params" 225bd93a9c6SAlexandru Elisei ;; 226db9c4e1cSAlexandru Elisei kvmtool) 227db9c4e1cSAlexandru Elisei echo "kvmtool_params" 228db9c4e1cSAlexandru Elisei ;; 229bd93a9c6SAlexandru Elisei *) 230bd93a9c6SAlexandru Elisei echo "$0 does not support '$target'" 231bd93a9c6SAlexandru Elisei exit 2 232bd93a9c6SAlexandru Elisei ;; 233bd93a9c6SAlexandru Elisei esac 234bd93a9c6SAlexandru Elisei} 235