kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [kvm-unit-tests PATCH 0/2] riscv: Add kvmtool support
@ 2025-07-04 15:12 Andrew Jones
  2025-07-04 15:12 ` [kvm-unit-tests PATCH 1/2] arm/arm64: Ensure proper host arch with kvmtool Andrew Jones
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Andrew Jones @ 2025-07-04 15:12 UTC (permalink / raw)
  To: kvm, kvmarm, kvm-riscv
  Cc: alexandru.elisei, cleger, jesse, jamestiotio, Atish Patra

The first patch is for arm's scripts. It adds a check that I found
useful on the riscv side. The second patch enables riscv to use
kvmtool too.

Andrew Jones (2):
  arm/arm64: Ensure proper host arch with kvmtool
  riscv: Add kvmtool support

 README.md     |   7 ++--
 arm/run       |   5 +++
 configure     |  12 ++++--
 riscv/efi/run |   6 +++
 riscv/run     | 110 +++++++++++++++++++++++++++++++++++---------------
 5 files changed, 101 insertions(+), 39 deletions(-)

-- 
2.49.0


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [kvm-unit-tests PATCH 1/2] arm/arm64: Ensure proper host arch with kvmtool
  2025-07-04 15:12 [kvm-unit-tests PATCH 0/2] riscv: Add kvmtool support Andrew Jones
@ 2025-07-04 15:12 ` Andrew Jones
  2025-07-07 15:10   ` Jesse Taube
  2025-07-08  3:41   ` Nutty Liu
  2025-07-04 15:12 ` [kvm-unit-tests PATCH 2/2] riscv: Add kvmtool support Andrew Jones
  2025-07-08  9:00 ` [kvm-unit-tests PATCH 0/2] " Andrew Jones
  2 siblings, 2 replies; 9+ messages in thread
From: Andrew Jones @ 2025-07-04 15:12 UTC (permalink / raw)
  To: kvm, kvmarm, kvm-riscv
  Cc: alexandru.elisei, cleger, jesse, jamestiotio, Atish Patra

When running on non-arm (e.g. an x86 machine) if the framework is
configured to use kvmtool then, unlike with QEMU, it can't work.

Signed-off-by: Andrew Jones <andrew.jones@linux.dev>
---
 arm/run | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/arm/run b/arm/run
index 9ee795ae424c..858333fce465 100755
--- a/arm/run
+++ b/arm/run
@@ -97,6 +97,11 @@ function arch_run_kvmtool()
 {
 	local command
 
+	if [ "$HOST" != "arm" ] && [ "$HOST" != "aarch64" ]; then
+		echo "kvmtool requires KVM but the host ('$HOST') is not arm" >&2
+		exit 2
+	fi
+
 	kvmtool=$(search_kvmtool_binary) ||
 		exit $?
 
-- 
2.49.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [kvm-unit-tests PATCH 2/2] riscv: Add kvmtool support
  2025-07-04 15:12 [kvm-unit-tests PATCH 0/2] riscv: Add kvmtool support Andrew Jones
  2025-07-04 15:12 ` [kvm-unit-tests PATCH 1/2] arm/arm64: Ensure proper host arch with kvmtool Andrew Jones
@ 2025-07-04 15:12 ` Andrew Jones
  2025-07-07 15:28   ` Jesse Taube
  2025-07-08  3:43   ` Nutty Liu
  2025-07-08  9:00 ` [kvm-unit-tests PATCH 0/2] " Andrew Jones
  2 siblings, 2 replies; 9+ messages in thread
From: Andrew Jones @ 2025-07-04 15:12 UTC (permalink / raw)
  To: kvm, kvmarm, kvm-riscv
  Cc: alexandru.elisei, cleger, jesse, jamestiotio, Atish Patra

arm/arm64 supports running tests with kvmtool as a first class citizen.
Most the code to do that is in the common scripts, so just add the riscv
specific bits needed to allow riscv to use kvmtool as a first class
citizen too.

Signed-off-by: Andrew Jones <andrew.jones@linux.dev>
---
 README.md     |   7 ++--
 configure     |  12 ++++--
 riscv/efi/run |   6 +++
 riscv/run     | 110 +++++++++++++++++++++++++++++++++++---------------
 4 files changed, 96 insertions(+), 39 deletions(-)

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..6d549d1ecb5b 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" != "arm" ] && [ "$arch" != "arm64" ] &&
+       [ "$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..7bcf235fb645 100755
--- a/riscv/run
+++ b/riscv/run
@@ -10,35 +10,81 @@ 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"
-
-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
+vmm_check_supported
+
+function arch_run_qemu()
+{
+	# 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"
+
+	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
+
+	if [ "$HOST" != "riscv32" ] && [ "$HOST" != "riscv64" ]; then
+		echo "kvmtool requires KVM but the host ('$HOST') is not riscv" >&2
+		exit 2
+	fi
+
+	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" ] ) ||
+	   ( [ "$HOST" = "riscv32" ] && [ "$ARCH" = "riscv64" ] ); then
+		echo "Cannot run guests with a different xlen than the host" >&2
+		exit 2
+	else
+		run_test_status $command --kernel "$@"
+	fi
+}
+
+case $(vmm_get_target) in
+qemu)
+	arch_run_qemu "$@"
+	;;
+kvmtool)
+	arch_run_kvmtool "$@"
+	;;
+esac
-- 
2.49.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [kvm-unit-tests PATCH 1/2] arm/arm64: Ensure proper host arch with kvmtool
  2025-07-04 15:12 ` [kvm-unit-tests PATCH 1/2] arm/arm64: Ensure proper host arch with kvmtool Andrew Jones
@ 2025-07-07 15:10   ` Jesse Taube
  2025-07-08  3:41   ` Nutty Liu
  1 sibling, 0 replies; 9+ messages in thread
From: Jesse Taube @ 2025-07-07 15:10 UTC (permalink / raw)
  To: Andrew Jones
  Cc: kvm, kvmarm, kvm-riscv, alexandru.elisei, cleger, jamestiotio,
	Atish Patra

On Fri, Jul 4, 2025 at 8:13 AM Andrew Jones <andrew.jones@linux.dev> wrote:
>
> When running on non-arm (e.g. an x86 machine) if the framework is
> configured to use kvmtool then, unlike with QEMU, it can't work.
>
> Signed-off-by: Andrew Jones <andrew.jones@linux.dev>

Reviewed-by: Jesse Taube <jesse@rivosinc.com>

> ---
>  arm/run | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/arm/run b/arm/run
> index 9ee795ae424c..858333fce465 100755
> --- a/arm/run
> +++ b/arm/run
> @@ -97,6 +97,11 @@ function arch_run_kvmtool()
>  {
>         local command
>
> +       if [ "$HOST" != "arm" ] && [ "$HOST" != "aarch64" ]; then
> +               echo "kvmtool requires KVM but the host ('$HOST') is not arm" >&2
> +               exit 2
> +       fi
> +
>         kvmtool=$(search_kvmtool_binary) ||
>                 exit $?
>
> --
> 2.49.0
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [kvm-unit-tests PATCH 2/2] riscv: Add kvmtool support
  2025-07-04 15:12 ` [kvm-unit-tests PATCH 2/2] riscv: Add kvmtool support Andrew Jones
@ 2025-07-07 15:28   ` Jesse Taube
  2025-07-07 17:44     ` Andrew Jones
  2025-07-08  3:43   ` Nutty Liu
  1 sibling, 1 reply; 9+ messages in thread
From: Jesse Taube @ 2025-07-07 15:28 UTC (permalink / raw)
  To: Andrew Jones
  Cc: kvm, kvmarm, kvm-riscv, alexandru.elisei, cleger, jamestiotio,
	Atish Patra

On Fri, Jul 4, 2025 at 8:13 AM Andrew Jones <andrew.jones@linux.dev> wrote:
>
> arm/arm64 supports running tests with kvmtool as a first class citizen.
> Most the code to do that is in the common scripts, so just add the riscv
> specific bits needed to allow riscv to use kvmtool as a first class
> citizen too.
>
> Signed-off-by: Andrew Jones <andrew.jones@linux.dev>

Reviewed-by: Jesse Taube <jesse@rivosinc.com>

> ---
>  README.md     |   7 ++--
>  configure     |  12 ++++--
>  riscv/efi/run |   6 +++
>  riscv/run     | 110 +++++++++++++++++++++++++++++++++++---------------
>  4 files changed, 96 insertions(+), 39 deletions(-)
>
> 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..6d549d1ecb5b 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" != "arm" ] && [ "$arch" != "arm64" ] &&
> +       [ "$arch" != "riscv32" ] && [ "$arch" != "riscv64" ]; then

Are there plans to add i386 and x86_64 too?

>          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..7bcf235fb645 100755
> --- a/riscv/run
> +++ b/riscv/run
> @@ -10,35 +10,81 @@ 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"
> -
> -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
> +vmm_check_supported
> +
> +function arch_run_qemu()
> +{
> +       # 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"
> +
> +       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
> +
> +       if [ "$HOST" != "riscv32" ] && [ "$HOST" != "riscv64" ]; then
> +               echo "kvmtool requires KVM but the host ('$HOST') is not riscv" >&2
> +               exit 2
> +       fi
> +
> +       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" ] ) ||
> +          ( [ "$HOST" = "riscv32" ] && [ "$ARCH" = "riscv64" ] ); then

Shouldn't there be a check like this on arm for when  [ "$HOST" =
"arm" ] && [ "$ARCH" = "aarch64" ]?

> +               echo "Cannot run guests with a different xlen than the host" >&2
> +               exit 2
> +       else
> +               run_test_status $command --kernel "$@"
> +       fi
> +}
> +
> +case $(vmm_get_target) in
> +qemu)
> +       arch_run_qemu "$@"
> +       ;;
> +kvmtool)
> +       arch_run_kvmtool "$@"
> +       ;;
> +esac
> --
> 2.49.0
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [kvm-unit-tests PATCH 2/2] riscv: Add kvmtool support
  2025-07-07 15:28   ` Jesse Taube
@ 2025-07-07 17:44     ` Andrew Jones
  0 siblings, 0 replies; 9+ messages in thread
From: Andrew Jones @ 2025-07-07 17:44 UTC (permalink / raw)
  To: Jesse Taube
  Cc: kvm, kvmarm, kvm-riscv, alexandru.elisei, cleger, jamestiotio,
	Atish Patra

On Mon, Jul 07, 2025 at 08:28:30AM -0700, Jesse Taube wrote:
> On Fri, Jul 4, 2025 at 8:13 AM Andrew Jones <andrew.jones@linux.dev> wrote:
> >
> > arm/arm64 supports running tests with kvmtool as a first class citizen.
> > Most the code to do that is in the common scripts, so just add the riscv
> > specific bits needed to allow riscv to use kvmtool as a first class
> > citizen too.
> >
> > Signed-off-by: Andrew Jones <andrew.jones@linux.dev>
> 
> Reviewed-by: Jesse Taube <jesse@rivosinc.com>

Thanks!

...
> >  else
> > -    if [ "$arch" != "arm64" ] && [ "$arch" != "arm" ]; then
> > +    if [ "$arch" != "arm" ] && [ "$arch" != "arm64" ] &&
> > +       [ "$arch" != "riscv32" ] && [ "$arch" != "riscv64" ]; then
> 
> Are there plans to add i386 and x86_64 too?

I don't have plans myself, at least not right now, but I think it'd be
good to do it, so it'd be great if somebody would write the patch and
do the testing.

...
> > +       command="$(timeout_cmd) $kvmtool run"
> > +       if ( [ "$HOST" = "riscv64" ] && [ "$ARCH" = "riscv32" ] ) ||
> > +          ( [ "$HOST" = "riscv32" ] && [ "$ARCH" = "riscv64" ] ); then
> 
> Shouldn't there be a check like this on arm for when  [ "$HOST" =
> "arm" ] && [ "$ARCH" = "aarch64" ]?

arm kvm has been long deprecated and removed from Linux so we should
actually remove any references to HOST==arm throughout the framework
too, since it can't happen (any more).

Thanks,
drew

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [kvm-unit-tests PATCH 1/2] arm/arm64: Ensure proper host arch with kvmtool
  2025-07-04 15:12 ` [kvm-unit-tests PATCH 1/2] arm/arm64: Ensure proper host arch with kvmtool Andrew Jones
  2025-07-07 15:10   ` Jesse Taube
@ 2025-07-08  3:41   ` Nutty Liu
  1 sibling, 0 replies; 9+ messages in thread
From: Nutty Liu @ 2025-07-08  3:41 UTC (permalink / raw)
  To: Andrew Jones, kvm, kvmarm, kvm-riscv
  Cc: alexandru.elisei, cleger, jesse, jamestiotio, Atish Patra

On 7/4/2025 11:12 PM, Andrew Jones wrote:
> When running on non-arm (e.g. an x86 machine) if the framework is
> configured to use kvmtool then, unlike with QEMU, it can't work.
>
> Signed-off-by: Andrew Jones <andrew.jones@linux.dev>
Reviewed-by: Nutty Liu <liujingqi@lanxincomputing.com>

Thanks,
Nutty
> ---
>   arm/run | 5 +++++
>   1 file changed, 5 insertions(+)
>
> diff --git a/arm/run b/arm/run
> index 9ee795ae424c..858333fce465 100755
> --- a/arm/run
> +++ b/arm/run
> @@ -97,6 +97,11 @@ function arch_run_kvmtool()
>   {
>   	local command
>   
> +	if [ "$HOST" != "arm" ] && [ "$HOST" != "aarch64" ]; then
> +		echo "kvmtool requires KVM but the host ('$HOST') is not arm" >&2
> +		exit 2
> +	fi
> +
>   	kvmtool=$(search_kvmtool_binary) ||
>   		exit $?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [kvm-unit-tests PATCH 2/2] riscv: Add kvmtool support
  2025-07-04 15:12 ` [kvm-unit-tests PATCH 2/2] riscv: Add kvmtool support Andrew Jones
  2025-07-07 15:28   ` Jesse Taube
@ 2025-07-08  3:43   ` Nutty Liu
  1 sibling, 0 replies; 9+ messages in thread
From: Nutty Liu @ 2025-07-08  3:43 UTC (permalink / raw)
  To: Andrew Jones, kvm, kvmarm, kvm-riscv
  Cc: alexandru.elisei, cleger, jesse, jamestiotio, Atish Patra

On 7/4/2025 11:12 PM, Andrew Jones wrote:
> arm/arm64 supports running tests with kvmtool as a first class citizen.
> Most the code to do that is in the common scripts, so just add the riscv
> specific bits needed to allow riscv to use kvmtool as a first class
> citizen too.
>
> Signed-off-by: Andrew Jones <andrew.jones@linux.dev>
Reviewed-by: Nutty Liu <liujingqi@lanxincomputing.com>

Thanks,
Nutty
> ---
>   README.md     |   7 ++--
>   configure     |  12 ++++--
>   riscv/efi/run |   6 +++
>   riscv/run     | 110 +++++++++++++++++++++++++++++++++++---------------
>   4 files changed, 96 insertions(+), 39 deletions(-)
>
> 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..6d549d1ecb5b 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" != "arm" ] && [ "$arch" != "arm64" ] &&
> +       [ "$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..7bcf235fb645 100755
> --- a/riscv/run
> +++ b/riscv/run
> @@ -10,35 +10,81 @@ 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"
> -
> -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
> +vmm_check_supported
> +
> +function arch_run_qemu()
> +{
> +	# 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"
> +
> +	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
> +
> +	if [ "$HOST" != "riscv32" ] && [ "$HOST" != "riscv64" ]; then
> +		echo "kvmtool requires KVM but the host ('$HOST') is not riscv" >&2
> +		exit 2
> +	fi
> +
> +	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" ] ) ||
> +	   ( [ "$HOST" = "riscv32" ] && [ "$ARCH" = "riscv64" ] ); then
> +		echo "Cannot run guests with a different xlen than the host" >&2
> +		exit 2
> +	else
> +		run_test_status $command --kernel "$@"
> +	fi
> +}
> +
> +case $(vmm_get_target) in
> +qemu)
> +	arch_run_qemu "$@"
> +	;;
> +kvmtool)
> +	arch_run_kvmtool "$@"
> +	;;
> +esac

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [kvm-unit-tests PATCH 0/2] riscv: Add kvmtool support
  2025-07-04 15:12 [kvm-unit-tests PATCH 0/2] riscv: Add kvmtool support Andrew Jones
  2025-07-04 15:12 ` [kvm-unit-tests PATCH 1/2] arm/arm64: Ensure proper host arch with kvmtool Andrew Jones
  2025-07-04 15:12 ` [kvm-unit-tests PATCH 2/2] riscv: Add kvmtool support Andrew Jones
@ 2025-07-08  9:00 ` Andrew Jones
  2 siblings, 0 replies; 9+ messages in thread
From: Andrew Jones @ 2025-07-08  9:00 UTC (permalink / raw)
  To: kvm, kvmarm, kvm-riscv
  Cc: alexandru.elisei, cleger, jesse, jamestiotio, Atish Patra

On Fri, Jul 04, 2025 at 05:12:55PM +0200, Andrew Jones wrote:
> The first patch is for arm's scripts. It adds a check that I found
> useful on the riscv side. The second patch enables riscv to use
> kvmtool too.
> 
> Andrew Jones (2):
>   arm/arm64: Ensure proper host arch with kvmtool
>   riscv: Add kvmtool support
> 
>  README.md     |   7 ++--
>  arm/run       |   5 +++
>  configure     |  12 ++++--
>  riscv/efi/run |   6 +++
>  riscv/run     | 110 +++++++++++++++++++++++++++++++++++---------------
>  5 files changed, 101 insertions(+), 39 deletions(-)
> 
> -- 
> 2.49.0

Merged.


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2025-07-08  9:00 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-04 15:12 [kvm-unit-tests PATCH 0/2] riscv: Add kvmtool support Andrew Jones
2025-07-04 15:12 ` [kvm-unit-tests PATCH 1/2] arm/arm64: Ensure proper host arch with kvmtool Andrew Jones
2025-07-07 15:10   ` Jesse Taube
2025-07-08  3:41   ` Nutty Liu
2025-07-04 15:12 ` [kvm-unit-tests PATCH 2/2] riscv: Add kvmtool support Andrew Jones
2025-07-07 15:28   ` Jesse Taube
2025-07-07 17:44     ` Andrew Jones
2025-07-08  3:43   ` Nutty Liu
2025-07-08  9:00 ` [kvm-unit-tests PATCH 0/2] " Andrew Jones

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).