From 7da686d7774215a4d66e0b522e548bce5b70d189 Mon Sep 17 00:00:00 2001 From: TC Wan Date: Thu, 16 Dec 2010 16:59:26 +0800 Subject: fix undef handler instruction address calculation, arm7 does not recognize bkpt instruction coding The Undef handler was adding to instead of subtracting from PC to get the BKPT instruction address. ARM7 does not recognize BKPT instruction coding. Modified instruction code to use UNDEF instruction prefix instead. Refer Steve Furber, ARM SOC Architecture, 2nd Ed, pg 143 --- Debugger/debug_stub.h | 15 ++++++++++++++- Debugger/undef_handler.S | 4 ++-- 2 files changed, 16 insertions(+), 3 deletions(-) (limited to 'Debugger') diff --git a/Debugger/debug_stub.h b/Debugger/debug_stub.h index ada5858..90294f0 100644 --- a/Debugger/debug_stub.h +++ b/Debugger/debug_stub.h @@ -99,7 +99,16 @@ * ARM and Thumb Breakpoint Instructions. */ /*@{*/ -#define BKPT32_INSTR 0xE1200070 /* ARM BKPT instruction */ + +#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 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 /* ARM BKPT Auto-Step Flag (for CONT support) */ #define BKPT32_MANUAL_BKPT 0x0007FF0F /* Manually inserted ARM Breakpoint */ @@ -159,7 +168,11 @@ FUNCDEF void dbg__bkpt_handler(void); * Equivalent to GDB breakpoint() routine for ARM code */ FUNCDEF void dbg_breakpoint_arm(void); +#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 /** dbg_breakpoint_thumb. * Equivalent to GDB breakpoint() routine for Thumb code diff --git a/Debugger/undef_handler.S b/Debugger/undef_handler.S index 385bf0c..61b8a5d 100644 --- a/Debugger/undef_handler.S +++ b/Debugger/undef_handler.S @@ -41,7 +41,7 @@ undef_handler: tst r1, #CPSR_THUMB /* Check for Thumb Mode */ beq _is_arm /* Clear, so it's ARM mode */ _is_thumb: - sub r0, lr, #-2 /* LR points to instruction after UNDEF instruction */ + sub r0, lr, #2 /* LR points to instruction after UNDEF instruction */ stmfd sp!, {r0,r1} /* Save UNDEF instruction addr and previous mode's CPSR to stack */ ldrh r0, [r0] /* load UNDEF instruction into r0 */ ldr r1, =BKPT16_ENUM_MASK /* Thumb BKPT enum mask */ @@ -55,7 +55,7 @@ _is_thumb: ldr lr, =dbg__thumb_bkpt_handler /* handle BKPT, BKPT index in r0 */ mov pc, lr /* Invoke Debugger State (Supervisor Mode) */ _is_arm: - sub r0, lr, #-4 /* LR points to instruction after UNDEF instruction */ + sub r0, lr, #4 /* LR points to instruction after UNDEF instruction */ stmfd sp!, {r0,r1} /* Save UNDEF instruction addr and previous mode's CPSR to stack */ ldr r0, [r0] /* load UNDEF instruction into r0 */ ldr r1, =BKPT32_ENUM_MASK /* ARM BKPT enum mask */ -- cgit v1.2.3