xref: /kvm-unit-tests/scripts/mkstandalone.sh (revision 560cd30b8d5260c321ca517cbe7c0a2ec028a044)
12b30b764SAndrew Jones#!/bin/bash
22b30b764SAndrew Jones
32b30b764SAndrew Jonesif [ ! -f config.mak ]; then
42b30b764SAndrew Jones	echo "run ./configure && make first. See ./configure -h"
52b30b764SAndrew Jones	exit
62b30b764SAndrew Jonesfi
72b30b764SAndrew Jonessource config.mak
82b30b764SAndrew Jonessource scripts/functions.bash
92b30b764SAndrew Jones
102b30b764SAndrew Jonesone_kernel="$1"
112b30b764SAndrew Jones[ "$one_kernel" ] && one_kernel_base=$(basename $one_kernel)
122b30b764SAndrew Jonesone_testname="$2"
132b30b764SAndrew Jonesif [ -n "$one_kernel" ] && [ ! -f $one_kernel ]; then
142b30b764SAndrew Jones	echo "$one_kernel doesn't exist"
152b30b764SAndrew Jones	exit 1
162b30b764SAndrew Joneselif [ -n "$one_kernel" ] && [ -z "$one_testname" ]; then
172b30b764SAndrew Jones	one_testname="${one_kernel_base%.*}"
182b30b764SAndrew Jonesfi
192b30b764SAndrew Jones
202b30b764SAndrew Jonesunittests=$TEST_DIR/unittests.cfg
212b30b764SAndrew Jonesmkdir -p tests
222b30b764SAndrew Jones
232b30b764SAndrew Jonesfunction mkstandalone()
242b30b764SAndrew Jones{
252b30b764SAndrew Jones	local testname="$1"
262b30b764SAndrew Jones	local groups="$2"
272b30b764SAndrew Jones	local smp="$3"
282b30b764SAndrew Jones	local kernel="$4"
292b30b764SAndrew Jones	local opts="$5"
302b30b764SAndrew Jones	local arch="$6"
312b30b764SAndrew Jones	local check="$7"
320601b85cSAndrew Jones	local accel="$8"
332b30b764SAndrew Jones
342b30b764SAndrew Jones	if [ -z "$testname" ]; then
352b30b764SAndrew Jones		return 1
362b30b764SAndrew Jones	fi
372b30b764SAndrew Jones
382b30b764SAndrew Jones	if [ -n "$one_testname" ] && [ "$testname" != "$one_testname" ]; then
392b30b764SAndrew Jones		return 1
402b30b764SAndrew Jones	fi
412b30b764SAndrew Jones
422b30b764SAndrew Jones	standalone=tests/$testname
430601b85cSAndrew Jones	cmdline=$(DRYRUN=yes ACCEL=$accel ./$TEST_DIR-run $kernel)
442b30b764SAndrew Jones	if [ $? -ne 0 ]; then
452b30b764SAndrew Jones		echo $cmdline
462b30b764SAndrew Jones		exit 1
472b30b764SAndrew Jones	fi
482b30b764SAndrew Jones	qemu=$(cut -d' ' -f1 <<< "$cmdline")
492b30b764SAndrew Jones	cmdline=$(cut -d' ' -f2- <<< "$cmdline")
502b30b764SAndrew Jones
51*560cd30bSRadim Krčmář	exec {tmpfd}<&1
52*560cd30bSRadim Krčmář	exec > $standalone
532b30b764SAndrew Jones
54*560cd30bSRadim Krčmář	echo "#!/bin/sh"
55*560cd30bSRadim Krčmář
562b30b764SAndrew Jonesif [ "$arch" ]; then
57*560cd30bSRadim Krčmář	cat <<EOF
582b30b764SAndrew JonesARCH=\`uname -m | sed -e s/i.86/i386/ | sed -e 's/arm.*/arm/'\`
592b30b764SAndrew Jones[ "\$ARCH" = "aarch64" ] && ARCH="arm64"
602b30b764SAndrew Jonesif [ "\$ARCH" != "$arch" ]; then
612b30b764SAndrew Jones	echo "skip $testname ($arch only)" 1>&2
622b30b764SAndrew Jones	exit 1
632b30b764SAndrew Jonesfi
642b30b764SAndrew Jones
652b30b764SAndrew JonesEOF
662b30b764SAndrew Jonesfi
672b30b764SAndrew Jonesif [ "$check" ]; then
68*560cd30bSRadim Krčmář	cat <<EOF
692b30b764SAndrew Jonesfor param in $check; do
702b30b764SAndrew Jones	path=\`echo \$param | cut -d= -f1\`
712b30b764SAndrew Jones	value=\`echo \$param | cut -d= -f2\`
722b30b764SAndrew Jones	if [ -f "\$path" ] && [ "\`cat \$path\`" != "\$value" ]; then
732b30b764SAndrew Jones		echo "skip $testname (\$path not equal to \$value)" 1>&2
742b30b764SAndrew Jones		exit 1
752b30b764SAndrew Jones	fi
762b30b764SAndrew Jonesdone
772b30b764SAndrew Jones
782b30b764SAndrew JonesEOF
792b30b764SAndrew Jonesfi
802b30b764SAndrew Jonesif [ ! -f $kernel ]; then
81*560cd30bSRadim Krčmář	cat <<EOF
822b30b764SAndrew Jonesecho "skip $testname (test kernel not present)" 1>&2
832b30b764SAndrew Jonesexit 1
842b30b764SAndrew JonesEOF
852b30b764SAndrew Joneselse
86*560cd30bSRadim Krčmář	cat <<EOF
872b30b764SAndrew Jonestrap 'rm -f \$bin; exit 1' HUP INT TERM
882b30b764SAndrew Jonesbin=\`mktemp\`
892b30b764SAndrew Jonesbase64 -d << 'BIN_EOF' | zcat > \$bin &&
902b30b764SAndrew JonesEOF
91*560cd30bSRadim Krčmářgzip - < $kernel | base64
92*560cd30bSRadim Krčmář	cat <<EOF
932b30b764SAndrew JonesBIN_EOF
942b30b764SAndrew Jones
952b30b764SAndrew Jonesqemu="$qemu"
962b30b764SAndrew Jonesif [ "\$QEMU" ]; then
972b30b764SAndrew Jones	qemu="\$QEMU"
982b30b764SAndrew Jonesfi
995e78b70dSAndrew Jones
1005e78b70dSAndrew JonesMAX_SMP="MAX_SMP"
1012b30b764SAndrew Jonesecho \$qemu $cmdline -smp $smp $opts
1020601b85cSAndrew Jones
1030601b85cSAndrew Jonescmdline="\`echo '$cmdline' | sed s%$kernel%_NO_FILE_4Uhere_%\`"
1040601b85cSAndrew Jonesif \$qemu \$cmdline 2>&1 | grep 'No accelerator found'; then
1050601b85cSAndrew Jones	ret=2
1060601b85cSAndrew Joneselse
1075e78b70dSAndrew Jones	MAX_SMP=\`getconf _NPROCESSORS_CONF\`
1085e78b70dSAndrew Jones	while \$qemu \$cmdline -smp \$MAX_SMP 2>&1 | grep 'exceeds max cpus' > /dev/null; do
1095e78b70dSAndrew Jones		MAX_SMP=\`expr \$MAX_SMP - 1\`
1105e78b70dSAndrew Jones	done
1115e78b70dSAndrew Jones
1120601b85cSAndrew Jones	cmdline="\`echo '$cmdline' | sed s%$kernel%\$bin%\`"
1132b30b764SAndrew Jones	\$qemu \$cmdline -smp $smp $opts
1142b30b764SAndrew Jones	ret=\$?
1150601b85cSAndrew Jonesfi
1162b30b764SAndrew Jonesecho Return value from qemu: \$ret
1172b30b764SAndrew Jonesif [ \$ret -le 1 ]; then
1182b30b764SAndrew Jones	echo PASS $testname 1>&2
1192b30b764SAndrew Joneselse
1202b30b764SAndrew Jones	echo FAIL $testname 1>&2
1212b30b764SAndrew Jonesfi
1222b30b764SAndrew Jonesrm -f \$bin
1232b30b764SAndrew Jonesexit 0
1242b30b764SAndrew JonesEOF
1252b30b764SAndrew Jonesfi
126*560cd30bSRadim Krčmář	exec 1<&$tmpfd {tmpfd}<&-
1272b30b764SAndrew Jones	chmod +x $standalone
128*560cd30bSRadim Krčmář
1292b30b764SAndrew Jones	return 0
1302b30b764SAndrew Jones}
1312b30b764SAndrew Jones
1322b30b764SAndrew Jonestrap 'rm -f $cfg; exit 1' HUP INT TERM
1332b30b764SAndrew Jonestrap 'rm -f $cfg' EXIT
1342b30b764SAndrew Jonescfg=$(mktemp)
1352b30b764SAndrew Jones
1362b30b764SAndrew Jonesif [ -n "$one_testname" ]; then
1372b30b764SAndrew Jones	if grep -q "\[$one_testname\]" $unittests; then
1382b30b764SAndrew Jones		sed -n "/\\[$one_testname\\]/,/^\\[/p" $unittests \
1392b30b764SAndrew Jones			| awk '!/^\[/ || NR == 1' > $cfg
1402b30b764SAndrew Jones	else
1412b30b764SAndrew Jones		echo "[$one_testname]" > $cfg
1422b30b764SAndrew Jones		echo "file = $one_kernel_base" >> $cfg
1432b30b764SAndrew Jones	fi
1442b30b764SAndrew Joneselse
1452b30b764SAndrew Jones	cp -f $unittests $cfg
1462b30b764SAndrew Jonesfi
1472b30b764SAndrew Jones
1482b30b764SAndrew Jonesfor_each_unittest $cfg mkstandalone
149