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{ 29*8727c886SAndrew Jones local stdout errors ret sig tty 30b2a2aa5dSAndrew Jones 31f0ca153cSRadim Krčmář # stdout to {stdout}, stderr to $errors and stderr 32*8727c886SAndrew Jones tty=$(stty -g) 33b2a2aa5dSAndrew Jones exec {stdout}>&1 34f0ca153cSRadim Krčmář errors=$("${@}" 2> >(tee /dev/stderr) > /dev/fd/$stdout) 35b2a2aa5dSAndrew Jones ret=$? 36b2a2aa5dSAndrew Jones exec {stdout}>&- 37*8727c886SAndrew Jones stty "$tty" 38*8727c886SAndrew Jones 39*8727c886SAndrew Jones [ $ret -eq 134 ] && echo "QEMU Aborted" >&2 40b2a2aa5dSAndrew Jones 41b2a2aa5dSAndrew Jones if [ "$errors" ]; then 42b2a2aa5dSAndrew Jones sig=$(grep 'terminating on signal' <<<"$errors") 43b2a2aa5dSAndrew Jones if [ "$sig" ]; then 44b2a2aa5dSAndrew Jones sig=$(sed 's/.*terminating on signal \([0-9][0-9]*\).*/\1/' <<<"$sig") 45b2a2aa5dSAndrew Jones fi 46b2a2aa5dSAndrew Jones fi 47b2a2aa5dSAndrew Jones 48b2a2aa5dSAndrew Jones if [ $ret -eq 0 ]; then 49b2a2aa5dSAndrew Jones # Some signals result in a zero return status, but the 50b2a2aa5dSAndrew Jones # error log tells the truth. 51b2a2aa5dSAndrew Jones if [ "$sig" ]; then 52b2a2aa5dSAndrew Jones ((ret=sig+128)) 53b2a2aa5dSAndrew Jones else 54b2a2aa5dSAndrew Jones # Exiting with zero (non-debugexit) is an error 55b2a2aa5dSAndrew Jones ret=1 56b2a2aa5dSAndrew Jones fi 57b2a2aa5dSAndrew Jones elif [ $ret -eq 1 ]; then 58b2a2aa5dSAndrew Jones # Even when ret==1 (unittest success) if we also got stderr 59b2a2aa5dSAndrew Jones # logs, then we assume a QEMU failure. Otherwise we translate 60b2a2aa5dSAndrew Jones # status of 1 to 0 (SUCCESS) 61a51bab13SRadim Krčmář if [ -z "$(echo "$errors" | grep -vi warning)" ]; then 62b2a2aa5dSAndrew Jones ret=0 63b2a2aa5dSAndrew Jones fi 64b2a2aa5dSAndrew Jones fi 65b2a2aa5dSAndrew Jones 66b2a2aa5dSAndrew Jones return $ret 67b2a2aa5dSAndrew Jones} 68fd149358SAndrew Jones 69fd149358SAndrew Jonestimeout_cmd () 70fd149358SAndrew Jones{ 71fd149358SAndrew Jones if [ "$TIMEOUT" ] && [ "$TIMEOUT" != "0" ]; then 72fd149358SAndrew Jones echo "timeout -k 1s --foreground $TIMEOUT" 73fd149358SAndrew Jones fi 74fd149358SAndrew Jones} 75