From c75b604e97fc736221cfffe63033cb2ac8239ac0 Mon Sep 17 00:00:00 2001 From: TC Wan Date: Fri, 17 Dec 2010 09:53:25 +0800 Subject: use defines instead of hardcoding constants for breakpoint instruction Inline assembly syntax depends on an archaiac gcc feature. Thanks to Stefan B. from EmbDev.net ARM GCC forum for the tip. --- Debugger/debug_stub.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Debugger/debug_stub.h b/Debugger/debug_stub.h index 0b1fee4..b090572 100644 --- a/Debugger/debug_stub.h +++ b/Debugger/debug_stub.h @@ -168,18 +168,42 @@ FUNCDEF void dbg__bkpt_handler(void); * Equivalent to GDB breakpoint() routine for ARM code */ FUNCDEF void dbg_breakpoint_arm(void); +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__ inline void dbg_breakpoint_arm(void) { asm volatile (".word 0xE727FF7F" /* (BKPT32_INSTR | BKPT32_MANUAL_BKPT) */ ); } #else 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); +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 */ + inline void dbg_breakpoint_thumb(void) { asm volatile (".hword 0xBE7F" /* (BKPT16_INSTR | BKPT16_MANUAL_BKPT) */); } +#endif + /*@}*/ #else -- cgit v1.2.3 From e3a7c6a9da89b96f2b7026e71d8e3beb1f5bd140 Mon Sep 17 00:00:00 2001 From: TC Wan Date: Fri, 17 Dec 2010 09:58:02 +0800 Subject: store user mode next instruction address in r15 slot Keep Next Instruction Address in User Mode R15 stack frame slot. --- Debugger/undef_handler.S | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Debugger/undef_handler.S b/Debugger/undef_handler.S index 61b8a5d..34154f7 100644 --- a/Debugger/undef_handler.S +++ b/Debugger/undef_handler.S @@ -35,7 +35,8 @@ undef_handler: On entry, LR_undef points to one instruction past the UNDEF instruction */ ldr sp, =__debugger_stack__ - stmfd sp, {r0-r15}^ /* Save workspace, user mode's pc via 'S' flag */ + stmfd sp, {r0-r15}^ /* Save workspace, user mode's pc via 'S' flag, R15: placeholder */ + str lr, [sp, #-4] /* Keep User's Next Instr Pointer (in UNDEF SP) in user mode R15 */ sub sp, sp, #(4*16) /* Need to manually update SP(undef) */ mrs r1, spsr /* Copy SPSR to r0 */ tst r1, #CPSR_THUMB /* Check for Thumb Mode */ -- cgit v1.2.3