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