FPGA開発日記

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

QEMUに入門してみる(10. QEMUでのベアメタルバイナリの実行方法調査)

QEMUの続き。前回、QEMUを使ってLinux向けにコンパイルされたバイナリを実行することができるようになったが、ベアメタルのバイナリを動かすことはまだできていない。目標としてはとりあえずriscv-tests関係のプログラムを動かすことができるようになりたい。

色々調べた結果、これにはGDBを使用するのが手っ取り早いらしい?

https://github.com/riscv/riscv-qemu/issues/137

まずはsoftmmu構成のQEMUでGDBモードで立ち上げる。-sオプションはremote :1234で待ち状態に入るためのオプションらしい。

./qemu-system-riscv64 --d in_asm -nographic -machine sifive_u \
    --kernel /home/ubuntu/work/riscv64/riscv64-unknown-elf/share/riscv-tests/isa/rv64ui-p-simple \
    -s -S

別のターミナルを立ち上げてGDBを起動する。そしてtargetコマンドでQEMUに接続する。

$ riscv64-unknown-elf-gdb
(gdb) target remote :1234

Remote debugging using :1234
warning: No executable has been specified and target does not support
determining executable automatically.  Try using the "file" command.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x0000000000001000 in ?? ()

これでcコマンドでシミュレーションを開始すると、QEMUのstdoutに実行された命令が表示される。これでどのような命令が実行されたかを確認することができるという訳か。

----------------
IN:
Priv: 3; Virt: 0
0x0000000000001000:  00000297          auipc           t0,0            # 0x1000
0x0000000000001004:  02028593          addi            a1,t0,32
0x0000000000001008:  f1402573          csrrs           a0,mhartid,zero

----------------
IN:
Priv: 3; Virt: 0
0x000000000000100c:  0182b283          ld              t0,24(t0)
0x0000000000001010:  00028067          jr              t0

----------------
IN:
Priv: 3; Virt: 0
0x0000000080000000:  0480006f          j               72              # 0x80000048

----------------
IN:
Priv: 3; Virt: 0
0x0000000080000048:  f1402573          csrrs           a0,mhartid,zero

----------------
IN:
Priv: 3; Virt: 0
0x000000008000004c:  00051063          bnez            a0,0            # 0x8000004c

...

追記。なるほど、無理にGDBを使わなくても、上記のオプションだけで動かすことはできるのか。

./qemu-system-riscv64 --machine sifive_u --d in_asm --nographic --kernel /home/msyksphinz/riscv64/riscv64-unknown-elf/share/riscv-tests/isa/rv64ui-p-simple
f:id:msyksphinz:20200707221040p:plain

大体わかった。これを自作ターゲット向けに移植すれば良いわけかな?