【发布时间】:2020-07-30 00:54:04
【问题描述】:
当我尝试在 Raspberry Pi 3B+(ARMv8a、AARCH32)上的内核模块中编译以下代码时,我收到“错误指令”错误。根据 ARMv8a 的 ARM 参考手册,此指令在 AARCH32 的异常级别 0 (EL0) 中未定义,但我在内核模块中使用它,所以我不明白这个问题。
__asm(
"mov r9,%0 \n\t"
"mov r10,%1 \n\t"
"mov r1,#0 \n\t
"str r1,[r9] \n\t"
"str r1,[r10] \n\t"
"DCCMVAC r9 \n\t"
"DCCMVAC r10 \n\t"
:
:"r" (firstPtr),
"r" (secondPtr)
:"r1","r9","r10","memory"
);
汇编相关消息如下,
/tmp/ccCmW5TY.s: Assembler messages:
/tmp/ccCmW5TY.s:221: Error: bad instruction `dccmvac r9'
/tmp/ccCmW5TY.s:222: Error: bad instruction `dccmvac r10'
【问题讨论】:
-
在 inline-asm 语句中硬编码 r9 和 r10 意味着您需要在这些寄存器上声明一个clobber。此外,您不会要求编译器在
r0中添加任何内容,因此这个 asm 片段不可能成为未损坏程序的一部分。 (请注意,官方不支持在naked函数中使用任何操作数,因此这不应该是naked函数的整个主体,其中包含调用约定中 r0 中的内容。) -
非常感谢 cmets。该代码只是我放入内核模块中的原始汇编程序的一部分,以测试错误指令错误是否在更高的特权级别消失。因此,该代码不打算用作内联汇编。
-
在这种情况下,我会使用
.S文件创建 minimal reproducible example,而不是伪造的内联汇编。 -
现在应该修复了。
标签: assembly arm raspberry-pi3