|
|
|
@ -12,7 +12,7 @@ void state_t::add_csr(reg_t addr, const csr_t_p& csr) |
|
|
|
#define add_supervisor_csr(addr, csr) add_const_ext_csr('S', addr, csr) |
|
|
|
#define add_hypervisor_csr(addr, csr) add_ext_csr('H', addr, csr) |
|
|
|
|
|
|
|
void state_t::add_ireg_proxy(processor_t* const proc, sscsrind_reg_csr_t::sscsrind_reg_csr_t_p ireg) |
|
|
|
void state_t::add_iprio_proxy(processor_t* const proc, sscsrind_reg_csr_t::sscsrind_reg_csr_t_p ireg) |
|
|
|
{ |
|
|
|
// This assumes xlen is always max_xlen, which is true today (see
|
|
|
|
// mstatus_csr_t::unlogged_write()):
|
|
|
|
@ -421,7 +421,8 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa) |
|
|
|
|
|
|
|
sscsrind_reg_csr_t::sscsrind_reg_csr_t_p mireg; |
|
|
|
add_csr(CSR_MIREG, mireg = std::make_shared<sscsrind_reg_csr_t>(proc, CSR_MIREG, miselect)); |
|
|
|
add_ireg_proxy(proc, mireg); |
|
|
|
if (proc->extension_enabled_const(EXT_SMAIA)) |
|
|
|
add_iprio_proxy(proc, mireg); |
|
|
|
const reg_t mireg_csrs[] = { CSR_MIREG2, CSR_MIREG3, CSR_MIREG4, CSR_MIREG5, CSR_MIREG6 }; |
|
|
|
for (auto csr : mireg_csrs) |
|
|
|
add_csr(csr, std::make_shared<sscsrind_reg_csr_t>(proc, csr, miselect)); |
|
|
|
@ -438,7 +439,8 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa) |
|
|
|
add_hypervisor_csr(CSR_VSIREG, vsireg); |
|
|
|
|
|
|
|
auto sireg = std::make_shared<sscsrind_reg_csr_t>(proc, CSR_SIREG, siselect); |
|
|
|
add_ireg_proxy(proc, sireg); |
|
|
|
if (proc->extension_enabled_const(EXT_SSAIA)) |
|
|
|
add_iprio_proxy(proc, sireg); |
|
|
|
add_supervisor_csr(CSR_SIREG, std::make_shared<virtualized_indirect_csr_t>(proc, sireg, vsireg)); |
|
|
|
if (proc->extension_enabled(EXT_SSCCFG) || proc->extension_enabled(EXT_SMCDELEG)) { |
|
|
|
// case CSR_SIREG
|
|
|
|
|