diff options
Diffstat (limited to 'tools/tests')
-rw-r--r-- | tools/tests/mce-test/config/setup.conf | 25 | ||||
-rw-r--r-- | tools/tests/mce-test/lib/xen-mceinj-tool.sh | 261 |
2 files changed, 286 insertions, 0 deletions
diff --git a/tools/tests/mce-test/config/setup.conf b/tools/tests/mce-test/config/setup.conf new file mode 100644 index 0000000000..40db017ff3 --- /dev/null +++ b/tools/tests/mce-test/config/setup.conf @@ -0,0 +1,25 @@ +#!/bin/bash +# +# Software injection based test cases: test cases are triggered via +# mce-inject tool. +# Copyright (c) 2010, Intel Corporation +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version +# 2 as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. +# +# Author: Xudong Hao <xudong.hao@intel.com> +# + +export MCE_SRAO_MEM=0 +export MCE_SRAO_LLC=1 +export CMCI_UCNA_LLC=2 diff --git a/tools/tests/mce-test/lib/xen-mceinj-tool.sh b/tools/tests/mce-test/lib/xen-mceinj-tool.sh new file mode 100644 index 0000000000..1d25d2a2bc --- /dev/null +++ b/tools/tests/mce-test/lib/xen-mceinj-tool.sh @@ -0,0 +1,261 @@ +#!/bin/bash +# +# Software injection based test cases: test cases are triggered via +# mce-inject tool. +# Copyright (c) 2010, Intel Corporation +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version +# 2 as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. +# +# Author: Xudong Hao <xudong.hao@intel.com> +# + +. $ROOT/config/setup.conf + +#Guest Image Preparation +hvm_image_prepare() +{ + local image=$1 + local tmpdir=`mktemp -d` + local tmpfile=`mktemp` + local offset=`kpartx -l $image | awk '{print $NF*512}'` + mount -oloop,offset=$offset $image $tmpdir && echo "mount image to $tmpdir" + local g_grub=$tmpdir/boot/grub/grub.conf + if [ $? -ne 0 ]; then + show " Mount image failed!" + return 1 + fi + + if ! grep FLAG_CONSOLE $g_grub; then + sed -e '/kernel/s/$/ console=ttyS0,115200,8n1 console=tty0/g' \ + $g_grub > $tmpfile + mv -f $tmpfile $g_grub + rm -f $tmpfile + echo " +#### FLAG_CONSOLE #### " >> $g_grub + fi + umount $tmpdir + rm -fr $tmpdir + + return 0 +} + +create_hvm_guest() +{ + local image=$1 + local originconfig="/etc/xen/xmexample.hvm" + local TF=`mktemp` + local case_dir=$ROOT/results/$this_case + local config=$case_dir/guest_config + [ -d $case_dir ] || mkdir $case_dir + [ -f $logfile ] || touch $logfile + local File=`echo $image|sed "s/\//\\\\\\\\\\//g"` + local g_name="`basename $image`_`date +%H%M%S`" + + hvm_image_prepare $image + + while getopts ":u:m:" Option + do + case $Option in + u ) vcpus=$OPTARG;; + m ) memory=$OPTARG;; + e ) bridge_name=$OPTARG;; + * ) ;; + esac + done + + cp $originconfig $config -f + + if [ -z $image ]; then + show "Image file $image does not exist, Please input one valid file" + return 1 + fi + + sed -e "/^disk/s/file:.*,\(hda\)/file:${File},\1/" $config \ + | sed -e "/^disk/s/phy:.*,\(hda\)/file:${File},\1/" >$TF + mv -f $TF $config + + [ -z $memory ] || sed -i "/^memory/s/^.*$/memory = $memory/" $config + [ -z $vcpus ] || sed -i "1,/^#vcpus/s/^#vcpus.*$/vcpus=$vcpus/;1d" $config + sed -i "/^vif/s/vif/#vif/" $config + sed -i "/^name/s/^.*$/name = \"$g_name\"/" $config + + string1=$(ls /dev/pts | sort) + xm cr $config + [ $? -eq 0 ] && domid=`xm list $g_name | tail -n1 | awk '{print $2}'` + if [ -z $domid ]; then + show " Guest can not boot up" + return 1 + fi + + sleep 10 + + string2=$(ls /dev/pts | sort) + + get_guest_klog + sleep 40 + + return 0 +} + +get_guest_klog() +{ + local case_dir=$ROOT/results/$this_case + gklog=$case_dir/gklog + [ -d $case_dir ] || mkdir $case_dir + [ -f $gklog ] || touch $gklog + for fo in $string2; do + echo $string1 | grep $fo -wq + [ $? -eq 1 ] && num=$fo + done + cat /dev/pts/$num > $gklog & +} + +mce_inject_trigger() +{ + local errtype=$1 + local append="" + while getopts ":d:u:p:" Option + do + case $Option in + d ) domid=$OPTARG;; + u ) cpu=$OPTARG;; + p ) pageaddr=$OPTARG;; + * ) ;; + esac + done + + [ -z $domid ] || append=$append" -d $domid" + [ -z $cpu ] || append=$append" -c $cpu" + [ -z $pageaddr ] || append=$append" -p $pageaddr" + + [ -f $ROOT/tools/xen-mceinj ] + if [ $? -eq 0 ]; then + xm dmesg -c + $ROOT/tools/xen-mceinj -t $errtype $append + if [ $? -ne 0 ]; then + show " Failed: Maybe the memory addr is out of range. \ + Please check whether used xen-mceinj tool correctlly" + return 1 + fi + else + show " Failed: please compile xen-mce inject tool firstly" + return 1 + fi + return 0 +} + +xen_verify() +{ + local case_dir=$ROOT/results/$this_case + local xenlog=$case_dir/xenlog + [ -d $case_dir ] || mkdir $case_dir + [ -f $xenlog ] || touch $xenlog + xm dmesg > $xenlog + grep "Error is successfully recovered" $xenlog > /dev/null + if [ $? -eq 0 ]; then + show " Passed: Xen handle this MCE error successfully" + else + show " Failed: Xen does not handle MCE error correctly !!" + return 1 + fi + return 0 +} + +guest_verify() +{ + grep "kernel page recovery" $gklog > /dev/null + if [ $? -eq 0 ]; then + show " Passed: Guest recive MCE error and solved correctly" + else + show " Failed: Guest fail to solve MCE error" + return 1 + fi + return 0 +} + +mcelog_verify() +{ + local err_type=$1 + local ret=0 + local case_dir=$ROOT/results/$this_case + local mcelog=$case_dir/mcelog + [ -d $case_dir ] || mkdir $case_dir + [ -f $mcelog ] || touch $mcelog + mcelog > $mcelog + if [ -z $mcelog ]; then + show " Failed: MCELOG does not catch anything" + return 1 + else + if [ $err_type -eq 0 ]; then + grep "MEMORY CONTROLLER MS_CHANNELunspecified_ERR" $mcelog \ + > /dev/null + ret=$? + elif [ $err_type -eq 1 ]; then + grep "Generic CACHE Level-2 Eviction Error" $mcelog > /dev/null + ret=$? + elif [ $err_type -eq 2 ]; then + grep "Data CACHE Level-2 Data-Read Error" $mcelog > /dev/null + ret=$? + fi + + if [ $ret -eq 0 ]; then + show " Passed: MCElog catch a correct error" + else + show " Failed: MCE log catch a incorrect error !!" + return 1 + fi + fi + + return 0 +} + +function des_guest() +{ + xm des $domid +} + +function clean_env() +{ + [ -d $ROOT/results ] || mkdir $ROOT/results + # clean logs and results of last test for this case + rm -fr $ROOT/results/$this_case/* +} + +function show() +{ + local case_dir=$ROOT/results/$this_case + local logfile=$case_dir/testlog + [ -d $case_dir ] || mkdir $case_dir + [ -f $logfile ] || touch $logfile + echo -e $* | tee -a $logfile > /dev/null +} + +function gen_result() +{ + local ret=$1 + local case_dir=$ROOT/results/$this_case + local result=$case_dir/result + [ -d $case_dir ] || mkdir $case_dir + [ -f $result ] || touch $result + + if [ $ret -eq 0 ]; then + echo "PASSED" > $result + elif [ $ret -eq 1 ]; then + echo "FAILED" > $result + echo " Please check testlog for details!!! " >> $result + else + echo "NORESULT" > $result + echo " Please check testlog for details!!! " >> $result + fi +} |