RISC-Vのトレースフォーマットの仕様書が公開された。現在はドラフト段階だが、ドキュメントがGitHubで公開され、pdfファイルも入手することができる。 各種CPUアーキテクチャのトレース形式など、あまり勉強したことが無いのでこれを機に読んでみよう。
1章ずつ、翻訳ではなく日本語でサマライズしていく形式で進めていく。
イントロダクション
デバッグ情報だけではプロセッサの動作を把握しきれないときがあり、大量のデータによってシステムが圧迫されることなくトレース情報を取得する必要があり、このために「プロセッサブランチトレース」が使用される。
スタートアドレスから順にプロセッサの動作の差分をメッセージおつぃて転送する。一般的な差分では、ジャンプ、関数コール、リターンなどの分岐に関する命令、あるいは割り込みや例外などが差分として考えられる。
システム中で以下のコンポーネントが1つ以上存在しているものとする。
- 命令トレースインタフェースを持つコア。命令トレースインタフェースでは、プロセッサのブランチトレースなどの情報を出力することができる。このインタフェースは高いバンド幅を持つ:ほとんどの実装では大量のデータ(命令アドレス・命令タイプ・コンテキストの情報など...)を転送するため、これらの情報をコアと同じクロックサイクルで転送する。
- 命令トレースインタフェースの情報をエンコードするるハードウェアエンコーダ。命令トレースの情報を圧縮してパケットとして外部に出力する。
- トレースパケットを転送するためのチャネル、もしくはトレースパケットをメモリに格納するためのチャネル。
- トレースパケットのデコーダ。通常は外部PC上で実行されるソフトウェア。
RISC-Vではプログラムは順番に実行されるため、シーケンシャルに実行されているときはトレースを出力する必要がない。分岐が発生したときのみトレースを出力すればよい。
割り込みはプログラムの実行順序と何晏系なく発生する。例外も同様に考えることができる。デコーダは通常はどの命令で割込みが発生したかを判断できないため、トレースエンコーダは通常のプログラムのフローの中でどこで例外が発生したかを通知する必要がある。
1.1 用語
- ATB: Arm trace bus
- branch : 条件的に実行フローを変更する命令。
- CSR :control/status レジスタ
- decoder :エンコーダーによって放出されたトレースパケットを受け取り、RISC-Vハートによって実行されたコードの実行フローを再構築するソフトウェア。
- delta :メモリに連続して配置された2つの命令の違い以外のプログラムカウンタの変更。
- discontinuity :デルタと同じ意味
- ELF :executable and linkable format
- encoder :RISC-Vハートから命令実行情報を取り込み、それをトレースパケットに変換するハードウェア
- exception :RISC-Vハートの命令に関連する実行時に発生する異常な状態
- hart :a RISC-V ハードウェアスレッド
- interrupt :RISC-Vハートに予期しない制御の移行が発生する可能性のある外部非同期イベント
- ISA :instruction set architecture
- jump :実行フローを無条件に変更する命令
- direct jump :PCを一定の値で変更することにより、実行フローを無条件に変更する命令
- indirect jump :PCを計算値に変更することにより、実行フローを無条件に変更する命令
- inferable jump :ジャンプオペコード内に埋め込まれた定数を介してターゲットアドレスが提供されるジャンプ
- uninferable jump :推測できないジャンプ(上記を参照)
- LSB :least significant bit
- MSB :most significant bit
- packet :エンコーダーによって出力されるエンコードされたトレース情報の原子単位
- PC :プログラムカウンタ
- program counter :実行中の命令のアドレスを含むレジスタ
- retire :マシンの状態が更新されたときに、命令を実行する最終段階("Commit"または"Graduate"と呼ばれることもある)
- trap :例外または割り込みのいずれかによって引き起こされたトラップハンドラへの制御の転送
- updiscon :「推論できないPCの不連続性」の縮小