FPGA開発日記

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

RISC-V IOMMU の構成についてマニュアルを読んでまとめる (9. プロセス・コンテキスト)

前回:msyksphinz.hatenablog.com

github.com

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

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


プロセス・ディレクトリ・テーブル (PDT)

PDTは、process_id のプロセスディレクトリインデックス (PDI)ビットを使用してインデックス付けされた1, 2, または3レベルの基数ツリーである。

以下の図にPDT基数ツリーを示す。ルート・プロセス・ディレクトリのページ番号は、デバイス・コンテキストのプロセス・ディレクトリ・テーブル・ポインタ(pdtp)フィールドを使用して特定される。 各非リーフ(NL)エントリは、次のレベルのプロセス・ディレクトリ・テーブルのPPNを提供する。 リーフのprocess-directory-tableエントリはプロセスコンテキスト(PC)を保持する。

レベル、2レベル、1レベルのプロセス・ディレクトリ

ノンリーフPDTエントリ

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

Non-leaf process-directory-table entry

リーフPDTエントリ

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

Process-context

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

プロセス・コンテキスト・フィールド

変換属性 (ta)

変化属性(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 の場合、PTEU ビットが 1に設定されたページへのスーパーバイザ特権トランザクションは許可されない。

ENS が 1の場合、スーパーバイザ特権トランザクションは、次のようにマップされたページに実行意図を持って読み込む。PTEU ビットが1にセットされている場合は、 SUM の値に関係なく禁止される。

ソフトウェアが割り当てるプロセスソフトコンテキストID(PSCID)は、第1ステージアドレス変換がBareでない場合、第1ステージページテーブルによって識別されるプロセスのアドレス空間IDとして使用される。

ファースト・ステージ・コンテキスト(fsc)

プロセス第一段階のコンテキスト

PC.fscフィールドは、第一段階のアドレス変換とプロテクションのコントロールを提供する。

PC.fsc.MODEは、第1段階のページド仮想メモリ方式を決定するために使用され、そのエンコーディングは表3に定義されている通りである。 DC.tc.SXLフィールドは、サポートされるページド仮想メモリ方式を制御する。 PC.fsc.MODEBare でない場合、 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=1PCは、以下の条件のいずれかが真である場合、misconfiguredとみなされる。 もしmisconfiguredなら、停止して "PDT entry misconfigured"(cause=267)と報告する。

  1. 将来の標準使用のために予約されているビットやエンコーディングが設定されている場合
  2. PC.fsc.MODE エンコーディングが、表3によって決定される有効なものではない
  3. DC.tc.SXL が0であり、 PC.fsc.MODE がサポートされているモードではない
    1. capabilities.Sv39 が0で PC.fsc.MODESv39 の場合
    2. capabilities.Sv48 が0で PC.fsc.MODESv48 の場合
    3. capabilities.Sv57 が0で PC.fsc.MODESv57 の場合
  4. DC.tc.SXL が1で、 PC.fsc.MODE がサポートされているモードではない
    1. capabilities.Sv32 が0で PC.fsc.MODESv32 の場合

一部の PCフィールドは、スーパバイザ物理アドレスまたはゲスト物理アドレスを保持する。例えば、スーパバイザ物理アドレスが、PC の位置を特定するときにcapabilities.PASなどで決定されるサポートされるアドレスよりも広くない場合などである。 このような実装では、"PDT entry misconfigured" (cause = 267) フォルトが発生する可能性がある。

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