Gem5で、RISC-Vのプログラムをシミュレーションするための方法を調査している。まず、簡単なHello Worldプログラムを探して、これをコンパイルする方法を調査する。
まずは、hello_world向けのビルド環境があるので動かしてみることにする。
# gem5/tests/test-progs/hello/src Makefile.arm Makefile.mips Makefile.power Makefile.x86 hello.c
Makefileを確認すると、どうやらDockerファイルを使ってビルド環境をダウンロードしているようだった。
# gem5/tests/test-progs/hello/src/Makefile.arm
all: hello64-static hello32-static
hello64-static: hello.c dockcross-arm64
./dockcross-arm64 bash -c '$$CC hello.c -o hello64-static -static'
hello32-static: hello.c dockcross-armv7
./dockcross-armv7 bash -c '$$CC hello.c -o hello32-static -static'
dockcross-arm64:
docker run --rm dockcross/linux-arm64 > ./dockcross-arm64
chmod +x ./dockcross-arm64
dockcross-armv7:
docker run --rm dockcross/linux-armv7 > ./dockcross-armv7
chmod +x ./dockcross-armv7
clean:
rm -f dockcross* hello64-static hello32-static
dockcross/linux-arm64などのDockerイメージを使用してビルドしている。同じことをRISC-Vでもできないだろうか?
調べてみると、RISC-V向けのDocker環境も用意されているようだ。これは試してみる価値がある。
そこで、以下のようなMakefileを用意してDocker環境を作ってみる。
# gem5/tests/test-progs/hello/src/Makefile.riscv64
all: hello
hello: hello.c dockcross-riscv64
./dockcross-riscv64 bash -c '$$CC hello.c -o hello -static'
dockcross-riscv64:
docker run --rm dockcross/linux-riscv64 > ./dockcross-riscv64
chmod +x ./dockcross-riscv64
clean:
rm -f dockcross* hello
$ make -f Makefile.riscv64
./dockcross-riscv64 bash -c '$CC hello.c -o hello -static'
helloが生成された。これを使ってシミュレーションしてみよう。
../../../../build/RISCV/gem5.opt ../../../../configs/example/se.py --cmd=hello
**** REAL SIMULATION **** build/RISCV/sim/simulate.cc:192: info: Entering event queue @ 0. Starting simulation... build/RISCV/sim/syscall_emul.cc:85: warn: ignoring syscall set_robust_list(...) (further warnings will be suppressed) FATAL: kernel too old build/RISCV/sim/syscall_emul.cc:85: warn: ignoring syscall rt_sigprocmask(...) (further warnings will be suppressed) build/RISCV/sim/syscall_emul.cc:85: warn: ignoring syscall rt_sigaction(...) (further warnings will be suppressed) build/RISCV/sim/debug.cc:89: warn: need to stop all queues zsh: trace trap (core dumped) ../../../../build/RISCV/gem5.opt ../../../../configs/example/se.py --cmd=hello
あれれ、パニックになってしまった。FATAL: kernel too old の原因を探るのは後として、とりあえず実行できるバイナリを作るためにはどうしたらいいのかな?
もう普通にビルドしてみる。
$ riscv64-unknown-elf-gcc hello.c -o hello.bare.riscv $ ../../../../build/RISCV/gem5.opt ../../../../configs/example/se.py --cmd=hello.bare.riscv
これは上手くいったようだ。どうもDockerコンテナを使わない方がいいっぽいなあ。
**** REAL SIMULATION **** build/RISCV/sim/simulate.cc:192: info: Entering event queue @ 0. Starting simulation... Hello world! Exiting @ tick 1371000 because exiting with last active thread context