1f08c3bdfSopenharmony_ci#!/bin/bash -xe
2f08c3bdfSopenharmony_ci#
3f08c3bdfSopenharmony_ci# Kdump test driver: test case will trigger panic, and then crash
4f08c3bdfSopenharmony_ci# dump. The test result is collected via dumped vmcore. For more
5f08c3bdfSopenharmony_ci# information about kdump dirver please refer to doc/README.kdump.
6f08c3bdfSopenharmony_ci#
7f08c3bdfSopenharmony_ci# Copyright (C) 2008, Intel Corp.
8f08c3bdfSopenharmony_ci#   Author: Huang Ying <ying.huang@intel.com>
9f08c3bdfSopenharmony_ci#
10f08c3bdfSopenharmony_ci# This file is based on kdump test case in LTP.
11f08c3bdfSopenharmony_ci#
12f08c3bdfSopenharmony_ci# This file is released under the GPLv2.
13f08c3bdfSopenharmony_ci#
14f08c3bdfSopenharmony_ci
15f08c3bdfSopenharmony_cisd=$(dirname "$0")
16f08c3bdfSopenharmony_ciexport ROOT=`(cd $sd/../..; pwd)`
17f08c3bdfSopenharmony_ci
18f08c3bdfSopenharmony_ciexport driver=kdump
19f08c3bdfSopenharmony_ci
20f08c3bdfSopenharmony_ci. $ROOT/lib/functions.sh
21f08c3bdfSopenharmony_cisetup_path
22f08c3bdfSopenharmony_ci. $ROOT/lib/dirs.sh
23f08c3bdfSopenharmony_ci. $ROOT/lib/mce.sh
24f08c3bdfSopenharmony_ci
25f08c3bdfSopenharmony_cisetup_crontab ()
26f08c3bdfSopenharmony_ci{
27f08c3bdfSopenharmony_ci    echo "Setup crontab."
28f08c3bdfSopenharmony_ci
29f08c3bdfSopenharmony_ci    set +e
30f08c3bdfSopenharmony_ci    crontab -r
31f08c3bdfSopenharmony_ci    set -e
32f08c3bdfSopenharmony_ci
33f08c3bdfSopenharmony_ci    # crontab in some distros will not read from STDIN.
34f08c3bdfSopenharmony_ci
35f08c3bdfSopenharmony_ci    cat <<EOF > $WDIR/kdump.cron
36f08c3bdfSopenharmony_ciSHELL=/bin/bash
37f08c3bdfSopenharmony_ciPATH=/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin
38f08c3bdfSopenharmony_ciMAILTO=root
39f08c3bdfSopenharmony_ci@reboot cd "$(pwd)"; ${0} $conf >> $WDIR/log 2>&1; cat $WDIR/log > /dev/console
40f08c3bdfSopenharmony_ciEOF
41f08c3bdfSopenharmony_ci
42f08c3bdfSopenharmony_ci    crontab $WDIR/kdump.cron
43f08c3bdfSopenharmony_ci
44f08c3bdfSopenharmony_ci    echo "Enable cron daemon by default."
45f08c3bdfSopenharmony_ci
46f08c3bdfSopenharmony_ci    if [ -f /etc/init.d/crond ]; then
47f08c3bdfSopenharmony_ci        cron=crond
48f08c3bdfSopenharmony_ci    else
49f08c3bdfSopenharmony_ci        # SUSE
50f08c3bdfSopenharmony_ci        cron=cron
51f08c3bdfSopenharmony_ci    fi
52f08c3bdfSopenharmony_ci
53f08c3bdfSopenharmony_ci    # Red Hat and SUSE.
54f08c3bdfSopenharmony_ci    if [ -x "/sbin/chkconfig" ]; then
55f08c3bdfSopenharmony_ci        /sbin/chkconfig "${cron}" on
56f08c3bdfSopenharmony_ci
57f08c3bdfSopenharmony_ci    # Debian and Ubuntu.
58f08c3bdfSopenharmony_ci    elif [ -x "/sbin/update-rc.d" ]; then
59f08c3bdfSopenharmony_ci        /sbin/update-rc.d "${cron}" defaults
60f08c3bdfSopenharmony_ci    fi
61f08c3bdfSopenharmony_ci}
62f08c3bdfSopenharmony_ci
63f08c3bdfSopenharmony_cisetup_kdump ()
64f08c3bdfSopenharmony_ci{
65f08c3bdfSopenharmony_ci    echo "Start kdump daemon."
66f08c3bdfSopenharmony_ci
67f08c3bdfSopenharmony_ci    if [ -f /etc/init.d/kdump ]; then
68f08c3bdfSopenharmony_ci	    daemon=kdump
69f08c3bdfSopenharmony_ci    else
70f08c3bdfSopenharmony_ci	    #SLE11
71f08c3bdfSopenharmony_ci	    daemon=boot.kdump
72f08c3bdfSopenharmony_ci    fi
73f08c3bdfSopenharmony_ci
74f08c3bdfSopenharmony_ci    /etc/init.d/"${daemon}" restart
75f08c3bdfSopenharmony_ci
76f08c3bdfSopenharmony_ci    echo "Enable kdump daemon by default."
77f08c3bdfSopenharmony_ci    # Red Hat and SUSE.
78f08c3bdfSopenharmony_ci    if [ -x "/sbin/chkconfig" ]; then
79f08c3bdfSopenharmony_ci        /sbin/chkconfig "${daemon}" on
80f08c3bdfSopenharmony_ci
81f08c3bdfSopenharmony_ci    # Debian and Ubuntu.
82f08c3bdfSopenharmony_ci    elif [ -x "/sbin/update-rc.d" ]; then
83f08c3bdfSopenharmony_ci        /sbin/update-rc.d "${daemon}" defaults
84f08c3bdfSopenharmony_ci    fi
85f08c3bdfSopenharmony_ci}
86f08c3bdfSopenharmony_ci
87f08c3bdfSopenharmony_ciget_klog()
88f08c3bdfSopenharmony_ci{
89f08c3bdfSopenharmony_ci    klog=$RDIR/$this_case/klog
90f08c3bdfSopenharmony_ci    cat <<EOF > $WDIR/get_klog_gdb.cmd
91f08c3bdfSopenharmony_cidump memory $klog log_buf log_buf+log_end
92f08c3bdfSopenharmony_ciEOF
93f08c3bdfSopenharmony_ci    set +e
94f08c3bdfSopenharmony_ci    gdb -batch -batch-silent -x $WDIR/get_klog_gdb.cmd $VMLINUX $vmcore \
95f08c3bdfSopenharmony_ci	> /dev/null 2>&1
96f08c3bdfSopenharmony_ci    ret=$?
97f08c3bdfSopenharmony_ci    set -e
98f08c3bdfSopenharmony_ci    if [ $ret -eq 0 -a -s $klog ]; then
99f08c3bdfSopenharmony_ci	export klog
100f08c3bdfSopenharmony_ci    else
101f08c3bdfSopenharmony_ci	echo "  Failed: can not get kernel log"
102f08c3bdfSopenharmony_ci	rm -rf $klog
103f08c3bdfSopenharmony_ci    fi
104f08c3bdfSopenharmony_ci}
105f08c3bdfSopenharmony_ci
106f08c3bdfSopenharmony_cidump_gcov()
107f08c3bdfSopenharmony_ci{
108f08c3bdfSopenharmony_ci    if [ -z "$GCOV" ]; then
109f08c3bdfSopenharmony_ci	return
110f08c3bdfSopenharmony_ci    fi
111f08c3bdfSopenharmony_ci    if ! chk_gcov; then
112f08c3bdfSopenharmony_ci	echo "gcov is not supported by kernel or there is no " \
113f08c3bdfSopenharmony_ci	    "gcov utility installed"
114f08c3bdfSopenharmony_ci	echo "disabling gcov support"
115f08c3bdfSopenharmony_ci	unset GCOV
116f08c3bdfSopenharmony_ci	return
117f08c3bdfSopenharmony_ci    fi
118f08c3bdfSopenharmony_ci    if [ -z "$KSRC_DIR" ]; then
119f08c3bdfSopenharmony_ci	echo "  Failed: please set KSRC_DIR for GCOV"
120f08c3bdfSopenharmony_ci	return
121f08c3bdfSopenharmony_ci    else
122f08c3bdfSopenharmony_ci	KSRC_DIR=$(set -P && cd "$KSRC_DIR" && pwd)
123f08c3bdfSopenharmony_ci	if [ -z "$KSRC_DIR"]; then
124f08c3bdfSopenharmony_ci	    echo "  Failed: Invalid KSRC_DIR, please check your setup"
125f08c3bdfSopenharmony_ci	    return
126f08c3bdfSopenharmony_ci	fi
127f08c3bdfSopenharmony_ci    fi
128f08c3bdfSopenharmony_ci    export KSRC_DIR
129f08c3bdfSopenharmony_ci    local gcov_head_raw=$WDIR/dump_gcov_head_raw
130f08c3bdfSopenharmony_ci    cat <<EOF > $WDIR/dump_gcov_gdb.cmd
131f08c3bdfSopenharmony_cidump value $gcov_head_raw (void *)gcov_info_head
132f08c3bdfSopenharmony_ciEOF
133f08c3bdfSopenharmony_ci    set +e
134f08c3bdfSopenharmony_ci    gdb -batch -batch-silent -x $WDIR/dump_gcov_gdb.cmd $VMLINUX $vmcore \
135f08c3bdfSopenharmony_ci	> /dev/null 2>&1
136f08c3bdfSopenharmony_ci    ret=$?
137f08c3bdfSopenharmony_ci    set -e
138f08c3bdfSopenharmony_ci    if [ $ret -ne 0 -o ! -s $gcov_head_raw ]; then
139f08c3bdfSopenharmony_ci	echo "  Failed: can not get kernel gcov_info_head"
140f08c3bdfSopenharmony_ci	return
141f08c3bdfSopenharmony_ci    fi
142f08c3bdfSopenharmony_ci    wl=$(stat -c '%s' $gcov_head_raw)
143f08c3bdfSopenharmony_ci    h=$(echo -n 0x; od -A n -t x$wl $gcov_head_raw | tr -d ' ')
144f08c3bdfSopenharmony_ci    if ! gcovdump -g $h $vmcore &> /dev/null; then
145f08c3bdfSopenharmony_ci	echo "  Failed: can not dump kernel gcov info"
146f08c3bdfSopenharmony_ci	return
147f08c3bdfSopenharmony_ci    fi
148f08c3bdfSopenharmony_cicat <<"EOF" > $WDIR/dump_gcov_deskew.sh
149f08c3bdfSopenharmony_ci    fn="$1"
150f08c3bdfSopenharmony_ci    bfn=$(basename "$fn")
151f08c3bdfSopenharmony_ci    dbfn="${bfn##\.tmp_}"
152f08c3bdfSopenharmony_ci    if [ -z "$dbfn" ]; then
153f08c3bdfSopenharmony_ci        return
154f08c3bdfSopenharmony_ci    fi
155f08c3bdfSopenharmony_ci    d=$(dirname "$fn")
156f08c3bdfSopenharmony_ci    cp $fn "$d/$dbfn"
157f08c3bdfSopenharmony_ciEOF
158f08c3bdfSopenharmony_ci    chmod +x $WDIR/dump_gcov_deskew.sh
159f08c3bdfSopenharmony_ci    find $KSRC_DIR \( -name '*.tmp_*gcno' -o -name '*.tmp_*gcda' \) \
160f08c3bdfSopenharmony_ci        -exec $WDIR/dump_gcov_deskew.sh \{\} \;
161f08c3bdfSopenharmony_ci
162f08c3bdfSopenharmony_ci    export GCOV=dump
163f08c3bdfSopenharmony_ci}
164f08c3bdfSopenharmony_ci
165f08c3bdfSopenharmony_ciget_result ()
166f08c3bdfSopenharmony_ci{
167f08c3bdfSopenharmony_ci    vmcore=$(ls -t "${COREDIR}"/*/vmcore* 2>/dev/null | head -1)
168f08c3bdfSopenharmony_ci
169f08c3bdfSopenharmony_ci    if [ -n "$vmcore" -a -f "$vmcore" ]; then
170f08c3bdfSopenharmony_ci	export vmcore
171f08c3bdfSopenharmony_ci	get_klog
172f08c3bdfSopenharmony_ci	dump_gcov
173f08c3bdfSopenharmony_ci    else
174f08c3bdfSopenharmony_ci	echo "  Failed: can not get vmcore"
175f08c3bdfSopenharmony_ci    fi
176f08c3bdfSopenharmony_ci
177f08c3bdfSopenharmony_ci    export reboot=1
178f08c3bdfSopenharmony_ci
179f08c3bdfSopenharmony_ci    $CDIR/$case_sh get_result
180f08c3bdfSopenharmony_ci}
181f08c3bdfSopenharmony_ci
182f08c3bdfSopenharmony_civerify_case ()
183f08c3bdfSopenharmony_ci{
184f08c3bdfSopenharmony_ci    if [ -z "$vmcore" ]; then
185f08c3bdfSopenharmony_ci	echo "  Failed: can not got vmcore"
186f08c3bdfSopenharmony_ci    fi
187f08c3bdfSopenharmony_ci    $CDIR/$case_sh verify
188f08c3bdfSopenharmony_ci}
189f08c3bdfSopenharmony_ci
190f08c3bdfSopenharmony_citrigger_case ()
191f08c3bdfSopenharmony_ci{
192f08c3bdfSopenharmony_ci    # Be careful to define COREDIR.
193f08c3bdfSopenharmony_ci    rm -rf "${COREDIR}"/*
194f08c3bdfSopenharmony_ci
195f08c3bdfSopenharmony_ci    # Save STDIO buffers.
196f08c3bdfSopenharmony_ci    sync
197f08c3bdfSopenharmony_ci    $CDIR/$case_sh trigger
198f08c3bdfSopenharmony_ci}
199f08c3bdfSopenharmony_ci
200f08c3bdfSopenharmony_ci# Start test.
201f08c3bdfSopenharmony_ciif [ $# -lt 1 ]; then
202f08c3bdfSopenharmony_ci    die "Usage: $0 <config>"
203f08c3bdfSopenharmony_cifi
204f08c3bdfSopenharmony_ci
205f08c3bdfSopenharmony_ciconf=$(basename "$1")
206f08c3bdfSopenharmony_ci
207f08c3bdfSopenharmony_ci. $CONF_DIR/$conf
208f08c3bdfSopenharmony_ci
209f08c3bdfSopenharmony_cidriver_prepare
210f08c3bdfSopenharmony_ciset_tolerant 1
211f08c3bdfSopenharmony_ciset_panic_on_oops 0
212f08c3bdfSopenharmony_ci
213f08c3bdfSopenharmony_ci# Check mandatory variables.
214f08c3bdfSopenharmony_ciif [ -z "${COREDIR}" ]; then
215f08c3bdfSopenharmony_ci    die "Fail: some mandatory variables are missing from configuration file."
216f08c3bdfSopenharmony_cifi
217f08c3bdfSopenharmony_ci
218f08c3bdfSopenharmony_ci# Reboot the machine first to take advantage of boot parameter
219f08c3bdfSopenharmony_ci# changes.
220f08c3bdfSopenharmony_ciif [ ! -f $WDIR/stamps/setupped ]; then
221f08c3bdfSopenharmony_ci    echo "Setup test environment."
222f08c3bdfSopenharmony_ci
223f08c3bdfSopenharmony_ci    setup_crontab
224f08c3bdfSopenharmony_ci
225f08c3bdfSopenharmony_ci    $SDIR/setup.sh $CONF_DIR/$conf
226f08c3bdfSopenharmony_ci
227f08c3bdfSopenharmony_ci    echo > $WDIR/stamps/setupped
228f08c3bdfSopenharmony_ci
229f08c3bdfSopenharmony_ci    echo "System is going to reboot."
230f08c3bdfSopenharmony_ci    /sbin/shutdown -r now
231f08c3bdfSopenharmony_ci    sleep 60
232f08c3bdfSopenharmony_ci    exit -1
233f08c3bdfSopenharmony_cifi
234f08c3bdfSopenharmony_ci
235f08c3bdfSopenharmony_ci#if mce_inject is a module, it is ensured to have been loaded
236f08c3bdfSopenharmony_ciif modinfo mce_inject > /dev/null 2>&1; then
237f08c3bdfSopenharmony_ci    if ! lsmod | grep -q mce_inject; then
238f08c3bdfSopenharmony_ci        if ! modprobe mce_inject; then
239f08c3bdfSopenharmony_ci	    die "module mce_inject isn't supported ?"
240f08c3bdfSopenharmony_ci        fi
241f08c3bdfSopenharmony_ci    fi
242f08c3bdfSopenharmony_cifi
243f08c3bdfSopenharmony_ci
244f08c3bdfSopenharmony_cifor case_sh in ${CASES}; do
245f08c3bdfSopenharmony_ci    for this_case in $($CDIR/$case_sh enumerate); do
246f08c3bdfSopenharmony_ci	export this_case
247f08c3bdfSopenharmony_ci	_this_case=$(echo $this_case | tr '/' '_')
248f08c3bdfSopenharmony_ci
249f08c3bdfSopenharmony_ci	if [ -f $WDIR/stamps/${_this_case}_done ]; then
250f08c3bdfSopenharmony_ci	    continue
251f08c3bdfSopenharmony_ci	fi
252f08c3bdfSopenharmony_ci
253f08c3bdfSopenharmony_ci        # First Test.
254f08c3bdfSopenharmony_ci	if [ ! -f $WDIR/stamps/first_test_checked ]; then
255f08c3bdfSopenharmony_ci            echo "First test..."
256f08c3bdfSopenharmony_ci            echo "Verify Boot Loader."
257f08c3bdfSopenharmony_ci            if ! grep 'crashkernel=' /proc/cmdline; then
258f08c3bdfSopenharmony_ci		die "Fail: error changing Boot Loader, no crashkernel=."
259f08c3bdfSopenharmony_ci            fi
260f08c3bdfSopenharmony_ci            setup_kdump
261f08c3bdfSopenharmony_ci	    echo > $WDIR/stamps/first_test_checked
262f08c3bdfSopenharmony_ci	fi
263f08c3bdfSopenharmony_ci
264f08c3bdfSopenharmony_ci	if [ ! -f $WDIR/stamps/${_this_case}_triggered ]; then
265f08c3bdfSopenharmony_ci	    echo > $WDIR/stamps/${_this_case}_triggered
266f08c3bdfSopenharmony_ci
267f08c3bdfSopenharmony_ci	    mkdir -p $RDIR/$this_case
268f08c3bdfSopenharmony_ci	    rm -rf $RDIR/$this_case/*
269f08c3bdfSopenharmony_ci	    echo -e "\n$this_case:" | tee -a $RDIR/result
270f08c3bdfSopenharmony_ci
271f08c3bdfSopenharmony_ci	    echo "Running current test $this_case."
272f08c3bdfSopenharmony_ci
273f08c3bdfSopenharmony_ci	    trigger_case | tee -a $RDIR/result
274f08c3bdfSopenharmony_ci
275f08c3bdfSopenharmony_ci	    triggering=1
276f08c3bdfSopenharmony_ci	fi
277f08c3bdfSopenharmony_ci
278f08c3bdfSopenharmony_ci	sleep 5
279f08c3bdfSopenharmony_ci
280f08c3bdfSopenharmony_ci	if [ -z "$triggering" ]; then
281f08c3bdfSopenharmony_ci            (get_result; verify_case) | tee -a $RDIR/result
282f08c3bdfSopenharmony_ci	else
283f08c3bdfSopenharmony_ci	    echo "  Failed: Failed to trigger kdump" | tee -a $RDIR/result
284f08c3bdfSopenharmony_ci	fi
285f08c3bdfSopenharmony_ci	echo > $WDIR/stamps/${_this_case}_done
286f08c3bdfSopenharmony_ci
287f08c3bdfSopenharmony_ci        # Wait for system to fully boot and leave a chance for user to
288f08c3bdfSopenharmony_ci        # stop test
289f08c3bdfSopenharmony_ci	sleep 55
290f08c3bdfSopenharmony_ci    done
291f08c3bdfSopenharmony_cidone
292f08c3bdfSopenharmony_ci
293f08c3bdfSopenharmony_ciecho "Test run complete" | tee -a $RDIR/result
294f08c3bdfSopenharmony_ci
295f08c3bdfSopenharmony_ci# We are done.
296f08c3bdfSopenharmony_ci# Reset.
297f08c3bdfSopenharmony_cicrontab -r
298f08c3bdfSopenharmony_ci
299f08c3bdfSopenharmony_ciexit 0
300