66 lines
1.3 KiB
ArmAsm
66 lines
1.3 KiB
ArmAsm
|
|
#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_RXEND
|
|||
|
|
|
|||
|
|
mv a0, x24
|
|||
|
|
|
|||
|
|
li x23, 0
|
|||
|
|
li x24, 0
|
|||
|
|
ret
|
|||
|
|
|
|||
|
|
.balign 32
|
|||
|
|
_rv32i_plic_handle:
|
|||
|
|
lw x23, 0(x17) # x23 = *plic_claim
|
|||
|
|
sw x23, 0(x17) # *plic_claim = x23
|
|||
|
|
|
|||
|
|
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
|
|||
|
|
|
|||
|
|
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
|
|||
|
|
4:
|
|||
|
|
mret
|