これは RISC-V Instruction Set Manual Volume 2, Privileged Spec v. 20211203 の二次的著作物です。 この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。
-
-
Save kotet/a235efd4906dfe33b186fae29885db97 to your computer and use it in GitHub Desktop.
mtval
レジスタはMXLEN
ビットの読み書きできるレジスタであり、フォーマットは図3.23の通り。
トラップがMモードへ入った時、mtval
はゼロか、トラップのハンドリングを支援する例外特有の情報が書き込まれる。
それ以外の時はmtval
への書き込みは、ソフトウェアによる明示的な書き込みであったとしても行われない。
ハードウェアプラットフォームはmtval
に情報をセットしなければならない例外と、無条件にゼロをセットする例外を指定できる。
ハードウェアプラットフォームがmtval
に非ゼロ値を書き込む例外は無いとしたならば、mtval
は読み込み専用のゼロになる。
MXLEN-1 .. 0 |
---|
mtval |
mtval
はブレークポイント、アドレスミスアライン、アクセスフォールト、ページフォールト例外が命令フェッチ、ロード、ストアで発生したときには非ゼロ値が書き込まれ、mtval
はフォールトした仮想アドレスになる。
ページベース仮想メモリが有効の時、mtval
にはフォールトした仮想アドレスが書き込まれ、これは物理メモリアクセスフォールト例外に対しても同じである。この設計により多くの実装で、特にハードウェアページテーブルウォーカーを持つ実装においてデータパスのコストが削減される。
アラインされていないロードやストアに起因するアクセスフォールトやページフォールト例外によってmtval
に非ゼロ値が書き込まれた時、mtval
の値はフォールトを発生させたアクセスに関する仮想アドレスになる。
可変長命令を実装するシステムで命令アクセスフォールトやページフォールト例外によってmtval
に非ゼロ値が書き込まれた時、mtval
はフォールトを発生させた命令に関する仮想アドレスになり、mepc
はその命令の先頭を指す。
mtval
レジスタは不正命令例外時にフォールトした命令ビットを返すのにも使ってよい(mepc
はメモリ上のフォールトした命令を指す)。
不正命令例外が発生したときにmtval
に非ゼロ値が書き込まれた時、mtval
は以下のうち最も短いものになる。
- フォールトした命令
- フォールトした命令の最初の
ILEN
ビット - フォールトした命令の最初の
MXLEN
ビット
不正命令例外でmtval
にロードされた値は右寄せされており、未使用の上位ビットはゼロにクリアされる。
mtval
でフォールトした命令をキャプチャすることで、命令ミスアライン時の部分的命令ロード、ロードによって命令をデータレジスタにフェッチする際のデータキャッシュミスやキャッシュされていない遅いアクセスをいくらか回避することが可能となり、命令エミュレーションのオーバーヘッドが削減される。
動的命令変換システムのように、他のエージェントが命令メモリを操作している場面ではアトミシティの問題もある。
命令全体(または少なくとも最初のMXLEN
ビット)はトラップ発生前にmtval
にフェッチされることが要求されている。
これは命令全体を命令をデコードする前にフェッチするような実装に制約を与えないはずで、ソフトウェアハンドラの複雑化を防ぐ。
mtval
にゼロ値があるとき、それは機能がサポートされていないか、不正なゼロ命令がフェッチされたことを意味する。
これら2つの識別はmepc
が指す命令メモリをロードすることで行える(または、実行前に適切なトラップハンドリングをインストールするためにシステム構成情報の照会を行う)。
その他のトラップに対してはmtval
はゼロにセットされるが、将来mtval
を他のトラップのために再定義する可能性がある。
mtval
が読み込み専用のゼロでないならば、mtval
レジスタは正規の仮想アドレスかゼロ値を保持できるWARLのレジスタである。
不正なアドレスを保持する能力は無くてもいい。
実装は不正なアドレスをmtval
に書き込む前に、保持できる形式の別の不正なアドレスに変換できる。
フォールトした命令のビット列を返す機能が実装されている時、mtval
はMXLEN
とILEN
のうち小さい方をN
としたとき2^N
未満のすべての値を保持できなければならない。