2025-02-02 20:19:19 +08:00
|
|
|
|
#include "tl2cdr.h"
|
2024-10-28 15:51:12 +08:00
|
|
|
|
|
2024-10-28 18:01:25 +08:00
|
|
|
|
.extern main
|
2025-01-15 17:58:12 +08:00
|
|
|
|
.extern plic_handle
|
2025-02-03 07:51:54 +08:00
|
|
|
|
.extern mst_svr_code
|
|
|
|
|
|
.extern plic_claim
|
|
|
|
|
|
.extern flag_intTxEnd
|
|
|
|
|
|
.extern flag_intRxError
|
|
|
|
|
|
.extern flag_intRxStart
|
|
|
|
|
|
.extern flag_intRxEnd
|
|
|
|
|
|
|
2025-02-02 20:19:19 +08:00
|
|
|
|
.globl _prog_start
|
2024-10-28 18:01:25 +08:00
|
|
|
|
.section .text.init
|
2024-10-28 15:51:12 +08:00
|
|
|
|
|
|
|
|
|
|
|
2024-10-28 18:01:25 +08:00
|
|
|
|
_prog_start:
|
2025-01-15 15:44:29 +08:00
|
|
|
|
li x1, 0
|
|
|
|
|
|
li x2, 0
|
|
|
|
|
|
li x3, 0
|
|
|
|
|
|
li x4, 0
|
|
|
|
|
|
li x5, 0
|
|
|
|
|
|
li x6, 0
|
|
|
|
|
|
li x7, 0
|
|
|
|
|
|
li x8, 0
|
|
|
|
|
|
li x9, 0
|
|
|
|
|
|
li x10, 0
|
|
|
|
|
|
li x11, 0
|
|
|
|
|
|
li x12, 0
|
|
|
|
|
|
li x13, 0
|
|
|
|
|
|
li x14, 0
|
|
|
|
|
|
li x15, 0
|
2025-02-03 07:51:54 +08:00
|
|
|
|
#ifdef __RV32I_MARCH__
|
2025-01-15 15:44:29 +08:00
|
|
|
|
li x16, 0
|
|
|
|
|
|
li x17, 0
|
|
|
|
|
|
li x18, 0
|
|
|
|
|
|
li x19, 0
|
|
|
|
|
|
li x20, 0
|
|
|
|
|
|
li x21, 0
|
|
|
|
|
|
li x22, 0
|
|
|
|
|
|
li x23, 0
|
|
|
|
|
|
li x24, 0
|
|
|
|
|
|
li x25, 0
|
|
|
|
|
|
li x26, 0
|
|
|
|
|
|
li x27, 0
|
|
|
|
|
|
li x28, 0
|
|
|
|
|
|
li x29, 0
|
|
|
|
|
|
li x30, 0
|
|
|
|
|
|
li x31, 0
|
2025-02-03 07:51:54 +08:00
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
li sp, 0x40011000
|
|
|
|
|
|
|
|
|
|
|
|
lui t0, %hi(plic_claim)
|
|
|
|
|
|
lw a0, %lo(plic_claim)(t0)
|
|
|
|
|
|
#la a0, plic_claim
|
|
|
|
|
|
|
|
|
|
|
|
lui t0, %hi(flag_intTxEnd)
|
|
|
|
|
|
lw a1, %lo(flag_intTxEnd)(t0)
|
|
|
|
|
|
#la a1, flag_intTxEnd
|
|
|
|
|
|
|
|
|
|
|
|
lui t0, %hi(flag_intRxError)
|
|
|
|
|
|
lw a2, %lo(flag_intRxError)(t0)
|
|
|
|
|
|
#la a2, flag_intRxError
|
|
|
|
|
|
|
|
|
|
|
|
lui t0, %hi(flag_intRxStart)
|
|
|
|
|
|
lw a3, %lo(flag_intRxStart)(t0)
|
|
|
|
|
|
#la a3, flag_intRxStart
|
|
|
|
|
|
|
|
|
|
|
|
lui t0, %hi(flag_intRxEnd)
|
|
|
|
|
|
lw a4, %lo(flag_intRxEnd)(t0)
|
|
|
|
|
|
#la a4, flag_intRxEnd
|
|
|
|
|
|
|
|
|
|
|
|
call mst_svr_code
|
2025-02-03 10:10:40 +08:00
|
|
|
|
mv t0, a0 #这里选择不同的trap_entry服务函数,这个是RV32I的代码
|
2025-01-15 15:44:29 +08:00
|
|
|
|
|
2025-02-03 10:10:40 +08:00
|
|
|
|
#la t0, trap_entry #这个是最初版的trap_entry,仅做了RV32E的改造
|
|
|
|
|
|
#la t0, opt_trap_entry #这个是做了汇编优化的,也做了RV32E的改造
|
2025-01-27 21:48:17 +08:00
|
|
|
|
csrw mtvec, t0
|
|
|
|
|
|
li t0, 1 << 11
|
|
|
|
|
|
csrw mie, t0
|
|
|
|
|
|
|
|
|
|
|
|
csrr t0, mstatus
|
|
|
|
|
|
ori t0, t0, 1<<3
|
|
|
|
|
|
csrw mstatus, t0
|
|
|
|
|
|
|
2024-10-28 18:01:25 +08:00
|
|
|
|
call main
|
2024-10-28 15:51:12 +08:00
|
|
|
|
|
2024-10-28 18:01:25 +08:00
|
|
|
|
ecall
|
2024-10-28 15:51:12 +08:00
|
|
|
|
|
|
|
|
|
|
|
2025-01-15 17:58:12 +08:00
|
|
|
|
.balign 32
|
|
|
|
|
|
.section .trap_entry, "ax", %progbits
|
|
|
|
|
|
trap_entry:
|
|
|
|
|
|
|
|
|
|
|
|
addi sp,sp,-136
|
|
|
|
|
|
sw ra,4(sp)
|
|
|
|
|
|
sw sp,8(sp)
|
|
|
|
|
|
sw gp,12(sp)
|
|
|
|
|
|
sw tp,16(sp)
|
|
|
|
|
|
sw t0,20(sp)
|
|
|
|
|
|
sw t1,24(sp)
|
|
|
|
|
|
sw t2,28(sp)
|
|
|
|
|
|
sw s0,32(sp)
|
|
|
|
|
|
sw s1,36(sp)
|
|
|
|
|
|
sw a0,40(sp)
|
|
|
|
|
|
sw a1,44(sp)
|
|
|
|
|
|
sw a2,48(sp)
|
|
|
|
|
|
sw a3,52(sp)
|
|
|
|
|
|
sw a4,56(sp)
|
|
|
|
|
|
sw a5,60(sp)
|
2025-02-03 07:51:54 +08:00
|
|
|
|
#ifdef __RV32I_MARCH__
|
2025-01-15 17:58:12 +08:00
|
|
|
|
sw a6,64(sp)
|
|
|
|
|
|
sw a7,68(sp)
|
|
|
|
|
|
sw s2,72(sp)
|
|
|
|
|
|
sw s3,76(sp)
|
|
|
|
|
|
sw s4,80(sp)
|
|
|
|
|
|
sw s5,84(sp)
|
|
|
|
|
|
sw s6,88(sp)
|
|
|
|
|
|
sw s7,92(sp)
|
|
|
|
|
|
sw s8,96(sp)
|
|
|
|
|
|
sw s9,100(sp)
|
|
|
|
|
|
sw s10,104(sp)
|
|
|
|
|
|
sw s11,108(sp)
|
|
|
|
|
|
sw t3,112(sp)
|
|
|
|
|
|
sw t4,116(sp)
|
|
|
|
|
|
sw t5,120(sp)
|
|
|
|
|
|
sw t6,124(sp)
|
2025-02-03 07:51:54 +08:00
|
|
|
|
#endif
|
2025-01-15 17:58:12 +08:00
|
|
|
|
|
|
|
|
|
|
csrr t0, mstatus # 读取 mstatus 寄存器
|
|
|
|
|
|
andi t0, t0, ~(1 << 3) # 清除 MIE 位 (全局中断禁用)
|
|
|
|
|
|
csrw mstatus, t0 # 写回 mstatus 寄存器
|
|
|
|
|
|
|
|
|
|
|
|
call plic_handle
|
|
|
|
|
|
|
|
|
|
|
|
csrr t0, mstatus
|
|
|
|
|
|
ori t0, t0, 1<<3
|
|
|
|
|
|
csrw mstatus, t0
|
|
|
|
|
|
|
|
|
|
|
|
lw ra,4(sp)
|
|
|
|
|
|
lw sp,8(sp)
|
|
|
|
|
|
lw gp,12(sp)
|
|
|
|
|
|
lw tp,16(sp)
|
|
|
|
|
|
lw t0,20(sp)
|
|
|
|
|
|
lw t1,24(sp)
|
|
|
|
|
|
lw t2,28(sp)
|
|
|
|
|
|
lw s0,32(sp)
|
|
|
|
|
|
lw s1,36(sp)
|
|
|
|
|
|
lw a0,40(sp)
|
|
|
|
|
|
lw a1,44(sp)
|
|
|
|
|
|
lw a2,48(sp)
|
|
|
|
|
|
lw a3,52(sp)
|
|
|
|
|
|
lw a4,56(sp)
|
|
|
|
|
|
lw a5,60(sp)
|
2025-02-03 07:51:54 +08:00
|
|
|
|
#ifdef __RV32I_MARCH__
|
2025-01-15 17:58:12 +08:00
|
|
|
|
lw a6,64(sp)
|
|
|
|
|
|
lw a7,68(sp)
|
|
|
|
|
|
lw s2,72(sp)
|
|
|
|
|
|
lw s3,76(sp)
|
|
|
|
|
|
lw s4,80(sp)
|
|
|
|
|
|
lw s5,84(sp)
|
|
|
|
|
|
lw s6,88(sp)
|
|
|
|
|
|
lw s7,92(sp)
|
|
|
|
|
|
lw s8,96(sp)
|
|
|
|
|
|
lw s9,100(sp)
|
|
|
|
|
|
lw s10,104(sp)
|
|
|
|
|
|
lw s11,108(sp)
|
|
|
|
|
|
lw t3,112(sp)
|
|
|
|
|
|
lw t4,116(sp)
|
|
|
|
|
|
lw t5,120(sp)
|
|
|
|
|
|
lw t6,124(sp)
|
2025-02-03 07:51:54 +08:00
|
|
|
|
#endif
|
2025-01-15 17:58:12 +08:00
|
|
|
|
addi sp,sp,136
|
|
|
|
|
|
|
|
|
|
|
|
mret
|
2024-10-28 18:01:25 +08:00
|
|
|
|
|
2025-02-02 20:19:19 +08:00
|
|
|
|
#.macro define_const name, value
|
|
|
|
|
|
# .equ \name, \value
|
|
|
|
|
|
#.endm
|
|
|
|
|
|
## 使用宏定义常量
|
|
|
|
|
|
#define_const CDR_INT_TXEND, 14
|
|
|
|
|
|
|
|
|
|
|
|
opt_trap_entry:
|
|
|
|
|
|
|
|
|
|
|
|
addi sp,sp,-136
|
|
|
|
|
|
|
|
|
|
|
|
#sw ra,4(sp)
|
|
|
|
|
|
#sw sp,8(sp)
|
|
|
|
|
|
#sw gp,12(sp)
|
|
|
|
|
|
#sw tp,16(sp)
|
|
|
|
|
|
|
|
|
|
|
|
sw t0,20(sp)
|
|
|
|
|
|
sw t1,24(sp)
|
|
|
|
|
|
#sw t2,28(sp)
|
|
|
|
|
|
sw s0,32(sp)
|
|
|
|
|
|
sw s1,36(sp)
|
|
|
|
|
|
|
|
|
|
|
|
#sw a0,40(sp)
|
|
|
|
|
|
#sw a1,44(sp)
|
|
|
|
|
|
#sw a2,48(sp)
|
|
|
|
|
|
#sw a3,52(sp)
|
|
|
|
|
|
#sw a4,56(sp)
|
|
|
|
|
|
#sw a5,60(sp)
|
|
|
|
|
|
#sw a6,64(sp)
|
|
|
|
|
|
#sw a7,68(sp)
|
|
|
|
|
|
#sw s2,72(sp)
|
|
|
|
|
|
#sw s3,76(sp)
|
|
|
|
|
|
#sw s4,80(sp)
|
|
|
|
|
|
#sw s5,84(sp)
|
|
|
|
|
|
#sw s6,88(sp)
|
|
|
|
|
|
#sw s7,92(sp)
|
|
|
|
|
|
#sw s8,96(sp)
|
|
|
|
|
|
#sw s9,100(sp)
|
|
|
|
|
|
#sw s10,104(sp)
|
|
|
|
|
|
#sw s11,108(sp)
|
|
|
|
|
|
#sw t3,112(sp)
|
|
|
|
|
|
#sw t4,116(sp)
|
|
|
|
|
|
#sw t5,120(sp)
|
|
|
|
|
|
#sw t6,124(sp)
|
|
|
|
|
|
|
|
|
|
|
|
csrr t0, mstatus # 读取 mstatus 寄存器
|
|
|
|
|
|
andi t0, t0, ~(1 << 3) # 清除 MIE 位 (全局中断禁用)
|
|
|
|
|
|
csrw mstatus, t0 # 写回 mstatus 寄存器
|
|
|
|
|
|
|
|
|
|
|
|
lui t1, %hi(plic_claim)
|
2025-02-03 07:51:54 +08:00
|
|
|
|
lw t0, %lo(plic_claim)(t1) # t0 = &plic_claim
|
|
|
|
|
|
|
|
|
|
|
|
lw t1, 0(t0) # t1 = *plic_claim
|
|
|
|
|
|
sw t1, 0(t0) # *plic_claim = t1
|
|
|
|
|
|
|
2025-02-02 20:19:19 +08:00
|
|
|
|
li s0, CDR_INT_TXEND
|
|
|
|
|
|
|
2025-02-03 07:51:54 +08:00
|
|
|
|
bne t1, s0, 1f #_if (t1 != s0) goto 1f
|
2025-02-02 20:19:19 +08:00
|
|
|
|
|
2025-02-03 07:51:54 +08:00
|
|
|
|
lui s0,%hi(flag_intTxEnd) #_else
|
2025-02-02 20:19:19 +08:00
|
|
|
|
li s1,1
|
|
|
|
|
|
sw s1,%lo(flag_intTxEnd)(s0)
|
|
|
|
|
|
j 4f
|
|
|
|
|
|
|
|
|
|
|
|
1:
|
|
|
|
|
|
li s0, CDR_INT_RXERROR
|
2025-02-03 07:51:54 +08:00
|
|
|
|
bne t1, s0, 2f #_if (t1 != s0) goto 2f
|
2025-02-02 20:19:19 +08:00
|
|
|
|
|
2025-02-03 07:51:54 +08:00
|
|
|
|
lui s0,%hi(flag_intRxError) #_else
|
2025-02-02 20:19:19 +08:00
|
|
|
|
li s1,1
|
|
|
|
|
|
sw s1,%lo(flag_intRxError)(s0)
|
|
|
|
|
|
j 4f
|
|
|
|
|
|
2:
|
|
|
|
|
|
li s0, CDR_INT_RXSTART
|
2025-02-03 07:51:54 +08:00
|
|
|
|
bne t1, s0, 3f #_if (t1 != s0) goto 3f
|
2025-02-02 20:19:19 +08:00
|
|
|
|
|
2025-02-03 07:51:54 +08:00
|
|
|
|
lui s0,%hi(flag_intRxStart) #_else
|
2025-02-02 20:19:19 +08:00
|
|
|
|
li s1,1
|
|
|
|
|
|
sw s1,%lo(flag_intRxStart)(s0)
|
|
|
|
|
|
j 4f
|
|
|
|
|
|
|
|
|
|
|
|
3:
|
|
|
|
|
|
li s0, CDR_INT_RXEND
|
2025-02-03 07:51:54 +08:00
|
|
|
|
bne t1, s0, 4f #_if (t1 != s0) goto 4f
|
2025-02-02 20:19:19 +08:00
|
|
|
|
|
2025-02-03 07:51:54 +08:00
|
|
|
|
lui s0,%hi(flag_intRxEnd) #_else
|
2025-02-02 20:19:19 +08:00
|
|
|
|
li s1,1
|
|
|
|
|
|
sw s1,%lo(flag_intRxEnd)(s0)
|
|
|
|
|
|
|
|
|
|
|
|
4:
|
|
|
|
|
|
csrr t0, mstatus
|
|
|
|
|
|
ori t0, t0, 1<<3
|
|
|
|
|
|
csrw mstatus, t0
|
|
|
|
|
|
|
|
|
|
|
|
#lw ra,4(sp)
|
|
|
|
|
|
#lw sp,8(sp)
|
|
|
|
|
|
#lw gp,12(sp)
|
|
|
|
|
|
#lw tp,16(sp)
|
|
|
|
|
|
|
|
|
|
|
|
lw t0,20(sp)
|
|
|
|
|
|
lw t1,24(sp)
|
|
|
|
|
|
#lw t2,28(sp)
|
|
|
|
|
|
lw s0,32(sp)
|
|
|
|
|
|
lw s1,36(sp)
|
|
|
|
|
|
|
|
|
|
|
|
#lw a0,40(sp)
|
|
|
|
|
|
#lw a1,44(sp)
|
|
|
|
|
|
#lw a2,48(sp)
|
|
|
|
|
|
#lw a3,52(sp)
|
|
|
|
|
|
#lw a4,56(sp)
|
|
|
|
|
|
#lw a5,60(sp)
|
|
|
|
|
|
#lw a6,64(sp)
|
|
|
|
|
|
#lw a7,68(sp)
|
|
|
|
|
|
#lw s2,72(sp)
|
|
|
|
|
|
#lw s3,76(sp)
|
|
|
|
|
|
#lw s4,80(sp)
|
|
|
|
|
|
#lw s5,84(sp)
|
|
|
|
|
|
#lw s6,88(sp)
|
|
|
|
|
|
#lw s7,92(sp)
|
|
|
|
|
|
#lw s8,96(sp)
|
|
|
|
|
|
#lw s9,100(sp)
|
|
|
|
|
|
#lw s10,104(sp)
|
|
|
|
|
|
#lw s11,108(sp)
|
|
|
|
|
|
#lw t3,112(sp)
|
|
|
|
|
|
#lw t4,116(sp)
|
|
|
|
|
|
#lw t5,120(sp)
|
|
|
|
|
|
#lw t6,124(sp)
|
|
|
|
|
|
|
|
|
|
|
|
addi sp,sp,136
|
|
|
|
|
|
|
|
|
|
|
|
mret
|
2024-10-28 18:01:25 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|