我有一件非常奇怪的事情需要做:访问一些"安全"的指令,这些指令实际上不需要在安全的上下文中完成。简而言之:我需要进入安全模式,但不是因为我想要硬件TPM之类的功能。我只需要访问某些指令,否则我不会有这些指令。
我们在Gumstix Overo FireSTORM COM上做这件事。我的理解是这些引导是安全的,但在某个地方(MLO?u-boot?)它们切换到了非安全模式,但我可能错了。关键是,我们肯定是在非安全(但有特权,请参阅下文)模式下这样做的。
(我写了这个问题,关于直接访问A8分支预测器的GHB/BTB,如果你对我想做的事情感到好奇:直接写入ARM Cortex A8的分支预测器中的全局历史缓冲区(GHB)或BTB?)
现在,所有这些都将在u-boot中完成(我们有Overo FireSTORM COM),所以幸运的是,我有"特权"执行。不用担心。我已经研究了其他StackOverflow问题,但似乎没有任何关于如何确切地进入安全模式的内容。我真正想做的就是访问一些CP15寄存器,然后回到非安全模式(并可能重复这个过程)。
我已经查看了SMC的说明,但我找不到任何关于如何适当地捕获呼叫/呼叫到哪里/如何设置呼叫等的文档。
这些信息在哪里?
概括一下,我想做的是:
FROM PRIVILEGED EXECUTION:
Do stuff
Tweak GHB // requires secure execution
Do more stuff
Tweak GHB
Do more stuff
...
...
...
Do stuff
任何帮助都将不胜感激!
多亏了@artlessnoise,我在u-boot源文件中找到了这个文件:/u-boot/arch/arm/cpu/armv7/nonsec_virt.S.
它包含以下代码:
/*
* secure monitor handler
* U-boot calls this "software interrupt" in start.S
* This is executed on a "smc" instruction, we use a "smc #0" to switch
* to non-secure state.
* We use only r0 and r1 here, due to constraints in the caller.
*/
.align 5
_secure_monitor:
mrc p15, 0, r1, c1, c1, 0 @ read SCR
bic r1, r1, #0x4e @ clear IRQ, FIQ, EA, nET bits
orr r1, r1, #0x31 @ enable NS, AW, FW bits
#ifdef CONFIG_ARMV7_VIRT
mrc p15, 0, r0, c0, c1, 1 @ read ID_PFR1
and r0, r0, #CPUID_ARM_VIRT_MASK @ mask virtualization bits
cmp r0, #(1 << CPUID_ARM_VIRT_SHIFT)
orreq r1, r1, #0x100 @ allow HVC instruction
#endif
mcr p15, 0, r1, c1, c1, 0 @ write SCR (with NS bit set)
#ifdef CONFIG_ARMV7_VIRT
mrceq p15, 0, r0, c12, c0, 1 @ get MVBAR value
mcreq p15, 4, r0, c12, c0, 0 @ write HVBAR
#endif
movs pc, lr @ return to non-secure SVC
大概如果我修改了mcr p15指令的掩码,我可以简单地"关闭"移动到不安全模式。然而,这可能会扼杀u-boot。
因此,问题是:我如何设置适当的向量,以便在进行SMC调用时,我跳回到安全模式,并能够进行GHB/BTB修补?
感谢任何其他帮助!
Gumstix上的DM3730是GP(通用)设备,这意味着它禁用了TrustZone。你不可能进入它。
请参阅https://stackoverflow.com/a/8028948/6839