diff options
author | Atul Khare <atulkhare@rivosinc.com> | 2023-06-14 16:12:56 -0700 |
---|---|---|
committer | Atul Khare <atulkhare@rivosinc.com> | 2023-07-26 09:10:31 -0700 |
commit | 62178539f8377805705fd6d857338c04b52ef60f (patch) | |
tree | bb9003a8f47aa44d28d37e8f96d493c72cd28538 | |
parent | 1c91fd56ba54bf62c67fea94b80726008895a57a (diff) | |
download | riscv-isa-sim-62178539f8377805705fd6d857338c04b52ef60f.zip riscv-isa-sim-62178539f8377805705fd6d857338c04b52ef60f.tar.gz riscv-isa-sim-62178539f8377805705fd6d857338c04b52ef60f.tar.bz2 |
Add prv_changed / v_changed fields to state
This tracks whether the privilege / virtual mode was changed by the
execution of the current instruction.
-rw-r--r-- | riscv/execute.cc | 2 | ||||
-rw-r--r-- | riscv/processor.cc | 4 | ||||
-rw-r--r-- | riscv/processor.h | 2 |
3 files changed, 8 insertions, 0 deletions
diff --git a/riscv/execute.cc b/riscv/execute.cc index 591090b..4f5860b 100644 --- a/riscv/execute.cc +++ b/riscv/execute.cc @@ -226,6 +226,8 @@ void processor_t::step(size_t n) size_t instret = 0; reg_t pc = state.pc; mmu_t* _mmu = mmu; + state.prv_changed = false; + state.v_changed = false; #define advance_pc() \ if (unlikely(invalid_pc(pc))) { \ diff --git a/riscv/processor.cc b/riscv/processor.cc index ff64f5a..3126433 100644 --- a/riscv/processor.cc +++ b/riscv/processor.cc @@ -203,6 +203,8 @@ void state_t::reset(processor_t* const proc, reg_t max_isa) prv = prev_prv = PRV_M; v = prev_v = false; + prv_changed = false; + v_changed = false; csrmap[CSR_MISA] = misa = std::make_shared<misa_csr_t>(proc, CSR_MISA, max_isa); mstatus = std::make_shared<mstatus_csr_t>(proc, CSR_MSTATUS); @@ -766,6 +768,8 @@ void processor_t::set_privilege(reg_t prv, bool virt) state.prev_v = state.v; state.prv = legalize_privilege(prv); state.v = virt && state.prv != PRV_M; + state.prv_changed = state.prv != state.prev_prv; + state.v_changed = state.v != state.prev_v; } const char* processor_t::get_privilege_string() diff --git a/riscv/processor.h b/riscv/processor.h index 1b00808..a2e4286 100644 --- a/riscv/processor.h +++ b/riscv/processor.h @@ -84,6 +84,8 @@ struct state_t std::unordered_map<reg_t, csr_t_p> csrmap; reg_t prv; // TODO: Can this be an enum instead? reg_t prev_prv; + bool prv_changed; + bool v_changed; bool v; bool prev_v; misa_csr_t_p misa; |