|
Packit |
b1f7ae |
#! /bin/bash
|
|
Packit |
b1f7ae |
#
|
|
Packit |
b1f7ae |
# Copyright (c) 2013-2017, Intel Corporation
|
|
Packit |
b1f7ae |
#
|
|
Packit |
b1f7ae |
# Redistribution and use in source and binary forms, with or without
|
|
Packit |
b1f7ae |
# modification, are permitted provided that the following conditions are met:
|
|
Packit |
b1f7ae |
#
|
|
Packit |
b1f7ae |
# * Redistributions of source code must retain the above copyright notice,
|
|
Packit |
b1f7ae |
# this list of conditions and the following disclaimer.
|
|
Packit |
b1f7ae |
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
Packit |
b1f7ae |
# this list of conditions and the following disclaimer in the documentation
|
|
Packit |
b1f7ae |
# and/or other materials provided with the distribution.
|
|
Packit |
b1f7ae |
# * Neither the name of Intel Corporation nor the names of its contributors
|
|
Packit |
b1f7ae |
# may be used to endorse or promote products derived from this software
|
|
Packit |
b1f7ae |
# without specific prior written permission.
|
|
Packit |
b1f7ae |
#
|
|
Packit |
b1f7ae |
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
Packit |
b1f7ae |
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
Packit |
b1f7ae |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
Packit |
b1f7ae |
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
Packit |
b1f7ae |
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
Packit |
b1f7ae |
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
Packit |
b1f7ae |
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
Packit |
b1f7ae |
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
Packit |
b1f7ae |
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
Packit |
b1f7ae |
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
Packit |
b1f7ae |
# POSSIBILITY OF SUCH DAMAGE.
|
|
Packit |
b1f7ae |
#
|
|
Packit |
b1f7ae |
# This script executes ptt tests and compares the output of tools, like
|
|
Packit |
b1f7ae |
# ptxed or ptdump, with the expected output from the ptt testfile.
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
info() {
|
|
Packit |
b1f7ae |
[[ $verbose != 0 ]] && echo -e "$@" >&2
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
run() {
|
|
Packit |
b1f7ae |
info "$@"
|
|
Packit |
b1f7ae |
"$@"
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
asm2addr() {
|
|
Packit |
b1f7ae |
local line
|
|
Packit |
b1f7ae |
line=`grep -i ^org "$1"`
|
|
Packit |
b1f7ae |
[[ $? != 0 ]] && return $?
|
|
Packit |
b1f7ae |
echo $line | sed "s/org *//"
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
usage() {
|
|
Packit |
b1f7ae |
cat <
|
|
Packit |
b1f7ae |
usage: $0 [<options>] <pttfile>...
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
options:
|
|
Packit |
b1f7ae |
-h this text
|
|
Packit |
b1f7ae |
-v print commands as they are executed
|
|
Packit |
b1f7ae |
-c cpu[,cpu] comma-separated list of cpu's for the tests (see pttc -h, for valid values)
|
|
Packit |
b1f7ae |
-f exit with 1 if any of the tests failed
|
|
Packit |
b1f7ae |
-l only list .diff files
|
|
Packit |
b1f7ae |
-g specify the pttc command (default: pttc)
|
|
Packit |
b1f7ae |
-G specify additional arguments to pttc
|
|
Packit |
b1f7ae |
-d specify the ptdump command (default: ptdump)
|
|
Packit |
b1f7ae |
-D specify additional arguments to ptdump
|
|
Packit |
b1f7ae |
-x specify the ptxed command (default: ptxed)
|
|
Packit |
b1f7ae |
-X specify additional arguments to ptxed
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
<pttfile> annotated yasm file ending in .ptt
|
|
Packit |
b1f7ae |
EOF
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
pttc_cmd=pttc
|
|
Packit |
b1f7ae |
pttc_arg=""
|
|
Packit |
b1f7ae |
ptdump_cmd=ptdump
|
|
Packit |
b1f7ae |
ptdump_arg=""
|
|
Packit |
b1f7ae |
ptxed_cmd=ptxed
|
|
Packit |
b1f7ae |
ptxed_arg=""
|
|
Packit |
b1f7ae |
exit_fails=0
|
|
Packit |
b1f7ae |
list=0
|
|
Packit |
b1f7ae |
verbose=0
|
|
Packit |
b1f7ae |
while getopts "hvc:flg:G:d:D:x:X:" option; do
|
|
Packit |
b1f7ae |
case $option in
|
|
Packit |
b1f7ae |
h)
|
|
Packit |
b1f7ae |
usage
|
|
Packit |
b1f7ae |
exit 0
|
|
Packit |
b1f7ae |
;;
|
|
Packit |
b1f7ae |
v)
|
|
Packit |
b1f7ae |
verbose=1
|
|
Packit |
b1f7ae |
;;
|
|
Packit |
b1f7ae |
c)
|
|
Packit |
b1f7ae |
cpus=`echo $OPTARG | sed "s/,/ /g"`
|
|
Packit |
b1f7ae |
;;
|
|
Packit |
b1f7ae |
f)
|
|
Packit |
b1f7ae |
exit_fails=1
|
|
Packit |
b1f7ae |
;;
|
|
Packit |
b1f7ae |
l)
|
|
Packit |
b1f7ae |
list=1
|
|
Packit |
b1f7ae |
;;
|
|
Packit |
b1f7ae |
g)
|
|
Packit |
b1f7ae |
pttc_cmd=$OPTARG
|
|
Packit |
b1f7ae |
;;
|
|
Packit |
b1f7ae |
G)
|
|
Packit |
b1f7ae |
pttc_arg=$OPTARG
|
|
Packit |
b1f7ae |
;;
|
|
Packit |
b1f7ae |
d)
|
|
Packit |
b1f7ae |
ptdump_cmd=$OPTARG
|
|
Packit |
b1f7ae |
;;
|
|
Packit |
b1f7ae |
D)
|
|
Packit |
b1f7ae |
ptdump_arg=$OPTARG
|
|
Packit |
b1f7ae |
;;
|
|
Packit |
b1f7ae |
x)
|
|
Packit |
b1f7ae |
ptxed_cmd=$OPTARG
|
|
Packit |
b1f7ae |
;;
|
|
Packit |
b1f7ae |
X)
|
|
Packit |
b1f7ae |
ptxed_arg=$OPTARG
|
|
Packit |
b1f7ae |
;;
|
|
Packit |
b1f7ae |
\?)
|
|
Packit |
b1f7ae |
exit 1
|
|
Packit |
b1f7ae |
;;
|
|
Packit |
b1f7ae |
esac
|
|
Packit |
b1f7ae |
done
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
shift $(($OPTIND-1))
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if [[ $# == 0 ]]; then
|
|
Packit |
b1f7ae |
usage
|
|
Packit |
b1f7ae |
exit 1
|
|
Packit |
b1f7ae |
fi
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
# the exit status
|
|
Packit |
b1f7ae |
status=0
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
ptt-ptdump-opts() {
|
|
Packit |
b1f7ae |
sed -n 's/[ \t]*;[ \t]*opt:ptdump[ \t][ \t]*\(.*\)[ \t]*/\1/p' "$1"
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
ptt-ptxed-opts() {
|
|
Packit |
b1f7ae |
sed -n 's/[ \t]*;[ \t]*opt:ptxed[ \t][ \t]*\(.*\)[ \t]*/\1/p' "$1"
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
run-ptt-test() {
|
|
Packit |
b1f7ae |
info "\n# run-ptt-test $@"
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
ptt="$1"
|
|
Packit |
b1f7ae |
cpu="$2"
|
|
Packit |
b1f7ae |
base=`basename "${ptt%%.ptt}"`
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if [[ -n "$cpu" ]]; then
|
|
Packit |
b1f7ae |
cpu="--cpu $cpu"
|
|
Packit |
b1f7ae |
fi
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
# the following are the files that are generated by pttc
|
|
Packit |
b1f7ae |
pt=$base.pt
|
|
Packit |
b1f7ae |
bin=$base.bin
|
|
Packit |
b1f7ae |
lst=$base.lst
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
# execute pttc - remove the extra \r in Windows line endings
|
|
Packit |
b1f7ae |
exps=`run "$pttc_cmd" $pttc_arg $cpu "$ptt" | sed 's/\r\n/\n/g'`
|
|
Packit |
b1f7ae |
ret=$?
|
|
Packit |
b1f7ae |
if [[ $ret != 0 ]]; then
|
|
Packit |
b1f7ae |
echo "$ptt: $pttc_cmd $pttc_arg failed with $ret" >&2
|
|
Packit |
b1f7ae |
status=1
|
|
Packit |
b1f7ae |
return
|
|
Packit |
b1f7ae |
elif [[ -z $exps ]]; then
|
|
Packit |
b1f7ae |
echo "$ptt: $pttc_cmd $pttc_arg did not produce any .exp file" >&2
|
|
Packit |
b1f7ae |
status=1
|
|
Packit |
b1f7ae |
return
|
|
Packit |
b1f7ae |
fi
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
# loop over all .exp files determine the tool, generate .out
|
|
Packit |
b1f7ae |
# files and compare .exp and .out file with diff.
|
|
Packit |
b1f7ae |
# all differences will be
|
|
Packit |
b1f7ae |
for exp in $exps; do
|
|
Packit |
b1f7ae |
exp_base=${exp%%.exp}
|
|
Packit |
b1f7ae |
out=$exp_base.out
|
|
Packit |
b1f7ae |
diff=$exp_base.diff
|
|
Packit |
b1f7ae |
tool=${exp_base##$base-}
|
|
Packit |
b1f7ae |
tool=${tool%%-cpu_*}
|
|
Packit |
b1f7ae |
case $tool in
|
|
Packit |
b1f7ae |
ptxed)
|
|
Packit |
b1f7ae |
addr=`asm2addr "$ptt"`
|
|
Packit |
b1f7ae |
if [[ $? != 0 ]]; then
|
|
Packit |
b1f7ae |
echo "$ptt: org directive not found in test file" >&2
|
|
Packit |
b1f7ae |
status=1
|
|
Packit |
b1f7ae |
continue
|
|
Packit |
b1f7ae |
fi
|
|
Packit |
b1f7ae |
local opts=`ptt-ptxed-opts "$ptt"`
|
|
Packit |
b1f7ae |
opts+=" --no-inst --check"
|
|
Packit |
b1f7ae |
run "$ptxed_cmd" $ptxed_arg --raw $bin:$addr $cpu $opts --pt $pt > $out
|
|
Packit |
b1f7ae |
;;
|
|
Packit |
b1f7ae |
ptdump)
|
|
Packit |
b1f7ae |
local opts=`ptt-ptdump-opts "$ptt"`
|
|
Packit |
b1f7ae |
run "$ptdump_cmd" $ptdump_arg $cpu $opts $pt > $out
|
|
Packit |
b1f7ae |
;;
|
|
Packit |
b1f7ae |
*)
|
|
Packit |
b1f7ae |
echo "$ptt: unknown tool '$tool'"
|
|
Packit |
b1f7ae |
status=1
|
|
Packit |
b1f7ae |
continue
|
|
Packit |
b1f7ae |
;;
|
|
Packit |
b1f7ae |
esac
|
|
Packit |
b1f7ae |
if run diff -ub $exp $out > $diff; then
|
|
Packit |
b1f7ae |
run rm $diff
|
|
Packit |
b1f7ae |
else
|
|
Packit |
b1f7ae |
if [[ $exit_fails != 0 ]]; then
|
|
Packit |
b1f7ae |
status=1
|
|
Packit |
b1f7ae |
fi
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if [[ $list != 0 ]]; then
|
|
Packit |
b1f7ae |
echo $diff
|
|
Packit |
b1f7ae |
else
|
|
Packit |
b1f7ae |
cat $diff
|
|
Packit |
b1f7ae |
fi
|
|
Packit |
b1f7ae |
fi
|
|
Packit |
b1f7ae |
done
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
ptt-cpus() {
|
|
Packit |
b1f7ae |
sed -n 's/[ \t]*;[ \t]*cpu[ \t][ \t]*\(.*\)[ \t]*/\1/p' "$1"
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
run-ptt-tests() {
|
|
Packit |
b1f7ae |
local ptt="$1"
|
|
Packit |
b1f7ae |
local cpus=$cpus
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
# if no cpus are given on the command-line,
|
|
Packit |
b1f7ae |
# use the cpu directives from the pttfile.
|
|
Packit |
b1f7ae |
if [[ -z $cpus ]]; then
|
|
Packit |
b1f7ae |
cpus=`ptt-cpus "$ptt"`
|
|
Packit |
b1f7ae |
fi
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
# if there are no cpu directives in the pttfile,
|
|
Packit |
b1f7ae |
# run the test without any cpu settings.
|
|
Packit |
b1f7ae |
if [[ -z $cpus ]]; then
|
|
Packit |
b1f7ae |
run-ptt-test "$ptt"
|
|
Packit |
b1f7ae |
return
|
|
Packit |
b1f7ae |
fi
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
# otherwise run for each cpu the test.
|
|
Packit |
b1f7ae |
for i in $cpus; do
|
|
Packit |
b1f7ae |
run-ptt-test "$ptt" $i
|
|
Packit |
b1f7ae |
done
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
for ptt in "$@"; do
|
|
Packit |
b1f7ae |
run-ptt-tests "$ptt"
|
|
Packit |
b1f7ae |
done
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
exit $status
|