RISC-Vのriscv-testsの最後のテスト判定は、
000024f0 <fail>: 24f0: 0ff0000f fence 24f4: 000e0863 beqz t3,2504 <fail+0x14> 24f8: 001e1e13 slli t3,t3,0x1 24fc: 001e6e13 ori t3,t3,1 2500: 51ee1073 csrw tohost,t3 2504: 0000006f j 2504 <fail+0x14> 00002508 <pass>: 2508: 0ff0000f fence 250c: 51e0d073 csrwi tohost,1 2510: 0000006f j 2510 <pass+0x8>
failラベルに到着すると、t3が0ならば無限ループ (そもそもt3は問題番号が入っているので、通常系ではt3は0にならない) 問題番号を左1ビットシフトし、最下位ビットに1を挿入する(これは何故だろう?)。 その後に、tohost (これはシステム命令仕様書によるとホストに転送するためのレジスタらしい) にその値をセットする。
それ以外(つまり、全てのテストがパスした)場合は、tohost=1として1をホストに返す。
tohostの仕様が良く分からないのだが、これは最下位ビットを常に1にしなければならないのかな?
githubのソースを探検したのだが、良く分かなかった...
benchmarks/common/syscalls.c に以下の記述があった。
static void tohost_exit(int code) { write_csr(tohost, (code << 1) | 1); while (1); }
なんでだろうね?