Skip to content

Commit 3c0e6bf

Browse files
committed
Refactor initialization of mode-specific CSRs
The if-statements are boilerplate.
1 parent 2597b4b commit 3c0e6bf

File tree

1 file changed

+18
-20
lines changed

1 file changed

+18
-20
lines changed

riscv/csr_init.cc

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ void state_t::add_csr(reg_t addr, const csr_t_p& csr)
66
csrmap[addr] = csr;
77
}
88

9+
#define add_const_ext_csr(ext, addr, csr) do { auto csr__ = (csr); if (proc->extension_enabled_const(ext)) { add_csr(addr, csr__); } } while (0)
10+
#define add_ext_csr(ext, addr, csr) do { auto csr__ = (csr); if (proc->extension_enabled(ext)) { add_csr(addr, csr__); } } while (0)
11+
#define add_user_csr(addr, csr) add_const_ext_csr('U', addr, csr)
12+
#define add_supervisor_csr(addr, csr) add_const_ext_csr('S', addr, csr)
13+
#define add_hypervisor_csr(addr, csr) add_ext_csr('H', addr, csr)
14+
915
void state_t::csr_init(processor_t* const proc, reg_t max_isa)
1016
{
1117
// This assumes xlen is always max_xlen, which is true today (see
@@ -136,9 +142,7 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
136142
add_csr(CSR_MEDELEG, medeleg = std::make_shared<medeleg_csr_t>(proc, CSR_MEDELEG));
137143
add_csr(CSR_MIDELEG, mideleg = std::make_shared<mideleg_csr_t>(proc, CSR_MIDELEG));
138144
const reg_t counteren_mask = (proc->extension_enabled_const(EXT_ZICNTR) ? 0x7UL : 0x0) | (proc->extension_enabled_const(EXT_ZIHPM) ? 0xfffffff8ULL : 0x0);
139-
mcounteren = std::make_shared<masked_csr_t>(proc, CSR_MCOUNTEREN, counteren_mask, 0);
140-
if (proc->extension_enabled_const('U'))
141-
add_csr(CSR_MCOUNTEREN, mcounteren);
145+
add_user_csr(CSR_MCOUNTEREN, mcounteren = std::make_shared<masked_csr_t>(proc, CSR_MCOUNTEREN, counteren_mask, 0));
142146
add_csr(CSR_SCOUNTEREN, scounteren = std::make_shared<masked_csr_t>(proc, CSR_SCOUNTEREN, counteren_mask, 0));
143147
nonvirtual_sepc = std::make_shared<epc_csr_t>(proc, CSR_SEPC);
144148
add_csr(CSR_VSEPC, vsepc = std::make_shared<epc_csr_t>(proc, CSR_VSEPC));
@@ -254,22 +258,18 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
254258
(proc->extension_enabled(EXT_ZICFISS) ? MENVCFG_SSE : 0) |
255259
(proc->extension_enabled(EXT_SSDBLTRP) ? MENVCFG_DTE : 0);
256260
menvcfg = std::make_shared<envcfg_csr_t>(proc, CSR_MENVCFG, menvcfg_mask, 0);
257-
if (proc->extension_enabled_const('U')) {
258-
if (xlen == 32) {
259-
add_csr(CSR_MENVCFG, std::make_shared<rv32_low_csr_t>(proc, CSR_MENVCFG, menvcfg));
260-
add_csr(CSR_MENVCFGH, std::make_shared<rv32_high_csr_t>(proc, CSR_MENVCFGH, menvcfg));
261-
} else {
262-
add_csr(CSR_MENVCFG, menvcfg);
263-
}
261+
if (xlen == 32) {
262+
add_user_csr(CSR_MENVCFG, std::make_shared<rv32_low_csr_t>(proc, CSR_MENVCFG, menvcfg));
263+
add_user_csr(CSR_MENVCFGH, std::make_shared<rv32_high_csr_t>(proc, CSR_MENVCFGH, menvcfg));
264+
} else {
265+
add_user_csr(CSR_MENVCFG, menvcfg);
264266
}
265267
const reg_t senvcfg_mask = (proc->extension_enabled(EXT_ZICBOM) ? SENVCFG_CBCFE | SENVCFG_CBIE : 0) |
266268
(proc->extension_enabled(EXT_ZICBOZ) ? SENVCFG_CBZE : 0) |
267269
(proc->extension_enabled(EXT_SSNPM) ? SENVCFG_PMM : 0) |
268270
(proc->extension_enabled(EXT_ZICFILP) ? SENVCFG_LPE : 0) |
269271
(proc->extension_enabled(EXT_ZICFISS) ? SENVCFG_SSE : 0);
270-
senvcfg = std::make_shared<senvcfg_csr_t>(proc, CSR_SENVCFG, senvcfg_mask, 0);
271-
if (proc->extension_enabled_const('S'))
272-
add_csr(CSR_SENVCFG, senvcfg);
272+
add_supervisor_csr(CSR_SENVCFG, senvcfg = std::make_shared<senvcfg_csr_t>(proc, CSR_SENVCFG, senvcfg_mask, 0));
273273
const reg_t henvcfg_mask = (proc->extension_enabled(EXT_ZICBOM) ? HENVCFG_CBCFE | HENVCFG_CBIE : 0) |
274274
(proc->extension_enabled(EXT_ZICBOZ) ? HENVCFG_CBZE : 0) |
275275
(proc->extension_enabled(EXT_SSNPM) ? HENVCFG_PMM : 0) |
@@ -280,13 +280,11 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
280280
(proc->extension_enabled(EXT_ZICFISS) ? HENVCFG_SSE : 0) |
281281
(proc->extension_enabled(EXT_SSDBLTRP) ? HENVCFG_DTE : 0);
282282
henvcfg = std::make_shared<henvcfg_csr_t>(proc, CSR_HENVCFG, henvcfg_mask, 0, menvcfg);
283-
if (proc->extension_enabled('H')) {
284-
if (xlen == 32) {
285-
add_csr(CSR_HENVCFG, std::make_shared<rv32_low_csr_t>(proc, CSR_HENVCFG, henvcfg));
286-
add_csr(CSR_HENVCFGH, std::make_shared<rv32_high_csr_t>(proc, CSR_HENVCFGH, henvcfg));
287-
} else {
288-
add_csr(CSR_HENVCFG, henvcfg);
289-
}
283+
if (xlen == 32) {
284+
add_hypervisor_csr(CSR_HENVCFG, std::make_shared<rv32_low_csr_t>(proc, CSR_HENVCFG, henvcfg));
285+
add_hypervisor_csr(CSR_HENVCFGH, std::make_shared<rv32_high_csr_t>(proc, CSR_HENVCFGH, henvcfg));
286+
} else {
287+
add_hypervisor_csr(CSR_HENVCFG, henvcfg);
290288
}
291289
if (proc->extension_enabled_const(EXT_SMSTATEEN)) {
292290
const reg_t sstateen0_mask = (proc->extension_enabled(EXT_ZFINX) ? SSTATEEN0_FCSR : 0) |

0 commit comments

Comments
 (0)