FPGA開発日記

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

QEMUに入門してみる(9. QEMUでの詳細トレースの出し方)

QEMUの続き。QEMUを使ってRISC-Vのアプリケーションやベンチマークを走らせたい。とりあえずは普通のRISC-Vのバイナリで動作を確認するところから始めよう。

  • main.c
#include <stdio.h>

int main()
{
  printf("Hello World\n");
  return 0;
}
$ riscv64-unknown-linux-gnu-gcc main.c
$ qemu-riscv64 -L `riscv64-unknown-linux-gnu-gcc --print-sysroot` ./a.out

何故か分からないがKernel too oldと言われてエラーが出てしまった。これの理由がしばらくわからなかったのだが、もしかしたらWSL(しかもWSL1)でやってるからじゃね?ということに気が付いてAWSでUbuntu 18.10インスタンスを起動した。

Ubuntu 18.04LTSで動かすと上手く行った。しかしVirtualBoxで用意していたUbuntu 16.04を使うと同じようにKernel too oldとなってしまう。とりあえず動くことが確認できたのは良かったが、つぎはもう少し詳細ログを出してくれないと困ってしまう。

./qemu-riscv64 -L `riscv64-unknown-linux-gnu-gcc --print-sysroot` \
    /home/ubuntu/work/riscv/test/a.out

Hello World

詳細ログを出力する方法をいろいろ調査していたのだが、以下のオプションが有益そうだ。

  • -d in_asm:実行したアセンブリコードを出力する。
./qemu-riscv64 -D logfile.log -d in_asm -L `riscv64-unknown-linux-gnu-gcc --print-sysroot` ./a.out
  • logfile.log
----------------
IN: _start
0x0000004000801ee0:  850a              mv              a0,sp
0x0000004000801ee2:  696000ef          jal             ra,1686         # 0x4000802578

----------------
IN: _dl_start
0x0000004000802578:  7139              addi            sp,sp,-64
0x000000400080257a:  f822              sd              s0,48(sp)
0x000000400080257c:  f426              sd              s1,40(sp)
0x000000400080257e:  f04a              sd              s2,32(sp)
0x0000004000802580:  fc06              sd              ra,56(sp)
0x0000004000802582:  ec4e              sd              s3,24(sp)
0x0000004000802584:  e852              sd              s4,16(sp)
0x0000004000802586:  0080              addi            s0,sp,64
0x0000004000802588:  00017617          auipc           a2,94208        # 0x4000819588
0x000000400080258c:  90860613          addi            a2,a2,-1784
0x0000004000802590:  00017717          auipc           a4,94208        # 0x4000819590
0x0000004000802594:  ac073703          ld              a4,-1344(a4)
0x0000004000802598:  621c              ld              a5,0(a2)
...
  • -d cpu:CPUのレジスタ一覧を表示する。
./qemu-riscv64 -D logfile.log -d cpu -L `riscv64-unknown-linux-gnu-gcc --print-sysroot` ./a.out
  • logfile.log
 pc       0000004000801ee0
 x0/zero 0000000000000000 x1/ra 0000000000000000 x2/sp 00000040007ffba0 x3/gp 0000000000000000
 x4/tp 0000000000000000 x5/t0 0000000000000000 x6/t1 0000000000000000 x7/t2 0000000000000000
 x8/s0 0000000000000000 x9/s1 0000000000000000 x10/a0 0000000000000000 x11/a1 0000000000000000
 x12/a2 0000000000000000 x13/a3 0000000000000000 x14/a4 0000000000000000 x15/a5 0000000000000000
 x16/a6 0000000000000000 x17/a7 0000000000000000 x18/s2 0000000000000000 x19/s3 0000000000000000
 x20/s4 0000000000000000 x21/s5 0000000000000000 x22/s6 0000000000000000 x23/s7 0000000000000000
 x24/s8 0000000000000000 x25/s9 0000000000000000 x26/s10 0000000000000000 x27/s11 0000000000000000
 x28/t3 0000000000000000 x29/t4 0000000000000000 x30/t5 0000000000000000 x31/t6 0000000000000000
 pc       0000004000802578
 x0/zero 0000000000000000 x1/ra 0000004000801ee6 x2/sp 00000040007ffba0 x3/gp 0000000000000000
 x4/tp 0000000000000000 x5/t0 0000000000000000 x6/t1 0000000000000000 x7/t2 0000000000000000
 x8/s0 0000000000000000 x9/s1 0000000000000000 x10/a0 00000040007ffba0 x11/a1 0000000000000000
 x12/a2 0000000000000000 x13/a3 0000000000000000 x14/a4 0000000000000000 x15/a5 0000000000000000
 x16/a6 0000000000000000 x17/a7 0000000000000000 x18/s2 0000000000000000 x19/s3 0000000000000000
 x20/s4 0000000000000000 x21/s5 0000000000000000 x22/s6 0000000000000000 x23/s7 0000000000000000
 x24/s8 0000000000000000 x25/s9 0000000000000000 x26/s10 0000000000000000 x27/s11 0000000000000000
 x28/t3 0000000000000000 x29/t4 0000000000000000 x30/t5 0000000000000000 x31/t6 0000000000000000
 pc       00000040008025b2
 x0/zero 0000000000000000 x1/ra 0000004000801ee6 x2/sp 00000040007ffb60 x3/gp 0000000000000000
 x4/tp 0000000000000000 x5/t0 0000000000000000 x6/t1 0000000000000000 x7/t2 0000000000000000
 x8/s0 00000040007ffba0 x9/s1 000000400081a090 x10/a0 00000040007ffba0 x11/a1 0000000000000000
...
  • -d op実行したTBのオペレーションを表示する。
./qemu-riscv64 -D logfile.log -d op -L `riscv64-unknown-linux-gnu-gcc --print-sysroot` ./a.out
OP:
 ld_i32 tmp0,env,$0xfffffffffffffff8
 movi_i32 tmp1,$0x0
 brcond_i32 tmp0,tmp1,lt,$L0

 ---- 0000004000801ee0
 mov_i64 tmp2,x2/sp
 mov_i64 x10/a0,tmp2

 ---- 0000004000801ee2
 movi_i64 x1/ra,$0x4000801ee6
 goto_tb $0x0
 movi_i64 pc,$0x4000802578
 exit_tb $0x7fa758000040
 set_label $L0
 exit_tb $0x7fa758000043

OP:
 ld_i32 tmp0,env,$0xfffffffffffffff8
 movi_i32 tmp1,$0x0
 brcond_i32 tmp0,tmp1,lt,$L0

 ---- 0000004000802578
 mov_i64 tmp2,x2/sp
 movi_i64 tmp3,$0xffffffffffffffc0
...
f:id:msyksphinz:20200711102916p:plain