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