FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-V IOMMU の構成についてマニュアルを読んでまとめる (8. MSIアドレス・マスク)

前回:msyksphinz.hatenablog.com

github.com

RISC-V IOMMUの構成について、概略をざっくり理解するためのメモ。

何回か読もうとして挫折してきたので、もう一度ちゃんと読んでみようと思う。


MSI ページテーブルポインタ (msiptp)

.MSIページテーブルポインタ(msiptp)フィールド.

msiptp.PPN フィールドは、 IMSIC 内のゲスト割り込みファイルに MSIを指示するために使用されるルート MSI ページ・テーブルの PPN を保持する。 MSI ページ・テーブルのフォーマットは、Advanced Interrupt Architecture仕様で定義されている。

msiptp.MODEフィールドは、MSIアドレス変換スキームを選択するために使用される。

msiptp.MODE フィールドのエンコーディング
Value Name Description

0

Off

MSIアドレスマスクとパターンを使用した仮想割り込みファイルへのアクセスの認識が行われない。

1

Flat

フラット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=1DC は、以下の条件のいずれかが真である場合、misconfiguredとみなされる。 設定ミスの場合、停止し、"DDT entry misconfigured" (cause = 259)と報告する。

  1. 将来の標準使用のために予約されているビットやエンコーディングが設定されている場合。

  2. capabilities.ATS が0で、 DC.tc.EN_ATS 、または DC.tc.EN_PRI 、または DC.tc.PRPR が1である。

  3. DC.tc.EN_ATS が0、 DC.tc.T2GPA が1

  4. DC.tc.EN_ATS が0、 DC.tc.EN_PRI が1

  5. DC.tc.EN_PRI が0、 DC.tc.PRPR が1

  6. capabilities.T2GPA は0、 DC.tc.T2GPA は1である。

  7. DC.tc.T2GPA は1、 DC.iohgatp.MODEBare である。

  8. DC.tc.PDTV が1であり、 DC.fsc.pdtp.MODE がサポートされていないモードである。

    1. capabilities.PD20 が0で、 DC.fsc.ptp.MODEPD20 の場合

    2. capabilities.PD17 が0で、 DC.fsc.ptp.MODEPD17 の場合

    3. capabilities.PD8 が0で、DC.fsc.ptp.MODEPD8 の場合

  9. DC.tc.PDTV が0であり、かつ DC.fsc.iosatp.MODE エンコーディングが表3によって決定される有効なエンコーディングではないこと。

  10. DC.tc.PDTV が0、 DC.tc.SXL が0, DC.fsc.iosatp.MODE がサポートされているモードではない

    1. capabilities.Sv39 は0、 DC.fsc.iosatp.MODESv39

    2. capabilities.Sv48 は0、 DC.fsc.iosatp.MODESv48

    3. capabilities.Sv57 は0、 DC.fsc.iosatp.MODESv57

  11. DC.tc.PDTV が0、 DC.tc.SXL が1 DC.fsc.iosatp.MODE がサポートされているモードではない

    1. capabilities.Sv32 は 0 で、 DC.fsc.iosatp.MODESv32
  12. DC.tc.PDTV が0、 DC.tc.DPE が1

  13. DC.iohgatp.MODE エンコーディングは、表2によって決定される有効なエンコーディングではない。

  14. fctl.GXL が0であり、DC.iohgatp.MODE がサポートされていないモードである。

    1. capabilities.Sv39x4 は0、DC.iohgatp.MODE`は `Sv39x4

    2. capabilities.Sv48x4 は0、DC.iohgatp.MODE`は `Sv48x4

    3. capabilities.Sv57x4 は0、DC.iohgatp.MODE`は `Sv57x4

  15. `fctl.GXL`が1であり、`DC.iohgatp.MODE`がサポートされていないモードである。

    1. capabilities.Sv32x4 が0、DC.iohgatp.MODE`が `Sv32x4
  16. capabilities.MSI_FLAT が1であり、 DC.msiptp.MODEOff でも Flat でもない。

  17. DC.iohgatp.MODE`が `Bare ではなく、DC.iohgatp.PPN によって決定されるルートページ表が16-KiB境界にアライメントされていない。

  18. capabilities.AMO_HWAD が0で、 DC.tc.SADE または DC.tc.GADE が1である。

  19. capabilities.END が0かつ fctl.BE != DC.tc.SBE

  20. 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でなければならない。

  21. DC.tc.SBE の値が正当な値でない。fctl.BE が書き込み可能な場合、 DC.tc.SBE は0または1である。もし`fctl.BE` がが書き込み可能でない場合、 DC.tc.SBEfctl.BE と同じでなければならない。

一部の DC フィールドは、スーパーバイザ物理アドレスまたはゲスト物理アドレスを保持する。 一部の実装では、 DC の位置を特定するときに、 capabilities.PAS などで決定されるサポート範囲よりもスーパバイザ物理アドレスの幅が広くないなど、アドレスの有効性を検証することがある。

このような実装では、"DDTentry misconfigured"(cause=259)フォルトが発生する可能性がある。他の実装では、これらのフィールドによって参照されるデータ構造にアクセスする必要がある場合にのみ、このようなアドレスが無効であることを検出する。 そのような実装はは、アクセスの過程でアクセス違反の故障を検出する可能性がある。