1f08c3bdfSopenharmony_ci# 2f08c3bdfSopenharmony_ci# APEI library: APEI specific functions 3f08c3bdfSopenharmony_ci# 4f08c3bdfSopenharmony_ci# Copyright (C) 2008, Intel Corp. 5f08c3bdfSopenharmony_ci# Author: Huang Ying <ying.huang@intel.com> 6f08c3bdfSopenharmony_ci# Zheng Jiajia <jiajia.zheng@intel.com> 7f08c3bdfSopenharmony_ci# This file is released under the GPLv2. 8f08c3bdfSopenharmony_ci# 9f08c3bdfSopenharmony_ci 10f08c3bdfSopenharmony_ci. $ROOT/lib/soft-inject.sh 11f08c3bdfSopenharmony_ci 12f08c3bdfSopenharmony_ciif [ -n "$this_case" ]; then 13f08c3bdfSopenharmony_ci bcase=$(basename $this_case) 14f08c3bdfSopenharmony_cifi 15f08c3bdfSopenharmony_cimcelog_result=$RDIR/$this_case/mcelog 16f08c3bdfSopenharmony_ciklog=$RDIR/$this_case/klog 17f08c3bdfSopenharmony_ci 18f08c3bdfSopenharmony_ciapei_mce_reformat() 19f08c3bdfSopenharmony_ci{ 20f08c3bdfSopenharmony_ci local inf="$1" 21f08c3bdfSopenharmony_ci local outf="$2" 22f08c3bdfSopenharmony_ci local tmpf=$WDIR/mce_reformat_for_cmp 23f08c3bdfSopenharmony_ci sed "s/0x//g" $inf | grep -v 'STATUS 0x0' | \ 24f08c3bdfSopenharmony_ci grep -v 'STATUS 0x800000000000000' | sort > "$tmpf" 25f08c3bdfSopenharmony_ci awk '/^STATUS/ {print $2}' $tmpf | cut -b 1-3 > $outf 26f08c3bdfSopenharmony_ci awk '/MCGSTATUS/ {if ($4=="") print $2; else print $4;}' $tmpf >> $outf 27f08c3bdfSopenharmony_ci} 28f08c3bdfSopenharmony_ci 29f08c3bdfSopenharmony_ciapei_mce_cmp() 30f08c3bdfSopenharmony_ci{ 31f08c3bdfSopenharmony_ci [ $# -eq 2 ] || die "missing parameter for mce_cmp" 32f08c3bdfSopenharmony_ci local m1="$1" 33f08c3bdfSopenharmony_ci local m2="$2" 34f08c3bdfSopenharmony_ci local tmpf1=$WDIR/mce_cmp_1 35f08c3bdfSopenharmony_ci local tmpf2=$WDIR/mce_cmp_2 36f08c3bdfSopenharmony_ci 37f08c3bdfSopenharmony_ci apei_mce_reformat "$m1" $tmpf1 38f08c3bdfSopenharmony_ci apei_mce_reformat "$m2" $tmpf2 39f08c3bdfSopenharmony_ci diff $tmpf1 $tmpf2 > /dev/null 40f08c3bdfSopenharmony_ci} 41f08c3bdfSopenharmony_ci 42f08c3bdfSopenharmony_ciapei_inject_verify_mcelog() 43f08c3bdfSopenharmony_ci{ 44f08c3bdfSopenharmony_ci if [ -f $RDIR/$this_case/mcelog ]; then 45f08c3bdfSopenharmony_ci mcelog_refer=$SDIR/refer/$bcase 46f08c3bdfSopenharmony_ci mce-inject --dump $mcelog_refer > $RDIR/$this_case/mcelog_refer 47f08c3bdfSopenharmony_ci if apei_mce_cmp $RDIR/$this_case/mcelog $RDIR/$this_case/mcelog_refer; then 48f08c3bdfSopenharmony_ci echo " Passed: MCE log is ok" 49f08c3bdfSopenharmony_ci else 50f08c3bdfSopenharmony_ci echo " Failed: MCE log is different from input" 51f08c3bdfSopenharmony_ci fi 52f08c3bdfSopenharmony_ci else 53f08c3bdfSopenharmony_ci echo " Failed: no MCE log result" 54f08c3bdfSopenharmony_ci fi 55f08c3bdfSopenharmony_ci} 56f08c3bdfSopenharmony_ci 57f08c3bdfSopenharmony_ci 58f08c3bdfSopenharmony_ciapei_inject_get_klog() 59f08c3bdfSopenharmony_ci{ 60f08c3bdfSopenharmony_ci soft_inject_get_klog 61f08c3bdfSopenharmony_ci} 62f08c3bdfSopenharmony_ci 63f08c3bdfSopenharmony_ciapei_inject_get_mcelog() 64f08c3bdfSopenharmony_ci{ 65f08c3bdfSopenharmony_ci soft_inject_get_mcelog 66f08c3bdfSopenharmony_ci} 67f08c3bdfSopenharmony_ci 68f08c3bdfSopenharmony_ci# verify return value 69f08c3bdfSopenharmony_ciapei_inject_verify_return_val() 70f08c3bdfSopenharmony_ci{ 71f08c3bdfSopenharmony_ci soft_inject_verify_return_val 72f08c3bdfSopenharmony_ci} 73f08c3bdfSopenharmony_ci 74f08c3bdfSopenharmony_ciapei_inject_verify_kill() 75f08c3bdfSopenharmony_ci{ 76f08c3bdfSopenharmony_ci soft_inject_verify_kill 77f08c3bdfSopenharmony_ci} 78f08c3bdfSopenharmony_ci 79f08c3bdfSopenharmony_ciapei_inject_enumerate() 80f08c3bdfSopenharmony_ci{ 81f08c3bdfSopenharmony_ci soft_inject_enumerate 82f08c3bdfSopenharmony_ci} 83f08c3bdfSopenharmony_ci 84f08c3bdfSopenharmony_ciapei_inject_trigger() 85f08c3bdfSopenharmony_ci{ 86f08c3bdfSopenharmony_ci check_debugfs 87f08c3bdfSopenharmony_ci #APEI_IF should be defined after debugfs is mounted 88f08c3bdfSopenharmony_ci APEI_IF=`mount | grep debugfs | cut -d ' ' -f3`/apei/einj 89f08c3bdfSopenharmony_ci 90f08c3bdfSopenharmony_ci #if einj is a module, it is ensured to have been loaded 91f08c3bdfSopenharmony_ci modinfo einj > /dev/null 2>&1 92f08c3bdfSopenharmony_ci if [ $? -eq 0 ]; then 93f08c3bdfSopenharmony_ci [ -d $APEI_IF ] || modprobe einj 94f08c3bdfSopenharmony_ci [ $? -eq 0 ] || die "module einj isn't supported ?" 95f08c3bdfSopenharmony_ci fi 96f08c3bdfSopenharmony_ci 97f08c3bdfSopenharmony_ci mcelog &> /dev/null 98f08c3bdfSopenharmony_ci TYPE=`awk '/^TYPE/{print $2}' $SDIR/data/$bcase` 99f08c3bdfSopenharmony_ci echo $TYPE > $APEI_IF/error_type 100f08c3bdfSopenharmony_ci killall simple_process 101f08c3bdfSopenharmony_ci $TDIR/simple_process/simple_process > /dev/null & 102f08c3bdfSopenharmony_ci 103f08c3bdfSopenharmony_ci page-types -p `pidof simple_process` -LN -b ano > $RDIR/$this_case/page 104f08c3bdfSopenharmony_ci 105f08c3bdfSopenharmony_ci ADDR=`awk '$2 != "offset" {print "0x"$2"000"}' $RDIR/$this_case/page | sed -n -e '1p'` 106f08c3bdfSopenharmony_ci echo $ADDR > $APEI_IF/param1 107f08c3bdfSopenharmony_ci 108f08c3bdfSopenharmony_ci echo "1" > $APEI_IF/error_inject 109f08c3bdfSopenharmony_ci 110f08c3bdfSopenharmony_ci ret=$? 111f08c3bdfSopenharmony_ci echo $ret > $RDIR/$this_case/return 112f08c3bdfSopenharmony_ci sleep 1 113f08c3bdfSopenharmony_ci} 114f08c3bdfSopenharmony_ci 115f08c3bdfSopenharmony_cistart_tracing() 116f08c3bdfSopenharmony_ci{ 117f08c3bdfSopenharmony_ci [ $# -eq 1 ] || die "missing parameter for get_panic_from_mcelog: please set filter for ftrace" 118f08c3bdfSopenharmony_ci [ -d /sys/kernel/debug/tracing ] || die "no tracing" 119f08c3bdfSopenharmony_ci echo "function_graph" > /sys/kernel/debug/tracing/current_tracer 120f08c3bdfSopenharmony_ci echo $1 > /sys/kernel/debug/tracing/set_ftrace_filter 121f08c3bdfSopenharmony_ci echo "1" > /sys/kernel/debug/tracing/tracing_enabled 122f08c3bdfSopenharmony_ci} 123f08c3bdfSopenharmony_ci 124f08c3bdfSopenharmony_cistop_tracing() 125f08c3bdfSopenharmony_ci{ 126f08c3bdfSopenharmony_ci [ -d /sys/kernel/debug/tracing ] || die "no tracing" 127f08c3bdfSopenharmony_ci echo "0" > /sys/kernel/debug/tracing/tracing_enabled 128f08c3bdfSopenharmony_ci cp /sys/kernel/debug/tracing/trace $RDIR/$this_case/ 129f08c3bdfSopenharmony_ci echo "nop" > /sys/kernel/debug/tracing/current_tracer 130f08c3bdfSopenharmony_ci} 131f08c3bdfSopenharmony_ci 132f08c3bdfSopenharmony_ciapei_inject_verify_trace() 133f08c3bdfSopenharmony_ci{ 134f08c3bdfSopenharmony_ci [ $# -eq 1 ] || die "missing parameter for apei_inject_verify_trace" 135f08c3bdfSopenharmony_ci if grep "$1" $RDIR/$this_case/trace; then 136f08c3bdfSopenharmony_ci echo "Passed: trace is correct" 137f08c3bdfSopenharmony_ci else 138f08c3bdfSopenharmony_ci echo "Failed: Nothing is traced" 139f08c3bdfSopenharmony_ci fi 140f08c3bdfSopenharmony_ci} 141f08c3bdfSopenharmony_ci 142f08c3bdfSopenharmony_ciapei_inject_verify_panic() 143f08c3bdfSopenharmony_ci{ 144f08c3bdfSopenharmony_ci local mce_panic="$1" 145f08c3bdfSopenharmony_ci verify_panic_via_klog $klog "$mce_panic" 146f08c3bdfSopenharmony_ci} 147f08c3bdfSopenharmony_ci 148f08c3bdfSopenharmony_ciapei_inject_verify_exp() 149f08c3bdfSopenharmony_ci{ 150f08c3bdfSopenharmony_ci verify_exp_via_klog $klog "$@" 151f08c3bdfSopenharmony_ci} 152f08c3bdfSopenharmony_ci 153f08c3bdfSopenharmony_ciapei_inject_verify_fail() 154f08c3bdfSopenharmony_ci{ 155f08c3bdfSopenharmony_ci verify_fail_via_klog $klog "$@" 156f08c3bdfSopenharmony_ci} 157f08c3bdfSopenharmony_ci 158f08c3bdfSopenharmony_ciapei_inject_main() 159f08c3bdfSopenharmony_ci{ 160f08c3bdfSopenharmony_ci op="$1" 161f08c3bdfSopenharmony_ci shift 162f08c3bdfSopenharmony_ci 163f08c3bdfSopenharmony_ci case "$op" in 164f08c3bdfSopenharmony_ci enumerate) 165f08c3bdfSopenharmony_ci enumerate 166f08c3bdfSopenharmony_ci ;; 167f08c3bdfSopenharmony_ci trigger) 168f08c3bdfSopenharmony_ci trigger "$@" 169f08c3bdfSopenharmony_ci ;; 170f08c3bdfSopenharmony_ci get_result) 171f08c3bdfSopenharmony_ci get_result 172f08c3bdfSopenharmony_ci ;; 173f08c3bdfSopenharmony_ci verify) 174f08c3bdfSopenharmony_ci verify 175f08c3bdfSopenharmony_ci ;; 176f08c3bdfSopenharmony_ci *) 177f08c3bdfSopenharmony_ci die "Usage: $0 enumerate|trigger|get_result|verify" 178f08c3bdfSopenharmony_ci esac 179f08c3bdfSopenharmony_ci exit 0 180f08c3bdfSopenharmony_ci} 181