2017-10-18 60 views
1

私は、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); 
+0

[this](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0333h/Chdfjdgi.html)のようなものはありますか? –

+0

@DavidWohlferdリンクは安全なモデルについて説明しています。私は、SMC呼び出しが行われた後に実行されるコードを知ることにもっと興味があります。 – Mahdi

+1

ポイントはSMCコールが安全な世界に行くことです。これには物理的な**メモリマップが全く異なる場合があります。また、セキュアな世界でのソフトウェアの実行方法のモデルも異なります。間違いなく、Linuxである必要はありません(おそらくLinuxではありません)。これは通常、クローズドソースソフトウェアであり、バイナリイメージにアクセスすることができない場合や、困難な場合もあります。おそらくリバースエンジニアリングをしたり、セキュアワールドソフトウェアを作成したベンダーと話をしなければならないでしょう。 –

答えて

1

SMC calling conventionsは、複数のベンダーが世界のいずれかのコードを書いて、非互換性の最小と共存できるように、クロス世界 APIを実装する方法のARMからの提案です。少なくともそれが意図です。ベンダー(あなたの場合はAndroid/Linux)はこれを行う必要はなく、安全な世界がそれに従わなければこれを行うことができないかもしれません。

が、私は次の関数

SMC命令の意味を理解するためにそれを使用することができていないが、安全なモニタに、通常の世界から制御された変化です。モニタにはそれ自身のベクタテーブルがあり、svcのエントリはSMCコールです。レジスタは、世界の間で共有される情報です。通常、ワールドスイッチでは、モニタはすべてのレジスタをいくつかのコンテキストストアにスワップします。 SMCの場合、レジスタはパラメータを転送して結果を返すことができます。これがこの機能のすべてです。

register u32 r0 asm("r0") = SCM_ATOMIC(svc, cmd, 4); 

これはSMCの呼び出し規約文書にのような表2-1ビットのフィールドです。これは、通常の世界のLinuxから安全なモニターまで、どの機能(およびマーシャリング/ 4つの引数の引き数)を伝えるかです。

register u32 r2 asm("r2") = arg1; 
register u32 r3 asm("r3") = arg2; 
register u32 r4 asm("r4") = arg3; 
register u32 r5 asm("r5") = arg4; 

ARM ABIが偶然の場合、パラメータarg1-arg4はすでにこれらのレジスタにあるため、コードは生成されません。グローバルcontext_id(Linux/Androidカーネルへ)も渡されます。

SMC命令をさらに追跡して、入力オペランドに基づいて実際に何が行われるかを確認するにはどうすればよいですか?

これを行うには、安全な世界へのコードが必要です。私の推測は、これはいくつかの携帯電話とベースバンドなどが安全な世界にあり、コードは利用できないということです。セキュアなワールドコードをお持ちの場合は、モニタベクタテーブルのエントリはSMCになります。これは、特定のsmc機能を選択するr0または 'cmd'値に基づいたスイッチ(またはif/then)を持ちます。一般的なハンドブックは、セキュアワールドレジスタ/コンテキストを復元するが、r0ビットフィールドに指定された4つの引数を保持することができる。

おそらく答えはです。はそれが何をしているかをトレースできません。ベンダーのドキュメントに頼らざるを得ないか、安全な世界へのコードを書くのに十分な運が必要です。

+1

あなたはおそらく幸運であり、[PSCI](http://infocenter.arm.com/help/topic/com.arm.doc.den0022d/Power_State_Coordination_Interface_PDD_v1_1_DEN0022D.pdf)のドキュメントが適用可能かもしれません。 OpenSource [ARM Trusted Firmware](https://github.com/ARM-software/arm-trusted-firmware)を確認してください。私はMSMのSOCを見ていませんでしたが、いくつかのCPUでこれを使用することは可能です(他の人は読んでいます)。 –

+0

ありがとう、私はそれを調べます。実装がクローズドソースであると仮定すると、このソースツリーでバイナリをどこで見つけることができるはずですか? https://android.googlesource.com/kernel/msm/+/android-5.1.0_r0.6/arch/arm/mach-msm – Mahdi

+1

それも、ソースツリーではありません。デバイスにプログラムされます(BIOSチップなど)。 –

関連する問題