RISC-V IOMMUの構成について、概略をざっくり理解するためのメモ。
何回か読もうとして挫折してきたので、もう一度ちゃんと読んでみようと思う。
プロセス・ディレクトリ・テーブル (PDT)
PDTは、process_id のプロセスディレクトリインデックス (PDI)ビットを使用してインデックス付けされた1, 2, または3レベルの基数ツリーである。
以下の図にPDT基数ツリーを示す。ルート・プロセス・ディレクトリのページ番号は、デバイス・コンテキストのプロセス・ディレクトリ・テーブル・ポインタ(pdtp)フィールドを使用して特定される。
各非リーフ(NL)エントリは、次のレベルのプロセス・ディレクトリ・テーブルのPPNを提供する。
リーフのprocess-directory-tableエントリはプロセスコンテキスト(PC)を保持する。

ノンリーフPDTエントリ
有効な(V==1)非リーフPDTエントリは、次レベルPDTのPPNを保持する。

リーフPDTエントリ
リーフPDTページは PDI[0]でインデックスされ、16バイトのプロセスコンテキスト(PC)を保持する。

PC は2つの64ビットダブルワードとして解釈される。メモリ内の各ダブルワードのバイト順序は、リトルエンディアンまたはビッグエンディアンのいずれかであり、DC.tc.SBEによって決定されるエンディアンである。 IOMMUは PCフィールドを任意の順序で読み取ることができる。
プロセス・コンテキスト・フィールド
変換属性 (ta)

V ビットが1の場合、 PCは有効である。Vビットが0の場合、PCの他のビットはすべてdon’t careであり、ソフトウェアが自由に使用できる。
Enable-Supervisory-access(ENS)が1の場合、スーパーバイザ権限を要求するトランザクションは、このprocess_id で許可される。
ENS が1のとき、SUM (permit Supervisor User Memory access) ビットは、スーパーバイザ特権トランザクションが仮想メモリにアクセスする特権を変更する。SUM が 0 の場合、PTE の U ビットが 1に設定されたページへのスーパーバイザ特権トランザクションは許可されない。
ENS が 1の場合、スーパーバイザ特権トランザクションは、次のようにマップされたページに実行意図を持って読み込む。PTE の U ビットが1にセットされている場合は、 SUM の値に関係なく禁止される。
ソフトウェアが割り当てるプロセスソフトコンテキストID(PSCID)は、第1ステージアドレス変換がBareでない場合、第1ステージページテーブルによって識別されるプロセスのアドレス空間IDとして使用される。
ファースト・ステージ・コンテキスト(fsc)

PC.fscフィールドは、第一段階のアドレス変換とプロテクションのコントロールを提供する。
PC.fsc.MODEは、第1段階のページド仮想メモリ方式を決定するために使用され、そのエンコーディングは表3に定義されている通りである。
DC.tc.SXLフィールドは、サポートされるページド仮想メモリ方式を制御する。
PC.fsc.MODE が Bare でない場合、 PC.fsc.PPNフィールドは第1段ページテーブルのルートページのPPNを保持する。
第2段アドレス変換が Bare でない場合、 PC.fsc.PPNフィールドは第1段ページテーブルのルートのゲストPPNを保持する。
第1ステージのページテーブルエントリのアドレスは、 DC.iohgatpによって制御されるゲスト物理アドレス変換プロセスによって、スーパーバイザ物理アドレスに変換される。
このため、ゲストOSは、デバイスによるメモリのサブセットへのアクセスを制限し、デバイスのアクセスに対するパーミッションを指定するために、第1ステージページテーブルを直接編集することができる。
PC.ta.PSCID はアドレス空間を識別する。2つのPCが参照するページテーブルが同一でないときに、同一の PSCID
が2つの PCに設定された場合、IOMMUが最初のページテーブルと2番目のページテーブルのどちらのPTEを使用するかは予測できない。これらは期待される唯一の動作である。
プロセス・コンテキスト構成のチェック
PC.ta.V=1 の PCは、以下の条件のいずれかが真である場合、misconfiguredとみなされる。
もしmisconfiguredなら、停止して "PDT entry misconfigured"(cause=267)と報告する。
- 将来の標準使用のために予約されているビットやエンコーディングが設定されている場合
PC.fsc.MODEエンコーディングが、表3によって決定される有効なものではないDC.tc.SXLが0であり、PC.fsc.MODEがサポートされているモードではないcapabilities.Sv39が0でPC.fsc.MODEがSv39の場合capabilities.Sv48が0でPC.fsc.MODEがSv48の場合capabilities.Sv57が0でPC.fsc.MODEがSv57の場合
DC.tc.SXLが1で、PC.fsc.MODEがサポートされているモードではないcapabilities.Sv32が0でPC.fsc.MODEがSv32の場合
一部の PCフィールドは、スーパバイザ物理アドレスまたはゲスト物理アドレスを保持する。例えば、スーパバイザ物理アドレスが、PC の位置を特定するときにcapabilities.PASなどで決定されるサポートされるアドレスよりも広くない場合などである。
このような実装では、"PDT entry misconfigured" (cause = 267) フォルトが発生する可能性がある。
他の実装では、これらのフィールドによって参照されるデータ構造にアクセスする必要がある場合にのみ、このようなアドレスが無効であることを検出する。そのような実装では、アクセスを行う過程でアクセス違反フォールトを検出することがある。