FPGA開発日記

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

RISC-V ハイパーバイザー拡張の勉強 (5.3.2 ハイパーバイザーメモリ管理フェンス命令)

5.3.2 ハイパーバイザーメモリ管理フェンス命令

f:id:msyksphinz:20210216090835p:plain

ハイパーバイザーメモリ管理フェンス命令、HFENCE.VVMAHFENCE.GVMASFENCE.VMA(4.2.1節)と同様の動作をするが、HFENCE.VVMAvsatp CSRによって制御されるVSレベルのメモリ管理データ構造に対して適用されるところが、HFENCE.GVMAhgatp CSRによって制御されるVSレベルのメモリ管理データ構造に対して適用されるところが異なる。SFENCE.VMA命令は現在のsatp(V=0の場合はHSレベルのsatpで、V=1の場合はvsatp)によって管理されるデータ構造に対し適用される。

HFENCE.VVMAはM-ModeもしくはHS-Modeに対して有効である。その効果は、一時的にVS-Modeに入りSFENCE.VMA命令を実行するのと同一である。HENCE.VVMAはHARTによって見ることのできるすべての当該命令実行前のすべてのメモリストアが、VSレベルのメモリ管理データ構造のそのHARTによる後続のすべての暗黙的なリード操作の前に順序付けられることが保証される:

  • HFENCE.VVMAの後にある命令
  • HFENCE.VVMA実行時とhgatp.VMIDの設定が同じ場合に実行された命令

HFENCE.VVMAが実行されたときにhgatp.VMIDが異なる暗黙的な読み込みについては順序付けられる必要はない。オペランドrs1 != x0である場合、単一のゲスト仮想アドレスが指定され、オペランドrs2!=x0である場合、単一のゲストアドレス空間識別子(ASID)が指定される。

HFENCE.VVMA命令はHFENCE.VVMAが実行されたときのhgatp.VMIDによって識別される単一の仮想マシンにのみ適用される。

rs2!=x0である場合、rs2が保持しているビットの内XLEN-1:ASIDMAXは将来のための予約であり、ソフトウェアによりゼロにされているべきであり、現在の実装では無視される。さらに、ASIDLEN < ASIDMAXである場合はrs2に保持されているビットASIDMAX-1:ASIDLENの値は実装により無視される。

HFENCE.VVMAのより単純な実装では、rs1のゲスト仮想アドレスとrs2のゲストASID値、および --hgatp.VMIDを無視して、すべての仮想マシンのVSレベルのメモリ管理のためのグローバルフェンスを常に実行したり、すべてのメモリ管理データ構造のためのグローバルフェンスを実行したりすることができる。

mstatus.TVMhstatus.VTVMの値のどちらも、HFENCE.VVMAに例外を発生されることはない。

HFENCE.GVMAはHS-Modeにおいてmstatus.TVM=0の場合か、M-Mode(mstatus.TVMの値には関係ない)の場合にのみ有効である。HFENCE.GVMA命令の実行は現在実行しているHARTにより見えているそれまでのストア操作は、HFENCE.GVMAの後に続くゲスト物理メモリ管理データ構造を操作したHARTにより実行される後続の読み込み操作に対して順序付けられることが保証される。rs1!=x0ならば2ビット右シフトされた単一の物理アドレスであることを示し、rs2!=x0ならb、単一の仮想マシン識別子(VMID)が指定される。

トラップ発生時にhtvalに書き込まれるゲスト物理アドレスのように、rs1に指定されるゲスト物理アドレスは2ビット右にシフトされ、XLENよりも大きな値を格納する際により多くの値を格納できるようにしている。

rs2 != x0である場合、rs2が保持している値のうちXLEN-1:VMIDMAXビットの値は将来のための予約であり、ソフトウェアによりゼロが書き込まれるべきであり実装により無視される。さらに、VMIDLEN < VMIDMAXであるばあいは、rs2のビットの内VMIDMAX-1:VMIDLENの値は実装により無視される。

HFENCE.GVMAのよりシンプルな実装では、rs1 のゲスト物理アドレスと rs2 の VMID 値を無視して、常にすべての仮想マシンのゲスト物理メモリ管理のためのグローバルフェンス、またはすべてのメモリ管理データ構造のためのグローバルフェンスを実行することができる。

HFENCE.VVMAHFENCE.GVMAはV=1の時に実行すると仮想命令例外を発生するが、U-Modeで実行すると不正命令例外を発生する。HFENCE.GVMAmstatus.TVM=1のHS-Modeで実行すると同様に不正命令例外が発生する。