forked from Imagelibrary/rtems
339 lines
6.0 KiB
ArmAsm
339 lines
6.0 KiB
ArmAsm
/*
|
|
* 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
|
|
|