From 51cf36077885f26e325739a60d45f822287a551f Mon Sep 17 00:00:00 2001 From: Tat-Chee Wan (USM) Date: Fri, 18 Mar 2011 12:51:07 +0800 Subject: we should only invoke bkpt in ccommhandledebug in normal operation mode Before invoking Breakpoint in cCommHandleDebug, we need to check if we're already in Abort (Debug) mode. Refactored header files to allow access to Mode Bit definitions from other files. --- Debugger/debug_comm.S | 4 +++- Debugger/debug_stub.S | 9 ++++++++- Debugger/debug_stub.h | 9 +++++++++ Debugger/undef_handler.S | 7 ------- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/Debugger/debug_comm.S b/Debugger/debug_comm.S index 6a7aa11..efe44a9 100644 --- a/Debugger/debug_comm.S +++ b/Debugger/debug_comm.S @@ -408,7 +408,8 @@ _dbg__usb_readbuf_reset: * R1: USB Command Bit * R2: USB Raw Message Length * On Exit: - * R0-R3: Destroyed + * R0: CPSR + * R1-R3: Destroyed */ dbg__copyNxtDebugMsg: @@ -416,6 +417,7 @@ dbg__copyNxtDebugMsg: str r2, [r1] ldr r1, =debug_InUSBBuf _dbg_memcpy r1, r0, r2, r3 /* r3: scratch register */ + mrs r0, cpsr bx lr #endif diff --git a/Debugger/debug_stub.S b/Debugger/debug_stub.S index 29e7814..5633db5 100644 --- a/Debugger/debug_stub.S +++ b/Debugger/debug_stub.S @@ -400,9 +400,16 @@ debug_armComplexCCTable: */ cCommHandleDebug: push {r0-r3} /* store all argX registers */ - bl dbg__copyNxtDebugMsg /* setup Debugger Message Buffers, validate input */ + bl dbg__copyNxtDebugMsg /* setup Debugger Message Buffers, validate input, CPSR returned in R0 */ + and r0, r0, #CPSR_MODE /* Check Current Mode */ + cmp r0, #MODE_ABT /* Debug Mode Check (Flags set) */ pop {r0-r3} /* restore all values */ + + /* If we're in ABT (Abort) mode, this means that we're already running the Debugger */ + beq _in_debug + /* Else, we're in normal operation mode (SVC), or other mode (??!) and need to force a switch to Debug mode */ dbg__bkpt_thumb +_in_debug: mov r0, #0 /* FIXME: Return Status */ bx lr #endif diff --git a/Debugger/debug_stub.h b/Debugger/debug_stub.h index d70152b..63e3c26 100644 --- a/Debugger/debug_stub.h +++ b/Debugger/debug_stub.h @@ -155,6 +155,15 @@ #define CPSR_IRQ 0x00000080 #define CPSR_MODE 0x0000001F +/* ARM Exception Modes */ +#define MODE_USR 0x10 /* User mode */ +#define MODE_FIQ 0x11 /* FIQ mode */ +#define MODE_IRQ 0x12 /* IRQ mode */ +#define MODE_SVC 0x13 /* Supervisor mode */ +#define MODE_ABT 0x17 /* Abort mode */ +#define MODE_UND 0x1B /* Undefined mode */ +#define MODE_SYS 0x1F /* System mode */ + /*@}*/ /** @name BKPT suppport constants diff --git a/Debugger/undef_handler.S b/Debugger/undef_handler.S index 6923d4d..f040219 100644 --- a/Debugger/undef_handler.S +++ b/Debugger/undef_handler.S @@ -11,13 +11,6 @@ #define __ASSEMBLY__ #include "debug_stub.h" -#define MODE_USR 0x10 /* User mode */ -#define MODE_FIQ 0x11 /* FIQ mode */ -#define MODE_IRQ 0x12 /* IRQ mode */ -#define MODE_SVC 0x13 /* Supervisor mode */ -#define MODE_ABT 0x17 /* Abort mode */ -#define MODE_UND 0x1B /* Undefined mode */ -#define MODE_SYS 0x1F /* System mode */ .text .code 32 -- cgit v1.2.3