@@ -6,6 +6,12 @@ void state_t::add_csr(reg_t addr, const csr_t_p& csr)
6
6
csrmap[addr] = csr;
7
7
}
8
8
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
+
9
15
void state_t::csr_init (processor_t * const proc, reg_t max_isa)
10
16
{
11
17
// 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)
136
142
add_csr (CSR_MEDELEG, medeleg = std::make_shared<medeleg_csr_t >(proc, CSR_MEDELEG));
137
143
add_csr (CSR_MIDELEG, mideleg = std::make_shared<mideleg_csr_t >(proc, CSR_MIDELEG));
138
144
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 ));
142
146
add_csr (CSR_SCOUNTEREN, scounteren = std::make_shared<masked_csr_t >(proc, CSR_SCOUNTEREN, counteren_mask, 0 ));
143
147
nonvirtual_sepc = std::make_shared<epc_csr_t >(proc, CSR_SEPC);
144
148
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)
254
258
(proc->extension_enabled (EXT_ZICFISS) ? MENVCFG_SSE : 0 ) |
255
259
(proc->extension_enabled (EXT_SSDBLTRP) ? MENVCFG_DTE : 0 );
256
260
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);
264
266
}
265
267
const reg_t senvcfg_mask = (proc->extension_enabled (EXT_ZICBOM) ? SENVCFG_CBCFE | SENVCFG_CBIE : 0 ) |
266
268
(proc->extension_enabled (EXT_ZICBOZ) ? SENVCFG_CBZE : 0 ) |
267
269
(proc->extension_enabled (EXT_SSNPM) ? SENVCFG_PMM : 0 ) |
268
270
(proc->extension_enabled (EXT_ZICFILP) ? SENVCFG_LPE : 0 ) |
269
271
(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 ));
273
273
const reg_t henvcfg_mask = (proc->extension_enabled (EXT_ZICBOM) ? HENVCFG_CBCFE | HENVCFG_CBIE : 0 ) |
274
274
(proc->extension_enabled (EXT_ZICBOZ) ? HENVCFG_CBZE : 0 ) |
275
275
(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)
280
280
(proc->extension_enabled (EXT_ZICFISS) ? HENVCFG_SSE : 0 ) |
281
281
(proc->extension_enabled (EXT_SSDBLTRP) ? HENVCFG_DTE : 0 );
282
282
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);
290
288
}
291
289
if (proc->extension_enabled_const (EXT_SMSTATEEN)) {
292
290
const reg_t sstateen0_mask = (proc->extension_enabled (EXT_ZFINX) ? SSTATEEN0_FCSR : 0 ) |
0 commit comments