皋陶 发表于 2020-10-15 10:06:18

RISC-V 借助CSR实现不修改工具链扩展指令

本帖最后由 皋陶 于 2020-11-23 15:34 编辑

RISC-V 借助CSR实现不修改工具链扩展指令

通常来讲,扩展指令集是要修改工具链的,至少也要修改汇编器和反汇编器。


然而借助CSR可以实现不修改工具链扩展指令集的目的。


这是我在阅读 GD32VF103C_START开发板的Demo程序时发现的,在 entry.S 文件中有这么一行:
csrrw ra, CSR_JALMNXTI, ra
翻阅 Bumblebee内核指令架构手册.pdf ,对这条指令是这么解释的:
Bumblebee 内核定义了 jalmnxti 寄存器用于减少中断延迟,加速中断咬尾。
jalmnxti 除了包含 mnxti 的开启中断使能,处理下一个中断,返回下一个中断的入口地址等功能之外,还有跳转至中断 handler 的功能,因此可以缩短中断处理的指令个数,达到减少中断延迟,加速中断咬尾的目的。
看起来是扩展了一个CSR寄存器,实际上是一条指令,而且这条指令的功能还挺复杂。
代码里写的是 csrrw ra, CSR_JALMNXTI, ra,实际上汇编器看到的是 csrrw ra, 0x7EE, ra,CSR_JALMNXTI 是个宏,定义语句 #define CSR_PUSHMCAUSE 0x7EE。反汇编生成的代码也是 csrrw ra,0x7ed,ra。这说明汇编器可以接受 CSR 的地址,而不仅仅是 CSR 的名称,反汇编器对非标准的 CSR 反汇编成地址而不是名称。利用汇编器的这个特点,可以通过扩展CSR来扩展指令集,不用修改汇编器就能使用扩展的功能。这是芯来的首创吗?
还有一个例子是 Bumblebee 扩展的 WFE 指令,实际上也是通过 CSR 扩展来实现。在 WFI 指令之前将 WFE CSR 设置为1,就可以实现 WFE 指令的功能。虽然要多写一条指令,但是却是在没有修改工具链的情况下扩展功能。工具链修改起来应该是个麻烦事,改完了还要验证。


页: [1]
查看完整版本: RISC-V 借助CSR实现不修改工具链扩展指令