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

(toppers-users 887) Re: SH3 dispatcherバグ?



豊橋技術科学大学の本田です.

本田広樹さんご指摘ありがとう御座います.

- Honda Hiroki <hhonda at ipflex com>-san writes ---
> アイピーフレックス株式会社の本田です。
> 
> config/sh3/cpu_support.S の dispatcher に「sleep して割り込み待ち」す
> るところがあります。
> 
>   dispatcher_2:
>     ldc    r9,sr   /* 割り込みの許可 */
>     sleep          /* 割込み待ち     */
>     ldc    r8,sr   /* 割り込み禁止   */  
> 

** Cut quoted 2 lines by the mail filter. **

上記のコードの問題は,ご指摘のように ldc r9,sr での割込みの許可と
sleep がアトミックでないことです.

この問題は以前に指摘されまして,現在開発中の1.4のコードでは, SR を BL
= '1' ,IPM = "0000" にしてから sleep を実行します.

BLビットを1にしてから sleep を実行することで,割込みの許可と sleep が
アトミックに実行できます.

---------------------------------------------------------------------
    /*
     *  割込み許可後にsleep命令を実行すると,割込み許可命令の実行前に
     *  割込み要求が入っている場合,割込み許可命令の実行と共に割込みが
     *  受け付けられその復帰後に,reqflgのチェックではなく sleep 状態
     *  に入ってしまう.
     *  この問題は,割込みの許可と sleep 状態への以降がアトミックに実
     *  行できないことに起因する.
     *  そのため,sleep 実行直前の SR 変更では BL ビットを'1'に設定す
     *  ることで,割込みの許可と sleep 状態への以降をアトミックに実行
     *  する.
     *  ldc r9,sr ではBLビットがセットされるため,割込みは受け付けずス
     *  リープモードに移行する.スリープモード中は,BLビットが1でも割
     *  込みを受け付けるため(SH7709ハードウェアマニュアル 8-10),スリー
     *  プモードへの移行直後に割込みを受付スリープモードから復帰する.
     */

    mov.l  _mask_bl_md_dis,r9   /* 割り込み待ち中のSRの値  */
    ....
dispatcher_2:
    ldc    r9,sr               /* 割り込みの許可                   */
    sleep                      /* 割込み待ち                       */
    ldc    r8,sr               /* 割り込み禁止                     */
    ....

_mask_bl_md_dis:
    .long 0x50000000

---------------------------------------------------------------------
上記のコメントで説明が十分か不安なので意見を頂けると幸いです.
#コード自体も正しいかも含めて.

このようなクリティカルなバグはMLでお知らせするべきですね.

これからはMLに流すようにします.
-------------------------------------------------------
本田 晋也(Shinya Honda)
豊橋技術科学大学大学院 工学研究科 電子情報工学専攻  
名古屋大学大学院 情報科学研究科 情報システム学専攻 高田・冨山研究室
E-mail  honda at ertl jp               
WWW     http://www.ertl.jp/~honda