From 97cc8322cef8027db22a24b7e011e5386171d97f Mon Sep 17 00:00:00 2001 From: TC Wan Date: Wed, 1 Dec 2010 17:54:07 +0800 Subject: fix undef_handler, initial design for next instruction decode Fixed error in handling Thumb instructions in undef_handler. Initial Design for Next Instruction Decoding --- Debugger/undef_handler.S | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'Debugger/undef_handler.S') diff --git a/Debugger/undef_handler.S b/Debugger/undef_handler.S index c160179..34bca92 100644 --- a/Debugger/undef_handler.S +++ b/Debugger/undef_handler.S @@ -37,11 +37,11 @@ undef_handler: stmfd sp, {r0-r15}^ /* Save workspace, user mode's pc via 'S' flag */ sub sp, sp, #(4*16) /* Need to manually update SP(undef) */ mrs r1, spsr /* Copy SPSR to r0 */ - 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 */ 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 */ + 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 */ bic r2, r0, r1 /* leave only opcode */ @@ -54,6 +54,8 @@ _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 */ + 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 */ bic r2, r0, r1 /* leave only opcode */ -- cgit v1.2.3