From d50dd5ab9567cc308e412c5e9e775dc8e15fb509 Mon Sep 17 00:00:00 2001 From: Tat-Chee Wan Date: Fri, 3 Feb 2012 23:57:04 +0100 Subject: merge armdebug rc1 This enables the use of GDB or GDB based debuggers to debug the code running on the NXT brick using the USB connection. --- AT91SAM7S256/armdebug/Debugger/debug_stub.h | 151 ++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 AT91SAM7S256/armdebug/Debugger/debug_stub.h (limited to 'AT91SAM7S256/armdebug/Debugger/debug_stub.h') diff --git a/AT91SAM7S256/armdebug/Debugger/debug_stub.h b/AT91SAM7S256/armdebug/Debugger/debug_stub.h new file mode 100644 index 0000000..6807ac1 --- /dev/null +++ b/AT91SAM7S256/armdebug/Debugger/debug_stub.h @@ -0,0 +1,151 @@ +/** @file debug_stub.h + * @brief Shared C/ASM header file for debugger stub + * + */ + +/* Copyright (C) 2007-2010 the NxOS developers + * + * Module Developed by: TC Wan + * + * See AUTHORS for a full list of the developers. + * + * See COPYING for redistribution license + * + */ + +#ifndef __DEBUG_STUB_H__ +#define __DEBUG_STUB_H__ + +#include "_c_arm_macros.h" + +/** @name BKPT suppport constants + * + * ARM and Thumb Breakpoint Instructions. + */ +/*@{*/ + +#define __ARM6OR7__ + +#ifdef __ARM6OR7__ +#define BKPT32_INSTR 0xE7200070 /* ARM6 and ARM7 does not trap unused opcodes (BKPT overlap with control instructions), \ + CPU has unpredictable behavior. Ref: Steve Furber, ARM SoC Architecture 2nd Ed, pg. 143 */ +#else +#define BKPT32_INSTR 0xE1200070 /* ARM BKPT instruction, will work in ARMv5T and above */ +#endif + +#define BKPT32_ENUM_MASK 0x000FFF0F /* ARM BKPT Enum Mask */ +#define BKPT32_AUTO_BKPT 0x00080000 /* RESERVED: ARM BKPT Auto-Step Flag (for CONT support) */ +#define BKPT32_MANUAL_BKPT 0x0007FF0F /* Manually inserted ARM Breakpoint */ + +#define BKPT16_INSTR 0xBE00 /* Thumb BKPT instruction */ +#define BKPT16_ENUM_MASK 0x00FF /* Thumb BKPT Enum Mask */ +#define BKPT16_AUTO_BKPT 0x0080 /* RESERVED: Thumb BKPT Auto-Step Flag (for CONT support) */ +#define BKPT16_MANUAL_BKPT 0x007F /* Manually inserted Thumb Breakpoint */ +/*@}*/ + +#ifndef __ASSEMBLY__ + +/* Define C stuff */ +/** @defgroup debug_public */ +/*@{*/ + + +/** Initialize Debugger. + * Equivalent to GDB set_debug_traps() routine + */ +FUNCDEF void dbg__bkpt_init(void); + +#ifdef __NXOS__ + +/** Communication Channel Enums + * + * Communication Channel Enums. + */ +ENUM_BEGIN +ENUM_VALASSIGN(COMM_USB, 1) /**< USB Communications */ +ENUM_VAL(COMM_BT) /**< Bluetooth Communications */ +ENUM_END(comm_chan_t) + +/** Enable switch to Debugger Mode from NxOS operational mode + * Returns 0 if no mode switch needed (already in Debug mode) + * !0 if mode switch will happen + * Used by NxOS only + */ +/* Note: This platform specific routine is found in debug_runlooptasks.S */ +FUNCDEF int nxos__handleDebug(U8 *buffer, comm_chan_t channel, U32 length); +#else +/** Switch Mode to Debugger. + * Used by NXT Firmware only + */ +/* Note: This platform specific routine is found in debug_runlooptasks.S */ +FUNCDEF UWORD cCommHandleDebug(UBYTE *pInBuf, UBYTE CmdBit, UWORD MsgLength); +#endif + +/** Debugger Handler Routine (called by Exception Handler Trap). + * Equivalent to GDB handle_exception() routine + */ +FUNCDEF void dbg__bkpt_handler(void); + +/** dbg_breakpoint_arm. + * Equivalent to GDB breakpoint() routine for ARM code + */ +/* FUNCDEF void dbg_breakpoint_arm(void); */ +static inline void dbg_breakpoint_arm(void) +{ + asm volatile (".word %a0" + : /* Output (empty) */ + : "X" (BKPT32_INSTR | BKPT32_MANUAL_BKPT) + ); +} + +#if 0 /* Old asm definitions, in case gas does not recognize %a0 operand */ + +#ifdef __ARM6OR7__ +static inline void dbg_breakpoint_arm(void) { asm volatile (".word 0xE727FF7F" /* (BKPT32_INSTR | BKPT32_MANUAL_BKPT) */ ); } +#else +static inline void dbg_breakpoint_arm(void) { asm volatile (".word 0xE127FF7F" /* (BKPT32_INSTR | BKPT32_MANUAL_BKPT) */ ); } +#endif + +#endif + +/** dbg_breakpoint_thumb. + * Equivalent to GDB breakpoint() routine for Thumb code + */ +/* FUNCDEF void dbg_breakpoint_thumb(void); */ +static inline void dbg_breakpoint_thumb(void) +{ + asm volatile (".hword %a0" + : /* Output (empty) */ + : "X" (BKPT16_INSTR | BKPT16_MANUAL_BKPT) + ); +} + +#if 0 /* Old asm definitions, in case gas does not recognize %a0 operand */ + +static inline void dbg_breakpoint_thumb(void) { asm volatile (".hword 0xBE7F" /* (BKPT16_INSTR | BKPT16_MANUAL_BKPT) */); } + +#endif + +/*@}*/ + +#else +/* Define Assembly stuff */ + +/* dbg__bkpt_arm + * GDB breakpoint() for ARM mode + */ + .macro dbg__bkpt_arm + .word (BKPT32_INSTR | BKPT32_MANUAL_BKPT) + .endm + +/* dbg__bkpt_thumb + * GDB breakpoint() for Thumb mode + */ + .macro dbg__bkpt_thumb + .hword (BKPT16_INSTR | BKPT16_MANUAL_BKPT) + .endm + +#endif + /*@}*/ + +#endif /* __DEBUG_STUB_H__ */ -- cgit v1.2.3