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
|