前回、RISC-Vのパタンセットを動作させるためにecallを変更したのだが、変更が間違っていた。mstatusの下位だけでなく、上位ビットもずらしてしまっていた。これでは動作モード以外に、MMUのモードも変わってしまう。 だからSV32が選択されていたのか。
diff --git a/src/inst_riscv.cpp b/src/inst_riscv.cpp index 672728e..5d8b1b7 100644 --- a/src/inst_riscv.cpp +++ b/src/inst_riscv.cpp @@ -2297,7 +2297,8 @@ void InstEnv::RISCV_INST_ECALL (Word_t inst_hex) UDWord_t curr_mstatus; m_env->CSRRead (SYSREG_ADDR_MSTATUS, &curr_mstatus); - UDWord_t next_mstatus = (curr_mstatus << 3) | (static_cast<UDWord_t>(curr_priv) << 1); + UDWord_t next_mstatus = ((curr_mstatus << 3) | (static_cast<UDWord_t>(curr_priv) << 1)) & 0xffff; + next_mstatus = next_mstatus | (curr_mstatus & 0xffff0000); m_env->CSRWrite (SYSREG_ADDR_MSTATUS, next_mstatus); m_env->SetPC (jmp_addr);
これでほとんどのパタンが動作するようになった。これ以外に、以下のパタンが落ちている。なんか増えてる気がするぞ。困ったなあ。
The following tests FAILED:
1 - rv32mi-p-csr (Failed)
8 - rv32mi-p-timer (Failed)
9 - rv32si-p-csr (Failed)
47 - rv32ui-pm-lrsc (Failed)
125 - rv64mi-p-csr (Failed)
126 - rv64mi-p-dirty (Failed)
130 - rv64mi-p-mcsr (Failed)
134 - rv64mi-p-timer (Failed)
136 - rv64si-p-csr (Failed)
146 - rv64uf-p-fcvt (Failed)
147 - rv64uf-p-fcvt_w (Failed)
148 - rv64uf-p-fdiv (Failed)
159 - rv64uf-pt-fcvt (Failed)
160 - rv64uf-pt-fcvt_w (Failed)
161 - rv64uf-pt-fdiv (Failed)
172 - rv64uf-v-fcvt (Failed)
173 - rv64uf-v-fcvt_w (Failed)
174 - rv64uf-v-fdiv (Failed)
190 - rv64ui-p-amomax_d (Failed)
194 - rv64ui-p-amomin_d (Failed)
230 - rv64ui-pm-lrsc (Failed)
233 - rv64ui-p-mulhsu (Failed)
273 - rv64ui-pt-amomax_d (Failed)
277 - rv64ui-pt-amomin_d (Failed)
315 - rv64ui-pt-mulhsu (Failed)
359 - rv64ui-v-amomax_d (Failed)
363 - rv64ui-v-amomin_d (Failed)
401 - rv64ui-v-mulhsu (Failed)
436 - median (Failed)
443 - spmv (Failed)