#!/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