りんけーじ - 日記 - 2007年4月2日の日記



< 2007年4月 >
1234567
891011121314
15161718192021
22232425262728
293012345
前の日: 2007年4月1日
次の日: 2007年4月5日

2007/04/02 23:20 [gdb over translation]

順調に開発日記に戻ってる気がする。実にいいことだ。

引き続きデバッグ進捗報告。FS を実行→FS をリセット→実行すると、落ちたり内部でクラッシュしたりする。原因は不明。

テスト用のコードを食わせてコンパイルさせてみたところ、実行しているコードと結果が違う…。Rosetta 上のアプリケーションを gdb でデバッグしてるんだけど、例えば stepi で見ると、lwz r26, 20(r31) を実行してるのに計算と違う値が r26 に格納されたりしてる。キャッシュがクリアされてない…ような気がする。

命令キャッシュの flush には vm_machine_attribute を使ってるんだけど、もしかして Rosetta には効かなかったりするんだろうか。それとも、ただ単にほかのミスなんだろうか。困った。

とりあえず、flush のときに Rosetta に nop の山でも実行させて動作が変わるか、様子を見てみよう…。

コメント(0) トラックバック(0)

2007/04/02 08:41 [ぎゃぁぁ]

カルドセプト (正確にはカルドセプト エキスパンション・プラス) が動かないバグ、実に素敵なバグでした…。

FS2 は PS の BIOS を自力で実装してるわけですが、今回のバグはここでした。(今更コンパイラにバグがあったらすごく凹みますが)

PS にはスレッドの概念があって、BIOS でサポートがされています。当然、あるものは実装しなければならないので、根性で実装してあります。ちなみに、協調型なのかプリエンプティブ型なのかは知りません。知らなくても、こちらの実装には関係ありません。(タイマ割り込みで順番にスレッドを切り替えさせれば、事実上プリエンプティブ型にできるわけですしね)

で、一応 BIOS の関数というかシステムコールなので、返り値が存在します。この辺は全部、勝手に CPU のレジスタをいじって設定するわけですが、ここが素敵なことになってました。

void thread_ChangeTh(plugin_systemservices *context,int class_code,int function_code)
{
thread_descriptor *threads;
unsigned index;

(中略)
thread_switch(context,psx_load_word(context,0x110) + index * sizeof(thread_descriptor));
context->execution_data->reg[PSRegIndexCPU + PSRegV0] = 0;

とりあえず、返り値 0 がセットされてます。スレッドを切り替えた後に。返り値を戻す先は ChangeTh を 呼び出した側のスレッド(のコンテキスト)なので、これだと切り替えた先の CPU レジスタを壊してしまいます。

というわけで、逆にしたらここは通過。こんな単純で怖いバグが残っててびっくり…。

ちなみに、まだステージ開始時に本体ごと SIGSEGV で落ちる問題が残ってます。今度は誰だぁー。

Intel Mac だと rosetta 上のプロセスはデバッグできないのかな?gdb が落ちちゃう…。この辺は PowerPC な Mac に頼るしかないのかなぁ。

あ、あと WindowMode プラグインには、なんか NewGWorld とか素敵なレガシー関数が山ほど書いてありました。誰だ、こんなの書いたの。

どうやら表示がおかしくなるのは、この辺が悪いっぽい。104 でコンパイルしたら、Deprecated って怒られたし。

コメント(0) トラックバック(0)