私は、CPUコア(別名DVFS、DCVS)の動的電源管理がどのように行われているかを確認するために、Androidのカーネルを読んでいます。私が見つけたコードhereは、次の関数(hereと定義されています)を呼び出すと、SMCアセンブリ命令が呼び出されます。ARMのSMC呼び出しの解釈方法は?
ARMにはSMC calling conventionを説明するドキュメントがありますが、以下の機能を理解するためには使用できませんでした。 SMC命令をさらに追跡して、その入力オペランドに基づいて実際に何が実行されているかを確認するにはどうすればよいですか?
s32 scm_call_atomic4_3(u32 svc, u32 cmd, u32 arg1, u32 arg2,
u32 arg3, u32 arg4, u32 *ret1, u32 *ret2)
{
int ret;
int context_id;
register u32 r0 asm("r0") = SCM_ATOMIC(svc, cmd, 4);
register u32 r1 asm("r1") = (u32)&context_id;
register u32 r2 asm("r2") = arg1;
register u32 r3 asm("r3") = arg2;
register u32 r4 asm("r4") = arg3;
register u32 r5 asm("r5") = arg4;
asm volatile(
__asmeq("%0", "r0")
__asmeq("%1", "r1")
__asmeq("%2", "r2")
__asmeq("%3", "r0")
__asmeq("%4", "r1")
__asmeq("%5", "r2")
__asmeq("%6", "r3")
#ifdef REQUIRES_SEC
".arch_extension sec\n"
#endif
"smc #0 @ switch to secure world\n"
: "=r" (r0), "=r" (r1), "=r" (r2)
: "r" (r0), "r" (r1), "r" (r2), "r" (r3), "r" (r4), "r" (r5));
ret = r0;
if (ret1)
*ret1 = r1;
if (ret2)
*ret2 = r2;
return r0;
}
EXPORT_SYMBOL(scm_call_atomic4_3);
[this](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0333h/Chdfjdgi.html)のようなものはありますか? –
@DavidWohlferdリンクは安全なモデルについて説明しています。私は、SMC呼び出しが行われた後に実行されるコードを知ることにもっと興味があります。 – Mahdi
ポイントはSMCコールが安全な世界に行くことです。これには物理的な**メモリマップが全く異なる場合があります。また、セキュアな世界でのソフトウェアの実行方法のモデルも異なります。間違いなく、Linuxである必要はありません(おそらくLinuxではありません)。これは通常、クローズドソースソフトウェアであり、バイナリイメージにアクセスすることができない場合や、困難な場合もあります。おそらくリバースエンジニアリングをしたり、セキュアワールドソフトウェアを作成したベンダーと話をしなければならないでしょう。 –