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