On Mon, Jan 20, 2025 at 04:43:08PM +0000, Alexandru Elisei wrote:
> Add two new functions, search_kvmtool_binary(), which, like the name
> suggests, searches for the location of the kvmtool binary, and
> run_kvmtool(), which runs a test with kvmtool as the VMM.
> 
> initrd_create() has also been modified to use the kvmtool syntax for
> supplying an initrd, which is --initrd (two dashes instead of the single
> dash that qemu uses).
> 
> arm/run does not know how to use these functions yet, but this will be
> added in a subsequent patch.
> 
> Signed-off-by: Alexandru Elisei <alexandru.eli...@arm.com>
> ---
>  scripts/arch-run.bash | 94 +++++++++++++++++++++++++++++++++++++------
>  1 file changed, 81 insertions(+), 13 deletions(-)
> 
> diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
> index d6eaf0ee5f09..34f633cade01 100644
> --- a/scripts/arch-run.bash
> +++ b/scripts/arch-run.bash
> @@ -75,16 +75,47 @@ run_qemu ()
>       return $ret
>  }
>  
> +run_kvmtool ()
> +{
> +     local stdout errors ret sig
> +
> +     initrd_create || return $?
> +
> +     echo -n "$@"
> +     [ "$ENVIRON_DEFAULT" = "yes" ] && echo -n " #"
> +     echo " $INITRD"
> +
> +     # stdout to {stdout}, stderr to $errors and stderr
> +     exec {stdout}>&1
> +     "${@}" $INITRD </dev/null 2> >(tee /dev/stderr) > /dev/fd/$stdout
> +     ret=$?
> +     exec {stdout}>&-
> +
> +     return $ret
> +}

It seems like run_qemu should mostly apply to kvmtool since kvmtool could
also terminate on a signal, like the timeout SIGALRM. Maybe we should try
to get them to use the same thing and name it run_test()? Or at least we
can factor out the common parts to avoid duplication.

> +
>  run_test_status ()
>  {
> -     local stdout ret
> +     local stdout ret ret_success
>  
>       exec {stdout}>&1
> -     lines=$(run_qemu "$@" > >(tee /dev/fd/$stdout))
> +
> +     # For qemu, an exit status of 1 means that the test completed. For 
> kvmtool,
> +     # 0 means the same thing.
> +     case "$TARGET" in
> +     qemu)
> +             ret_success=1
> +             lines=$(run_qemu "$@" > >(tee /dev/fd/$stdout))
> +             ;;
> +     kvmtool)
> +             ret_success=0
> +             lines=$(run_kvmtool "$@" > >(tee /dev/fd/$stdout))
> +             ;;
> +     esac
>       ret=$?
>       exec {stdout}>&-
>  
> -     if [ $ret -eq 1 ]; then
> +     if [ $ret -eq $ret_success ]; then
>               testret=$(grep '^EXIT: ' <<<"$lines" | head -n1 | sed 
> 's/.*STATUS=\([0-9][0-9]*\).*/\1/')
>               if [ "$testret" ]; then
>                       if [ $testret -eq 1 ]; then
> @@ -422,6 +453,25 @@ search_qemu_binary ()
>       export PATH=$save_path
>  }
>  
> +search_kvmtool_binary ()
> +{
> +     local kvmtoolcmd kvmtool
> +
> +     for kvmtoolcmd in lkvm vm lkvm-static; do
> +             if $kvmtoolcmd --help 2>/dev/null| grep -q 'The most commonly 
> used'; then
> +                     kvmtool="$kvmtoolcmd"
> +                     break
> +             fi
> +     done
> +
> +     if [ -z "$kvmtool" ]; then
> +             echo "A kvmtool binary was not found." >&2

Do we want to support a KVMTOOL environment variable analogous to $QEMU?
If so we can also add the help text that search_qemu_binary() has here.

> +             return 2
> +     fi
> +
> +     command -v $kvmtool
> +}
> +
>  initrd_cleanup ()
>  {
>       rm -f $KVM_UNIT_TESTS_ENV
> @@ -447,7 +497,18 @@ initrd_create ()
>       fi
>  
>       unset INITRD
> -     [ -f "$KVM_UNIT_TESTS_ENV" ] && INITRD="-initrd $KVM_UNIT_TESTS_ENV"
> +     if [ ! -f "$KVM_UNIT_TESTS_ENV" ]; then
> +             return 0
> +     fi
> +
> +     case "$TARGET" in
> +             qemu)
> +                     INITRD="-initrd $KVM_UNIT_TESTS_ENV"
> +                     ;;
> +             kvmtool)
> +                     INITRD="--initrd $KVM_UNIT_TESTS_ENV"
> +                     ;;
> +     esac

vmm_opts[qemu,initrd]='-initrd'
vmm_opts[kvmtool,initrd]='--initrd'

>  
>       return 0
>  }
> @@ -471,18 +532,25 @@ env_params ()
>       local qemu have_qemu
>       local _ rest
>  
> -     qemu=$(search_qemu_binary) && have_qemu=1
> +     env_add_params TARGET
> +
> +     # kvmtool's versioning has been broken since it was split from the 
> kernel
> +     # source.
> +     if [ "$TARGET" = "qemu" ]; then
> +             qemu=$(search_qemu_binary) && have_qemu=1
>  
> -     if [ "$have_qemu" ]; then
> -             if [ -n "$ACCEL" ] || [ -n "$QEMU_ACCEL" ]; then
> -                     [ -n "$ACCEL" ] && QEMU_ACCEL=$ACCEL
> +             if [ "$have_qemu" ]; then
> +                     if [ -n "$ACCEL" ] || [ -n "$QEMU_ACCEL" ]; then
> +                             [ -n "$ACCEL" ] && QEMU_ACCEL=$ACCEL
> +                     fi
> +                     QEMU_VERSION_STRING="$($qemu -h | head -1)"
> +                     # Shellcheck does not see QEMU_MAJOR|MINOR|MICRO are 
> used
> +                     # shellcheck disable=SC2034
> +                     IFS='[ .]' read -r _ _ _ QEMU_MAJOR QEMU_MINOR 
> QEMU_MICRO rest <<<"$QEMU_VERSION_STRING"
>               fi
> -             QEMU_VERSION_STRING="$($qemu -h | head -1)"
> -             # Shellcheck does not see QEMU_MAJOR|MINOR|MICRO are used
> -             # shellcheck disable=SC2034
> -             IFS='[ .]' read -r _ _ _ QEMU_MAJOR QEMU_MINOR QEMU_MICRO rest 
> <<<"$QEMU_VERSION_STRING"
> +
> +             env_add_params QEMU_ACCEL QEMU_VERSION_STRING QEMU_MAJOR 
> QEMU_MINOR QEMU_MICRO
>       fi
> -     env_add_params QEMU_ACCEL QEMU_VERSION_STRING QEMU_MAJOR QEMU_MINOR 
> QEMU_MICRO
>  
>       KERNEL_VERSION_STRING=$(uname -r)
>       IFS=. read -r KERNEL_VERSION KERNEL_PATCHLEVEL rest 
> <<<"$KERNEL_VERSION_STRING"
> -- 
> 2.47.1
>

Thanks,
drew

Reply via email to