ずっと試してみたかった、Tenstorrentが公開したRISC-V検証パタンである riscv_arch_tests
を試してみることにした。
自作CPUに適用して、さらなるバグが発見されることを期待している。
テストパタンを試しているが、どうも.os_data
の扱い方がよく分からない。
.os_data
のセクションがそれぞれのテストパタンで違うので、それぞれでSpikeに違う設定をしなければならなくなっている。
結果的にSpikeを立ち上げるコマンドがかなり長くなってしまった。
argv[arg_max++] = "-m0x80000000:0x10000," \ "0x726000:0x1000," \ "0x28cfb4d00:0x1000," \ "0x9899ca3400:0x1000," \ "0x1ce9e93c00:0x1000," \ "0x13e316afc00:0x1000," \ "0x129000:0x1000," \ "0x1c0058:0x1000," \ "0x4c7000:0x1000," \ "0x1146018:0x1000," \ "0x3d16000:0x1000," \ "0x8a4f1d0:0x1000," \ "0xce68008:0x1000," \ "0x43755000:0x1000," \ "0x80030328:0x1000," \ "0x6b1e47200:0x1000," \ "0x192c79b108:0x1000," \ "0x281ee84058:0x1000," \ "0x13e316afc00:0x1000," \ "0x00000298b2df3010:0x1000," \ "0x00000466799200b0:0x1000," \ "0x00001c0bff9f5010:0x1000," \ "0x0000000123612c00:0x1000," \ "0x00000000001f8c00:0x1000," \
それでも、どうしてもSpikeでロードできないケースがある。
spike ../tests/riscv_arch_tests/riscv_tests/rv_c/rv_c/rv_c_3
spike ../tests/riscv_arch_tests/riscv_tests/rv_c/rv_c/rv_c_3 Access exception occurred while loading payload ../tests/riscv_arch_tests/riscv_tests/rv_c/rv_c/rv_c_3: Memory address 0x1f8000 is invalid
このヘッダは何のために使われているんだ?
Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flags Align LOPROC+0x3 0x000000000000507c 0x0000000000000000 0x0000000000000000 0x00000000000000b5 0x0000000000000000 R 0x1 LOAD 0x0000000000000000 0x00000000001f8000 0x00000000001f8000 0x0000000000000c30 0x0000000000000c30 RW 0x1000 LOAD 0x0000000000001000 0x000000000027e000 0x000000000027e000 0x0000000000000068 0x0000000000000068 RW 0x1000 LOAD 0x0000000000002000 0x000000000633a000 0x000000000633a000 0x000000000000004c 0x000000000000004c RW 0x1000 LOAD 0x0000000000003000 0x0000000080000000 0x0000000080000000 0x00000000000002ec 0x00000000000002ec R E 0x1000 LOAD 0x0000000000004000 0x0000000080002000 0x0000000080002000 0x00000000000004a0 0x00000000000004a0 RW 0x1000 LOAD 0x0000000000005000 0x000025e3c625e000 0x000025e3c625e000 0x000000000000007c 0x000000000000007c RW 0x1000
とりあえず必要そうなヘッダの情報を全部取り出して1つのファイルにして、Spike呼び出し時にこれを読み込むようにしてみた。
for rvi in `find . -name "rv*" | grep -v \.list`; do riscv64-unknown-elf-readelf -l ${rvi} | grep LOAD | sed 's/ */ /g'; done | cut -f5 -d' ' | sort | uniq
テストは動作するようになったが、今度はハードウェア側のTLBを書き換えないと変な場所に書き込みをしてしまう。これは困ったなあ...
3835 : 178 : PC=[0000000080002030] (M,14,01) 00c11113 slli sp, sp, 12 GPR[02](24) <= 000000012f1e3000 3836 : 179 : PC=[0000000080002034] (M,15,01) 12f10113 addi sp, sp, 303 GPR[02](36) <= 000000012f1e312f 3841 : 180 : PC=[0000000080002038] (M,00,01) 00d11113 slli sp, sp, 13 GPR[02](25) <= 000025e3c625e000 3841 : RTL(0,2) Exception Cause = Store Access Fault(7) PC=00008000203c, Inst=0000da9e, c.swsp t2, 116(sp) ========================================== 3841 : Exception Happened(0,2) : Cause = Store Access Fault(7) ========================================== 3861 : RTL(4,1) Exception Cause = CSR Update Flush(27) PC=0000800000d0, Inst=342020f3, csrr ra, mcause 3861 : 181 : PC=[00000000800000d0] (M,04,01) 342020f3 csrr ra, mcause MW4(0x000025e3c625e074)=>0000000004e01ba4 ========================================== Wrong PC: RTL = 00000000800000d0, ISS = 000000008000203c ==========================================