aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAtul Khare <atulkhare@rivosinc.com>2023-06-14 16:12:56 -0700
committerAtul Khare <atulkhare@rivosinc.com>2023-07-26 09:10:31 -0700
commit62178539f8377805705fd6d857338c04b52ef60f (patch)
treebb9003a8f47aa44d28d37e8f96d493c72cd28538
parent1c91fd56ba54bf62c67fea94b80726008895a57a (diff)
downloadriscv-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.cc2
-rw-r--r--riscv/processor.cc4
-rw-r--r--riscv/processor.h2
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;