RISC-V IOMMUの構成について、概略をざっくり理解するためのメモ。
何回か読もうとして挫折してきたので、もう一度ちゃんと読んでみようと思う。
MSI ページテーブルポインタ (msiptp)
.MSIページテーブルポインタ(msiptp)フィールド.

msiptp.PPN フィールドは、 IMSIC 内のゲスト割り込みファイルに MSIを指示するために使用されるルート MSI ページ・テーブルの PPN を保持する。
MSI ページ・テーブルのフォーマットは、Advanced Interrupt Architecture仕様で定義されている。
msiptp.MODEフィールドは、MSIアドレス変換スキームを選択するために使用される。
| Value | Name | Description |
|---|---|---|
0 |
|
MSIアドレスマスクとパターンを使用した仮想割り込みファイルへのアクセスの認識が行われない。 |
1 |
|
フラットMSIページテーブル。 |
2-13 |
— |
標準的な使用のために予約されている。 |
14-15 |
— |
カスタム仕様。 |
MSI アドレスマスク (msi_addr_mask) とパターン (msi_addr_pattern)
.MSIアドレス・マスク(msi_addr_mask)フィールド.

MSIアドレス・パターン(msi_addr_pattern)フィールド.

MSI アドレス・マスク (msi_addr_mask) およびパターン (msi_addr_pattern) フィールドは、関連する VMのゲスト物理アドレス空間内の仮想割り込みファイルの 4-KiBページを識別するために使用される。
デバイスによって行われる着信メモリ・アクセスは、宛先のゲスト物理ページが、指定されたアドレス・マスクのすべてのビット位置で指定されたアドレス・パターンに一致する場合に、仮想割り込みファイルへのアクセスとして認識される。 詳細には、ゲスト物理アドレスAへのメモリ・アクセスは、以下の場合に仮想割込みファイルのメモリ・マップド・ページへのアクセスとして認識される:
(A >> 12) & ~msi_addr_mask = (msi_addr_pattern & ~msi_addr_mask)
ここで、>> 12は12ビット右シフトを表し、アンパサンド(&)はビットごとの論理ANDを表し、~msi_addr_mask はアドレスマスクのビットごとの論理補数である。
2.1.4. デバイス・コンテキスト設定チェック
DC.tc.V=1 の DC は、以下の条件のいずれかが真である場合、misconfiguredとみなされる。
設定ミスの場合、停止し、"DDT entry misconfigured" (cause = 259)と報告する。
将来の標準使用のために予約されているビットやエンコーディングが設定されている場合。
capabilities.ATSが0で、DC.tc.EN_ATS、またはDC.tc.EN_PRI、またはDC.tc.PRPRが1である。DC.tc.EN_ATSが0、DC.tc.T2GPAが1DC.tc.EN_ATSが0、DC.tc.EN_PRIが1DC.tc.EN_PRIが0、DC.tc.PRPRが1capabilities.T2GPAは0、DC.tc.T2GPAは1である。DC.tc.T2GPAは1、DC.iohgatp.MODEはBareである。DC.tc.PDTVが1であり、DC.fsc.pdtp.MODEがサポートされていないモードである。capabilities.PD20が0で、DC.fsc.ptp.MODEがPD20の場合capabilities.PD17が0で、DC.fsc.ptp.MODEがPD17の場合capabilities.PD8が0で、DC.fsc.ptp.MODEがPD8の場合
DC.tc.PDTVが0であり、かつDC.fsc.iosatp.MODEエンコーディングが表3によって決定される有効なエンコーディングではないこと。DC.tc.PDTVが0、DC.tc.SXLが0,DC.fsc.iosatp.MODEがサポートされているモードではないcapabilities.Sv39は0、DC.fsc.iosatp.MODEはSv39capabilities.Sv48は0、DC.fsc.iosatp.MODEはSv48capabilities.Sv57は0、DC.fsc.iosatp.MODEはSv57
DC.tc.PDTVが0、DC.tc.SXLが1DC.fsc.iosatp.MODEがサポートされているモードではないcapabilities.Sv32は 0 で、DC.fsc.iosatp.MODEはSv32
DC.tc.PDTVが0、DC.tc.DPEが1DC.iohgatp.MODEエンコーディングは、表2によって決定される有効なエンコーディングではない。fctl.GXLが0であり、DC.iohgatp.MODEがサポートされていないモードである。capabilities.Sv39x4は0、DC.iohgatp.MODE`は `Sv39x4capabilities.Sv48x4は0、DC.iohgatp.MODE`は `Sv48x4capabilities.Sv57x4は0、DC.iohgatp.MODE`は `Sv57x4
`fctl.GXL`が1であり、`DC.iohgatp.MODE`がサポートされていないモードである。
capabilities.Sv32x4が0、DC.iohgatp.MODE`が `Sv32x4
capabilities.MSI_FLATが1であり、DC.msiptp.MODEがOffでもFlatでもない。DC.iohgatp.MODE`が `Bareではなく、DC.iohgatp.PPNによって決定されるルートページ表が16-KiB境界にアライメントされていない。capabilities.AMO_HWADが0で、DC.tc.SADEまたはDC.tc.GADEが1である。capabilities.ENDが0かつfctl.BE != DC.tc.SBEDC.tc.SXLの値が正当な値でない。fctl.GXL`が1の場合、 `DC.tc.SXLは1でなければならない。fctl.GXL`が0で書き込み可能な場合、`DC.tc.SXLは0でも1でもよい。fctl.GXL`が0で書き込み可能でない場合、`DC.tc.SXLは0でなければならない。DC.tc.SBEの値が正当な値でない。fctl.BEが書き込み可能な場合、DC.tc.SBEは0または1である。もし`fctl.BE` がが書き込み可能でない場合、DC.tc.SBEはfctl.BEと同じでなければならない。
一部の DC フィールドは、スーパーバイザ物理アドレスまたはゲスト物理アドレスを保持する。
一部の実装では、 DC の位置を特定するときに、 capabilities.PAS などで決定されるサポート範囲よりもスーパバイザ物理アドレスの幅が広くないなど、アドレスの有効性を検証することがある。
このような実装では、"DDTentry misconfigured"(cause=259)フォルトが発生する可能性がある。他の実装では、これらのフィールドによって参照されるデータ構造にアクセスする必要がある場合にのみ、このようなアドレスが無効であることを検出する。 そのような実装はは、アクセスの過程でアクセス違反の故障を検出する可能性がある。