@@ -119,48 +119,50 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
119
119
120
120
auto nonvirtual_sip = std::make_shared<mip_proxy_csr_t >(proc, CSR_SIP, sip_sie_accr);
121
121
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 ));
126
126
127
127
auto nonvirtual_sie = std::make_shared<mie_proxy_csr_t >(proc, CSR_SIE, sip_sie_accr);
128
128
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));
132
132
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));
135
135
const reg_t counteren_mask = (proc->extension_enabled_const (EXT_ZICNTR) ? 0x7UL : 0x0 ) | (proc->extension_enabled_const (EXT_ZIHPM) ? 0xfffffff8ULL : 0x0 );
136
136
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 ));
138
138
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));
141
141
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));
144
144
auto sscratch = std::make_shared<basic_csr_t >(proc, CSR_SSCRATCH, 0 );
145
145
auto vsscratch = std::make_shared<basic_csr_t >(proc, CSR_VSSCRATCH, 0 );
146
146
// 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);
149
149
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));
152
152
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));
155
155
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));
164
166
const reg_t hedeleg_mask =
165
167
(1 << CAUSE_MISALIGNED_FETCH) |
166
168
(1 << CAUSE_FETCH_ACCESS) |
@@ -176,21 +178,21 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
176
178
(1 << CAUSE_STORE_PAGE_FAULT) |
177
179
(1 << CAUSE_SOFTWARE_CHECK_FAULT) |
178
180
(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 ));
181
183
htimedelta = std::make_shared<basic_csr_t >(proc, CSR_HTIMEDELTA, 0 );
182
184
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));
185
187
} else {
186
- add_csr (CSR_HTIMEDELTA, htimedelta);
188
+ add_hypervisor_csr (CSR_HTIMEDELTA, htimedelta);
187
189
}
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));
191
193
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));
194
196
195
197
add_csr (CSR_DPC, dpc = std::make_shared<dpc_csr_t >(proc, CSR_DPC));
196
198
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)
212
214
add_csr (CSR_TCONTROL, tcontrol = std::make_shared<const_csr_t >(proc, CSR_TCONTROL, 0 ));
213
215
}
214
216
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 ));
216
218
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
217
219
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);
219
221
add_csr (CSR_MCONTEXT, mcontext = std::make_shared<proxy_csr_t >(proc, CSR_MCONTEXT, hcontext));
220
222
add_csr (CSR_MSECCFG, mseccfg = std::make_shared<mseccfg_csr_t >(proc, CSR_MSECCFG));
221
223
@@ -232,7 +234,7 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
232
234
assert (FSR_AEXC_SHIFT == 0 ); // composite_csr_t assumes fflags begins at bit 0
233
235
add_csr (CSR_FCSR, std::make_shared<composite_csr_t >(proc, CSR_FCSR, frm, fflags, FSR_RD_SHIFT));
234
236
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));
236
238
237
239
add_csr (CSR_MARCHID, std::make_shared<const_csr_t >(proc, CSR_MARCHID, 5 ));
238
240
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)
296
298
const reg_t hstateen_mask = i == 0 ? hstateen0_mask : HSTATEEN_SSTATEEN;
297
299
hstateen[i] = std::make_shared<hstateen_csr_t >(proc, CSR_HSTATEEN0 + i, hstateen_mask, 0 , i);
298
300
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]));
301
303
} else {
302
- add_csr (CSR_HSTATEEN0 + i, hstateen[i]);
304
+ add_hypervisor_csr (CSR_HSTATEEN0 + i, hstateen[i]);
303
305
}
304
306
305
307
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));
307
309
}
308
310
}
309
311
@@ -319,13 +321,13 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
319
321
vstimecmp = std::make_shared<stimecmp_csr_t >(proc, CSR_VSTIMECMP, MIP_VSTIP);
320
322
auto virtualized_stimecmp = std::make_shared<virtualized_stimecmp_csr_t >(proc, stimecmp, vstimecmp);
321
323
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));
326
328
} 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);
329
331
}
330
332
}
331
333
@@ -347,19 +349,19 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
347
349
348
350
if (proc->extension_enabled_const (EXT_SSCSRIND)) {
349
351
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);
351
353
352
354
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));
354
356
355
357
const reg_t vsireg_csrs[] = { CSR_VSIREG, CSR_VSIREG2, CSR_VSIREG3, CSR_VSIREG4, CSR_VSIREG5, CSR_VSIREG6 };
356
358
const reg_t sireg_csrs[] = { CSR_SIREG, CSR_SIREG2, CSR_SIREG3, CSR_SIREG4, CSR_SIREG5, CSR_SIREG6 };
357
359
for (size_t i = 0 ; i < std::size (vsireg_csrs); i++) {
358
360
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);
360
362
361
363
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));
363
365
}
364
366
}
365
367
0 commit comments