#include "regdef.h" .macro TRAP_ENTRY_SETJMP addi.w sp, sp, -124 st.w ra, sp, 120 st.w tp, sp, 116 st.w sp, sp, 112 st.w a0, sp, 108 st.w a1, sp, 104 st.w a2, sp, 100 st.w a3, sp, 96 st.w a4, sp, 92 st.w a5, sp, 88 st.w a6, sp, 84 st.w a7, sp, 80 st.w t0, sp, 76 st.w t1, sp, 72 st.w t2, sp, 68 st.w t3, sp, 64 st.w t4, sp, 60 st.w t5, sp, 56 st.w t6, sp, 52 st.w t7, sp, 48 st.w t8, sp, 44 st.w $r21, sp,40 st.w fp, sp, 36 st.w s0, sp, 32 st.w s1, sp, 28 st.w s2, sp, 24 st.w s3, sp, 20 st.w s4, sp, 16 st.w s5, sp, 12 st.w s6, sp, 8 st.w s7, sp, 4 st.w s8, sp, 0 .endm .macro TRAP_EXIT_LONGJMP ld.w ra, sp, 120 ld.w tp, sp, 116 ld.w sp, sp, 112 ld.w a0, sp, 108 ld.w a1, sp, 104 ld.w a2, sp, 100 ld.w a3, sp, 96 ld.w a4, sp, 92 ld.w a5, sp, 88 ld.w a6, sp, 84 ld.w a7, sp, 80 ld.w t0, sp, 76 ld.w t1, sp, 72 ld.w t2, sp, 68 ld.w t3, sp, 64 ld.w t4, sp, 60 ld.w t5, sp, 56 ld.w t6, sp, 52 ld.w t7, sp, 48 ld.w t8, sp, 44 ld.w $r21, sp,40 ld.w fp, sp, 36 ld.w s0, sp, 32 ld.w s1, sp, 28 ld.w s2, sp, 24 ld.w s3, sp, 20 ld.w s4, sp, 16 ld.w s5, sp, 12 ld.w s6, sp, 8 ld.w s7, sp, 4 ld.w s8, sp, 0 addi.w sp, sp, 124 ertn .endm .section .text .align 6 .global trap_handler .weak trap_handler trap_handler: TRAP_ENTRY_SETJMP csrrd a0, csr_estat csrrd a1, csr_era srli.w t0, a0, 16 bne zero, t0, is_exceptions andi t0, a0, 0x3FC srli.w t1, t0, 2 # 根据中断号跳转到相应的处理程序 priority move t2, t1 andi t2, t2, 0x1 li.w t8, 0x1 beq t2, t8, handle_hwi0 move t2, t1 andi t2, t2, 0x2 li.w t8, 0x2 beq t2, t8, handle_hwi1 move t2, t1 andi t2, t2, 0x4 li.w t8, 0x4 beq t2, t8, handle_hwi2 move t2, t1 andi t2, t2, 0x8 li.w t8, 0x8 beq t2, t8, handle_hwi3 move t2, t1 andi t2, t2, 0x10 li.w t8, 0x10 beq t2, t8, handle_hwi4 move t2, t1 andi t2, t2, 0x20 li.w t8, 0x20 beq t2, t8, handle_hwi5 move t2, t1 andi t2, t2, 0x40 li.w t8, 0x40 beq t2, t8, handle_hwi6 move t2, t1 andi t2, t2, 0x80 li.w t8, 0x80 beq t2, t8, handle_hwi7 b trap_jump_exit is_exceptions: addi.w t8, a1, 4 csrwr t8, csr_era 1: b 1b trap_jump_exit: TRAP_EXIT_LONGJMP # HWI0 处理程序 handle_hwi0: bl HWI0_IntrHandler b trap_jump_exit # HWI1 处理程序 handle_hwi1: b trap_jump_exit # HWI2 处理程序 handle_hwi2: b trap_jump_exit # HWI3 处理程序 handle_hwi3: b trap_jump_exit # HWI4 处理程序 handle_hwi4: b trap_jump_exit # HWI5 处理程序 handle_hwi5: b trap_jump_exit # HWI6 处理程序 handle_hwi6: b trap_jump_exit # HWI7 处理程序 handle_hwi7: b trap_jump_exit .weak HWI0_IntrHandler HWI0_IntrHandler: 1: b 1b