【问题标题】:How to add custom instruction to RISCV cross compiler?如何向 RISCV 交叉编译器添加自定义指令?
【发布时间】:2019-11-01 13:27:05
【问题描述】:

我克隆了 riscv-tools (https://github.com/riscv/riscv-tools) 和 riscv-gnu-toolchain (https://github.com/riscv/riscv-gnu-toolchain) 并且能够让 Spike、pk 和交叉编译器 (riscv64-unknown-elf-gcc) 工作。我想扩展它并能够添加自定义指令并找到本教程:https://nitish2112.github.io/post/adding-instruction-riscv/ 但它有点过时了。当前的 RISCV GNU 工具链 repo 没有 riscv-binutils-gdb 目录,但有 riscv-binutils 目录和 riscv-gdb 目录,所以我在添加指令时尝试使用这些目录中的文件。

在我将操作码添加到 riscv-tools/riscv-opcodes/opcodes 和 riscv-gnu-toolchian/riscv-{binutils, gcb} 中的文件并运行以下代码后:

sudo ./configure --prefix=/home/me/riscv64
sudo make newlib -j $(nproc)
sudo make linux -j $(nproc)
export PATH="$PATH:/home/me/riscv64/bin"
export RISCV="/home/me/riscv64"

然后我通过运行测试它

riscv64-unknown-elf-gcc -o mod mod.c

在教程中使用相同的 mod.c 文件,只是我在 asm 内联后添加了一个分号以使其通过编译器。然后我从汇编程序中得到以下错误:

mod.c:7: Error: unrecognized opcode `mod a5,a5,a4'

我做错了什么吗?感谢您的帮助和时间。

【问题讨论】:

  • 自本教程以来,RISC-V 工具链的构建树似乎发生了很大变化,如果没有重大变化,它就无法工作。

标签: simulator riscv instruction-set


【解决方案1】:

看起来那个教程确实已经过时了。幸运的是,RISC-V 代码库使添加新指令变得更加容易。 https://github.com/riscv/riscv-isa-sim 中的说明非常有用:

向模拟器添加指令需要两个步骤:

  1. 在文件 riscv/insns/.h 中描述指令的功能行为。检查其他指令 该目录作为起点。

  2. 将操作码和操作码掩码添加到 riscv/opcodes.h。或者,将其添加到 riscv-opcodes 包中,它会为您执行此操作:

    $ cd ../riscv-opcodes $ vi opcodes // 为新指令添加一行 $ 制作安装

  3. 重建模拟器。

riscv-opcodes 存储库由交叉编译器代码链、汇编器以及模拟器调用,因此它应该可以重建它们。要将其添加到交叉编译器中,更重要的是让交叉编译器实际发出该指令(在本例中为 mod)将会困难许多数量级,这就是博客使用内联汇编的原因。

【讨论】:

    猜你喜欢
    • 2015-04-16
    • 2019-01-20
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2019-11-06
    • 2019-01-21
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多