参照元†
- 複数 CPU アーキテクチャに対応する場合、
この関数のポインタは processor 構造体の switch_mm メンバに入れられます。
- pgd_phys
- おそらく unsigned long
- スイッチ先のページテーブルの物理アドレス
- struct mm_struct *tsk
返り値†
/*
* cpu_v7_switch_mm(pgd_phys, tsk)
*
* Set the translation table base pointer to be pgd_phys
*
* - pgd_phys - physical address of new TTB
*
* It is assumed that:
* - we are not using split page tables
*/
ENTRY(cpu_v7_switch_mm)
#ifdef CONFIG_MMU
mov r2, #0
ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id
orr r0, r0, #TTB_FLAGS
- mov: r2 を 0 クリア
- ldr: r1(第二引数)は struct mm_struct へのポインタ、
(r1)->context.id の取得を行う。
- orr: ページテーブルのメモリ属性(キャッシュ可/不可、
ライトスルー/ライトバック)を指定する。
#ifdef CONFIG_ARM_ERRATA_430973
mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB
#endif
mcr p15, 0, r2, c13, c0, 1 @ set reserved context ID
isb
1: mcr p15, 0, r0, c2, c0, 0 @ set TTB 0
isb
- mcr: CP15 c2(VMSAv7、仮想メモリシステム制御)変換テーブルのベースレジスタに、
スイッチ先のコンテキストを転送する。
- やりたいことは <CRn, opc1, CRm, opc2> = <c0, 0, c0, 0> なので、
変換テーブルベース 0(TTBR0)の設定。
- ARM DDI 0406B ページ B3-113 にある、
B3.12.23「CP15 c2 および c3、メモリ保護および制御レジスタ」を参照。
- isb: 命令同期バリア
mcr p15, 0, r1, c13, c0, 1 @ set context ID
isb
#endif
mov pc, lr
ENDPROC(cpu_v7_switch_mm)
コメント†