#! /bin/sh -p # # Run rtems tests on the Motorola MCF5206eLITE Coldfire Evaluation board # using gdb configured with P&E Micro Background Debug Mode debugging # interface. # # This program generates a gdb script to run each test, intercept # serial port output and put log into output file. # # Author: Victor V. Vengerov # Copyright (C) 2000 OKTET Ltd., St.-Petersburg, Russia # # Partially based on runtest script for powerpc psim. # # COPYRIGHT (c) 1989-1999. # On-Line Applications Research Corporation (OAR). # # The license and distribution terms for this file may be # found in found in the file LICENSE in this distribution or at # http://www.OARcorp.com/rtems/license.html. # # @(#) $Id$ # # progname=`basename $0` progname=${0##*/} # fast basename hack for ksh, bash USAGE=\ "usage: $progname [ -opts ] test [ test ... ] -s ttydevice -- specify serial device to be used to capture test output -r baud -- set serial port baud rate (19200 by default) -b bdmdevice -- specify BDM device to be used to control the target -g gdbname -- specify name of gdb program to be used -v -- verbose output -d -- don't remove temporary files (for debugging only) -i -- use interrupt driven console I/O when test is running (many tests failed when interrupt driven console input/output is used due undetermenistic tests behaviour) -p -- use termios poll console I/O -l logdir -- specify log directory (default is 'logdir') Specify test as 'test' or 'test.exe'. All multiprocessing tests *must* be specified simply as 'mp01', etc. " # export everything set -a # log an error to stderr prerr() { echo "$*" >&2 } fatal() { [ "$1" ] && prerr $* prerr "$USAGE" exit 1 } warn() { [ "$1" ] && prerr $* } # run at normal and signalled exit test_exit() { exit_code=$1 rm -f ${logfile}.tmp* [ "$gdb_pid" ] && kill -9 $gdb_pid [ "$serial_pid" ] && kill -9 $serial_pid exit $exit_code } # # process the options # # defaults for getopt vars # # max_run_time is defaulted to 5 minutes # verbose="" serial_device=/dev/ttyS0 bdm_device=/dev/bdmcf0 gdbprog=true for i in rtems bdm-rtems bdm bdm-elf bdm-coff ; do if m68k-$i-gdb --version > /dev/null 2>&1 ; then gdbprog=m68k-$i-gdb ; break ; fi done logdir=log max_run_time=$((5 * 60)) sizeof_ram=$((1 * 1024 * 1024)) debugging="no" baudrate="19200" console_mode=0 while getopts vdips:r:b:l: OPT do case "$OPT" in v) verbose="yes";; d) debugging="yes";; s) serial_device="$OPTARG";; r) baudrate="$OPTARG";; b) bdm_device="$OPTARG";; l) logdir="$OPTARG";; s) gdbprog="$OPTARG";; p) console_mode=1;; i) console_mode=2;; *) fatal;; esac done let $((shiftcount = $OPTIND - 1)) shift $shiftcount args=$* # # Run the tests # tests="$args" if [ ! "$tests" ] then set -- `echo *.exe` tests="$*" fi [ -d $logdir ] || mkdir $logdir || fatal "could not create log directory ($logdir)" # where the tmp files go trap "test_exit" 1 2 3 13 14 15 for tfile in $tests do tname=`basename $tfile .exe` cpus="1" TEST_TYPE="single" case "$tname" in # size is no longer interactive. monitor* | termios*) warn "Skipping $tname; it is interactive" continue ;; *-node2*) warn "Skipping $tname; 'runtest' runs both nodes when for *-node1" continue ;; *-node1*) warn "Running both nodes associated with $tname" tname=`echo $tname | sed 's/-node.*//'` TEST_TYPE="mp" ;; minimum*|stackchk*|spfatal*|malloctest*) continue ;; esac if [ "$TEST_TYPE" = "mp" ] ; then fatal "MP tests not supported for this board" fi if [ $TEST_TYPE = "single" ] ; then logfile=$logdir/${tname} infofile=${logfile}.info scriptfile=${logfile}.ss gdblogfile=${logfile}.gdb rm -f ${logfile}.tmp* date=`date` echo "Starting $tname at $date" # Set serial port parameters if ! stty -F ${serial_device} raw cs8 -cstopb cread crtscts \ ispeed ${baudrate} ospeed ${baudrate} \ > /dev/null 2> /dev/null ; then fatal "Serial port couldn't be configured" fi # Flush serial port cat ${serial_device} > /dev/null & serial_pid=$! sleep 1s kill ${serial_pid} # Capture serial port cat ${serial_device} > $logfile & serial_pid=$! cat > "${scriptfile}" < "${gdblogfile}" 2>&1 & gdb_pid=$! { time_run=0 while [ $time_run -lt $max_run_time ] ; do sleep 10s if kill -0 $gdb_pid 2> /dev/null ; then time_run=$((time_run+10)) ; else exit 0 fi done kill -2 $serial_pid 2> /dev/null kill -2 $gdb_pid 2> /dev/null { sleep 5s ; if kill -0 $gdb_pid 2> /dev/null ; then kill -9 $gdb_pid 2> /dev/null ; fi if kill -0 $serial_pid 2> /dev/null ; then kill -9 $serial_pid 2> /dev/null ; fi } & } & wait $gdb_pid gdb_status=$? { if kill -0 $serial_pid 2> /dev/null ; then kill $serial_pid 2> /dev/null ; fi sleep 5s ; if kill -0 $serial_pid 2> /dev/null ; then kill -9 $serial_pid 2> /dev/null ; fi } & if [ $gdb_status -ge 128 ] ; then ran_too_long="yes" ; else ran_too_long="no" fi if [ $gdb_status -ne 0 ] ; then test_failed="yes" ; else test_failed="no" fi gdb_pid="" serial_pid="" fi # Create the info files { echo "$date" echo "Test run on: `uname -n`" echo "Host Information:" echo `uname -a` echo echo "Serial port: ${serial_device}" echo "Baud rate: ${baudrate}" echo "BDM port: ${bdm_device}" echo "gdb: `type -path ${gdbprog}`" cat ${logfile} if [ "$test_failed" = "yes" ] ; then echo -e "\\n\\nTest did not finish normally" if [ "$ran_too_long" = "yes" ] ; then echo "Test killed after $max_run_time seconds" fi fi echo date; } > ${infofile} if [ "${debugging}" = "no" ] ; then rm -f ${scriptfile} rm -f ${gdblogfile} fi done echo "Tests completed at " `date` test_exit 0