[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: CASSIOPEIA report
鈴木(康)です。
<200005181247.VAA01300@srapc342.sra.co.jp>の記事において
soda@sra.co.jpさんは書きました。
| > 2) 割り込み処理ルーチンを動かすときに 割り込みレベル(IPL)をそもそも設定
| > していないように見えます。
| >
| > たとえば、
| > _spllower(MIPS_SOFT_INT_MASK_0);
| > softclock();
| >
| > とか
| > _spllower(MIPS_SOFT_INT_MASK_0|MIPS_SOFT_INT_MASK_1);
| > DO_SIR(SIR_NET, netintr());
| >
| > とかになっていないと他の割り込み(正確には INTR0?)が入らず、
| > 割り込み処理は走り切ることになると思います。
|
| はい。こちらのバグは、現在の MIPS port 全般にあります。
リプライもらえて嬉しいです。また的外れなことを書いてしまったかと...
不安になっていました。
| (あと、cpu_intr() の先頭で、MIPS_INT_SR_IE を enable してないのも問題。)
|
| a. cpu_intr の最初で MIPS_INT_SR_IE を enable する。
locore_mips3.S では、
mtc0 zero, MIPS_COP_0_STATUS # Reset exl, trap possible.
jal _C_LABEL(cpu_intr)
nop
こうなっているので、ビットを立てないといけないということですね。
| b. 各割り込みハンドラを走らせる前に、それぞれ適切に _spllower() する。
ですね。
| c. cpu_intr() で、全部の割り込みを一度に処理するのではなく、
| 一回の cpu_intr() では、最も優先順位の高い、割り込み level を
| 一度処理するだけで抜ける。
| (これを行わずに b. を実現すると、負荷が高い時に、多重割り込みが
| かかりすぎて、kernel stack overflow の危険があると思います。)
IPL を high level から、段々にレベルを落としていくようにさえしておけば、
_spllower() する レベル 以上は多重割り込みされないと思います。
この前提で stack overflow の危険があるとすると、
stack のほうを大きくすべきなのではないでしょうか?
| あと、ソフトウェア割り込みソースを、ssir という変数に設定するのは、
| race condition の元なので、やめた方が良いと思います。
| もし ssir のような単一の変数に割り込みソースを設定するのであれば、
| ssir に触る最も高いハードウェア割り込み優先順位の spl で、
| ssir を保護してやる必要があります。
| cpu_intr() で ssir を触った後に _clrsoftintr(MIPS_SOFT_INT_MASK_1);
| しているのも問題で、これは ssir を触る前に実行した方が安全でしょう。
| ssir という一つの変数に設定するよりは、むしろ、ソフトウェア割り込みレ
| ベル毎に変数を用意した方が良いと思います。
| splnet() で保護しないと危険じゃないかと思います。
なるほど。チェックしてみます。
| > 1) vr の root に
| >
| > vr_intr_establish(VR_INTR1, vrrtc_intr, sc);
| > vr_intr_establish(VR_INTR0, vrip_intr, self);
| >
| > の2 つのベクタが登録されているわけですが、
| >
| > 1回の割り込みで、どちらかしか1回しか実行されないように見えます。
| > 2つの割り込みが pending されたとき lost するんじゃないでしょうか?
|
| 良く分かってませんが、こっちの問題はないんじゃないかな。
| 割り込みハンドラの中でそれなりにアクションを起こさない限り、
| 割り込みはかかったままになっているんじゃないでしょうか?
同じく良く分かってませんが、
software interrupt の cause bit は 明示的に落としているんですが、
hardware interrupt の cause bit を 落としているとこが見つからなかったので、
自動的に消滅するのかなと思いました。
$ grep "mtc0.*CAUSE" ../mips/mips/*.S
../mips/mips/locore.S: mtc0 v0, MIPS_COP_0_CAUSE # store back
../mips/mips/locore.S: mtc0 v0, MIPS_COP_0_CAUSE # store back
../mips/mips/locore.S: mtc0 zero, MIPS_COP_0_CAUSE # clear SOFT_INT bits
--
鈴木 康司 @NECソリューションズ
suz@hpc.bs1.fc.nec.co.jp
TEL 042-333-6465