5.2.5 ハイパーバイザーカウンタ許可レジスタ (hcounteren
)
カウンタ許可レジスタhcounteren
はゲスト仮想マシン向けのハードウェアパフォーマンスモニタリングカウンタの利用可能状態を制御するための32ビットレジスタである。
hcounteren
レジスタのCY、TM、IR、HPMnビットがクリアされている場合、V=1時にcycle
, time
, instret
, hpmcounter
nレジスタを読もうとすると、mcounteren
の当該ビットが1であったとしても仮想命令例外が発生する。これらのビットがセットされている場合、V=1の時は、他に任意の理由でアクセスが禁止されていたとしても、当該レジスタへのアクセスは許可される。VU-Modeでは、hcounteren
とscounteren
のビットが設定されていたとしても、これらのカウンタの値は読み取ることができない。
hcounteren
は常に実装されていなければならない。しかし、任意のビットの値はゼロに固定することができ、これはV=1のときに当該カウンタの値を読もうとすると例外が発生することを意味する。したがって、これらのビットはWARLフィールドであると言える。
ハイパーバイザータイムデルタレジスタ (htimedelta
, htimedeltah
)
htimedelta
CSRはtime
レジスタの値とVS-ModeおよびVU-Modeでの返される値の差分を保持している。つまり、time
CSRをVS-ModeおよびVU-Modeで読むと、htimedelta
とtime
の実際の値を加算した結果が返される。
htimedelta
とtime
の加算におけるオーバーフローは無視されるため、htimedelta
の値が大きくなると、タイムオフセットの負の値して取り扱われる。
HSXLEN=32では、htimedelta
はデルタ値の下位32ビットを保持している。htimedeltah
はデルタ値の上位32ビットを保持している。
5.2.7 ハイパーバイザートラップ値レジスタ(htval
)
htval
レジスタはHSXLENビットの読み書き可能なレジスタで、図5.16に示すフォーマットで構成されている。トラップによりHS-Modeに入ると、stval
と一緒にhtval
に例外要因固有の情報が書き込まれ、ソフトウェアがトラップを処理するために使用される。
ゲストページフォルト例外によりHS-Modeに移行した場合、htval
にはゼロもしくは例外の発生したゲスト物理アドレスを2ビット右にシフトした値が書き込まれる。他の例外では、htval
の値はゼロに設定されるが、将来の仕様アップデートや他の拡張によってhtval
の挙動が異なる可能性がある。
ゲストページフォルト例外は第1ステージ(VSステージ)のアドレス変換による暗黙的なメモリアクセスにより発生する可能性があるが、この場合にはhtval
に書き込まれるゲスト物理アドレスは、例外の発生した暗黙的なメモリアクセスのアドレスとなる。例えば、VSレベルのページテーブルエントリのメモリ読み込みに失敗した場合などである。(VSステージでの変換が完了しなかった場合、オリジナルの仮想アドレスに相当するゲスト物理アドレスは未知である。)このような状態における曖昧さを削減するための更なる情報としてhtinst
CSRが使用される。
そうでない場合、ミスアラインロード・ミスアラインストアによりゲストページフォルトが発生する場合には、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
で提供される値を用いて識別することができる。
htval
はWARLレジスタであり、ゼロを保持していなければならず、ゲスト物理アドレスの2ビットシフトされたサブセットのみを保持することができる。
(プラットフォーム標準などの)他の理由がない限り、ソフトウェアにより
htval
を書き込んだ場合にはその値がhtval
からリードバックできなければならない。
5.2.8 ハイパーバイザ―トラップ命令レジスタ (htinst
)
htinst
レジスタはHSXLENビットの読み書き可能なレジスタであり、図5.17に示されるビットフォーマットで構成されている。トラップが発生しHS-Modeに移行した場合、htinst
はゼロでない場合例外の発生した命令の情報を保持しており、ソフトウェアによりトラップを処理するのを助ける役割を持っている。htinst
に書き込まれる値に抜いてはSection 5.6.3で説明している。
htinst
はWARLレジスタであり、実装がトラップ発生時に自動的に書き込んだ値を保持しておかなければならない。