管理外割り込み

ADSP-BF537が正式発表されました。このプロセッサには対応したいのですが、その前にやることがあります。

  • sil_reb_iop()などの一連のIO読み取り関数を割り込みから保護する
  • 管理外割り込みに対応する

IO読み取りと割り込みからの保護

ある種のペリフェラルレジスタは読むだけで内部状態が変化してしまいます。一方、Blackfinの投機ロードは割り込みによって中断され、再読み込みをおこなうためこのてのレジスタの読み込みが正常に動作しない可能性があります。
これを保護するため、昨年秋にsil_reb_iopなどの関数に保護をかけました。具体的には危険なレジスタにアクセスする場合にCLI/STIペアで保護すると言うものです。これには

  1. 一部レジスタが保護されていない
  2. 外付けペリフェラルの保護がされていない

と言う問題がありました。そこで、内蔵レジスタの保護をcpu_defs.hからsys_defs.hに移して移植性を挙げた上で、board_defs.hで外付けレジスタの保護ができるように変更しました。この改良はすでにCVSに反映済みです。

管理外割り込みに対応する

管理外割り込みはITORN4標準でも言及されているもので、OSがまったく管理しない割り込みです。つまりOS自身はこの割り込みを禁止も許可もせず、管理外割り込みはアプリケーションと同期や通信をおこなえません。
TOPPERS/JSP for Blackfinは現在NMIを管理外割り込みとしています。しかし、NMI自身は投機的ロードとの兼ね合いで復帰不能な割り込みであるため、積極的に利用するべきではありません。また、管理外割り込みをOSが禁止しないとはいえ、sil_loc_intからも禁止できないのでは、先のsil_reb_iopとの兼ね合いから見てよくありません。
そこで、board_defs.hのなかからユーザーが任意の管理外割り込みを宣言できるようにしようと思っています。例えば、

#define UNMANAGED_INTERRUPT 0x0400

とすると、IVG12が管理外として予約されると言うものです。予約された管理割り込みはCPUロック/アンロック対象から外れます。つまりCPUロック/アンロック操作は上の例で言えばIVG12に影響を与えなくなります。
管理外割り込みを実装すると、確実にロック/アンロックの時間がふえます。これらの機能を使わないユーザーにとっては弊害以外の何者でもありません。あるいは条件コンパイルでも使ってオーバーヘッドを減らすべきなのか考えているところです。
これ自身はシステム依存部の作業が小さいのでBF537対応後にゆっくりやってもいいかなとは思っています。