RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行してみようと思う。
まずは簡単にブートローダから。これはELF形式で格納されているので簡単に実行することができる。
しかし、ロード直後に落ちてしまった。あれえ、なんでこんなところで落ちるんだ?
Set ToHost Addr 80018608 initial_spike opening /home/msyksphinz/work/riscv/linux/riscv64-linux/output/images/fw_jump.elf ... spike iss done 25650 : 0 : PC=[0000000080000000] (M,00,01) 00050433 add s0, a0, zero GPR[08](32) <= 0000000000000000 25650 : 1 : PC=[0000000080000004] (M,00,02) 000584b3 add s1, a1, zero ========================================== Wrong GPR[09](64): RTL = 0000000000000000, ISS = 0000000000001020 ========================================== =============================== SIMULATION FINISH : FAIL (CODE=100) ===============================
よくよく見てみると、RTL環境では最初のBootROM (0x1000)を無視しているのだった。これにより、x10とx11にあらかじめ設定された値が使用できなくなっている(x11はdtbの場所を示しているアドレスだった)。
$ sed 's/(/DASM(/g' sim_rv64imc_standard/linux/spike.log | spike-dasm core 0: 3 0x0000000000001000 auipc t0, 0x0 x 5 0x0000000000001000 core 0: 3 0x0000000000001004 addi a1, t0, 32 x11 0x0000000000001020 core 0: 3 0x0000000000001008 csrr a0, mhartid x10 0x0000000000000000 core 0: 3 0x000000000000100c ld t0, 24(t0) x 5 0x0000000080000000 mem 0x0000000000001018 core 0: 3 0x0000000000001010 jr t0 core 0: 3 0x0000000080000000 add s0, a0, zero x 8 0x0000000000000000 core 0: 3 0x0000000080000004 add s1, a1, zero x 9 0x0000000000001020
fw_jump.elfではこの情報を実際に使用しているためFailとなっているようだった。これは、RTL側もBootROMをまじめに用意しなければならない。シミュレーション環境の変更が必要だ...