Skip to content

Commit

Permalink
Smstateen: Implement *stateen0[59] controlling RV32-only CSRs (v)siph…
Browse files Browse the repository at this point in the history
…, (v)sieh, hidelegh, and hviph
  • Loading branch information
YenHaoChen committed Apr 11, 2024
1 parent b10f98e commit a9a619e
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 6 deletions.
16 changes: 16 additions & 0 deletions riscv/csrs.cc
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,22 @@ reg_t rv32_high_csr_t::written_value() const noexcept {
return (orig->written_value() >> 32) & 0xffffffffU;
}

aia_rv32_high_csr_t::aia_rv32_high_csr_t(processor_t* const proc, const reg_t addr, csr_t_p orig):
rv32_high_csr_t(proc, addr, orig) {
}

void aia_rv32_high_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());
}

aia_rv32_high_csr_t::verify_permissions(insn, write);
}

// implement class sstatus_csr_t
sstatus_csr_t::sstatus_csr_t(processor_t* const proc, sstatus_proxy_csr_t_p orig, vsstatus_csr_t_p virt):
virtualized_csr_t(proc, orig, virt),
Expand Down
6 changes: 6 additions & 0 deletions riscv/csrs.h
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,12 @@ class rv32_high_csr_t: public csr_t {
csr_t_p orig;
};

class aia_rv32_high_csr_t: public rv32_high_csr_t {
public:
aia_rv32_high_csr_t(processor_t* const proc, const reg_t addr, csr_t_p orig);
virtual void verify_permissions(insn_t insn, bool write) const override;
};

class sstatus_proxy_csr_t final: public base_status_csr_t {
public:
sstatus_proxy_csr_t(processor_t* const proc, const reg_t addr, mstatus_csr_t_p mstatus);
Expand Down
12 changes: 6 additions & 6 deletions riscv/processor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -404,9 +404,9 @@ void state_t::reset(processor_t* const proc, reg_t max_isa)
auto sip = std::make_shared<virtualized_csr_t>(proc, nonvirtual_sip, vsip);
if (xlen == 32 && proc->extension_enabled_const(EXT_SSAIA)) {
csrmap[CSR_VSIP] = std::make_shared<rv32_low_csr_t>(proc, CSR_VSIP, vsip);
csrmap[CSR_VSIPH] = std::make_shared<rv32_high_csr_t>(proc, CSR_VSIPH, vsip);
csrmap[CSR_VSIPH] = std::make_shared<aia_rv32_high_csr_t>(proc, CSR_VSIPH, vsip);
csrmap[CSR_SIP] = std::make_shared<rv32_low_csr_t>(proc, CSR_SIP, sip);
csrmap[CSR_SIPH] = std::make_shared<rv32_high_csr_t>(proc, CSR_SIPH, sip);
csrmap[CSR_SIPH] = std::make_shared<aia_rv32_high_csr_t>(proc, CSR_SIPH, sip);
} else {
csrmap[CSR_VSIP] = vsip;
csrmap[CSR_SIP] = sip;
Expand All @@ -415,7 +415,7 @@ void state_t::reset(processor_t* const proc, reg_t max_isa)
hvip = std::make_shared<hvip_csr_t>(proc, CSR_HVIP, 0);
if (xlen == 32 && proc->extension_enabled_const(EXT_SSAIA)) {
csrmap[CSR_HVIP] = std::make_shared<rv32_low_csr_t>(proc, CSR_HVIP, hvip);
csrmap[CSR_HVIPH] = std::make_shared<rv32_high_csr_t>(proc, CSR_HVIPH, hvip);
csrmap[CSR_HVIPH] = std::make_shared<aia_rv32_high_csr_t>(proc, CSR_HVIPH, hvip);
} else {
csrmap[CSR_HVIP] = hvip;
}
Expand All @@ -425,9 +425,9 @@ void state_t::reset(processor_t* const proc, reg_t max_isa)
auto sie = std::make_shared<virtualized_csr_t>(proc, nonvirtual_sie, vsie);
if (xlen == 32 && proc->extension_enabled_const(EXT_SSAIA)) {
csrmap[CSR_VSIE] = std::make_shared<rv32_low_csr_t>(proc, CSR_VSIE, vsie);
csrmap[CSR_VSIEH] = std::make_shared<rv32_high_csr_t>(proc, CSR_VSIEH, vsie);
csrmap[CSR_VSIEH] = std::make_shared<aia_rv32_high_csr_t>(proc, CSR_VSIEH, vsie);
csrmap[CSR_SIE] = std::make_shared<rv32_low_csr_t>(proc, CSR_SIE, sie);
csrmap[CSR_SIEH] = std::make_shared<rv32_high_csr_t>(proc, CSR_SIEH, sie);
csrmap[CSR_SIEH] = std::make_shared<aia_rv32_high_csr_t>(proc, CSR_SIEH, sie);
} else {
csrmap[CSR_VSIE] = vsie;
csrmap[CSR_SIE] = sie;
Expand Down Expand Up @@ -478,7 +478,7 @@ void state_t::reset(processor_t* const proc, reg_t max_isa)
hideleg = std::make_shared<hideleg_csr_t>(proc, CSR_HIDELEG, mideleg);
if (xlen == 32 && proc->extension_enabled_const(EXT_SSAIA)) {
csrmap[CSR_HIDELEG] = std::make_shared<rv32_low_csr_t>(proc, CSR_HIDELEG, hideleg);
csrmap[CSR_HIDELEGH] = std::make_shared<rv32_high_csr_t>(proc, CSR_HIDELEGH, hideleg);
csrmap[CSR_HIDELEGH] = std::make_shared<aia_rv32_high_csr_t>(proc, CSR_HIDELEGH, hideleg);
} else {
csrmap[CSR_HIDELEG] = hideleg;
}
Expand Down

0 comments on commit a9a619e

Please sign in to comment.