diff --git a/riscv/processor.cc b/riscv/processor.cc index fce2c5c1..23284b87 100644 --- a/riscv/processor.cc +++ b/riscv/processor.cc @@ -196,7 +196,7 @@ void state_t::reset(processor_t* const proc, reg_t max_isa) // mstatus_csr_t::unlogged_write()): auto xlen = proc->get_isa().get_max_xlen(); - prv = PRV_M; + prv = prev_prv = PRV_M; v = prev_v = false; csrmap[CSR_MISA] = misa = std::make_shared(proc, CSR_MISA, max_isa); mstatus = std::make_shared(proc, CSR_MSTATUS); @@ -717,6 +717,7 @@ reg_t processor_t::legalize_privilege(reg_t prv) void processor_t::set_privilege(reg_t prv) { mmu->flush_tlb(); + state.prev_prv = state.prv; state.prv = legalize_privilege(prv); } diff --git a/riscv/processor.h b/riscv/processor.h index 93e10f35..34354c22 100644 --- a/riscv/processor.h +++ b/riscv/processor.h @@ -83,6 +83,7 @@ struct state_t // control and status registers std::unordered_map csrmap; reg_t prv; // TODO: Can this be an enum instead? + reg_t prev_prv; bool v; bool prev_v; misa_csr_t_p misa;