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