テストパタンのチェックをしていて、スーパバイザモードで例外が発生してもスーパバイザモードに留まっているパタンがおり、何が起きているのだろうと調べていると、以下のようなレジスタの仕様を発見した。
目的としては例外が発生した場合のコンテキストスイッチの時間を最小限にし、割り込みの応答性を上げるものらしい。
medeleg
レジスタとmideleg
レジスタは、本来スーパーユーザが実行すべき例外プログラムを、別の特権ユーザが変わりに実行するためのレジスタだ。
上記の図だけ見ると何のことだか分からないが、各レジスタのビットフィールドはRISC-Vの割り込み、例外のビットエンコーディングに相当しており、 例えばbit1=命令アクセスフォルトに相当し、bit1=1ならば、この例外が発生した場合にプロセッサはマシンモードに移らず、スーパバイザモードで例外を処理する。
割り込みの場合も同様だ。mideleg
レジスタを設定することで、割り込みが発生した場合に、マシンモードに遷移せずにより低い特権モードで動作することが出来る。
このようなテストパタンは実際に存在し、例えばriscv-testsのrv32ui-v-add
テストパタンでは、最初に以下のような設定をしている。
42:M:MBar:[8000299c][P8000299c] 30279073 : csrrw r00,0x302,r15 medeleg=>00000000 r15=>000001a2 medeleg<=000001a2
これは、
- Instruction Access Fault (bit1)
- Load Address Fault (bit5)
- Store/AMO access Fault (bit7)
- Environment call from U-mode (bit8)
はマシンモードで処理されずに、スーパバイザモードで処理されることを意味する。