ARM的EL3寄存器怎么写

How to write the EL3 registers of ARM

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

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

这是我在 arm-trusted-firmware-source-codebl31_main 中输入的代码:

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

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

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

然而,对于我测试的几个寄存器,每次我向它们写入新值后,它们的值甚至都没有改变。

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

先谢谢你。

西蒙

如果你真的坚持这是一个妥协...在任何函数之外,而不是在函数内,而是在 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();

这只是进行实际组装的另一种方式。

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

在一个简单的函数中执行它,该函数包装了内联 asm 并说出 returns 读取的值。 DISASSEMBLE(vs -S 输出)二进制文件,找到该函数并检查编译器生成的内容以及它是否 would/should 工作......优化它应该有点类似于简单的 mrs x0,registername/ret 代码,也许在返回之前对值加一,但在阅读后发现它是 using/manipulating 正确的寄存器...