Skip to content

Commit 65b1d3f

Browse files
committed
Add const csr hedelegh
1 parent a8e9876 commit 65b1d3f

File tree

3 files changed

+25
-0
lines changed

3 files changed

+25
-0
lines changed

riscv/csr_init.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
179179
(1 << CAUSE_SOFTWARE_CHECK_FAULT) |
180180
(1 << CAUSE_HARDWARE_ERROR_FAULT);
181181
add_hypervisor_csr(CSR_HEDELEG, hedeleg = std::make_shared<masked_csr_t>(proc, CSR_HEDELEG, hedeleg_mask, 0));
182+
constexpr unsigned CSR_HEDELEGH = 0x612;
183+
add_hypervisor_csr(CSR_HEDELEGH, std::make_shared<hedelegh_csr_t>(proc, CSR_HEDELEGH, 0));
182184
add_hypervisor_csr(CSR_HCOUNTEREN, hcounteren = std::make_shared<masked_csr_t>(proc, CSR_HCOUNTEREN, counteren_mask, 0));
183185
htimedelta = std::make_shared<basic_csr_t>(proc, CSR_HTIMEDELTA, 0);
184186
if (xlen == 32) {

riscv/csrs.cc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1978,3 +1978,18 @@ void hcontext_csr_t::verify_permissions(insn_t insn, bool write) const {
19781978
masked_csr_t::verify_permissions(insn, write);
19791979

19801980
}
1981+
1982+
hedelegh_csr_t::hedelegh_csr_t(processor_t* const proc, const reg_t addr, const reg_t init) :
1983+
const_csr_t(proc, addr, init){};
1984+
void hedelegh_csr_t::verify_permissions(insn_t insn, bool write) const {
1985+
if (proc->get_const_xlen() != 32)
1986+
throw trap_illegal_instruction(insn.bits());
1987+
if (proc->extension_enabled(EXT_SMSTATEEN)) {
1988+
if ((state->prv < PRV_M) &&
1989+
!(state->mstateen[0]->read() & MSTATEEN0_PRIV113))
1990+
throw trap_illegal_instruction(insn.bits());
1991+
1992+
}
1993+
const_csr_t::verify_permissions(insn, write);
1994+
1995+
}

riscv/csrs.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,4 +924,12 @@ class hcontext_csr_t: public masked_csr_t {
924924
hcontext_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, const reg_t init);
925925
virtual void verify_permissions(insn_t insn, bool write) const override;
926926
};
927+
928+
class hedelegh_csr_t: public const_csr_t {
929+
public:
930+
hedelegh_csr_t(processor_t* const proc, const reg_t addr, const reg_t init);
931+
virtual void verify_permissions(insn_t insn, bool write) const override;
932+
private:
933+
static constexpr reg_t MSTATEEN0_PRIV113 = 0x0100000000000000;
934+
};
927935
#endif

0 commit comments

Comments
 (0)