RISC-V IOMMUの構成について、概略をざっくり理解するためのメモ。
何回か読もうとして挫折してきたので、もう一度ちゃんと読んでみようと思う。
2.1.3. デバイス・コンテキスト・フィールド
トランスレーション・コントロール (tc)
Vビットが1の場合、 DC は有効である。 Vビットが0の場合、 DC の他のすべてのビットはdon’t-careであり、ソフトウェアが自由に使用できる。 IOMMU が PCIe ATS 仕様[1]をサポートしている場合(capabilities レジスタを参照)、 EN_ATS ビットはATSトランザクション処理を有効にするために使用される。 EN_ATS が 1 に設定されている場合、IOMMUは以下のインバウンドトランザクションをサポートする。
- トランザクション実行のためのトランスレーションされた読み取り
- トランスレーションされた読み取りトランザクション
- トランスレーションされた書き込み/AMOトランザクション
- PCIe ATSトランスレーション・リクエスト
- PCIe ATS無効化完了メッセージ
EN_ATS ビットが 1 で、 T2GPA ビットが 1 に設定されている場合、IOMMU はデバイスからの PCIe ATS 変換要求の完了時に、提供する変換の許可とサイズを決定するために 2 段階のアドレス変換を実行する。 ただし、IOMMU はレスポンスにおいて、IOVA の変換として SPA ではなく GPA を返す。 この動作モードでは、デバイスの ATC は IOVA の変換として GPA をキャッシュし、その後の変換されたメモリ・アクセス・トランザクションのアドレスとして GPA を使用する。 通常、変換されたリクエストは SPA を使用し、IOMMU がさらに変換を実行する必要はない。 しかし、 T2GPA が 1 の場合、デバイスからのトランスレートされたリクエストは GPA を使用し、IOMMU によって第 2 ステージのページテーブルを使用してSPA にトランスレートされる。 T2GPA 制御により、デバイスが ATS 機能を誤用し、VM と関連付けられていないメモリにアクセスしようとした場合でも、ハイパーバイザはデバイスからの DMA を封じ込めることができる。
T2GPA が有効な場合、PCIe ATS Translation Request に応答してデバイスに提供されるアドレスは、デバイスを他のピアデバイスやホストに接続する I/O ファブリック(PCIスイッチなど)によって直接ルーティングされない。 また、デバイス内のピアツーピアトランザクション(デバイスの機能間など)がサポートされている場合、そのようなアドレスはデバイス内でルーティングされない。
T2GPA を1に設定するハイパーバイザは、プロトコル固有の手段により、IOMMUがGPAを変換し、PAに基づくトランザクションをメモリまたはPAにルーティングするように、変換されたアクセスがホストを経由してルーティングされることを保証しなければならない。
ピア・デバイス。たとえばPCIeの場合、アクセス・コントロール・サービス(ACS)は、ピアツーピア(P2P)要求を常にアップストリームにリダイレクトしてホストに送るように設定する必要がある。 1 に設定された T2GPA の使用は、PCIe ATS 変換リクエストに応答して返される変換アドレスでタグ付けされたキャッシュを実装するデバイスと互換性がない可能性がある。 T2GPA を 1 に設定する代わりに、認証プロトコルがデバイスによってサポートされている場合、ハイパーバイザはデバイスとの信頼関係を確立することができる。 例えばPCIe の場合、PCIe コンポーネント測定認証(CMA)機能は、デバイスの構成とファームウェア / 実行可能ファイル(Measurement)およびハードウェアID(Authentication)を検証し、そのような信頼関係を確立するメカニズムを提供する。
EN_PRI ビットが 0 の場合、デバイスからの PCIe "Page Request" メッセージは無効なリクエストである。 デバイスから受信した "Page Request "メッセージは、"Page Request Group Response "メッセージで応答される。 通常、ソフトウェア・ハンドラがこの応答メッセージを生成する。 しかし、条件によってはIOMMU 自身が応答を生成することもある。 IOMMU が生成する「ページ要求グループ応答」メッセージでは、PRG-response-PASID-required (PRPR) ビットが 1 にセットされると、関連する「ページ要求」にPASID があった場合、IOMMU の応答メッセージに PASID を含める必要があることを示す。
PASIDをサポートし、"PRG Response PASID Required "ケイパビリティビットを 1に設定している関数は、関連する "Page Request "メッセージにPASIDがあった場合、"Page Request Group Response "メッセージにPASIDが含まれることを期待する。 ケイパビリティビットが 0 の場合、関数は「ページ要求グループ応答」メッセージの PASID を期待せず、PASID を含む応答を受け取った場合の関数の動作は未定義である。 PRPR ビットは、「PRG Response PASID Required」ケイパビリティビットに保持されている値で構成されるべきである。
disable-translation-fault (DTF) ビットを1に設定すると、アドレス変換処理で発生したフォルトの報告が無効になる。 DTF を1に設定しても、フォールト・トランザクションに応答してデバイスに生成されるエラー・レスポンスは無効にならない。 DTF を1に設定しても、アドレス変換プロセスに関連しないIOMMUからのフォルト報告は無効にならない。 DTF が1のときに報告されないフォルトを表11に示す。
ハイパーバイザーは、仮想マシンの異常終了など、エラーの多発につながる可能性がある状況を特定した場合、DTFを1に設定してフォールトレポートを無効にすることができる。
DC.fsc フィールドは、第1段翻訳用のコンテキストを保持する。 PDTV ビットが1の場合、このフィールドはプロセス・ディレクトリ・テーブル・ポインタ(pdtp)を保持する。 PDTV ビットが0の場合、DC.fscフィールドは(iosatp)を保持する。
PDTV ビットは、DCが複数のプロセス・コンテキストをサポートするデバイスに関連付けられており、その結果、そのメモリアクセスで有効な process_id を生成する場合に1に設定されることが期待される。 例えばPCIeの場合、リクエストにPASIDがあれば、そのPASIDが process_id として使われる。 PDTV が1のとき、 DPE ビットを1に設定して、有効な process_id がないリクエストを変換するために process_id のデフォルト値として0を使用できるようにすることができる。 PDTV が0のとき、 DPE ビットは将来のために予約される。
IOMMU は、 capabilities.AMO_HWAD が 1 の場合、 GADE および SADE ビットの 1 設定をサポートする。 capabilities.AMO_HWAD が 0 の場合、これらのビットは予約されている。
GADE が 1 の場合、IOMMU は第2ステージの PTE の A ビットと D ビットをアトミックに更新する。 GADE が 0 の場合、IOMMU は、A ビットが 0 の場合、またはメモリアクセスがストアで D ビットが 0 の場合に、元のアクセスタイプに対応するゲストページフォールトを引き起こす。
SADE が 1 の場合、IOMMU は第 1 段 PTE の A ビットと D ビットをアトミックに更新する。 SADE が 0 の場合、IOMMU は、A ビットが 0 の場合、またはメモリ・アクセスがストアで D ビットが 0 の場合に、元のアクセス・タイプに対応するページ・フォールトを引き起こす。
SBE が 0 の場合、PDT エントリーと第 1 ステージの PTE への暗黙のメモリー・アクセスはリトルエンディアンである。 SBE がサポートする値は、 fctl.BE フィールドの値と同じである。
SXL フィールドは、表 3 に定義されているように、サポートされているページング仮想メモリ方式を制御する。 fctl.GXL が1の場合、 SXL フィールドは1でなければならない。そうでない場合、 SXL フィールドの正当な値は fctl.GXL フィールドの値と同じである。
SXL が1の場合、以下のルールが適用される:
第1段階がベアでない場合、IOVA のビット 31 以降のビットが 1 に設定されていれば、元のアクセス種別に対応するページフォルトが発生する。
セカンドステージが Bare でない場合、入力される GPA のビット 33 以降のビットが 1 に設定されていれば、元のアクセスタイプに対応するゲストページフォールトが発生する。