rpi_start.Sを読む (第2回)
2013/11/04(月) 21:21 NetBSD はてブ情報 はてブに登録 はてブ数

つづきです。

今回読むのはここです。
    127 	mrs	r0, cpsr
    128 	bic	r0, r0, #PSR_MODE
    129 	orr	r0, r0, #(I32_bit | F32_bit | PSR_SVC32_MODE)
    130 	msr	cpsr, r0
まず127行目。
    127 	mrs	r0, cpsr
mrsはステータスレジスタのシステムコールです。mrsはロード、msrはストア。
read status, store registerの頭文字でしょうか。

cpsrは現在のステータスレジスタです(Current Program Status Register)。

現在のステータスレジスタをr0にロードする、ということですね。

次に進みます。
    128 	bic	r0, r0, #PSR_MODE
bicはビットクリアです。#PSR_MODEはarm/include/armreg.hで定義されていて下位5ビットに1が立っています。
  #define PSR_MODE    0x0000001f    /* mode mask */
ということで、r0(ステータスレジスタと同値)の下位5ビットをクリアする、ということですね。

次に進みます。
    129 	orr	r0, r0, #(I32_bit | F32_bit | PSR_SVC32_MODE)
orrは文字どおりorつまり論理和をとります。

先ほど下位5ビットをクリアしたr0にビットを立てています。I32_bit, F32_bit,PSR_SVC32_MODEのそれぞれです。これまたarm/include/armreg.hに定義されています。
     62 #define I32_bit (1 << 7)	/* IRQ disable */
     63 #define F32_bit (1 << 6)	/* FIQ disable */
     77 #define PSR_SVC32_MODE	0x00000013
コメントから想像するに、割り込みを禁止するビットのようですね。
    130 	msr	cpsr, r0
最初のmrs(リード)に対するmsr(ストア)ですね。ここまでr0を操作してきた内容をステータスレジスタにストアしています。

ということで、ここでは割り込みを禁止する一連の処理をしていたようです。

名前:  非公開コメント   

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