summaryrefslogtreecommitdiffstats
path: root/bsps/lm32/shared/gdbstub/lm32-debug.S
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/lm32/shared/gdbstub/lm32-debug.S')
-rw-r--r--bsps/lm32/shared/gdbstub/lm32-debug.S338
1 files changed, 338 insertions, 0 deletions
diff --git a/bsps/lm32/shared/gdbstub/lm32-debug.S b/bsps/lm32/shared/gdbstub/lm32-debug.S
new file mode 100644
index 0000000000..7bd2c504e2
--- /dev/null
+++ b/bsps/lm32/shared/gdbstub/lm32-debug.S
@@ -0,0 +1,338 @@
+/*
+ * lm32 debug exception vectors
+ *
+ * Michael Walle <michael@walle.cc>, 2009
+ *
+ * If debugging is enabled the debug exception base address (deba) gets
+ * remapped to this file.
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ *
+ */
+
+#include "bspopts.h"
+
+.section .text
+/* (D)EBA alignment */
+.align 256
+.globl _deba
+
+_deba:
+debug_reset_handler:
+ /* Clear r0 */
+ xor r0,r0,r0
+ /* Disable interrupts */
+ wcsr IE, r0
+ /* Mask all interrupts */
+ wcsr IM,r0
+ /* Jump to original crt0 */
+ .extern crt0
+ mvhi r1, hi(crt0)
+ ori r1, r1, lo(crt0)
+ b r1
+ nop
+ nop
+debug_breakpoint_handler:
+ /* Clear r0 in case it was corrupted */
+ xor r0, r0, r0
+ mvhi r0, hi(registers)
+ ori r0, r0, lo(registers)
+ sw (r0+116), ra
+ sw (r0+128), ba
+ calli save_all
+ calli handle_exception
+ calli b_restore_and_return
+debug_instruction_bus_error_handler:
+ /* Clear r0 in case it was corrupted */
+ xor r0, r0, r0
+ mvhi r0, hi(registers)
+ ori r0, r0, lo(registers)
+ sw (r0+116), ra
+ sw (r0+128), ea
+ calli save_all
+ calli handle_exception
+ calli e_restore_and_return
+debug_watchpoint_handler:
+ /* Clear r0 in case it was corrupted */
+ xor r0, r0, r0
+ mvhi r0, hi(registers)
+ ori r0, r0, lo(registers)
+ sw (r0+116), ra
+ sw (r0+128), ba
+ calli save_all
+ calli handle_exception
+ calli b_restore_and_return
+debug_data_bus_error_handler:
+ /* Clear r0 in case it was corrupted */
+ xor r0, r0, r0
+ mvhi r0, hi(registers)
+ ori r0, r0, lo(registers)
+ sw (r0+116), ra
+ sw (r0+128), ea
+ calli save_all
+ calli handle_exception
+ calli e_restore_and_return
+debug_divide_by_zero_handler:
+ /* Clear r0 in case it was corrupted */
+ xor r0, r0, r0
+ mvhi r0, hi(registers)
+ ori r0, r0, lo(registers)
+ sw (r0+116), ra
+ sw (r0+128), ea
+ calli save_all
+ calli handle_exception
+ calli e_restore_and_return
+debug_interrupt_handler:
+ bi debug_isr_handler
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+debug_system_call_handler:
+ /* Clear r0 in case it was corrupted */
+ xor r0, r0, r0
+ mvhi r0, hi(registers)
+ ori r0, r0, lo(registers)
+ sw (r0+116), ra
+ sw (r0+128), ea
+ calli save_all
+ calli handle_exception
+ calli e_restore_and_return
+
+debug_isr_handler:
+ addi sp, sp, -156
+ sw (sp+4), r1
+ sw (sp+8), r2
+ sw (sp+12), r3
+ sw (sp+16), r4
+ sw (sp+20), r5
+ sw (sp+24), r6
+ sw (sp+28), r7
+ sw (sp+32), r8
+ sw (sp+36), r9
+ sw (sp+40), r10
+ sw (sp+44), ra
+ sw (sp+48), ea
+ sw (sp+52), ba
+ sw (sp+56), r11
+ sw (sp+60), r12
+ sw (sp+64), r13
+ sw (sp+68), r14
+ sw (sp+72), r15
+ sw (sp+76), r16
+ sw (sp+80), r17
+ sw (sp+84), r18
+ sw (sp+88), r19
+ sw (sp+92), r20
+ sw (sp+96), r21
+ sw (sp+100), r22
+ sw (sp+104), r23
+ sw (sp+108), r24
+ sw (sp+112), r25
+ sw (sp+116), r26
+ sw (sp+120), r27
+ /* 124 - SP */
+ addi r1, sp, 156
+ sw (sp+124), r1
+ /* 128 - PC */
+ sw (sp+128), ea
+ /* 132 - EID */
+ mvi r1, 6
+ sw (sp+132), r1
+ rcsr r1, EBA
+ sw (sp+136), r1
+ rcsr r1, DEBA
+ sw (sp+140), r1
+ rcsr r1, IE
+ sw (sp+144), r1
+
+ /* This is the same code as in cpu_asm.S */
+ rcsr r2, IP
+ rcsr r3, IM
+ mv r1, r0
+ and r2, r2, r3
+ mvi r3, 1
+ be r2, r0, 3f
+1:
+ and r4, r2, r3
+ bne r4, r0, 2f
+ sli r3, r3, 1
+ addi r1, r1, 1
+ bi 1b
+2:
+ addi r2, sp, 4
+
+ .extern __ISR_Handler
+ mvhi r3, hi(__ISR_Handler)
+ ori r3, r3, lo(__ISR_Handler)
+ call r3
+3:
+ lw r1, (sp+4)
+ lw r2, (sp+8)
+ lw r3, (sp+12)
+ lw r4, (sp+16)
+ lw r5, (sp+20)
+ lw r6, (sp+24)
+ lw r7, (sp+28)
+ lw r8, (sp+32)
+ lw r9, (sp+36)
+ lw r10, (sp+40)
+ lw ra, (sp+44)
+ lw ea, (sp+48)
+ lw ba, (sp+52)
+ lw r11, (sp+56)
+ lw r12, (sp+60)
+ lw r13, (sp+64)
+ lw r14, (sp+68)
+ lw r15, (sp+72)
+ lw r16, (sp+76)
+ lw r17, (sp+80)
+ lw r18, (sp+84)
+ lw r19, (sp+88)
+ lw r20, (sp+92)
+ lw r21, (sp+96)
+ lw r22, (sp+100)
+ lw r23, (sp+104)
+ lw r24, (sp+108)
+ lw r25, (sp+112)
+ lw r26, (sp+116)
+ lw r27, (sp+120)
+ lw ea, (sp+136)
+ wcsr EBA, ea
+ lw ea, (sp+140)
+ wcsr DEBA, ea
+ /* Restore EA from PC */
+ lw ea, (sp+128)
+ /* Stack pointer must be restored last, in case it has been updated */
+ lw sp, (sp+124)
+ eret
+
+save_all:
+ sw (r0+4), r1
+ sw (r0+8), r2
+ sw (r0+12), r3
+ sw (r0+16), r4
+ sw (r0+20), r5
+ sw (r0+24), r6
+ sw (r0+28), r7
+ sw (r0+32), r8
+ sw (r0+36), r9
+ sw (r0+40), r10
+ sw (r0+44), r11
+ sw (r0+48), r12
+ sw (r0+52), r13
+ sw (r0+56), r14
+ sw (r0+60), r15
+ sw (r0+64), r16
+ sw (r0+68), r17
+ sw (r0+72), r18
+ sw (r0+76), r19
+ sw (r0+80), r20
+ sw (r0+84), r21
+ sw (r0+88), r22
+ sw (r0+92), r23
+ sw (r0+96), r24
+ sw (r0+100), r25
+ sw (r0+104), r26
+ sw (r0+108), r27
+ sw (r0+112), sp
+ /* 116 - RA - saved in handler code above */
+ sw (r0+120), ea
+ sw (r0+124), ba
+ /* 128 - PC - saved in handler code above */
+ /* 132 - EID - saved below */
+ rcsr r1, EBA
+ sw (r0+136), r1
+ rcsr r1, DEBA
+ sw (r0+140), r1
+ rcsr r1, IE
+ sw (r0+144), r1
+
+ /* Work out EID from exception entry point address */
+ andi r1, ra, 0xff
+ srui r1, r1, 5
+ sw (r0+132), r1
+
+ /* Save pointer to registers */
+ mv r1, r0
+
+ /* Restore r0 to 0 */
+ xor r0, r0, r0
+
+ /* Save r0 (hardcoded to 0) */
+ sw (r1+0), r0
+ ret
+
+
+/* Restore gp registers */
+restore_gp:
+ lw r1, (r0+4)
+ lw r2, (r0+8)
+ lw r3, (r0+12)
+ lw r4, (r0+16)
+ lw r5, (r0+20)
+ lw r6, (r0+24)
+ lw r7, (r0+28)
+ lw r8, (r0+32)
+ lw r9, (r0+36)
+ lw r10, (r0+40)
+ lw r11, (r0+44)
+ lw r12, (r0+48)
+ lw r13, (r0+52)
+ lw r14, (r0+56)
+ lw r15, (r0+60)
+ lw r16, (r0+64)
+ lw r17, (r0+68)
+ lw r18, (r0+72)
+ lw r19, (r0+76)
+ lw r20, (r0+80)
+ lw r21, (r0+84)
+ lw r22, (r0+88)
+ lw r23, (r0+92)
+ lw r24, (r0+96)
+ lw r25, (r0+100)
+ lw r26, (r0+104)
+ lw r27, (r0+108)
+ ret
+
+/* Restore registers and return from exception */
+e_restore_and_return:
+ /* first restore gp registers */
+ mvhi r0, hi(registers)
+ ori r0, r0, lo(registers)
+ calli restore_gp
+ lw sp, (r0+112)
+ lw ra, (r0+116)
+ lw ba, (r0+124)
+ lw ea, (r0+136)
+ wcsr EBA, ea
+ lw ea, (r0+140)
+ wcsr DEBA, ea
+ /* Restore EA from PC */
+ lw ea, (r0+128)
+ xor r0, r0, r0
+ eret
+
+/* Restore registers and return from breakpoint */
+b_restore_and_return:
+ /* first restore gp registers */
+ mvhi r0, hi(registers)
+ ori r0, r0, lo(registers)
+ calli restore_gp
+ lw sp, (r0+112)
+ lw ra, (r0+116)
+ lw ea, (r0+120)
+ lw ba, (r0+136)
+ wcsr EBA, ba
+ lw ba, (r0+140)
+ wcsr DEBA, ba
+ /* Restore BA from PC */
+ lw ba, (r0+128)
+ xor r0, r0, r0
+ bret
+