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

(toppers-users 884) SH3 dispatcher バグ?



アイピーフレックス株式会社の本田です。

config/sh3/cpu_support.S の dispatcher に「sleep して割り込み待ち」す
るところがあります。

  dispatcher_2:
    ldc    r9,sr   /* 割り込みの許可 */
    sleep          /* 割込み待ち     */
    ldc    r8,sr   /* 割り込み禁止   */  

これは、次のようなシナリオの時に破綻しないでしょうか?

  (1) システムが快調に動いていて、たまたま「ready タスクが
      なく、running タスクが孤独に実行中」という状態になった。
  (2) running タスクが slp_tsk() や wai_sem() 等の待ち系
      システムコールを呼んだため、JSP カーネルが loc_cpu()
      して dispatch を呼んだ。
  (3) dispatch はコンテキストセーブして dispacher に飛んだ。
  (4) dispatcher は「schedtsk == NULL だから sleep しよう」
      と判断し、dispatcher_2 に飛んだ。
  (5) 上記 (3)(4) の間に外部割り込みが発生したのだが、
      CPU ロック状態なので受け付けが延期されていた。
  (6) dispatcher_2 が ldc r9,sr を実行したところで割り込みが
      受け付けられ、割り込みハンドラに制御が移った。
      [戻り先 PC = sleep 命令]
  (7) 割り込みハンドラが iwup_tsk() だか isig_sem() だかを
      呼んで、どこかのタスクを起こした。
  (8) 割り込みハンドラからリターンし、割り込み前の処理の
      続きを行うべく、sleep 命令のところに戻った。
  (9) sleep 命令を実行し、CPU は寝てしまう。
      あれれ?  割り込みハンドラによってどこかのタスクが
      起こされたんだからそのタスクを実行すべきなのでは…!

(9) で不当に寝てしまっても、何らかの割り込み (タイムティック割り込み等) 
がかかれば目覚めるので、システムがハングしてしまうことはありませんが、
RTOS としての面目はつぶれてしまいます。

# 「タイムティック割り込みを含むほとんどの割り込みを chg_ipm() でマス
# クして、単発の最高優先割り込みだけを待つ」という (いささか行儀悪い) 
# アプリケーションのときに上記シナリオが発生すると、システムがハング
# してしまいます。

この問題は、割り込み許可と sleep が atomic でないことに起因します。
m68k の stop 命令なら問題ありません。

「ldc r9,sr の効果は ldc の次命令実行後に発効」というんなら問題ありま
せんが、SH3 の仕様書を見る限りそのようなことはなさそうです。

どうなんでしょうか?

====
アイピーフレックス株式会社
R&D センター
本田広樹 (hhonda at ipflex com)