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
はSv39
capabilities.Sv48
は0、DC.fsc.iosatp.MODE
はSv48
capabilities.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`は `Sv39x4
capabilities.Sv48x4
は0、DC.iohgatp.MODE`は `Sv48x4
capabilities.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.SBE
DC.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)フォルトが発生する可能性がある。他の実装では、これらのフィールドによって参照されるデータ構造にアクセスする必要がある場合にのみ、このようなアドレスが無効であることを検出する。 そのような実装はは、アクセスの過程でアクセス違反の故障を検出する可能性がある。