FPGA開発日記

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

RISC-V ハイパーバイザー拡張の勉強 (5.6 例外その2)

Compressed命令ではない標準的なロード命令で、LB,LBU,LH, LHU, LW, LWU, LD, FLW, FLD, FLQの内一つに例外が発生した場合の変換された命令のフォーマットを図5.42に示す。

図5.42: Compressedではないロード命令 (LB, LBU, LH, LHU, LW, LWU, LD, FLW, FLD, FLQ命令)の変換後の命令フォーマット。funct3, rd, opcodeフィールドは例外の発生したロード命令と同一である。

Compressedではない標準的なストア命令で、SB, SH, SW, SD, FSW, FSD, FSQのうち一つに例が外が発生した場合の変換された命令フォーマットを図5.43に示す。

図5.43: Compressedではないストア命令 (SB, SH, SW, SD, FSW, FSD, FSQ)の変換後命令フォーマット。rs2, funct3, opcode は例外の発生したストア命令と同一である。

標準的なアトミック命令(Load Reserved, Store Conditional, AMO命令)の、変換後の命令フォーマットを図5.44に示す。

図5.44: アトミック命令(Load-Reserved, Store-Conditional, AMO命令)の変換後のフォーマット。19:15ビットを除いて、すべてのフィールドは例外の発生した命令と同一である。

標準的な仮想マシンロードストア命令(HLV, HLVX, HSV)では、変換後の命令フォーマットを図5.45に示す。

図5.45: 仮想マシンロード命令(HLV, HLVX, HSV)の変換後のフォーマット。19:15ビットを除いて、すべてのフィールドは例外の発生した命令と同一である。

すべての変換された命令では、19:15ビットのrs1フィールドがAddr. Offsetフィールドに置き換えられており、この値は例外の発生した仮想アドレス(mtvalとstvalに書き込まれた値)とオリジナルの仮想アドレスの正の差分を表現している。ミスアラインメモリアクセスの場合、この値は非ゼロとなる可能性がある。基本的なロードストア命令では、即値のフィールドはすべて変換によりゼロに置き換えられる。

標準的なCompressed命令(16bit長)では、変換された命令は以下のようなフォーマットとなる。

  1. Compressed命令は32ビットに置き換えられる。
  2. 32ビットの等価な命令に置き換えられる。
  3. ビット1が0に置き換えられる。

例外の発生した命令がCompressed命令ではなく、ビット1:0が11ではない場合、変換後の標準的な命令では、ビット1:0が2進数01に置き換えられる。

mtinstまたはhtinstの内容をデコードする際に、ソフトウェアがレジスタが標準の基本ロード(LB,LBU,LH,LHU,LW,LWU,LD,FLW,FLD,FLQ)または基本ストア(SB,SH,SW,SD,FSW,FSD,FSQ)のエンコーディングを含んでいると判断した場合、即値オフセットフィールド(ビット31:25,および24:20または11:7)がゼロであることも証明する必要はない。レジスタの値が基本的なロード・ストアのエンコーディングであるという知識は、例外の命令が同じ種類のものであることを証明するのに十分である。

この規格の将来のバージョンでは、現在ゼロであるレジスタに情報が追加される可能性がある。しかし、下位互換性のために、そのような情報は性能向上のためだけのものであり、安全に無視することができる。

ゲストページフォルトでは、例外命令レジスには特殊な疑似命令が以下の条件で書き込まれる: (a) : VSステージアドレス変換中の暗黙的なメモリアクセスにて例外が発生した場合 (b) : mtval2, htvalに非ゼロの値(例外の発生したゲスト物理アドレス)が書き込まれた場合 2つの条件に合致した場合、mtinstもしくはhtinstは表5.10に基づく値が書き込まれ、ゼロは許可されない。

意味
0x00002000 VSステージアドレス変換の32ビットメモリ読み込み(RV32)
0x00002020 VSステージアドレス変換の32ビットメモリ書き込み(RV32)
0x00003000 VSステージアドレス変換の64ビットメモリ読み込み(RV64)
0x00003020 VSステージアドレス変換の64ビットメモリ書き込み(RV32)
  • 表5.10: ゲストページフォルト例外における特殊な疑似命令。RV32での値はVSXLEN=32、RV64での値はVSXLEN=64の場合に使用される。

これらの疑似命令は表5.11に示す基本的なロードストア命令のエンコーディングに近づけるように設計されている。

エンコーディング 命令
0x00002003 lw x0,0(x0)
0x00002023 sw x0,0(x0)
0x00003003 ld x0,0(x0)
0x00003023 sd x0,0(x0)
  • 表5.11: 表5.10の特殊な疑似命令に相当する標準的な命令

「メモリ書き込み」の疑似命令(0x00002020, 0x00003020)は、マシンがVSレベルのページテーブルのA/Dビットを自動的に更新しようとする場合に使用される。VSステージアドレス変換における他の暗黙的なメモリアクセスはすべてメモリ読み込みである。VSレベルのページテーブルのA/Dビットをマシンにより自動的に更新されない場合(ソフトウェアにより実行される)、「メモリ書き込み」のケースは決して発生しない。このようなページテーブルの更新は、単純な書き込みではなく実際にはアトミックに実行されなくてはならないという事実は、疑似命令では無視されている。

擬似命令値を必要とする条件がM-Modeで発生することがある場合、mtinstは完全にハードウェアによりゼロ固定とすることは出来ない。しかし、その場合、例外命令レジスタは最小限の値0と0x00002000または0x00003000、場合によっては0x00002020または0x00003020のみをサポートし、1つのレジスタあたりハードウェアで1つまたは2つのフリップフロップがひつようなだけである。

ハイパーバイザーはこのような状況では、例外の発生した暗黙のメモリアクセスをエミュレートすることは期待されていないため、ページテーブル更新のためのアトミック性の要件を無視しても何の問題もない。むしろ、ハイパーバイザーには、障害が発生したアクセスに関する十分な情報が与えられており、障害が発生した命令を再試行して実行を再開する前に、メモリにアクセス可能な状態にすることができる(例えば、仮想メモリの欠落したページを復元する)。

5.6.4 例外からの復帰

M-Modeで処理された例外から復帰するためにMRET命令が使用される。MRET命令はまず表5.6に基づいてmstatusもしくはmstatushレジスタのMPPとMPVフィールドの値を用いて新しい動作モードを決定する。次にMRETはmstatus/mstatushMPVとMPPを0に設定し、MIEをMPIEに、MPIEを1に設定する。最後に、MRETは仮想モードと特権モードを設定し、pcをmepcに設定する。 SRET命令はHS-ModeもしくはVS-Modeで処理された例外から復帰するために使用される。この命令の動作は現在の仮想モードに依存する。 M-ModeもしくはHS-Mode(つまりV=0)で実行中の場合、SRETは最初にhstatus.SPVsstatus.SPPに基づき表5.7に従って新しい動作モードを決定する。SRETは次にhstatus.SPVを0に設定し、sstatusのSPP=0、SIE=SPIE、SPIE=1に設定する。最後に、SRETは新しい仮想化モードと特権モードを設定し、pc=sepcとする。 VS-Modeで実行中の場合(つまりV=1)、SRETは表5.8に基づいて特権モードを設定し、vstatusのSPP=0、SIE=SPIE、SPIE=1として最後にpc=vsepcとする。