1use riscv_csr::csr::{
8 ReadWriteRiscvCsr, MCAUSE, MCYCLE, MCYCLEH, MEPC, MIE, MINSTRET, MINSTRETH, MIP, MSCRATCH,
9 MSECCFG, MSECCFGH, MSTATUS, MTVAL, MTVEC, PMPADDR0, PMPADDR1, PMPADDR10, PMPADDR11, PMPADDR12,
10 PMPADDR13, PMPADDR14, PMPADDR15, PMPADDR16, PMPADDR17, PMPADDR18, PMPADDR19, PMPADDR2,
11 PMPADDR20, PMPADDR21, PMPADDR22, PMPADDR23, PMPADDR24, PMPADDR25, PMPADDR26, PMPADDR27,
12 PMPADDR28, PMPADDR29, PMPADDR3, PMPADDR30, PMPADDR31, PMPADDR32, PMPADDR33, PMPADDR34,
13 PMPADDR35, PMPADDR36, PMPADDR37, PMPADDR38, PMPADDR39, PMPADDR4, PMPADDR40, PMPADDR41,
14 PMPADDR42, PMPADDR43, PMPADDR44, PMPADDR45, PMPADDR46, PMPADDR47, PMPADDR48, PMPADDR49,
15 PMPADDR5, PMPADDR50, PMPADDR51, PMPADDR52, PMPADDR53, PMPADDR54, PMPADDR55, PMPADDR56,
16 PMPADDR57, PMPADDR58, PMPADDR59, PMPADDR6, PMPADDR60, PMPADDR61, PMPADDR62, PMPADDR63,
17 PMPADDR7, PMPADDR8, PMPADDR9, PMPCFG0, PMPCFG1, PMPCFG10, PMPCFG11, PMPCFG12, PMPCFG13,
18 PMPCFG14, PMPCFG15, PMPCFG2, PMPCFG3, PMPCFG4, PMPCFG5, PMPCFG6, PMPCFG7, PMPCFG8, PMPCFG9,
19 STVEC, UTVEC,
20};
21use tock_registers::fields::FieldValue;
22use tock_registers::interfaces::{ReadWriteable, Readable, Writeable};
23
24pub mod mcause;
25pub mod mcycle;
26pub mod mepc;
27pub mod mie;
28pub mod minstret;
29pub mod mip;
30pub mod mscratch;
31pub mod mseccfg;
32pub mod mstatus;
33pub mod mtval;
34pub mod mtvec;
35pub mod pmpaddr;
36pub mod pmpconfig;
37pub mod stvec;
38pub mod utvec;
39
40pub struct CSR {
46 #[cfg(not(target_arch = "riscv64"))]
47 pub minstreth: ReadWriteRiscvCsr<usize, minstret::minstreth::Register, MINSTRETH>,
48 pub minstret: ReadWriteRiscvCsr<usize, minstret::minstret::Register, MINSTRET>,
49
50 #[cfg(not(target_arch = "riscv64"))]
51 pub mcycleh: ReadWriteRiscvCsr<usize, mcycle::mcycleh::Register, MCYCLEH>,
52 pub mcycle: ReadWriteRiscvCsr<usize, mcycle::mcycle::Register, MCYCLE>,
53
54 #[cfg(not(target_arch = "riscv64"))]
55 pub pmpcfg0: ReadWriteRiscvCsr<usize, pmpconfig::pmpcfg::Register, PMPCFG0>,
56 #[cfg(not(target_arch = "riscv64"))]
57 pub pmpcfg1: ReadWriteRiscvCsr<usize, pmpconfig::pmpcfg::Register, PMPCFG1>,
58 pub pmpcfg2: ReadWriteRiscvCsr<usize, pmpconfig::pmpcfg::Register, PMPCFG2>,
59 #[cfg(not(target_arch = "riscv64"))]
60 pub pmpcfg3: ReadWriteRiscvCsr<usize, pmpconfig::pmpcfg::Register, PMPCFG3>,
61 pub pmpcfg4: ReadWriteRiscvCsr<usize, pmpconfig::pmpcfg::Register, PMPCFG4>,
62 #[cfg(not(target_arch = "riscv64"))]
63 pub pmpcfg5: ReadWriteRiscvCsr<usize, pmpconfig::pmpcfg::Register, PMPCFG5>,
64 pub pmpcfg6: ReadWriteRiscvCsr<usize, pmpconfig::pmpcfg::Register, PMPCFG6>,
65 #[cfg(not(target_arch = "riscv64"))]
66 pub pmpcfg7: ReadWriteRiscvCsr<usize, pmpconfig::pmpcfg::Register, PMPCFG7>,
67 pub pmpcfg8: ReadWriteRiscvCsr<usize, pmpconfig::pmpcfg::Register, PMPCFG8>,
68 #[cfg(not(target_arch = "riscv64"))]
69 pub pmpcfg9: ReadWriteRiscvCsr<usize, pmpconfig::pmpcfg::Register, PMPCFG9>,
70 pub pmpcfg10: ReadWriteRiscvCsr<usize, pmpconfig::pmpcfg::Register, PMPCFG10>,
71 #[cfg(not(target_arch = "riscv64"))]
72 pub pmpcfg11: ReadWriteRiscvCsr<usize, pmpconfig::pmpcfg::Register, PMPCFG11>,
73 pub pmpcfg12: ReadWriteRiscvCsr<usize, pmpconfig::pmpcfg::Register, PMPCFG12>,
74 #[cfg(not(target_arch = "riscv64"))]
75 pub pmpcfg13: ReadWriteRiscvCsr<usize, pmpconfig::pmpcfg::Register, PMPCFG13>,
76 pub pmpcfg14: ReadWriteRiscvCsr<usize, pmpconfig::pmpcfg::Register, PMPCFG14>,
77 #[cfg(not(target_arch = "riscv64"))]
78 pub pmpcfg15: ReadWriteRiscvCsr<usize, pmpconfig::pmpcfg::Register, PMPCFG15>,
79
80 pub pmpaddr0: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR0>,
81 pub pmpaddr1: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR1>,
82 pub pmpaddr2: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR2>,
83 pub pmpaddr3: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR3>,
84 pub pmpaddr4: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR4>,
85 pub pmpaddr5: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR5>,
86 pub pmpaddr6: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR6>,
87 pub pmpaddr7: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR7>,
88 pub pmpaddr8: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR8>,
89 pub pmpaddr9: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR9>,
90 pub pmpaddr10: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR10>,
91 pub pmpaddr11: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR11>,
92 pub pmpaddr12: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR12>,
93 pub pmpaddr13: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR13>,
94 pub pmpaddr14: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR14>,
95 pub pmpaddr15: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR15>,
96 pub pmpaddr16: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR16>,
97 pub pmpaddr17: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR17>,
98 pub pmpaddr18: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR18>,
99 pub pmpaddr19: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR19>,
100 pub pmpaddr20: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR20>,
101 pub pmpaddr21: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR21>,
102 pub pmpaddr22: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR22>,
103 pub pmpaddr23: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR23>,
104 pub pmpaddr24: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR24>,
105 pub pmpaddr25: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR25>,
106 pub pmpaddr26: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR26>,
107 pub pmpaddr27: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR27>,
108 pub pmpaddr28: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR28>,
109 pub pmpaddr29: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR29>,
110 pub pmpaddr30: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR30>,
111 pub pmpaddr31: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR31>,
112 pub pmpaddr32: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR32>,
113 pub pmpaddr33: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR33>,
114 pub pmpaddr34: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR34>,
115 pub pmpaddr35: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR35>,
116 pub pmpaddr36: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR36>,
117 pub pmpaddr37: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR37>,
118 pub pmpaddr38: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR38>,
119 pub pmpaddr39: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR39>,
120 pub pmpaddr40: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR40>,
121 pub pmpaddr41: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR41>,
122 pub pmpaddr42: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR42>,
123 pub pmpaddr43: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR43>,
124 pub pmpaddr44: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR44>,
125 pub pmpaddr45: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR45>,
126 pub pmpaddr46: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR46>,
127 pub pmpaddr47: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR47>,
128 pub pmpaddr48: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR48>,
129 pub pmpaddr49: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR49>,
130 pub pmpaddr50: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR50>,
131 pub pmpaddr51: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR51>,
132 pub pmpaddr52: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR52>,
133 pub pmpaddr53: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR53>,
134 pub pmpaddr54: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR54>,
135 pub pmpaddr55: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR55>,
136 pub pmpaddr56: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR56>,
137 pub pmpaddr57: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR57>,
138 pub pmpaddr58: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR58>,
139 pub pmpaddr59: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR59>,
140 pub pmpaddr60: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR60>,
141 pub pmpaddr61: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR61>,
142 pub pmpaddr62: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR62>,
143 pub pmpaddr63: ReadWriteRiscvCsr<usize, pmpaddr::pmpaddr::Register, PMPADDR63>,
144
145 pub mie: ReadWriteRiscvCsr<usize, mie::mie::Register, MIE>,
146 pub mscratch: ReadWriteRiscvCsr<usize, mscratch::mscratch::Register, MSCRATCH>,
147 pub mepc: ReadWriteRiscvCsr<usize, mepc::mepc::Register, MEPC>,
148 pub mcause: ReadWriteRiscvCsr<usize, mcause::mcause::Register, MCAUSE>,
149 pub mtval: ReadWriteRiscvCsr<usize, mtval::mtval::Register, MTVAL>,
150 pub mip: ReadWriteRiscvCsr<usize, mip::mip::Register, MIP>,
151 pub mtvec: ReadWriteRiscvCsr<usize, mtvec::mtvec::Register, MTVEC>,
152 pub mstatus: ReadWriteRiscvCsr<usize, mstatus::mstatus::Register, MSTATUS>,
153
154 pub mseccfg: ReadWriteRiscvCsr<usize, mseccfg::mseccfg::Register, MSECCFG>,
155 #[cfg(not(target_arch = "riscv64"))]
156 pub mseccfgh: ReadWriteRiscvCsr<usize, mseccfg::mseccfgh::Register, MSECCFGH>,
157
158 pub utvec: ReadWriteRiscvCsr<usize, utvec::utvec::Register, UTVEC>,
159 pub stvec: ReadWriteRiscvCsr<usize, stvec::stvec::Register, STVEC>,
160}
161
162pub const CSR: &CSR = &CSR {
164 #[cfg(not(target_arch = "riscv64"))]
165 minstreth: ReadWriteRiscvCsr::new(),
166 minstret: ReadWriteRiscvCsr::new(),
167
168 #[cfg(not(target_arch = "riscv64"))]
169 mcycleh: ReadWriteRiscvCsr::new(),
170 mcycle: ReadWriteRiscvCsr::new(),
171
172 pmpcfg0: ReadWriteRiscvCsr::new(),
173 #[cfg(not(target_arch = "riscv64"))]
174 pmpcfg1: ReadWriteRiscvCsr::new(),
175 pmpcfg2: ReadWriteRiscvCsr::new(),
176 #[cfg(not(target_arch = "riscv64"))]
177 pmpcfg3: ReadWriteRiscvCsr::new(),
178 pmpcfg4: ReadWriteRiscvCsr::new(),
179 #[cfg(not(target_arch = "riscv64"))]
180 pmpcfg5: ReadWriteRiscvCsr::new(),
181 pmpcfg6: ReadWriteRiscvCsr::new(),
182 #[cfg(not(target_arch = "riscv64"))]
183 pmpcfg7: ReadWriteRiscvCsr::new(),
184 pmpcfg8: ReadWriteRiscvCsr::new(),
185 #[cfg(not(target_arch = "riscv64"))]
186 pmpcfg9: ReadWriteRiscvCsr::new(),
187 pmpcfg10: ReadWriteRiscvCsr::new(),
188 #[cfg(not(target_arch = "riscv64"))]
189 pmpcfg11: ReadWriteRiscvCsr::new(),
190 pmpcfg12: ReadWriteRiscvCsr::new(),
191 #[cfg(not(target_arch = "riscv64"))]
192 pmpcfg13: ReadWriteRiscvCsr::new(),
193 pmpcfg14: ReadWriteRiscvCsr::new(),
194 #[cfg(not(target_arch = "riscv64"))]
195 pmpcfg15: ReadWriteRiscvCsr::new(),
196
197 pmpaddr0: ReadWriteRiscvCsr::new(),
198 pmpaddr1: ReadWriteRiscvCsr::new(),
199 pmpaddr2: ReadWriteRiscvCsr::new(),
200 pmpaddr3: ReadWriteRiscvCsr::new(),
201 pmpaddr4: ReadWriteRiscvCsr::new(),
202 pmpaddr5: ReadWriteRiscvCsr::new(),
203 pmpaddr6: ReadWriteRiscvCsr::new(),
204 pmpaddr7: ReadWriteRiscvCsr::new(),
205 pmpaddr8: ReadWriteRiscvCsr::new(),
206 pmpaddr9: ReadWriteRiscvCsr::new(),
207 pmpaddr10: ReadWriteRiscvCsr::new(),
208 pmpaddr11: ReadWriteRiscvCsr::new(),
209 pmpaddr12: ReadWriteRiscvCsr::new(),
210 pmpaddr13: ReadWriteRiscvCsr::new(),
211 pmpaddr14: ReadWriteRiscvCsr::new(),
212 pmpaddr15: ReadWriteRiscvCsr::new(),
213 pmpaddr16: ReadWriteRiscvCsr::new(),
214 pmpaddr17: ReadWriteRiscvCsr::new(),
215 pmpaddr18: ReadWriteRiscvCsr::new(),
216 pmpaddr19: ReadWriteRiscvCsr::new(),
217 pmpaddr20: ReadWriteRiscvCsr::new(),
218 pmpaddr21: ReadWriteRiscvCsr::new(),
219 pmpaddr22: ReadWriteRiscvCsr::new(),
220 pmpaddr23: ReadWriteRiscvCsr::new(),
221 pmpaddr24: ReadWriteRiscvCsr::new(),
222 pmpaddr25: ReadWriteRiscvCsr::new(),
223 pmpaddr26: ReadWriteRiscvCsr::new(),
224 pmpaddr27: ReadWriteRiscvCsr::new(),
225 pmpaddr28: ReadWriteRiscvCsr::new(),
226 pmpaddr29: ReadWriteRiscvCsr::new(),
227 pmpaddr30: ReadWriteRiscvCsr::new(),
228 pmpaddr31: ReadWriteRiscvCsr::new(),
229 pmpaddr32: ReadWriteRiscvCsr::new(),
230 pmpaddr33: ReadWriteRiscvCsr::new(),
231 pmpaddr34: ReadWriteRiscvCsr::new(),
232 pmpaddr35: ReadWriteRiscvCsr::new(),
233 pmpaddr36: ReadWriteRiscvCsr::new(),
234 pmpaddr37: ReadWriteRiscvCsr::new(),
235 pmpaddr38: ReadWriteRiscvCsr::new(),
236 pmpaddr39: ReadWriteRiscvCsr::new(),
237 pmpaddr40: ReadWriteRiscvCsr::new(),
238 pmpaddr41: ReadWriteRiscvCsr::new(),
239 pmpaddr42: ReadWriteRiscvCsr::new(),
240 pmpaddr43: ReadWriteRiscvCsr::new(),
241 pmpaddr44: ReadWriteRiscvCsr::new(),
242 pmpaddr45: ReadWriteRiscvCsr::new(),
243 pmpaddr46: ReadWriteRiscvCsr::new(),
244 pmpaddr47: ReadWriteRiscvCsr::new(),
245 pmpaddr48: ReadWriteRiscvCsr::new(),
246 pmpaddr49: ReadWriteRiscvCsr::new(),
247 pmpaddr50: ReadWriteRiscvCsr::new(),
248 pmpaddr51: ReadWriteRiscvCsr::new(),
249 pmpaddr52: ReadWriteRiscvCsr::new(),
250 pmpaddr53: ReadWriteRiscvCsr::new(),
251 pmpaddr54: ReadWriteRiscvCsr::new(),
252 pmpaddr55: ReadWriteRiscvCsr::new(),
253 pmpaddr56: ReadWriteRiscvCsr::new(),
254 pmpaddr57: ReadWriteRiscvCsr::new(),
255 pmpaddr58: ReadWriteRiscvCsr::new(),
256 pmpaddr59: ReadWriteRiscvCsr::new(),
257 pmpaddr60: ReadWriteRiscvCsr::new(),
258 pmpaddr61: ReadWriteRiscvCsr::new(),
259 pmpaddr62: ReadWriteRiscvCsr::new(),
260 pmpaddr63: ReadWriteRiscvCsr::new(),
261
262 mie: ReadWriteRiscvCsr::new(),
263 mscratch: ReadWriteRiscvCsr::new(),
264 mepc: ReadWriteRiscvCsr::new(),
265 mcause: ReadWriteRiscvCsr::new(),
266 mtval: ReadWriteRiscvCsr::new(),
267 mip: ReadWriteRiscvCsr::new(),
268 mtvec: ReadWriteRiscvCsr::new(),
269 mstatus: ReadWriteRiscvCsr::new(),
270
271 mseccfg: ReadWriteRiscvCsr::new(),
272 #[cfg(not(target_arch = "riscv64"))]
273 mseccfgh: ReadWriteRiscvCsr::new(),
274
275 utvec: ReadWriteRiscvCsr::new(),
276 stvec: ReadWriteRiscvCsr::new(),
277};
278
279impl CSR {
280 #[cfg(not(target_arch = "riscv64"))]
282 pub fn reset_cycle_counter(&self) {
283 CSR.mcycle.write(mcycle::mcycle::mcycle.val(0));
285 CSR.mcycleh.write(mcycle::mcycleh::mcycleh.val(0));
286 }
287
288 #[cfg(target_arch = "riscv64")]
290 pub fn reset_cycle_counter(&self) {
291 CSR.mcycle.write(mcycle::mcycle::mcycle.val(0));
292 }
293
294 #[cfg(not(target_arch = "riscv64"))]
296 pub fn read_cycle_counter(&self) -> u64 {
297 let (mut top, mut bot): (usize, usize);
298
299 loop {
303 top = CSR.mcycleh.read(mcycle::mcycleh::mcycleh);
304 bot = CSR.mcycle.read(mcycle::mcycle::mcycle);
305 if top == CSR.mcycleh.read(mcycle::mcycleh::mcycleh) {
306 break;
307 }
308 }
309
310 (top as u64).checked_shl(32).unwrap() + bot as u64
311 }
312
313 #[cfg(target_arch = "riscv64")]
315 pub fn read_cycle_counter(&self) -> u64 {
316 CSR.mcycle.read(mcycle::mcycle::mcycle)
317 }
318
319 pub fn pmpconfig_get(&self, index: usize) -> usize {
320 match index {
321 0 => self.pmpcfg0.get(),
322 #[cfg(not(target_arch = "riscv64"))]
323 1 => self.pmpcfg1.get(),
324 2 => self.pmpcfg2.get(),
325 #[cfg(not(target_arch = "riscv64"))]
326 3 => self.pmpcfg3.get(),
327 4 => self.pmpcfg4.get(),
328 #[cfg(not(target_arch = "riscv64"))]
329 5 => self.pmpcfg5.get(),
330 6 => self.pmpcfg6.get(),
331 #[cfg(not(target_arch = "riscv64"))]
332 7 => self.pmpcfg7.get(),
333 8 => self.pmpcfg8.get(),
334 #[cfg(not(target_arch = "riscv64"))]
335 9 => self.pmpcfg9.get(),
336 10 => self.pmpcfg10.get(),
337 #[cfg(not(target_arch = "riscv64"))]
338 11 => self.pmpcfg11.get(),
339 12 => self.pmpcfg12.get(),
340 #[cfg(not(target_arch = "riscv64"))]
341 13 => self.pmpcfg13.get(),
342 14 => self.pmpcfg14.get(),
343 #[cfg(not(target_arch = "riscv64"))]
344 15 => self.pmpcfg15.get(),
345 _ => unreachable!(),
346 }
347 }
348
349 pub fn pmpconfig_set(&self, index: usize, value: usize) {
350 match index {
351 0 => self.pmpcfg0.set(value),
352 #[cfg(not(target_arch = "riscv64"))]
353 1 => self.pmpcfg1.set(value),
354 2 => self.pmpcfg2.set(value),
355 #[cfg(not(target_arch = "riscv64"))]
356 3 => self.pmpcfg3.set(value),
357 4 => self.pmpcfg4.set(value),
358 #[cfg(not(target_arch = "riscv64"))]
359 5 => self.pmpcfg5.set(value),
360 6 => self.pmpcfg6.set(value),
361 #[cfg(not(target_arch = "riscv64"))]
362 7 => self.pmpcfg7.set(value),
363 8 => self.pmpcfg8.set(value),
364 #[cfg(not(target_arch = "riscv64"))]
365 9 => self.pmpcfg9.set(value),
366 10 => self.pmpcfg10.set(value),
367 #[cfg(not(target_arch = "riscv64"))]
368 11 => self.pmpcfg11.set(value),
369 12 => self.pmpcfg12.set(value),
370 #[cfg(not(target_arch = "riscv64"))]
371 13 => self.pmpcfg13.set(value),
372 14 => self.pmpcfg14.set(value),
373 #[cfg(not(target_arch = "riscv64"))]
374 15 => self.pmpcfg15.set(value),
375 _ => unreachable!(),
376 }
377 }
378
379 pub fn pmpconfig_modify(
380 &self,
381 index: usize,
382 field: FieldValue<usize, pmpconfig::pmpcfg::Register>,
383 ) {
384 match index {
385 0 => self.pmpcfg0.modify(field),
386 #[cfg(not(target_arch = "riscv64"))]
387 1 => self.pmpcfg1.modify(field),
388 2 => self.pmpcfg2.modify(field),
389 #[cfg(not(target_arch = "riscv64"))]
390 3 => self.pmpcfg3.modify(field),
391 4 => self.pmpcfg4.modify(field),
392 #[cfg(not(target_arch = "riscv64"))]
393 5 => self.pmpcfg5.modify(field),
394 6 => self.pmpcfg6.modify(field),
395 #[cfg(not(target_arch = "riscv64"))]
396 7 => self.pmpcfg7.modify(field),
397 8 => self.pmpcfg8.modify(field),
398 #[cfg(not(target_arch = "riscv64"))]
399 9 => self.pmpcfg9.modify(field),
400 10 => self.pmpcfg10.modify(field),
401 #[cfg(not(target_arch = "riscv64"))]
402 11 => self.pmpcfg11.modify(field),
403 12 => self.pmpcfg12.modify(field),
404 #[cfg(not(target_arch = "riscv64"))]
405 13 => self.pmpcfg13.modify(field),
406 14 => self.pmpcfg14.modify(field),
407 #[cfg(not(target_arch = "riscv64"))]
408 15 => self.pmpcfg15.modify(field),
409 _ => unreachable!(),
410 }
411 }
412
413 pub fn pmpaddr_set(&self, index: usize, value: usize) {
414 match index {
415 0 => self.pmpaddr0.set(value),
416 1 => self.pmpaddr1.set(value),
417 2 => self.pmpaddr2.set(value),
418 3 => self.pmpaddr3.set(value),
419 4 => self.pmpaddr4.set(value),
420 5 => self.pmpaddr5.set(value),
421 6 => self.pmpaddr6.set(value),
422 7 => self.pmpaddr7.set(value),
423 8 => self.pmpaddr8.set(value),
424 9 => self.pmpaddr9.set(value),
425 10 => self.pmpaddr10.set(value),
426 11 => self.pmpaddr11.set(value),
427 12 => self.pmpaddr12.set(value),
428 13 => self.pmpaddr13.set(value),
429 14 => self.pmpaddr14.set(value),
430 15 => self.pmpaddr15.set(value),
431 16 => self.pmpaddr16.set(value),
432 17 => self.pmpaddr17.set(value),
433 18 => self.pmpaddr18.set(value),
434 19 => self.pmpaddr19.set(value),
435 20 => self.pmpaddr20.set(value),
436 21 => self.pmpaddr21.set(value),
437 22 => self.pmpaddr22.set(value),
438 23 => self.pmpaddr23.set(value),
439 24 => self.pmpaddr24.set(value),
440 25 => self.pmpaddr25.set(value),
441 26 => self.pmpaddr26.set(value),
442 27 => self.pmpaddr27.set(value),
443 28 => self.pmpaddr28.set(value),
444 29 => self.pmpaddr29.set(value),
445 30 => self.pmpaddr30.set(value),
446 31 => self.pmpaddr31.set(value),
447 32 => self.pmpaddr32.set(value),
448 33 => self.pmpaddr33.set(value),
449 34 => self.pmpaddr34.set(value),
450 35 => self.pmpaddr35.set(value),
451 36 => self.pmpaddr36.set(value),
452 37 => self.pmpaddr37.set(value),
453 38 => self.pmpaddr38.set(value),
454 39 => self.pmpaddr39.set(value),
455 40 => self.pmpaddr40.set(value),
456 41 => self.pmpaddr41.set(value),
457 42 => self.pmpaddr42.set(value),
458 43 => self.pmpaddr43.set(value),
459 44 => self.pmpaddr44.set(value),
460 45 => self.pmpaddr45.set(value),
461 46 => self.pmpaddr46.set(value),
462 47 => self.pmpaddr47.set(value),
463 48 => self.pmpaddr48.set(value),
464 49 => self.pmpaddr49.set(value),
465 50 => self.pmpaddr50.set(value),
466 51 => self.pmpaddr51.set(value),
467 52 => self.pmpaddr52.set(value),
468 53 => self.pmpaddr53.set(value),
469 54 => self.pmpaddr54.set(value),
470 55 => self.pmpaddr55.set(value),
471 56 => self.pmpaddr56.set(value),
472 57 => self.pmpaddr57.set(value),
473 58 => self.pmpaddr58.set(value),
474 59 => self.pmpaddr59.set(value),
475 60 => self.pmpaddr60.set(value),
476 61 => self.pmpaddr61.set(value),
477 62 => self.pmpaddr62.set(value),
478 63 => self.pmpaddr63.set(value),
479 _ => unreachable!(),
480 }
481 }
482
483 pub fn pmpaddr_get(&self, index: usize) -> usize {
484 match index {
485 0 => self.pmpaddr0.get(),
486 1 => self.pmpaddr1.get(),
487 2 => self.pmpaddr2.get(),
488 3 => self.pmpaddr3.get(),
489 4 => self.pmpaddr4.get(),
490 5 => self.pmpaddr5.get(),
491 6 => self.pmpaddr6.get(),
492 7 => self.pmpaddr7.get(),
493 8 => self.pmpaddr8.get(),
494 9 => self.pmpaddr9.get(),
495 10 => self.pmpaddr10.get(),
496 11 => self.pmpaddr11.get(),
497 12 => self.pmpaddr12.get(),
498 13 => self.pmpaddr13.get(),
499 14 => self.pmpaddr14.get(),
500 15 => self.pmpaddr15.get(),
501 16 => self.pmpaddr16.get(),
502 17 => self.pmpaddr17.get(),
503 18 => self.pmpaddr18.get(),
504 19 => self.pmpaddr19.get(),
505 20 => self.pmpaddr20.get(),
506 21 => self.pmpaddr21.get(),
507 22 => self.pmpaddr22.get(),
508 23 => self.pmpaddr23.get(),
509 24 => self.pmpaddr24.get(),
510 25 => self.pmpaddr25.get(),
511 26 => self.pmpaddr26.get(),
512 27 => self.pmpaddr27.get(),
513 28 => self.pmpaddr28.get(),
514 29 => self.pmpaddr29.get(),
515 30 => self.pmpaddr30.get(),
516 31 => self.pmpaddr31.get(),
517 32 => self.pmpaddr32.get(),
518 33 => self.pmpaddr33.get(),
519 34 => self.pmpaddr34.get(),
520 35 => self.pmpaddr35.get(),
521 36 => self.pmpaddr36.get(),
522 37 => self.pmpaddr37.get(),
523 38 => self.pmpaddr38.get(),
524 39 => self.pmpaddr39.get(),
525 40 => self.pmpaddr40.get(),
526 41 => self.pmpaddr41.get(),
527 42 => self.pmpaddr42.get(),
528 43 => self.pmpaddr43.get(),
529 44 => self.pmpaddr44.get(),
530 45 => self.pmpaddr45.get(),
531 46 => self.pmpaddr46.get(),
532 47 => self.pmpaddr47.get(),
533 48 => self.pmpaddr48.get(),
534 49 => self.pmpaddr49.get(),
535 50 => self.pmpaddr50.get(),
536 51 => self.pmpaddr51.get(),
537 52 => self.pmpaddr52.get(),
538 53 => self.pmpaddr53.get(),
539 54 => self.pmpaddr54.get(),
540 55 => self.pmpaddr55.get(),
541 56 => self.pmpaddr56.get(),
542 57 => self.pmpaddr57.get(),
543 58 => self.pmpaddr58.get(),
544 59 => self.pmpaddr59.get(),
545 60 => self.pmpaddr60.get(),
546 61 => self.pmpaddr61.get(),
547 62 => self.pmpaddr62.get(),
548 63 => self.pmpaddr63.get(),
549 _ => unreachable!(),
550 }
551 }
552}