1b2a2aa5dSAndrew Jones############################################################################## 2b2a2aa5dSAndrew Jones# run_qemu translates the ambiguous exit status in Table1 to that in Table2. 3b2a2aa5dSAndrew Jones# Table3 simply documents the complete status table. 4b2a2aa5dSAndrew Jones# 5b2a2aa5dSAndrew Jones# Table1: Before fixup 6b2a2aa5dSAndrew Jones# -------------------- 7b2a2aa5dSAndrew Jones# 0 - Unexpected exit from QEMU (possible signal), or the unittest did 8b2a2aa5dSAndrew Jones# not use debug-exit 9b2a2aa5dSAndrew Jones# 1 - most likely unittest succeeded, or QEMU failed 10b2a2aa5dSAndrew Jones# 11b2a2aa5dSAndrew Jones# Table2: After fixup 12b2a2aa5dSAndrew Jones# ------------------- 13b2a2aa5dSAndrew Jones# 0 - Everything succeeded 14b2a2aa5dSAndrew Jones# 1 - most likely QEMU failed 15b2a2aa5dSAndrew Jones# 16b2a2aa5dSAndrew Jones# Table3: Complete table 17b2a2aa5dSAndrew Jones# ---------------------- 18b2a2aa5dSAndrew Jones# 0 - SUCCESS 19b2a2aa5dSAndrew Jones# 1 - most likely QEMU failed 20b2a2aa5dSAndrew Jones# 2 - most likely a run script failed 21b2a2aa5dSAndrew Jones# 3 - most likely the unittest failed 22fd149358SAndrew Jones# 124 - most likely the unittest timed out 23b2a2aa5dSAndrew Jones# 127 - most likely the unittest called abort() 24b2a2aa5dSAndrew Jones# 1..127 - FAILURE (could be QEMU, a run script, or the unittest) 25b2a2aa5dSAndrew Jones# >= 128 - Signal (signum = status - 128) 26b2a2aa5dSAndrew Jones############################################################################## 27b2a2aa5dSAndrew Jonesrun_qemu () 28b2a2aa5dSAndrew Jones{ 298c3f0d96SAndrew Jones local stdout errors ret sig 30b2a2aa5dSAndrew Jones 31*b16df9eeSAndrew Jones initrd_create || return $? 32d76bf076SAndrew Jones echo -n "$@" 33*b16df9eeSAndrew Jones [ "$ENVIRON_DEFAULT" = "yes" ] && echo -n " #" 348b13a5b5SRadim Krčmář echo " $INITRD" 358b13a5b5SRadim Krčmář 36f0ca153cSRadim Krčmář # stdout to {stdout}, stderr to $errors and stderr 37b2a2aa5dSAndrew Jones exec {stdout}>&1 388b13a5b5SRadim Krčmář errors=$("${@}" $INITRD </dev/null 2> >(tee /dev/stderr) > /dev/fd/$stdout) 39b2a2aa5dSAndrew Jones ret=$? 40b2a2aa5dSAndrew Jones exec {stdout}>&- 418727c886SAndrew Jones 428727c886SAndrew Jones [ $ret -eq 134 ] && echo "QEMU Aborted" >&2 43b2a2aa5dSAndrew Jones 44b2a2aa5dSAndrew Jones if [ "$errors" ]; then 45b2a2aa5dSAndrew Jones sig=$(grep 'terminating on signal' <<<"$errors") 46b2a2aa5dSAndrew Jones if [ "$sig" ]; then 47b2a2aa5dSAndrew Jones sig=$(sed 's/.*terminating on signal \([0-9][0-9]*\).*/\1/' <<<"$sig") 48b2a2aa5dSAndrew Jones fi 49b2a2aa5dSAndrew Jones fi 50b2a2aa5dSAndrew Jones 51b2a2aa5dSAndrew Jones if [ $ret -eq 0 ]; then 52b2a2aa5dSAndrew Jones # Some signals result in a zero return status, but the 53b2a2aa5dSAndrew Jones # error log tells the truth. 54b2a2aa5dSAndrew Jones if [ "$sig" ]; then 55b2a2aa5dSAndrew Jones ((ret=sig+128)) 56b2a2aa5dSAndrew Jones else 57b2a2aa5dSAndrew Jones # Exiting with zero (non-debugexit) is an error 58b2a2aa5dSAndrew Jones ret=1 59b2a2aa5dSAndrew Jones fi 60b2a2aa5dSAndrew Jones elif [ $ret -eq 1 ]; then 61b2a2aa5dSAndrew Jones # Even when ret==1 (unittest success) if we also got stderr 62b2a2aa5dSAndrew Jones # logs, then we assume a QEMU failure. Otherwise we translate 63b2a2aa5dSAndrew Jones # status of 1 to 0 (SUCCESS) 64a51bab13SRadim Krčmář if [ -z "$(echo "$errors" | grep -vi warning)" ]; then 65b2a2aa5dSAndrew Jones ret=0 66b2a2aa5dSAndrew Jones fi 67b2a2aa5dSAndrew Jones fi 68b2a2aa5dSAndrew Jones 69b2a2aa5dSAndrew Jones return $ret 70b2a2aa5dSAndrew Jones} 71fd149358SAndrew Jones 72e0a8391eSRadim Krčmářrun_qemu_status () 73e0a8391eSRadim Krčmář{ 74e0a8391eSRadim Krčmář local stdout ret 75e0a8391eSRadim Krčmář 76e0a8391eSRadim Krčmář exec {stdout}>&1 77e0a8391eSRadim Krčmář lines=$(run_qemu "$@" > >(tee /dev/fd/$stdout)) 78e0a8391eSRadim Krčmář ret=$? 79e0a8391eSRadim Krčmář exec {stdout}>&- 80e0a8391eSRadim Krčmář 81e0a8391eSRadim Krčmář if [ $ret -eq 1 ]; then 82e0a8391eSRadim Krčmář testret=$(grep '^EXIT: ' <<<"$lines" | sed 's/.*STATUS=\([0-9][0-9]*\).*/\1/') 83e0a8391eSRadim Krčmář if [ "$testret" ]; then 84e0a8391eSRadim Krčmář if [ $testret -eq 1 ]; then 85e0a8391eSRadim Krčmář ret=0 86e0a8391eSRadim Krčmář else 87e0a8391eSRadim Krčmář ret=$testret 88e0a8391eSRadim Krčmář fi 89e0a8391eSRadim Krčmář fi 90e0a8391eSRadim Krčmář fi 91e0a8391eSRadim Krčmář 92e0a8391eSRadim Krčmář return $ret 93e0a8391eSRadim Krčmář} 94e0a8391eSRadim Krčmář 95fd149358SAndrew Jonestimeout_cmd () 96fd149358SAndrew Jones{ 97fd149358SAndrew Jones if [ "$TIMEOUT" ] && [ "$TIMEOUT" != "0" ]; then 98fd149358SAndrew Jones echo "timeout -k 1s --foreground $TIMEOUT" 99fd149358SAndrew Jones fi 100fd149358SAndrew Jones} 10137abdda9SThomas Huth 10237abdda9SThomas Huthqmp () 10337abdda9SThomas Huth{ 10437abdda9SThomas Huth echo '{ "execute": "qmp_capabilities" }{ "execute":' "$2" '}' | nc -U $1 10537abdda9SThomas Huth} 10637abdda9SThomas Huth 10737abdda9SThomas Huthrun_migration () 10837abdda9SThomas Huth{ 10937abdda9SThomas Huth if ! command -v nc >/dev/null 2>&1; then 110d76bf076SAndrew Jones echo "${FUNCNAME[0]} needs nc (netcat)" >&2 1119806f62dSAndrew Jones return 2 11237abdda9SThomas Huth fi 11337abdda9SThomas Huth 11437abdda9SThomas Huth migsock=`mktemp -u -t mig-helper-socket.XXXXXXXXXX` 11537abdda9SThomas Huth migout1=`mktemp -t mig-helper-stdout1.XXXXXXXXXX` 11637abdda9SThomas Huth qmp1=`mktemp -u -t mig-helper-qmp1.XXXXXXXXXX` 11737abdda9SThomas Huth qmp2=`mktemp -u -t mig-helper-qmp2.XXXXXXXXXX` 118ffd9da55SAndrew Jones fifo=`mktemp -u -t mig-helper-fifo.XXXXXXXXXX` 11937abdda9SThomas Huth qmpout1=/dev/null 12037abdda9SThomas Huth qmpout2=/dev/null 12137abdda9SThomas Huth 1229806f62dSAndrew Jones trap 'kill 0; exit 2' INT TERM 123ffd9da55SAndrew Jones trap 'rm -f ${migout1} ${migsock} ${qmp1} ${qmp2} ${fifo}' RETURN EXIT 12437abdda9SThomas Huth 1259806f62dSAndrew Jones eval "$@" -chardev socket,id=mon1,path=${qmp1},server,nowait \ 12637abdda9SThomas Huth -mon chardev=mon1,mode=control | tee ${migout1} & 12737abdda9SThomas Huth 128ffd9da55SAndrew Jones # We have to use cat to open the named FIFO, because named FIFO's, unlike 129ffd9da55SAndrew Jones # pipes, will block on open() until the other end is also opened, and that 130ffd9da55SAndrew Jones # totally breaks QEMU... 131ffd9da55SAndrew Jones mkfifo ${fifo} 1329806f62dSAndrew Jones eval "$@" -chardev socket,id=mon2,path=${qmp2},server,nowait \ 133ffd9da55SAndrew Jones -mon chardev=mon2,mode=control -incoming unix:${migsock} < <(cat ${fifo}) & 1349806f62dSAndrew Jones incoming_pid=`jobs -l %+ | awk '{print$2}'` 13537abdda9SThomas Huth 13637abdda9SThomas Huth # The test must prompt the user to migrate, so wait for the "migrate" keyword 13737abdda9SThomas Huth while ! grep -q -i "migrate" < ${migout1} ; do 13837abdda9SThomas Huth sleep 1 13937abdda9SThomas Huth done 14037abdda9SThomas Huth 14137abdda9SThomas Huth qmp ${qmp1} '"migrate", "arguments": { "uri": "unix:'${migsock}'" }' > ${qmpout1} 14237abdda9SThomas Huth 14337abdda9SThomas Huth # Wait for the migration to complete 14437abdda9SThomas Huth migstatus=`qmp ${qmp1} '"query-migrate"' | grep return` 14537abdda9SThomas Huth while ! grep -q '"completed"' <<<"$migstatus" ; do 14637abdda9SThomas Huth sleep 1 14737abdda9SThomas Huth migstatus=`qmp ${qmp1} '"query-migrate"' | grep return` 14837abdda9SThomas Huth if grep -q '"failed"' <<<"$migstatus" ; then 14937abdda9SThomas Huth echo "ERROR: Migration failed." >&2 15037abdda9SThomas Huth qmp ${qmp1} '"quit"'> ${qmpout1} 2>/dev/null 15137abdda9SThomas Huth qmp ${qmp2} '"quit"'> ${qmpout2} 2>/dev/null 1529806f62dSAndrew Jones return 2 15337abdda9SThomas Huth fi 15437abdda9SThomas Huth done 15537abdda9SThomas Huth qmp ${qmp1} '"quit"'> ${qmpout1} 2>/dev/null 156ffd9da55SAndrew Jones echo > ${fifo} 1579806f62dSAndrew Jones wait $incoming_pid 1589806f62dSAndrew Jones ret=$? 159394d1421SAndrew Jones 160394d1421SAndrew Jones while (( $(jobs -r | wc -l) > 0 )); do 161394d1421SAndrew Jones sleep 0.5 162394d1421SAndrew Jones done 163394d1421SAndrew Jones 1649806f62dSAndrew Jones return $ret 16537abdda9SThomas Huth} 16637abdda9SThomas Huth 16737abdda9SThomas Huthmigration_cmd () 16837abdda9SThomas Huth{ 16937abdda9SThomas Huth if [ "$MIGRATION" = "yes" ]; then 17037abdda9SThomas Huth echo "run_migration" 17137abdda9SThomas Huth fi 17237abdda9SThomas Huth} 173531326aeSBalamuruhan S 174531326aeSBalamuruhan Ssearch_qemu_binary () 175531326aeSBalamuruhan S{ 176531326aeSBalamuruhan S local save_path=$PATH 177232f404aSAndrew Jones local qemucmd qemu 178232f404aSAndrew Jones 179531326aeSBalamuruhan S export PATH=$PATH:/usr/libexec 180232f404aSAndrew Jones for qemucmd in ${QEMU:-qemu-system-$ARCH_NAME qemu-kvm}; do 181232f404aSAndrew Jones if $qemucmd --help 2>/dev/null | grep -q 'QEMU'; then 182232f404aSAndrew Jones qemu="$qemucmd" 183531326aeSBalamuruhan S break 184531326aeSBalamuruhan S fi 185531326aeSBalamuruhan S done 186531326aeSBalamuruhan S 187232f404aSAndrew Jones if [ -z "$qemu" ]; then 188fcf4e0d9SRadim Krčmář echo "A QEMU binary was not found." >&2 189fcf4e0d9SRadim Krčmář echo "You can set a custom location by using the QEMU=<path> environment variable." >&2 190fcf4e0d9SRadim Krčmář return 2 191531326aeSBalamuruhan S fi 192232f404aSAndrew Jones command -v $qemu 193531326aeSBalamuruhan S export PATH=$save_path 194531326aeSBalamuruhan S} 1954da0bc9aSAndrew Jones 1964da0bc9aSAndrew Jonesinitrd_create () 1974da0bc9aSAndrew Jones{ 198*b16df9eeSAndrew Jones if [ "$ENVIRON_DEFAULT" = "yes" ]; then 199*b16df9eeSAndrew Jones trap_exit_push 'rm -f $KVM_UNIT_TESTS_ENV; [ "$KVM_UNIT_TESTS_ENV_OLD" ] && export KVM_UNIT_TESTS_ENV="$KVM_UNIT_TESTS_ENV_OLD" || unset KVM_UNIT_TESTS_ENV; unset KVM_UNIT_TESTS_ENV_OLD' 200*b16df9eeSAndrew Jones [ -f "$KVM_UNIT_TESTS_ENV" ] && export KVM_UNIT_TESTS_ENV_OLD="$KVM_UNIT_TESTS_ENV" 201*b16df9eeSAndrew Jones export KVM_UNIT_TESTS_ENV=$(mktemp) 202*b16df9eeSAndrew Jones env_params 203*b16df9eeSAndrew Jones env_file 204*b16df9eeSAndrew Jones env_errata || return $? 205*b16df9eeSAndrew Jones fi 2068b13a5b5SRadim Krčmář 2074da0bc9aSAndrew Jones unset INITRD 20863dd93ecSAndrew Jones [ -f "$KVM_UNIT_TESTS_ENV" ] && INITRD="-initrd $KVM_UNIT_TESTS_ENV" 2098b13a5b5SRadim Krčmář 210*b16df9eeSAndrew Jones return 0 2114da0bc9aSAndrew Jones} 2128ec99569SAndrew Jones 213*b16df9eeSAndrew Jonesenv_add_params () 2148ec99569SAndrew Jones{ 215*b16df9eeSAndrew Jones local p 2168ec99569SAndrew Jones 217*b16df9eeSAndrew Jones for p in "$@"; do 218*b16df9eeSAndrew Jones if eval test -v $p; then 219*b16df9eeSAndrew Jones eval export "$p" 220*b16df9eeSAndrew Jones else 221*b16df9eeSAndrew Jones eval export "$p=" 222*b16df9eeSAndrew Jones fi 223*b16df9eeSAndrew Jones grep "^$p=" <(env) >>$KVM_UNIT_TESTS_ENV 2248ec99569SAndrew Jones done 225*b16df9eeSAndrew Jones} 226*b16df9eeSAndrew Jones 227*b16df9eeSAndrew Jonesenv_params () 228*b16df9eeSAndrew Jones{ 229*b16df9eeSAndrew Jones local qemu have_qemu 230*b16df9eeSAndrew Jones local _ rest 231*b16df9eeSAndrew Jones 232*b16df9eeSAndrew Jones qemu=$(search_qemu_binary) && have_qemu=1 233*b16df9eeSAndrew Jones 234*b16df9eeSAndrew Jones if [ "$have_qemu" ]; then 235*b16df9eeSAndrew Jones if [ -n "$ACCEL" ] || [ -n "$QEMU_ACCEL" ]; then 236*b16df9eeSAndrew Jones [ -n "$ACCEL" ] && QEMU_ACCEL=$ACCEL 237*b16df9eeSAndrew Jones fi 238*b16df9eeSAndrew Jones QEMU_VERSION_STRING="$($qemu -h | head -1)" 239*b16df9eeSAndrew Jones IFS='[ .]' read -r _ _ _ QEMU_MAJOR QEMU_MINOR QEMU_MICRO rest <<<"$QEMU_VERSION_STRING" 240*b16df9eeSAndrew Jones fi 241*b16df9eeSAndrew Jones env_add_params QEMU_ACCEL QEMU_VERSION_STRING QEMU_MAJOR QEMU_MINOR QEMU_MICRO 242*b16df9eeSAndrew Jones 243*b16df9eeSAndrew Jones KERNEL_VERSION_STRING=$(uname -r) 244*b16df9eeSAndrew Jones IFS=. read -r KERNEL_VERSION KERNEL_PATCHLEVEL rest <<<"$KERNEL_VERSION_STRING" 245*b16df9eeSAndrew Jones IFS=- read -r KERNEL_SUBLEVEL KERNEL_EXTRAVERSION <<<"$rest" 246*b16df9eeSAndrew Jones KERNEL_SUBLEVEL=${KERNEL_SUBLEVEL%%[!0-9]*} 247*b16df9eeSAndrew Jones KERNEL_EXTRAVERSION=${KERNEL_EXTRAVERSION%%[!0-9]*} 248*b16df9eeSAndrew Jones ! [[ $KERNEL_SUBLEVEL =~ ^[0-9]+$ ]] && unset $KERNEL_SUBLEVEL 249*b16df9eeSAndrew Jones ! [[ $KERNEL_EXTRAVERSION =~ ^[0-9]+$ ]] && unset $KERNEL_EXTRAVERSION 250*b16df9eeSAndrew Jones env_add_params KERNEL_VERSION_STRING KERNEL_VERSION KERNEL_PATCHLEVEL KERNEL_SUBLEVEL KERNEL_EXTRAVERSION 251*b16df9eeSAndrew Jones} 252*b16df9eeSAndrew Jones 253*b16df9eeSAndrew Jonesenv_file () 254*b16df9eeSAndrew Jones{ 255*b16df9eeSAndrew Jones local line var 256*b16df9eeSAndrew Jones 257*b16df9eeSAndrew Jones [ ! -f "$KVM_UNIT_TESTS_ENV_OLD" ] && return 258*b16df9eeSAndrew Jones 259*b16df9eeSAndrew Jones for line in $(grep -E '^[[:blank:]]*[[:alpha:]_][[:alnum:]_]*=' "$KVM_UNIT_TESTS_ENV_OLD"); do 260*b16df9eeSAndrew Jones var=${line%%=*} 261*b16df9eeSAndrew Jones if ! grep -q "^$var=" $KVM_UNIT_TESTS_ENV; then 262*b16df9eeSAndrew Jones eval export "$line" 263*b16df9eeSAndrew Jones grep "^$var=" <(env) >>$KVM_UNIT_TESTS_ENV 264*b16df9eeSAndrew Jones fi 265*b16df9eeSAndrew Jones done 266*b16df9eeSAndrew Jones} 267*b16df9eeSAndrew Jones 268*b16df9eeSAndrew Jonesenv_errata () 269*b16df9eeSAndrew Jones{ 270*b16df9eeSAndrew Jones if [ "$ERRATATXT" ] && [ ! -f "$ERRATATXT" ]; then 271*b16df9eeSAndrew Jones echo "$ERRATATXT not found. (ERRATATXT=$ERRATATXT)" >&2 272*b16df9eeSAndrew Jones return 2 273*b16df9eeSAndrew Jones elif [ "$ERRATATXT" ]; then 27470fcb64bSAndrew Jones env_generate_errata 2758ec99569SAndrew Jones fi 276*b16df9eeSAndrew Jones sort <(env | grep '^ERRATA_') <(grep '^ERRATA_' $KVM_UNIT_TESTS_ENV) | uniq -u >>$KVM_UNIT_TESTS_ENV 2778ec99569SAndrew Jones} 2788ec99569SAndrew Jones 27970fcb64bSAndrew Jonesenv_generate_errata () 28070fcb64bSAndrew Jones{ 28112a4328eSAndrew Jones local line commit minver errata rest v p s x have 28270fcb64bSAndrew Jones 2831ea4709cSAndrew Jones for line in $(grep -v '^#' "$ERRATATXT" | tr -d '[:blank:]' | cut -d: -f1,2); do 28470fcb64bSAndrew Jones commit=${line%:*} 28570fcb64bSAndrew Jones minver=${line#*:} 28670fcb64bSAndrew Jones 287171aa3a2SPeter Shier test -z "$commit" && continue 28870fcb64bSAndrew Jones errata="ERRATA_$commit" 289d1bc9395SAndrew Jones [ -n "${!errata}" ] && continue 29070fcb64bSAndrew Jones 291d38b111bSJim Mattson IFS=. read -r v p rest <<<"$minver" 292d38b111bSJim Mattson IFS=- read -r s x <<<"$rest" 29370fcb64bSAndrew Jones s=${s%%[!0-9]*} 29412a4328eSAndrew Jones x=${x%%[!0-9]*} 29512a4328eSAndrew Jones 29612a4328eSAndrew Jones if ! [[ $v =~ ^[0-9]+$ ]] || ! [[ $p =~ ^[0-9]+$ ]]; then 29712a4328eSAndrew Jones echo "Bad minimum kernel version in $ERRATATXT, $minver" 2989806f62dSAndrew Jones return 2 29912a4328eSAndrew Jones fi 30012a4328eSAndrew Jones ! [[ $s =~ ^[0-9]+$ ]] && unset $s 30112a4328eSAndrew Jones ! [[ $x =~ ^[0-9]+$ ]] && unset $x 30270fcb64bSAndrew Jones 303*b16df9eeSAndrew Jones if (( $KERNEL_VERSION > $v || 304*b16df9eeSAndrew Jones ($KERNEL_VERSION == $v && $KERNEL_PATCHLEVEL > $p) )); then 30570fcb64bSAndrew Jones have=y 306*b16df9eeSAndrew Jones elif (( $KERNEL_VERSION == $v && $KERNEL_PATCHLEVEL == $p )); then 307*b16df9eeSAndrew Jones if [ "$KERNEL_SUBLEVEL" ] && [ "$s" ]; then 308*b16df9eeSAndrew Jones if (( $KERNEL_SUBLEVEL > $s )); then 30970fcb64bSAndrew Jones have=y 310*b16df9eeSAndrew Jones elif (( $KERNEL_SUBLEVEL == $s )); then 311*b16df9eeSAndrew Jones if [ "$KERNEL_EXTRAVERSION" ] && [ "$x" ]; then 312*b16df9eeSAndrew Jones if (( $KERNEL_EXTRAVERSION >= $x )); then 31312a4328eSAndrew Jones have=y 31412a4328eSAndrew Jones else 31512a4328eSAndrew Jones have=n 31612a4328eSAndrew Jones fi 31712a4328eSAndrew Jones elif [ "$x" ] && (( $x != 0 )); then 31812a4328eSAndrew Jones have=n 31912a4328eSAndrew Jones else 32012a4328eSAndrew Jones have=y 32112a4328eSAndrew Jones fi 32270fcb64bSAndrew Jones else 32370fcb64bSAndrew Jones have=n 32470fcb64bSAndrew Jones fi 32570fcb64bSAndrew Jones elif [ "$s" ] && (( $s != 0 )); then 32670fcb64bSAndrew Jones have=n 32770fcb64bSAndrew Jones else 32870fcb64bSAndrew Jones have=y 32970fcb64bSAndrew Jones fi 33070fcb64bSAndrew Jones else 33170fcb64bSAndrew Jones have=n 33270fcb64bSAndrew Jones fi 33370fcb64bSAndrew Jones eval export "$errata=$have" 33470fcb64bSAndrew Jones done 33570fcb64bSAndrew Jones} 33670fcb64bSAndrew Jones 3378ec99569SAndrew Jonestrap_exit_push () 3388ec99569SAndrew Jones{ 3398ec99569SAndrew Jones local old_exit=$(trap -p EXIT | sed "s/^[^']*'//;s/'[^']*$//") 3408ec99569SAndrew Jones trap -- "$1; $old_exit" EXIT 3418ec99569SAndrew Jones} 342f4d99928SRadim Krčmář 343f4d99928SRadim Krčmářkvm_available () 344f4d99928SRadim Krčmář{ 345f4d99928SRadim Krčmář [ -c /dev/kvm ] || 346f4d99928SRadim Krčmář return 1 347f4d99928SRadim Krčmář 348f4d99928SRadim Krčmář [ "$HOST" = "$ARCH_NAME" ] || 349d76bf076SAndrew Jones ( [ "$HOST" = aarch64 ] && [ "$ARCH" = arm ] ) || 350d76bf076SAndrew Jones ( [ "$HOST" = x86_64 ] && [ "$ARCH" = i386 ] ) 351f4d99928SRadim Krčmář} 352f4d99928SRadim Krčmář 353f4d99928SRadim Krčmářget_qemu_accelerator () 354f4d99928SRadim Krčmář{ 355f4d99928SRadim Krčmář if [ "$ACCEL" = "kvm" ] && ! kvm_available; then 356f4d99928SRadim Krčmář echo "KVM is needed, but not available on this host" >&2 357f4d99928SRadim Krčmář return 2 358f4d99928SRadim Krčmář fi 359f4d99928SRadim Krčmář 360f4d99928SRadim Krčmář if [ "$ACCEL" ]; then 361f4d99928SRadim Krčmář echo $ACCEL 362f4d99928SRadim Krčmář elif kvm_available; then 363f4d99928SRadim Krčmář echo kvm 364f4d99928SRadim Krčmář else 365f4d99928SRadim Krčmář echo tcg 366f4d99928SRadim Krčmář fi 367f4d99928SRadim Krčmář} 368