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 | 予約 |
仮想命令例外では、mtval
とstval
に不正命令例外と同じ値が書き込まれる。
V=1の場合、VS-ModeまたはVU-Modeで無効な特権命令は、通常、不正な命令トラップではなく仮想命令トラップを引き起こす。同じことが、V=1のときにハイパーバイザーやスーパーバイザーレベルのCSRにアクセスしようとしても、特権が不十分なために失敗したり、ハイパーバイザーのCSRによってアクセスが明示的に無効にされているCSRにアクセスしようとしたりする場合にも当てはまる(例:
hcounteren
)。ネストしたハイパーバイザーをサポートするため、あるいはその他の理由で、ハイパーバイザーがこのような命令をエミュレートしなければならないことは珍しくない。命令をエミュレートしない場合、ハイパーバイザーは仮想命令トラップをゲスト仮想マシンの不正な命令例外に変換しなければならない。 通常、マシンレベルでは仮想命令トラップを直接HSレベルに委譲することが期待されるが、不正な命令トラップは、(ソフトウェアによって)HSレベルにコンディショナルに委譲される前に、Mモードで最初に処理される可能性が高い。その結果、仮想命令トラップは通常、違法命令トラップよりも高速に処理されることが期待されている。
5.6.2 例外発生時の動作
HS-ModeもしくはU-Modeで例外が発生した場合、medeleg
かmideleg
により権限が委譲されない限りはM-Modeに移行する(移譲される場合はHS-Modeに移行する)。VS-ModeかVU-Modeで例外が発生した場合はmedeleg
かmideleg
により移譲されない限りはM-Modeに移行する(移譲される場合はhedeleg
かhideleg
によりさらに移譲されて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 |
例外発生によりHS-Modeに移行した場合、仮想モードVは0に設定され、hstatus.SPV
とhstatus.SPP
は表5.7に従い設定される。例外発生前にV=1であった場合、hstatus
のSPVPはsstatus.SPP
と同じ値が設定される; そうでなければ、SPVPの値は変化しない。例外発生によりHS-Modeに移行した場hstatus
のGVAフィールド、sstatus
のSPIE
とSIE
フィールドも書き込まれ、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
/sstatus
のSPV、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
)に自動的に書き込まれる値