153 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/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
 | 
						|
 |