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

Re: CASSIOPEIA report



鈴木(康)です。
<200005160203.LAA01822@ninja.hpc.bs1.fc.nec.co.jp>の記事において
suz@hpc.bs1.fc.nec.co.jpさんは書きました。

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

ソースを追ってみましたが、

割り込みエントリの vrpmu_intr() から直接 call 関係で処理が
続いていくみたいですね。(config_hook_call() も含めて)

ということは、この間ずっと、ハイレベルな割り込み処理として実行されますね。
このレベルでは、sleep することはもとより 同種の割り込みが入るように
マスクを開く(eni ?) こともまずそうです。

このレベルでも printf はできるようなので、同じようにして
割り込み処理を一旦 抜けてから、(キューイングされた)実際の処理を行う
という構造を導入しないといけないと思います。

切口としては、やっぱり config_hook_call ではないでしょうか?

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