Skip to content

Commit ae557fd

Browse files
YenHaoChenbinno
authored andcommitted
Smstateen: Implement *stateen0[59] controlling CSR stopi
1 parent 9bee68e commit ae557fd

File tree

3 files changed

+14
-1
lines changed

3 files changed

+14
-1
lines changed

riscv/csr_init.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
529529
vstopi = std::make_shared<vstopi_csr_t>(proc, CSR_VSTOPI);
530530
if (proc->extension_enabled_const(EXT_SSAIA)) { // Included by EXT_SMAIA
531531
csr_t_p nonvirtual_stopi = std::make_shared<nonvirtual_stopi_csr_t>(proc, CSR_STOPI);
532-
add_supervisor_csr(CSR_STOPI, std::make_shared<virtualized_csr_t>(proc, nonvirtual_stopi, vstopi));
532+
add_supervisor_csr(CSR_STOPI, std::make_shared<virtualized_with_special_permission_csr_t>(proc, nonvirtual_stopi, vstopi));
533533
add_supervisor_csr(CSR_STOPEI, std::make_shared<inaccessible_csr_t>(proc, CSR_STOPEI));
534534
auto hvien = std::make_shared<aia_csr_t>(proc, CSR_HVIEN, 0, 0);
535535
auto hviprio1 = std::make_shared<aia_csr_t>(proc, CSR_HVIPRIO1, 0, 0);

riscv/csrs.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2069,6 +2069,18 @@ nonvirtual_stopi_csr_t::nonvirtual_stopi_csr_t(processor_t* const proc, const re
20692069
csr_t(proc, addr) {
20702070
}
20712071

2072+
void nonvirtual_stopi_csr_t::verify_permissions(insn_t insn, bool write) const {
2073+
if (proc->extension_enabled(EXT_SMSTATEEN)) {
2074+
if ((state->prv < PRV_M) && !(state->mstateen[0]->read() & MSTATEEN0_AIA))
2075+
throw trap_illegal_instruction(insn.bits());
2076+
2077+
if (state->v && !(state->hstateen[0]->read() & HSTATEEN0_AIA))
2078+
throw trap_virtual_instruction(insn.bits());
2079+
}
2080+
2081+
csr_t::verify_permissions(insn, write);
2082+
}
2083+
20722084
reg_t nonvirtual_stopi_csr_t::read() const noexcept {
20732085
reg_t enabled_interrupts = state->nonvirtual_sip->read() & state->nonvirtual_sie->read() & ~state->hideleg->read();
20742086
if (!enabled_interrupts)

riscv/csrs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -953,6 +953,7 @@ typedef std::shared_ptr<mvip_csr_t> mvip_csr_t_p;
953953
class nonvirtual_stopi_csr_t: public csr_t {
954954
public:
955955
nonvirtual_stopi_csr_t(processor_t* const proc, const reg_t addr);
956+
virtual void verify_permissions(insn_t insn, bool write) const override;
956957
virtual reg_t read() const noexcept override;
957958
protected:
958959
bool unlogged_write(const reg_t val) noexcept override;

0 commit comments

Comments
 (0)