1b2a2aa5dSAndrew Jones############################################################################## 2b2a2aa5dSAndrew Jones# run_qemu translates the ambiguous exit status in Table1 to that in Table2. 3b2a2aa5dSAndrew Jones# Table3 simply documents the complete status table. 4b2a2aa5dSAndrew Jones# 5b2a2aa5dSAndrew Jones# Table1: Before fixup 6b2a2aa5dSAndrew Jones# -------------------- 7b2a2aa5dSAndrew Jones# 0 - Unexpected exit from QEMU (possible signal), or the unittest did 8b2a2aa5dSAndrew Jones# not use debug-exit 9b2a2aa5dSAndrew Jones# 1 - most likely unittest succeeded, or QEMU failed 10b2a2aa5dSAndrew Jones# 11b2a2aa5dSAndrew Jones# Table2: After fixup 12b2a2aa5dSAndrew Jones# ------------------- 13b2a2aa5dSAndrew Jones# 0 - Everything succeeded 14b2a2aa5dSAndrew Jones# 1 - most likely QEMU failed 15b2a2aa5dSAndrew Jones# 16b2a2aa5dSAndrew Jones# Table3: Complete table 17b2a2aa5dSAndrew Jones# ---------------------- 18b2a2aa5dSAndrew Jones# 0 - SUCCESS 19b2a2aa5dSAndrew Jones# 1 - most likely QEMU failed 20b2a2aa5dSAndrew Jones# 2 - most likely a run script failed 21b2a2aa5dSAndrew Jones# 3 - most likely the unittest failed 22fd149358SAndrew Jones# 124 - most likely the unittest timed out 23b2a2aa5dSAndrew Jones# 127 - most likely the unittest called abort() 24b2a2aa5dSAndrew Jones# 1..127 - FAILURE (could be QEMU, a run script, or the unittest) 25b2a2aa5dSAndrew Jones# >= 128 - Signal (signum = status - 128) 26b2a2aa5dSAndrew Jones############################################################################## 27b2a2aa5dSAndrew Jonesrun_qemu () 28b2a2aa5dSAndrew Jones{ 29b2a2aa5dSAndrew Jones local stdout errors ret sig 30b2a2aa5dSAndrew Jones 31b2a2aa5dSAndrew Jones # stdout to {stdout}, stderr to $errors 32b2a2aa5dSAndrew Jones exec {stdout}>&1 33b2a2aa5dSAndrew Jones errors=$("${@}" 2>&1 1>&${stdout}) 34b2a2aa5dSAndrew Jones ret=$? 35b2a2aa5dSAndrew Jones exec {stdout}>&- 36b2a2aa5dSAndrew Jones 37b2a2aa5dSAndrew Jones if [ "$errors" ]; then 38b2a2aa5dSAndrew Jones printf "%s\n" "$errors" >&2 39b2a2aa5dSAndrew Jones sig=$(grep 'terminating on signal' <<<"$errors") 40b2a2aa5dSAndrew Jones if [ "$sig" ]; then 41b2a2aa5dSAndrew Jones sig=$(sed 's/.*terminating on signal \([0-9][0-9]*\).*/\1/' <<<"$sig") 42b2a2aa5dSAndrew Jones fi 43b2a2aa5dSAndrew Jones fi 44b2a2aa5dSAndrew Jones 45b2a2aa5dSAndrew Jones if [ $ret -eq 0 ]; then 46b2a2aa5dSAndrew Jones # Some signals result in a zero return status, but the 47b2a2aa5dSAndrew Jones # error log tells the truth. 48b2a2aa5dSAndrew Jones if [ "$sig" ]; then 49b2a2aa5dSAndrew Jones ((ret=sig+128)) 50b2a2aa5dSAndrew Jones else 51b2a2aa5dSAndrew Jones # Exiting with zero (non-debugexit) is an error 52b2a2aa5dSAndrew Jones ret=1 53b2a2aa5dSAndrew Jones fi 54b2a2aa5dSAndrew Jones elif [ $ret -eq 1 ]; then 55b2a2aa5dSAndrew Jones # Even when ret==1 (unittest success) if we also got stderr 56b2a2aa5dSAndrew Jones # logs, then we assume a QEMU failure. Otherwise we translate 57b2a2aa5dSAndrew Jones # status of 1 to 0 (SUCCESS) 58*a51bab13SRadim Krčmář if [ -z "$(echo "$errors" | grep -vi warning)" ]; then 59b2a2aa5dSAndrew Jones ret=0 60b2a2aa5dSAndrew Jones fi 61b2a2aa5dSAndrew Jones fi 62b2a2aa5dSAndrew Jones 63b2a2aa5dSAndrew Jones return $ret 64b2a2aa5dSAndrew Jones} 65fd149358SAndrew Jones 66fd149358SAndrew Jonestimeout_cmd () 67fd149358SAndrew Jones{ 68fd149358SAndrew Jones if [ "$TIMEOUT" ] && [ "$TIMEOUT" != "0" ]; then 69fd149358SAndrew Jones echo "timeout -k 1s --foreground $TIMEOUT" 70fd149358SAndrew Jones fi 71fd149358SAndrew Jones} 72