(toppers-users 1359) Re: jsp-1.4 armv4 の start.S について

bartok @ bb-west.ne.jp bartok @ bb-west.ne.jp
2004年 1月 28日 (水) 12:30:52 JST


野口です。お世話になります。

> しかし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

どうもありがとうございました。