gpt4 book ai didi

arm - 如何解读ARM的SMC调用?

转载 作者:行者123 更新时间:2023-12-01 19:28:18 24 4
gpt4 key购买 nike

我一直在阅读 Android 的内核,以了解 CPU 内核(又名 DVFS、DCVS)的动态电源管理是如何完成的。我找到的代码here对以下函数(定义 here )进行一些调用,该函数又调用 SMC 汇编指令。

ARM 有一个文档解释 SMC calling convention ,但我无法使用它来理解以下函数。如何根据输入操作数进一步追踪 SMC 指令以了解它实际执行的操作?

s32 scm_call_atomic4_3(u32 svc, u32 cmd, u32 arg1, u32 arg2,
u32 arg3, u32 arg4, u32 *ret1, u32 *ret2)
{
int ret;
int context_id;
register u32 r0 asm("r0") = SCM_ATOMIC(svc, cmd, 4);
register u32 r1 asm("r1") = (u32)&context_id;
register u32 r2 asm("r2") = arg1;
register u32 r3 asm("r3") = arg2;
register u32 r4 asm("r4") = arg3;
register u32 r5 asm("r5") = arg4;
asm volatile(
__asmeq("%0", "r0")
__asmeq("%1", "r1")
__asmeq("%2", "r2")
__asmeq("%3", "r0")
__asmeq("%4", "r1")
__asmeq("%5", "r2")
__asmeq("%6", "r3")
#ifdef REQUIRES_SEC
".arch_extension sec\n"
#endif
"smc #0 @ switch to secure world\n"
: "=r" (r0), "=r" (r1), "=r" (r2)
: "r" (r0), "r" (r1), "r" (r2), "r" (r3), "r" (r4), "r" (r5));
ret = r0;
if (ret1)
*ret1 = r1;
if (ret2)
*ret2 = r2;
return r0;
}
EXPORT_SYMBOL(scm_call_atomic4_3);

最佳答案

SMC calling conventions是 ARM 关于如何实现跨世界 API 的建议,以便多个供应商可以在任一世界中编写代码并以最小的不兼容性共存。至少这是意图。供应商(在您的情况下为 Android/Linux)不必执行此操作,并且如果安全世界不遵循它,则可能无法执行此操作。

but I haven't been able to use it to make sense of the following function

SMC 指令是从正常世界到安全监视器的受控更改。监视器有自己的向量表,svc 的条目是 SMC 调用。寄存器是世界之间“共享”的信息。通常,在世界切换时,监视器可能会将所有寄存器交换到某个上下文存储中。在SMC情况下,寄存器可以传输参数并返回结果。这就是这个函数所做的全部事情。

register u32 r0 asm("r0") = SCM_ATOMIC(svc, cmd, 4);

这是一个位字段,类似于SMC 调用约定文档中的表 2-1。它是从正常世界的 Linux 到安全监视器来告诉哪个函数(以及编码/保留四个的参数数量)。

register u32 r2 asm("r2") = arg1;
register u32 r3 asm("r3") = arg2;
register u32 r4 asm("r4") = arg3;
register u32 r5 asm("r5") = arg4;

如果ARM ABI是偶然的,参数arg1-arg4将已经在这些寄存器中,因此不会生成任何代码。全局 context_id(到 Linux/Android 内核)也被传递。

How can I track down the SMC instruction further to see what it actually does based on its input operands?

为此,您需要安全世界的代码。我的猜测是,这是一些手机和基带等处于安全世界中并且代码不可用。如果您有安全世界代码,监视器向量表将有一个 SMC 条目。这将有一个基于 r0 或“cmd”值的开关(或 if/then),用于选择特定的 smc 函数。通用 smc 处理程序可以恢复安全世界寄存器/上下文,但保留 r0 位字段中指定的四个参数。

所以答案可能是你无法追踪它的作用。您必须依赖供应商文档,或者足够幸运拥有安全世界的代码。

关于arm - 如何解读ARM的SMC调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46820340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com