#include "tl2cdr.h" .extern main .extern plic_handle .globl _prog_start .section .text.init _prog_start: 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 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 #la t0, trap_entry la t0, opt_trap_entry csrw mtvec, t0 li t0, 1 << 11 csrw mie, t0 li sp, 0x40011000 csrr t0, mstatus ori t0, t0, 1<<3 csrw mstatus, t0 call main ecall .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) 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 寄存器 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) 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 #.macro define_const name, value # .equ \name, \value #.endm ## 使用宏定义常量 #define_const CDR_INT_TXEND, 14 .extern plic_claim .extern flag_intTxEnd .extern flag_intRxError .extern flag_intRxStart .extern flag_intRxEnd 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 寄存器 # t0 = &plic_claim lui t1, %hi(plic_claim) lw t0, %lo(plic_claim)(t1) # t1 = *plic_claim lw t1, 0(t0) li s0, CDR_INT_TXEND #_if (t1 != s0) goto 1f bne t1, s0, 1f #_else lui s0,%hi(flag_intTxEnd) li s1,1 sw s1,%lo(flag_intTxEnd)(s0) j 4f 1: li s0, CDR_INT_RXERROR #_if (t1 != s0) goto 2f bne t1, s0, 2f #_else lui s0,%hi(flag_intRxError) li s1,1 sw s1,%lo(flag_intRxError)(s0) j 4f 2: li s0, CDR_INT_RXSTART #_if (t1 != s0) goto 3f bne t1, s0, 3f #_else lui s0,%hi(flag_intRxStart) li s1,1 sw s1,%lo(flag_intRxStart)(s0) j 4f 3: li s0, CDR_INT_RXEND #_if (t1 != s0) goto 4f beq t1, s0, 4f #_else lui s0,%hi(flag_intRxEnd) li s1,1 sw s1,%lo(flag_intRxEnd)(s0) 4: sw t1, 0(t0) 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