@@ -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+
915void 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