FPGA開発日記

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

特権命令の例外権限を委譲するためのRISC-Vシステムレジスタmedeleg, mideleg

テストパタンのチェックをしていて、スーパバイザモードで例外が発生してもスーパバイザモードに留まっているパタンがおり、何が起きているのだろうと調べていると、以下のようなレジスタの仕様を発見した。

目的としては例外が発生した場合のコンテキストスイッチの時間を最小限にし、割り込みの応答性を上げるものらしい。 medelegレジスタmidelegレジスタは、本来スーパーユーザが実行すべき例外プログラムを、別の特権ユーザが変わりに実行するためのレジスタだ。

f:id:msyksphinz:20170215012210p:plain

上記の図だけ見ると何のことだか分からないが、各レジスタのビットフィールドはRISC-Vの割り込み、例外のビットエンコーディングに相当しており、 例えばbit1=命令アクセスフォルトに相当し、bit1=1ならば、この例外が発生した場合にプロセッサはマシンモードに移らず、スーパバイザモードで例外を処理する。

f:id:msyksphinz:20170215012413p:plain

割り込みの場合も同様だ。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)

はマシンモードで処理されずに、スーパバイザモードで処理されることを意味する。