diff --git a/utils/addrsource b/utils/addrsource new file mode 100755 index 0000000..8570cae --- /dev/null +++ b/utils/addrsource @@ -0,0 +1,48 @@ +#!/bin/bash +# +# addrsource [] +# +# Given a memory address (in hex), print (if available) the C source code line +# and disassembly associated with that address. +# +# , if provided, should be the name of the ELF (*.out) file for the +# firmware image (typically located in the "build" subdirectory). If +# is not provided, the script will look for a "build" subdirectory +# of the current directory, and look in there for a filename matching "*.out" +# and use that. + +print_usage() { + echo "Usage: $0 addr [file.out]" >&2 +} + +addr="$1" +exefile="$2" + +# If user didn't provide any parameters, or attempted to use a switch (such as +# "--help"), just print the usage message and exit. If they provided an 'addr' +# parameter, but it didn't start with "0x", then prepend "0x" to it before +# continuing.. +case "$addr" in + "") print_usage; exit 1 ;; + -*) print_usage; exit 1 ;; + 0x*) ;; + *) addr="0x$addr" ;; +esac + +if [[ -z "$exefile" ]]; then + # User didn't specify what ELF (.out) file to look things up in. + # See if we can find an appropriate .out file in the build subdirectory + # (there's usually only one) + exefile=$(ls build/*.out) + if [[ -z "$exefile" ]] || [[ "${exefile#* }" != "$exefile" ]]; then + # Either we couldn't find anything, or we found more than one of them. + echo "Unable to determine which .out file to use. You will need to specify it explicitly on the command line." >&2 + echo "" >&2 + print_usage + exit 1 + fi +fi + +# All our parameters should be correct now. +# Invoke GDB to do the hard work for us... +xtensa-lx106-elf-gdb -batch "$exefile" -ex "list *$addr" -ex "info line *$addr" -ex "disassemble $addr"