[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));
 }