Skip to content

Commit acf8dac

Browse files
YenHaoChenbinno
authored andcommitted
Smstateen: Implement *stateen0[59] controlling RV32-only CSRs (v)siph, (v)sieh, hidelegh, and hviph
1 parent ae557fd commit acf8dac

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed

riscv/csr_init.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,9 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
148148
auto sip = std::make_shared<virtualized_csr_t>(proc, nonvirtual_sip, vsip);
149149
if (xlen == 32 && proc->extension_enabled_const(EXT_SSAIA)) {
150150
add_hypervisor_csr(CSR_VSIP, std::make_shared<rv32_low_csr_t>(proc, CSR_VSIP, vsip));
151-
add_hypervisor_csr(CSR_VSIPH, std::make_shared<rv32_high_csr_t>(proc, CSR_VSIPH, vsip));
151+
add_hypervisor_csr(CSR_VSIPH, std::make_shared<aia_rv32_high_csr_t>(proc, CSR_VSIPH, vsip));
152152
add_supervisor_csr(CSR_SIP, std::make_shared<rv32_low_csr_t>(proc, CSR_SIP, sip));
153-
add_supervisor_csr(CSR_SIPH, std::make_shared<rv32_high_csr_t>(proc, CSR_SIPH, sip));
153+
add_supervisor_csr(CSR_SIPH, std::make_shared<aia_rv32_high_csr_t>(proc, CSR_SIPH, sip));
154154
} else {
155155
add_hypervisor_csr(CSR_VSIP, vsip);
156156
add_supervisor_csr(CSR_SIP, sip);
@@ -159,7 +159,7 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
159159
hvip = std::make_shared<hvip_csr_t>(proc, CSR_HVIP, 0);
160160
if (xlen == 32 && proc->extension_enabled_const(EXT_SSAIA)) {
161161
add_hypervisor_csr(CSR_HVIP, std::make_shared<rv32_low_csr_t>(proc, CSR_HVIP, hvip));
162-
add_hypervisor_csr(CSR_HVIPH, std::make_shared<rv32_high_csr_t>(proc, CSR_HVIPH, hvip));
162+
add_hypervisor_csr(CSR_HVIPH, std::make_shared<aia_rv32_high_csr_t>(proc, CSR_HVIPH, hvip));
163163
} else {
164164
add_hypervisor_csr(CSR_HVIP, hvip);
165165
}
@@ -169,9 +169,9 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
169169
auto sie = std::make_shared<virtualized_csr_t>(proc, nonvirtual_sie, vsie);
170170
if (xlen == 32 && proc->extension_enabled_const(EXT_SSAIA)) {
171171
add_hypervisor_csr(CSR_VSIE, std::make_shared<rv32_low_csr_t>(proc, CSR_VSIE, vsie));
172-
add_hypervisor_csr(CSR_VSIEH, std::make_shared<rv32_high_csr_t>(proc, CSR_VSIEH, vsie));
172+
add_hypervisor_csr(CSR_VSIEH, std::make_shared<aia_rv32_high_csr_t>(proc, CSR_VSIEH, vsie));
173173
add_supervisor_csr(CSR_SIE, std::make_shared<rv32_low_csr_t>(proc, CSR_SIE, sie));
174-
add_supervisor_csr(CSR_SIEH, std::make_shared<rv32_high_csr_t>(proc, CSR_SIEH, sie));
174+
add_supervisor_csr(CSR_SIEH, std::make_shared<aia_rv32_high_csr_t>(proc, CSR_SIEH, sie));
175175
} else {
176176
add_hypervisor_csr(CSR_VSIE, vsie);
177177
add_supervisor_csr(CSR_SIE, sie);
@@ -182,7 +182,7 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
182182
mideleg = std::make_shared<mideleg_csr_t>(proc, CSR_MIDELEG);
183183
if (xlen == 32 && proc->extension_enabled_const(EXT_SMAIA)) {
184184
add_supervisor_csr(CSR_MIDELEG, std::make_shared<rv32_low_csr_t>(proc, CSR_MIDELEG, mideleg));
185-
add_supervisor_csr(CSR_MIDELEGH, std::make_shared<rv32_high_csr_t>(proc, CSR_MIDELEGH, mideleg));
185+
add_supervisor_csr(CSR_MIDELEGH, std::make_shared<aia_rv32_high_csr_t>(proc, CSR_MIDELEGH, mideleg));
186186
} else {
187187
add_supervisor_csr(CSR_MIDELEG, mideleg);
188188
}

riscv/csrs.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,22 @@ reg_t rv32_high_csr_t::written_value() const noexcept {
641641
return (orig->written_value() >> 32) & 0xffffffffU;
642642
}
643643

644+
aia_rv32_high_csr_t::aia_rv32_high_csr_t(processor_t* const proc, const reg_t addr, csr_t_p orig):
645+
rv32_high_csr_t(proc, addr, orig) {
646+
}
647+
648+
void aia_rv32_high_csr_t::verify_permissions(insn_t insn, bool write) const {
649+
if (proc->extension_enabled(EXT_SMSTATEEN)) {
650+
if ((state->prv < PRV_M) && !(state->mstateen[0]->read() & MSTATEEN0_AIA))
651+
throw trap_illegal_instruction(insn.bits());
652+
653+
if (state->v && !(state->hstateen[0]->read() & HSTATEEN0_AIA))
654+
throw trap_virtual_instruction(insn.bits());
655+
}
656+
657+
aia_rv32_high_csr_t::verify_permissions(insn, write);
658+
}
659+
644660
// implement class sstatus_csr_t
645661
sstatus_csr_t::sstatus_csr_t(processor_t* const proc, sstatus_proxy_csr_t_p orig, vsstatus_csr_t_p virt):
646662
virtualized_csr_t(proc, orig, virt),

riscv/csrs.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,12 @@ class rv32_high_csr_t: public csr_t {
301301
csr_t_p orig;
302302
};
303303

304+
class aia_rv32_high_csr_t: public rv32_high_csr_t {
305+
public:
306+
aia_rv32_high_csr_t(processor_t* const proc, const reg_t addr, csr_t_p orig);
307+
virtual void verify_permissions(insn_t insn, bool write) const override;
308+
};
309+
304310
// sstatus.sdt is read_only 0 when menvcfg.dte = 0
305311
class sstatus_proxy_csr_t final: public base_status_csr_t {
306312
public:

0 commit comments

Comments
 (0)