blob: 73fae2866a26ac8a01244b530976580053032c93 [file] [log] [blame]
#
# APEI library: APEI specific functions
#
# Copyright (C) 2008, Intel Corp.
# Author: Huang Ying <ying.huang@intel.com>
# Zheng Jiajia <jiajia.zheng@intel.com>
# This file is released under the GPLv2.
#
. $ROOT/lib/soft-inject.sh
if [ -n "$this_case" ]; then
bcase=$(basename $this_case)
fi
mcelog_result=$RDIR/$this_case/mcelog
klog=$RDIR/$this_case/klog
apei_mce_reformat()
{
local inf="$1"
local outf="$2"
local tmpf=$WDIR/mce_reformat_for_cmp
sed "s/0x//g" $inf | grep -v 'STATUS 0x0' | \
grep -v 'STATUS 0x800000000000000' | sort > "$tmpf"
awk '/^STATUS/ {print $2}' $tmpf | cut -b 1-3 > $outf
awk '/MCGSTATUS/ {if ($4=="") print $2; else print $4;}' $tmpf >> $outf
}
apei_mce_cmp()
{
[ $# -eq 2 ] || die "missing parameter for mce_cmp"
local m1="$1"
local m2="$2"
local tmpf1=$WDIR/mce_cmp_1
local tmpf2=$WDIR/mce_cmp_2
apei_mce_reformat "$m1" $tmpf1
apei_mce_reformat "$m2" $tmpf2
diff $tmpf1 $tmpf2 > /dev/null
}
apei_inject_verify_mcelog()
{
if [ -f $RDIR/$this_case/mcelog ]; then
mcelog_refer=$SDIR/refer/$bcase
mce-inject --dump $mcelog_refer > $RDIR/$this_case/mcelog_refer
if apei_mce_cmp $RDIR/$this_case/mcelog $RDIR/$this_case/mcelog_refer; then
echo " Passed: MCE log is ok"
else
echo " Failed: MCE log is different from input"
fi
else
echo " Failed: no MCE log result"
fi
}
apei_inject_get_klog()
{
soft_inject_get_klog
}
apei_inject_get_mcelog()
{
soft_inject_get_mcelog
}
# verify return value
apei_inject_verify_return_val()
{
soft_inject_verify_return_val
}
apei_inject_verify_kill()
{
soft_inject_verify_kill
}
apei_inject_enumerate()
{
soft_inject_enumerate
}
apei_inject_trigger()
{
check_debugfs
#APEI_IF should be defined after debugfs is mounted
APEI_IF=`mount | grep debugfs | cut -d ' ' -f3`/apei/einj
#if einj is a module, it is ensured to have been loaded
modinfo einj > /dev/null 2>&1
if [ $? -eq 0 ]; then
[ -d $APEI_IF ] || modprobe einj param_extension=1
[ $? -eq 0 ] || die "module einj isn't supported ?"
fi
mcelog &> /dev/null
TYPE=`awk '/^TYPE/{print $2}' $SDIR/data/$bcase`
echo $TYPE > $APEI_IF/error_type
killall simple_process
$TDIR/simple_process/simple_process > /dev/null &
page-types -p `pidof simple_process` -LN -b ano > $RDIR/$this_case/page
ADDR=`awk '$2 != "offset" {print "0x"$2"000"}' $RDIR/$this_case/page | sed -n -e '1p'`
echo $ADDR > $APEI_IF/param1
echo "1" > $APEI_IF/error_inject
ret=$?
echo $ret > $RDIR/$this_case/return
sleep 1
}
start_tracing()
{
[ $# -eq 1 ] || die "missing parameter for get_panic_from_mcelog: please set filter for ftrace"
[ -d /sys/kernel/debug/tracing ] || die "no tracing"
echo "function_graph" > /sys/kernel/debug/tracing/current_tracer
echo $1 > /sys/kernel/debug/tracing/set_ftrace_filter
echo "1" > /sys/kernel/debug/tracing/tracing_enabled
}
stop_tracing()
{
[ -d /sys/kernel/debug/tracing ] || die "no tracing"
echo "0" > /sys/kernel/debug/tracing/tracing_enabled
cp /sys/kernel/debug/tracing/trace $RDIR/$this_case/
echo "nop" > /sys/kernel/debug/tracing/current_tracer
}
apei_inject_verify_trace()
{
[ $# -eq 1 ] || die "missing parameter for apei_inject_verify_trace"
if grep "$1" $RDIR/$this_case/trace; then
echo "Passed: trace is correct"
else
echo "Failed: Nothing is traced"
fi
}
apei_inject_verify_panic()
{
local mce_panic="$1"
verify_panic_via_klog $klog "$mce_panic"
}
apei_inject_verify_exp()
{
verify_exp_via_klog $klog "$@"
}
apei_inject_verify_fail()
{
verify_fail_via_klog $klog "$@"
}
apei_inject_main()
{
op="$1"
shift
case "$op" in
enumerate)
enumerate
;;
trigger)
trigger "$@"
;;
get_result)
get_result
;;
verify)
verify
;;
*)
die "Usage: $0 enumerate|trigger|get_result|verify"
esac
exit 0
}