Skip to content

Commit 584f855

Browse files
committed
Fix segfault accessing menvcfg when U-mode doesn't exist
The simplest fix is to create the CSRs even if they don't need to exist, and just skip adding them to the CSR map to prevent the target machine from being able to access them. It looks like there are other place we should be following this pattern: e.g. why does sstatus exist if S-mode does not exist? But that's a matter for another day. Resolves #1752
1 parent 0a2c3b6 commit 584f855

File tree

1 file changed

+30
-26
lines changed

1 file changed

+30
-26
lines changed

riscv/processor.cc

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -381,39 +381,43 @@ void state_t::reset(processor_t* const proc, reg_t max_isa)
381381
csrmap[CSR_MVENDORID] = std::make_shared<const_csr_t>(proc, CSR_MVENDORID, 0);
382382
csrmap[CSR_MHARTID] = std::make_shared<const_csr_t>(proc, CSR_MHARTID, proc->get_id());
383383
csrmap[CSR_MCONFIGPTR] = std::make_shared<const_csr_t>(proc, CSR_MCONFIGPTR, 0);
384+
const reg_t menvcfg_mask = (proc->extension_enabled(EXT_ZICBOM) ? MENVCFG_CBCFE | MENVCFG_CBIE : 0) |
385+
(proc->extension_enabled(EXT_ZICBOZ) ? MENVCFG_CBZE : 0) |
386+
(proc->extension_enabled(EXT_SMNPM) ? MENVCFG_PMM : 0) |
387+
(proc->extension_enabled(EXT_SVADU) ? MENVCFG_ADUE: 0) |
388+
(proc->extension_enabled(EXT_SVPBMT) ? MENVCFG_PBMTE : 0) |
389+
(proc->extension_enabled(EXT_SSTC) ? MENVCFG_STCE : 0) |
390+
(proc->extension_enabled(EXT_ZICFILP) ? MENVCFG_LPE : 0) |
391+
(proc->extension_enabled(EXT_ZICFISS) ? MENVCFG_SSE : 0) |
392+
(proc->extension_enabled(EXT_SSDBLTRP) ? MENVCFG_DTE : 0);
393+
menvcfg = std::make_shared<envcfg_csr_t>(proc, CSR_MENVCFG, menvcfg_mask, 0);
384394
if (proc->extension_enabled_const('U')) {
385-
const reg_t menvcfg_mask = (proc->extension_enabled(EXT_ZICBOM) ? MENVCFG_CBCFE | MENVCFG_CBIE : 0) |
386-
(proc->extension_enabled(EXT_ZICBOZ) ? MENVCFG_CBZE : 0) |
387-
(proc->extension_enabled(EXT_SMNPM) ? MENVCFG_PMM : 0) |
388-
(proc->extension_enabled(EXT_SVADU) ? MENVCFG_ADUE: 0) |
389-
(proc->extension_enabled(EXT_SVPBMT) ? MENVCFG_PBMTE : 0) |
390-
(proc->extension_enabled(EXT_SSTC) ? MENVCFG_STCE : 0) |
391-
(proc->extension_enabled(EXT_ZICFILP) ? MENVCFG_LPE : 0) |
392-
(proc->extension_enabled(EXT_ZICFISS) ? MENVCFG_SSE : 0) |
393-
(proc->extension_enabled(EXT_SSDBLTRP) ? MENVCFG_DTE : 0);
394-
menvcfg = std::make_shared<envcfg_csr_t>(proc, CSR_MENVCFG, menvcfg_mask, 0);
395395
if (xlen == 32) {
396396
csrmap[CSR_MENVCFG] = std::make_shared<rv32_low_csr_t>(proc, CSR_MENVCFG, menvcfg);
397397
csrmap[CSR_MENVCFGH] = std::make_shared<rv32_high_csr_t>(proc, CSR_MENVCFGH, menvcfg);
398398
} else {
399399
csrmap[CSR_MENVCFG] = menvcfg;
400400
}
401-
const reg_t senvcfg_mask = (proc->extension_enabled(EXT_ZICBOM) ? SENVCFG_CBCFE | SENVCFG_CBIE : 0) |
402-
(proc->extension_enabled(EXT_ZICBOZ) ? SENVCFG_CBZE : 0) |
403-
(proc->extension_enabled(EXT_SSNPM) ? SENVCFG_PMM : 0) |
404-
(proc->extension_enabled(EXT_ZICFILP) ? SENVCFG_LPE : 0) |
405-
(proc->extension_enabled(EXT_ZICFISS) ? SENVCFG_SSE : 0);
406-
csrmap[CSR_SENVCFG] = senvcfg = std::make_shared<senvcfg_csr_t>(proc, CSR_SENVCFG, senvcfg_mask, 0);
407-
const reg_t henvcfg_mask = (proc->extension_enabled(EXT_ZICBOM) ? HENVCFG_CBCFE | HENVCFG_CBIE : 0) |
408-
(proc->extension_enabled(EXT_ZICBOZ) ? HENVCFG_CBZE : 0) |
409-
(proc->extension_enabled(EXT_SSNPM) ? HENVCFG_PMM : 0) |
410-
(proc->extension_enabled(EXT_SVADU) ? HENVCFG_ADUE: 0) |
411-
(proc->extension_enabled(EXT_SVPBMT) ? HENVCFG_PBMTE : 0) |
412-
(proc->extension_enabled(EXT_SSTC) ? HENVCFG_STCE : 0) |
413-
(proc->extension_enabled(EXT_ZICFILP) ? HENVCFG_LPE : 0) |
414-
(proc->extension_enabled(EXT_ZICFISS) ? HENVCFG_SSE : 0) |
415-
(proc->extension_enabled(EXT_SSDBLTRP) ? HENVCFG_DTE : 0);
416-
henvcfg = std::make_shared<henvcfg_csr_t>(proc, CSR_HENVCFG, henvcfg_mask, 0, menvcfg);
401+
}
402+
const reg_t senvcfg_mask = (proc->extension_enabled(EXT_ZICBOM) ? SENVCFG_CBCFE | SENVCFG_CBIE : 0) |
403+
(proc->extension_enabled(EXT_ZICBOZ) ? SENVCFG_CBZE : 0) |
404+
(proc->extension_enabled(EXT_SSNPM) ? SENVCFG_PMM : 0) |
405+
(proc->extension_enabled(EXT_ZICFILP) ? SENVCFG_LPE : 0) |
406+
(proc->extension_enabled(EXT_ZICFISS) ? SENVCFG_SSE : 0);
407+
senvcfg = std::make_shared<senvcfg_csr_t>(proc, CSR_SENVCFG, senvcfg_mask, 0);
408+
if (proc->extension_enabled_const('S'))
409+
csrmap[CSR_SENVCFG] = senvcfg;
410+
const reg_t henvcfg_mask = (proc->extension_enabled(EXT_ZICBOM) ? HENVCFG_CBCFE | HENVCFG_CBIE : 0) |
411+
(proc->extension_enabled(EXT_ZICBOZ) ? HENVCFG_CBZE : 0) |
412+
(proc->extension_enabled(EXT_SSNPM) ? HENVCFG_PMM : 0) |
413+
(proc->extension_enabled(EXT_SVADU) ? HENVCFG_ADUE: 0) |
414+
(proc->extension_enabled(EXT_SVPBMT) ? HENVCFG_PBMTE : 0) |
415+
(proc->extension_enabled(EXT_SSTC) ? HENVCFG_STCE : 0) |
416+
(proc->extension_enabled(EXT_ZICFILP) ? HENVCFG_LPE : 0) |
417+
(proc->extension_enabled(EXT_ZICFISS) ? HENVCFG_SSE : 0) |
418+
(proc->extension_enabled(EXT_SSDBLTRP) ? HENVCFG_DTE : 0);
419+
henvcfg = std::make_shared<henvcfg_csr_t>(proc, CSR_HENVCFG, henvcfg_mask, 0, menvcfg);
420+
if (proc->extension_enabled_const('H')) {
417421
if (xlen == 32) {
418422
csrmap[CSR_HENVCFG] = std::make_shared<rv32_low_csr_t>(proc, CSR_HENVCFG, henvcfg);
419423
csrmap[CSR_HENVCFGH] = std::make_shared<rv32_high_csr_t>(proc, CSR_HENVCFGH, henvcfg);

0 commit comments

Comments
 (0)