[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
(toppers-users 1359) Re: jsp-1.4 armv4 のstart.S について
- To: users at toppers jp
- From: bartok at bb-west ne jp
- Date: Wed, 28 Jan 2004 12:30:52 +0900
野口です。お世話になります。
> しかしsample1.cを実行させるとIRQ_Handlerが呼ばれる、またstart.Sで
> irq_exception->IRQ_Handlerにしても動作が変らないということですので、ベクターテーブル
> の書換えがかなり初期化のかなり早い段階で行なわれているのではないかと
> 推測されます。
私はアドレス 0 からのベクタは rom 前提で書き換えないものだと
思っていたのでそもそもこういう発想が欠落していました。
IRQ_Handler を登録しているのは stub 用のコードだろうと早合点していました。
ベクタが ram に置かれるのであれば初期化書き換えで ok なわけですね。
初期化書き換えのメリットは未だよく分かりませんが…
小南さんのおっしゃる通り cpu_initialize () で
arm_vector_add に*_vector, arm_handler_add に*_exception のアドレスが
登録され、 arm_install_handler (IRQ_Number,IRQ_Handler) で
irq_vector の irq_exception が IRQ_Handler に書き換えられることが確認できま
した。
cpu_initialize () 実行後 arm_vector_add は
{0x20, 0x24, 0x28, 0x2c, 0x30, 0x34, 0x38, 0x3c}
となりました。これらは*_vector のアドレスです。
> この部分の特に (UW *)(vector_value + 8) + i が理解できないので以下は
> 推測ですが、
vector_table の ldr 命令は以下のようにアセンブルされたのですが
0x0000: 0xe59ff018 0xe59ff018 0xe59ff018 0xe59ff018
0x0010: 0xe59ff018 0xe59ff018 0xe59ff018 0xe59ff018
これは arm の ldr 命令のバイナリエンコーディングを見ると
下位 12 ビットがオフセットで基底レジスタも pc にしているようです。
なので
vector_value = *(volatile UW *) (i*4);
vector_value &= 0x00000fff;
は vector_val に*_vector の pc からのオフセットを代入し
8 回の繰り返しのすべてにおいて 0x18 となります。
arm_vector_add[i] = (UW *) (vector_value + 8) + i;
の +8 はパイプラインの実行ステージの前にフェッチ、デコードがあるため
その分のげたはかせだと思います (おそらく、多分…)
pc offset げた sizeof(UW*) * i arm_vector_add[i]
0x00 + 0x018 + 8 + 0x00 = 0x20
0x04 + 0x018 + 8 + 0x04 = 0x24
0x08 + 0x018 + 8 + 0x08 = 0x28
0x0c + 0x018 + 8 + 0x0c = 0x2c
0x10 + 0x018 + 8 + 0x10 = 0x30
0x14 + 0x018 + 8 + 0x14 = 0x34
0x18 + 0x018 + 8 + 0x18 = 0x38
0x1c + 0x018 + 8 + 0x1c = 0x3c
どうもありがとうございました。