2

我有一件非常奇怪的事情需要做:访问一些“安全”指令,以处理那些实际上不需要在安全上下文中完成的事情。简而言之:我需要进入安全模式,但不是因为我想要硬件 TPM 功能或任何东西。我只需要访问某些我不会拥有的指令。

我们在 Gumstix Overo FireSTORM COM 上执行此操作。我的理解是这些安全启动,但是在某个地方(MLO?u-boot?)他们切换到非安全模式,但我可能是错的。关键是我们肯定是从非安全(但特权,见下文)模式执行此操作的。

(我撰写了这个问题,关于直接访问 A8 分支预测器的 GHB/BTB,如果您对我想要做什么感到好奇:直接写入分支预测器中的全局历史缓冲区 (GHB) 或 BTB ARM Cortex A8?

现在,所有这些都将通过 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 修补?

任何其他帮助表示赞赏!

4

1 回答 1

1

The DM3730 on the Gumstix is a GP (general purpose) device, which means it has TrustZone disabled. There's no way you can get in to it.

See https://stackoverflow.com/a/8028948/6839

于 2014-12-05T17:54:44.197 回答