[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):