Skip to content

Commit

Permalink
Smstateen: Implement *stateen0[59] controlling CSRs hvien(h), hvictl,…
Browse files Browse the repository at this point in the history
… hviprio[12](h), and supervisor-level iprio array
  • Loading branch information
YenHaoChen committed May 10, 2024
1 parent 365b10b commit 4bb4448
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 5 deletions.
16 changes: 16 additions & 0 deletions riscv/csrs.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1964,3 +1964,19 @@ void siselect_csr_t::verify_permissions(insn_t insn, bool write) const {

basic_csr_t::verify_permissions(insn, write);
}

aia_csr_t::aia_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, const reg_t init):
masked_csr_t(proc, addr, mask, init) {
}

void aia_csr_t::verify_permissions(insn_t insn, bool write) const {
if (proc->extension_enabled(EXT_SMSTATEEN)) {
if ((state->prv < PRV_M) && !(state->mstateen[0]->read() & MSTATEEN0_AIA))
throw trap_illegal_instruction(insn.bits());

if (state->v && !(state->hstateen[0]->read() & HSTATEEN0_AIA))
throw trap_virtual_instruction(insn.bits());
}

basic_csr_t::verify_permissions(insn, write);
}
6 changes: 6 additions & 0 deletions riscv/csrs.h
Original file line number Diff line number Diff line change
Expand Up @@ -954,4 +954,10 @@ class siselect_csr_t: public basic_csr_t {
siselect_csr_t(processor_t* const proc, const reg_t addr, const reg_t init);
virtual void verify_permissions(insn_t insn, bool write) const override;
};

class aia_csr_t: public masked_csr_t {
public:
aia_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, const reg_t init);
virtual void verify_permissions(insn_t insn, bool write) const override;
};
#endif
10 changes: 5 additions & 5 deletions riscv/processor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ void state_t::add_ireg_proxy(processor_t* const proc, sscsrind_reg_csr_t::sscsri

const reg_t iprio0_addr = 0x30;
for (int i=0; i<16; i+=2) {
csr_t_p iprio = std::make_shared<const_csr_t>(proc, iprio0_addr + i, 0);
csr_t_p iprio = std::make_shared<aia_csr_t>(proc, iprio0_addr + i, 0, 0);
if (xlen == 32) {
ireg->add_ireg_proxy(iprio0_addr + i, std::make_shared<rv32_low_csr_t>(proc, iprio0_addr + i, iprio));
ireg->add_ireg_proxy(iprio0_addr + i + 1, std::make_shared<rv32_high_csr_t>(proc, iprio0_addr + i + 1, iprio));
Expand Down Expand Up @@ -682,15 +682,15 @@ void state_t::reset(processor_t* const proc, reg_t max_isa)
}
}

hvictl = std::make_shared<masked_csr_t>(proc, CSR_HVICTL, HVICTL_VTI | HVICTL_IID | HVICTL_DPR | HVICTL_IPRIOM | HVICTL_IPRIO, 0);
hvictl = std::make_shared<aia_csr_t>(proc, CSR_HVICTL, HVICTL_VTI | HVICTL_IID | HVICTL_DPR | HVICTL_IPRIOM | HVICTL_IPRIO, 0);
vstopi = csrmap[CSR_VSTOPI] = std::make_shared<vstopi_csr_t>(proc, CSR_VSTOPI);
if (proc->extension_enabled_const(EXT_SSAIA)) { // Included by EXT_SMAIA
csr_t_p nonvirtual_stopi = std::make_shared<nonvirtual_stopi_csr_t>(proc, CSR_STOPI);
csrmap[CSR_STOPI] = std::make_shared<virtualized_csr_t>(proc, nonvirtual_stopi, vstopi);
csrmap[CSR_STOPEI] = std::make_shared<inaccessible_csr_t>(proc, CSR_STOPEI);
auto hvien = std::make_shared<const_csr_t>(proc, CSR_HVIEN, 0);
auto hviprio1 = std::make_shared<const_csr_t>(proc, CSR_HVIPRIO1, 0);
auto hviprio2 = std::make_shared<const_csr_t>(proc, CSR_HVIPRIO2, 0);
auto hvien = std::make_shared<aia_csr_t>(proc, CSR_HVIEN, 0, 0);
auto hviprio1 = std::make_shared<aia_csr_t>(proc, CSR_HVIPRIO1, 0, 0);
auto hviprio2 = std::make_shared<aia_csr_t>(proc, CSR_HVIPRIO2, 0, 0);
if (xlen == 32) {
csrmap[CSR_HVIEN] = std::make_shared<rv32_low_csr_t>(proc, CSR_HVIEN, hvien);
csrmap[CSR_HVIENH] = std::make_shared<rv32_high_csr_t>(proc, CSR_HVIENH, hvien);
Expand Down

0 comments on commit 4bb4448

Please sign in to comment.