5.3.2 ハイパーバイザーメモリ管理フェンス命令
ハイパーバイザーメモリ管理フェンス命令、HFENCE.VVMA
とHFENCE.GVMA
はSFENCE.VMA
(4.2.1節)と同様の動作をするが、HFENCE.VVMA
はvsatp
CSRによって制御されるVSレベルのメモリ管理データ構造に対して適用されるところが、HFENCE.GVMA
はhgatp
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.TVM
とhstatus.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.VVMA
とHFENCE.GVMA
はV=1の時に実行すると仮想命令例外を発生するが、U-Modeで実行すると不正命令例外を発生する。HFENCE.GVMA
をmstatus.TVM=1
のHS-Modeで実行すると同様に不正命令例外が発生する。