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

Re: PenCentra hungup



enami tsugutomo <enami@but-b.or.jp> writes:
> それです.  あの変更によって, cpu_switch の最後で SR を restore したと
> ころから mips3_proc_trapmoline の先頭で SR に MIPS_SR_EXL を書くまでの
> 間で, 割り込みが enable された window ができてしまっているのでしょう.
> 
> # そこで実際に割り込みが起きたとして, どうあの tlb miss になるのかは考
> # えてないですが.

何が起きているのかわかったような気がします。

mips3_proc_trapmolineの先頭でSRにMIPS_SR_EXLを書き込む命令を実行する時点
で割り込みを受け付ける状態になっていると仮定します。すると、以下のような
シナリオで"trap: TLB miss (load or instr. fetch) in kernel mode"が発生す
ると思われます。

0. ユーザプロセスがwait4.oの中でsyscall命令を実行する。EPCはsyscall命令
   のアドレスとなる。
	:
	:
(mips3_proc_trapmolineが呼ばれる)
1. mtc0 a0, MIPS_COP_0_STATUSが実行される(a0の内容はMIPS_SR_EXL)。
2. 続く1〜3命令の間に割り込みが入る。
3. mtc0命令の実行が完了してSRの内容はMIPS_SR_EXLとなる。
4. 割り込み処理が実行されるがSRのEXLが1なのでEPCが更新されない。(R4000の
   仕様)
5. 割り込み処理が終了してeretが実行されるが、EPCの内容が古いままである。
   eret命令実行時のSRの値は割り込み受け付け時の値、すなわちMIPS_SR_EXLで
   ある。
6. EPCはwait4.oの中のsyscall命令のアドレスなので、そこから実行を再開しよ
   うとする。
7. TLBにはEPCにマッチするエントリがなかったのでTLB miss例外が発生する。
8. TLB miss例外発生時のSRの値はMIPS_SR_EXLであり、カーネルモードである。
9. "trap: TLB miss (load or instr. fetch) in kernel mode"が発生する。

このシナリオで現象が説明できると思うのですが。

取りあえずの回避策ですが、以下のようにmips3_proc_trampolineの先頭でSRに
MIPS_SR_EXLを書き込む前に割り込みを禁止すればよいと思われます。

ただし、これが正しい修正方法かどうかは疑問があります。cpu_switchの最後で
SRに割り込み許可状態の値が書き込まれてから、mips3_proc_trampolineで再度
割り込みが禁止されるまでの間に実行される部分が割り込みに対して安全である
かどうかはきちんと検討されていないように思われるからです。

# プロセスのコンテキストスイッチについてきちんと理解できていないので、誤っ
# た前提条件を元に考察しているかもしれません。

篠原

Index: locore_mips3.S
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/mips/mips/locore_mips3.S,v
retrieving revision 1.69
diff -u -r1.69 locore_mips3.S
--- locore_mips3.S	2001/06/11 23:52:39	1.69
+++ locore_mips3.S	2001/07/07 06:20:27
@@ -2127,6 +2127,9 @@
 	jal	ra, s0
 	move	a0, s1
 	.set	noat
+	mtc0	zero, MIPS_COP_0_STATUS		# disable interrupts
+	nop
+	nop
 	li	a0, MIPS_SR_EXL			# set exception level
 	mtc0	a0, MIPS_COP_0_STATUS
 	nop