目前我正在尝试为我的AArch64开发板编写几个具有EL3权限的系统控制寄存器。
我把我的代码放在可靠的固件启动加载程序(BL31)中。
以下是我在arm-trusted-firmware-source-code的bl31_main
中添加的代码:
asm("MRS %x[result], SCR_EL3"
: [result] "=r" (scr)
);
asm("MSR SCR_EL3, %x[value]"
:
: [value] "r" (scr)
);
我可以正确读取这些寄存器的值,因此我假设我的代码以EL3特权运行。
但是,对于我测试过的几个寄存器,每次向它们写入新值后,它们的值都不会改变。
我无法想出可能导致此问题的原因。欢迎提出任何建议!
先谢谢你。
西蒙
答案 0 :(得分: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的简单函数中执行,并返回read中的值。 DISASSEMBLE(vs -S输出)二进制文件,找到该函数并检查编译器生成的内容以及它是否/应该工作...优化它应该有点类似于简单的mrs x0,registername / ret代码,也许做某事比如在返回之前添加一个值但是在阅读之后看到它正在使用/操作正确的寄存器...