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

Re: CASSIOPEIA report



鈴木(康)です。
<200005160111.KAA25916@shin1.sm.sony.co.jp>の記事において
takemura@netbsd.orgさんは書きました。

  |  >   | 肝心のサスペンドの実験は、なんだかうまくいっていません。
  |  >   | 
  |  >   | vrpmu.c で 次のようにしてみたんですが、
  |  >   | power ボタン押したら、それでハングアップするみたい。
  | 
  | cpu_reset() のコードはちゃんと動作しているので、違いといえば、
  | power ボタンを押した時に実行されるコードは割り込みルーチンで
  | あるということです。
  | すでに割り込みが禁止されている状態で suspend してしまって、
  | 戻れなくなっているのではないでしょうか。
  | コプロセッサの割り込みマスクレジスタの値を調べてみて下さい。

いろいろやってみました。

とりあえず software interrupt のコードを追加して
その interrupt level で実行しています。

mips3_KernIntr    (VR_INTR0 )
    cpu_intr
       config_hook_intr()
	btnmgr_hook()

という呼出し関係( () 内は cause ) で、

	vrip_intr_suspend()
	STANDBY
	vrip_intr_resume()

するコードを実行させました。

このときの 割り込みマスクレジスタは、

0x3a0 
	 SYSINT1_SIU |  SYSINT1_GIU | SYSINT1_KIU | SYSINT1_PIU
	| SYSINT1_RTCL1 | SYSINT1_POWER 

でした。

vrip_intr_suspend() で いろいろ マスクするレジスタを変更して
みたんですが。

   SYSINT1_RTCL1 を立てたとき  => コードが実行されすぐ終わる。
   SYSINT1_RTCL1 を立てないとき => フリーズ

となるようです。

いろいろ調べたら、

rtc は、VR_INTR1
それ以外は、VR_INTR0

になっていることに気がつきました。

ひょっとして、INTR0 の 割り込みルーチンの中で止めると INTR1 しか来ないのでは
ないでしょうか?

だとすると ... どうしたら良いのでしょうね。

ちなみに software interrupt は、仕組み的に INTR0 と INTR1 の両方
で動くようです。

callout は、(ほとんど?)INTR1 で動くことになるので、ここで CPU を止めると
フリーズしそうです。

作ってみた software interrupt にしても、INTR0 動くとは限らない上に
INTR1 の割り込み は rtc に限られるので、POWER ボタンの
割り込みが受けつけられないことになりそうです。

このやりかたの延長でテストしたければ、INTR2 を setup してから 止めることを
しないといけないんでしょうね。

なんだか頭痛くなってきました。

--
					鈴木 康司 @NECソリューションズ
					suz@hpc.bs1.fc.nec.co.jp
					TEL 042-333-6465