add debug/debugserver support

Change-Id: I114994cb092870cd57b8e43b197d56ab8ca7db20
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
diff --git a/scripts/support/openocd.sh b/scripts/support/openocd.sh
index 039d934..f7acbea 100755
--- a/scripts/support/openocd.sh
+++ b/scripts/support/openocd.sh
@@ -1,8 +1,12 @@
 #!/bin/sh
 
+# This script is loosly based on a script with same purpose provided
+# by RIOT-OS (https://github.com/RIOT-OS/RIOT)
+
 OPENOCD_CMD="${OPENOCD:-openocd} -s ${OPENOCD_DEFAULT_PATH}"
 OPENOCD_CONFIG=${ZEPHYR_BASE}/boards/${BOARD_NAME}/support/openocd.cfg
 BIN_NAME=${O}/${KERNEL_BIN_NAME}
+ELF_NAME=${O}/${KERNEL_ELF_NAME}
 
 test_config() {
     if [ ! -f "${OPENOCD_CONFIG}" ]; then
@@ -41,10 +45,42 @@
     echo 'Done flashing'
 }
 
+
+do_debug() {
+    test_config
+    test_bin
+    # setsid is needed so that Ctrl+C in GDB doesn't kill OpenOCD
+    [ -z "${SETSID}" ] && SETSID="$(which setsid)"
+    # temporary file that saves OpenOCD pid
+    OCD_PIDFILE=$(mktemp -t "openocd_pid.XXXXXXXXXX")
+    # cleanup after script terminates
+    trap "cleanup ${OCD_PIDFILE}" EXIT
+    # don't trap on Ctrl+C, because GDB keeps running
+    trap '' INT
+    # start OpenOCD as GDB server
+    ${SETSID} sh -c "${OPENOCD_CMD} -f '${OPENOCD_CONFIG}' \
+            ${OPENOCD_EXTRA_INIT} \
+            -c 'tcl_port ${TCL_PORT:-6333}' \
+            -c 'telnet_port ${TELNET_PORT:-4444}' \
+            -c 'gdb_port ${GDB_PORT:-3333}' \
+            -c 'init' \
+            -c 'targets' \
+            -c 'halt' \
+             & \
+            echo \$! > $OCD_PIDFILE" &
+    # connect to the GDB server
+    ${GDB} ${TUI} -ex "target remote :${GDB_PORT:-3333}" ${ELF_NAME}
+    # will be called by trap
+    cleanup() {
+        OCD_PID="$(cat $OCD_PIDFILE)"
+        kill ${OCD_PID} &>/dev/null
+        rm -f "$OCD_PIDFILE"
+        exit 0
+    }
+}
+
 do_debugserver() {
     test_config
-    test_ports
-    # start OpenOCD as GDB server
     sh -c "${OPENOCD_CMD} -f '${OPENOCD_CONFIG}' \
             -c 'init' \
             -c 'targets' \
@@ -62,4 +98,7 @@
   debugserver)
     do_debugserver "$@"
     ;;
+  debug)
+    do_debug "$@"
+    ;;
 esac