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

Re: CASSIOPEIA report



> 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 する。
b. 各割り込みハンドラを走らせる前に、それぞれ適切に _spllower() する。
c. cpu_intr() で、全部の割り込みを一度に処理するのではなく、
   一回の cpu_intr() では、最も優先順位の高い、割り込み level を
   一度処理するだけで抜ける。
   (これを行わずに b. を実現すると、負荷が高い時に、多重割り込みが
    かかりすぎて、kernel stack overflow の危険があると思います。)

とする必要があるように思います。

あと、ソフトウェア割り込みソースを、ssir という変数に設定するのは、
race condition の元なので、やめた方が良いと思います。
もし ssir のような単一の変数に割り込みソースを設定するのであれば、
ssir に触る最も高いハードウェア割り込み優先順位の spl で、
ssir を保護してやる必要があります。
cpu_intr() で ssir を触った後に _clrsoftintr(MIPS_SOFT_INT_MASK_1); 
しているのも問題で、これは ssir を触る前に実行した方が安全でしょう。
ssir という一つの変数に設定するよりは、むしろ、ソフトウェア割り込みレ
ベル毎に変数を用意した方が良いと思います。

それから、mips/mips/trap.c:netintr() で、netisr を触っている部分も、
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 するんじゃないでしょうか?

良く分かってませんが、こっちの問題はないんじゃないかな。
割り込みハンドラの中でそれなりにアクションを起こさない限り、
割り込みはかかったままになっているんじゃないでしょうか?
--
soda