2020-09-01から1ヶ月間の記事一覧
Binary Translation方式のエミュレータをRustで作る実装、浮動小数点命令を実装している。加減算命令については特に問題なく実装が進んだのだが、FMADDなどの3オペランド命令の実装についてサポートを追加した。FMADD.DなどのFused Multiply-Add命令は入力オ…
Binary Translation方式のエミュレータをRustで作る実装、浮動小数点命令を実装している。浮動小数点演算はsoftfloatを使用しており、Rustでもいくつかのcrateが公開されているためこれを活用している。 テストパタンを試行していたのだが、riscv-testsが通…
自作Binary Translationエミュレータの実装、浮動小数点レジスタへのロードストア命令の実装が完了したので、次は演算命令の実装だ。簡単なところから、FADD.D(倍精度浮動小数点加算命令)から実装して行きたい。 さて、C++で記述されたsoftfloatをどのよう…
Binary Translation方式のエミュレータ開発、RISC-Vの基本命令については一通り実装が完了した。次はどちらの方向に進むかということだが、いくつか考えられるのは、 浮動小数点命令のサポート 仮想アドレスのサポート Compressed 命令のサポート AArch64ホ…
Binary Translation型のエミュレータを作っている。今のところRISC-Vのバイナリをx86に直接バイナリ変換して実行することができるようになった。riscv-testsの一部を実行してx86上でPassできるようになっている。 QEMUはもともとマルチプラットフォーム向け…
QEMUはゲストマシンの機械語をホストマシンの機械語に直接翻訳して(Binary Translation)実行することで高速動作を実現しているのだが、整数命令の場合はこれで問題ない。しかし浮動小数点命令の場合はどうだろう?RISC-Vとx86では浮動小数点命令の丸めの扱い…
Binary Translation型のエミュレータをRustで自作する話、徐々にテストパタンが安定して動作するようになっている。64ビット整数命令のパタンはすべてPassできるようになりたい。 これに伴っていくつかの実装変更を行った。これまではCSRRW命令などは専用のT…
GoogleのSystemVerilog Parserの続き。さらにいくつかコマンドがあるので探っていく。 verible-verilog-syntax これがおそらくSyntax解析エンジンの最も中心的なコマンドであろう。Verilogファイルを読み取って階層構造を出力する。階層構造を出力するために…
GoogleがSystemVerilogのParserを開発していた。見つけたきっかけはGoogleのRISC-V向けランダムパタン生成ツールであるRISCV-DVを調査していたのだが、その最中に見つけたものだった。 github.com github.com 余談であるがriscv-dvの方はUVMをサポートできる…
Binary Translation型エミュレータにおいてシフト命令を実装した。Binary Translation型エミュレータでは、ゲストマシンの命令(今回はRISC-V)からホストマシンの命令(今回はx86)に直接変換することで高速実行を可能にするシミュレータだ。 前回ついにriscv-t…
Binary Translation型エミュレータにおいてシフト命令を実装した。Binary Translation型エミュレータでは、ゲストマシンの命令(今回はRISC-V)からホストマシンの命令(今回はx86)に直接変換することで高速実行を可能にするシミュレータだ。 CSR命令などのPriv…
Binary Translation型エミュレータにおいてシフト命令を実装した。Binary Translation型エミュレータでは、ゲストマシンの命令(今回はRISC-V)からホストマシンの命令(今回はx86)に直接変換することで高速実行を可能にするシミュレータだ。 次に実装するのは…
Binary Translation型エミュレータにおいてシフト命令を実装した。Binary Translation型エミュレータでは、ゲストマシンの命令(今回はRISC-V)からホストマシンの命令(今回はx86)に直接変換することで高速実行を可能にするシミュレータだ。 現在実装している…
はじめに RustでBinary Translation型エミュレータを作っている。Binary Translation型エミュレータの特徴は、ゲストのマシンコード(例えばRISC-Vなど)をホストマシン(例えばx86)で実行する場合に、RISC-Vのマシンコードをそれと等価なx86コードに変換す…
Binary Translation型エミュレータにおいてシステムレジスタアクセスを実装している。システムレジスタアクセスのためのCSR命令は、Helper関数を呼び出してRustの関数側で複雑な処理を実行する。前回は関数の呼び出し側を実装し、Rustの簡単な関数を呼び出す…
QEMUがRISC-VのCSR命令をエミュレートする仕組み QEMUが複雑な命令をエミュレートする場合、TCG(Tiny Code Generator)によるx86命令への直接的な変換を行うだけでなく、ホストコードのサポート関数を直接呼び出してその実行を肩代わりする場合がある。例えば…
RISC-V Vector Extension v0.9がすでにStableになっているが、v1.0がReadyに入りつつある。すでにGitHubのドキュメントはv1.0のリリースに向けて改変が行われており、いくつかの新規追加事項についてはすでにアップデートが完了している。 v1.0とv0.9の差分…
QEMUについて調査している。x86のコードをどのようにディスアセンブルしているのかを調査していると、gitのサブモジュールとしてcapstoneというツールが使われていることが分かった。capstoneは、マルチターゲットのディスアセンブラらしい。ディスアセンブ…
Binary Translation型エミュレータにおいてメモリアクセス命令をどのように実現するかについて纏めておこう。RISC-Vのバイナリからx86の命令に変換して実行する方法をまとめておく。この方式は基本的にQEMUで実現されている方式に基づいているが、初期の実装…
RustでBinary Translation型エミュレータを作っている。Binary Translation型エミュレータの特徴は、ゲストのバイナリ形式(RISC-Vなど)をホストのバイナリ形式(x86など)に実行時に変換するタイプのエミュレータである。今回はホストとしてはx86、ゲストとし…
RustでBinary Translation型エミュレータを作っている。Binary Translation型エミュレータの特徴は、ゲストのバイナリ形式(RISC-Vなど)をホストのバイナリ形式(x86など)に実行時に変換するタイプのエミュレータである。今回はホストとしてはx86、ゲストとし…
QEMUによる分岐命令の実現方法が分かったので、次はロードストア命令について実現方法を見ていきたいと思う。例えばRISC-VにおけるLD命令とSD命令を実行する場合、どのようにx86命令に変換されるのだろうか? LD x10, 0(data) SD x10, 8(data) 以下のような…
Rustで実装しているBinary Translation型エミュレータ、分岐命令を実装するための方針を考える。分岐命令は基本的に以下のような方針で組み立てることにする。 比較する値をレジスタにロードしてくる。 cmp命令により比較を実行する。 分岐命令の種類に応じ…
Chiselが生成するVerilogファイルはとにかく長い。 ファイルを1つにまとめて生成するというのもあるが(モジュール毎に分割するオプションも存在するのでこれは問題ではないけど)、1つ1つのモジュールも大きくなりがちで、解析に非常に時間がかかる。 Chisel…
QEMUで分岐命令を取り扱う場合、主に以下のような手順で取り扱われることを見てきた。 source1に新しいオペランドを確保する。gen_get_gpr(source1, a->rs1)によりsource1にrs1の情報を格納する。 source2に新しいオペランドを確保する。gen_get_gpr(source2…
自作Binary Translation型エミュレータを作っている。RISC-Vの命令を入力するとそれをx86に変換しそのままホストマシンで実行することでインタプリタ型のエミュレータよりも高速に動作することを期待したものだ。前回実行すべきブロックのプロローグ・エピロ…
前回は、QEMUの分岐命令の取り扱いについて確認していた。今回はこれを自作Binary Translationエミュレータに実装することを考える。 まずはシンプルに考えた方が良さそうだ。基本的な実装方針について確認する前に、少し追加の実装を行う必要があるためこれ…
QEMUの調査続き。次は分岐命令をどのように処理しているのか見ていこう。 例えばBEQ命令がどのようにx86に処理されるのかを見てみよう。 qemu/target/riscv/insn_trans/trans_rvi.inc.c static bool trans_beq(DisasContext *ctx, arg_beq *a) { return gen_…
遅ればせながらIntel Advanced Matrix Extension(AMX)の資料を読み漁ってみた。参考にしたのは以下の資料。 Intel® Architecture Instruction Set Extensions and Future Features Programming Reference https://software.intel.com/content/dam/develop/pu…
Binary Translation型エミュレータを作っている。ゲストマシンはRISC-Vで、ホストマシンはx86である。ADDI命令は簡単なものであれば実装できるようになった(ソースレジスタがx0の場合に限る)。どんどん実装を進めていこう。次はLUI命令の問題だ。現在x86命令…