xref: /kvm-unit-tests/scripts/arch-run.bash (revision b2a2aa5d6a5feed114ab730721f02b3b9e09b814)
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