Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写ARM的EL3寄存器_Arm_Arm64_Firmware_Trust Zone - Fatal编程技术网

如何编写ARM的EL3寄存器

如何编写ARM的EL3寄存器,arm,arm64,firmware,trust-zone,Arm,Arm64,Firmware,Trust Zone,目前,我正在尝试为我的AARC64开发板编写几个具有EL3权限的系统控制寄存器 我将代码放入受信任的固件引导加载程序BL31中 这是我放在bl31_main中的代码: 我可以正确读取这些寄存器的值,因此我假设我的代码使用EL3权限运行 然而,对于我测试过的几个寄存器,每次我向它们写入新值后,它们的值都不会改变 我想不出是什么导致了这个问题。欢迎任何建议 提前谢谢你 Simon如果你真的坚持这是一个折衷方案……在任何函数之外,不是在函数内部,而是在C文件中 asm(".globl read_SCR

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

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

这是我放在bl31_main中的代码:

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

然而,对于我测试过的几个寄存器,每次我向它们写入新值后,它们的值都不会改变

我想不出是什么导致了这个问题。欢迎任何建议

提前谢谢你


Simon

如果你真的坚持这是一个折衷方案……在任何函数之外,不是在函数内部,而是在C文件中

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

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

如果你想做内联,在你完成真正的汇编工作之后,然后弄清楚如何像你试图做的那样得到内联。找出你做错了什么/如果你做错了,我希望这里的人会或会帮助我添加一个汇编标记,即使这是C/编译器语言的东西


在一个简单的函数中执行该操作,该函数包装内联asm,并说从读取中返回值。反汇编vs-S输出二进制文件,找到该函数并检查编译器生成的内容,如果它可以/应该可以工作,那么它应该与简单的mrs x0、registername/ret代码完全相似,可能会在返回之前向值添加一个,但在阅读后,查看它是否正在使用/操作正确的寄存器…

我不是ARM专家,但正如我所提到的,我希望MRS/MSR指令需要%w,不是%x。我想文档显示是x寄存器不是W。当您尝试使用real assembly而不是内联时发生了什么?@DavidWohlferd如果我使用%W而不是%x,编译器会报告代码错误,因此这不应该是我问题的答案,谢谢。@old_timer为什么你认为内联汇编和真实汇编之间有区别?我的MRS针对我的情况返回正确的值,因此我假设我的内联汇编代码正常运行?因为人们在让内联汇编生成他们认为它正在生成的内容时遇到了大量问题。将问题一分为二这是我的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();