アセンブラレベルのバグ

メモリ破壊の原因を究明した。タスクスイッチ時のバグ(自分のミス)だった。アセンブラで書いているところのバグで非常に複雑だった。MB ではアセンブラで関数から戻るときに次のように書く。

        rtld r15,8

r15 は戻り番地。8 は r15 からのオフセット。ディレイドスロットがあるので 4 ではなく 8 なわけだ。アセンブラで書いていて関数の先頭に飛ぶのに rtld r15,8 としてしまっていた。その結果、先頭の3命令が実行されなかった(次のリスト)。

        addik   r1,r1,-32
        swi     r15,r1,0
        swi     r19,r1,28

r19 はフレームポインタとして使っているようで、ここにちゃんとした値が入らないとうまく動かない(当たり前)。r19 がいい加減な値であったためにその前にさしていたフレームポインタ付近をぶっ壊してしまうという問題だった。

3日くらいかかったぞ。メモリの破壊される場所が動いたりしたので時間がかかった。最後は根気よくアセンブラレベルでデバッグをした結果の勝利。