@@ -119,48 +119,50 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
119119
120120 auto nonvirtual_sip = std::make_shared<mip_proxy_csr_t >(proc, CSR_SIP, sip_sie_accr);
121121 auto vsip = std::make_shared<mip_proxy_csr_t >(proc, CSR_VSIP, vsip_vsie_accr);
122- add_csr (CSR_VSIP, vsip);
123- add_csr (CSR_SIP, std::make_shared<virtualized_csr_t >(proc, nonvirtual_sip, vsip));
124- add_csr (CSR_HIP, std::make_shared<mip_proxy_csr_t >(proc, CSR_HIP, hip_hie_accr));
125- add_csr (CSR_HVIP, hvip = std::make_shared<hvip_csr_t >(proc, CSR_HVIP, 0 ));
122+ add_hypervisor_csr (CSR_VSIP, vsip);
123+ add_supervisor_csr (CSR_SIP, std::make_shared<virtualized_csr_t >(proc, nonvirtual_sip, vsip));
124+ add_hypervisor_csr (CSR_HIP, std::make_shared<mip_proxy_csr_t >(proc, CSR_HIP, hip_hie_accr));
125+ add_hypervisor_csr (CSR_HVIP, hvip = std::make_shared<hvip_csr_t >(proc, CSR_HVIP, 0 ));
126126
127127 auto nonvirtual_sie = std::make_shared<mie_proxy_csr_t >(proc, CSR_SIE, sip_sie_accr);
128128 auto vsie = std::make_shared<mie_proxy_csr_t >(proc, CSR_VSIE, vsip_vsie_accr);
129- add_csr (CSR_VSIE, vsie);
130- add_csr (CSR_SIE, std::make_shared<virtualized_csr_t >(proc, nonvirtual_sie, vsie));
131- add_csr (CSR_HIE, std::make_shared<mie_proxy_csr_t >(proc, CSR_HIE, hip_hie_accr));
129+ add_hypervisor_csr (CSR_VSIE, vsie);
130+ add_supervisor_csr (CSR_SIE, std::make_shared<virtualized_csr_t >(proc, nonvirtual_sie, vsie));
131+ add_hypervisor_csr (CSR_HIE, std::make_shared<mie_proxy_csr_t >(proc, CSR_HIE, hip_hie_accr));
132132
133- add_csr (CSR_MEDELEG, medeleg = std::make_shared<medeleg_csr_t >(proc, CSR_MEDELEG));
134- add_csr (CSR_MIDELEG, mideleg = std::make_shared<mideleg_csr_t >(proc, CSR_MIDELEG));
133+ add_supervisor_csr (CSR_MEDELEG, medeleg = std::make_shared<medeleg_csr_t >(proc, CSR_MEDELEG));
134+ add_supervisor_csr (CSR_MIDELEG, mideleg = std::make_shared<mideleg_csr_t >(proc, CSR_MIDELEG));
135135 const reg_t counteren_mask = (proc->extension_enabled_const (EXT_ZICNTR) ? 0x7UL : 0x0 ) | (proc->extension_enabled_const (EXT_ZIHPM) ? 0xfffffff8ULL : 0x0 );
136136 add_user_csr (CSR_MCOUNTEREN, mcounteren = std::make_shared<masked_csr_t >(proc, CSR_MCOUNTEREN, counteren_mask, 0 ));
137- add_csr (CSR_SCOUNTEREN, scounteren = std::make_shared<masked_csr_t >(proc, CSR_SCOUNTEREN, counteren_mask, 0 ));
137+ add_supervisor_csr (CSR_SCOUNTEREN, scounteren = std::make_shared<masked_csr_t >(proc, CSR_SCOUNTEREN, counteren_mask, 0 ));
138138 nonvirtual_sepc = std::make_shared<epc_csr_t >(proc, CSR_SEPC);
139- add_csr (CSR_VSEPC, vsepc = std::make_shared<epc_csr_t >(proc, CSR_VSEPC));
140- add_csr (CSR_SEPC, sepc = std::make_shared<virtualized_csr_t >(proc, nonvirtual_sepc, vsepc));
139+ add_hypervisor_csr (CSR_VSEPC, vsepc = std::make_shared<epc_csr_t >(proc, CSR_VSEPC));
140+ add_supervisor_csr (CSR_SEPC, sepc = std::make_shared<virtualized_csr_t >(proc, nonvirtual_sepc, vsepc));
141141 nonvirtual_stval = std::make_shared<basic_csr_t >(proc, CSR_STVAL, 0 );
142- add_csr (CSR_VSTVAL, vstval = std::make_shared<basic_csr_t >(proc, CSR_VSTVAL, 0 ));
143- add_csr (CSR_STVAL, stval = std::make_shared<virtualized_csr_t >(proc, nonvirtual_stval, vstval));
142+ add_hypervisor_csr (CSR_VSTVAL, vstval = std::make_shared<basic_csr_t >(proc, CSR_VSTVAL, 0 ));
143+ add_supervisor_csr (CSR_STVAL, stval = std::make_shared<virtualized_csr_t >(proc, nonvirtual_stval, vstval));
144144 auto sscratch = std::make_shared<basic_csr_t >(proc, CSR_SSCRATCH, 0 );
145145 auto vsscratch = std::make_shared<basic_csr_t >(proc, CSR_VSSCRATCH, 0 );
146146 // Note: if max_isa does not include H, we don't really need this virtualized_csr_t at all (though it doesn't hurt):
147- add_csr (CSR_SSCRATCH, std::make_shared<virtualized_csr_t >(proc, sscratch, vsscratch));
148- add_csr (CSR_VSSCRATCH, vsscratch);
147+ add_supervisor_csr (CSR_SSCRATCH, std::make_shared<virtualized_csr_t >(proc, sscratch, vsscratch));
148+ add_hypervisor_csr (CSR_VSSCRATCH, vsscratch);
149149 nonvirtual_stvec = std::make_shared<tvec_csr_t >(proc, CSR_STVEC);
150- add_csr (CSR_VSTVEC, vstvec = std::make_shared<tvec_csr_t >(proc, CSR_VSTVEC));
151- add_csr (CSR_STVEC, stvec = std::make_shared<virtualized_csr_t >(proc, nonvirtual_stvec, vstvec));
150+ add_hypervisor_csr (CSR_VSTVEC, vstvec = std::make_shared<tvec_csr_t >(proc, CSR_VSTVEC));
151+ add_supervisor_csr (CSR_STVEC, stvec = std::make_shared<virtualized_csr_t >(proc, nonvirtual_stvec, vstvec));
152152 auto nonvirtual_satp = std::make_shared<satp_csr_t >(proc, CSR_SATP);
153- add_csr (CSR_VSATP, vsatp = std::make_shared<base_atp_csr_t >(proc, CSR_VSATP));
154- add_csr (CSR_SATP, satp = std::make_shared<virtualized_satp_csr_t >(proc, nonvirtual_satp, vsatp));
153+ add_hypervisor_csr (CSR_VSATP, vsatp = std::make_shared<base_atp_csr_t >(proc, CSR_VSATP));
154+ add_supervisor_csr (CSR_SATP, satp = std::make_shared<virtualized_satp_csr_t >(proc, nonvirtual_satp, vsatp));
155155 nonvirtual_scause = std::make_shared<cause_csr_t >(proc, CSR_SCAUSE);
156- add_csr (CSR_VSCAUSE, vscause = std::make_shared<cause_csr_t >(proc, CSR_VSCAUSE));
157- add_csr (CSR_SCAUSE, scause = std::make_shared<virtualized_csr_t >(proc, nonvirtual_scause, vscause));
158- add_csr (CSR_MTVAL2, mtval2 = std::make_shared<mtval2_csr_t >(proc, CSR_MTVAL2));
159- add_csr (CSR_MTINST, mtinst = std::make_shared<hypervisor_csr_t >(proc, CSR_MTINST));
160- add_csr (CSR_HSTATUS, hstatus = std::make_shared<hstatus_csr_t >(proc, CSR_HSTATUS));
161- add_csr (CSR_HGEIE, std::make_shared<const_csr_t >(proc, CSR_HGEIE, 0 ));
162- add_csr (CSR_HGEIP, std::make_shared<const_csr_t >(proc, CSR_HGEIP, 0 ));
163- add_csr (CSR_HIDELEG, hideleg = std::make_shared<hideleg_csr_t >(proc, CSR_HIDELEG, mideleg));
156+ add_hypervisor_csr (CSR_VSCAUSE, vscause = std::make_shared<cause_csr_t >(proc, CSR_VSCAUSE));
157+ add_supervisor_csr (CSR_SCAUSE, scause = std::make_shared<virtualized_csr_t >(proc, nonvirtual_scause, vscause));
158+ mtval2 = std::make_shared<mtval2_csr_t >(proc, CSR_MTVAL2);
159+ if (proc->extension_enabled (' H' ) || proc->extension_enabled (EXT_SSDBLTRP))
160+ add_csr (CSR_MTVAL2, mtval2);
161+ add_hypervisor_csr (CSR_MTINST, mtinst = std::make_shared<hypervisor_csr_t >(proc, CSR_MTINST));
162+ add_hypervisor_csr (CSR_HSTATUS, hstatus = std::make_shared<hstatus_csr_t >(proc, CSR_HSTATUS));
163+ add_hypervisor_csr (CSR_HGEIE, std::make_shared<const_csr_t >(proc, CSR_HGEIE, 0 ));
164+ add_hypervisor_csr (CSR_HGEIP, std::make_shared<const_csr_t >(proc, CSR_HGEIP, 0 ));
165+ add_hypervisor_csr (CSR_HIDELEG, hideleg = std::make_shared<hideleg_csr_t >(proc, CSR_HIDELEG, mideleg));
164166 const reg_t hedeleg_mask =
165167 (1 << CAUSE_MISALIGNED_FETCH) |
166168 (1 << CAUSE_FETCH_ACCESS) |
@@ -176,21 +178,21 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
176178 (1 << CAUSE_STORE_PAGE_FAULT) |
177179 (1 << CAUSE_SOFTWARE_CHECK_FAULT) |
178180 (1 << CAUSE_HARDWARE_ERROR_FAULT);
179- add_csr (CSR_HEDELEG, hedeleg = std::make_shared<masked_csr_t >(proc, CSR_HEDELEG, hedeleg_mask, 0 ));
180- add_csr (CSR_HCOUNTEREN, hcounteren = std::make_shared<masked_csr_t >(proc, CSR_HCOUNTEREN, counteren_mask, 0 ));
181+ add_hypervisor_csr (CSR_HEDELEG, hedeleg = std::make_shared<masked_csr_t >(proc, CSR_HEDELEG, hedeleg_mask, 0 ));
182+ add_hypervisor_csr (CSR_HCOUNTEREN, hcounteren = std::make_shared<masked_csr_t >(proc, CSR_HCOUNTEREN, counteren_mask, 0 ));
181183 htimedelta = std::make_shared<basic_csr_t >(proc, CSR_HTIMEDELTA, 0 );
182184 if (xlen == 32 ) {
183- add_csr (CSR_HTIMEDELTA, std::make_shared<rv32_low_csr_t >(proc, CSR_HTIMEDELTA, htimedelta));
184- add_csr (CSR_HTIMEDELTAH, std::make_shared<rv32_high_csr_t >(proc, CSR_HTIMEDELTAH, htimedelta));
185+ add_hypervisor_csr (CSR_HTIMEDELTA, std::make_shared<rv32_low_csr_t >(proc, CSR_HTIMEDELTA, htimedelta));
186+ add_hypervisor_csr (CSR_HTIMEDELTAH, std::make_shared<rv32_high_csr_t >(proc, CSR_HTIMEDELTAH, htimedelta));
185187 } else {
186- add_csr (CSR_HTIMEDELTA, htimedelta);
188+ add_hypervisor_csr (CSR_HTIMEDELTA, htimedelta);
187189 }
188- add_csr (CSR_HTVAL, htval = std::make_shared<basic_csr_t >(proc, CSR_HTVAL, 0 ));
189- add_csr (CSR_HTINST, htinst = std::make_shared<basic_csr_t >(proc, CSR_HTINST, 0 ));
190- add_csr (CSR_HGATP, hgatp = std::make_shared<hgatp_csr_t >(proc, CSR_HGATP));
190+ add_hypervisor_csr (CSR_HTVAL, htval = std::make_shared<basic_csr_t >(proc, CSR_HTVAL, 0 ));
191+ add_hypervisor_csr (CSR_HTINST, htinst = std::make_shared<basic_csr_t >(proc, CSR_HTINST, 0 ));
192+ add_hypervisor_csr (CSR_HGATP, hgatp = std::make_shared<hgatp_csr_t >(proc, CSR_HGATP));
191193 nonvirtual_sstatus = std::make_shared<sstatus_proxy_csr_t >(proc, CSR_SSTATUS, mstatus);
192- add_csr (CSR_VSSTATUS, vsstatus = std::make_shared<vsstatus_csr_t >(proc, CSR_VSSTATUS));
193- add_csr (CSR_SSTATUS, sstatus = std::make_shared<sstatus_csr_t >(proc, nonvirtual_sstatus, vsstatus));
194+ add_hypervisor_csr (CSR_VSSTATUS, vsstatus = std::make_shared<vsstatus_csr_t >(proc, CSR_VSSTATUS));
195+ add_supervisor_csr (CSR_SSTATUS, sstatus = std::make_shared<sstatus_csr_t >(proc, nonvirtual_sstatus, vsstatus));
194196
195197 add_csr (CSR_DPC, dpc = std::make_shared<dpc_csr_t >(proc, CSR_DPC));
196198 add_csr (CSR_DSCRATCH0, std::make_shared<debug_mode_csr_t >(proc, CSR_DSCRATCH0));
@@ -212,10 +214,10 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
212214 add_csr (CSR_TCONTROL, tcontrol = std::make_shared<const_csr_t >(proc, CSR_TCONTROL, 0 ));
213215 }
214216 unsigned scontext_length = (xlen == 32 ? 16 : 32 ); // debug spec suggests 16-bit for RV32 and 32-bit for RV64
215- add_csr (CSR_SCONTEXT, scontext = std::make_shared<masked_csr_t >(proc, CSR_SCONTEXT, (reg_t (1 ) << scontext_length) - 1 , 0 ));
217+ add_supervisor_csr (CSR_SCONTEXT, scontext = std::make_shared<masked_csr_t >(proc, CSR_SCONTEXT, (reg_t (1 ) << scontext_length) - 1 , 0 ));
216218 unsigned hcontext_length = (xlen == 32 ? 6 : 13 ) + (proc->extension_enabled (' H' ) ? 1 : 0 ); // debug spec suggest 7-bit (6-bit) for RV32 and 14-bit (13-bit) for RV64 with (without) H extension
217219 auto hcontext = std::make_shared<masked_csr_t >(proc, CSR_HCONTEXT, (reg_t (1 ) << hcontext_length) - 1 , 0 );
218- add_csr (CSR_HCONTEXT, hcontext);
220+ add_hypervisor_csr (CSR_HCONTEXT, hcontext);
219221 add_csr (CSR_MCONTEXT, mcontext = std::make_shared<proxy_csr_t >(proc, CSR_MCONTEXT, hcontext));
220222 add_csr (CSR_MSECCFG, mseccfg = std::make_shared<mseccfg_csr_t >(proc, CSR_MSECCFG));
221223
@@ -232,7 +234,7 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
232234 assert (FSR_AEXC_SHIFT == 0 ); // composite_csr_t assumes fflags begins at bit 0
233235 add_csr (CSR_FCSR, std::make_shared<composite_csr_t >(proc, CSR_FCSR, frm, fflags, FSR_RD_SHIFT));
234236
235- add_csr ( CSR_SEED, std::make_shared<seed_csr_t >(proc, CSR_SEED));
237+ add_ext_csr (EXT_ZKR, CSR_SEED, std::make_shared<seed_csr_t >(proc, CSR_SEED));
236238
237239 add_csr (CSR_MARCHID, std::make_shared<const_csr_t >(proc, CSR_MARCHID, 5 ));
238240 add_csr (CSR_MIMPID, std::make_shared<const_csr_t >(proc, CSR_MIMPID, 0 ));
@@ -296,14 +298,14 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
296298 const reg_t hstateen_mask = i == 0 ? hstateen0_mask : HSTATEEN_SSTATEEN;
297299 hstateen[i] = std::make_shared<hstateen_csr_t >(proc, CSR_HSTATEEN0 + i, hstateen_mask, 0 , i);
298300 if (xlen == 32 ) {
299- add_csr (CSR_HSTATEEN0 + i, std::make_shared<rv32_low_csr_t >(proc, CSR_HSTATEEN0 + i, hstateen[i]));
300- add_csr (CSR_HSTATEEN0H + i, std::make_shared<rv32_high_csr_t >(proc, CSR_HSTATEEN0H + i, hstateen[i]));
301+ add_hypervisor_csr (CSR_HSTATEEN0 + i, std::make_shared<rv32_low_csr_t >(proc, CSR_HSTATEEN0 + i, hstateen[i]));
302+ add_hypervisor_csr (CSR_HSTATEEN0H + i, std::make_shared<rv32_high_csr_t >(proc, CSR_HSTATEEN0H + i, hstateen[i]));
301303 } else {
302- add_csr (CSR_HSTATEEN0 + i, hstateen[i]);
304+ add_hypervisor_csr (CSR_HSTATEEN0 + i, hstateen[i]);
303305 }
304306
305307 const reg_t sstateen_mask = i == 0 ? sstateen0_mask : 0 ;
306- add_csr (CSR_SSTATEEN0 + i, sstateen[i] = std::make_shared<sstateen_csr_t >(proc, CSR_SSTATEEN0 + i, sstateen_mask, 0 , i));
308+ add_supervisor_csr (CSR_SSTATEEN0 + i, sstateen[i] = std::make_shared<sstateen_csr_t >(proc, CSR_SSTATEEN0 + i, sstateen_mask, 0 , i));
307309 }
308310 }
309311
@@ -319,13 +321,13 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
319321 vstimecmp = std::make_shared<stimecmp_csr_t >(proc, CSR_VSTIMECMP, MIP_VSTIP);
320322 auto virtualized_stimecmp = std::make_shared<virtualized_stimecmp_csr_t >(proc, stimecmp, vstimecmp);
321323 if (xlen == 32 ) {
322- add_csr (CSR_STIMECMP, std::make_shared<rv32_low_csr_t >(proc, CSR_STIMECMP, virtualized_stimecmp));
323- add_csr (CSR_STIMECMPH, std::make_shared<rv32_high_csr_t >(proc, CSR_STIMECMPH, virtualized_stimecmp));
324- add_csr (CSR_VSTIMECMP, std::make_shared<rv32_low_csr_t >(proc, CSR_VSTIMECMP, vstimecmp));
325- add_csr (CSR_VSTIMECMPH, std::make_shared<rv32_high_csr_t >(proc, CSR_VSTIMECMPH, vstimecmp));
324+ add_supervisor_csr (CSR_STIMECMP, std::make_shared<rv32_low_csr_t >(proc, CSR_STIMECMP, virtualized_stimecmp));
325+ add_supervisor_csr (CSR_STIMECMPH, std::make_shared<rv32_high_csr_t >(proc, CSR_STIMECMPH, virtualized_stimecmp));
326+ add_hypervisor_csr (CSR_VSTIMECMP, std::make_shared<rv32_low_csr_t >(proc, CSR_VSTIMECMP, vstimecmp));
327+ add_hypervisor_csr (CSR_VSTIMECMPH, std::make_shared<rv32_high_csr_t >(proc, CSR_VSTIMECMPH, vstimecmp));
326328 } else {
327- add_csr (CSR_STIMECMP, virtualized_stimecmp);
328- add_csr (CSR_VSTIMECMP, vstimecmp);
329+ add_supervisor_csr (CSR_STIMECMP, virtualized_stimecmp);
330+ add_hypervisor_csr (CSR_VSTIMECMP, vstimecmp);
329331 }
330332 }
331333
@@ -347,19 +349,19 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
347349
348350 if (proc->extension_enabled_const (EXT_SSCSRIND)) {
349351 csr_t_p vsiselect = std::make_shared<basic_csr_t >(proc, CSR_VSISELECT, 0 );
350- add_csr (CSR_VSISELECT, vsiselect);
352+ add_hypervisor_csr (CSR_VSISELECT, vsiselect);
351353
352354 csr_t_p siselect = std::make_shared<basic_csr_t >(proc, CSR_SISELECT, 0 );
353- add_csr (CSR_SISELECT, std::make_shared<virtualized_csr_t >(proc, siselect, vsiselect));
355+ add_supervisor_csr (CSR_SISELECT, std::make_shared<virtualized_csr_t >(proc, siselect, vsiselect));
354356
355357 const reg_t vsireg_csrs[] = { CSR_VSIREG, CSR_VSIREG2, CSR_VSIREG3, CSR_VSIREG4, CSR_VSIREG5, CSR_VSIREG6 };
356358 const reg_t sireg_csrs[] = { CSR_SIREG, CSR_SIREG2, CSR_SIREG3, CSR_SIREG4, CSR_SIREG5, CSR_SIREG6 };
357359 for (size_t i = 0 ; i < std::size (vsireg_csrs); i++) {
358360 auto vsireg = std::make_shared<sscsrind_reg_csr_t >(proc, vsireg_csrs[i], vsiselect);
359- add_csr (vsireg_csrs[i], vsireg);
361+ add_hypervisor_csr (vsireg_csrs[i], vsireg);
360362
361363 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));
364+ add_supervisor_csr (sireg_csrs[i], std::make_shared<virtualized_indirect_csr_t >(proc, sireg, vsireg));
363365 }
364366 }
365367
0 commit comments