blob: 2981345cf134b2bfecef7cd527d038c179b22134 [file] [log] [blame]
#!/bin/bash
set -e
HEX_NAME=${O}/${KERNEL_HEX_NAME}
ELF_NAME=${O}/${KERNEL_ELF_NAME}
# XXX nios2-gdb-server doesn't seem to clean up after itself properly,
# and often will report "Unable to bind (98)" when restarting a session.
# Eventually the kernel cleans things up, but it takes a couple minutes.
# Use a random port each time so this doesn't annoy users. Use netstat to
# confirm that the randomly selected port isn't being used.
GDB_TCP_PORT=
while [ -z "$GDB_TCP_PORT" ]; do
GDB_TCP_PORT=$(shuf -i1024-49151 -n1)
netstat -atn | grep "127[.]0[.]0[.]1[:]$GDB_TCP_PORT" || break
GDB_TCP_PORT=
done
REQUIRED_PROGRAMS="nios2-gdb-server nios2-download"
for pgm in ${REQUIRED_PROGRAMS}; do
type -P $pgm > /dev/null 2>&1 || { echo >&2 "$pgm not found in PATH"; exit 1; }
done
# XXX do_flash() and do_debug() only support cases where the .elf is sent
# over the JTAG and the CPU directly boots from __start. CONFIG_XIP and
# CONFIG_INCLUDE_RESET_VECTOR must be disabled.
do_flash() {
nios2-download --go ${ELF_NAME}
}
do_debug() {
do_debugserver 1 &
# connect to the GDB server
${GDB} ${TUI} -ex "target remote :${GDB_TCP_PORT}" -ex "load" ${ELF_NAME}
}
do_debugserver() {
# Calling with an arg will result in setsid being used, which will prevent
# Ctrl-C in GDB from killing the server. The server automatically exits
# when the remote GDB disconnects.
if [ -n "$1" ]; then
SETSID=/usr/bin/setsid
else
SETSID=
fi
echo "Nios II GDB server running on port ${GDB_TCP_PORT}"
${SETSID} nios2-gdb-server --tcpport ${GDB_TCP_PORT} --init-cache --reset-target
}
CMD="$1"
shift
case "${CMD}" in
flash)
do_flash
;;
debugserver)
do_debugserver
;;
debug)
do_debug
;;
esac