FPGA開発日記

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

RISC-V ハイパーバイザー拡張の勉強 (hcounteren, htimedelta, htimedeltah, htval, htinst)

5.2.5 ハイパーバイザーカウンタ許可レジスタ (hcounteren)

カウンタ許可レジスタhcounterenはゲスト仮想マシン向けのハードウェアパフォーマンスモニタリングカウンタの利用可能状態を制御するための32ビットレジスタである。

f:id:msyksphinz:20210212224203p:plain
図5.13:ハイパーバイザーカウンタ許可レジスタ(`hcounteren`)

hcounterenレジスタのCY、TM、IR、HPMnビットがクリアされている場合、V=1時にcycle, time, instret, hpmcounternレジスタを読もうとすると、mcounterenの当該ビットが1であったとしても仮想命令例外が発生する。これらのビットがセットされている場合、V=1の時は、他に任意の理由でアクセスが禁止されていたとしても、当該レジスタへのアクセスは許可される。VU-Modeでは、hcounterenscounterenのビットが設定されていたとしても、これらのカウンタの値は読み取ることができない。

hcounterenは常に実装されていなければならない。しかし、任意のビットの値はゼロに固定することができ、これはV=1のときに当該カウンタの値を読もうとすると例外が発生することを意味する。したがって、これらのビットはWARLフィールドであると言える。

ハイパーバイザータイムデルタレジスタ (htimedelta, htimedeltah)

htimedeltaCSRtimeレジスタの値とVS-ModeおよびVU-Modeでの返される値の差分を保持している。つまり、timeCSRをVS-ModeおよびVU-Modeで読むと、htimedeltatimeの実際の値を加算した結果が返される。

htimedeltatimeの加算におけるオーバーフローは無視されるため、htimedeltaの値が大きくなると、タイムオフセットの負の値して取り扱われる。

f:id:msyksphinz:20210212224227p:plain
図5.14:ハイパーバイザータイムデルタレジスタ, HSXLEN=64

HSXLEN=32では、htimedeltaはデルタ値の下位32ビットを保持している。htimedeltahはデルタ値の上位32ビットを保持している。

f:id:msyksphinz:20210212224244p:plain
図5.15:HSXLEN=64時のハイパーバイザータイムデルタレジスタ

5.2.7 ハイパーバイザートラップ値レジスタ(htval)

htvalレジスタはHSXLENビットの読み書き可能なレジスタで、図5.16に示すフォーマットで構成されている。トラップによりHS-Modeに入ると、stvalと一緒にhtvalに例外要因固有の情報が書き込まれ、ソフトウェアがトラップを処理するために使用される。

f:id:msyksphinz:20210212224257p:plain
図5.16:ハイパーバイザートラップ値レジスタ(htval)

ゲストページフォルト例外によりHS-Modeに移行した場合、htvalにはゼロもしくは例外の発生したゲスト物理アドレスを2ビット右にシフトした値が書き込まれる。他の例外では、htvalの値はゼロに設定されるが、将来の仕様アップデートや他の拡張によってhtvalの挙動が異なる可能性がある。

ゲストページフォルト例外は第1ステージ(VSステージ)のアドレス変換による暗黙的なメモリアクセスにより発生する可能性があるが、この場合にはhtvalに書き込まれるゲスト物理アドレスは、例外の発生した暗黙的なメモリアクセスのアドレスとなる。例えば、VSレベルのページテーブルエントリのメモリ読み込みに失敗した場合などである。(VSステージでの変換が完了しなかった場合、オリジナルの仮想アドレスに相当するゲスト物理アドレスは未知である。)このような状態における曖昧さを削減するための更なる情報としてhtinstCSRが使用される。

そうでない場合、ミスアラインロード・ミスアラインストアによりゲストページフォルトが発生する場合には、htvalにはstvalに格納されている仮想アドレスに対応する変換に失敗した物理アドレスが返される。可変長の命令を持つシステムでの命令ゲストページのフォルトの場合、ゼロではないhtvalは、stvalの仮想アドレスで示される命令のフォルト部分に対応する。

htvalに書き込まれたゲスト物理アドレスは、現在のXLENよりも広いアドレスに対応するために2ビット右にシフトされる。RV32 では、ハイパーバイザ拡張により、34ビットのゲスト物理アドレスが許可され、htvalはそのアドレスの33:2ビットを報告する。このゲスト物理アドレスの2ビットシフトエンコーディングは、PMPアドレスレジスタ (Section 3.6) とページテーブルエントリ (Section 4.3, 4.4, 4.5) の物理アドレスエンコーディングと一致している。

例外の発生したゲストの物理アドレスの最下位2ビットが必要な場合、これらのビットは通常、stvalの故障している仮想アドレスの最下位2ビットと同じである。VSステージのアドレス変換のための暗黙のメモリアクセスによる例外の場合、最下位2ビットは代わりにゼロになる。これらのケースは、レジスタhtinstで提供される値を用いて識別することができる。

htvalWARLレジスタであり、ゼロを保持していなければならず、ゲスト物理アドレスの2ビットシフトされたサブセットのみを保持することができる。

(プラットフォーム標準などの)他の理由がない限り、ソフトウェアによりhtvalを書き込んだ場合にはその値がhtvalからリードバックできなければならない。

5.2.8 ハイパーバイザ―トラップ命令レジスタ (htinst)

htinstレジスタはHSXLENビットの読み書き可能なレジスタであり、図5.17に示されるビットフォーマットで構成されている。トラップが発生しHS-Modeに移行した場合、htinstはゼロでない場合例外の発生した命令の情報を保持しており、ソフトウェアによりトラップを処理するのを助ける役割を持っている。htinstに書き込まれる値に抜いてはSection 5.6.3で説明している。

f:id:msyksphinz:20210212224334p:plain
図5.17:ハイパーバイザートラップ命令レジスタ

htinstWARLレジスタであり、実装がトラップ発生時に自動的に書き込んだ値を保持しておかなければならない。