Skip to content

Commit 9572283

Browse files
authored
Merge pull request #1753 from riscv-software-src/fix-1752
Fix segfault accessing menvcfg when U-mode doesn't exist
2 parents 0a2c3b6 + 584f855 commit 9572283

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)