- 各HARTに1個のIMSICが定義されている。各HARTの外部割り込み専用コントローラとして動作する。
- MSIのアドレスとデータに基づき、どのHART向けの割り込み要求か、どの特権レベル / どの仮想 HART(ゲスト)向けの割り込み要求かを識別する。
- 識別した結果を割り込みファイル (Interrupt File)に保存する。
2. 割り込みファイル (Interrupt File)の構成
- 各HARTは、割り込みの届け先毎に別々の割り込みファイルを持っている。最低でも以下の割り込みファイルを用意する必要がある。
- M-mode用割り込みファイル : 1ファイル
- S-mode用割り込みファイル : 1ファイル
- H拡張を持っている場合、VS-mode用に
GEILEN個の割り込みファイルを持っている。
GEILEN はサポートする guest external interrupt の数
- 各割り込みファイルの内部ビット構成
- Interrupt-pending-bits
- 到着したがまだサービスされていないMSIを記録するビット列
- Interrupt-enable-bits
- HARTが受付可能な割り込みを指定するビット列
- 各ファイルにおいて、割り込みファイルが以下のように並んでいると考えてよい (このとおりにメモリWriteを起こすわけでは無い)
- 以下のリストは、HARTから見えるCSRの構成 (IMSICからつながっている外部バスからは見えない)
| Offset |
Size |
Contents |
| 0x000 |
8 |
Interrupt-pending-bits for 1-63 (eip0) |
| 0x008 |
8 |
Interrupt-enable-bits for 1-63 (eie0) |
| 0x010 |
8 |
Interrupt-pending-bits for 64-127 (eip2) |
| 0x018 |
8 |
Interrupt-enable-bits for 64-127 (eie2) |
| … |
|
|
| 0x1F0 |
8 |
Interrupt-pending-bits for 1984-2047 (eip63) |
| 0x1F8 |
8 |
Interrupt-enable-bits for 1984-2047 (eie63) |
- MSIは特定アドレスへの32ビット書き込みとして送出される。
- MSIアドレス: IMSICのどの割り込みファイルに書き込むか
- MSIデータ: その割り込みファイルの中で、どの割り込みID番号をPendingにするかを示す。
- 最大IDは上記の通り、2027となり、これがエンコードされた状態で送られる。
3. MSI割り込み書き込みによる割り込みの起こし方
- IMSICの
seteipnum_le にLittle Endianで値xを書き込む → ID=x のPendingビットが1に設定される。
- Big Endianの場合は
seteipnum_be にBig Endianで値 x を書き込む。
- 各割り込みファイルにつき、 4KiBの物理アドレス空間が確保されている。
| Offset |
Size |
Contents |
| 0x000 |
4 |
seteipnum_le |
| 0x004 |
4 |
seteipnum_be |
- 各割り込みファイルにおいて、M-modeの割り込みファイルページを連続した領域に集約し、S-mode + VS-modeの割り込みファイルページも別の連続領域に集約することが推奨されている。
- 理由: PMP (Physical Memory Protection) での防御時に、PMPエントリを最小限にするため。
4. 割り込み発生後の対応する間接レジスタへのアクセス
IMSICに外部メモリバスから割り込み通知が書き込まれた後、HART側からCSRにアクセスしてその情報を読み出すことができる。
上記のeip0 ~ eip63 / eie0 ~ eie63が直接アクセスできれば良いのだが、消費するCSRの空間が大きいので、セレクトレジスタを使ってどのCSRにアクセスするのかが決められる。
| CSR Address |
|
|
|
| 0x350 |
miselect |
Machine indirect register select |
間接的に読み込むレジスタアドレスを指定する |
| 0x351 |
mireg |
Machine indirect register select |
間接的に読み書きが可能なレジスタの実態がここにミラーされる |
| 0x150 |
siselect |
Supervisor indirect register select |
間接的に読み込むレジスタアドレスを指定する |
| 0x151 |
sireg |
Supervisor indirect register alias |
間接的に読み書きが可能なレジスタの実態がここにミラーされる |
実際にアクセスできるCSRのmiselectで指定するアドレスとそのCSRのペアは以下のとおりである。
| miselect Address |
Register Name |
|
| 0x70 |
eidelivery |
外部割り込みの delivery enable |
| 0x72 |
eithreshold |
外部割り込みの優先度しきい値 |
| 0x80 |
eip0 |
pending ビット配列 |
| 0x81 |
eip1 |
|
| … |
… |
|
| 0xBF |
eip63 |
|
| 0xC0 |
eie0 |
enable ビット配列 |
| 0xC1 |
eie1 |
|
| .. |
… |
|
| 0xFF |
eie63 |
|
eidelivery(外部割り込みの delivery enable)
eidelivery は「IMSIC から見た外部割り込みを mip/sip/hgeip に出すかどうか」を制御するレジスタ。
- 0 = InterruptをMIP/SIP/HGEIPに通知しない
- 1 = InterruptをMIP/SIP/HGEIPに通知する
- 0x4000_0000 = PLIC / APLICからのInterruptを通知する
- リセット後、0x40000000 に初期化されることがあり (サポートされていれば)、これは「PLIC/APLIC がある前提のレガシーSW を動かすため」のモード
eithreshold(外部割り込みの優先度しきい値)
- この割り込みファイルから出せる最低優先度(最大 ID 番号)
eithreshold = 0 のとき:全ての enable された割り込みが候補になる
eithreshold = T (>0) のとき:ID ≥ T の割り込みは「存在しない」のと同じ扱いで、enable ビットが立っていても通知されない。
- eip / eie ビット列
eip0–eip63:pending ビット配列
eie0–eie63:enable ビット配列
- 1 レジスタあたり 64 個の ID を担当(XLEN に応じて odd/even レジスタの扱いが変わる)。
- 有効な ID に対応しないビットは読み取り専用 0
5. その他の外部割込み制御用CSR
| CSR Address |
CSR Name |
Explanation |
| 0x35c |
mtopei |
Machine top external interrupt (only with an IMSIC) |
| 0xFB0 |
mtopi |
Machine top interrupt |
| 0x15C |
stopei |
Supervisor top external interrupt (only with an IMSIC) |
| 0xDB0 |
stopi |
Supervisor top interrupt |
| 0x25C |
vstopei |
Virtual supervisor top external interrupt (only with an IMSIC) |
| 0xEB0 |
vstopi |
Virtual supervisor top interrupt |
mtopei = 今一番優先度の高い pending+enable 割り込みをまとめる