Skip to content

Commit a81d597

Browse files
committed
Remove boilerplate from most CSR instantiations
1 parent 3c0e6bf commit a81d597

File tree

2 files changed

+34
-62
lines changed

2 files changed

+34
-62
lines changed

riscv/csr_init.cc

Lines changed: 34 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,10 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
3333
add_csr(CSR_MTVEC, mtvec = std::make_shared<tvec_csr_t>(proc, CSR_MTVEC));
3434
add_csr(CSR_MCAUSE, mcause = std::make_shared<cause_csr_t>(proc, CSR_MCAUSE));
3535

36-
auto smcntrpmf_enabled = proc->extension_enabled_const(EXT_SMCNTRPMF);
37-
const reg_t mask = smcntrpmf_enabled ? MHPMEVENT_MINH | MHPMEVENT_SINH |
38-
MHPMEVENT_UINH | MHPMEVENT_VSINH | MHPMEVENT_VUINH : 0;
39-
auto minstretcfg = std::make_shared<smcntrpmf_csr_t>(proc, CSR_MINSTRETCFG, mask, 0);
40-
auto mcyclecfg = std::make_shared<smcntrpmf_csr_t>(proc, CSR_MCYCLECFG, mask, 0);
36+
const reg_t minstretcfg_mask = !proc->extension_enabled_const(EXT_SMCNTRPMF) ? 0 :
37+
MHPMEVENT_MINH | MHPMEVENT_SINH | MHPMEVENT_UINH | MHPMEVENT_VSINH | MHPMEVENT_VUINH;
38+
auto minstretcfg = std::make_shared<smcntrpmf_csr_t>(proc, CSR_MINSTRETCFG, minstretcfg_mask, 0);
39+
auto mcyclecfg = std::make_shared<smcntrpmf_csr_t>(proc, CSR_MCYCLECFG, minstretcfg_mask, 0);
4140

4241
minstret = std::make_shared<wide_counter_csr_t>(proc, CSR_MINSTRET, minstretcfg);
4342
mcycle = std::make_shared<wide_counter_csr_t>(proc, CSR_MCYCLE, mcyclecfg);
@@ -74,29 +73,21 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
7473
auto mcounter = std::make_shared<const_csr_t>(proc, which_mcounter, 0);
7574
add_csr(which_mcounter, mcounter);
7675

77-
if (proc->extension_enabled_const(EXT_ZIHPM)) {
78-
auto counter = std::make_shared<counter_proxy_csr_t>(proc, which_counter, mcounter);
79-
add_csr(which_counter, counter);
80-
}
76+
auto counter = std::make_shared<counter_proxy_csr_t>(proc, which_counter, mcounter);
77+
add_const_ext_csr(EXT_ZIHPM, which_counter, counter);
78+
8179
if (xlen == 32) {
8280
add_csr(which_mevent, std::make_shared<rv32_low_csr_t>(proc, which_mevent, mevent[i]));
8381
auto mcounterh = std::make_shared<const_csr_t>(proc, which_mcounterh, 0);
8482
add_csr(which_mcounterh, mcounterh);
85-
if (proc->extension_enabled_const(EXT_ZIHPM)) {
86-
auto counterh = std::make_shared<counter_proxy_csr_t>(proc, which_counterh, mcounterh);
87-
add_csr(which_counterh, counterh);
88-
}
89-
if (proc->extension_enabled_const(EXT_SSCOFPMF)) {
90-
auto meventh = std::make_shared<rv32_high_csr_t>(proc, which_meventh, mevent[i]);
91-
add_csr(which_meventh, meventh);
92-
}
83+
add_const_ext_csr(EXT_ZIHPM, which_counterh, std::make_shared<counter_proxy_csr_t>(proc, which_counterh, mcounterh));
84+
add_const_ext_csr(EXT_SSCOFPMF, which_meventh, std::make_shared<rv32_high_csr_t>(proc, which_meventh, mevent[i]));
9385
} else {
9486
add_csr(which_mevent, mevent[i]);
9587
}
9688
}
9789
add_csr(CSR_MCOUNTINHIBIT, std::make_shared<const_csr_t>(proc, CSR_MCOUNTINHIBIT, 0));
98-
if (proc->extension_enabled_const(EXT_SSCOFPMF))
99-
add_csr(CSR_SCOUNTOVF, std::make_shared<scountovf_csr_t>(proc, CSR_SCOUNTOVF));
90+
add_const_ext_csr(EXT_SSCOFPMF, CSR_SCOUNTOVF, std::make_shared<scountovf_csr_t>(proc, CSR_SCOUNTOVF));
10091
add_csr(CSR_MIE, mie = std::make_shared<mie_csr_t>(proc, CSR_MIE));
10192
add_csr(CSR_MIP, mip = std::make_shared<mip_csr_t>(proc, CSR_MIP));
10293
auto sip_sie_accr = std::make_shared<generic_int_accessor_t>(
@@ -338,69 +329,52 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
338329
}
339330
}
340331

341-
if (proc->extension_enabled(EXT_ZCMT))
342-
add_csr(CSR_JVT, jvt = std::make_shared<jvt_csr_t>(proc, CSR_JVT, 0));
332+
add_ext_csr(EXT_ZCMT, CSR_JVT, jvt = std::make_shared<jvt_csr_t>(proc, CSR_JVT, 0));
343333

344-
if (proc->extension_enabled(EXT_ZICFISS)) {
345-
reg_t ssp_mask = -reg_t(xlen / 8);
346-
add_csr(CSR_SSP, ssp = std::make_shared<ssp_csr_t>(proc, CSR_SSP, ssp_mask, 0));
347-
}
334+
const reg_t ssp_mask = -reg_t(xlen / 8);
335+
add_ext_csr(EXT_ZICFISS, CSR_SSP, ssp = std::make_shared<ssp_csr_t>(proc, CSR_SSP, ssp_mask, 0));
348336

349337

350338
// Smcsrind / Sscsrind
351-
sscsrind_reg_csr_t::sscsrind_reg_csr_t_p mireg[6];
352-
sscsrind_reg_csr_t::sscsrind_reg_csr_t_p sireg[6];
353-
sscsrind_reg_csr_t::sscsrind_reg_csr_t_p vsireg[6];
354-
355339
if (proc->extension_enabled_const(EXT_SMCSRIND)) {
356340
csr_t_p miselect = std::make_shared<basic_csr_t>(proc, CSR_MISELECT, 0);
357341
add_csr(CSR_MISELECT, miselect);
358342

359343
const reg_t mireg_csrs[] = { CSR_MIREG, CSR_MIREG2, CSR_MIREG3, CSR_MIREG4, CSR_MIREG5, CSR_MIREG6 };
360-
auto i = 0;
361-
for (auto csr : mireg_csrs) {
362-
add_csr(csr, mireg[i] = std::make_shared<sscsrind_reg_csr_t>(proc, csr, miselect));
363-
i++;
364-
}
344+
for (auto csr : mireg_csrs)
345+
add_csr(csr, std::make_shared<sscsrind_reg_csr_t>(proc, csr, miselect));
365346
}
366347

367348
if (proc->extension_enabled_const(EXT_SSCSRIND)) {
368349
csr_t_p vsiselect = std::make_shared<basic_csr_t>(proc, CSR_VSISELECT, 0);
369350
add_csr(CSR_VSISELECT, vsiselect);
351+
370352
csr_t_p siselect = std::make_shared<basic_csr_t>(proc, CSR_SISELECT, 0);
371353
add_csr(CSR_SISELECT, std::make_shared<virtualized_csr_t>(proc, siselect, vsiselect));
372354

373355
const reg_t vsireg_csrs[] = { CSR_VSIREG, CSR_VSIREG2, CSR_VSIREG3, CSR_VSIREG4, CSR_VSIREG5, CSR_VSIREG6 };
374-
auto i = 0;
375-
for (auto csr : vsireg_csrs) {
376-
add_csr(csr, vsireg[i] = std::make_shared<sscsrind_reg_csr_t>(proc, csr, vsiselect));
377-
i++;
378-
}
379-
380356
const reg_t sireg_csrs[] = { CSR_SIREG, CSR_SIREG2, CSR_SIREG3, CSR_SIREG4, CSR_SIREG5, CSR_SIREG6 };
381-
i = 0;
382-
for (auto csr : sireg_csrs) {
383-
sireg[i] = std::make_shared<sscsrind_reg_csr_t>(proc, csr, siselect);
384-
add_csr(csr, std::make_shared<virtualized_indirect_csr_t>(proc, sireg[i], vsireg[i]));
385-
i++;
357+
for (size_t i = 0; i < std::size(vsireg_csrs); i++) {
358+
auto vsireg = std::make_shared<sscsrind_reg_csr_t>(proc, vsireg_csrs[i], vsiselect);
359+
add_csr(vsireg_csrs[i], vsireg);
360+
361+
auto sireg = std::make_shared<sscsrind_reg_csr_t>(proc, sireg_csrs[i], siselect);
362+
add_csr(sireg_csrs[i], std::make_shared<virtualized_indirect_csr_t>(proc, sireg, vsireg));
386363
}
387364
}
388365

389-
if (smcntrpmf_enabled) {
390-
if (xlen == 32) {
391-
add_csr(CSR_MCYCLECFG, std::make_shared<rv32_low_csr_t>(proc, CSR_MCYCLECFG, mcyclecfg));
392-
add_csr(CSR_MCYCLECFGH, std::make_shared<rv32_high_csr_t>(proc, CSR_MCYCLECFGH, mcyclecfg));
393-
add_csr(CSR_MINSTRETCFG, std::make_shared<rv32_low_csr_t>(proc, CSR_MINSTRETCFG, minstretcfg));
394-
add_csr(CSR_MINSTRETCFGH, std::make_shared<rv32_high_csr_t>(proc, CSR_MINSTRETCFGH, minstretcfg));
395-
} else {
396-
add_csr(CSR_MCYCLECFG, mcyclecfg);
397-
add_csr(CSR_MINSTRETCFG, minstretcfg);
398-
}
366+
if (proc->extension_enabled_const(EXT_SMCNTRPMF)) {
367+
if (xlen == 32) {
368+
add_csr(CSR_MCYCLECFG, std::make_shared<rv32_low_csr_t>(proc, CSR_MCYCLECFG, mcyclecfg));
369+
add_csr(CSR_MCYCLECFGH, std::make_shared<rv32_high_csr_t>(proc, CSR_MCYCLECFGH, mcyclecfg));
370+
add_csr(CSR_MINSTRETCFG, std::make_shared<rv32_low_csr_t>(proc, CSR_MINSTRETCFG, minstretcfg));
371+
add_csr(CSR_MINSTRETCFGH, std::make_shared<rv32_high_csr_t>(proc, CSR_MINSTRETCFGH, minstretcfg));
372+
} else {
373+
add_csr(CSR_MCYCLECFG, mcyclecfg);
374+
add_csr(CSR_MINSTRETCFG, minstretcfg);
375+
}
399376
}
400377

401-
if (proc->extension_enabled_const(EXT_SSQOSID)) {
402-
const reg_t srmcfg_mask = SRMCFG_MCID | SRMCFG_RCID;
403-
srmcfg = std::make_shared<srmcfg_csr_t>(proc, CSR_SRMCFG, srmcfg_mask, 0);
404-
add_csr(CSR_SRMCFG, srmcfg);
405-
}
378+
const reg_t srmcfg_mask = SRMCFG_MCID | SRMCFG_RCID;
379+
add_const_ext_csr(EXT_SSQOSID, CSR_SRMCFG, std::make_shared<srmcfg_csr_t>(proc, CSR_SRMCFG, srmcfg_mask, 0));
406380
}

riscv/processor.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,6 @@ struct state_t
169169
csr_t_p stimecmp;
170170
csr_t_p vstimecmp;
171171

172-
csr_t_p srmcfg;
173-
174172
csr_t_p ssp;
175173

176174
bool serialized; // whether timer CSRs are in a well-defined state

0 commit comments

Comments
 (0)