[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Unable to boot latest snapshot with Microdrive
Takao Shinohara <shin@sm.sony.co.jp> writes:
> カーネルのコンフィグレーションを変えたり、適当な場所にNOPを10個くらい挿
> 入したりすると現象が出なくなることがわかりました。
添付のpatchのように、st_pcic_read()の中にdelay(1)を入れると現象が出なく
なることがわかりました。また、サイズが変わらないようにdelay(1)の代わりに
NOPを2個入れると、今度は現象が出るようになります。
念の為に、delay()と同じ内容の別の名前の関数(delay_alt())を追加して、その
状態で確認してみましたが、以下のような結果になりました。
st_pcic_read()の内容 結果
----------------------------
original NG
2 NOPs NG
delay(1) OK
delay_alt(1) OK
delay()を呼び出すことで命令cacheの状態が変化して、それが原因で他の全く関
係ない部分の実行タイミングが変化し、そのために動作が変わってしまうことを
懸念していたのですが、delay()とは命令cache上で競合しないようなアドレスに
置いたdelay_alt()でも結果が変化しなかったので、純粋にst_pcic_read()の実
行タイミングの変化が直接の原因であったと思われます。
以上より、z50のPCICにとってタイミング的に都合の悪い部分がi82365.cの中に
ありそうだと考えられるのですが、どこに問題があるのか私には見当が付きませ
ん。
篠原
# ここまでたどり着くまでに、カーネルを150回以上作ってテストしました。
# 疲れた......
Index: dev/ic/i82365.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/ic/i82365.c,v
retrieving revision 1.65
diff -u -r1.65 i82365.c
--- dev/ic/i82365.c 2001/12/15 13:23:21 1.65
+++ dev/ic/i82365.c 2002/09/16 06:10:24
@@ -1503,6 +1503,11 @@
if (idx != -1)
bus_space_write_1(h->ph_bus_t, h->ph_bus_h, PCIC_REG_INDEX,
h->sock + idx);
+#if 1 /*XXX:shin debug*/
+ delay(1);
+#else
+ __asm __volatile ("nop;nop;");
+#endif
return (bus_space_read_1(h->ph_bus_t, h->ph_bus_h, PCIC_REG_DATA));
}