Skip to content

Commit 7d49ba7

Browse files
authored
Merge pull request #2163 from chihminchao/fix-double-trap
Fix double trap
2 parents 46ef2ed + 6d6cc2c commit 7d49ba7

File tree

3 files changed

+27
-23
lines changed

3 files changed

+27
-23
lines changed

riscv/csr_init.cc

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,25 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
224224
} else {
225225
add_hypervisor_csr(CSR_HIDELEG, hideleg);
226226
}
227+
228+
const reg_t menvcfg_mask = (proc->extension_enabled(EXT_ZICBOM) ? MENVCFG_CBCFE | MENVCFG_CBIE : 0) |
229+
(proc->extension_enabled(EXT_ZICBOZ) ? MENVCFG_CBZE : 0) |
230+
(proc->extension_enabled(EXT_SMNPM) ? MENVCFG_PMM : 0) |
231+
(proc->extension_enabled(EXT_SVADU) ? MENVCFG_ADUE: 0) |
232+
(proc->extension_enabled(EXT_SVPBMT) ? MENVCFG_PBMTE : 0) |
233+
(proc->extension_enabled(EXT_SSTC) ? MENVCFG_STCE : 0) |
234+
(proc->extension_enabled(EXT_ZICFILP) ? MENVCFG_LPE : 0) |
235+
(proc->extension_enabled(EXT_ZICFISS) ? MENVCFG_SSE : 0) |
236+
(proc->extension_enabled(EXT_SSDBLTRP) ? MENVCFG_DTE : 0)|
237+
(proc->extension_enabled(EXT_SMCDELEG) ? MENVCFG_CDE : 0);
238+
menvcfg = std::make_shared<envcfg_csr_t>(proc, CSR_MENVCFG, menvcfg_mask, 0);
239+
if (xlen == 32) {
240+
add_user_csr(CSR_MENVCFG, std::make_shared<rv32_low_csr_t>(proc, CSR_MENVCFG, menvcfg));
241+
add_user_csr(CSR_MENVCFGH, std::make_shared<rv32_high_csr_t>(proc, CSR_MENVCFGH, menvcfg));
242+
} else {
243+
add_user_csr(CSR_MENVCFG, menvcfg);
244+
}
245+
227246
const reg_t hedeleg_mask =
228247
(1 << CAUSE_MISALIGNED_FETCH) |
229248
(1 << CAUSE_FETCH_ACCESS) |
@@ -310,23 +329,6 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
310329
add_csr(CSR_MVENDORID, std::make_shared<const_csr_t>(proc, CSR_MVENDORID, 0));
311330
add_csr(CSR_MHARTID, std::make_shared<const_csr_t>(proc, CSR_MHARTID, proc->get_id()));
312331
add_csr(CSR_MCONFIGPTR, std::make_shared<const_csr_t>(proc, CSR_MCONFIGPTR, 0));
313-
const reg_t menvcfg_mask = (proc->extension_enabled(EXT_ZICBOM) ? MENVCFG_CBCFE | MENVCFG_CBIE : 0) |
314-
(proc->extension_enabled(EXT_ZICBOZ) ? MENVCFG_CBZE : 0) |
315-
(proc->extension_enabled(EXT_SMNPM) ? MENVCFG_PMM : 0) |
316-
(proc->extension_enabled(EXT_SVADU) ? MENVCFG_ADUE: 0) |
317-
(proc->extension_enabled(EXT_SVPBMT) ? MENVCFG_PBMTE : 0) |
318-
(proc->extension_enabled(EXT_SSTC) ? MENVCFG_STCE : 0) |
319-
(proc->extension_enabled(EXT_ZICFILP) ? MENVCFG_LPE : 0) |
320-
(proc->extension_enabled(EXT_ZICFISS) ? MENVCFG_SSE : 0) |
321-
(proc->extension_enabled(EXT_SSDBLTRP) ? MENVCFG_DTE : 0)|
322-
(proc->extension_enabled(EXT_SMCDELEG) ? MENVCFG_CDE : 0);
323-
menvcfg = std::make_shared<envcfg_csr_t>(proc, CSR_MENVCFG, menvcfg_mask, 0);
324-
if (xlen == 32) {
325-
add_user_csr(CSR_MENVCFG, std::make_shared<rv32_low_csr_t>(proc, CSR_MENVCFG, menvcfg));
326-
add_user_csr(CSR_MENVCFGH, std::make_shared<rv32_high_csr_t>(proc, CSR_MENVCFGH, menvcfg));
327-
} else {
328-
add_user_csr(CSR_MENVCFG, menvcfg);
329-
}
330332
const reg_t senvcfg_mask = (proc->extension_enabled(EXT_ZICBOM) ? SENVCFG_CBCFE | SENVCFG_CBIE : 0) |
331333
(proc->extension_enabled(EXT_ZICBOZ) ? SENVCFG_CBZE : 0) |
332334
(proc->extension_enabled(EXT_SVUKTE) ? SENVCFG_UKTE : 0) |

riscv/csrs.cc

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -544,11 +544,16 @@ mstatus_csr_t::mstatus_csr_t(processor_t* const proc, const reg_t addr):
544544
val(compute_mstatus_initial_value()) {
545545
}
546546

547+
reg_t mstatus_csr_t::read() const noexcept {
548+
return val & ~reg_t(state->menvcfg->read() & MENVCFG_DTE ? 0 : MSTATUS_SDT);
549+
}
550+
547551
bool mstatus_csr_t::unlogged_write(const reg_t val) noexcept {
548552
const bool has_mpv = proc->extension_enabled('H');
549553
const bool has_gva = has_mpv;
554+
const reg_t adj_write_mask = sstatus_write_mask & ~reg_t(state->menvcfg->read() & MENVCFG_DTE ? 0 : SSTATUS_SDT);
550555

551-
const reg_t mask = sstatus_write_mask
556+
const reg_t mask = adj_write_mask
552557
| MSTATUS_MIE | MSTATUS_MPIE
553558
| (proc->extension_enabled('U') ? MSTATUS_MPRV : 0)
554559
| MSTATUS_MPP | MSTATUS_TW
@@ -558,12 +563,11 @@ bool mstatus_csr_t::unlogged_write(const reg_t val) noexcept {
558563
| (has_mpv ? MSTATUS_MPV : 0)
559564
| (proc->extension_enabled(EXT_SMDBLTRP) ? MSTATUS_MDT : 0)
560565
| (proc->extension_enabled(EXT_ZICFILP) ? (MSTATUS_SPELP | MSTATUS_MPELP) : 0)
561-
| (proc->extension_enabled(EXT_SSDBLTRP) ? SSTATUS_SDT : 0)
562566
;
563567

564568
const reg_t requested_mpp = proc->legalize_privilege(get_field(val, MSTATUS_MPP));
565569
const reg_t adjusted_val = set_field(val, MSTATUS_MPP, requested_mpp);
566-
reg_t new_mstatus = (read() & ~mask) | (adjusted_val & mask);
570+
reg_t new_mstatus = (this->val & ~mask) | (adjusted_val & mask);
567571
new_mstatus = (new_mstatus & MSTATUS_MDT) ? (new_mstatus & ~MSTATUS_MIE) : new_mstatus;
568572
new_mstatus = (new_mstatus & MSTATUS_SDT) ? (new_mstatus & ~MSTATUS_SIE) : new_mstatus;
569573
maybe_flush_tlb(new_mstatus);

riscv/csrs.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,7 @@ class mstatus_csr_t final: public base_status_csr_t {
255255
public:
256256
mstatus_csr_t(processor_t* const proc, const reg_t addr);
257257

258-
reg_t read() const noexcept override {
259-
return val;
260-
}
258+
reg_t read() const noexcept override;
261259

262260
protected:
263261
virtual bool unlogged_write(const reg_t val) noexcept override;

0 commit comments

Comments
 (0)