[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: new MIPS cache ops and R4000/4400 with L2 cache



筒井です。

<10112090454.AA28520@lachesis.sm.sony.co.jp>の記事において
shin@sm.sony.co.jpさんは書きました。

> mips3_TLBMissは実際には0x80000000にコピーしてから実行されるので、カーネ
> ルがリンクされたときのアドレスとは無関係になります。

たしかに comment にそう書いてありますね。気づいてませんでした。

> つまり、問題があるとすればmips3_TLBMissではなく、他の部分です。手間はか
> かりますが、あちこちにnopを詰めるなどして、どこのアドレスがずれると問題
> が出るのかを絞り込んでみてください。

これをいろいろやってみました。怪しいとすれば thorpej-mips-cache の
merge で削除された cache まわり関数以降かなと考えて試してみたところ

・mips3_VCED の前に nop を入れると動く
・mips3_VCED の後に nop を入れても動かない

という結果になりました。

で、 mips3_VCED の中身を見ると vce_saveat 等の data segment に
配置されるべき変数領域が text segment に配置されてるようだった
ので、添付のパッチのように各変数領域を .data 以降に持っていくと
今のところ nop なしでもちゃんと動いているようです。
#.data と .sdata の違いとか .align 3 の要否とかはわかってないです。

同一メモリが I-cache と D-cache との両方に載るとどうなるかとか
忘れてしまったんですが、いずれにせよ .text の memory は
read only でないといけないんですよね?
---
Izumi Tsutsui
tsutsui@ceres.dti.ne.jp

Index: locore_mips3.S
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/mips/mips/locore_mips3.S,v
retrieving revision 1.72
diff -u -r1.72 locore_mips3.S
--- locore_mips3.S	2001/11/14 18:15:23	1.72
+++ locore_mips3.S	2001/12/25 07:48:03
@@ -1714,22 +1714,6 @@
 	move	AT, k0
 	.set	at
 	eret
-	.align	3			# needs to be aligned?
-vce_saveat:
-	.word	0
-	.word	0
-vce_savek0:
-	.word	0
-	.word	0
-	.globl	_C_LABEL(VCE_count)
-_C_LABEL(VCE_count):
-	.word	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-	.globl	_C_LABEL(VCE_epc)
-_C_LABEL(VCE_epc):
-	.word	0
-	.globl	_C_LABEL(VCE_vaddr)
-_C_LABEL(VCE_vaddr):
-	.word	0
 END(mips3_VCED)
 #endif /* !MIPS3_5900 */	
 
@@ -2366,11 +2350,31 @@
 END(mips3_sd)
 
 
+	.data
+
+/* 
+ * work area for mips3_VCED
+ */
+vce_saveat:
+	.word	0
+	.word	0
+vce_savek0:
+	.word	0
+	.word	0
+	.globl	_C_LABEL(VCE_count)
+_C_LABEL(VCE_count):
+	.word	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+	.globl	_C_LABEL(VCE_epc)
+_C_LABEL(VCE_epc):
+	.word	0
+	.globl	_C_LABEL(VCE_vaddr)
+_C_LABEL(VCE_vaddr):
+	.word	0
+
 /*
  * The variables below are used to communicate the cache handling
  * to higher-level software.
  */
-	.data
 
 	.globl _C_LABEL(mips3_locoresw)
 _C_LABEL(mips3_locoresw):