rpi_start.Sを読む (第2回)
つづきです。
今回読むのはここです。
read status, store registerの頭文字でしょうか。
cpsrは現在のステータスレジスタです(Current Program Status Register)。
現在のステータスレジスタをr0にロードする、ということですね。
次に進みます。
次に進みます。
先ほど下位5ビットをクリアしたr0にビットを立てています。I32_bit, F32_bit,PSR_SVC32_MODEのそれぞれです。これまたarm/include/armreg.hに定義されています。
ということで、ここでは割り込みを禁止する一連の処理をしていたようです。
今回読むのはここです。
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, cpsrmrsはステータスレジスタのシステムコールです。mrsはロード、msrはストア。
read status, store registerの頭文字でしょうか。
cpsrは現在のステータスレジスタです(Current Program Status Register)。
現在のステータスレジスタをr0にロードする、ということですね。
次に進みます。
128 bic r0, r0, #PSR_MODEbicはビットクリアです。#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を操作してきた内容をステータスレジスタにストアしています。
ということで、ここでは割り込みを禁止する一連の処理をしていたようです。
コメント(0件)
- TB-URL http://www.tokuda.net/diary/0804/tb/