我有一个非常奇怪的事情我需要做:访问一些"安全"对于不需要在安全环境中完成的事情的说明。简而言之:我需要进入安全模式,但不是因为我想要硬件TPM功能或任何东西。我只需要访问某些我不会拥有的指令。
我们在Gumstix Overo FireSTORM COM上执行此操作。我理解这些安全启动,但随后在某处(MLO?u-boot?)他们切换到非安全模式,但我可能是错的。关键是我们确实从 nonsecure (但是特权,见下文)模式这样做。
(我撰写了这个问题,关于直接访问A8分支预测器的GHB / BTB,如果您对我要做的事情感到好奇:Write directly to the global history buffer (GHB) or BTB in the branch predictor of a ARM Cortex A8?)
现在,所有这一切都将通过u-boot完成(我们已经有了Overo FireSTORM COM),所以幸运的是我有#34;特权"执行。不用担心。我已经查看了其他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指令的掩码,我可以简单地#34;关闭&#34;转向非安全模式。但是,这可能会杀死u-boot。
所以问题是,那么:如何设置合适的向量,这样当我进行SMC调用时,我会跳回安全模式,并能够进行GHB / BTB修补?
感谢任何其他帮助!
答案 0 :(得分:1)
Gumstix上的DM3730是GP(通用)设备,这意味着它具有TrustZone 禁用。你无法进入它。