【发布时间】:2021-12-01 08:57:58
【问题描述】:
我的设置包含一个 STM32MP157C-DK2,它使用 Trusted Firmware-A 将 SP-MIN 加载为 BL32,将 uBoot+Linux 加载为 BL33。
我正在尝试一个小例子,我从 Linux 内核创建一个 SMC,它传递对非安全内存的引用。处理 SMC 的运行时服务应更改该位置的数据。
我面临的问题是,我找不到任何有关将虚拟地址从 NS:EL1 的 Linux 内核转换为 EL3 的转换机制所需的步骤的任何信息。
我的运行时服务的代码如下所示:
static int32_t my_svc_setup(void)
{
return 0;
}
static uintptr_t my_svc_smc_handler(uint32_t smc_fid,
u_register_t x1,
u_register_t x2,
u_register_t x3,
u_register_t x4,
void *cookie,
void *handle,
u_register_t flags)
{
uint16_t smc_function_number = (uint16_t) smc_fid;
uint32_t *data;
switch(smc_function_number){
case 123:
data = (uint32_t *) x1;
// Address Translation Magic ...
*data = 42;
SMC_RET1(handle, 1);
default:
SMC_RET1(handle, SMC_UNK);
}
}
DECLARE_RT_SVC(
my_svc,
OEN_OEM_START,
OEN_OEM_END,
SMC_TYPE_FAST,
my_svc_setup,
my_svc_smc_handler
);
SMC 毫无问题地到达处理程序,但是一旦我尝试取消引用我通过 x1 传递的物理地址,CPU(显然)就会崩溃。如果有人可以帮助我填写剩余的必需步骤以获得有效的参考资料,我们将不胜感激。
【问题讨论】:
-
我的回答是给出更多的“问题”。您确定您已将物理内存配置为全局可写吗?你有没有在 Linux 中映射过地址;通常由司机完成。您的
TZASC控制器和配置是什么?受信任固件的 EL3 是否完全使用 MMU,如果使用,它是phys==virt映射吗?你是如何将这个世界可共享内存传达给 Linux 的?您可以期待有人回答所有这些问题,但如果您能提供答案,则表明需要进行更多研究。 -
感谢您提出这些问题。我现在无法回答所有这些问题,但仅关键字就能帮助我继续研究。我对整个主题都很陌生,但我仍然不知道一些似乎被视为理所当然的事情。
标签: c arm trust-zone