以下の内容はhttps://msyksphinz.hatenablog.com/entry/2025/11/19/040000より取得しました。


RISC-Vの割り込み受付機構IMSICについて調査する

  • 各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 の数
  • 各割り込みファイルの内部ビット構成
    1. Interrupt-pending-bits
      • 到着したがまだサービスされていないMSIを記録するビット列
    2. Interrupt-enable-bits
      1. 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 ビット列
    • eip0eip63pending ビット配列
    • eie0eie63enable ビット配列
      • 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 割り込みをまとめる



以上の内容はhttps://msyksphinz.hatenablog.com/entry/2025/11/19/040000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14