RISC-VのAdvanced Platform Interrupt Controller (APLIC) について勉強してみようと思う。
まずは以下のブログを読んで概観を掴もう。
今回はレジスタの構成についてまとめてみた。必要なのはだいたいこんな感じかなと思う。
Name | Address | Description |
---|---|---|
domaincfg |
0x0000 | - [0] : Big-Endian - [2] Delivery mode: 0=direct delivery mode, 1=MSI delivery mode - [8] IE Interrupt Enable |
sourcecfg[1-1023] |
0x0004 - 0x0ffc | - [2 : 0] source mode (SM): Inactive/Detached/Edge1/Edge0/Level1/Level0 - [10] : delegate: |
mmsiaddrcfg |
0x1bc0 | |
mmsiaddrcfgh |
0x1bc4 | |
smsiaddrcfg |
0x1bc8 | |
smsiaddrcfgh |
0x1bcc | |
setip[0-31] |
0x1c00 - 0x1c7c | Sourceの割り込み要因に明示的に割り込みを挿入するためのレジスタ |
setipnum |
0x1cdc | setipと同様のことが可能だが、割り込み要因IDを用いて割り込みを挿入することができるレジスタ |
clrip |
0x1d00 - 0x1d7c | Sourceの割り込み要因を明示的にクリアすることができるレジスタ |
clripnum |
0x1ddc | clripと同様のことが可能だが、割り込み要因IDを用いて割り込みをクリアすることのできるレジスタ |
setie[0-31] |
0x1e00 - 0x1e7c | 割り込みEnable Bitを設定するためのレジスタ |
setienum |
0x1edc | 割り込みSource番号を使ってEnable Bitを有効化するためのレジスタ |
clrie[0-31] |
0x1f00 - 0x1f7c | 割り込みEnable Bitをクリアするためのレジスタ |
clrenum |
0x1fdc | 割り込みSource番号を使ってEnable Bitをクリアするためのレジスタ |
setipnum_le |
0x2000 | |
setipnum_be |
0x2004 | |
genmsi |
0x3000 | - [10: 0] EIID: External interrupt identifier - [31:18] Hart Index: Hart index that wants to send an MSI. |
target[1-1023] |
0x3004 - 0x3ffc | Direct delivery modeの場合: - [31:18] 割り込みを送出するHartのインデックス - [ 7: 0] Priority MSI Delivery Mode: - [31:18] 割り込みを送出するHartのインデックス - [17:12] Guest Index - [10:0] EIID |
Starting from 0x4000, "interrupt domain control" (IDC) region.
Name | Address | Description |
---|---|---|
idelivery |
0x0000 | - [0] : 1の場合は割り込みを通知する。0の場合は通知しない |
iforce |
0x0004 | - [0] : APLICの割り込みが有効なとき、このレジスタに書き込むと#0の割り込みを強制的に送出する |
ithreshold |
0x0008 | 割り込みのスレッショルドを設定する |
topi |
0x0018 | 現在ペンディングの最も高いPriorityの割り込み番号を格納する |
claimi |
0x001c | topiと同じものが参照できるが、読むことによって当該割り込みのpendingビットを下げることができる |