0

目前我正在尝试为我的 AArch64 开发板编写几个具有 EL3 权限的系统控制寄存器。

我将我的代码放在受信任的固件引导加载程序 (BL31) 中。

bl31_main这是我放入arm-trusted-firmware-source-code 的代码

asm("MRS    %x[result], SCR_EL3"
    : [result] "=r" (scr)
);

asm("MSR    SCR_EL3, %x[value]"
    :
    : [value] "r"   (scr)
);

我可以正确读取这些寄存器的值,因此我假设我的代码以 EL3 权限运行。

但是,对于我测试的几个寄存器,每次我向它们写入新值后,它们的值甚至都不会改变。

我无法想出可能导致此问题的原因。欢迎任何建议!

提前谢谢你。

西蒙

4

1 回答 1

1

如果您真的坚持这是一种妥协...在任何函数之外,而不是在函数中,而是在 C 文件中。

asm(".globl read_SCR_EL3; read_SCR_EL3: mrs x0,SCR_EL3; ret\n");

...

unsigned int read_SCR_EL3 ( void );

...

value=read_SCR_EL3();

这只是进行真正组装的另一种方式。

如果你想做内联,在你有真正的汇编工作之后,然后弄清楚如何像你试图做的那样获得内联。弄清楚你做错了什么/如果你做错了(我希望这里有人会或会提供帮助)(即使这是 C/编译器语言的东西,我也会添加一个程序集标签)。

在一个简单的函数中执行它,该函数包装了内联 asm 并说从读取中返回值。分解(vs -S 输出)二进制文件,找到该函数并检查编译器产生的内容以及它是否会/应该工作......优化它应该有点类似于简单的 mrs x0,registername/ret 代码,也许做点什么就像在返回之前给值加一,但在阅读后看到它正在使用/操作正确的寄存器......

于 2017-07-07T20:07:31.857 回答