アセンブラレベルのバグ
メモリ破壊の原因を究明した。タスクスイッチ時のバグ(自分のミス)だった。アセンブラで書いているところのバグで非常に複雑だった。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日くらいかかったぞ。メモリの破壊される場所が動いたりしたので時間がかかった。最後は根気よくアセンブラレベルでデバッグをした結果の勝利。