Browse Source

register indirection CSRs 'iprio0~iprio15' when Smaia/Ssaia supported

pull/2191/head
steven 5 months ago
parent
commit
6aae741fd7
  1. 8
      riscv/csr_init.cc
  2. 2
      riscv/processor.h

8
riscv/csr_init.cc

@ -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

2
riscv/processor.h

@ -77,7 +77,7 @@ typedef std::vector<std::tuple<reg_t, uint64_t, uint8_t>> commit_log_mem_t;
// architectural state of a RISC-V hart
struct state_t
{
void add_ireg_proxy(processor_t* const proc, sscsrind_reg_csr_t::sscsrind_reg_csr_t_p ireg);
void add_iprio_proxy(processor_t* const proc, sscsrind_reg_csr_t::sscsrind_reg_csr_t_p ireg);
void reset(processor_t* const proc, reg_t max_isa);
void add_csr(reg_t addr, const csr_t_p& csr);

Loading…
Cancel
Save