ARM的EL3寄存器怎么写
How to write the EL3 registers of ARM
目前我正在尝试为我的 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 特权。
然而,对于我测试的几个寄存器,每次我向它们写入新值后,它们的值甚至都没有改变。
我想不出可能导致此问题的原因。欢迎任何建议!
先谢谢你。
西蒙
如果你真的坚持这是一个妥协...在任何函数之外,而不是在函数内,而是在 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 正确的寄存器...
目前我正在尝试为我的 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 特权。
然而,对于我测试的几个寄存器,每次我向它们写入新值后,它们的值甚至都没有改变。
我想不出可能导致此问题的原因。欢迎任何建议!
先谢谢你。
西蒙
如果你真的坚持这是一个妥协...在任何函数之外,而不是在函数内,而是在 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 正确的寄存器...