Skip to content

Instantly share code, notes, and snippets.

@kotet
Created October 26, 2022 04:18
Show Gist options
  • Save kotet/a235efd4906dfe33b186fae29885db97 to your computer and use it in GitHub Desktop.
Save kotet/a235efd4906dfe33b186fae29885db97 to your computer and use it in GitHub Desktop.
RISC-V privileged ISA 3.1.16 Machine Trap Value Register (mtval) の翻訳

mtvalレジスタはMXLENビットの読み書きできるレジスタであり、フォーマットは図3.23の通り。 トラップがMモードへ入った時、mtvalはゼロか、トラップのハンドリングを支援する例外特有の情報が書き込まれる。 それ以外の時はmtvalへの書き込みは、ソフトウェアによる明示的な書き込みであったとしても行われない。 ハードウェアプラットフォームはmtvalに情報をセットしなければならない例外と、無条件にゼロをセットする例外を指定できる。 ハードウェアプラットフォームがmtvalに非ゼロ値を書き込む例外は無いとしたならば、mtvalは読み込み専用のゼロになる。


図3.23: Machine Trap Value Register

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に書き込む前に、保持できる形式の別の不正なアドレスに変換できる。 フォールトした命令のビット列を返す機能が実装されている時、mtvalMXLENILENのうち小さい方をNとしたとき2^N未満のすべての値を保持できなければならない。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment