|
|
|
@ -901,9 +901,22 @@ bool masked_csr_t::unlogged_write(const reg_t val) noexcept { |
|
|
|
return basic_csr_t::unlogged_write((read() & ~mask) | (val & mask)); |
|
|
|
} |
|
|
|
|
|
|
|
envcfg_csr_t::envcfg_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, |
|
|
|
const reg_t init): |
|
|
|
masked_csr_t(proc, addr, mask, init) { |
|
|
|
// In unlogged_write() we WARLize this field for all three of [msh]envcfg
|
|
|
|
assert(MENVCFG_CBIE == SENVCFG_CBIE && MENVCFG_CBIE == HENVCFG_CBIE); |
|
|
|
} |
|
|
|
|
|
|
|
bool envcfg_csr_t::unlogged_write(const reg_t val) noexcept { |
|
|
|
const reg_t cbie_reserved = 2; // Reserved value of xenvcfg.CBIE
|
|
|
|
const reg_t adjusted_val = get_field(val, MENVCFG_CBIE) != cbie_reserved ? val : set_field(val, MENVCFG_CBIE, 0); |
|
|
|
return masked_csr_t::unlogged_write(adjusted_val); |
|
|
|
} |
|
|
|
|
|
|
|
// implement class henvcfg_csr_t
|
|
|
|
henvcfg_csr_t::henvcfg_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, const reg_t init, csr_t_p menvcfg): |
|
|
|
masked_csr_t(proc, addr, mask, init), |
|
|
|
envcfg_csr_t(proc, addr, mask, init), |
|
|
|
menvcfg(menvcfg) { |
|
|
|
} |
|
|
|
|
|
|
|
@ -1463,7 +1476,7 @@ void sstateen_csr_t::verify_permissions(insn_t insn, bool write) const { |
|
|
|
// implement class senvcfg_csr_t
|
|
|
|
senvcfg_csr_t::senvcfg_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask, |
|
|
|
const reg_t init): |
|
|
|
masked_csr_t(proc, addr, mask, init) { |
|
|
|
envcfg_csr_t(proc, addr, mask, init) { |
|
|
|
} |
|
|
|
|
|
|
|
void senvcfg_csr_t::verify_permissions(insn_t insn, bool write) const { |
|
|
|
|