FPGA開発日記

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

RISC-V ハイパーバイザー拡張の勉強 (2. hstatusレジスタ)

RISC-Vのハイパーバイザーの勉強、次はCSRレジスタ。最も中心となるhstatusレジスタから。

5.2.1 Hypervisor Status Register (hstatus)

hstatusレジスタはHSXLENビットの読み書き可能なレジスタである。HSXLEN=32の場合のフォーマットを図5.1に、HSXLEN=64の場合のフォーマットを図5.2に示している。hstatusレジスタmstatusと同様の機能を提供するレジスタであり、VS-Modeのゲストの例外動作の制御及び記録を行っている。

f:id:msyksphinz:20210209225438p:plain
RV32時のハイパーバイザーステータスレジスタ(hstatus)
f:id:msyksphinz:20210209225502p:plain
RV64時のハイパーバイザーステータスレジスタ(hstatus)

VSXLフィールドはVS-Mode時の有効なXLEN値(この値がVSXLENとなる)を制御している。VSXLEN値はHS-Mode時のXLEN値(HSXLEN)と異なっていても良い。HSXLEN=32の時、VSXLフィールドは存在せず、VSXLEN=32となる。HSXLEN=64のとき、VSXLフィールドはWARLフィールドとなり、ページ16の表3.1のmisaレジスタのMXL値と同様にエンコードされる。特殊なケースとして、VSXLEN=HSXLENであることが常に保証されるような実装の場合には、VSXLフィールドはRead-Onlyとして実装されることが許されている。

HSXLENの値が32からより大きな値に変更され、かつVSXL値が複数の値を許可する場合、VSXLの値は新しいHSXLEN値よりも小さく、かつ該当するサポート可能な最大値へと変更される。

hstatusのフィールドVTSR, VTW, VTVMはmstatusTSR, TW, TVMと同様の役割を持つが、VS-Mode時にのみ有効であり、不正命令例外の代わりに仮想命令例外を生成する。VTSR=1の場合、VS-ModeにおいてSRET命令を実行しようとすると仮想命令例外が発生する。VTW=1の時(かつmstatus.TW=0の時)、VS-ModeにおいてWFI命令を実行し、かつ実装依存の特定のタイムリミット内に命令が完了しなかった場合に仮想命令例外が発生する。VTVM=1の場合、VS-ModeにおいてSFENCE.VMA命令を実行するか、satpレジスタにアクセスしようとすると仮想命令例外が発生する。

VGEIN(Virtual Guest External Interrupt Number)フィールドは、VSレベルの外部割込みにおいてゲストの外部割込みソースを選択する。VGEIENはWLRLのフィールドで、ゼロからゲストを外部割込み番号(この値をGEILENとする)までのどれかの値を設定する必要がある。VGEIN=0の場合、VSレベルの外部ら割り込みには、どのゲスト外部割込みソースも選択されていない。GEILENが0の場合、VGEINはゼロに固定されている。ゲストの外部割込みについては5.2.4節で説明されており、VGEINのより詳細については5.2.3節で説明されている。

HUフィールド(Hypervisor User mode)は仮想マシンのロード・ストア命令を制御する。HLV,HLVX, HSVフィールドはU-Modeにおいて使用される。HU=1の場合、これらの命令がU-ModeではHS-Modeと同様に実行することができる。HU=0の場合、U-Modeでこれらの命令を実行しようとすると不正命令例外が発生する。

HUビットを使用すると、ハイパーバイザーの一部をUモードで実行して、仮想マシンのメモリへのアクセスを維持しながら、ソフトウェアのバグに対する保護を強化できる。

SPVビット(Supervisor Previous Virtualization Mode)HS-Modeでトラップが発生した場合に実装によって書き込まれる。sttatusのSPPビットがトラップ時の特権モードの値を書き込むように、hstatusSPVビットはトラップ時の仮想モードVの値を書き込む。V=0にSRETが実行されると、SPVにはVが設定される。

V=1時にトラップが発生しHS-Modeに遷移すると、sstatus.SPPと同様にトラップ時の特権モードがSPVP(Supervisor Previous Virtual Privilege)ビットに設定される。しかしトラップ前にV=0の場合には、SPVPはトラップ発生時には変更されない。SPVPは仮想マシンによって実行されるロードストア命令、HLV, HLVX, HSVによる明示的なメモリアクセスの有効な特権を管理している。

SPVPがない場合、HLV、HLVX、およびHSVの命令が代わりにsstatus.SPPを参照してメモリアクセスの有効な特権を探した場合、HU = 1の場合でも、UモードはVSレベルで仮想マシンメモリにアクセスできなかった。 SRETを使用してUモードに入ると、常にSPP = 0のままになる。 SPPとは異なり、フィールドSPVPは、HSモードとUモードの間を行ったり来たりする遷移の影響を受けない。

GVA(Guest Virtual Address)フィールドはトラップが発生しHS-Modeに入った場合に実装により書き込まれる。仮想アドレスをstvalに書き込むようなトラップ(アクセス例外、ページフォルト、ゲストページフォルト)が発生した場合、GVAは1が設定される。HS-Modeに入るそれ以外のトラップでは、GVAは0に設定される。

メモリアクセス例外の場合、HLV, HLVX, またはHSV命令の明示的なメモリアクセスによって例外が発生する場合を除いて、GVAはSPVフィールドと冗長になる(これらの2ビットは同じ値が設定される)。これ以外の場合には、SPV = 0かつGVA = 1となる。

VSBEビットはWARLフィールドであ、VS-Modeによって実行されるメモリアクセスのエンディアンを制御する。VSBE=0の場合、VS-Modeでの明示的なロードストアメモリアクセスはリトルエンディアンであり、VSBE=1の場合にはビッグエンディアンとなる。VSBEはVSレベルのページテーブルのようなメモリ管理データ構造の暗黙的なメモリアクセスについても制御を行う。VSBEをRead-Onlyに実装することで、常にHS-Modeと同じエンディアンを求めることも可能である。