#!/bin/bash
export STANDALONE=yes
export ENVIRON_DEFAULT=yes
export HOST=$(uname -m | sed -e 's/i.86/i386/;s/arm.*/arm/;s/ppc64.*/ppc64/')
export PRETTY_PRINT_STACKS=no
export ARCH=arm
export ARCH_NAME=arm
export PROCESSOR=cortex-a15
echo BUILD_HEAD=
trap 'rm -f $cleanup' EXIT
ERRATATXT=`mktemp`
cleanup="$ERRATATXT $cleanup"
base64 -d << 'BIN_EOF' | zcat > $ERRATATXT || exit 2
H4sICIvjOl4AA2VycmF0YS50eHQAvZE/b8IwEMX3fIqTMtPWTnAabwywtF27Ro45iEXOifwnIt++
VoFKRS1VF9769O737i5ffJdc3NZf/k/KctADkQlwlgQy1lAkOKCz2MOVJPhIpNyckoxDh0fYmr0J
PjkTOm8Gex25JLP8HgvVWOwqxWtRl0+nwuVD/Uulk68ciVLCy/ubhJGihI05wmrldFdw0LPuMd0o
2oAOlNbofVa1oi1FwZh6Xl4YjN1ifA5PoMczbE2xVwEhdAjrVwZjN3sIhhLD4d74BPOZ0JVabjVy
3hZfGP4fzC5t4lTqDMbCYaJm9No0kx5jM9j7/OMDNZHCJsYCAAA=
BIN_EOF
chmod +x $ERRATATXT
export ERRATATXT
bin=`mktemp`
cleanup="$bin $cleanup"
base64 -d << 'BIN_EOF' | zcat > $bin || exit 2
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
9zTzgHzvEd3ba/sXLCveX2Jsd5gnv909Ur5B2k+g2QuoT5Eqfzva5a79SfukiTqW81st3vzc8hTG
Ts974xbm8zZp0CD30ZM0qqfugL0ZNbx99hqBJ5Yodpcmi+Xegfw2PWNjrk/zW01XcC2Sc3JdjX3A
9HRdGHxMe/WcyYXHqqD7ub5p0iyvnNz/+M9c7z3Zuz7nOx5disCTjF+V3+gF/1cDt/xWPOPF0H5L
B77p/laFtJ+us2+kvznxoJUX/wdL6742ze8g0idGG9T/fnwvdODbKJu/frIA8iAfcgBjknnSh4b8
0oCpt4A/5Y2XluP3ck04/D4w4wCoL2S8Gtf/gkfGpHZZpMtElNFouD8t4v+Qpt22auxVwX/lngaJ
iW4ZdZbh7atG247l+gn3+7DQDinuAVgtxxFlii/DxDXaWmQXYw7NW1tM/PL7H3amt6kE97hPLNrx
y67XD4KgE/co+rrm4d7qeLrvHOF9a/V3RjA9GzDXitpS2rD/fOEZklaFsxa/W7hy9bu0PXeV8N16
jXg17i0F/p8D/PyeXxfKzPXKxP2W7a1HvlLt61OBPP3ycZ/G12zvHUuVZbXTb2+eVhaMt4seVHDz
kdc+qd8Gpyt/kzl6A46ncXwVx204foXjThwP/OZ0+FzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzK
pVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzK
pVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzK
pVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpVzKpf8n07p4i2iJrxOxFauNLc1t7S2tm+YZ05vE
la0Gb61v3bypqdLoaG7vMNq/2hKPNzddeOGFRULEN26W77RsjG9o3ti8qaO5bdayamNda1PzrHV4
CdftQDR1a8WU6eumnD8Lv2YBrVjcuqmjrXWD0dZ8U0s7gFiG2ubGJmP6hg1NRsfNzZvkL2YhVrRu
au1o3dSyrnHDhluNlk3r2pob21s23WSsu3XdhmZDZsP3F9/cvO6rvL++tc1YHFu2YLr3fsum9o62
dmOeB99uqvNsw6uCmF7VNI/vG9OrkKUQRd5zA7l6ubFewFsO4KLNm5q3xpvXdTQ3ZWePeqxrbtnS
3EQYo3HLTQumzyQyY3o7fl2EX7i/mPCzZGk2r+sAhY22RpzEktraRfWL1l6xsnbxEpYjvnHdOlDn
kir8riOxWafNm9ob1zcb/c9kW1xo1DV3GOr9S5svWv+FxjmXXnJplbngVqOj1Wje1HjjhuYLiXMY
GLFs05bGDS1NANvS0ta6ibU0tjS2tfAltFk7abPOuMCYbcw0zmvd3HG9eYOxYIFx+bIr6+pr19Zd
R7wbWm6cFW9r2dSx/sJ1vJ7ePm960zyjsb29ua3DWN/YsqG5ycc1vV0Ic/aci6ouvuQLcy9tvHFd
U/P6a2KL6urw7IpFy5bz/bqaZTGFx+D5GvVAgYkNYIz5RnvLbc2t6yvibc3rW7Y2t5/vlaOtOd7a
1jF6OcjUxmULjOm3bWaRRDlZo6Ot4jwf1/XtHY1tHTdUGrHaJVcsu2Zt9ZLly1Ysq19Se/4oOGPy
ZWPK9PYp4IdNHY1oZKOpeUPLxhbwtjFlnjEFuS278oqVrFXd6hUrFtVeK4vCVgRZRCUvsniL2De3
NfOR92yYJ/K+6o2EW3T5ytp6ZFBYV79occ08YUSnb9gq+VqexCYc69eDv9ahL1w/f7o5d8PWy24w
kDa0Db0Tb29D+Xhd1B431E/DaMn6vb7/N+rWNtvsf9B26QBQ29wBoLYvZN2/JOv3xVm/q7LgL8q6
Pyfr9+ys3+YA/BUbGm9iA7cbxrLaVe1GK39dscz/tQIySXKikj3yPaCoV/wuL6oXLfZ+ok6rN93c
uKkJjQzir2uOyx4LildMbz9f8s6S/rvr2xo3NvfLsvZ5ReAVg+IK736tpeNmiNR1Ha1tEEh8sfqK
RbX9FUCWV9TV9tdh2eBny7KfgVEFxLBo37JOxBtvlDKvSZ0bm5raUMp4Bxq5pe0Wsb7lFrG6bknt
2jmXCJCAJwGiyHPdVYvleXVNlTpfrM6XqPMX1HmuOl+qzrNN/sB5tjrPUeeL1LlKnSVCmf9Fc2T+
OMn8eWb+PDN/73yxOl8iz4sur1fXc9X5UnVG/vix+spq/3qOvGb+3lkirLu2Tj5/Iy8QfRvHYRzv
4jiO4ySOUH4gGsExHsckHNNwVOKowjEfRzWO5TjqcazB0YRjA44OHF/H0YVjF469OB7B8QSOp3H8
AMdzOF7AcZD3kdeTOJ7G8QyOZ3GkcBzEcQhHU+taj8HW9vOXqF2yeHVt3bKrlhiyExtXL1peU15e
LvkNwvomT0rPX2DEFn1pydq6Zdct8WTflo3gttZ1Uvjd2NjebJQvgAaIG1//uhFvvKl5rXy6tmVT
S0cL0NzW3FRxvmhs21gZ32DOnk3Z0D77kosvNhuZTxt0CkSkyZf5GzJ/5hXV9WuhQ9ZeubL+ipVo
AF/2A8esllZP5irYz3yPEnNx68Y4lB96nrEZ8lbqWmlkQONS/UN6bmlZ12x0tDU3VxqNN0KwQwt6
CtvPh7iUJtjQuumm83lzLjMvr4jffGv7WvYJ47LLjIvmnC9m3dy6sXlW442bWzY0zWqLb/R+XL56
2fLqWV/dsnHmZlBmphTGM2dfaF5wU0vHhXPMOSb+Lr7w4i984dKmS8xZsr7tG2fe1Lypua1lHet9
M8tw9aLaK5dd+aV5RnNjGwwUqQ6N9s1xaiNjY+OtsnJfa2376oXGFbKKssaNHcb0eKVx4+YO9Z5s
tpZ23EUlCWLK9kLbtK2FaGk3LkOVfZq3N3dsjoPsyGxjY9utFzYDbbmiSXnFxuaNF0o9Zpxn/E1s
KfrDikV1Necb550H2sinhJ9pzD5/MMCI9JRlU6SErbgZOvjK2rWLY6vrRtW1V27eeCP0H15olzK0
uakdBNnasnHzRp9AzRSoTedLQ2xwivJfQF2sXQsbpWNtR+taNm1Fe1yWrj2ezYcbN26WjDhyeRZ1
dDRvjJOTaB41tbRT9BsrYL9KKb2pddPMliYaex23opzUqwbIuO6rRaIcyNd69hS6DokypERkNlkm
/oCOvalprbSuKmbg5/mw6QauN/K6o7n/uqP5fOGVkqW6sRXcAspO9whDu1FebJaZEyLe+jUQtXX9
eqOiua0Nti7MGQIOhWtqNdpvhULaOBIsbYP5Cy4z1MXAb/S+xiYIjK/iRwdUl1RbA7y3MS7pXI52
Xdu6aUPLpuYK/Dx/dLvLQ9y4AcZ7061eLVs3rWsu8vipXMkN/DbXUnO2r22BZBwF39WNLbIhoX6B
2qw0vnZzy7qb2YE2o0hfbd4gTWAiudBYth4yBU/4hyHJpiY2LKTIkNwWzB4iZ2V/ybo0si7Ye873
aCJlK7nAk4Oys8yn+F1Lm114wohA8yAXb9kMKdPctGD61A3Q8R5C7+L8SmNTs//EkwzrIf686wuJ
z3/ko/aui7JlUHZmGLwRgbGh9SYY+R1tLc3tlTBLNoHRDfZwcBEfSWiORDa1SwE7gMLYCAnEztpf
bY7lVJZiujn7Evyeqc7G9dPbb+AD6H0p56+oXbKkn55ZtOyno6JhBcY2uEKbeGIH8smYPqDg+mV9
Fq2h0j7LzicWCl7CeuWXT+JFUsYNl8HIuOQbwyCbKikhn/qKr2IzOCze0ba243yWgDpQPj/90QUe
2suG3P+sOqnXWjFKX7+h9WusEu6poojWtia0av8IaQhlZxhzB/E3tLwC3NKKgeAMqSFa2tdKCbO2
df3aOQMMn8XrIL3XDq3xdr7RfzHzMpRQviHHsTimSsO0vX3mumb0MlwzP3UBpSYA39p2K+xYqe7X
dtwabxazqC+kT2Izft/c2t68SVBeNLbdJMdD7R1NGI3OhP1wM8q0afPWyuw7Qt2j7mxrminV4JB7
EAD+WLJ8FNvGKxMtEI/XZuGouFaLhm/Qoi2b4ptpeCNb+WN60y1i3c1t0oTAe9LG4YHe9nm0YQvU
baNBhdHSOhMjxPbWDc1Fvi00AMfySSgICYgJQJglgehcHMC9VuFWVgHkzOb1LP+Vq5cv92xAid4r
q6qb7DdbbmEjSZRZcDM3blTAlMgbKrZsXAvkMy+T0usC46pltfXLVq5dsQL/Vq1esnrJ2itXr4CV
cM355JpNmz0+HSiskSXcpXFSLg2aBexwLIPMs5J5ik0ciPkGprwY3lL0StRfRV5LzGu33CKWt2jR
J3FE/0qLxj0rWrWxf4X2AieiCJJn1vXbmxh/tWyBljduvNW4rbmtVdnW0Gtx2A/rNzRK2ibbM7c/
88x3Ekc6MrdruH5iaiAaezkQjc/Qos+dr0WFLs2SwmcrAtJOyeRSLuVSLuVSLuVSLuVSLuVSLuVS
LuXS/2+Tdtq0xX8u8f0HV2jSh2Dg+PrUQDR+lRbdUK98DKWef+H/AjEQXH+gIwEA
BIN_EOF
chmod +x $bin
RUNTIME_arch_run=`mktemp`
cleanup="$RUNTIME_arch_run $cleanup"
base64 -d << 'BIN_EOF' | zcat > $RUNTIME_arch_run || exit 2
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
BIN_EOF
chmod +x $RUNTIME_arch_run
exec {stdout}>&1
RUNTIME_log_stdout () { cat >&$stdout; }
RUNTIME_log_stderr () { cat >&2; }
: "${RUNTIME_arch_run?}"
: ${MAX_SMP:=$(getconf _NPROCESSORS_ONLN)}
: ${TIMEOUT:=90s}

PASS() { echo -ne "\e[32mPASS\e[0m"; }
SKIP() { echo -ne "\e[33mSKIP\e[0m"; }
FAIL() { echo -ne "\e[31mFAIL\e[0m"; }

extract_summary()
{
    local cr=$'\r'
    tail -3 | grep '^SUMMARY: ' | sed 's/^SUMMARY: /(/;s/'"$cr"'\{0,1\}$/)/'
}

# We assume that QEMU is going to work if it tried to load the kernel
premature_failure()
{
    local log="$(eval $(get_cmdline _NO_FILE_4Uhere_) 2>&1)"

    echo "$log" | grep "_NO_FILE_4Uhere_" |
        grep -q -e "could not \(load\|open\) kernel" -e "error loading" &&
        return 1

    RUNTIME_log_stderr <<< "$log"

    echo "$log"
    return 0
}

get_cmdline()
{
    local kernel=$1
    echo "TESTNAME=$testname TIMEOUT=$timeout ACCEL=$accel $RUNTIME_arch_run $kernel -smp $smp $opts"
}

skip_nodefault()
{
    [ "$run_all_tests" = "yes" ] && return 1
    [ "$STANDALONE" != "yes" ] && return 0

    while true; do
        read -r -p "Test marked not to be run by default, are you sure (y/N)? " yn
        case $yn in
            "Y" | "y" | "Yes" | "yes")
                return 1
                ;;
            "" | "N" | "n" | "No" | "no" | "q" | "quit" | "exit")
                return 0
                ;;
        esac
    done
}

function print_result()
{
    # output test results in a TAP format
    # https://testanything.org/tap-version-13-specification.html

    local status="$1"
    local testname="$2"
    local summary="$3"
    local reason="$4"

    if [ -z "$reason" ]; then
        echo "`$status` $testname $summary"
    else
        echo "`$status` $testname ($reason)"
    fi
}

function run()
{
    local testname="$1"
    local groups="$2"
    local smp="$3"
    local kernel="$4"
    local opts="$5"
    local arch="$6"
    local check="${CHECK:-$7}"
    local accel="${ACCEL:-$8}"
    local timeout="${9:-$TIMEOUT}" # unittests.cfg overrides the default

    if [ -z "$testname" ]; then
        return
    fi

    if [ -n "$only_tests" ] && ! grep -qw "$testname" <<<$only_tests; then
        return
    fi

    if [ -n "$only_group" ] && ! grep -qw "$only_group" <<<$groups; then
        return
    fi

    if [ -z "$only_group" ] && grep -qw "nodefault" <<<$groups &&
            skip_nodefault; then
        print_result "SKIP" $testname "" "test marked as manual run only"
        return;
    fi

    if [ -n "$arch" ] && [ "$arch" != "$ARCH" ]; then
        print_result "SKIP" $testname "" "$arch only"
        return 2
    fi

    # check a file for a particular value before running a test
    # the check line can contain multiple files to check separated by a space
    # but each check parameter needs to be of the form <path>=<value>
    for check_param in "${check[@]}"; do
        path=${check_param%%=*}
        value=${check_param#*=}
        if [ "$path" ] && [ "$(cat $path)" != "$value" ]; then
            print_result "SKIP" $testname "" "$path not equal to $value"
            return 2
        fi
    done

    last_line=$(premature_failure > >(tail -1)) && {
        print_result "SKIP" $testname "" "$last_line"
        return 77
    }

    cmdline=$(get_cmdline $kernel)
    if grep -qw "migration" <<<$groups ; then
        cmdline="MIGRATION=yes $cmdline"
    fi
    if [ "$verbose" = "yes" ]; then
        echo $cmdline
    fi

    # extra_params in the config file may contain backticks that need to be
    # expanded, so use eval to start qemu.  Use "> >(foo)" instead of a pipe to
    # preserve the exit status.
    summary=$(eval $cmdline 2> >(RUNTIME_log_stderr) \
                             > >(tee >(RUNTIME_log_stdout $kernel) | extract_summary))
    ret=$?
    [ "$STANDALONE" != "yes" ] && echo > >(RUNTIME_log_stdout $kernel)

    if [ $ret -eq 0 ]; then
        print_result "PASS" $testname "$summary"
    elif [ $ret -eq 77 ]; then
        print_result "SKIP" $testname "$summary"
    elif [ $ret -eq 124 ]; then
        print_result "FAIL" $testname "" "timeout; duration=$timeout"
    elif [ $ret -gt 127 ]; then
        print_result "FAIL" $testname "" "terminated on SIG$(kill -l $(($ret - 128)))"
    else
        print_result "FAIL" $testname "$summary"
    fi

    return $ret
}

#
# Probe for MAX_SMP, in case it's less than the number of host cpus.
#
# This probing currently only works for ARM, as x86 bails on another
# error first. Also, this probing isn't necessary for any ARM hosts
# running kernels later than v4.3, i.e. those including ef748917b52
# "arm/arm64: KVM: Remove 'config KVM_ARM_MAX_VCPUS'". So, at some
# point when maintaining the while loop gets too tiresome, we can
# just remove it...
while $RUNTIME_arch_run _NO_FILE_4Uhere_ -smp $MAX_SMP \
		|& grep -qi 'exceeds max CPUs'; do
	MAX_SMP=$((MAX_SMP >> 1))
done
run pmu pmu 1 $bin '' '' '' '' ''
