Skip to content

Commit 2db2820

Browse files
committed
Add const csr hedelegh and masks for stateen.priv113/stateen.context
1 parent a8e9876 commit 2db2820

File tree

3 files changed

+30
-2
lines changed

3 files changed

+30
-2
lines changed

riscv/csr_init.cc

Lines changed: 7 additions & 2 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) {
@@ -285,8 +287,11 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
285287
(proc->extension_enabled(EXT_ZCMT) ? SSTATEEN0_JVT : 0) |
286288
SSTATEEN0_CS;
287289
const reg_t hstateen0_mask = sstateen0_mask | HSTATEEN0_SENVCFG | HSTATEEN_SSTATEEN |
288-
(proc->extension_enabled(EXT_SSCSRIND) ? HSTATEEN0_CSRIND : 0);
289-
const reg_t mstateen0_mask = hstateen0_mask | (proc->extension_enabled(EXT_SSQOSID) ? MSTATEEN0_PRIV114 : 0);
290+
(proc->extension_enabled(EXT_SSCSRIND) ? HSTATEEN0_CSRIND : 0) |
291+
(proc->get_cfg().trigger_count > 0 ? HSTATEEN0_SCONTEXT : 0);
292+
constexpr reg_t MSTATEEN0_PRIV113 = 0x0100000000000000;
293+
const reg_t mstateen0_mask = hstateen0_mask | MSTATEEN0_PRIV113 |
294+
(proc->extension_enabled(EXT_SSQOSID) ? MSTATEEN0_PRIV114 : 0);
290295
for (int i = 0; i < 4; i++) {
291296
const reg_t mstateen_mask = i == 0 ? mstateen0_mask : MSTATEEN_HSTATEEN;
292297
mstateen[i] = std::make_shared<masked_csr_t>(proc, CSR_MSTATEEN0 + i, mstateen_mask, 0);

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)