前回、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)