diff options
Diffstat (limited to 'tests/mmc_tracepoints/mmc_trace_reduce')
-rwxr-xr-x | tests/mmc_tracepoints/mmc_trace_reduce | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/tests/mmc_tracepoints/mmc_trace_reduce b/tests/mmc_tracepoints/mmc_trace_reduce new file mode 100755 index 00000000..ef6683eb --- /dev/null +++ b/tests/mmc_tracepoints/mmc_trace_reduce @@ -0,0 +1,152 @@ +#!/bin/bash + +# TO DO +# This should be re-written in python. + +# Complain about dereferencing unset variables +set -u +typeset -i STARTTIME ENDTIME DURATION START_SEC START_USEC DUR_SEC DUR_USEC + +if [ "$#" -ne 1 ] +then + echo "Usage: mmc_trace_reduce <trace_file>" >&2 + exit 1 +fi + +exec < "$1" + +SAVED_START_LINE="" + +while read LINE +do + # Skip comment lines + if [ -z "${LINE###*}" ] + then + continue + fi + + # Fix up lines with nuisance spaces + LINE=${LINE/AsyncTask /AsyncTask-} + + set $LINE + + if [ "${5##*mmc_blk_*_}" = "start:" ] + then + if [ ! -z "$SAVED_START_LINE" ] + then + echo "Ignoring consecutive start line" >&2 + continue + fi + SAVED_START_LINE="$LINE" + + # Found a start line. Extract the interesting bits + TMP=${4%:} + START_SEC="10#${TMP%%.*}" + STARTTIME=START_SEC*1000000 + START_USEC="10#${TMP##*.}" + STARTTIME=STARTTIME+START_USEC + + STARTPARMS="$6" + STARTCMD=${STARTPARMS%%,addr=*} + STARTCMD=${STARTCMD##*cmd=} + STARTADDR=${STARTPARMS%%,size=*} + STARTADDR=${STARTADDR##*addr=} + STARTSIZE=${STARTPARMS##*size=} + + elif [ "${5##*mmc_blk_*_}" = "end:" ] + then + # Found an end line. Extract the interesting bits, + # then make sure it matches with the saved start line, + # Finally, do the math and emit a single reduced line + TMP=${4%:} + ENDTIME="${TMP%%.*}" + ENDTIME=ENDTIME*1000000 + ENDTIME=ENDTIME+10#${TMP##*.} + + ENDPARMS="$6" + ENDCMD=${ENDPARMS%%,addr=*} + ENDCMD=${ENDCMD##*cmd=} + ENDADDR=${ENDPARMS%%,size=*} + ENDADDR=${ENDADDR##*addr=} + ENDSIZE=${ENDPARMS##*size=} + + if [ "$ENDCMD" != "$STARTCMD" ] + then + echo "End cmd doesn't match start cmd, ignoring both" >&2 + SAVED_START_LINE="" + continue + fi + if [ "$ENDADDR" != "$STARTADDR" ] + then + echo "End addr doesn't match start addr, ignoring both" >&2 + SAVED_START_LINE="" + continue + fi + if [ "$ENDSIZE" != "$STARTSIZE" ] + then + echo "End size doesn't match start size, ignoring both" >&2 + SAVED_START_LINE="" + continue + fi + + # Turn the command number into a command the flash analysis tool + # understands. The tool doesn't differentiate between the different + # forms erase, so just emit "discard" for all of them. Also, ignore + # the secure_trim2 and sanitize commands as the tool doesn't know + # about them either. + if [ "$ENDCMD" -eq 18 ] + then + ENDCMD="read" + elif [ "$ENDCMD" -eq 25 ] + then + ENDCMD="write" + elif [ "$ENDCMD" -eq 32 ] + then + ENDCMD="flush" + continue + elif [ "$ENDCMD" -eq 0 ] + then + ENDCMD="discard" + elif [ "$ENDCMD" -eq 1 ] + then + ENDCMD="discard" + elif [ "$ENDCMD" -eq 3 ] + then + ENDCMD="discard" + elif [ "$ENDCMD" -eq 2147483648 ] # 0x80000000 + then + ENDCMD="discard" + elif [ "$ENDCMD" -eq 2147483649 ] # 0x80000001 + then + ENDCMD="discard" + elif [ "$ENDCMD" -eq 2147516416 ] # 0x80008000 + then + # Ignore, as the analysis tool doesn't deal with this + # ENDCMD="secure_trim2" + SAVED_START_LINE="" + continue + elif [ "$ENDCMD" -eq 165 ] + then + # Ignore, as the analysis tool doesn't deal with this + # ENDCMD="sanitize" + SAVED_START_LINE="" + continue + else + echo "Unrecognized command $ENDCMD, ignoring" >&2 + SAVED_START_LINE="" + continue + fi + + DURATION=ENDTIME-STARTTIME + DUR_SEC=DURATION/1000000 + DUR_USEC=DURATION%1000000 + + printf "$%s,%s,%s,%d.%06d,%d.%06d\n" "$ENDCMD" "$ENDADDR" "$ENDSIZE" "$START_SEC" "$START_USEC" "$DUR_SEC" "$DUR_USEC" + + SAVED_START_LINE="" + fi + + # Ignore unknown lines and continue + +done + |