[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