rpi_start.Sを読む (第11回)
2013/11/10(日) 14:08 NetBSD はてブ情報 はてブに登録 はてブ数

さて、今回読むのは次の部分です。
    211 	ldr	r0, Ltemp_l1_table	/* The page table address */
    212 	mcr	p15, 0, r0, c2, c0, 0	/* Set Translation Table Base */
    213 
    214 	mov	r0, #0
    215 	mcr	p15, 0, r0, c8, c7, 0	/* Invalidate TLBs */
    216 
    217 	/* Set the Domain Access register.  Very important! */
    218 	mov     r0, #((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT)
    219 	mcr	p15, 0, r0, c3, c0, 0
さっそく始めましょう。
    211 	ldr	r0, Ltemp_l1_table	/* The page table address */
    212 	mcr	p15, 0, r0, c2, c0, 0	/* Set Translation Table Base */
さきほど作成した0x4000のサイズを持つLtemp_l1_tableの先頭アドレスをr0にロードし、TTBをセットしています。Ltemp_l1_tableの先頭アドレスをTTBにするよっ、てことですかね。

マニュアルにも「MCR p15, 0, , c2, c0, 0 ; Write Translation Table Base Register 0」とあります。

次に進みます。
    214 	mov	r0, #0
    215 	mcr	p15, 0, r0, c8, c7, 0	/* Invalidate TLBs */
マニュアルによるとc8, c7, 0の組み合わせは「Invalidate unified TLB unlocked entries」とのこと。c8がTLB関連で、c7がunified TLBを指し、0がInvalidate TLB unlocked entriesを指すようです。
現時点の物理・仮想の変換バッファを無効化するということでいいのかな。

次は、なにやら重要だよというコメントから始まっています。
    217 	/* Set the Domain Access register.  Very important! */
    218 	mov     r0, #((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT)
    219 	mcr	p15, 0, r0, c3, c0, 0
久々に定義を追っかける気がしますが、PMAP_DOMAIN_KERNELはpmap.hで次のように定義されています。
  #define	PMAP_DOMAIN_KERNEL	0	/* The kernel uses domain #0 */
DOMAIN_CLIENTはpte.hで次のように定義されています。
  /*
   * Domain Types for the Domain Access Control Register.
   */
  #define	DOMAIN_FAULT	0x00		/* no access */
  #define	DOMAIN_CLIENT	0x01		/* client */
  #define	DOMAIN_RESERVED	0x02		/* reserved */
  #define	DOMAIN_MANAGER	0x03		/* manager */
えーとつまり、
  (0x01 << (0 * 2) | (0x01)
なので、0x01ですよね。最初の(DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2))って意味ないような。machdep.cでも似たような書き方をしているのですけど、そういうおまじないってことなんでしょうか。

謎です。

ドメインアクセスコントロールレジスタのフォーマットは次のようになっていますから、ドメイン0に0x01がセットされていると。

313029282726252423222120191817161514131211109876543210
D15D14D13D12D11D10D9D8D7D6D5D4D3D2D1D0
0x01はマニュアルには「Client. Accesses are checked against the access permission bits in the TLB entry.」とあります。TLBエントリのアクセスパーミッションビットに対してチェックを行う、ということかな。

アクセスパーミッション(AP)は10bit,11bitでしたね。
31-20191817161514-1211-1098-543210
セクションのベースアドレス(12bit)SBZ0nGSAPXTEXAPIMPドメインXNCB10
今回読んだ部分では、各種キャッシュを止めて、TTBをセット&無効化し、ドメインアクセスレジスタを設定しました。

名前:  非公開コメント   

  • TB-URL  http://www.tokuda.net/diary/0813/tb/