aboutsummaryrefslogtreecommitdiff
path: root/AT91SAM7S256/armdebug/Debugger/debug_test.S
diff options
context:
space:
mode:
authorTat-Chee Wan2012-02-03 23:57:04 +0100
committerNicolas Schodet2012-02-11 17:30:42 +0100
commitd50dd5ab9567cc308e412c5e9e775dc8e15fb509 (patch)
treeb7d30c1025fb34e65a04d15701c53ee2ca071dec /AT91SAM7S256/armdebug/Debugger/debug_test.S
parentceb0cbf65a11aed7662eb41ae66157e60ff61d60 (diff)
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.
Diffstat (limited to 'AT91SAM7S256/armdebug/Debugger/debug_test.S')
-rw-r--r--AT91SAM7S256/armdebug/Debugger/debug_test.S160
1 files changed, 160 insertions, 0 deletions
diff --git a/AT91SAM7S256/armdebug/Debugger/debug_test.S b/AT91SAM7S256/armdebug/Debugger/debug_test.S
new file mode 100644
index 0000000..7f8c85f
--- /dev/null
+++ b/AT91SAM7S256/armdebug/Debugger/debug_test.S
@@ -0,0 +1,160 @@
+/** @file debug_test.S
+ * @brief Test Routines to trigger ARM and Thumb Manual Breakpoints
+ *
+ */
+
+/* Copyright (C) 2007-2011 the NxOS developers
+ *
+ * Module Developed by: TC Wan <tcwan@cs.usm.my>
+ *
+ * See AUTHORS for a full list of the developers.
+ *
+ * See COPYING for redistribution license
+ *
+ */
+#define __ASSEMBLY__
+#include "debug_stub.h"
+
+.text
+.align 4
+.code 32
+
+/**********************************************
+ * dbg__test_arm_bkpt Test Routine
+ *
+ */
+ .global dbg__test_arm_bkpt
+dbg__test_arm_bkpt:
+ stmfd sp!,{lr}
+ dbg__bkpt_arm /* Trigger ARM Manual Breakpoint */
+ ldmfd sp!,{pc}
+
+
+/**********************************************
+ * dbg__test_arm_instrstep Test Routine
+ * Used to test GDB Stepping command
+ * This routine exercises the mov, add, ldr, ldm, b, bl,
+ * and bx instructions which modify the PC (R15)
+ * In addition, conditional instructions are also evaluated.
+ *
+ */
+ .global dbg__test_arm_instrstep
+dbg__test_arm_instrstep:
+ stmfd sp!, {lr}
+ bl dbg__test_arm_instr_sub1
+ ldr r1, =test_arm_3 /* R1: pointer to test_arm_3 */
+ ldr r2, =test_arm_2 /* R2: pointer to test_arm_2 */
+ mov pc, r1
+
+test_arm_1:
+ subs r0, r0, #1
+ addne pc, r2, #4 /* If R0 > 0, keep branching to a new location */
+ /* else R0 == 0 */
+ b exit_dbg__test_arm_instrstep
+
+test_arm_2:
+ sub r0, r0, #1
+ cmp r0, #5
+ bgt test_arm_1
+ ldrle pc, =exit_dbg__test_arm_instrstep
+ b exit_dbg__test_arm_instrstep
+
+test_arm_3:
+ sub r0, r0, #1
+ teq r0, #8
+ beq test_arm_1
+ ldrne r3, =test_arm_3
+ bx r3
+
+exit_dbg__test_arm_instrstep:
+ bl dbg__test_thumb_instr_sub1
+ ldmfd sp!, {pc}
+
+ .global dbg__test_arm_instr_sub1
+dbg__test_arm_instr_sub1:
+ mov r0, #10
+ bx lr
+
+ .global dbg__test_arm_instr_sub1
+dbg__test_arm_instr_sub2:
+ stmfd sp!, {r4, lr}
+ mov r0, #TRUE
+ ldmfd sp!, {r4, pc}
+
+/**********************************************
+ * dbg__test_thumb_bkpt Test Routine
+ *
+ */
+ .global dbg__test_thumb_bkpt
+dbg__test_thumb_bkpt:
+ stmfd sp!,{lr}
+/* ldr r0, =_thumb_entry
+ orr r0, r0, #1 @ Set Thumb mode
+ mov lr, pc
+ bx r0
+*/
+ bl _thumb_entry
+ ldmfd sp!,{pc}
+
+.code 16
+.thumb_func
+_thumb_entry:
+ dbg__bkpt_thumb
+ bx lr
+
+
+/**********************************************
+ * dbg__test_thumb_instrstep Test Routine
+ * Used to test GDB Stepping command
+ *
+ */
+ .global dbg__test_thumb_instrstep
+.thumb_func
+dbg__test_thumb_instrstep:
+ push {lr}
+ bl dbg__test_thumb_instr_sub1
+ bl dbg__test_thumb_instr_sub2
+
+test_thumb_1:
+ sub r0, #1
+ bne test_thumb_2
+ /* else R0 == 0 */
+ b exit_dbg__test_thumb_instrstep
+
+test_thumb_2:
+ sub r0, #1
+ cmp r0, #5
+ bls test_thumb_1
+ bhi test_thumb_3
+ beq test_thumb_2
+ b test_thumb_1
+
+test_thumb_3:
+ sub r0, #1
+ cmp r0, #0xB
+ blo load_test_thumb_1
+ ldr r2, =test_thumb_3+1 /* Need to set Thumb bit */
+ b exit_test_thumb_3
+load_test_thumb_1:
+ ldr r2, =test_thumb_1+1 /* Need to set Thumb bit */
+exit_test_thumb_3:
+ bx r2
+
+exit_dbg__test_thumb_instrstep:
+ bl dbg__test_arm_instr_sub1
+ pop {r1}
+ bx r1
+
+.thumb_func
+dbg__test_thumb_instr_sub1:
+ mov r0, #0x0F
+ bx lr
+
+.thumb_func
+dbg__test_thumb_instr_sub2:
+ push {lr}
+ mov r1, #FALSE
+ pop {pc}
+
+
+.end