2025-02-03 07:51:54 +08:00
|
|
|
|
#include "tl2cdr.h"
|
|
|
|
|
|
|
|
|
|
|
|
.globl _prog_start
|
|
|
|
|
|
.globl _rv32i_plic_handle
|
|
|
|
|
|
|
|
|
|
|
|
.section .text.init, "ax", %progbits
|
|
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
|
#其他代码全部使用RV32E编译,仅此代码采用 RV32I 编译,故而可以使用x0, x16~x31寄存器
|
|
|
|
|
|
#为了方便,不再使用ABI中的别名,直接使用x0, x16~x31;x1~x15使用ABI中定义的别名
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
_prog_start:
|
|
|
|
|
|
li x16, 0
|
|
|
|
|
|
|
|
|
|
|
|
mv x17, a0 # plic_claim
|
|
|
|
|
|
mv x18, a1 # flag_intTxEnd
|
|
|
|
|
|
mv x19, a2 # flag_intRxError
|
|
|
|
|
|
mv x20, a3 # flag_intRxStart
|
|
|
|
|
|
mv x21, a4 # flag_intRxEnd
|
|
|
|
|
|
mv x22, x0
|
|
|
|
|
|
|
|
|
|
|
|
#lui x23, %hi(_rv32i_plic_handle)
|
|
|
|
|
|
#lw x24, %lo(_rv32i_plic_handle)(x23)
|
|
|
|
|
|
|
|
|
|
|
|
la x24, _rv32i_plic_handle
|
|
|
|
|
|
|
|
|
|
|
|
li x25, 1
|
|
|
|
|
|
li x26, 0
|
|
|
|
|
|
li x27, 0
|
|
|
|
|
|
li x28, CDR_INT_TXEND
|
|
|
|
|
|
li x29, CDR_INT_RXERROR
|
|
|
|
|
|
li x30, CDR_INT_RXSTART
|
|
|
|
|
|
li x31, CDR_INT_RXSTART
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mv a0, x24
|
|
|
|
|
|
|
|
|
|
|
|
li x23, 0
|
|
|
|
|
|
li x24, 0
|
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
|
|
.balign 32
|
|
|
|
|
|
_rv32i_plic_handle:
|
2025-02-03 13:12:05 +08:00
|
|
|
|
#if 0 /*RV32的核心自动禁用中断,无需手动禁用*/
|
2025-02-03 07:51:54 +08:00
|
|
|
|
csrr x16, mstatus # 读取 mstatus 寄存器
|
|
|
|
|
|
andi x16, x16, ~(1 << 3) # 清除 MIE 位 (全局中断禁用)
|
|
|
|
|
|
csrw mstatus, x16 # 写回 mstatus 寄存器
|
2025-02-03 13:12:05 +08:00
|
|
|
|
#endif
|
2025-02-03 07:51:54 +08:00
|
|
|
|
|
|
|
|
|
|
lw x23, 0(x17) # x23 = *plic_claim
|
|
|
|
|
|
sw x23, 0(x17) # *plic_claim = x23
|
|
|
|
|
|
|
|
|
|
|
|
#li x25, 1
|
2025-02-03 13:12:05 +08:00
|
|
|
|
#if 0
|
2025-02-03 07:51:54 +08:00
|
|
|
|
li x24, CDR_INT_TXEND
|
|
|
|
|
|
bne x23, x24, 1f #_if (x23 != x24) goto 1f
|
|
|
|
|
|
sw x25, 0(x18) #_else
|
|
|
|
|
|
j 4f
|
|
|
|
|
|
|
|
|
|
|
|
1:
|
|
|
|
|
|
li x24, CDR_INT_RXERROR
|
|
|
|
|
|
bne x23, x24, 2f #_if (x23 != x24) goto 2f
|
|
|
|
|
|
sw x25, 0(x19) #_else
|
|
|
|
|
|
j 4f
|
|
|
|
|
|
|
|
|
|
|
|
2:
|
|
|
|
|
|
li x24, CDR_INT_RXSTART
|
|
|
|
|
|
bne x23, x24, 3f #_if (x23 != x24) goto 3f
|
|
|
|
|
|
sw x25, 0(x20) #_else
|
|
|
|
|
|
j 4f
|
|
|
|
|
|
|
|
|
|
|
|
3:
|
|
|
|
|
|
li x24, CDR_INT_RXEND
|
|
|
|
|
|
bne x23, x24, 4f #_if (x23 != x24) goto 4f
|
|
|
|
|
|
sw x25, 0(x21) #_else
|
2025-02-03 13:12:05 +08:00
|
|
|
|
#else
|
|
|
|
|
|
bne x23, x28, 1f #_if (x23 != x24) goto 1f
|
|
|
|
|
|
sw x25, 0(x18) #_else
|
|
|
|
|
|
j 4f
|
|
|
|
|
|
|
|
|
|
|
|
1:
|
|
|
|
|
|
bne x23, x29, 2f #_if (x23 != x24) goto 2f
|
|
|
|
|
|
sw x25, 0(x19) #_else
|
|
|
|
|
|
j 4f
|
2025-02-03 07:51:54 +08:00
|
|
|
|
|
2025-02-03 13:12:05 +08:00
|
|
|
|
2:
|
|
|
|
|
|
bne x23, x30, 3f #_if (x23 != x24) goto 3f
|
|
|
|
|
|
sw x25, 0(x20) #_else
|
|
|
|
|
|
j 4f
|
|
|
|
|
|
|
|
|
|
|
|
3:
|
|
|
|
|
|
bne x23, x31, 4f #_if (x23 != x24) goto 4f
|
|
|
|
|
|
sw x25, 0(x21) #_else
|
|
|
|
|
|
#endif
|
2025-02-03 07:51:54 +08:00
|
|
|
|
4:
|
2025-02-03 13:12:05 +08:00
|
|
|
|
#if 0 /*RV32的核心自动启动中断,无需手动启用*/
|
2025-02-03 07:51:54 +08:00
|
|
|
|
csrr x16, mstatus
|
|
|
|
|
|
ori x16, x16, 1<<3
|
|
|
|
|
|
csrw mstatus, x16
|
2025-02-03 13:12:05 +08:00
|
|
|
|
#endif
|
2025-02-03 07:51:54 +08:00
|
|
|
|
mret
|