やらなければならないかなり奇妙なことがあります。安全なコンテキストで実際に実行する必要がないことについて、いくつかの「安全な」指示にアクセスすることです。要するに、セキュア モードに入る必要がありますが、ハードウェア 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 をいじくり回すことができるようにするにはどうすればよいかということです。
その他のヘルプは大歓迎です!