FPGA開発日記

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

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

5.6 例外

5.6.1 例外要因コード

ハイパーバイザー拡張では、例外要因のエンコーディングについて決められている。表5.5はハイパーバイザーが実装された場合でのM-ModeおよびHS-Modeでの例外要因コードを示している。VSレベル例外(割り込み要因コード2,6,10)、スーパーバイザーレベルゲスト外部割込み(割り込み要因コード12)、仮想命令例外(例外要因コード22)、ゲストページフォルト例外(例外要因コード20, 21, 23)が定義されている。さらに、VSモードからのEnvironment Callが要因コード10に割り付けられており、一方でHS-ModeもしくはS-Modeからの要因コードが9に割り付けられている。

HS-ModeとVS-ModeのECALLは異なる割り込み要因コードを使用しているため、独立して移譲の設定を行うことができる。

V=1の場合、仮想命令例外(不定命令例外ではない)は以下の条件で発生する。

  • hcounterenの該当するビットが0であり、mcounterenの同じ場所のビットが1であるときにカウンタCSRにアクセスしようとした場合
  • ハイパーバイザー命令(HLV, HLVX, HSV, HFENCE)命令を実行しようとした場合、もしくは実装されているハイパーバイザーCSRかVS CSRにアクセスしようとした場合
  • VU-Modeでは、WFI命令もしくはスーパーバイザー命令(SRETもしくはSFENCE)命令を実行しようとした場合もしくはスーパーバイザーCSRにアクセスしようとした場合
  • VS-Modeでは、hstatus.VTW=1かつmstatus.TW=0のときにWFI命令を実行し、実装で定義されている特定の時間が経っても命令が完了しなかった場合。
  • VS-Modeでは、hstatus.VTSR=1の場合にSRET命令を実行しようとした場合、もしくは
  • VS-Modeにおいてhstatus.VTVM=1の場合にSFENCE命令を実行しようとした場合、もしくはsatpレジスタにアクセスしようとした場合
  • 表5.5: ハイパーバイザー拡張が実装されている場合のマシンモードとスーパーバイザーモードの例外要因レジスタ (mcause, scause)
割り込み 要因コード 説明
1 0 予約
1 1 スーパーバイザーソフトウェア割込み
1 2 仮想スーパーバイザーソフトウェア割込み
1 3 マシンレベルソフトウェア割込み
1 4 予約
1 5 スーパーバイザータイマ割り込み
1 6 仮想スーパーバイザータイマ割り込み
1 7 マシンモードタイマ割り込み
1 8 予約
1 9 スーパーバイザー外部割込み
1 10 仮想スーパーバイザー外部割込み
1 11 マシンモード外部割込み
1 12 スーパーバイザーゲスト外部割込み
1 13 - 15 予約
1 >= 16 プラットフォーム独自の割り込み、カスタム向け
0 0 命令フェッチアドレスミスアライン
0 1 命令アクセスフォルト
0 2 不正命令
0 3 ブレークポイント
0 4 ロードアドレスミスアライン
0 5 ロードアクセスフォルト
0 6 ストア/AMOアクセスミスアライン
0 7 ストア/AMOアクセスフォルト
0 8 U-ModeもしくはVU-ModeでのEnvironment Call
0 9 HS-ModeでのEnvironment Call
0 10 VS-ModeでのEnvironment Call
0 11 M-ModeでのEnvironment Call
0 12 命令フェッチページフォルト
0 13 ロードページフォルト
0 14 予約
0 15 ストア/AMOページフォルト
0 16 - 19 予約
0 20 命令フェッチゲストページフォルト
0 21 ロードゲストページフォルト
0 22 仮想命令
0 23 ストア/AMOゲストページフォルト
0 24 - 31 カスタム向け
0 32 - 47 予約
0 48 - 63 カスタム向け
0 >= 64 予約

仮想命令例外では、mtvalstvalに不正命令例外と同じ値が書き込まれる。

V=1の場合、VS-ModeまたはVU-Modeで無効な特権命令は、通常、不正な命令トラップではなく仮想命令トラップを引き起こす。同じことが、V=1のときにハイパーバイザーやスーパーバイザーレベルのCSRにアクセスしようとしても、特権が不十分なために失敗したり、ハイパーバイザーのCSRによってアクセスが明示的に無効にされているCSRにアクセスしようとしたりする場合にも当てはまる(例:hcounteren)。ネストしたハイパーバイザーをサポートするため、あるいはその他の理由で、ハイパーバイザーがこのような命令をエミュレートしなければならないことは珍しくない。命令をエミュレートしない場合、ハイパーバイザーは仮想命令トラップをゲスト仮想マシンの不正な命令例外に変換しなければならない。 通常、マシンレベルでは仮想命令トラップを直接HSレベルに委譲することが期待されるが、不正な命令トラップは、(ソフトウェアによって)HSレベルにコンディショナルに委譲される前に、Mモードで最初に処理される可能性が高い。その結果、仮想命令トラップは通常、違法命令トラップよりも高速に処理されることが期待されている。

5.6.2 例外発生時の動作

HS-ModeもしくはU-Modeで例外が発生した場合、medelegmidelegにより権限が委譲されない限りはM-Modeに移行する(移譲される場合はHS-Modeに移行する)。VS-ModeかVU-Modeで例外が発生した場合はmedelegmidelegにより移譲されない限りはM-Modeに移行する(移譲される場合はhedeleghidelegによりさらに移譲されてVS-Modeに移譲されない限りはHS-Modeに移行する)。 例外によりM-Modeに移行した場合、仮想モードVは0に設定され、mstatus(とmstatush)のMPVとMPPビットは表5.6に示す条件に則り設定される。例外によりM-Modeに移行されると、mstatus/mstatushのGVA, MPIE, MIEフィールドに値が書き込まれ、mepc, mcause, mtval, mtval2レジスタが書き込まれる。

以前のモード MPV MPP
U-Mode 0 0
HS-Mode 0 1
M-Mode 0 3
VU-Mode 1 0
VS-Mode 1 1
  • 表5.6: 例外発生によりM-Modeに移行した後のmstatus/mstatushMPV、MPPの値。例外から復帰する場合、MPP=3の時にMPVの値は無視される。

例外発生によりHS-Modeに移行した場合、仮想モードVは0に設定され、hstatus.SPVhstatus.SPP表5.7に従い設定される。例外発生前にV=1であった場合、hstatusのSPVPはsstatus.SPPと同じ値が設定される; そうでなければ、SPVPの値は変化しない。例外発生によりHS-Modeに移行した場hstatusのGVAフィールド、sstatusSPIESIEフィールドも書き込まれ、sepc, scause, stval, htval, htinst CSRも更新される。

以前のモード SPV SPP
U-Mode 0 0
HS-Mode 0 1
VU-Mode 1 0
VS-Mode 1 1
  • 表5.7: 例外発生によりHS-Modeに移行した後のhstatus/sstatusSPV、SPPの値

例外発生によりVS-Modeに移行した場合、vsstatus.SPP表5.8に従い設定される。hstatusとHSレベルのsstatusの値は変更されず、仮想モードVも1が維持される。例外発生によりVS-Modeに移行した場合には、vsstatusのSPIEとSIEビットが設定され、vsepc, vscause, vstvalの値が更新される。

以前のモード SPP
VU-Mode 0
VS-Mode 1
  • 表5.8: 例外発生によりVS-Modeに移行した後のvsstatusのSPPの値

5.6.3 **mtinst**, **htinst**の命令変換と疑似命令 M-ModeもしくはHS-Modeに移行するすべての命令は、自動的にトラップ命令CSR mtinstもしくはhtinstに適切な値が書き込まれる:

  • ゼロ
  • トラップが発生した命令の変形
  • カスタム値(トラップされた命令が標準的なものでない場合のみ許される)
  • 特殊な疑似命令

後述するつ疑似命令の値が必要である場合を除いて、mtinstもしくはhtinstに書き込まれる値は常に0であり、これらの特定の例外にハードウェアは何の情報も提供しないということを示している。

例外命令CSRに書き込まれる値には2つの目的がある。1つ目の目的は例外ハンドラにより命令のエミュレーション速度を向上させるためであり、特に例外ハンドラが例外の情報をメモリからロードする必要性を省略し、デコードと命令実行のいくつかのタスクを除去するためである。2つ目の目的はVSステージのアドレス変換による暗黙的なメモリアクセスにより発生した場合のゲストページフォルト例時に、さらなる情報を疑似命令を通じて提供するためである。 例外の発生した命令の「変換」とは、ハードウェアの負担を最小限に抑えつつ、例外ハンドラに命令をエミュレートするために必要な情報を提供するために、単に元の命令をコピーするのではなく変換処理が行われるものである。変換命令の代わりにゼロを代入することで、効率が低下する。

割り込み発生時には、例外命令レジスタの値は常にゼロである。同期例外発生時にゼロ以外の値が書き込まれた場合、その値について以下のことが成り立つ。

  • 0ビット目に1が書き込まれ、1ビット目に1が設定されることにより標準的な命令のエンコーディングにおいてこの値が有効であるということが示される。この場合には、レジスタの値は例外の発生した命令に関連する情報であることが示され、以降に示すようにレジスタの値は例外の発生した命令から変換されたものである。たとえば、ビット1:0が2進数11でありレジスタの値が標準的なLW(Load Word)である場合、例外の発生した命令はLWであり、レジスタには例外の発生したLW命令の変換が書き込まれる。
  • 0ビット目に 1が書き込まれ、1ビット目に1が設定されることでカスタム命令に明示的に指定されたエンコーディングとなる(使用されていない予約済みのエンコーディングではない)。これは「カスタム値」である。標準的でない命令により例外が発生した場合である。カスタム値の解釈は標準では定められていない。
  • 後述する特殊な疑似命令が設定される場合。ビット1:0は2進数で00が設定される。

これらの2つの場合は例えばビット1:0の値が2進数で10である場合など、他にも設定可能な多くの値を省略している。将来の仕様更新や拡張により他の条件が定義される可能性があり、このため現在はこれらの値の条件は省略されている。ソフトウェアは例外命令レジスタのこれらの値について、値がゼロであるのと同様に安全にこれらの値を扱わなければならない。

この規格の将来のリビジョンとの互換性を保つために、mtinstまたはhtinstから非ゼロ値を解釈するソフトウェアは、値が上記のいずれかのケースに準拠していることを完全に検証する必要がある。例えば、RV64の場合、mtinstのビット6:0が0000011、ビット14:12が010であることを発見しても、最初のケースが適用され、トラッピング命令が標準LW命令であることを確認するには不十分である。将来の標準規格では、ビット63:32がゼロではなく、ビット31:0が標準のRV64命令と同じビットパターンを持つ64ビットのmtinstの新しい値が定義される可能性がある。 標準命令とは異なり、カスタム値の命令エンコーディングは、トラップした命令と同じ「種類」である必要はない(例外発生命令との相関関係もない)。

表5.9は各標準的な例外要因について、例外命令レジスタに自動的に書き込まれる値を示している。例外時にこれらの命令のフェッチを防ぐために、ゼロもしくは疑似命令のみ書き込まれるようになている。例外の発生した命令が標準命令でない場合にのみ自動的にカスタム値が書き込まれる。将来の仕様更新や拡張により、上記の許可される値の集合の値を選択して他の値が書き込まれることは許される。 この表に示されるように、同期例外の場合、明示的なメモリアクセス(ロード命令、ストア命令、AMO命令)により例外が発生した場合にのみ例外命令レジスタに標準的な変換後の値が書き込まれる。この表によると、標準的な変換では現在はこれらのメモリアクセス命令のみ定義されている。もしこれらの変換が定義されていない同期例外が発生した場合、例外命令レジスにはゼロが書き込まれる(もしくはこのような状況の場合には特殊な疑似命令が書き込まれる)。

例外 ゼロ値 変換された標準命令 カスタム値 疑似命令値
命令アドレスミスアライン Yes No Yes No
命令アクセスフォルト Yes No No No
不正命令 Yes No No No
ブレークポイント Yes No Yes No
仮想命令 Yes No Yes No
ロードアドレスミスアライン Yes Yes Yes No
ロードアクセスフォルト Yes Yes Yes No
ストア/AMOアドレスミスアライン Yes Yes Yes No
ストア/AMOアクセスフォルト Yes Yes Yes No
Environment Call Yes No Yes No
命令ページフォルト Yes No No No
ロードページフォルト Yes Yes Yes No
ストア/AMOページフォルト Yes Yes Yes No
命令ゲストページフォルト Yes No No Yes
ロードゲストページフォルト Yes Yes Yes Yes
ストア/AMOゲストページふぉるtお Yes Yes Yes Yes
  • 表5.9: 例外発生時に例外命令レジスタ(mtinstもしくはhtinst)に自動的に書き込まれる値