You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
4.1 KiB

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