Skip to content

Commit 75b448e

Browse files
committed
Smstateen: Implement *stateen0[59] controlling RV32-only CSRs (v)siph, (v)sieh, hidelegh, and hviph
1 parent c4a012f commit 75b448e

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed

riscv/csrs.cc

+16
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,22 @@ reg_t rv32_high_csr_t::written_value() const noexcept {
592592
return (orig->written_value() >> 32) & 0xffffffffU;
593593
}
594594

595+
aia_rv32_high_csr_t::aia_rv32_high_csr_t(processor_t* const proc, const reg_t addr, csr_t_p orig):
596+
rv32_high_csr_t(proc, addr, orig) {
597+
}
598+
599+
void aia_rv32_high_csr_t::verify_permissions(insn_t insn, bool write) const {
600+
if (proc->extension_enabled(EXT_SMSTATEEN)) {
601+
if ((state->prv < PRV_M) && !(state->mstateen[0]->read() & MSTATEEN0_AIA))
602+
throw trap_illegal_instruction(insn.bits());
603+
604+
if (state->v && !(state->hstateen[0]->read() & HSTATEEN0_AIA))
605+
throw trap_virtual_instruction(insn.bits());
606+
}
607+
608+
aia_rv32_high_csr_t::verify_permissions(insn, write);
609+
}
610+
595611
// implement class sstatus_csr_t
596612
sstatus_csr_t::sstatus_csr_t(processor_t* const proc, sstatus_proxy_csr_t_p orig, vsstatus_csr_t_p virt):
597613
virtualized_csr_t(proc, orig, virt),

riscv/csrs.h

+6
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,12 @@ class rv32_high_csr_t: public csr_t {
300300
csr_t_p orig;
301301
};
302302

303+
class aia_rv32_high_csr_t: public rv32_high_csr_t {
304+
public:
305+
aia_rv32_high_csr_t(processor_t* const proc, const reg_t addr, csr_t_p orig);
306+
virtual void verify_permissions(insn_t insn, bool write) const override;
307+
};
308+
303309
class sstatus_proxy_csr_t final: public base_status_csr_t {
304310
public:
305311
sstatus_proxy_csr_t(processor_t* const proc, const reg_t addr, mstatus_csr_t_p mstatus);

riscv/processor.cc

+6-6
Original file line numberDiff line numberDiff line change
@@ -353,9 +353,9 @@ void state_t::reset(processor_t* const proc, reg_t max_isa)
353353
auto sip = std::make_shared<virtualized_csr_t>(proc, nonvirtual_sip, vsip);
354354
if (xlen == 32 && proc->extension_enabled_const(EXT_SSAIA)) {
355355
csrmap[CSR_VSIP] = std::make_shared<rv32_low_csr_t>(proc, CSR_VSIP, vsip);
356-
csrmap[CSR_VSIPH] = std::make_shared<rv32_high_csr_t>(proc, CSR_VSIPH, vsip);
356+
csrmap[CSR_VSIPH] = std::make_shared<aia_rv32_high_csr_t>(proc, CSR_VSIPH, vsip);
357357
csrmap[CSR_SIP] = std::make_shared<rv32_low_csr_t>(proc, CSR_SIP, sip);
358-
csrmap[CSR_SIPH] = std::make_shared<rv32_high_csr_t>(proc, CSR_SIPH, sip);
358+
csrmap[CSR_SIPH] = std::make_shared<aia_rv32_high_csr_t>(proc, CSR_SIPH, sip);
359359
} else {
360360
csrmap[CSR_VSIP] = vsip;
361361
csrmap[CSR_SIP] = sip;
@@ -364,7 +364,7 @@ void state_t::reset(processor_t* const proc, reg_t max_isa)
364364
hvip = std::make_shared<hvip_csr_t>(proc, CSR_HVIP, 0);
365365
if (xlen == 32 && proc->extension_enabled_const(EXT_SSAIA)) {
366366
csrmap[CSR_HVIP] = std::make_shared<rv32_low_csr_t>(proc, CSR_HVIP, hvip);
367-
csrmap[CSR_HVIPH] = std::make_shared<rv32_high_csr_t>(proc, CSR_HVIPH, hvip);
367+
csrmap[CSR_HVIPH] = std::make_shared<aia_rv32_high_csr_t>(proc, CSR_HVIPH, hvip);
368368
} else {
369369
csrmap[CSR_HVIP] = hvip;
370370
}
@@ -374,9 +374,9 @@ void state_t::reset(processor_t* const proc, reg_t max_isa)
374374
auto sie = std::make_shared<virtualized_csr_t>(proc, nonvirtual_sie, vsie);
375375
if (xlen == 32 && proc->extension_enabled_const(EXT_SSAIA)) {
376376
csrmap[CSR_VSIE] = std::make_shared<rv32_low_csr_t>(proc, CSR_VSIE, vsie);
377-
csrmap[CSR_VSIEH] = std::make_shared<rv32_high_csr_t>(proc, CSR_VSIEH, vsie);
377+
csrmap[CSR_VSIEH] = std::make_shared<aia_rv32_high_csr_t>(proc, CSR_VSIEH, vsie);
378378
csrmap[CSR_SIE] = std::make_shared<rv32_low_csr_t>(proc, CSR_SIE, sie);
379-
csrmap[CSR_SIEH] = std::make_shared<rv32_high_csr_t>(proc, CSR_SIEH, sie);
379+
csrmap[CSR_SIEH] = std::make_shared<aia_rv32_high_csr_t>(proc, CSR_SIEH, sie);
380380
} else {
381381
csrmap[CSR_VSIE] = vsie;
382382
csrmap[CSR_SIE] = sie;
@@ -427,7 +427,7 @@ void state_t::reset(processor_t* const proc, reg_t max_isa)
427427
hideleg = std::make_shared<hideleg_csr_t>(proc, CSR_HIDELEG, mideleg);
428428
if (xlen == 32 && proc->extension_enabled_const(EXT_SSAIA)) {
429429
csrmap[CSR_HIDELEG] = std::make_shared<rv32_low_csr_t>(proc, CSR_HIDELEG, hideleg);
430-
csrmap[CSR_HIDELEGH] = std::make_shared<rv32_high_csr_t>(proc, CSR_HIDELEGH, hideleg);
430+
csrmap[CSR_HIDELEGH] = std::make_shared<aia_rv32_high_csr_t>(proc, CSR_HIDELEGH, hideleg);
431431
} else {
432432
csrmap[CSR_HIDELEG] = hideleg;
433433
}

0 commit comments

Comments
 (0)