From 447d92e66be8c481db8e066da20fd8186ef78083 Mon Sep 17 00:00:00 2001 From: Tat-Chee Wan (USM) Date: Fri, 11 Feb 2011 17:52:43 +0800 Subject: added preliminary run loop separation --- Debugger/debug_comm.S | 2 +- Debugger/debug_runlooptasks.S | 86 +++++++++++++++++++++++++++++++++++++++++++ Debugger/debug_stub.S | 6 ++- 3 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 Debugger/debug_runlooptasks.S diff --git a/Debugger/debug_comm.S b/Debugger/debug_comm.S index e801479..77b2175 100644 --- a/Debugger/debug_comm.S +++ b/Debugger/debug_comm.S @@ -3,7 +3,7 @@ * */ -/* Copyright (C) 2007-2010 the NxOS developers +/* Copyright (C) 2007-2011 the NxOS developers * * Module Developed by: TC Wan * diff --git a/Debugger/debug_runlooptasks.S b/Debugger/debug_runlooptasks.S new file mode 100644 index 0000000..24f8bfe --- /dev/null +++ b/Debugger/debug_runlooptasks.S @@ -0,0 +1,86 @@ +/** @file debug_runloop.S + * @brief GDB Server platform Run Loop + * + */ + +/* Copyright (C) 2007-2011 the NxOS developers + * + * Module Developed by: TC Wan + * + * See AUTHORS for a full list of the developers. + * + * See COPYING for redistribution license + * + */ + + +/* + * The Debugger has to implement a Run Loop in ABORT mode + * since the hardware is still running. Consequently, + * the communications subsystems such as USB (and Bluetooth?) + * which is used to communicate with the Host needs to be + * serviced in order for actual data transmission and reception + * to take place. Currently we're reusing the platform's + * communication routines to do the actual tx/rx, so it means + * that it is not possible to set breakpoints in those modules. + * In addition, since the platform communication modules may + * handle other tasks, it is currently possible to enter an + * indeterminate state where certain communication messages trigger + * a platform response which cannot be handled by the Debugger Run Loop. + * The alternative is to implement our own communications routines, but + * that will take even more code. + * + * FIXME: It may become necessary to hack the platform communications + * routines to detect that we're in the Debugger Run Loop and not the + * normal run loop to avoid system crashes, but the current goal is to + * have as minimal changes to the platform code as possible. + * + * Since there are two Run Loops for the platform, the way in which + * they interact is as follows: + * + * [Platform Run Loop] - DBG_INIT/ GDB Cmd/ BKPT -> [Debugger Run Loop] + * \ <------ GO/ STEP/ CONT ----- / + * ... ... + * ... Handle GDB Cmd/Resp + * ... ... + * {normal runloop {communications / + * processing} watchdog routines} + * ^-------v v-------^ + * + * The Platform will invoke dbg__bkpt_init() after hardware and system initialization, + * before entering the Platform Run Loop. This switches processing over to the + * Debugger Run Loop which will wait for the GDB command to Go/Step/Cont before + * returning control to the Platform Run Loop. + * + * Subsequently, Debugger Run Loop will be triggered by Breakpoints, or + * when the communications subsystem receives a GDB Command. + * + * The Debugger Run Loop is actually dbg__bkpt_waitCMD(), this file contains + * the Run Loop Tasks which needs to be invoked periodically by the Run Loop, + * to minimize the coupling between the ARMDEBUG modules and the Platform. + * + * Note: The Debugger Run Loop does not handle Hardware Shutdown, it is + * assumed that we wouldn't need to do so in Debug Mode. + * + */ +#define __ASSEMBLY__ + + .global dbg__runloopTasks + + +#ifdef __NXOS__ +/* NxOS Run Loop */ +dbg__runloopTasks: +/* Currently, there's nothing that needs to be done in the NxOS Run Loop */ + bx lr + +#else +/* NXT Firmware Run Loop */ + .extern cCommCtrl + +dbg__runloopTasks: + /* FIXME: Add necessary cXXXCtrl calls here */ + bl cCommCtrl + /* OSWatchdogWrite is a NULL function in the NXT Firmware?! */ + bx lr +#endif diff --git a/Debugger/debug_stub.S b/Debugger/debug_stub.S index 53b4abd..5d4cfff 100644 --- a/Debugger/debug_stub.S +++ b/Debugger/debug_stub.S @@ -3,7 +3,7 @@ * */ -/* Copyright (C) 2007-2010 the NxOS developers +/* Copyright (C) 2007-2011 the NxOS developers * * Module Developed by: TC Wan * @@ -320,6 +320,7 @@ debug_armComplexCCTable: .extern dbg__hasDebugMsg /* Check for message from the communications link */ .extern dbg__getDebugMsg /* Read a message from the communications link */ .extern dbg__putDebugMsg /* Write a message to the communications link */ + .extern dbg__runloopTasks /* Platform specific Run Loop processing */ /* The Debugger Interface can handle a total of (n-1) Breakpoint States and 1 Single Stepping State, @@ -501,7 +502,7 @@ dbg__bkpt_offset_outofrange: * ****************************************************************************/ dbg__bkpt_waitCMD: -1: bl dbg__getDebugMsg /* Read new message from Debugger, message buffer addr in R0, NULL if error */ +1: bl dbg__getDebugMsg /* Read new message from Debugger, message buffer addr in R0, 0 if none, -1 if error */ cmp r0, #0 beq 1b /* No message yet, keep checking */ movlt r0, #MSG_ERRCHKSUM /* Message invalid, checksum error? */ @@ -528,6 +529,7 @@ _dbg__cmdExists: _dbg__cmdError: _dbg_outputMsgStatusErr bl dbg__putDebugMsg /* Send error response to the GDB server */ + bl dbg__runloopTasks /* Execute platform run loop tasks while in ABRT mode */ b dbg__bkpt_waitCMD -- cgit v1.2.3