cpu_arm926_switch_mm 手続き
CONFIG_MMU が undef だった場合、戻り番地が格納されてるナニを pc に格納しているのみ。mmu が無い場合はページ変換テーブルだの何だのは気にするまでも無い、という事なのでしょうか。
CONFIG_MMU が define されてる場合、順番としては
- データキャッシュを無効化
- 命令キャッシュを無効化
- Write Buffer を drain
- 第一引数のページグローバルディレクトリ属性を Translation Table Base Register に load
- TLB (Transfer Lookaside Buffer) を無効化
した後に戻り番地を pc に格納されております。
手続きの定義を以下に引用。proc-arm926.S です。
ENTRY(cpu_arm926_switch_mm) #ifdef CONFIG_MMU mov ip, #0 #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache #else @ && 'Clean & Invalidate whole DCache' 1: mrc p15, 0, r15, c7, c14, 3 @ test,clean,invalidate bne 1b #endif mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache mcr p15, 0, ip, c7, c10, 4 @ drain WB mcr p15, 0, r0, c2, c0, 0 @ load page table pointer mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs #endif mov pc, lr
命令については ココ の CP15 の命令なナニを参照したら全部出てます。
ちなみに
上記 r0 レジスタには mm_struct 構造体の pgd 属性の値が格納されてるはずなのですが、その根拠は mmu_context.h の switch_mm 手続きの定義の中で記述されている以下に依ります。
cpu_switch_mm(next->pgd, next);
mm_struct 構造体の pgd 属性は「ページグローバルディレクトリ」という記述があるんですが、pgd_t * という型なのでアドレスが格納されているはずですね。
何を指してるのか、は別途確認必要ですね。