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
+}
+
 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
+               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
 
        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


Reply via email to