从Cortex A8 / DM3730上的特权上下文访问安全(TrustZone)指令的最简单方法

时间:2014-09-24 22:53:04

标签: security arm cortex-a8 trust-zone

我有一个非常奇怪的事情我需要做:访问一些"安全"对于不需要在安全环境中完成的事情的说明。简而言之:我需要进入安全模式,但不是因为我想要硬件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修补?

感谢任何其他帮助!

1 个答案:

答案 0 :(得分:1)

Gumstix上的DM3730是GP(通用)设备,这意味着它具有TrustZone 禁用。你无法进​​入它。

请参阅https://stackoverflow.com/a/8028948/6839