Skip to content

Commit a10dfd0

Browse files
committed
Add extension_t csrs in reset(), not register_extension()
This addresses one issue raised in #1863. register_extension() is only called once, while reset() is called whenever the processor_t is reset. This ensures that extension_t state, including CSRs, is always reset with reset()
1 parent 4156e07 commit a10dfd0

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

riscv/processor.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,11 @@ void processor_t::reset()
197197
put_csr(CSR_PMPCFG0, PMP_R | PMP_W | PMP_X | PMP_NAPOT);
198198
}
199199

200-
for (auto e : custom_extensions) // reset any extensions
200+
for (auto e : custom_extensions) { // reset any extensions
201+
for (auto &csr: e.second->get_csrs(*this))
202+
state.add_csr(csr->address, csr);
201203
e.second->reset();
204+
}
202205

203206
if (sim)
204207
sim->proc_reset(id);
@@ -711,8 +714,6 @@ void processor_t::register_extension(extension_t *x) {
711714
fprintf(stderr, "extensions must have unique names (got two named \"%s\"!)\n", x->name());
712715
abort();
713716
}
714-
for (auto &csr: x->get_csrs(*this))
715-
state.add_csr(csr->address, csr);
716717
x->set_processor(this);
717718
}
718719

0 commit comments

Comments
 (0)