RISC-V IOMMUの構成について、概略をざっくり理解するためのメモ。
何回か読もうとして挫折してきたので、もう一度ちゃんと読んでみようと思う。
ファースト・ステージ・コンテキスト (fsc)
DC.tc.PDTV が0の場合、DC.fscフィールドは、第一段階のアドレス変換とプロテクションのコントロールを提供するiosatp を保持する。

第1ステージのページテーブルフォーマットは、Privileged仕様で定義されている通りである。
DC.tc.SXLフィールドは、サポートされるページド仮想メモリ方式を制御する。
iosatp.MODEは、ページングされた仮想メモリ方式を識別し、表3で定義されているように符号化される。
iosatp.PPNフィールドは、第1ステージページテーブルのルートページのPPNを保持する。
第2段階のアドレス変換が Bare でない場合、iosatp.PPN はゲスト PPNである。 その後、 iohgatp
によって制御されるゲスト物理アドレス変換プロセスによって、ルートページのGPA がスーパーバイザ物理アドレスに変換される。
| DC.tc.SXL=0 | ||
|---|---|---|
| Value | Name | Description |
| 0 | Bare | 変換も保護もない。 |
| 1-7 | — | 標準的な使用のために予約されている。 |
| 8 | Sv39 | ページベースの39ビット仮想アドレッシング。 |
| 9 | Sv48 | ページベースの48ビット仮想アドレッシング。 |
| 10 | Sv57 | ページベースの57ビット仮想アドレッシング。 |
| 11-13 | — | 標準的な使用のために予約されている。 |
| 14-15 | — | カスタム仕様。 |
| DC.tc.SXL=1 | ||
| Value | Name | Description |
| 0 | Bare | 変換も保護もない。 |
| 1-7 | — | 標準的な使用のために予約されている。 |
| 8 | Sv32 | ページベースの32ビット仮想アドレッシング。 |
| 9-15 | — | 標準的な使用のために予約されている。 |
DC.tc.PDTV が1の場合、 DC.fscフィールドはプロセス・ディレクトリ・テーブル・ポインタ (pdtp)を保持する。 デバイスが process_idによって選択された複数のプロセス・コンテキストをサポートしている場合、PDTは、仮想アドレス変換と保護のために、第1段階のページ・テーブルと関連するPSCID を決定するために使用される。
pdtp フィールドはルート PDT の PPN を保持し、 MODE フィールドはPDT のレベル数を決定する。

第2段階のアドレス変換が Bare でない場合、 pdtp.PPNフィールドはゲスト PPN を保持する。 その後、 iohgatpによって制御されるゲスト物理アドレス変換プロセスによって、ルート PDTの GPA がスーパーバイザ物理アドレスに変換される。
第2ステージのページテーブルを使用して PDT のアドレスを変換すると、PDTをゲストOSによって割り当てられたメモリに保持できるようになり、ゲストOSがPDTを直接編集して、第1ステージのページテーブルによって識別される仮想アドレス空間をprocess_id に関連付けることができる。
| 値 | 名前 | 説明 |
|---|---|---|
| 0 | Bare | 第一段階のアドレス変換もプロテクションもない。 |
| 1 | PD8 | 8ビットのプロセスIDが有効。 process_id のビット 19:8 は0でなければならない。 |
| 2 | PD17 | 17ビットのプロセスIDが有効。ディレクトリには2つのレベルがある。ルートPDTページには512エントリ、リーフ・レベルには256エントリがある。 process_id のビット19:17は0でなければならない。 |
| 3 | PD20 | 20ビットのプロセスIDが有効。ディレクトリには3つのレベルがある。ルートPDTには8エントリがあり、次の非リーフレベルには512エントリがある。リーフレベルには256のエントリーがある。 |
| 4-13 | — | 標準的な使用のために予約されている。 |
| 14-15 | — | カスタム仕様。 |