On Wed, Jun 25, 2025 at 04:48:00PM +0100, Alexandru Elisei wrote:
> v3 can be found here [1]. Based on top of the series that add qemu_params and
> test_args [2].
> 
> To goal is to allow the user to do:
> 
> $ ./configure --target=kvmtool
> $ make clean && make
> $ ./run_tests.sh
> 
> to run all the tests automatically with kvmtool.
> 
> Reasons to use kvmtool:
> 
> * kvmtool is smaller and a lot easier to modify compared to qemu, which
> means developers may prefer it when adding or prototyping new features to
> KVM, and being able to run all the tests reliably and automatically is very
> useful.
> 
> * kvmtool is faster to run the tests (a couple of times faster on
> my rockpro64), making for a quick turnaround. But do keep in mind that not
> all tests work on kvmtool because of missing features compared to qemu.
> 
> * kvmtool does things differently than qemu: different memory layout,
> different uart, PMU emulation is disabled by default, etc. This makes it a
> good testing vehicule for kvm-unit-tests itself.

Thanks for this Alex! I didn't test it on arm yet, but I did test it on
riscv with the quick patch below. It works great.

Applied to arm/queue

https://gitlab.com/jones-drew/kvm-unit-tests/-/commits/arm/queue

drew


diff --git a/README.md b/README.md
index 723ce04cd978..cbd8a9940ec4 100644
--- a/README.md
+++ b/README.md
@@ -65,8 +65,8 @@ or:
 
 to run them all.
 
-All tests can be run using QEMU. On arm and arm64, tests can also be run using
-kvmtool.
+All tests can be run using QEMU. On arm, arm64, riscv32, and riscv64 tests can
+also be run using kvmtool.
 
 By default the runner script searches for a suitable QEMU binary in the system.
 To select a specific QEMU binary though, specify the QEMU=path/to/binary
@@ -97,8 +97,7 @@ variable. kvmtool supports only kvm as the accelerator.
 
 Check [x86/efi/README.md](./x86/efi/README.md).
 
-On arm and arm64, this is only supported with QEMU; kvmtool cannot run the
-tests under UEFI.
+This is only supported with QEMU; kvmtool cannot run the tests under UEFI.
 
 # Tests configuration file
 
diff --git a/configure b/configure
index 470f9d7cdb3b..4a9af4e0af30 100755
--- a/configure
+++ b/configure
@@ -90,7 +90,7 @@ usage() {
                                   selects the best value based on the host 
system and the
                                   test configuration.
            --target=TARGET        target platform that the tests will be 
running on (qemu or
-                                  kvmtool, default is qemu) (arm/arm64 only)
+                                  kvmtool, default is qemu) (arm/arm64 and 
riscv32/riscv64 only)
            --cross-prefix=PREFIX  cross compiler prefix
            --cc=CC                c compiler to use ($cc)
            --cflags=FLAGS         extra options to be passed to the c compiler
@@ -284,7 +284,8 @@ fi
 if [ -z "$target" ]; then
     target="qemu"
 else
-    if [ "$arch" != "arm64" ] && [ "$arch" != "arm" ]; then
+    if [ "$arch" != "arm64" ] && [ "$arch" != "arm" ] &&
+       [ "$arch" != "riscv32" ] && [ "$arch" != "riscv64" ]; then
         echo "--target is not supported for $arch"
         usage
     fi
@@ -393,6 +394,10 @@ elif [ "$arch" = "riscv32" ] || [ "$arch" = "riscv64" ]; 
then
     testdir=riscv
     arch_libdir=riscv
     : "${uart_early_addr:=0x10000000}"
+    if [ "$target" != "qemu" ] && [ "$target" != "kvmtool" ]; then
+        echo "--target must be one of 'qemu' or 'kvmtool'!"
+        usage
+    fi
 elif [ "$arch" = "s390x" ]; then
     testdir=s390x
 else
@@ -519,7 +524,8 @@ EFI_DIRECT=$efi_direct
 CONFIG_WERROR=$werror
 GEN_SE_HEADER=$gen_se_header
 EOF
-if [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then
+if [ "$arch" = "arm" ] || [ "$arch" = "arm64" ] ||
+   [ "$arch" = "riscv32" ] || [ "$arch" = "riscv64" ]; then
     echo "TARGET=$target" >> config.mak
 fi
 
diff --git a/riscv/efi/run b/riscv/efi/run
index 5a72683a6ef5..b9b75440c659 100755
--- a/riscv/efi/run
+++ b/riscv/efi/run
@@ -11,6 +11,12 @@ if [ ! -f config.mak ]; then
 fi
 source config.mak
 source scripts/arch-run.bash
+source scripts/vmm.bash
+
+if [[ $(vmm_get_target) == "kvmtool" ]]; then
+       echo "kvmtool does not support EFI tests."
+       exit 2
+fi
 
 if [ -f RISCV_VIRT_CODE.fd ]; then
        DEFAULT_UEFI=RISCV_VIRT_CODE.fd
diff --git a/riscv/run b/riscv/run
index 0f000f0d82c6..3c242923412c 100755
--- a/riscv/run
+++ b/riscv/run
@@ -10,35 +10,75 @@ if [ -z "$KUT_STANDALONE" ]; then
        source scripts/vmm.bash
 fi
 
-# Allow user overrides of some config.mak variables
-mach=$MACHINE_OVERRIDE
-qemu_cpu=$TARGET_CPU_OVERRIDE
-firmware=$FIRMWARE_OVERRIDE
-
-: "${mach:=virt}"
-: "${qemu_cpu:=$TARGET_CPU}"
-: "${qemu_cpu:=$DEFAULT_QEMU_CPU}"
-: "${firmware:=$FIRMWARE}"
-[ "$firmware" ] && firmware="-bios $firmware"
-
-set_qemu_accelerator || exit $?
-[ "$ACCEL" = "kvm" ] && QEMU_ARCH=$HOST
-acc="-accel $ACCEL$ACCEL_PROPS"
-
-qemu=$(search_qemu_binary) || exit $?
-if [ "$mach" = 'virt' ] && ! $qemu -machine '?' | grep -q 'RISC-V VirtIO 
board'; then
-       echo "$qemu doesn't support mach-virt ('-machine virt'). Exiting."
-       exit 2
-fi
-mach="-machine $mach"
+vmm_check_supported
 
-command="$qemu -nodefaults -nographic -serial mon:stdio"
-command+=" $mach $acc $firmware -cpu $qemu_cpu "
-command="$(migration_cmd) $(timeout_cmd) $command"
+function arch_run_qemu()
+{
+       # Allow user overrides of some config.mak variables
+       mach=$MACHINE_OVERRIDE
+       qemu_cpu=$TARGET_CPU_OVERRIDE
+       firmware=$FIRMWARE_OVERRIDE
 
-if [ "$UEFI_SHELL_RUN" = "y" ]; then
-       ENVIRON_DEFAULT=n run_test_status $command "$@"
-else
-       # We return the exit code via stdout, not via the QEMU return code
-       run_test_status $command -kernel "$@"
-fi
+       : "${mach:=virt}"
+       : "${qemu_cpu:=$TARGET_CPU}"
+       : "${qemu_cpu:=$DEFAULT_QEMU_CPU}"
+       : "${firmware:=$FIRMWARE}"
+       [ "$firmware" ] && firmware="-bios $firmware"
+
+       set_qemu_accelerator || exit $?
+       [ "$ACCEL" = "kvm" ] && QEMU_ARCH=$HOST
+       acc="-accel $ACCEL$ACCEL_PROPS"
+
+       qemu=$(search_qemu_binary) || exit $?
+       if [ "$mach" = 'virt' ] && ! $qemu -machine '?' | grep -q 'RISC-V 
VirtIO board'; then
+               echo "$qemu doesn't support mach-virt ('-machine virt'). 
Exiting."
+               exit 2
+       fi
+       mach="-machine $mach"
+
+       command="$qemu -nodefaults -nographic -serial mon:stdio"
+       command+=" $mach $acc $firmware -cpu $qemu_cpu "
+       command="$(migration_cmd) $(timeout_cmd) $command"
+
+       if [ "$UEFI_SHELL_RUN" = "y" ]; then
+               ENVIRON_DEFAULT=n run_test_status $command "$@"
+       else
+               # We return the exit code via stdout, not via the QEMU return 
code
+               run_test_status $command -kernel "$@"
+       fi
+}
+
+function arch_run_kvmtool()
+{
+       local command
+
+       kvmtool=$(search_kvmtool_binary) ||
+               exit $?
+
+       if [ "$ACCEL" ] && [ "$ACCEL" != "kvm" ]; then
+               echo "kvmtool does not support $ACCEL" >&2
+               exit 2
+       fi
+
+       if ! kvm_available; then
+               echo "kvmtool requires KVM but not available on the host" >&2
+               exit 2
+       fi
+
+       command="$(timeout_cmd) $kvmtool run"
+       if [ "$HOST" = "riscv64" ] && [ "$ARCH" = "riscv32" ]; then
+               echo "Cannot run riscv32 on riscv64" >&2
+               exit 2
+       else
+               run_test_status $command --kernel "$@"
+       fi
+}
+
+case $(vmm_get_target) in
+qemu)
+       arch_run_qemu "$@"
+       ;;
+kvmtool)
+       arch_run_kvmtool "$@"
+       ;;
+esac

Reply via email to