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 ...