FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages

RISC-Vのハイパーバイザ仕様について調べる(2. ハイパーバイザのCSRとアドレス変換について)

RISC-Vのハイパーバイザの仕様について調査中。前回の続き。

参考にしているのは、 RISC-V ISA Manualの最新版(正式リリース版ではなくDraft版。こちらにはハイパーバイザの仕様案が含まれている)。

github.com

また、RISC-VのSBI(Supervisor Binary Interface)については以下を参考にする。こちらも時間を見つけて読み込んでいく。

github.com

以下の文章はRISC-V ISA Manual Draft をベースにしていますが、直訳ではありません。 また、ブログ著者の知識不足のため多分に間違いが入っている可能性があります。 間違いを見つけましたらご指摘いただけますとうれしく思います。

まだ途中だけれど、追記もしくは別のエントリ作成予定。

5.2.3 Hypervisor Guest Address Translation and Protection Register(hgatp)

hgatpはsatp命令と同様に、ゲスト物理アドレスのアドレス変換の起点となるレジスタである。このレジスタの値をベースに、ゲスト物理アドレスの変換が行われる。

f:id:msyksphinz:20181029225811p:plain

ForegroundとBackgroundで切り替えられるCSRについて

以下のレジスタについては、ForegroundとBackgroundでレジスタの値が切り替えられる。

Foreground Background
Supervisor Status Register sstatus bsstatus
Supervisor Interrupt Registers sip / sie bsip / bsie
Supervisor Trap Vector Base Address Register stvec bstvec
Supervisor Scratch Register sscratch bsscratch
Supervisor Exception Program Counter sepc bsepc
Supervisor Cause Register scause bscause
Supervisor Trap Value Register stval bstval
Supervisor Address Translation and Protection Register satp bsatp

5.3 ハイパーバイザの命令について

HS-modeでは、以下の2つの命令が追加される。

  • HFENCE.GVMA
    • SFENCE.VMA命令とほぼ同一の命令だが、hgatpレジスタにより制御されるゲスト物理メモリ管理データ構造に対して適用されることが異なる。
    • この命令が実行されると、HFENCE.GVMAよりも前のすべての暗黙的あゲスト物理メモリデータ構造への参照は、HFENCE.GVMAよりも後続の命令よりも前に実行されることが保証される。
  • HFENCE.BVMA
    • SFENCE.VMA命令とほぼ同一の命令だが、bsatpレジスタにより制御されるVSレベルメモリ管理データ構造に対して適用されることが異なる。
    • この命令が例外なく実行されると、一時的にVS-modeに入ってSFENCE.VMA命令が実行されたものと同様の効果がある。

hgatp.VMIDが異なるHFENCE.BVMAが実行されても、メモリアクセスの順番は守られる必要が無い。 オペランドrs1が0でないならば、ゲスト仮想アドレスが設定される。 オペランドrs2が0でないならば、ゲストのアドレス空間識別子(ASID)が設定される。

5.5 2レベルアドレス変換

ハイパーバイザモード(V=1)の時は、メモリアドレスは2レベルのアドレス変換が行われる。

  1. オリジナル仮想アドレス→ゲスト物理アドレス (VSレベルのsatpレジスタによって制御される)
  2. ゲスト物理アドレス → スーパバイザ物理アドレス (hgatpレジスタによって制御される)
f:id:msyksphinz:20181029232502p:plain
  1. のオリジナル仮想アドレス→ゲスト物理アドレスは通常のSv32, Sv39, Sv48を使って変換が行われるが、2.は別の変換アルゴリズム(Sv32x4, Sv39x4, Sv48x4)を使って変換が行われる。 これはSv32, Sv39, Sv48に対して入力アドレスが2ビットほど拡張されており、ページのサイズが4kBから16kBに拡張されている(ただしこの理由は良く分からない)。

このページ変換アルゴリズムは、SV32, Sv39, Sv48とほぼ同様である(と思う)。

f:id:msyksphinz:20181030004017p:plain