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