首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向RISCV-32ima添加新指令:“坏的RISCV-操作码”

向RISCV-32ima添加新指令:“坏的RISCV-操作码”
EN

Stack Overflow用户
提问于 2018-08-13 15:35:33
回答 3查看 1.5K关注 0票数 5

我正在寻求关于我试图添加到riscv的扩展的帮助。

全局设置

我的工作基线是存储库的克隆,它包含了常用的工具,其中包括:

  • 里萨夫弗尔
  • riscv-gnu-工具链
  • riscv-isa
  • riscv-操作码
  • riscv-pk

注:我克隆的最后一次提交是c6d58cecb3862deb742e1a5cc9d1c682f2c50ba9 (2018-04-24).

我的工作基于一个riscv32-ima核心。我想在处理器的ISA中添加一条指令,它将激活处理器中的一个特定组件。

从proc本身的行为来看,我没有问题:我修改了spike,我的指令(以及我添加到处理器中的组件)工作得非常好。

在汇编程序中,该指令如下所示:

代码语言:javascript
复制
addi a0, a0, 0
...            // other code
setupcomp      // activate my component ... 
...            // other code

确保这个指令没有任何操作数。

我所做的

我躲了一会儿,发现了本教程,它有点老了.

因此,我:

  1. 转到riscv-tools/riscv-opcodes/
  2. opcode及其掩码添加到riscv-tools/riscv-opcodes/opcodes中。我的看上去像这样: setupcomp 31..28=ignore 27..20=ignore 19..15=ignore 14..12=0 11..7=ignore 6..2=0x1a 1..0=3
  3. 在那里,我重新构建了必要的.h文件: 制造安装
  4. 现在,我将必要的stucts添加到riscv-tools/riscv-gnu-toolchain/riscv-binutils-gdb/include/opcode/riscv-opc.h中,并正式声明该指令: #定义MATCH_SETUPCOMP 0x6b #定义MASK_SETUPCOMP 0x707f DECLARE_INSN(setupcomp,MATCH_SETUPCOMP,MASK_SETUPCOMP) 这些值,是从操作码项目中生成的。
  5. 我还将必要的定义添加到:riscv-tools/riscv-gnu-toolchain/riscv-binutils-gdb/opcodes/riscv-opc.c: {"setupcomp“、"I”、"“、MATCH_SETUPCOMP、MASK_SETUPCOMP、match_opcode、0 },

现在,到现在为止,我相信我已经做了一切必要的事情。我仍然对我想要的操作码有疑问,但我不相信这对我观察到的行为和我现在描述的行为有影响。

我有问题

当我使用riscv-tools/build-rv32ima.sh script构建所有东西时,流程接近尾声(我相信某种类似于测试套件的东西),我会收到一条抱怨的消息:

代码语言:javascript
复制
Assembler messages:
Error: internal: bad RISC-V opcode (bits 0xffffffffffff8f80 undefined): setupcomp 
Fatal error: Broken assembler.  No assembly attempted.
make[6]: *** [lib_a-dummy.o] Error 1

我想我在指令的声明中遗漏了一些东西,可能这个声明没有被正确地“转发”到实际需要它的工具链的每个部分。但是我找不到在哪里/什么/如何/什么时候--我非常感谢在这方面的任何投入。

当然,我很可能遗漏了一些显而易见的东西,所以温柔点:)

EN

回答 3

Stack Overflow用户

发布于 2018-10-14 23:41:03

将自定义指令添加到工具链的最佳选择是使用我们的.insn汇编程序指令。虽然这并没有给您提供很好的语法(您需要使用预处理器宏或C包装函数),但它确实让您避免接触工具链,因为这充满了问题。

这方面最好的文档是.insn。基本上,用户可以发出RISC-V ISA手册定义的任何格式的指令,并提供直接填写每一位模式的选项。这与GCC的内联装配寄存器分配框架整合得很干净,就像任何其他指令一样。

票数 3
EN

Stack Overflow用户

发布于 2019-06-20 09:09:21

只需运行以下命令来解析掩码/匹配:

代码语言:javascript
复制
cat opcodes-pseudo opcodes opcodes-rvc opcodes-rvc-pseudo opcodes-custom | ./parse-opcodes -c > ~/temp.h

它给你正确的掩码和匹配的riscv-gnu-toolchain/riscv-binutils-gdb/include/opcode/riscv-opc.h现在重新编译,你已经做了!

票数 1
EN

Stack Overflow用户

发布于 2019-07-05 06:43:30

正如Domso所说,riscv-opc.c似乎需要显式地屏蔽不属于参数的每一点。但是,如果在您的ignore文件中将位设置为opcodes,则parse-opcodes生成的掩码将不会设置这些位。实际上,这就是您想要的,因为掩码应该表明set位是操作码的一部分。

由于fence.i使用被忽略的位,所以可以通过查看其定义方式来推断如何处理被忽略的位:

riscv-opc.h中,MASK_FENCE_I只是由parse-opcodes生成的掩码。

代码语言:javascript
复制
#define MATCH_FENCE_I 0x100f
#define MASK_FENCE_I  0x707f

这个掩码是给DECLARE_INSN的,没有改变:

代码语言:javascript
复制
DECLARE_INSN(fence_i, MATCH_FENCE_I, MASK_FENCE_I)

但是在riscv-opc.c中,被忽略的位使用按位或。

代码语言:javascript
复制
{"fence.i", "I", "", MATCH_FENCE_I, MASK_FENCE | MASK_RD | MASK_RS1 | MASK_IMM, match_opcode, 0 }

因为fence.i不使用任何参数,所以这相当于

代码语言:javascript
复制
{"fence.i", "I", "", 0xFFFFFFFF, match_opcode, 0 }

因此,您可能应该保持MASK_SETUPCOMP的原样,这样就可以将它提供给DECLARE_INSN,但将riscv-opc.c中的掩码设置为0xFFFFFFFF。另外,由于MASK_SETUPCOMP是由make install在一堆头文件中复制的,所以最好保持它们的一致性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51825942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档