RISC-Vのハイパーバイザの仕様について調査中。前回の続き。
参考にしているのは、 RISC-V ISA Manualの最新版(正式リリース版ではなくDraft版。こちらにはハイパーバイザの仕様案が含まれている)。
また、RISC-VのSBI(Supervisor Binary Interface)については以下を参考にする。こちらも時間を見つけて読み込んでいく。
以下の文章はRISC-V ISA Manual Draft をベースにしていますが、直訳ではありません。 また、ブログ著者の知識不足のため多分に間違いが入っている可能性があります。 間違いを見つけましたらご指摘いただけますとうれしく思います。
まだ途中だけれど、追記もしくは別のエントリ作成予定。
- 5.2.3 Hypervisor Guest Address Translation and Protection Register(hgatp)
- ForegroundとBackgroundで切り替えられるCSRについて
- 5.3 ハイパーバイザの命令について
- 5.5 2レベルアドレス変換
5.2.3 Hypervisor Guest Address Translation and Protection Register(hgatp)
hgatpはsatp命令と同様に、ゲスト物理アドレスのアドレス変換の起点となるレジスタである。このレジスタの値をベースに、ゲスト物理アドレスの変換が行われる。
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
- HFENCE.BVMA
hgatp
.VMIDが異なるHFENCE.BVMAが実行されても、メモリアクセスの順番は守られる必要が無い。
オペランドrs1が0でないならば、ゲスト仮想アドレスが設定される。
オペランドrs2が0でないならば、ゲストのアドレス空間識別子(ASID)が設定される。
5.5 2レベルアドレス変換
ハイパーバイザモード(V=1)の時は、メモリアドレスは2レベルのアドレス変換が行われる。
- のオリジナル仮想アドレス→ゲスト物理アドレスは通常のSv32, Sv39, Sv48を使って変換が行われるが、2.は別の変換アルゴリズム(Sv32x4, Sv39x4, Sv48x4)を使って変換が行われる。 これはSv32, Sv39, Sv48に対して入力アドレスが2ビットほど拡張されており、ページのサイズが4kBから16kBに拡張されている(ただしこの理由は良く分からない)。
このページ変換アルゴリズムは、SV32, Sv39, Sv48とほぼ同様である(と思う)。