FPGA開発日記

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

RISC-V IOMMU の構成についてマニュアルを読んでまとめる (7. ファースト・ステージ・コンテキスト (fsc))

前回:msyksphinz.hatenablog.com

github.com

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 フィールドはルート PDTPPN を保持し、 MODE フィールドはPDT のレベル数を決定する。

第2段階のアドレス変換が Bare でない場合、 pdtp.PPNフィールドはゲスト PPN を保持する。 その後、 iohgatpによって制御されるゲスト物理アドレス変換プロセスによって、ルート PDTGPA がスーパーバイザ物理アドレスに変換される。 第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  —  カスタム仕様。