xref: /kvm-unit-tests/riscv/run (revision 734fe13536d0fc41185723c63bde17ec6364fa1d)
177955fb5SAndrew Jones#!/usr/bin/env bash
277955fb5SAndrew Jones
377955fb5SAndrew Jonesif [ -z "$KUT_STANDALONE" ]; then
477955fb5SAndrew Jones	if [ ! -f config.mak ]; then
577955fb5SAndrew Jones		echo "run ./configure && make first. See ./configure -h"
677955fb5SAndrew Jones		exit 2
777955fb5SAndrew Jones	fi
877955fb5SAndrew Jones	source config.mak
977955fb5SAndrew Jones	source scripts/arch-run.bash
10db9c4e1cSAlexandru Elisei	source scripts/vmm.bash
1177955fb5SAndrew Jonesfi
1277955fb5SAndrew Jones
13*734fe135SAndrew Jonesvmm_check_supported
14*734fe135SAndrew Jones
15*734fe135SAndrew Jonesfunction arch_run_qemu()
16*734fe135SAndrew Jones{
1777955fb5SAndrew Jones	# Allow user overrides of some config.mak variables
18bc315beaSAndrew Jones	mach=$MACHINE_OVERRIDE
195f77b72dSJean-Philippe Brucker	qemu_cpu=$TARGET_CPU_OVERRIDE
2077955fb5SAndrew Jones	firmware=$FIRMWARE_OVERRIDE
2177955fb5SAndrew Jones
22bc315beaSAndrew Jones	: "${mach:=virt}"
235f77b72dSJean-Philippe Brucker	: "${qemu_cpu:=$TARGET_CPU}"
245f77b72dSJean-Philippe Brucker	: "${qemu_cpu:=$DEFAULT_QEMU_CPU}"
2577955fb5SAndrew Jones	: "${firmware:=$FIRMWARE}"
2677955fb5SAndrew Jones	[ "$firmware" ] && firmware="-bios $firmware"
2777955fb5SAndrew Jones
2877955fb5SAndrew Jones	set_qemu_accelerator || exit $?
2977955fb5SAndrew Jones	[ "$ACCEL" = "kvm" ] && QEMU_ARCH=$HOST
3077955fb5SAndrew Jones	acc="-accel $ACCEL$ACCEL_PROPS"
3177955fb5SAndrew Jones
3277955fb5SAndrew Jones	qemu=$(search_qemu_binary) || exit $?
33bc315beaSAndrew Jones	if [ "$mach" = 'virt' ] && ! $qemu -machine '?' | grep -q 'RISC-V VirtIO board'; then
3477955fb5SAndrew Jones		echo "$qemu doesn't support mach-virt ('-machine virt'). Exiting."
3577955fb5SAndrew Jones		exit 2
3677955fb5SAndrew Jones	fi
37bc315beaSAndrew Jones	mach="-machine $mach"
3877955fb5SAndrew Jones
3977955fb5SAndrew Jones	command="$qemu -nodefaults -nographic -serial mon:stdio"
405f77b72dSJean-Philippe Brucker	command+=" $mach $acc $firmware -cpu $qemu_cpu "
4177955fb5SAndrew Jones	command="$(migration_cmd) $(timeout_cmd) $command"
4277955fb5SAndrew Jones
43a755990cSAndrew Jones	if [ "$UEFI_SHELL_RUN" = "y" ]; then
44db9c4e1cSAlexandru Elisei		ENVIRON_DEFAULT=n run_test_status $command "$@"
4577955fb5SAndrew Jones	else
4677955fb5SAndrew Jones		# We return the exit code via stdout, not via the QEMU return code
47db9c4e1cSAlexandru Elisei		run_test_status $command -kernel "$@"
4877955fb5SAndrew Jones	fi
49*734fe135SAndrew Jones}
50*734fe135SAndrew Jones
51*734fe135SAndrew Jonesfunction arch_run_kvmtool()
52*734fe135SAndrew Jones{
53*734fe135SAndrew Jones	local command
54*734fe135SAndrew Jones
55*734fe135SAndrew Jones	if [ "$HOST" != "riscv32" ] && [ "$HOST" != "riscv64" ]; then
56*734fe135SAndrew Jones		echo "kvmtool requires KVM but the host ('$HOST') is not riscv" >&2
57*734fe135SAndrew Jones		exit 2
58*734fe135SAndrew Jones	fi
59*734fe135SAndrew Jones
60*734fe135SAndrew Jones	kvmtool=$(search_kvmtool_binary) ||
61*734fe135SAndrew Jones		exit $?
62*734fe135SAndrew Jones
63*734fe135SAndrew Jones	if [ "$ACCEL" ] && [ "$ACCEL" != "kvm" ]; then
64*734fe135SAndrew Jones		echo "kvmtool does not support $ACCEL" >&2
65*734fe135SAndrew Jones		exit 2
66*734fe135SAndrew Jones	fi
67*734fe135SAndrew Jones
68*734fe135SAndrew Jones	if ! kvm_available; then
69*734fe135SAndrew Jones		echo "kvmtool requires KVM but not available on the host" >&2
70*734fe135SAndrew Jones		exit 2
71*734fe135SAndrew Jones	fi
72*734fe135SAndrew Jones
73*734fe135SAndrew Jones	command="$(timeout_cmd) $kvmtool run"
74*734fe135SAndrew Jones	if ( [ "$HOST" = "riscv64" ] && [ "$ARCH" = "riscv32" ] ) ||
75*734fe135SAndrew Jones	   ( [ "$HOST" = "riscv32" ] && [ "$ARCH" = "riscv64" ] ); then
76*734fe135SAndrew Jones		echo "Cannot run guests with a different xlen than the host" >&2
77*734fe135SAndrew Jones		exit 2
78*734fe135SAndrew Jones	else
79*734fe135SAndrew Jones		run_test_status $command --kernel "$@"
80*734fe135SAndrew Jones	fi
81*734fe135SAndrew Jones}
82*734fe135SAndrew Jones
83*734fe135SAndrew Jonescase $(vmm_get_target) in
84*734fe135SAndrew Jonesqemu)
85*734fe135SAndrew Jones	arch_run_qemu "$@"
86*734fe135SAndrew Jones	;;
87*734fe135SAndrew Joneskvmtool)
88*734fe135SAndrew Jones	arch_run_kvmtool "$@"
89*734fe135SAndrew Jones	;;
90*734fe135SAndrew Jonesesac
91