在裸机模式下为aarch64运行gem5 fs仿真时遇到了gem5错误。特别是,当我的自定义启动代码尝试使用汇编指令tlbi ALLE3
使TLB无效时,模拟器报告了以下消息:
system.cpu T0 : @core0+72 : msr tlbi_alle3, xzr : IntAlu :
Undefined Instruction: Invoking Fault (AArch64 target EL) : Undefined Instruction cpsr:0x3c5 PC:0x2186c elr:0x2186c newVec: 0xa00
此外,我使用“ tlbi ALLE1”进行了测试,但最终出现了相同的错误。供您参考,我使用TimingSimpleCPU配置了CPU类型。根据该消息,传递的tlbi指令似乎在ARM64处理器模型中未实现。但是,由于我知道gem5在fs模式下成功为aarch64引导了Linux,所以我想知道这种情况如何处理tlbi指令。换句话说,如果tlbi指令实际上是gem5中未实现的指令,我认为引导Linux也应该遇到相同的错误。我能知道是否有人在gem5中遇到过tlbi的未定义指令错误吗? 感谢您的预先答复/评论。
Update1 :进一步的调查显示,tlbi VMALLE3
没有引起任何错误,而tlbi ALLE3
指令则导致了未定义的指令错误。
答案 0 :(得分:0)
Linux内核仅行使所有ARM功能的一部分。
例如,Linux v4.18 ARMv7之所以中断,是因为它开始使用CSDB,因此我们现在将该指令标记为已忽略:https://github.com/gem5/gem5/commit/33b311d8d8b8d527d500d62a35b50be63e41b556只是发出警告,因为该指令是实现定义的并且可以成为NOP。
值得注意的是,有几条ARMv8.x指令尚未实现。
所以我建议以下内容:
grep [24206, 17242]
下的.isa
文件,并搜索您正在使用的确切src/arch/arm/isa/
编码。
这些文件负责指令的解码,因此,如果执行了指令,则必须查看该文件。
在tlbi
下已经有匹配项,但是请确保您的确切指令字节在正确的位置。
如有必要,GDB逐步调试gem5,并记住可能存在解码错误,并且字节实际上应该是另一条指令。
实际上使用tlbi
进行Linux内核启动跟踪,并查看其中是否包含上述指令。
提供了一个可以重现该问题的汇编行,以及一个用于组装该问题的GNU GAS版本,以便其他人可以重现该问题。
如果您发现缺少编码,并且能够完全实现它,或者如果它是一个实现定义的NOP(如CSDB),只需警告就忽略它,请在Gerrit和CC me上发送补丁。