123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352 |
- /*
- * Copyright (C) 2017-2019 Alibaba Group Holding Limited
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2020-08-20 zx.chen define default vector handlers.
- */
- #include <csi_config.h>
- #include <rtconfig.h>
- #include <cpuport.h>
- /* Enable interrupts when returning from the handler */
- #define MSTATUS_PRV1 0x1880
- .section .bss
- .align 2
- .globl g_trapstackalloc
- .global g_trapstackbase
- .global g_top_trapstack
- g_trapstackalloc:
- g_trapstackbase:
- .space 768
- g_top_trapstack:
- .align 2
- .globl g_trap_sp
- .type g_trap_sp, object
- g_trap_sp:
- .long 0
- .size g_trap_sp, .-g_trap_sp
- irq_nested_level:
- .long 0
- #ifdef ARCH_RISCV_FPU
- irq_mstatus_fs_flag:
- .long 0
- #endif
- .text
- .align 2
- .global Default_IRQHandler
- .weak Default_IRQHandler
- .type Default_IRQHandler, %function
- Default_IRQHandler:
- ipush
- #ifdef __riscv_flen
- csrr t1, mstatus
- srli t1, t1, 13
- andi t1, t1, 0x3
- la t3, irq_mstatus_fs_flag
- sw t1, (t3)
- li t0, 0x3
- bne t1, t0, .F_RegNotSave1
- addi sp, sp, -(20 * FREGBYTES)
- FSTORE ft0, 0 * FREGBYTES(sp)
- FSTORE ft1, 1 * FREGBYTES(sp)
- FSTORE ft2, 2 * FREGBYTES(sp)
- FSTORE ft3, 3 * FREGBYTES(sp)
- FSTORE ft4, 4 * FREGBYTES(sp)
- FSTORE ft5, 5 * FREGBYTES(sp)
- FSTORE ft6, 6 * FREGBYTES(sp)
- FSTORE ft7, 7 * FREGBYTES(sp)
- FSTORE fa0, 8 * FREGBYTES(sp)
- FSTORE fa1, 9 * FREGBYTES(sp)
- FSTORE fa2, 10 * FREGBYTES(sp)
- FSTORE fa3, 11 * FREGBYTES(sp)
- FSTORE fa4, 12 * FREGBYTES(sp)
- FSTORE fa5, 13 * FREGBYTES(sp)
- FSTORE fa6, 14 * FREGBYTES(sp)
- FSTORE fa7, 15 * FREGBYTES(sp)
- FSTORE ft8, 16 * FREGBYTES(sp)
- FSTORE ft9, 17 * FREGBYTES(sp)
- FSTORE ft10, 18 * FREGBYTES(sp)
- FSTORE ft11, 19 * FREGBYTES(sp)
- .F_RegNotSave1:
- #endif
- csrr t1, mcause
- andi t1, t1, 0x3FF
- slli t1, t1, 2
- la t0, g_irqvector
- add t0, t0, t1
- lw t2, (t0)
- jalr t2
- li t0, MSTATUS_PRV1
- csrs mstatus, t0
- #ifdef __riscv_flen
- la t0, irq_mstatus_fs_flag
- lw t1, (t0)
- li t0, 0x3
- bne t1, t0, .F_RegNotLoad
- FLOAD ft0, 0 * FREGBYTES(sp)
- FLOAD ft1, 1 * FREGBYTES(sp)
- FLOAD ft2, 2 * FREGBYTES(sp)
- FLOAD ft3, 3 * FREGBYTES(sp)
- FLOAD ft4, 4 * FREGBYTES(sp)
- FLOAD ft5, 5 * FREGBYTES(sp)
- FLOAD ft6, 6 * FREGBYTES(sp)
- FLOAD ft7, 7 * FREGBYTES(sp)
- FLOAD fa0, 8 * FREGBYTES(sp)
- FLOAD fa1, 9 * FREGBYTES(sp)
- FLOAD fa2, 10 * FREGBYTES(sp)
- FLOAD fa3, 11 * FREGBYTES(sp)
- FLOAD fa4, 12 * FREGBYTES(sp)
- FLOAD fa5, 13 * FREGBYTES(sp)
- FLOAD fa6, 14 * FREGBYTES(sp)
- FLOAD fa7, 15 * FREGBYTES(sp)
- FLOAD ft8, 16 * FREGBYTES(sp)
- FLOAD ft9, 17 * FREGBYTES(sp)
- FLOAD ft10,18 * FREGBYTES(sp)
- FLOAD ft11,19 * FREGBYTES(sp)
- addi sp, sp, (20 * FREGBYTES)
- .F_RegNotLoad:
- #endif
- ipop
- /******************************************************************************
- * Functions:
- * void trap(void);
- * default exception handler
- ******************************************************************************/
- .align 2
- .global trap
- .type trap, %function
- trap:
- /* Check for interrupt */
- j .
- addi sp, sp, -4
- sw t0, 0x0(sp)
- csrr t0, mcause
- blt t0, x0, .Lirq
- addi sp, sp, 4
- la t0, g_trap_sp
- addi t0, t0, -132
- sw x1, 0(t0)
- sw x2, 4(t0)
- sw x3, 8(t0)
- sw x4, 12(t0)
- sw x6, 20(t0)
- sw x7, 24(t0)
- sw x8, 28(t0)
- sw x9, 32(t0)
- sw x10, 36(t0)
- sw x11, 40(t0)
- sw x12, 44(t0)
- sw x13, 48(t0)
- sw x14, 52(t0)
- sw x15, 56(t0)
- sw x16, 60(t0)
- sw x17, 64(t0)
- sw x18, 68(t0)
- sw x19, 72(t0)
- sw x20, 76(t0)
- sw x21, 80(t0)
- sw x22, 84(t0)
- sw x23, 88(t0)
- sw x24, 92(t0)
- sw x25, 96(t0)
- sw x26, 100(t0)
- sw x27, 104(t0)
- sw x28, 108(t0)
- sw x29, 112(t0)
- sw x30, 116(t0)
- sw x31, 120(t0)
- csrr a0, mepc
- sw a0, 124(t0)
- csrr a0, mstatus
- sw a0, 128(t0)
- mv a0, t0
- lw t0, -4(sp)
- mv sp, a0
- sw t0, 16(sp)
- jal trap_c
- .Lirq:
- lw t0, 0x0(sp)
- addi sp, sp, 4
- j Default_IRQHandler
- .align 6
- .weak Default_Handler
- .global Default_Handler
- .type Default_Handler, %function
- Default_Handler:
- /* Check for nmi */
- addi sp, sp, -8
- sw t0, 0x0(sp)
- sw t1, 0x4(sp)
- csrr t0, mcause
- andi t0, t0, 0x3FF
- li t1, 24
- beq t0, t1, .NMI_Handler
- lw t0, 0x0(sp)
- lw t1, 0x4(sp)
- addi sp, sp, 8
- j trap
- .NMI_Handler:
- lw t0, 0x0(sp)
- lw t1, 0x4(sp)
- addi sp, sp, 8
-
- addi sp, sp, -64
- sw ra, 0(sp)
- sw t0, 4(sp)
- sw t1, 8(sp)
- sw t2, 12(sp)
- sw a0, 16(sp)
- sw a1, 20(sp)
- sw a2, 24(sp)
- sw a3, 28(sp)
- sw a4, 32(sp)
- sw a5, 36(sp)
- sw a6, 40(sp)
- sw a7, 44(sp)
- sw t3, 48(sp)
- sw t4, 52(sp)
- sw t5, 56(sp)
- sw t6, 60(sp)
- #ifdef __riscv_flen
- addi sp, sp, -(20*FREGBYTES)
- FSTORE ft0, 0 * FREGBYTES(sp)
- FSTORE ft1, 1 * FREGBYTES(sp)
- FSTORE ft2, 2 * FREGBYTES(sp)
- FSTORE ft3, 3 * FREGBYTES(sp)
- FSTORE ft4, 4 * FREGBYTES(sp)
- FSTORE ft5, 5 * FREGBYTES(sp)
- FSTORE ft6, 6 * FREGBYTES(sp)
- FSTORE ft7, 7 * FREGBYTES(sp)
- FSTORE fa0, 8 * FREGBYTES(sp)
- FSTORE fa1, 9 * FREGBYTES(sp)
- FSTORE fa2, 10 * FREGBYTES(sp)
- FSTORE fa3, 11 * FREGBYTES(sp)
- FSTORE fa4, 12 * FREGBYTES(sp)
- FSTORE fa5, 13 * FREGBYTES(sp)
- FSTORE fa6, 14 * FREGBYTES(sp)
- FSTORE fa7, 15 * FREGBYTES(sp)
- FSTORE ft8, 16 * FREGBYTES(sp)
- FSTORE ft9, 17 * FREGBYTES(sp)
- FSTORE ft10, 18 * FREGBYTES(sp)
- FSTORE ft11, 19 * FREGBYTES(sp)
- #endif
- la t0, g_nmivector
- lw t0, (t0)
- jalr t0
- #ifdef __riscv_flen
- FLOAD ft0, 0 * FREGBYTES(sp)
- FLOAD ft1, 1 * FREGBYTES(sp)
- FLOAD ft2, 2 * FREGBYTES(sp)
- FLOAD ft3, 3 * FREGBYTES(sp)
- FLOAD ft4, 4 * FREGBYTES(sp)
- FLOAD ft5, 5 * FREGBYTES(sp)
- FLOAD ft6, 6 * FREGBYTES(sp)
- FLOAD ft7, 7 * FREGBYTES(sp)
- FLOAD fa0, 8 * FREGBYTES(sp)
- FLOAD fa1, 9 * FREGBYTES(sp)
- FLOAD fa2, 10 * FREGBYTES(sp)
- FLOAD fa3, 11 * FREGBYTES(sp)
- FLOAD fa4, 12 * FREGBYTES(sp)
- FLOAD fa5, 13 * FREGBYTES(sp)
- FLOAD fa6, 14 * FREGBYTES(sp)
- FLOAD fa7, 15 * FREGBYTES(sp)
- FLOAD ft8, 16 * FREGBYTES(sp)
- FLOAD ft9, 17 * FREGBYTES(sp)
- FLOAD ft10, 18 * FREGBYTES(sp)
- FLOAD ft11, 19 * FREGBYTES(sp)
- addi sp, sp, (20 * FREGBYTES)
- #endif
- lw ra, 0(sp)
- lw t0, 4(sp)
- lw t1, 8(sp)
- lw t2, 12(sp)
- lw a0, 16(sp)
- lw a1, 20(sp)
- lw a2, 24(sp)
- lw a3, 28(sp)
- lw a4, 32(sp)
- lw a5, 36(sp)
- lw a6, 40(sp)
- lw a7, 44(sp)
- lw t3, 48(sp)
- lw t4, 52(sp)
- lw t5, 56(sp)
- lw t6, 60(sp)
- addi sp, sp, 64
- mret
- .size Default_Handler, . - Default_Handler
- /* Macro to define default handlers. Default handler
- * will be weak symbol and just dead loops. They can be
- * overwritten by other handlers */
- .macro def_irq_handler handler_name
- .weak \handler_name
- .globl \handler_name
- .set \handler_name, Default_Handler
- .endm
- def_irq_handler PendSV_Handler
- def_irq_handler SysTick_Handler
- def_irq_handler STIM0_IRQHandler
- def_irq_handler STIM1_IRQHandler
- def_irq_handler STIM2_IRQHandler
- def_irq_handler STIM3_IRQHandler
- def_irq_handler TIM0_IRQHandler
- def_irq_handler TIM1_IRQHandler
- def_irq_handler TIM2_IRQHandler
- def_irq_handler TIM3_IRQHandler
- def_irq_handler USART_IRQHandler
- def_irq_handler GPIO0_IRQHandler
- def_irq_handler GPIO1_IRQHandler
- def_irq_handler GPIO2_IRQHandler
- def_irq_handler GPIO3_IRQHandler
- def_irq_handler GPIO4_IRQHandler
- def_irq_handler GPIO5_IRQHandler
- def_irq_handler GPIO6_IRQHandler
- def_irq_handler GPIO7_IRQHandler
- def_irq_handler PAD_IRQHandler
- def_irq_handler TIM6_IRQHandler
- def_irq_handler TIM7_IRQHandler
- def_irq_handler TIM8_IRQHandler
- def_irq_handler TIM9_IRQHandler
- def_irq_handler TIM10_IRQHandler
- def_irq_handler TIM11_IRQHandler
|