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

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



篠原さん、助言どうもありがとうございます。

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

> -256 = 0xffffff00なので、コードそのものは(効率はともかくとして)正しいよ
> うに思います。どちらのコード列でも、and命令を実行する時点の$t0には
> 0xffffff00が入っているはずです。

了解です。 #li 命令の仕様がよくわかんなかったのでした。

> 	サイズがcross == nativeだと問題なし
> 	サイズがcross != nativeだと問題発生
> 
> という結果になれば、タイミング依存のバグである可能性大です。

いろいろと試してみました。その結果、locore.S の最後
(stacktrace の後ろ)に nop を足すと(native as でも)
動きました。というわけででサイズの問題みたいです。
が、 locore.S に続く locore_machdep.S の先頭(__main の前)に
nop を足してもこれは同じく動きませんでした。

で、もう少し調べてみたところ、 locore_mips3.S 中の
mips3_TLBMiss (あるいはその後続の関数)の address が変わると
動いたり動かなかったりするようです。

動かない kernel (元のソース):
0000000080200d00 <mips3_TLBMiss>:
0000000080200d80 <mips3_XTLBMiss>:
0000000080200e00 <mips3_cache>:
0000000080200e24 <mips3_exception>:
 :

動く kernel (locore.S の最後に nop 一つ追加):
0000000080200d10 <mips3_TLBMiss>:
0000000080200d90 <mips3_XTLBMiss>:
0000000080200e10 <mips3_cache>:
0000000080200e34 <mips3_exception>:
 :

という感じで、元のソース(locore.S に nop なし)に対して
locore_mips3.S の先頭に ".space 16" を足して無理矢理
mips3_TLBMiss のアドレスをずらしてやるとこれも動きます。

arc は L1 cache の linesize が 32 で、動かない kernel では
いずれも mips3_TLBMiss 等の関数がちょうど cache align な位置に
来ているんですが、これがタイミングに関わっているんでしょうか?
(L2 cache の linesize は 64 です)

mips3_TLBMiss と mips3_XTLBMiss はいずれも命令数の指定(32命令以下)
とか書いてあってなんとなく怪しそうなんですが。
---
Izumi Tsutsui
tsutsui@ceres.dti.ne.jp