1*db9c4e1cSAlexandru Elisei############################################################################## 2*db9c4e1cSAlexandru Elisei# qemu_fixup_return_code translates the ambiguous exit status in Table1 to that 3*db9c4e1cSAlexandru Elisei# in Table2. Table3 simply documents the complete status table. 4*db9c4e1cSAlexandru Elisei# 5*db9c4e1cSAlexandru Elisei# Table1: Before fixup 6*db9c4e1cSAlexandru Elisei# -------------------- 7*db9c4e1cSAlexandru Elisei# 0 - Unexpected exit from QEMU (possible signal), or the unittest did 8*db9c4e1cSAlexandru Elisei# not use debug-exit 9*db9c4e1cSAlexandru Elisei# 1 - most likely unittest succeeded, or QEMU failed 10*db9c4e1cSAlexandru Elisei# 11*db9c4e1cSAlexandru Elisei# Table2: After fixup 12*db9c4e1cSAlexandru Elisei# ------------------- 13*db9c4e1cSAlexandru Elisei# 0 - Everything succeeded 14*db9c4e1cSAlexandru Elisei# 1 - most likely QEMU failed 15*db9c4e1cSAlexandru Elisei# 16*db9c4e1cSAlexandru Elisei# Table3: Complete table 17*db9c4e1cSAlexandru Elisei# ---------------------- 18*db9c4e1cSAlexandru Elisei# 0 - SUCCESS 19*db9c4e1cSAlexandru Elisei# 1 - most likely QEMU failed 20*db9c4e1cSAlexandru Elisei# 2 - most likely a run script failed 21*db9c4e1cSAlexandru Elisei# 3 - most likely the unittest failed 22*db9c4e1cSAlexandru Elisei# 124 - most likely the unittest timed out 23*db9c4e1cSAlexandru Elisei# 127 - most likely the unittest called abort() 24*db9c4e1cSAlexandru Elisei# 1..127 - FAILURE (could be QEMU, a run script, or the unittest) 25*db9c4e1cSAlexandru Elisei# >= 128 - Signal (signum = status - 128) 26*db9c4e1cSAlexandru Elisei############################################################################## 27*db9c4e1cSAlexandru Eliseifunction qemu_fixup_return_code() 28*db9c4e1cSAlexandru Elisei{ 29*db9c4e1cSAlexandru Elisei local ret=$1 30*db9c4e1cSAlexandru Elisei # Remove $ret from the list of arguments 31*db9c4e1cSAlexandru Elisei shift 1 32*db9c4e1cSAlexandru Elisei local errors=$* 33*db9c4e1cSAlexandru Elisei local sig 34*db9c4e1cSAlexandru Elisei 35*db9c4e1cSAlexandru Elisei [ $ret -eq 134 ] && echo "QEMU Aborted" >&2 36*db9c4e1cSAlexandru Elisei 37*db9c4e1cSAlexandru Elisei if [ "$errors" ]; then 38*db9c4e1cSAlexandru Elisei sig=$(grep 'terminating on signal' <<<"$errors") 39*db9c4e1cSAlexandru Elisei if [ "$sig" ]; then 40*db9c4e1cSAlexandru Elisei # This is too complex for ${var/search/replace} 41*db9c4e1cSAlexandru Elisei # shellcheck disable=SC2001 42*db9c4e1cSAlexandru Elisei sig=$(sed 's/.*terminating on signal \([0-9][0-9]*\).*/\1/' <<<"$sig") 43*db9c4e1cSAlexandru Elisei fi 44*db9c4e1cSAlexandru Elisei fi 45*db9c4e1cSAlexandru Elisei 46*db9c4e1cSAlexandru Elisei if [ $ret -eq 0 ]; then 47*db9c4e1cSAlexandru Elisei # Some signals result in a zero return status, but the 48*db9c4e1cSAlexandru Elisei # error log tells the truth. 49*db9c4e1cSAlexandru Elisei if [ "$sig" ]; then 50*db9c4e1cSAlexandru Elisei ((ret=sig+128)) 51*db9c4e1cSAlexandru Elisei else 52*db9c4e1cSAlexandru Elisei # Exiting with zero (non-debugexit) is an error 53*db9c4e1cSAlexandru Elisei ret=1 54*db9c4e1cSAlexandru Elisei fi 55*db9c4e1cSAlexandru Elisei elif [ $ret -eq 1 ]; then 56*db9c4e1cSAlexandru Elisei # Even when ret==1 (unittest success) if we also got stderr 57*db9c4e1cSAlexandru Elisei # logs, then we assume a QEMU failure. Otherwise we translate 58*db9c4e1cSAlexandru Elisei # status of 1 to 0 (SUCCESS) 59*db9c4e1cSAlexandru Elisei if [ "$errors" ]; then 60*db9c4e1cSAlexandru Elisei if ! grep -qvi warning <<<"$errors" ; then 61*db9c4e1cSAlexandru Elisei ret=0 62*db9c4e1cSAlexandru Elisei fi 63*db9c4e1cSAlexandru Elisei else 64*db9c4e1cSAlexandru Elisei ret=0 65*db9c4e1cSAlexandru Elisei fi 66*db9c4e1cSAlexandru Elisei fi 67*db9c4e1cSAlexandru Elisei 68*db9c4e1cSAlexandru Elisei echo $ret 69*db9c4e1cSAlexandru Elisei} 70*db9c4e1cSAlexandru Elisei 71*db9c4e1cSAlexandru Eliseifunction kvmtool_fixup_return_code() 72*db9c4e1cSAlexandru Elisei{ 73*db9c4e1cSAlexandru Elisei local ret=$1 74*db9c4e1cSAlexandru Elisei 75*db9c4e1cSAlexandru Elisei # Force run_test_status() to interpret the STATUS line. 76*db9c4e1cSAlexandru Elisei if [ $ret -eq 0 ]; then 77*db9c4e1cSAlexandru Elisei ret=1 78*db9c4e1cSAlexandru Elisei fi 79*db9c4e1cSAlexandru Elisei 80*db9c4e1cSAlexandru Elisei echo $ret 81*db9c4e1cSAlexandru Elisei} 82*db9c4e1cSAlexandru Elisei 8325c4b4b4SAlexandru Eliseideclare -A vmm_optname=( 8425c4b4b4SAlexandru Elisei [qemu,args]='-append' 85*db9c4e1cSAlexandru Elisei [qemu,fixup_return_code]=qemu_fixup_return_code 86*db9c4e1cSAlexandru Elisei [qemu,initrd]='-initrd' 8725c4b4b4SAlexandru Elisei [qemu,nr_cpus]='-smp' 88*db9c4e1cSAlexandru Elisei 89*db9c4e1cSAlexandru Elisei [kvmtool,args]='--params' 90*db9c4e1cSAlexandru Elisei [kvmtool,fixup_return_code]=kvmtool_fixup_return_code 91*db9c4e1cSAlexandru Elisei [kvmtool,initrd]='--initrd' 92*db9c4e1cSAlexandru Elisei [kvmtool,nr_cpus]='--cpus' 9325c4b4b4SAlexandru Elisei) 9425c4b4b4SAlexandru Elisei 9525c4b4b4SAlexandru Eliseifunction vmm_optname_args() 9625c4b4b4SAlexandru Elisei{ 9725c4b4b4SAlexandru Elisei echo ${vmm_optname[$(vmm_get_target),args]} 9825c4b4b4SAlexandru Elisei} 9925c4b4b4SAlexandru Elisei 100*db9c4e1cSAlexandru Eliseifunction vmm_fixup_return_code() 101*db9c4e1cSAlexandru Elisei{ 102*db9c4e1cSAlexandru Elisei ${vmm_optname[$(vmm_get_target),fixup_return_code]} "$@" 103*db9c4e1cSAlexandru Elisei} 104*db9c4e1cSAlexandru Elisei 105*db9c4e1cSAlexandru Eliseifunction vmm_optname_initrd() 106*db9c4e1cSAlexandru Elisei{ 107*db9c4e1cSAlexandru Elisei echo ${vmm_optname[$(vmm_get_target),initrd]} 108*db9c4e1cSAlexandru Elisei} 109*db9c4e1cSAlexandru Elisei 11025c4b4b4SAlexandru Eliseifunction vmm_optname_nr_cpus() 11125c4b4b4SAlexandru Elisei{ 11225c4b4b4SAlexandru Elisei echo ${vmm_optname[$(vmm_get_target),nr_cpus]} 11325c4b4b4SAlexandru Elisei} 11425c4b4b4SAlexandru Elisei 1159fcec1dbSAlexandru Eliseifunction vmm_get_target() 1169fcec1dbSAlexandru Elisei{ 1179fcec1dbSAlexandru Elisei if [[ -z "$TARGET" ]]; then 1189fcec1dbSAlexandru Elisei echo "qemu" 1199fcec1dbSAlexandru Elisei else 1209fcec1dbSAlexandru Elisei echo "$TARGET" 1219fcec1dbSAlexandru Elisei fi 1229fcec1dbSAlexandru Elisei} 1239fcec1dbSAlexandru Elisei 1249fcec1dbSAlexandru Eliseifunction vmm_check_supported() 1259fcec1dbSAlexandru Elisei{ 1269fcec1dbSAlexandru Elisei # We're not interested in the return code for vmm_get_target(). 1279fcec1dbSAlexandru Elisei # shellcheck disable=SC2155 1289fcec1dbSAlexandru Elisei local target=$(vmm_get_target) 1299fcec1dbSAlexandru Elisei 1309fcec1dbSAlexandru Elisei case "$target" in 1319fcec1dbSAlexandru Elisei qemu) 1329fcec1dbSAlexandru Elisei return 0 1339fcec1dbSAlexandru Elisei ;; 1349fcec1dbSAlexandru Elisei *) 1359fcec1dbSAlexandru Elisei echo "$0 does not support target '$target'" 1369fcec1dbSAlexandru Elisei exit 2 1379fcec1dbSAlexandru Elisei ;; 1389fcec1dbSAlexandru Elisei esac 1399fcec1dbSAlexandru Elisei} 140bd93a9c6SAlexandru Elisei 141bd93a9c6SAlexandru Eliseifunction vmm_unittest_params_name() 142bd93a9c6SAlexandru Elisei{ 143bd93a9c6SAlexandru Elisei # shellcheck disable=SC2155 144bd93a9c6SAlexandru Elisei local target=$(vmm_get_target) 145bd93a9c6SAlexandru Elisei 146bd93a9c6SAlexandru Elisei case "$target" in 147bd93a9c6SAlexandru Elisei qemu) 148bd93a9c6SAlexandru Elisei echo "extra_params|qemu_params" 149bd93a9c6SAlexandru Elisei ;; 150*db9c4e1cSAlexandru Elisei kvmtool) 151*db9c4e1cSAlexandru Elisei echo "kvmtool_params" 152*db9c4e1cSAlexandru Elisei ;; 153bd93a9c6SAlexandru Elisei *) 154bd93a9c6SAlexandru Elisei echo "$0 does not support '$target'" 155bd93a9c6SAlexandru Elisei exit 2 156bd93a9c6SAlexandru Elisei ;; 157bd93a9c6SAlexandru Elisei esac 158bd93a9c6SAlexandru Elisei} 159