xref: /openbmc/qemu/target/riscv/csr.c (revision 0d190bd3)
1 /*
2  * RISC-V Control and Status Registers.
3  *
4  * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu
5  * Copyright (c) 2017-2018 SiFive, Inc.
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms and conditions of the GNU General Public License,
9  * version 2 or later, as published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14  * more details.
15  *
16  * You should have received a copy of the GNU General Public License along with
17  * this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include "qemu/osdep.h"
21 #include "qemu/log.h"
22 #include "qemu/timer.h"
23 #include "cpu.h"
24 #include "pmu.h"
25 #include "time_helper.h"
26 #include "qemu/main-loop.h"
27 #include "exec/exec-all.h"
28 #include "sysemu/cpu-timers.h"
29 #include "qemu/guest-random.h"
30 #include "qapi/error.h"
31 
32 /* CSR function table public API */
33 void riscv_get_csr_ops(int csrno, riscv_csr_operations *ops)
34 {
35     *ops = csr_ops[csrno & (CSR_TABLE_SIZE - 1)];
36 }
37 
38 void riscv_set_csr_ops(int csrno, riscv_csr_operations *ops)
39 {
40     csr_ops[csrno & (CSR_TABLE_SIZE - 1)] = *ops;
41 }
42 
43 /* Predicates */
44 #if !defined(CONFIG_USER_ONLY)
45 static RISCVException smstateen_acc_ok(CPURISCVState *env, int index,
46                                        uint64_t bit)
47 {
48     bool virt = riscv_cpu_virt_enabled(env);
49     CPUState *cs = env_cpu(env);
50     RISCVCPU *cpu = RISCV_CPU(cs);
51 
52     if (env->priv == PRV_M || !cpu->cfg.ext_smstateen) {
53         return RISCV_EXCP_NONE;
54     }
55 
56     if (!(env->mstateen[index] & bit)) {
57         return RISCV_EXCP_ILLEGAL_INST;
58     }
59 
60     if (virt) {
61         if (!(env->hstateen[index] & bit)) {
62             return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
63         }
64 
65         if (env->priv == PRV_U && !(env->sstateen[index] & bit)) {
66             return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
67         }
68     }
69 
70     if (env->priv == PRV_U && riscv_has_ext(env, RVS)) {
71         if (!(env->sstateen[index] & bit)) {
72             return RISCV_EXCP_ILLEGAL_INST;
73         }
74     }
75 
76     return RISCV_EXCP_NONE;
77 }
78 #endif
79 
80 static RISCVException fs(CPURISCVState *env, int csrno)
81 {
82 #if !defined(CONFIG_USER_ONLY)
83     if (!env->debugger && !riscv_cpu_fp_enabled(env) &&
84         !RISCV_CPU(env_cpu(env))->cfg.ext_zfinx) {
85         return RISCV_EXCP_ILLEGAL_INST;
86     }
87 #endif
88     return RISCV_EXCP_NONE;
89 }
90 
91 static RISCVException vs(CPURISCVState *env, int csrno)
92 {
93     CPUState *cs = env_cpu(env);
94     RISCVCPU *cpu = RISCV_CPU(cs);
95 
96     if (env->misa_ext & RVV ||
97         cpu->cfg.ext_zve32f || cpu->cfg.ext_zve64f) {
98 #if !defined(CONFIG_USER_ONLY)
99         if (!env->debugger && !riscv_cpu_vector_enabled(env)) {
100             return RISCV_EXCP_ILLEGAL_INST;
101         }
102 #endif
103         return RISCV_EXCP_NONE;
104     }
105     return RISCV_EXCP_ILLEGAL_INST;
106 }
107 
108 static RISCVException ctr(CPURISCVState *env, int csrno)
109 {
110 #if !defined(CONFIG_USER_ONLY)
111     CPUState *cs = env_cpu(env);
112     RISCVCPU *cpu = RISCV_CPU(cs);
113     int ctr_index;
114     target_ulong ctr_mask;
115     int base_csrno = CSR_CYCLE;
116     bool rv32 = riscv_cpu_mxl(env) == MXL_RV32 ? true : false;
117 
118     if (rv32 && csrno >= CSR_CYCLEH) {
119         /* Offset for RV32 hpmcounternh counters */
120         base_csrno += 0x80;
121     }
122     ctr_index = csrno - base_csrno;
123     ctr_mask = BIT(ctr_index);
124 
125     if ((csrno >= CSR_CYCLE && csrno <= CSR_INSTRET) ||
126         (csrno >= CSR_CYCLEH && csrno <= CSR_INSTRETH)) {
127         goto skip_ext_pmu_check;
128     }
129 
130     if (!(cpu->pmu_avail_ctrs & ctr_mask)) {
131         /* No counter is enabled in PMU or the counter is out of range */
132         return RISCV_EXCP_ILLEGAL_INST;
133     }
134 
135 skip_ext_pmu_check:
136 
137     if (env->priv < PRV_M && !get_field(env->mcounteren, ctr_mask)) {
138         return RISCV_EXCP_ILLEGAL_INST;
139     }
140 
141     if (riscv_cpu_virt_enabled(env)) {
142         if (!get_field(env->hcounteren, ctr_mask) ||
143             (env->priv == PRV_U && !get_field(env->scounteren, ctr_mask))) {
144             return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
145         }
146     }
147 
148     if (riscv_has_ext(env, RVS) && env->priv == PRV_U &&
149         !get_field(env->scounteren, ctr_mask)) {
150         return RISCV_EXCP_ILLEGAL_INST;
151     }
152 
153 #endif
154     return RISCV_EXCP_NONE;
155 }
156 
157 static RISCVException ctr32(CPURISCVState *env, int csrno)
158 {
159     if (riscv_cpu_mxl(env) != MXL_RV32) {
160         return RISCV_EXCP_ILLEGAL_INST;
161     }
162 
163     return ctr(env, csrno);
164 }
165 
166 #if !defined(CONFIG_USER_ONLY)
167 static RISCVException mctr(CPURISCVState *env, int csrno)
168 {
169     CPUState *cs = env_cpu(env);
170     RISCVCPU *cpu = RISCV_CPU(cs);
171     int ctr_index;
172     int base_csrno = CSR_MHPMCOUNTER3;
173 
174     if ((riscv_cpu_mxl(env) == MXL_RV32) && csrno >= CSR_MCYCLEH) {
175         /* Offset for RV32 mhpmcounternh counters */
176         base_csrno += 0x80;
177     }
178     ctr_index = csrno - base_csrno;
179     if (!cpu->cfg.pmu_num || ctr_index >= cpu->cfg.pmu_num) {
180         /* The PMU is not enabled or counter is out of range*/
181         return RISCV_EXCP_ILLEGAL_INST;
182     }
183 
184     return RISCV_EXCP_NONE;
185 }
186 
187 static RISCVException mctr32(CPURISCVState *env, int csrno)
188 {
189     if (riscv_cpu_mxl(env) != MXL_RV32) {
190         return RISCV_EXCP_ILLEGAL_INST;
191     }
192 
193     return mctr(env, csrno);
194 }
195 
196 static RISCVException sscofpmf(CPURISCVState *env, int csrno)
197 {
198     CPUState *cs = env_cpu(env);
199     RISCVCPU *cpu = RISCV_CPU(cs);
200 
201     if (!cpu->cfg.ext_sscofpmf) {
202         return RISCV_EXCP_ILLEGAL_INST;
203     }
204 
205     return RISCV_EXCP_NONE;
206 }
207 
208 static RISCVException any(CPURISCVState *env, int csrno)
209 {
210     return RISCV_EXCP_NONE;
211 }
212 
213 static RISCVException any32(CPURISCVState *env, int csrno)
214 {
215     if (riscv_cpu_mxl(env) != MXL_RV32) {
216         return RISCV_EXCP_ILLEGAL_INST;
217     }
218 
219     return any(env, csrno);
220 
221 }
222 
223 static int aia_any(CPURISCVState *env, int csrno)
224 {
225     RISCVCPU *cpu = env_archcpu(env);
226 
227     if (!cpu->cfg.ext_smaia) {
228         return RISCV_EXCP_ILLEGAL_INST;
229     }
230 
231     return any(env, csrno);
232 }
233 
234 static int aia_any32(CPURISCVState *env, int csrno)
235 {
236     RISCVCPU *cpu = env_archcpu(env);
237 
238     if (!cpu->cfg.ext_smaia) {
239         return RISCV_EXCP_ILLEGAL_INST;
240     }
241 
242     return any32(env, csrno);
243 }
244 
245 static RISCVException smode(CPURISCVState *env, int csrno)
246 {
247     if (riscv_has_ext(env, RVS)) {
248         return RISCV_EXCP_NONE;
249     }
250 
251     return RISCV_EXCP_ILLEGAL_INST;
252 }
253 
254 static int smode32(CPURISCVState *env, int csrno)
255 {
256     if (riscv_cpu_mxl(env) != MXL_RV32) {
257         return RISCV_EXCP_ILLEGAL_INST;
258     }
259 
260     return smode(env, csrno);
261 }
262 
263 static int aia_smode(CPURISCVState *env, int csrno)
264 {
265     RISCVCPU *cpu = env_archcpu(env);
266 
267     if (!cpu->cfg.ext_ssaia) {
268         return RISCV_EXCP_ILLEGAL_INST;
269     }
270 
271     return smode(env, csrno);
272 }
273 
274 static int aia_smode32(CPURISCVState *env, int csrno)
275 {
276     RISCVCPU *cpu = env_archcpu(env);
277 
278     if (!cpu->cfg.ext_ssaia) {
279         return RISCV_EXCP_ILLEGAL_INST;
280     }
281 
282     return smode32(env, csrno);
283 }
284 
285 static RISCVException hmode(CPURISCVState *env, int csrno)
286 {
287     if (riscv_has_ext(env, RVH)) {
288         return RISCV_EXCP_NONE;
289     }
290 
291     return RISCV_EXCP_ILLEGAL_INST;
292 }
293 
294 static RISCVException hmode32(CPURISCVState *env, int csrno)
295 {
296     if (riscv_cpu_mxl(env) != MXL_RV32) {
297         return RISCV_EXCP_ILLEGAL_INST;
298     }
299 
300     return hmode(env, csrno);
301 
302 }
303 
304 static RISCVException umode(CPURISCVState *env, int csrno)
305 {
306     if (riscv_has_ext(env, RVU)) {
307         return RISCV_EXCP_NONE;
308     }
309 
310     return RISCV_EXCP_ILLEGAL_INST;
311 }
312 
313 static RISCVException umode32(CPURISCVState *env, int csrno)
314 {
315     if (riscv_cpu_mxl(env) != MXL_RV32) {
316         return RISCV_EXCP_ILLEGAL_INST;
317     }
318 
319     return umode(env, csrno);
320 }
321 
322 static RISCVException mstateen(CPURISCVState *env, int csrno)
323 {
324     CPUState *cs = env_cpu(env);
325     RISCVCPU *cpu = RISCV_CPU(cs);
326 
327     if (!cpu->cfg.ext_smstateen) {
328         return RISCV_EXCP_ILLEGAL_INST;
329     }
330 
331     return any(env, csrno);
332 }
333 
334 static RISCVException hstateen_pred(CPURISCVState *env, int csrno, int base)
335 {
336     CPUState *cs = env_cpu(env);
337     RISCVCPU *cpu = RISCV_CPU(cs);
338 
339     if (!cpu->cfg.ext_smstateen) {
340         return RISCV_EXCP_ILLEGAL_INST;
341     }
342 
343     if (env->priv < PRV_M) {
344         if (!(env->mstateen[csrno - base] & SMSTATEEN_STATEEN)) {
345             return RISCV_EXCP_ILLEGAL_INST;
346         }
347     }
348 
349     return hmode(env, csrno);
350 }
351 
352 static RISCVException hstateen(CPURISCVState *env, int csrno)
353 {
354     return hstateen_pred(env, csrno, CSR_HSTATEEN0);
355 }
356 
357 static RISCVException hstateenh(CPURISCVState *env, int csrno)
358 {
359     return hstateen_pred(env, csrno, CSR_HSTATEEN0H);
360 }
361 
362 static RISCVException sstateen(CPURISCVState *env, int csrno)
363 {
364     bool virt = riscv_cpu_virt_enabled(env);
365     int index = csrno - CSR_SSTATEEN0;
366     CPUState *cs = env_cpu(env);
367     RISCVCPU *cpu = RISCV_CPU(cs);
368 
369     if (!cpu->cfg.ext_smstateen) {
370         return RISCV_EXCP_ILLEGAL_INST;
371     }
372 
373     if (env->priv < PRV_M) {
374         if (!(env->mstateen[index] & SMSTATEEN_STATEEN)) {
375             return RISCV_EXCP_ILLEGAL_INST;
376         }
377 
378         if (virt) {
379             if (!(env->hstateen[index] & SMSTATEEN_STATEEN)) {
380                 return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
381             }
382         }
383     }
384 
385     return smode(env, csrno);
386 }
387 
388 /* Checks if PointerMasking registers could be accessed */
389 static RISCVException pointer_masking(CPURISCVState *env, int csrno)
390 {
391     /* Check if j-ext is present */
392     if (riscv_has_ext(env, RVJ)) {
393         return RISCV_EXCP_NONE;
394     }
395     return RISCV_EXCP_ILLEGAL_INST;
396 }
397 
398 static int aia_hmode(CPURISCVState *env, int csrno)
399 {
400     RISCVCPU *cpu = env_archcpu(env);
401 
402     if (!cpu->cfg.ext_ssaia) {
403         return RISCV_EXCP_ILLEGAL_INST;
404      }
405 
406      return hmode(env, csrno);
407 }
408 
409 static int aia_hmode32(CPURISCVState *env, int csrno)
410 {
411     RISCVCPU *cpu = env_archcpu(env);
412 
413     if (!cpu->cfg.ext_ssaia) {
414         return RISCV_EXCP_ILLEGAL_INST;
415     }
416 
417     return hmode32(env, csrno);
418 }
419 
420 static RISCVException pmp(CPURISCVState *env, int csrno)
421 {
422     if (riscv_feature(env, RISCV_FEATURE_PMP)) {
423         return RISCV_EXCP_NONE;
424     }
425 
426     return RISCV_EXCP_ILLEGAL_INST;
427 }
428 
429 static RISCVException epmp(CPURISCVState *env, int csrno)
430 {
431     if (env->priv == PRV_M && riscv_feature(env, RISCV_FEATURE_EPMP)) {
432         return RISCV_EXCP_NONE;
433     }
434 
435     return RISCV_EXCP_ILLEGAL_INST;
436 }
437 
438 static RISCVException debug(CPURISCVState *env, int csrno)
439 {
440     if (riscv_feature(env, RISCV_FEATURE_DEBUG)) {
441         return RISCV_EXCP_NONE;
442     }
443 
444     return RISCV_EXCP_ILLEGAL_INST;
445 }
446 #endif
447 
448 static RISCVException seed(CPURISCVState *env, int csrno)
449 {
450     RISCVCPU *cpu = env_archcpu(env);
451 
452     if (!cpu->cfg.ext_zkr) {
453         return RISCV_EXCP_ILLEGAL_INST;
454     }
455 
456 #if !defined(CONFIG_USER_ONLY)
457     /*
458      * With a CSR read-write instruction:
459      * 1) The seed CSR is always available in machine mode as normal.
460      * 2) Attempted access to seed from virtual modes VS and VU always raises
461      * an exception(virtual instruction exception only if mseccfg.sseed=1).
462      * 3) Without the corresponding access control bit set to 1, any attempted
463      * access to seed from U, S or HS modes will raise an illegal instruction
464      * exception.
465      */
466     if (env->priv == PRV_M) {
467         return RISCV_EXCP_NONE;
468     } else if (riscv_cpu_virt_enabled(env)) {
469         if (env->mseccfg & MSECCFG_SSEED) {
470             return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
471         } else {
472             return RISCV_EXCP_ILLEGAL_INST;
473         }
474     } else {
475         if (env->priv == PRV_S && (env->mseccfg & MSECCFG_SSEED)) {
476             return RISCV_EXCP_NONE;
477         } else if (env->priv == PRV_U && (env->mseccfg & MSECCFG_USEED)) {
478             return RISCV_EXCP_NONE;
479         } else {
480             return RISCV_EXCP_ILLEGAL_INST;
481         }
482     }
483 #else
484     return RISCV_EXCP_NONE;
485 #endif
486 }
487 
488 /* User Floating-Point CSRs */
489 static RISCVException read_fflags(CPURISCVState *env, int csrno,
490                                   target_ulong *val)
491 {
492     *val = riscv_cpu_get_fflags(env);
493     return RISCV_EXCP_NONE;
494 }
495 
496 static RISCVException write_fflags(CPURISCVState *env, int csrno,
497                                    target_ulong val)
498 {
499 #if !defined(CONFIG_USER_ONLY)
500     if (riscv_has_ext(env, RVF)) {
501         env->mstatus |= MSTATUS_FS;
502     }
503 #endif
504     riscv_cpu_set_fflags(env, val & (FSR_AEXC >> FSR_AEXC_SHIFT));
505     return RISCV_EXCP_NONE;
506 }
507 
508 static RISCVException read_frm(CPURISCVState *env, int csrno,
509                                target_ulong *val)
510 {
511     *val = env->frm;
512     return RISCV_EXCP_NONE;
513 }
514 
515 static RISCVException write_frm(CPURISCVState *env, int csrno,
516                                 target_ulong val)
517 {
518 #if !defined(CONFIG_USER_ONLY)
519     if (riscv_has_ext(env, RVF)) {
520         env->mstatus |= MSTATUS_FS;
521     }
522 #endif
523     env->frm = val & (FSR_RD >> FSR_RD_SHIFT);
524     return RISCV_EXCP_NONE;
525 }
526 
527 static RISCVException read_fcsr(CPURISCVState *env, int csrno,
528                                 target_ulong *val)
529 {
530     *val = (riscv_cpu_get_fflags(env) << FSR_AEXC_SHIFT)
531         | (env->frm << FSR_RD_SHIFT);
532     return RISCV_EXCP_NONE;
533 }
534 
535 static RISCVException write_fcsr(CPURISCVState *env, int csrno,
536                                  target_ulong val)
537 {
538 #if !defined(CONFIG_USER_ONLY)
539     if (riscv_has_ext(env, RVF)) {
540         env->mstatus |= MSTATUS_FS;
541     }
542 #endif
543     env->frm = (val & FSR_RD) >> FSR_RD_SHIFT;
544     riscv_cpu_set_fflags(env, (val & FSR_AEXC) >> FSR_AEXC_SHIFT);
545     return RISCV_EXCP_NONE;
546 }
547 
548 static RISCVException read_vtype(CPURISCVState *env, int csrno,
549                                  target_ulong *val)
550 {
551     uint64_t vill;
552     switch (env->xl) {
553     case MXL_RV32:
554         vill = (uint32_t)env->vill << 31;
555         break;
556     case MXL_RV64:
557         vill = (uint64_t)env->vill << 63;
558         break;
559     default:
560         g_assert_not_reached();
561     }
562     *val = (target_ulong)vill | env->vtype;
563     return RISCV_EXCP_NONE;
564 }
565 
566 static RISCVException read_vl(CPURISCVState *env, int csrno,
567                               target_ulong *val)
568 {
569     *val = env->vl;
570     return RISCV_EXCP_NONE;
571 }
572 
573 static int read_vlenb(CPURISCVState *env, int csrno, target_ulong *val)
574 {
575     *val = env_archcpu(env)->cfg.vlen >> 3;
576     return RISCV_EXCP_NONE;
577 }
578 
579 static RISCVException read_vxrm(CPURISCVState *env, int csrno,
580                                 target_ulong *val)
581 {
582     *val = env->vxrm;
583     return RISCV_EXCP_NONE;
584 }
585 
586 static RISCVException write_vxrm(CPURISCVState *env, int csrno,
587                                  target_ulong val)
588 {
589 #if !defined(CONFIG_USER_ONLY)
590     env->mstatus |= MSTATUS_VS;
591 #endif
592     env->vxrm = val;
593     return RISCV_EXCP_NONE;
594 }
595 
596 static RISCVException read_vxsat(CPURISCVState *env, int csrno,
597                                  target_ulong *val)
598 {
599     *val = env->vxsat;
600     return RISCV_EXCP_NONE;
601 }
602 
603 static RISCVException write_vxsat(CPURISCVState *env, int csrno,
604                                   target_ulong val)
605 {
606 #if !defined(CONFIG_USER_ONLY)
607     env->mstatus |= MSTATUS_VS;
608 #endif
609     env->vxsat = val;
610     return RISCV_EXCP_NONE;
611 }
612 
613 static RISCVException read_vstart(CPURISCVState *env, int csrno,
614                                   target_ulong *val)
615 {
616     *val = env->vstart;
617     return RISCV_EXCP_NONE;
618 }
619 
620 static RISCVException write_vstart(CPURISCVState *env, int csrno,
621                                    target_ulong val)
622 {
623 #if !defined(CONFIG_USER_ONLY)
624     env->mstatus |= MSTATUS_VS;
625 #endif
626     /*
627      * The vstart CSR is defined to have only enough writable bits
628      * to hold the largest element index, i.e. lg2(VLEN) bits.
629      */
630     env->vstart = val & ~(~0ULL << ctzl(env_archcpu(env)->cfg.vlen));
631     return RISCV_EXCP_NONE;
632 }
633 
634 static int read_vcsr(CPURISCVState *env, int csrno, target_ulong *val)
635 {
636     *val = (env->vxrm << VCSR_VXRM_SHIFT) | (env->vxsat << VCSR_VXSAT_SHIFT);
637     return RISCV_EXCP_NONE;
638 }
639 
640 static int write_vcsr(CPURISCVState *env, int csrno, target_ulong val)
641 {
642 #if !defined(CONFIG_USER_ONLY)
643     env->mstatus |= MSTATUS_VS;
644 #endif
645     env->vxrm = (val & VCSR_VXRM) >> VCSR_VXRM_SHIFT;
646     env->vxsat = (val & VCSR_VXSAT) >> VCSR_VXSAT_SHIFT;
647     return RISCV_EXCP_NONE;
648 }
649 
650 /* User Timers and Counters */
651 static target_ulong get_ticks(bool shift)
652 {
653     int64_t val;
654     target_ulong result;
655 
656 #if !defined(CONFIG_USER_ONLY)
657     if (icount_enabled()) {
658         val = icount_get();
659     } else {
660         val = cpu_get_host_ticks();
661     }
662 #else
663     val = cpu_get_host_ticks();
664 #endif
665 
666     if (shift) {
667         result = val >> 32;
668     } else {
669         result = val;
670     }
671 
672     return result;
673 }
674 
675 #if defined(CONFIG_USER_ONLY)
676 static RISCVException read_time(CPURISCVState *env, int csrno,
677                                 target_ulong *val)
678 {
679     *val = cpu_get_host_ticks();
680     return RISCV_EXCP_NONE;
681 }
682 
683 static RISCVException read_timeh(CPURISCVState *env, int csrno,
684                                  target_ulong *val)
685 {
686     *val = cpu_get_host_ticks() >> 32;
687     return RISCV_EXCP_NONE;
688 }
689 
690 static int read_hpmcounter(CPURISCVState *env, int csrno, target_ulong *val)
691 {
692     *val = get_ticks(false);
693     return RISCV_EXCP_NONE;
694 }
695 
696 static int read_hpmcounterh(CPURISCVState *env, int csrno, target_ulong *val)
697 {
698     *val = get_ticks(true);
699     return RISCV_EXCP_NONE;
700 }
701 
702 #else /* CONFIG_USER_ONLY */
703 
704 static int read_mhpmevent(CPURISCVState *env, int csrno, target_ulong *val)
705 {
706     int evt_index = csrno - CSR_MCOUNTINHIBIT;
707 
708     *val = env->mhpmevent_val[evt_index];
709 
710     return RISCV_EXCP_NONE;
711 }
712 
713 static int write_mhpmevent(CPURISCVState *env, int csrno, target_ulong val)
714 {
715     int evt_index = csrno - CSR_MCOUNTINHIBIT;
716     uint64_t mhpmevt_val = val;
717 
718     env->mhpmevent_val[evt_index] = val;
719 
720     if (riscv_cpu_mxl(env) == MXL_RV32) {
721         mhpmevt_val = mhpmevt_val |
722                       ((uint64_t)env->mhpmeventh_val[evt_index] << 32);
723     }
724     riscv_pmu_update_event_map(env, mhpmevt_val, evt_index);
725 
726     return RISCV_EXCP_NONE;
727 }
728 
729 static int read_mhpmeventh(CPURISCVState *env, int csrno, target_ulong *val)
730 {
731     int evt_index = csrno - CSR_MHPMEVENT3H + 3;
732 
733     *val = env->mhpmeventh_val[evt_index];
734 
735     return RISCV_EXCP_NONE;
736 }
737 
738 static int write_mhpmeventh(CPURISCVState *env, int csrno, target_ulong val)
739 {
740     int evt_index = csrno - CSR_MHPMEVENT3H + 3;
741     uint64_t mhpmevth_val = val;
742     uint64_t mhpmevt_val = env->mhpmevent_val[evt_index];
743 
744     mhpmevt_val = mhpmevt_val | (mhpmevth_val << 32);
745     env->mhpmeventh_val[evt_index] = val;
746 
747     riscv_pmu_update_event_map(env, mhpmevt_val, evt_index);
748 
749     return RISCV_EXCP_NONE;
750 }
751 
752 static int write_mhpmcounter(CPURISCVState *env, int csrno, target_ulong val)
753 {
754     int ctr_idx = csrno - CSR_MCYCLE;
755     PMUCTRState *counter = &env->pmu_ctrs[ctr_idx];
756     uint64_t mhpmctr_val = val;
757 
758     counter->mhpmcounter_val = val;
759     if (riscv_pmu_ctr_monitor_cycles(env, ctr_idx) ||
760         riscv_pmu_ctr_monitor_instructions(env, ctr_idx)) {
761         counter->mhpmcounter_prev = get_ticks(false);
762         if (ctr_idx > 2) {
763             if (riscv_cpu_mxl(env) == MXL_RV32) {
764                 mhpmctr_val = mhpmctr_val |
765                               ((uint64_t)counter->mhpmcounterh_val << 32);
766             }
767             riscv_pmu_setup_timer(env, mhpmctr_val, ctr_idx);
768         }
769      } else {
770         /* Other counters can keep incrementing from the given value */
771         counter->mhpmcounter_prev = val;
772     }
773 
774     return RISCV_EXCP_NONE;
775 }
776 
777 static int write_mhpmcounterh(CPURISCVState *env, int csrno, target_ulong val)
778 {
779     int ctr_idx = csrno - CSR_MCYCLEH;
780     PMUCTRState *counter = &env->pmu_ctrs[ctr_idx];
781     uint64_t mhpmctr_val = counter->mhpmcounter_val;
782     uint64_t mhpmctrh_val = val;
783 
784     counter->mhpmcounterh_val = val;
785     mhpmctr_val = mhpmctr_val | (mhpmctrh_val << 32);
786     if (riscv_pmu_ctr_monitor_cycles(env, ctr_idx) ||
787         riscv_pmu_ctr_monitor_instructions(env, ctr_idx)) {
788         counter->mhpmcounterh_prev = get_ticks(true);
789         if (ctr_idx > 2) {
790             riscv_pmu_setup_timer(env, mhpmctr_val, ctr_idx);
791         }
792     } else {
793         counter->mhpmcounterh_prev = val;
794     }
795 
796     return RISCV_EXCP_NONE;
797 }
798 
799 static RISCVException riscv_pmu_read_ctr(CPURISCVState *env, target_ulong *val,
800                                          bool upper_half, uint32_t ctr_idx)
801 {
802     PMUCTRState counter = env->pmu_ctrs[ctr_idx];
803     target_ulong ctr_prev = upper_half ? counter.mhpmcounterh_prev :
804                                          counter.mhpmcounter_prev;
805     target_ulong ctr_val = upper_half ? counter.mhpmcounterh_val :
806                                         counter.mhpmcounter_val;
807 
808     if (get_field(env->mcountinhibit, BIT(ctr_idx))) {
809         /**
810          * Counter should not increment if inhibit bit is set. We can't really
811          * stop the icount counting. Just return the counter value written by
812          * the supervisor to indicate that counter was not incremented.
813          */
814         if (!counter.started) {
815             *val = ctr_val;
816             return RISCV_EXCP_NONE;
817         } else {
818             /* Mark that the counter has been stopped */
819             counter.started = false;
820         }
821     }
822 
823     /**
824      * The kernel computes the perf delta by subtracting the current value from
825      * the value it initialized previously (ctr_val).
826      */
827     if (riscv_pmu_ctr_monitor_cycles(env, ctr_idx) ||
828         riscv_pmu_ctr_monitor_instructions(env, ctr_idx)) {
829         *val = get_ticks(upper_half) - ctr_prev + ctr_val;
830     } else {
831         *val = ctr_val;
832     }
833 
834     return RISCV_EXCP_NONE;
835 }
836 
837 static int read_hpmcounter(CPURISCVState *env, int csrno, target_ulong *val)
838 {
839     uint16_t ctr_index;
840 
841     if (csrno >= CSR_MCYCLE && csrno <= CSR_MHPMCOUNTER31) {
842         ctr_index = csrno - CSR_MCYCLE;
843     } else if (csrno >= CSR_CYCLE && csrno <= CSR_HPMCOUNTER31) {
844         ctr_index = csrno - CSR_CYCLE;
845     } else {
846         return RISCV_EXCP_ILLEGAL_INST;
847     }
848 
849     return riscv_pmu_read_ctr(env, val, false, ctr_index);
850 }
851 
852 static int read_hpmcounterh(CPURISCVState *env, int csrno, target_ulong *val)
853 {
854     uint16_t ctr_index;
855 
856     if (csrno >= CSR_MCYCLEH && csrno <= CSR_MHPMCOUNTER31H) {
857         ctr_index = csrno - CSR_MCYCLEH;
858     } else if (csrno >= CSR_CYCLEH && csrno <= CSR_HPMCOUNTER31H) {
859         ctr_index = csrno - CSR_CYCLEH;
860     } else {
861         return RISCV_EXCP_ILLEGAL_INST;
862     }
863 
864     return riscv_pmu_read_ctr(env, val, true, ctr_index);
865 }
866 
867 static int read_scountovf(CPURISCVState *env, int csrno, target_ulong *val)
868 {
869     int mhpmevt_start = CSR_MHPMEVENT3 - CSR_MCOUNTINHIBIT;
870     int i;
871     *val = 0;
872     target_ulong *mhpm_evt_val;
873     uint64_t of_bit_mask;
874 
875     if (riscv_cpu_mxl(env) == MXL_RV32) {
876         mhpm_evt_val = env->mhpmeventh_val;
877         of_bit_mask = MHPMEVENTH_BIT_OF;
878     } else {
879         mhpm_evt_val = env->mhpmevent_val;
880         of_bit_mask = MHPMEVENT_BIT_OF;
881     }
882 
883     for (i = mhpmevt_start; i < RV_MAX_MHPMEVENTS; i++) {
884         if ((get_field(env->mcounteren, BIT(i))) &&
885             (mhpm_evt_val[i] & of_bit_mask)) {
886                     *val |= BIT(i);
887             }
888     }
889 
890     return RISCV_EXCP_NONE;
891 }
892 
893 static RISCVException read_time(CPURISCVState *env, int csrno,
894                                 target_ulong *val)
895 {
896     uint64_t delta = riscv_cpu_virt_enabled(env) ? env->htimedelta : 0;
897 
898     if (!env->rdtime_fn) {
899         return RISCV_EXCP_ILLEGAL_INST;
900     }
901 
902     *val = env->rdtime_fn(env->rdtime_fn_arg) + delta;
903     return RISCV_EXCP_NONE;
904 }
905 
906 static RISCVException read_timeh(CPURISCVState *env, int csrno,
907                                  target_ulong *val)
908 {
909     uint64_t delta = riscv_cpu_virt_enabled(env) ? env->htimedelta : 0;
910 
911     if (!env->rdtime_fn) {
912         return RISCV_EXCP_ILLEGAL_INST;
913     }
914 
915     *val = (env->rdtime_fn(env->rdtime_fn_arg) + delta) >> 32;
916     return RISCV_EXCP_NONE;
917 }
918 
919 static RISCVException sstc(CPURISCVState *env, int csrno)
920 {
921     CPUState *cs = env_cpu(env);
922     RISCVCPU *cpu = RISCV_CPU(cs);
923     bool hmode_check = false;
924 
925     if (!cpu->cfg.ext_sstc || !env->rdtime_fn) {
926         return RISCV_EXCP_ILLEGAL_INST;
927     }
928 
929     if (env->priv == PRV_M) {
930         return RISCV_EXCP_NONE;
931     }
932 
933     /*
934      * No need of separate function for rv32 as menvcfg stores both menvcfg
935      * menvcfgh for RV32.
936      */
937     if (!(get_field(env->mcounteren, COUNTEREN_TM) &&
938           get_field(env->menvcfg, MENVCFG_STCE))) {
939         return RISCV_EXCP_ILLEGAL_INST;
940     }
941 
942     if (riscv_cpu_virt_enabled(env)) {
943         if (!(get_field(env->hcounteren, COUNTEREN_TM) &&
944               get_field(env->henvcfg, HENVCFG_STCE))) {
945             return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
946         }
947     }
948 
949     if ((csrno == CSR_VSTIMECMP) || (csrno == CSR_VSTIMECMPH)) {
950         hmode_check = true;
951     }
952 
953     return hmode_check ? hmode(env, csrno) : smode(env, csrno);
954 }
955 
956 static RISCVException sstc_32(CPURISCVState *env, int csrno)
957 {
958     if (riscv_cpu_mxl(env) != MXL_RV32) {
959         return RISCV_EXCP_ILLEGAL_INST;
960     }
961 
962     return sstc(env, csrno);
963 }
964 
965 static RISCVException read_vstimecmp(CPURISCVState *env, int csrno,
966                                     target_ulong *val)
967 {
968     *val = env->vstimecmp;
969 
970     return RISCV_EXCP_NONE;
971 }
972 
973 static RISCVException read_vstimecmph(CPURISCVState *env, int csrno,
974                                     target_ulong *val)
975 {
976     *val = env->vstimecmp >> 32;
977 
978     return RISCV_EXCP_NONE;
979 }
980 
981 static RISCVException write_vstimecmp(CPURISCVState *env, int csrno,
982                                     target_ulong val)
983 {
984     RISCVCPU *cpu = env_archcpu(env);
985 
986     if (riscv_cpu_mxl(env) == MXL_RV32) {
987         env->vstimecmp = deposit64(env->vstimecmp, 0, 32, (uint64_t)val);
988     } else {
989         env->vstimecmp = val;
990     }
991 
992     riscv_timer_write_timecmp(cpu, env->vstimer, env->vstimecmp,
993                               env->htimedelta, MIP_VSTIP);
994 
995     return RISCV_EXCP_NONE;
996 }
997 
998 static RISCVException write_vstimecmph(CPURISCVState *env, int csrno,
999                                     target_ulong val)
1000 {
1001     RISCVCPU *cpu = env_archcpu(env);
1002 
1003     env->vstimecmp = deposit64(env->vstimecmp, 32, 32, (uint64_t)val);
1004     riscv_timer_write_timecmp(cpu, env->vstimer, env->vstimecmp,
1005                               env->htimedelta, MIP_VSTIP);
1006 
1007     return RISCV_EXCP_NONE;
1008 }
1009 
1010 static RISCVException read_stimecmp(CPURISCVState *env, int csrno,
1011                                     target_ulong *val)
1012 {
1013     if (riscv_cpu_virt_enabled(env)) {
1014         *val = env->vstimecmp;
1015     } else {
1016         *val = env->stimecmp;
1017     }
1018 
1019     return RISCV_EXCP_NONE;
1020 }
1021 
1022 static RISCVException read_stimecmph(CPURISCVState *env, int csrno,
1023                                     target_ulong *val)
1024 {
1025     if (riscv_cpu_virt_enabled(env)) {
1026         *val = env->vstimecmp >> 32;
1027     } else {
1028         *val = env->stimecmp >> 32;
1029     }
1030 
1031     return RISCV_EXCP_NONE;
1032 }
1033 
1034 static RISCVException write_stimecmp(CPURISCVState *env, int csrno,
1035                                     target_ulong val)
1036 {
1037     RISCVCPU *cpu = env_archcpu(env);
1038 
1039     if (riscv_cpu_virt_enabled(env)) {
1040         if (env->hvictl & HVICTL_VTI) {
1041             return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
1042         }
1043         return write_vstimecmp(env, csrno, val);
1044     }
1045 
1046     if (riscv_cpu_mxl(env) == MXL_RV32) {
1047         env->stimecmp = deposit64(env->stimecmp, 0, 32, (uint64_t)val);
1048     } else {
1049         env->stimecmp = val;
1050     }
1051 
1052     riscv_timer_write_timecmp(cpu, env->stimer, env->stimecmp, 0, MIP_STIP);
1053 
1054     return RISCV_EXCP_NONE;
1055 }
1056 
1057 static RISCVException write_stimecmph(CPURISCVState *env, int csrno,
1058                                     target_ulong val)
1059 {
1060     RISCVCPU *cpu = env_archcpu(env);
1061 
1062     if (riscv_cpu_virt_enabled(env)) {
1063         if (env->hvictl & HVICTL_VTI) {
1064             return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
1065         }
1066         return write_vstimecmph(env, csrno, val);
1067     }
1068 
1069     env->stimecmp = deposit64(env->stimecmp, 32, 32, (uint64_t)val);
1070     riscv_timer_write_timecmp(cpu, env->stimer, env->stimecmp, 0, MIP_STIP);
1071 
1072     return RISCV_EXCP_NONE;
1073 }
1074 
1075 /* Machine constants */
1076 
1077 #define M_MODE_INTERRUPTS  ((uint64_t)(MIP_MSIP | MIP_MTIP | MIP_MEIP))
1078 #define S_MODE_INTERRUPTS  ((uint64_t)(MIP_SSIP | MIP_STIP | MIP_SEIP | \
1079                                       MIP_LCOFIP))
1080 #define VS_MODE_INTERRUPTS ((uint64_t)(MIP_VSSIP | MIP_VSTIP | MIP_VSEIP))
1081 #define HS_MODE_INTERRUPTS ((uint64_t)(MIP_SGEIP | VS_MODE_INTERRUPTS))
1082 
1083 #define VSTOPI_NUM_SRCS 5
1084 
1085 static const uint64_t delegable_ints = S_MODE_INTERRUPTS |
1086                                            VS_MODE_INTERRUPTS;
1087 static const uint64_t vs_delegable_ints = VS_MODE_INTERRUPTS;
1088 static const uint64_t all_ints = M_MODE_INTERRUPTS | S_MODE_INTERRUPTS |
1089                                      HS_MODE_INTERRUPTS;
1090 #define DELEGABLE_EXCPS ((1ULL << (RISCV_EXCP_INST_ADDR_MIS)) | \
1091                          (1ULL << (RISCV_EXCP_INST_ACCESS_FAULT)) | \
1092                          (1ULL << (RISCV_EXCP_ILLEGAL_INST)) | \
1093                          (1ULL << (RISCV_EXCP_BREAKPOINT)) | \
1094                          (1ULL << (RISCV_EXCP_LOAD_ADDR_MIS)) | \
1095                          (1ULL << (RISCV_EXCP_LOAD_ACCESS_FAULT)) | \
1096                          (1ULL << (RISCV_EXCP_STORE_AMO_ADDR_MIS)) | \
1097                          (1ULL << (RISCV_EXCP_STORE_AMO_ACCESS_FAULT)) | \
1098                          (1ULL << (RISCV_EXCP_U_ECALL)) | \
1099                          (1ULL << (RISCV_EXCP_S_ECALL)) | \
1100                          (1ULL << (RISCV_EXCP_VS_ECALL)) | \
1101                          (1ULL << (RISCV_EXCP_M_ECALL)) | \
1102                          (1ULL << (RISCV_EXCP_INST_PAGE_FAULT)) | \
1103                          (1ULL << (RISCV_EXCP_LOAD_PAGE_FAULT)) | \
1104                          (1ULL << (RISCV_EXCP_STORE_PAGE_FAULT)) | \
1105                          (1ULL << (RISCV_EXCP_INST_GUEST_PAGE_FAULT)) | \
1106                          (1ULL << (RISCV_EXCP_LOAD_GUEST_ACCESS_FAULT)) | \
1107                          (1ULL << (RISCV_EXCP_VIRT_INSTRUCTION_FAULT)) | \
1108                          (1ULL << (RISCV_EXCP_STORE_GUEST_AMO_ACCESS_FAULT)))
1109 static const target_ulong vs_delegable_excps = DELEGABLE_EXCPS &
1110     ~((1ULL << (RISCV_EXCP_S_ECALL)) |
1111       (1ULL << (RISCV_EXCP_VS_ECALL)) |
1112       (1ULL << (RISCV_EXCP_M_ECALL)) |
1113       (1ULL << (RISCV_EXCP_INST_GUEST_PAGE_FAULT)) |
1114       (1ULL << (RISCV_EXCP_LOAD_GUEST_ACCESS_FAULT)) |
1115       (1ULL << (RISCV_EXCP_VIRT_INSTRUCTION_FAULT)) |
1116       (1ULL << (RISCV_EXCP_STORE_GUEST_AMO_ACCESS_FAULT)));
1117 static const target_ulong sstatus_v1_10_mask = SSTATUS_SIE | SSTATUS_SPIE |
1118     SSTATUS_UIE | SSTATUS_UPIE | SSTATUS_SPP | SSTATUS_FS | SSTATUS_XS |
1119     SSTATUS_SUM | SSTATUS_MXR | SSTATUS_VS;
1120 static const target_ulong sip_writable_mask = SIP_SSIP | MIP_USIP | MIP_UEIP |
1121                                               SIP_LCOFIP;
1122 static const target_ulong hip_writable_mask = MIP_VSSIP;
1123 static const target_ulong hvip_writable_mask = MIP_VSSIP | MIP_VSTIP | MIP_VSEIP;
1124 static const target_ulong vsip_writable_mask = MIP_VSSIP;
1125 
1126 static const char valid_vm_1_10_32[16] = {
1127     [VM_1_10_MBARE] = 1,
1128     [VM_1_10_SV32] = 1
1129 };
1130 
1131 static const char valid_vm_1_10_64[16] = {
1132     [VM_1_10_MBARE] = 1,
1133     [VM_1_10_SV39] = 1,
1134     [VM_1_10_SV48] = 1,
1135     [VM_1_10_SV57] = 1
1136 };
1137 
1138 /* Machine Information Registers */
1139 static RISCVException read_zero(CPURISCVState *env, int csrno,
1140                                 target_ulong *val)
1141 {
1142     *val = 0;
1143     return RISCV_EXCP_NONE;
1144 }
1145 
1146 static RISCVException write_ignore(CPURISCVState *env, int csrno,
1147                                    target_ulong val)
1148 {
1149     return RISCV_EXCP_NONE;
1150 }
1151 
1152 static RISCVException read_mvendorid(CPURISCVState *env, int csrno,
1153                                      target_ulong *val)
1154 {
1155     CPUState *cs = env_cpu(env);
1156     RISCVCPU *cpu = RISCV_CPU(cs);
1157 
1158     *val = cpu->cfg.mvendorid;
1159     return RISCV_EXCP_NONE;
1160 }
1161 
1162 static RISCVException read_marchid(CPURISCVState *env, int csrno,
1163                                    target_ulong *val)
1164 {
1165     CPUState *cs = env_cpu(env);
1166     RISCVCPU *cpu = RISCV_CPU(cs);
1167 
1168     *val = cpu->cfg.marchid;
1169     return RISCV_EXCP_NONE;
1170 }
1171 
1172 static RISCVException read_mimpid(CPURISCVState *env, int csrno,
1173                                   target_ulong *val)
1174 {
1175     CPUState *cs = env_cpu(env);
1176     RISCVCPU *cpu = RISCV_CPU(cs);
1177 
1178     *val = cpu->cfg.mimpid;
1179     return RISCV_EXCP_NONE;
1180 }
1181 
1182 static RISCVException read_mhartid(CPURISCVState *env, int csrno,
1183                                    target_ulong *val)
1184 {
1185     *val = env->mhartid;
1186     return RISCV_EXCP_NONE;
1187 }
1188 
1189 /* Machine Trap Setup */
1190 
1191 /* We do not store SD explicitly, only compute it on demand. */
1192 static uint64_t add_status_sd(RISCVMXL xl, uint64_t status)
1193 {
1194     if ((status & MSTATUS_FS) == MSTATUS_FS ||
1195         (status & MSTATUS_VS) == MSTATUS_VS ||
1196         (status & MSTATUS_XS) == MSTATUS_XS) {
1197         switch (xl) {
1198         case MXL_RV32:
1199             return status | MSTATUS32_SD;
1200         case MXL_RV64:
1201             return status | MSTATUS64_SD;
1202         case MXL_RV128:
1203             return MSTATUSH128_SD;
1204         default:
1205             g_assert_not_reached();
1206         }
1207     }
1208     return status;
1209 }
1210 
1211 static RISCVException read_mstatus(CPURISCVState *env, int csrno,
1212                                    target_ulong *val)
1213 {
1214     *val = add_status_sd(riscv_cpu_mxl(env), env->mstatus);
1215     return RISCV_EXCP_NONE;
1216 }
1217 
1218 static int validate_vm(CPURISCVState *env, target_ulong vm)
1219 {
1220     if (riscv_cpu_mxl(env) == MXL_RV32) {
1221         return valid_vm_1_10_32[vm & 0xf];
1222     } else {
1223         return valid_vm_1_10_64[vm & 0xf];
1224     }
1225 }
1226 
1227 static RISCVException write_mstatus(CPURISCVState *env, int csrno,
1228                                     target_ulong val)
1229 {
1230     uint64_t mstatus = env->mstatus;
1231     uint64_t mask = 0;
1232     RISCVMXL xl = riscv_cpu_mxl(env);
1233 
1234     /* flush tlb on mstatus fields that affect VM */
1235     if ((val ^ mstatus) & (MSTATUS_MXR | MSTATUS_MPP | MSTATUS_MPV |
1236             MSTATUS_MPRV | MSTATUS_SUM)) {
1237         tlb_flush(env_cpu(env));
1238     }
1239     mask = MSTATUS_SIE | MSTATUS_SPIE | MSTATUS_MIE | MSTATUS_MPIE |
1240         MSTATUS_SPP | MSTATUS_MPRV | MSTATUS_SUM |
1241         MSTATUS_MPP | MSTATUS_MXR | MSTATUS_TVM | MSTATUS_TSR |
1242         MSTATUS_TW | MSTATUS_VS;
1243 
1244     if (riscv_has_ext(env, RVF)) {
1245         mask |= MSTATUS_FS;
1246     }
1247 
1248     if (xl != MXL_RV32 || env->debugger) {
1249         /*
1250          * RV32: MPV and GVA are not in mstatus. The current plan is to
1251          * add them to mstatush. For now, we just don't support it.
1252          */
1253         mask |= MSTATUS_MPV | MSTATUS_GVA;
1254         if ((val & MSTATUS64_UXL) != 0) {
1255             mask |= MSTATUS64_UXL;
1256         }
1257     }
1258 
1259     mstatus = (mstatus & ~mask) | (val & mask);
1260 
1261     if (xl > MXL_RV32) {
1262         /* SXL field is for now read only */
1263         mstatus = set_field(mstatus, MSTATUS64_SXL, xl);
1264     }
1265     env->mstatus = mstatus;
1266     env->xl = cpu_recompute_xl(env);
1267 
1268     return RISCV_EXCP_NONE;
1269 }
1270 
1271 static RISCVException read_mstatush(CPURISCVState *env, int csrno,
1272                                     target_ulong *val)
1273 {
1274     *val = env->mstatus >> 32;
1275     return RISCV_EXCP_NONE;
1276 }
1277 
1278 static RISCVException write_mstatush(CPURISCVState *env, int csrno,
1279                                      target_ulong val)
1280 {
1281     uint64_t valh = (uint64_t)val << 32;
1282     uint64_t mask = MSTATUS_MPV | MSTATUS_GVA;
1283 
1284     if ((valh ^ env->mstatus) & (MSTATUS_MPV)) {
1285         tlb_flush(env_cpu(env));
1286     }
1287 
1288     env->mstatus = (env->mstatus & ~mask) | (valh & mask);
1289 
1290     return RISCV_EXCP_NONE;
1291 }
1292 
1293 static RISCVException read_mstatus_i128(CPURISCVState *env, int csrno,
1294                                         Int128 *val)
1295 {
1296     *val = int128_make128(env->mstatus, add_status_sd(MXL_RV128, env->mstatus));
1297     return RISCV_EXCP_NONE;
1298 }
1299 
1300 static RISCVException read_misa_i128(CPURISCVState *env, int csrno,
1301                                      Int128 *val)
1302 {
1303     *val = int128_make128(env->misa_ext, (uint64_t)MXL_RV128 << 62);
1304     return RISCV_EXCP_NONE;
1305 }
1306 
1307 static RISCVException read_misa(CPURISCVState *env, int csrno,
1308                                 target_ulong *val)
1309 {
1310     target_ulong misa;
1311 
1312     switch (env->misa_mxl) {
1313     case MXL_RV32:
1314         misa = (target_ulong)MXL_RV32 << 30;
1315         break;
1316 #ifdef TARGET_RISCV64
1317     case MXL_RV64:
1318         misa = (target_ulong)MXL_RV64 << 62;
1319         break;
1320 #endif
1321     default:
1322         g_assert_not_reached();
1323     }
1324 
1325     *val = misa | env->misa_ext;
1326     return RISCV_EXCP_NONE;
1327 }
1328 
1329 static RISCVException write_misa(CPURISCVState *env, int csrno,
1330                                  target_ulong val)
1331 {
1332     if (!riscv_feature(env, RISCV_FEATURE_MISA)) {
1333         /* drop write to misa */
1334         return RISCV_EXCP_NONE;
1335     }
1336 
1337     /* 'I' or 'E' must be present */
1338     if (!(val & (RVI | RVE))) {
1339         /* It is not, drop write to misa */
1340         return RISCV_EXCP_NONE;
1341     }
1342 
1343     /* 'E' excludes all other extensions */
1344     if (val & RVE) {
1345         /* when we support 'E' we can do "val = RVE;" however
1346          * for now we just drop writes if 'E' is present.
1347          */
1348         return RISCV_EXCP_NONE;
1349     }
1350 
1351     /*
1352      * misa.MXL writes are not supported by QEMU.
1353      * Drop writes to those bits.
1354      */
1355 
1356     /* Mask extensions that are not supported by this hart */
1357     val &= env->misa_ext_mask;
1358 
1359     /* Mask extensions that are not supported by QEMU */
1360     val &= (RVI | RVE | RVM | RVA | RVF | RVD | RVC | RVS | RVU | RVV);
1361 
1362     /* 'D' depends on 'F', so clear 'D' if 'F' is not present */
1363     if ((val & RVD) && !(val & RVF)) {
1364         val &= ~RVD;
1365     }
1366 
1367     /* Suppress 'C' if next instruction is not aligned
1368      * TODO: this should check next_pc
1369      */
1370     if ((val & RVC) && (GETPC() & ~3) != 0) {
1371         val &= ~RVC;
1372     }
1373 
1374     /* If nothing changed, do nothing. */
1375     if (val == env->misa_ext) {
1376         return RISCV_EXCP_NONE;
1377     }
1378 
1379     if (!(val & RVF)) {
1380         env->mstatus &= ~MSTATUS_FS;
1381     }
1382 
1383     /* flush translation cache */
1384     tb_flush(env_cpu(env));
1385     env->misa_ext = val;
1386     env->xl = riscv_cpu_mxl(env);
1387     return RISCV_EXCP_NONE;
1388 }
1389 
1390 static RISCVException read_medeleg(CPURISCVState *env, int csrno,
1391                                    target_ulong *val)
1392 {
1393     *val = env->medeleg;
1394     return RISCV_EXCP_NONE;
1395 }
1396 
1397 static RISCVException write_medeleg(CPURISCVState *env, int csrno,
1398                                     target_ulong val)
1399 {
1400     env->medeleg = (env->medeleg & ~DELEGABLE_EXCPS) | (val & DELEGABLE_EXCPS);
1401     return RISCV_EXCP_NONE;
1402 }
1403 
1404 static RISCVException rmw_mideleg64(CPURISCVState *env, int csrno,
1405                                     uint64_t *ret_val,
1406                                     uint64_t new_val, uint64_t wr_mask)
1407 {
1408     uint64_t mask = wr_mask & delegable_ints;
1409 
1410     if (ret_val) {
1411         *ret_val = env->mideleg;
1412     }
1413 
1414     env->mideleg = (env->mideleg & ~mask) | (new_val & mask);
1415 
1416     if (riscv_has_ext(env, RVH)) {
1417         env->mideleg |= HS_MODE_INTERRUPTS;
1418     }
1419 
1420     return RISCV_EXCP_NONE;
1421 }
1422 
1423 static RISCVException rmw_mideleg(CPURISCVState *env, int csrno,
1424                                   target_ulong *ret_val,
1425                                   target_ulong new_val, target_ulong wr_mask)
1426 {
1427     uint64_t rval;
1428     RISCVException ret;
1429 
1430     ret = rmw_mideleg64(env, csrno, &rval, new_val, wr_mask);
1431     if (ret_val) {
1432         *ret_val = rval;
1433     }
1434 
1435     return ret;
1436 }
1437 
1438 static RISCVException rmw_midelegh(CPURISCVState *env, int csrno,
1439                                    target_ulong *ret_val,
1440                                    target_ulong new_val,
1441                                    target_ulong wr_mask)
1442 {
1443     uint64_t rval;
1444     RISCVException ret;
1445 
1446     ret = rmw_mideleg64(env, csrno, &rval,
1447         ((uint64_t)new_val) << 32, ((uint64_t)wr_mask) << 32);
1448     if (ret_val) {
1449         *ret_val = rval >> 32;
1450     }
1451 
1452     return ret;
1453 }
1454 
1455 static RISCVException rmw_mie64(CPURISCVState *env, int csrno,
1456                                 uint64_t *ret_val,
1457                                 uint64_t new_val, uint64_t wr_mask)
1458 {
1459     uint64_t mask = wr_mask & all_ints;
1460 
1461     if (ret_val) {
1462         *ret_val = env->mie;
1463     }
1464 
1465     env->mie = (env->mie & ~mask) | (new_val & mask);
1466 
1467     if (!riscv_has_ext(env, RVH)) {
1468         env->mie &= ~((uint64_t)MIP_SGEIP);
1469     }
1470 
1471     return RISCV_EXCP_NONE;
1472 }
1473 
1474 static RISCVException rmw_mie(CPURISCVState *env, int csrno,
1475                               target_ulong *ret_val,
1476                               target_ulong new_val, target_ulong wr_mask)
1477 {
1478     uint64_t rval;
1479     RISCVException ret;
1480 
1481     ret = rmw_mie64(env, csrno, &rval, new_val, wr_mask);
1482     if (ret_val) {
1483         *ret_val = rval;
1484     }
1485 
1486     return ret;
1487 }
1488 
1489 static RISCVException rmw_mieh(CPURISCVState *env, int csrno,
1490                                target_ulong *ret_val,
1491                                target_ulong new_val, target_ulong wr_mask)
1492 {
1493     uint64_t rval;
1494     RISCVException ret;
1495 
1496     ret = rmw_mie64(env, csrno, &rval,
1497         ((uint64_t)new_val) << 32, ((uint64_t)wr_mask) << 32);
1498     if (ret_val) {
1499         *ret_val = rval >> 32;
1500     }
1501 
1502     return ret;
1503 }
1504 
1505 static int read_mtopi(CPURISCVState *env, int csrno, target_ulong *val)
1506 {
1507     int irq;
1508     uint8_t iprio;
1509 
1510     irq = riscv_cpu_mirq_pending(env);
1511     if (irq <= 0 || irq > 63) {
1512         *val = 0;
1513     } else {
1514         iprio = env->miprio[irq];
1515         if (!iprio) {
1516             if (riscv_cpu_default_priority(irq) > IPRIO_DEFAULT_M) {
1517                 iprio = IPRIO_MMAXIPRIO;
1518             }
1519         }
1520         *val = (irq & TOPI_IID_MASK) << TOPI_IID_SHIFT;
1521         *val |= iprio;
1522     }
1523 
1524     return RISCV_EXCP_NONE;
1525 }
1526 
1527 static int aia_xlate_vs_csrno(CPURISCVState *env, int csrno)
1528 {
1529     if (!riscv_cpu_virt_enabled(env)) {
1530         return csrno;
1531     }
1532 
1533     switch (csrno) {
1534     case CSR_SISELECT:
1535         return CSR_VSISELECT;
1536     case CSR_SIREG:
1537         return CSR_VSIREG;
1538     case CSR_STOPEI:
1539         return CSR_VSTOPEI;
1540     default:
1541         return csrno;
1542     };
1543 }
1544 
1545 static int rmw_xiselect(CPURISCVState *env, int csrno, target_ulong *val,
1546                         target_ulong new_val, target_ulong wr_mask)
1547 {
1548     target_ulong *iselect;
1549 
1550     /* Translate CSR number for VS-mode */
1551     csrno = aia_xlate_vs_csrno(env, csrno);
1552 
1553     /* Find the iselect CSR based on CSR number */
1554     switch (csrno) {
1555     case CSR_MISELECT:
1556         iselect = &env->miselect;
1557         break;
1558     case CSR_SISELECT:
1559         iselect = &env->siselect;
1560         break;
1561     case CSR_VSISELECT:
1562         iselect = &env->vsiselect;
1563         break;
1564     default:
1565          return RISCV_EXCP_ILLEGAL_INST;
1566     };
1567 
1568     if (val) {
1569         *val = *iselect;
1570     }
1571 
1572     wr_mask &= ISELECT_MASK;
1573     if (wr_mask) {
1574         *iselect = (*iselect & ~wr_mask) | (new_val & wr_mask);
1575     }
1576 
1577     return RISCV_EXCP_NONE;
1578 }
1579 
1580 static int rmw_iprio(target_ulong xlen,
1581                      target_ulong iselect, uint8_t *iprio,
1582                      target_ulong *val, target_ulong new_val,
1583                      target_ulong wr_mask, int ext_irq_no)
1584 {
1585     int i, firq, nirqs;
1586     target_ulong old_val;
1587 
1588     if (iselect < ISELECT_IPRIO0 || ISELECT_IPRIO15 < iselect) {
1589         return -EINVAL;
1590     }
1591     if (xlen != 32 && iselect & 0x1) {
1592         return -EINVAL;
1593     }
1594 
1595     nirqs = 4 * (xlen / 32);
1596     firq = ((iselect - ISELECT_IPRIO0) / (xlen / 32)) * (nirqs);
1597 
1598     old_val = 0;
1599     for (i = 0; i < nirqs; i++) {
1600         old_val |= ((target_ulong)iprio[firq + i]) << (IPRIO_IRQ_BITS * i);
1601     }
1602 
1603     if (val) {
1604         *val = old_val;
1605     }
1606 
1607     if (wr_mask) {
1608         new_val = (old_val & ~wr_mask) | (new_val & wr_mask);
1609         for (i = 0; i < nirqs; i++) {
1610             /*
1611              * M-level and S-level external IRQ priority always read-only
1612              * zero. This means default priority order is always preferred
1613              * for M-level and S-level external IRQs.
1614              */
1615             if ((firq + i) == ext_irq_no) {
1616                 continue;
1617             }
1618             iprio[firq + i] = (new_val >> (IPRIO_IRQ_BITS * i)) & 0xff;
1619         }
1620     }
1621 
1622     return 0;
1623 }
1624 
1625 static int rmw_xireg(CPURISCVState *env, int csrno, target_ulong *val,
1626                      target_ulong new_val, target_ulong wr_mask)
1627 {
1628     bool virt;
1629     uint8_t *iprio;
1630     int ret = -EINVAL;
1631     target_ulong priv, isel, vgein;
1632 
1633     /* Translate CSR number for VS-mode */
1634     csrno = aia_xlate_vs_csrno(env, csrno);
1635 
1636     /* Decode register details from CSR number */
1637     virt = false;
1638     switch (csrno) {
1639     case CSR_MIREG:
1640         iprio = env->miprio;
1641         isel = env->miselect;
1642         priv = PRV_M;
1643         break;
1644     case CSR_SIREG:
1645         iprio = env->siprio;
1646         isel = env->siselect;
1647         priv = PRV_S;
1648         break;
1649     case CSR_VSIREG:
1650         iprio = env->hviprio;
1651         isel = env->vsiselect;
1652         priv = PRV_S;
1653         virt = true;
1654         break;
1655     default:
1656          goto done;
1657     };
1658 
1659     /* Find the selected guest interrupt file */
1660     vgein = (virt) ? get_field(env->hstatus, HSTATUS_VGEIN) : 0;
1661 
1662     if (ISELECT_IPRIO0 <= isel && isel <= ISELECT_IPRIO15) {
1663         /* Local interrupt priority registers not available for VS-mode */
1664         if (!virt) {
1665             ret = rmw_iprio(riscv_cpu_mxl_bits(env),
1666                             isel, iprio, val, new_val, wr_mask,
1667                             (priv == PRV_M) ? IRQ_M_EXT : IRQ_S_EXT);
1668         }
1669     } else if (ISELECT_IMSIC_FIRST <= isel && isel <= ISELECT_IMSIC_LAST) {
1670         /* IMSIC registers only available when machine implements it. */
1671         if (env->aia_ireg_rmw_fn[priv]) {
1672             /* Selected guest interrupt file should not be zero */
1673             if (virt && (!vgein || env->geilen < vgein)) {
1674                 goto done;
1675             }
1676             /* Call machine specific IMSIC register emulation */
1677             ret = env->aia_ireg_rmw_fn[priv](env->aia_ireg_rmw_fn_arg[priv],
1678                                     AIA_MAKE_IREG(isel, priv, virt, vgein,
1679                                                   riscv_cpu_mxl_bits(env)),
1680                                     val, new_val, wr_mask);
1681         }
1682     }
1683 
1684 done:
1685     if (ret) {
1686         return (riscv_cpu_virt_enabled(env) && virt) ?
1687                RISCV_EXCP_VIRT_INSTRUCTION_FAULT : RISCV_EXCP_ILLEGAL_INST;
1688     }
1689     return RISCV_EXCP_NONE;
1690 }
1691 
1692 static int rmw_xtopei(CPURISCVState *env, int csrno, target_ulong *val,
1693                       target_ulong new_val, target_ulong wr_mask)
1694 {
1695     bool virt;
1696     int ret = -EINVAL;
1697     target_ulong priv, vgein;
1698 
1699     /* Translate CSR number for VS-mode */
1700     csrno = aia_xlate_vs_csrno(env, csrno);
1701 
1702     /* Decode register details from CSR number */
1703     virt = false;
1704     switch (csrno) {
1705     case CSR_MTOPEI:
1706         priv = PRV_M;
1707         break;
1708     case CSR_STOPEI:
1709         priv = PRV_S;
1710         break;
1711     case CSR_VSTOPEI:
1712         priv = PRV_S;
1713         virt = true;
1714         break;
1715     default:
1716         goto done;
1717     };
1718 
1719     /* IMSIC CSRs only available when machine implements IMSIC. */
1720     if (!env->aia_ireg_rmw_fn[priv]) {
1721         goto done;
1722     }
1723 
1724     /* Find the selected guest interrupt file */
1725     vgein = (virt) ? get_field(env->hstatus, HSTATUS_VGEIN) : 0;
1726 
1727     /* Selected guest interrupt file should be valid */
1728     if (virt && (!vgein || env->geilen < vgein)) {
1729         goto done;
1730     }
1731 
1732     /* Call machine specific IMSIC register emulation for TOPEI */
1733     ret = env->aia_ireg_rmw_fn[priv](env->aia_ireg_rmw_fn_arg[priv],
1734                     AIA_MAKE_IREG(ISELECT_IMSIC_TOPEI, priv, virt, vgein,
1735                                   riscv_cpu_mxl_bits(env)),
1736                     val, new_val, wr_mask);
1737 
1738 done:
1739     if (ret) {
1740         return (riscv_cpu_virt_enabled(env) && virt) ?
1741                RISCV_EXCP_VIRT_INSTRUCTION_FAULT : RISCV_EXCP_ILLEGAL_INST;
1742     }
1743     return RISCV_EXCP_NONE;
1744 }
1745 
1746 static RISCVException read_mtvec(CPURISCVState *env, int csrno,
1747                                  target_ulong *val)
1748 {
1749     *val = env->mtvec;
1750     return RISCV_EXCP_NONE;
1751 }
1752 
1753 static RISCVException write_mtvec(CPURISCVState *env, int csrno,
1754                                   target_ulong val)
1755 {
1756     /* bits [1:0] encode mode; 0 = direct, 1 = vectored, 2 >= reserved */
1757     if ((val & 3) < 2) {
1758         env->mtvec = val;
1759     } else {
1760         qemu_log_mask(LOG_UNIMP, "CSR_MTVEC: reserved mode not supported\n");
1761     }
1762     return RISCV_EXCP_NONE;
1763 }
1764 
1765 static RISCVException read_mcountinhibit(CPURISCVState *env, int csrno,
1766                                          target_ulong *val)
1767 {
1768     *val = env->mcountinhibit;
1769     return RISCV_EXCP_NONE;
1770 }
1771 
1772 static RISCVException write_mcountinhibit(CPURISCVState *env, int csrno,
1773                                           target_ulong val)
1774 {
1775     int cidx;
1776     PMUCTRState *counter;
1777 
1778     env->mcountinhibit = val;
1779 
1780     /* Check if any other counter is also monitoring cycles/instructions */
1781     for (cidx = 0; cidx < RV_MAX_MHPMCOUNTERS; cidx++) {
1782         if (!get_field(env->mcountinhibit, BIT(cidx))) {
1783             counter = &env->pmu_ctrs[cidx];
1784             counter->started = true;
1785         }
1786     }
1787 
1788     return RISCV_EXCP_NONE;
1789 }
1790 
1791 static RISCVException read_mcounteren(CPURISCVState *env, int csrno,
1792                                       target_ulong *val)
1793 {
1794     *val = env->mcounteren;
1795     return RISCV_EXCP_NONE;
1796 }
1797 
1798 static RISCVException write_mcounteren(CPURISCVState *env, int csrno,
1799                                        target_ulong val)
1800 {
1801     env->mcounteren = val;
1802     return RISCV_EXCP_NONE;
1803 }
1804 
1805 /* Machine Trap Handling */
1806 static RISCVException read_mscratch_i128(CPURISCVState *env, int csrno,
1807                                          Int128 *val)
1808 {
1809     *val = int128_make128(env->mscratch, env->mscratchh);
1810     return RISCV_EXCP_NONE;
1811 }
1812 
1813 static RISCVException write_mscratch_i128(CPURISCVState *env, int csrno,
1814                                           Int128 val)
1815 {
1816     env->mscratch = int128_getlo(val);
1817     env->mscratchh = int128_gethi(val);
1818     return RISCV_EXCP_NONE;
1819 }
1820 
1821 static RISCVException read_mscratch(CPURISCVState *env, int csrno,
1822                                     target_ulong *val)
1823 {
1824     *val = env->mscratch;
1825     return RISCV_EXCP_NONE;
1826 }
1827 
1828 static RISCVException write_mscratch(CPURISCVState *env, int csrno,
1829                                      target_ulong val)
1830 {
1831     env->mscratch = val;
1832     return RISCV_EXCP_NONE;
1833 }
1834 
1835 static RISCVException read_mepc(CPURISCVState *env, int csrno,
1836                                      target_ulong *val)
1837 {
1838     *val = env->mepc;
1839     return RISCV_EXCP_NONE;
1840 }
1841 
1842 static RISCVException write_mepc(CPURISCVState *env, int csrno,
1843                                      target_ulong val)
1844 {
1845     env->mepc = val;
1846     return RISCV_EXCP_NONE;
1847 }
1848 
1849 static RISCVException read_mcause(CPURISCVState *env, int csrno,
1850                                      target_ulong *val)
1851 {
1852     *val = env->mcause;
1853     return RISCV_EXCP_NONE;
1854 }
1855 
1856 static RISCVException write_mcause(CPURISCVState *env, int csrno,
1857                                      target_ulong val)
1858 {
1859     env->mcause = val;
1860     return RISCV_EXCP_NONE;
1861 }
1862 
1863 static RISCVException read_mtval(CPURISCVState *env, int csrno,
1864                                  target_ulong *val)
1865 {
1866     *val = env->mtval;
1867     return RISCV_EXCP_NONE;
1868 }
1869 
1870 static RISCVException write_mtval(CPURISCVState *env, int csrno,
1871                                   target_ulong val)
1872 {
1873     env->mtval = val;
1874     return RISCV_EXCP_NONE;
1875 }
1876 
1877 /* Execution environment configuration setup */
1878 static RISCVException read_menvcfg(CPURISCVState *env, int csrno,
1879                                  target_ulong *val)
1880 {
1881     *val = env->menvcfg;
1882     return RISCV_EXCP_NONE;
1883 }
1884 
1885 static RISCVException write_menvcfg(CPURISCVState *env, int csrno,
1886                                   target_ulong val)
1887 {
1888     RISCVCPUConfig *cfg = &env_archcpu(env)->cfg;
1889     uint64_t mask = MENVCFG_FIOM | MENVCFG_CBIE | MENVCFG_CBCFE | MENVCFG_CBZE;
1890 
1891     if (riscv_cpu_mxl(env) == MXL_RV64) {
1892         mask |= (cfg->ext_svpbmt ? MENVCFG_PBMTE : 0) |
1893                 (cfg->ext_sstc ? MENVCFG_STCE : 0) |
1894                 (cfg->ext_svadu ? MENVCFG_HADE : 0);
1895     }
1896     env->menvcfg = (env->menvcfg & ~mask) | (val & mask);
1897 
1898     return RISCV_EXCP_NONE;
1899 }
1900 
1901 static RISCVException read_menvcfgh(CPURISCVState *env, int csrno,
1902                                  target_ulong *val)
1903 {
1904     *val = env->menvcfg >> 32;
1905     return RISCV_EXCP_NONE;
1906 }
1907 
1908 static RISCVException write_menvcfgh(CPURISCVState *env, int csrno,
1909                                   target_ulong val)
1910 {
1911     RISCVCPUConfig *cfg = &env_archcpu(env)->cfg;
1912     uint64_t mask = (cfg->ext_svpbmt ? MENVCFG_PBMTE : 0) |
1913                     (cfg->ext_sstc ? MENVCFG_STCE : 0) |
1914                     (cfg->ext_svadu ? MENVCFG_HADE : 0);
1915     uint64_t valh = (uint64_t)val << 32;
1916 
1917     env->menvcfg = (env->menvcfg & ~mask) | (valh & mask);
1918 
1919     return RISCV_EXCP_NONE;
1920 }
1921 
1922 static RISCVException read_senvcfg(CPURISCVState *env, int csrno,
1923                                  target_ulong *val)
1924 {
1925     RISCVException ret;
1926 
1927     ret = smstateen_acc_ok(env, 0, SMSTATEEN0_HSENVCFG);
1928     if (ret != RISCV_EXCP_NONE) {
1929         return ret;
1930     }
1931 
1932     *val = env->senvcfg;
1933     return RISCV_EXCP_NONE;
1934 }
1935 
1936 static RISCVException write_senvcfg(CPURISCVState *env, int csrno,
1937                                   target_ulong val)
1938 {
1939     uint64_t mask = SENVCFG_FIOM | SENVCFG_CBIE | SENVCFG_CBCFE | SENVCFG_CBZE;
1940     RISCVException ret;
1941 
1942     ret = smstateen_acc_ok(env, 0, SMSTATEEN0_HSENVCFG);
1943     if (ret != RISCV_EXCP_NONE) {
1944         return ret;
1945     }
1946 
1947     env->senvcfg = (env->senvcfg & ~mask) | (val & mask);
1948     return RISCV_EXCP_NONE;
1949 }
1950 
1951 static RISCVException read_henvcfg(CPURISCVState *env, int csrno,
1952                                  target_ulong *val)
1953 {
1954     RISCVException ret;
1955 
1956     ret = smstateen_acc_ok(env, 0, SMSTATEEN0_HSENVCFG);
1957     if (ret != RISCV_EXCP_NONE) {
1958         return ret;
1959     }
1960 
1961     /*
1962      * henvcfg.pbmte is read_only 0 when menvcfg.pbmte = 0
1963      * henvcfg.stce is read_only 0 when menvcfg.stce = 0
1964      * henvcfg.hade is read_only 0 when menvcfg.hade = 0
1965      */
1966     *val = env->henvcfg & (~(HENVCFG_PBMTE | HENVCFG_STCE | HENVCFG_HADE) |
1967                            env->menvcfg);
1968     return RISCV_EXCP_NONE;
1969 }
1970 
1971 static RISCVException write_henvcfg(CPURISCVState *env, int csrno,
1972                                   target_ulong val)
1973 {
1974     uint64_t mask = HENVCFG_FIOM | HENVCFG_CBIE | HENVCFG_CBCFE | HENVCFG_CBZE;
1975     RISCVException ret;
1976 
1977     ret = smstateen_acc_ok(env, 0, SMSTATEEN0_HSENVCFG);
1978     if (ret != RISCV_EXCP_NONE) {
1979         return ret;
1980     }
1981 
1982     if (riscv_cpu_mxl(env) == MXL_RV64) {
1983         mask |= env->menvcfg & (HENVCFG_PBMTE | HENVCFG_STCE | HENVCFG_HADE);
1984     }
1985 
1986     env->henvcfg = (env->henvcfg & ~mask) | (val & mask);
1987 
1988     return RISCV_EXCP_NONE;
1989 }
1990 
1991 static RISCVException read_henvcfgh(CPURISCVState *env, int csrno,
1992                                  target_ulong *val)
1993 {
1994     RISCVException ret;
1995 
1996     ret = smstateen_acc_ok(env, 0, SMSTATEEN0_HSENVCFG);
1997     if (ret != RISCV_EXCP_NONE) {
1998         return ret;
1999     }
2000 
2001     *val = (env->henvcfg & (~(HENVCFG_PBMTE | HENVCFG_STCE | HENVCFG_HADE) |
2002                             env->menvcfg)) >> 32;
2003     return RISCV_EXCP_NONE;
2004 }
2005 
2006 static RISCVException write_henvcfgh(CPURISCVState *env, int csrno,
2007                                   target_ulong val)
2008 {
2009     uint64_t mask = env->menvcfg & (HENVCFG_PBMTE | HENVCFG_STCE |
2010                                     HENVCFG_HADE);
2011     uint64_t valh = (uint64_t)val << 32;
2012     RISCVException ret;
2013 
2014     ret = smstateen_acc_ok(env, 0, SMSTATEEN0_HSENVCFG);
2015     if (ret != RISCV_EXCP_NONE) {
2016         return ret;
2017     }
2018 
2019     env->henvcfg = (env->henvcfg & ~mask) | (valh & mask);
2020     return RISCV_EXCP_NONE;
2021 }
2022 
2023 static RISCVException read_mstateen(CPURISCVState *env, int csrno,
2024                                     target_ulong *val)
2025 {
2026     *val = env->mstateen[csrno - CSR_MSTATEEN0];
2027 
2028     return RISCV_EXCP_NONE;
2029 }
2030 
2031 static RISCVException write_mstateen(CPURISCVState *env, int csrno,
2032                                      uint64_t wr_mask, target_ulong new_val)
2033 {
2034     uint64_t *reg;
2035 
2036     reg = &env->mstateen[csrno - CSR_MSTATEEN0];
2037     *reg = (*reg & ~wr_mask) | (new_val & wr_mask);
2038 
2039     return RISCV_EXCP_NONE;
2040 }
2041 
2042 static RISCVException write_mstateen0(CPURISCVState *env, int csrno,
2043                                       target_ulong new_val)
2044 {
2045     uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
2046 
2047     return write_mstateen(env, csrno, wr_mask, new_val);
2048 }
2049 
2050 static RISCVException write_mstateen_1_3(CPURISCVState *env, int csrno,
2051                                       target_ulong new_val)
2052 {
2053     return write_mstateen(env, csrno, SMSTATEEN_STATEEN, new_val);
2054 }
2055 
2056 static RISCVException read_mstateenh(CPURISCVState *env, int csrno,
2057                                       target_ulong *val)
2058 {
2059     *val = env->mstateen[csrno - CSR_MSTATEEN0H] >> 32;
2060 
2061     return RISCV_EXCP_NONE;
2062 }
2063 
2064 static RISCVException write_mstateenh(CPURISCVState *env, int csrno,
2065                                       uint64_t wr_mask, target_ulong new_val)
2066 {
2067     uint64_t *reg, val;
2068 
2069     reg = &env->mstateen[csrno - CSR_MSTATEEN0H];
2070     val = (uint64_t)new_val << 32;
2071     val |= *reg & 0xFFFFFFFF;
2072     *reg = (*reg & ~wr_mask) | (val & wr_mask);
2073 
2074     return RISCV_EXCP_NONE;
2075 }
2076 
2077 static RISCVException write_mstateen0h(CPURISCVState *env, int csrno,
2078                                       target_ulong new_val)
2079 {
2080     uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
2081 
2082     return write_mstateenh(env, csrno, wr_mask, new_val);
2083 }
2084 
2085 static RISCVException write_mstateenh_1_3(CPURISCVState *env, int csrno,
2086                                       target_ulong new_val)
2087 {
2088     return write_mstateenh(env, csrno, SMSTATEEN_STATEEN, new_val);
2089 }
2090 
2091 static RISCVException read_hstateen(CPURISCVState *env, int csrno,
2092                                     target_ulong *val)
2093 {
2094     int index = csrno - CSR_HSTATEEN0;
2095 
2096     *val = env->hstateen[index] & env->mstateen[index];
2097 
2098     return RISCV_EXCP_NONE;
2099 }
2100 
2101 static RISCVException write_hstateen(CPURISCVState *env, int csrno,
2102                                      uint64_t mask, target_ulong new_val)
2103 {
2104     int index = csrno - CSR_HSTATEEN0;
2105     uint64_t *reg, wr_mask;
2106 
2107     reg = &env->hstateen[index];
2108     wr_mask = env->mstateen[index] & mask;
2109     *reg = (*reg & ~wr_mask) | (new_val & wr_mask);
2110 
2111     return RISCV_EXCP_NONE;
2112 }
2113 
2114 static RISCVException write_hstateen0(CPURISCVState *env, int csrno,
2115                                       target_ulong new_val)
2116 {
2117     uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
2118 
2119     return write_hstateen(env, csrno, wr_mask, new_val);
2120 }
2121 
2122 static RISCVException write_hstateen_1_3(CPURISCVState *env, int csrno,
2123                                       target_ulong new_val)
2124 {
2125     return write_hstateen(env, csrno, SMSTATEEN_STATEEN, new_val);
2126 }
2127 
2128 static RISCVException read_hstateenh(CPURISCVState *env, int csrno,
2129                                      target_ulong *val)
2130 {
2131     int index = csrno - CSR_HSTATEEN0H;
2132 
2133     *val = (env->hstateen[index] >> 32) & (env->mstateen[index] >> 32);
2134 
2135     return RISCV_EXCP_NONE;
2136 }
2137 
2138 static RISCVException write_hstateenh(CPURISCVState *env, int csrno,
2139                                       uint64_t mask, target_ulong new_val)
2140 {
2141     int index = csrno - CSR_HSTATEEN0H;
2142     uint64_t *reg, wr_mask, val;
2143 
2144     reg = &env->hstateen[index];
2145     val = (uint64_t)new_val << 32;
2146     val |= *reg & 0xFFFFFFFF;
2147     wr_mask = env->mstateen[index] & mask;
2148     *reg = (*reg & ~wr_mask) | (val & wr_mask);
2149 
2150     return RISCV_EXCP_NONE;
2151 }
2152 
2153 static RISCVException write_hstateen0h(CPURISCVState *env, int csrno,
2154                                        target_ulong new_val)
2155 {
2156     uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
2157 
2158     return write_hstateenh(env, csrno, wr_mask, new_val);
2159 }
2160 
2161 static RISCVException write_hstateenh_1_3(CPURISCVState *env, int csrno,
2162                                        target_ulong new_val)
2163 {
2164     return write_hstateenh(env, csrno, SMSTATEEN_STATEEN, new_val);
2165 }
2166 
2167 static RISCVException read_sstateen(CPURISCVState *env, int csrno,
2168                                     target_ulong *val)
2169 {
2170     bool virt = riscv_cpu_virt_enabled(env);
2171     int index = csrno - CSR_SSTATEEN0;
2172 
2173     *val = env->sstateen[index] & env->mstateen[index];
2174     if (virt) {
2175         *val &= env->hstateen[index];
2176     }
2177 
2178     return RISCV_EXCP_NONE;
2179 }
2180 
2181 static RISCVException write_sstateen(CPURISCVState *env, int csrno,
2182                                      uint64_t mask, target_ulong new_val)
2183 {
2184     bool virt = riscv_cpu_virt_enabled(env);
2185     int index = csrno - CSR_SSTATEEN0;
2186     uint64_t wr_mask;
2187     uint64_t *reg;
2188 
2189     wr_mask = env->mstateen[index] & mask;
2190     if (virt) {
2191         wr_mask &= env->hstateen[index];
2192     }
2193 
2194     reg = &env->sstateen[index];
2195     *reg = (*reg & ~wr_mask) | (new_val & wr_mask);
2196 
2197     return RISCV_EXCP_NONE;
2198 }
2199 
2200 static RISCVException write_sstateen0(CPURISCVState *env, int csrno,
2201                                       target_ulong new_val)
2202 {
2203     uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
2204 
2205     return write_sstateen(env, csrno, wr_mask, new_val);
2206 }
2207 
2208 static RISCVException write_sstateen_1_3(CPURISCVState *env, int csrno,
2209                                       target_ulong new_val)
2210 {
2211     return write_sstateen(env, csrno, SMSTATEEN_STATEEN, new_val);
2212 }
2213 
2214 static RISCVException rmw_mip64(CPURISCVState *env, int csrno,
2215                                 uint64_t *ret_val,
2216                                 uint64_t new_val, uint64_t wr_mask)
2217 {
2218     RISCVCPU *cpu = env_archcpu(env);
2219     uint64_t old_mip, mask = wr_mask & delegable_ints;
2220     uint32_t gin;
2221 
2222     if (mask & MIP_SEIP) {
2223         env->software_seip = new_val & MIP_SEIP;
2224         new_val |= env->external_seip * MIP_SEIP;
2225     }
2226 
2227     if (cpu->cfg.ext_sstc && (env->priv == PRV_M) &&
2228         get_field(env->menvcfg, MENVCFG_STCE)) {
2229         /* sstc extension forbids STIP & VSTIP to be writeable in mip */
2230         mask = mask & ~(MIP_STIP | MIP_VSTIP);
2231     }
2232 
2233     if (mask) {
2234         old_mip = riscv_cpu_update_mip(cpu, mask, (new_val & mask));
2235     } else {
2236         old_mip = env->mip;
2237     }
2238 
2239     if (csrno != CSR_HVIP) {
2240         gin = get_field(env->hstatus, HSTATUS_VGEIN);
2241         old_mip |= (env->hgeip & ((target_ulong)1 << gin)) ? MIP_VSEIP : 0;
2242         old_mip |= env->vstime_irq ? MIP_VSTIP : 0;
2243     }
2244 
2245     if (ret_val) {
2246         *ret_val = old_mip;
2247     }
2248 
2249     return RISCV_EXCP_NONE;
2250 }
2251 
2252 static RISCVException rmw_mip(CPURISCVState *env, int csrno,
2253                               target_ulong *ret_val,
2254                               target_ulong new_val, target_ulong wr_mask)
2255 {
2256     uint64_t rval;
2257     RISCVException ret;
2258 
2259     ret = rmw_mip64(env, csrno, &rval, new_val, wr_mask);
2260     if (ret_val) {
2261         *ret_val = rval;
2262     }
2263 
2264     return ret;
2265 }
2266 
2267 static RISCVException rmw_miph(CPURISCVState *env, int csrno,
2268                                target_ulong *ret_val,
2269                                target_ulong new_val, target_ulong wr_mask)
2270 {
2271     uint64_t rval;
2272     RISCVException ret;
2273 
2274     ret = rmw_mip64(env, csrno, &rval,
2275         ((uint64_t)new_val) << 32, ((uint64_t)wr_mask) << 32);
2276     if (ret_val) {
2277         *ret_val = rval >> 32;
2278     }
2279 
2280     return ret;
2281 }
2282 
2283 /* Supervisor Trap Setup */
2284 static RISCVException read_sstatus_i128(CPURISCVState *env, int csrno,
2285                                         Int128 *val)
2286 {
2287     uint64_t mask = sstatus_v1_10_mask;
2288     uint64_t sstatus = env->mstatus & mask;
2289     if (env->xl != MXL_RV32 || env->debugger) {
2290         mask |= SSTATUS64_UXL;
2291     }
2292 
2293     *val = int128_make128(sstatus, add_status_sd(MXL_RV128, sstatus));
2294     return RISCV_EXCP_NONE;
2295 }
2296 
2297 static RISCVException read_sstatus(CPURISCVState *env, int csrno,
2298                                    target_ulong *val)
2299 {
2300     target_ulong mask = (sstatus_v1_10_mask);
2301     if (env->xl != MXL_RV32 || env->debugger) {
2302         mask |= SSTATUS64_UXL;
2303     }
2304     /* TODO: Use SXL not MXL. */
2305     *val = add_status_sd(riscv_cpu_mxl(env), env->mstatus & mask);
2306     return RISCV_EXCP_NONE;
2307 }
2308 
2309 static RISCVException write_sstatus(CPURISCVState *env, int csrno,
2310                                     target_ulong val)
2311 {
2312     target_ulong mask = (sstatus_v1_10_mask);
2313 
2314     if (env->xl != MXL_RV32 || env->debugger) {
2315         if ((val & SSTATUS64_UXL) != 0) {
2316             mask |= SSTATUS64_UXL;
2317         }
2318     }
2319     target_ulong newval = (env->mstatus & ~mask) | (val & mask);
2320     return write_mstatus(env, CSR_MSTATUS, newval);
2321 }
2322 
2323 static RISCVException rmw_vsie64(CPURISCVState *env, int csrno,
2324                                  uint64_t *ret_val,
2325                                  uint64_t new_val, uint64_t wr_mask)
2326 {
2327     RISCVException ret;
2328     uint64_t rval, mask = env->hideleg & VS_MODE_INTERRUPTS;
2329 
2330     /* Bring VS-level bits to correct position */
2331     new_val = (new_val & (VS_MODE_INTERRUPTS >> 1)) << 1;
2332     wr_mask = (wr_mask & (VS_MODE_INTERRUPTS >> 1)) << 1;
2333 
2334     ret = rmw_mie64(env, csrno, &rval, new_val, wr_mask & mask);
2335     if (ret_val) {
2336         *ret_val = (rval & mask) >> 1;
2337     }
2338 
2339     return ret;
2340 }
2341 
2342 static RISCVException rmw_vsie(CPURISCVState *env, int csrno,
2343                                target_ulong *ret_val,
2344                                target_ulong new_val, target_ulong wr_mask)
2345 {
2346     uint64_t rval;
2347     RISCVException ret;
2348 
2349     ret = rmw_vsie64(env, csrno, &rval, new_val, wr_mask);
2350     if (ret_val) {
2351         *ret_val = rval;
2352     }
2353 
2354     return ret;
2355 }
2356 
2357 static RISCVException rmw_vsieh(CPURISCVState *env, int csrno,
2358                                 target_ulong *ret_val,
2359                                 target_ulong new_val, target_ulong wr_mask)
2360 {
2361     uint64_t rval;
2362     RISCVException ret;
2363 
2364     ret = rmw_vsie64(env, csrno, &rval,
2365         ((uint64_t)new_val) << 32, ((uint64_t)wr_mask) << 32);
2366     if (ret_val) {
2367         *ret_val = rval >> 32;
2368     }
2369 
2370     return ret;
2371 }
2372 
2373 static RISCVException rmw_sie64(CPURISCVState *env, int csrno,
2374                                 uint64_t *ret_val,
2375                                 uint64_t new_val, uint64_t wr_mask)
2376 {
2377     RISCVException ret;
2378     uint64_t mask = env->mideleg & S_MODE_INTERRUPTS;
2379 
2380     if (riscv_cpu_virt_enabled(env)) {
2381         if (env->hvictl & HVICTL_VTI) {
2382             return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
2383         }
2384         ret = rmw_vsie64(env, CSR_VSIE, ret_val, new_val, wr_mask);
2385     } else {
2386         ret = rmw_mie64(env, csrno, ret_val, new_val, wr_mask & mask);
2387     }
2388 
2389     if (ret_val) {
2390         *ret_val &= mask;
2391     }
2392 
2393     return ret;
2394 }
2395 
2396 static RISCVException rmw_sie(CPURISCVState *env, int csrno,
2397                               target_ulong *ret_val,
2398                               target_ulong new_val, target_ulong wr_mask)
2399 {
2400     uint64_t rval;
2401     RISCVException ret;
2402 
2403     ret = rmw_sie64(env, csrno, &rval, new_val, wr_mask);
2404     if (ret == RISCV_EXCP_NONE && ret_val) {
2405         *ret_val = rval;
2406     }
2407 
2408     return ret;
2409 }
2410 
2411 static RISCVException rmw_sieh(CPURISCVState *env, int csrno,
2412                                target_ulong *ret_val,
2413                                target_ulong new_val, target_ulong wr_mask)
2414 {
2415     uint64_t rval;
2416     RISCVException ret;
2417 
2418     ret = rmw_sie64(env, csrno, &rval,
2419         ((uint64_t)new_val) << 32, ((uint64_t)wr_mask) << 32);
2420     if (ret_val) {
2421         *ret_val = rval >> 32;
2422     }
2423 
2424     return ret;
2425 }
2426 
2427 static RISCVException read_stvec(CPURISCVState *env, int csrno,
2428                                  target_ulong *val)
2429 {
2430     *val = env->stvec;
2431     return RISCV_EXCP_NONE;
2432 }
2433 
2434 static RISCVException write_stvec(CPURISCVState *env, int csrno,
2435                                   target_ulong val)
2436 {
2437     /* bits [1:0] encode mode; 0 = direct, 1 = vectored, 2 >= reserved */
2438     if ((val & 3) < 2) {
2439         env->stvec = val;
2440     } else {
2441         qemu_log_mask(LOG_UNIMP, "CSR_STVEC: reserved mode not supported\n");
2442     }
2443     return RISCV_EXCP_NONE;
2444 }
2445 
2446 static RISCVException read_scounteren(CPURISCVState *env, int csrno,
2447                                       target_ulong *val)
2448 {
2449     *val = env->scounteren;
2450     return RISCV_EXCP_NONE;
2451 }
2452 
2453 static RISCVException write_scounteren(CPURISCVState *env, int csrno,
2454                                        target_ulong val)
2455 {
2456     env->scounteren = val;
2457     return RISCV_EXCP_NONE;
2458 }
2459 
2460 /* Supervisor Trap Handling */
2461 static RISCVException read_sscratch_i128(CPURISCVState *env, int csrno,
2462                                          Int128 *val)
2463 {
2464     *val = int128_make128(env->sscratch, env->sscratchh);
2465     return RISCV_EXCP_NONE;
2466 }
2467 
2468 static RISCVException write_sscratch_i128(CPURISCVState *env, int csrno,
2469                                           Int128 val)
2470 {
2471     env->sscratch = int128_getlo(val);
2472     env->sscratchh = int128_gethi(val);
2473     return RISCV_EXCP_NONE;
2474 }
2475 
2476 static RISCVException read_sscratch(CPURISCVState *env, int csrno,
2477                                     target_ulong *val)
2478 {
2479     *val = env->sscratch;
2480     return RISCV_EXCP_NONE;
2481 }
2482 
2483 static RISCVException write_sscratch(CPURISCVState *env, int csrno,
2484                                      target_ulong val)
2485 {
2486     env->sscratch = val;
2487     return RISCV_EXCP_NONE;
2488 }
2489 
2490 static RISCVException read_sepc(CPURISCVState *env, int csrno,
2491                                 target_ulong *val)
2492 {
2493     *val = env->sepc;
2494     return RISCV_EXCP_NONE;
2495 }
2496 
2497 static RISCVException write_sepc(CPURISCVState *env, int csrno,
2498                                  target_ulong val)
2499 {
2500     env->sepc = val;
2501     return RISCV_EXCP_NONE;
2502 }
2503 
2504 static RISCVException read_scause(CPURISCVState *env, int csrno,
2505                                   target_ulong *val)
2506 {
2507     *val = env->scause;
2508     return RISCV_EXCP_NONE;
2509 }
2510 
2511 static RISCVException write_scause(CPURISCVState *env, int csrno,
2512                                    target_ulong val)
2513 {
2514     env->scause = val;
2515     return RISCV_EXCP_NONE;
2516 }
2517 
2518 static RISCVException read_stval(CPURISCVState *env, int csrno,
2519                                  target_ulong *val)
2520 {
2521     *val = env->stval;
2522     return RISCV_EXCP_NONE;
2523 }
2524 
2525 static RISCVException write_stval(CPURISCVState *env, int csrno,
2526                                   target_ulong val)
2527 {
2528     env->stval = val;
2529     return RISCV_EXCP_NONE;
2530 }
2531 
2532 static RISCVException rmw_vsip64(CPURISCVState *env, int csrno,
2533                                  uint64_t *ret_val,
2534                                  uint64_t new_val, uint64_t wr_mask)
2535 {
2536     RISCVException ret;
2537     uint64_t rval, mask = env->hideleg & VS_MODE_INTERRUPTS;
2538 
2539     /* Bring VS-level bits to correct position */
2540     new_val = (new_val & (VS_MODE_INTERRUPTS >> 1)) << 1;
2541     wr_mask = (wr_mask & (VS_MODE_INTERRUPTS >> 1)) << 1;
2542 
2543     ret = rmw_mip64(env, csrno, &rval, new_val,
2544                     wr_mask & mask & vsip_writable_mask);
2545     if (ret_val) {
2546         *ret_val = (rval & mask) >> 1;
2547     }
2548 
2549     return ret;
2550 }
2551 
2552 static RISCVException rmw_vsip(CPURISCVState *env, int csrno,
2553                                target_ulong *ret_val,
2554                                target_ulong new_val, target_ulong wr_mask)
2555 {
2556     uint64_t rval;
2557     RISCVException ret;
2558 
2559     ret = rmw_vsip64(env, csrno, &rval, new_val, wr_mask);
2560     if (ret_val) {
2561         *ret_val = rval;
2562     }
2563 
2564     return ret;
2565 }
2566 
2567 static RISCVException rmw_vsiph(CPURISCVState *env, int csrno,
2568                                 target_ulong *ret_val,
2569                                 target_ulong new_val, target_ulong wr_mask)
2570 {
2571     uint64_t rval;
2572     RISCVException ret;
2573 
2574     ret = rmw_vsip64(env, csrno, &rval,
2575         ((uint64_t)new_val) << 32, ((uint64_t)wr_mask) << 32);
2576     if (ret_val) {
2577         *ret_val = rval >> 32;
2578     }
2579 
2580     return ret;
2581 }
2582 
2583 static RISCVException rmw_sip64(CPURISCVState *env, int csrno,
2584                                 uint64_t *ret_val,
2585                                 uint64_t new_val, uint64_t wr_mask)
2586 {
2587     RISCVException ret;
2588     uint64_t mask = env->mideleg & sip_writable_mask;
2589 
2590     if (riscv_cpu_virt_enabled(env)) {
2591         if (env->hvictl & HVICTL_VTI) {
2592             return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
2593         }
2594         ret = rmw_vsip64(env, CSR_VSIP, ret_val, new_val, wr_mask);
2595     } else {
2596         ret = rmw_mip64(env, csrno, ret_val, new_val, wr_mask & mask);
2597     }
2598 
2599     if (ret_val) {
2600         *ret_val &= env->mideleg & S_MODE_INTERRUPTS;
2601     }
2602 
2603     return ret;
2604 }
2605 
2606 static RISCVException rmw_sip(CPURISCVState *env, int csrno,
2607                               target_ulong *ret_val,
2608                               target_ulong new_val, target_ulong wr_mask)
2609 {
2610     uint64_t rval;
2611     RISCVException ret;
2612 
2613     ret = rmw_sip64(env, csrno, &rval, new_val, wr_mask);
2614     if (ret_val) {
2615         *ret_val = rval;
2616     }
2617 
2618     return ret;
2619 }
2620 
2621 static RISCVException rmw_siph(CPURISCVState *env, int csrno,
2622                                target_ulong *ret_val,
2623                                target_ulong new_val, target_ulong wr_mask)
2624 {
2625     uint64_t rval;
2626     RISCVException ret;
2627 
2628     ret = rmw_sip64(env, csrno, &rval,
2629         ((uint64_t)new_val) << 32, ((uint64_t)wr_mask) << 32);
2630     if (ret_val) {
2631         *ret_val = rval >> 32;
2632     }
2633 
2634     return ret;
2635 }
2636 
2637 /* Supervisor Protection and Translation */
2638 static RISCVException read_satp(CPURISCVState *env, int csrno,
2639                                 target_ulong *val)
2640 {
2641     if (!riscv_feature(env, RISCV_FEATURE_MMU)) {
2642         *val = 0;
2643         return RISCV_EXCP_NONE;
2644     }
2645 
2646     if (env->priv == PRV_S && get_field(env->mstatus, MSTATUS_TVM)) {
2647         return RISCV_EXCP_ILLEGAL_INST;
2648     } else {
2649         *val = env->satp;
2650     }
2651 
2652     return RISCV_EXCP_NONE;
2653 }
2654 
2655 static RISCVException write_satp(CPURISCVState *env, int csrno,
2656                                  target_ulong val)
2657 {
2658     target_ulong vm, mask;
2659 
2660     if (!riscv_feature(env, RISCV_FEATURE_MMU)) {
2661         return RISCV_EXCP_NONE;
2662     }
2663 
2664     if (riscv_cpu_mxl(env) == MXL_RV32) {
2665         vm = validate_vm(env, get_field(val, SATP32_MODE));
2666         mask = (val ^ env->satp) & (SATP32_MODE | SATP32_ASID | SATP32_PPN);
2667     } else {
2668         vm = validate_vm(env, get_field(val, SATP64_MODE));
2669         mask = (val ^ env->satp) & (SATP64_MODE | SATP64_ASID | SATP64_PPN);
2670     }
2671 
2672     if (vm && mask) {
2673         if (env->priv == PRV_S && get_field(env->mstatus, MSTATUS_TVM)) {
2674             return RISCV_EXCP_ILLEGAL_INST;
2675         } else {
2676             /*
2677              * The ISA defines SATP.MODE=Bare as "no translation", but we still
2678              * pass these through QEMU's TLB emulation as it improves
2679              * performance.  Flushing the TLB on SATP writes with paging
2680              * enabled avoids leaking those invalid cached mappings.
2681              */
2682             tlb_flush(env_cpu(env));
2683             env->satp = val;
2684         }
2685     }
2686     return RISCV_EXCP_NONE;
2687 }
2688 
2689 static int read_vstopi(CPURISCVState *env, int csrno, target_ulong *val)
2690 {
2691     int irq, ret;
2692     target_ulong topei;
2693     uint64_t vseip, vsgein;
2694     uint32_t iid, iprio, hviid, hviprio, gein;
2695     uint32_t s, scount = 0, siid[VSTOPI_NUM_SRCS], siprio[VSTOPI_NUM_SRCS];
2696 
2697     gein = get_field(env->hstatus, HSTATUS_VGEIN);
2698     hviid = get_field(env->hvictl, HVICTL_IID);
2699     hviprio = get_field(env->hvictl, HVICTL_IPRIO);
2700 
2701     if (gein) {
2702         vsgein = (env->hgeip & (1ULL << gein)) ? MIP_VSEIP : 0;
2703         vseip = env->mie & (env->mip | vsgein) & MIP_VSEIP;
2704         if (gein <= env->geilen && vseip) {
2705             siid[scount] = IRQ_S_EXT;
2706             siprio[scount] = IPRIO_MMAXIPRIO + 1;
2707             if (env->aia_ireg_rmw_fn[PRV_S]) {
2708                 /*
2709                  * Call machine specific IMSIC register emulation for
2710                  * reading TOPEI.
2711                  */
2712                 ret = env->aia_ireg_rmw_fn[PRV_S](
2713                         env->aia_ireg_rmw_fn_arg[PRV_S],
2714                         AIA_MAKE_IREG(ISELECT_IMSIC_TOPEI, PRV_S, true, gein,
2715                                       riscv_cpu_mxl_bits(env)),
2716                         &topei, 0, 0);
2717                 if (!ret && topei) {
2718                     siprio[scount] = topei & IMSIC_TOPEI_IPRIO_MASK;
2719                 }
2720             }
2721             scount++;
2722         }
2723     } else {
2724         if (hviid == IRQ_S_EXT && hviprio) {
2725             siid[scount] = IRQ_S_EXT;
2726             siprio[scount] = hviprio;
2727             scount++;
2728         }
2729     }
2730 
2731     if (env->hvictl & HVICTL_VTI) {
2732         if (hviid != IRQ_S_EXT) {
2733             siid[scount] = hviid;
2734             siprio[scount] = hviprio;
2735             scount++;
2736         }
2737     } else {
2738         irq = riscv_cpu_vsirq_pending(env);
2739         if (irq != IRQ_S_EXT && 0 < irq && irq <= 63) {
2740             siid[scount] = irq;
2741             siprio[scount] = env->hviprio[irq];
2742             scount++;
2743         }
2744     }
2745 
2746     iid = 0;
2747     iprio = UINT_MAX;
2748     for (s = 0; s < scount; s++) {
2749         if (siprio[s] < iprio) {
2750             iid = siid[s];
2751             iprio = siprio[s];
2752         }
2753     }
2754 
2755     if (iid) {
2756         if (env->hvictl & HVICTL_IPRIOM) {
2757             if (iprio > IPRIO_MMAXIPRIO) {
2758                 iprio = IPRIO_MMAXIPRIO;
2759             }
2760             if (!iprio) {
2761                 if (riscv_cpu_default_priority(iid) > IPRIO_DEFAULT_S) {
2762                     iprio = IPRIO_MMAXIPRIO;
2763                 }
2764             }
2765         } else {
2766             iprio = 1;
2767         }
2768     } else {
2769         iprio = 0;
2770     }
2771 
2772     *val = (iid & TOPI_IID_MASK) << TOPI_IID_SHIFT;
2773     *val |= iprio;
2774     return RISCV_EXCP_NONE;
2775 }
2776 
2777 static int read_stopi(CPURISCVState *env, int csrno, target_ulong *val)
2778 {
2779     int irq;
2780     uint8_t iprio;
2781 
2782     if (riscv_cpu_virt_enabled(env)) {
2783         return read_vstopi(env, CSR_VSTOPI, val);
2784     }
2785 
2786     irq = riscv_cpu_sirq_pending(env);
2787     if (irq <= 0 || irq > 63) {
2788         *val = 0;
2789     } else {
2790         iprio = env->siprio[irq];
2791         if (!iprio) {
2792             if (riscv_cpu_default_priority(irq) > IPRIO_DEFAULT_S) {
2793                 iprio = IPRIO_MMAXIPRIO;
2794            }
2795         }
2796         *val = (irq & TOPI_IID_MASK) << TOPI_IID_SHIFT;
2797         *val |= iprio;
2798     }
2799 
2800     return RISCV_EXCP_NONE;
2801 }
2802 
2803 /* Hypervisor Extensions */
2804 static RISCVException read_hstatus(CPURISCVState *env, int csrno,
2805                                    target_ulong *val)
2806 {
2807     *val = env->hstatus;
2808     if (riscv_cpu_mxl(env) != MXL_RV32) {
2809         /* We only support 64-bit VSXL */
2810         *val = set_field(*val, HSTATUS_VSXL, 2);
2811     }
2812     /* We only support little endian */
2813     *val = set_field(*val, HSTATUS_VSBE, 0);
2814     return RISCV_EXCP_NONE;
2815 }
2816 
2817 static RISCVException write_hstatus(CPURISCVState *env, int csrno,
2818                                     target_ulong val)
2819 {
2820     env->hstatus = val;
2821     if (riscv_cpu_mxl(env) != MXL_RV32 && get_field(val, HSTATUS_VSXL) != 2) {
2822         qemu_log_mask(LOG_UNIMP, "QEMU does not support mixed HSXLEN options.");
2823     }
2824     if (get_field(val, HSTATUS_VSBE) != 0) {
2825         qemu_log_mask(LOG_UNIMP, "QEMU does not support big endian guests.");
2826     }
2827     return RISCV_EXCP_NONE;
2828 }
2829 
2830 static RISCVException read_hedeleg(CPURISCVState *env, int csrno,
2831                                    target_ulong *val)
2832 {
2833     *val = env->hedeleg;
2834     return RISCV_EXCP_NONE;
2835 }
2836 
2837 static RISCVException write_hedeleg(CPURISCVState *env, int csrno,
2838                                     target_ulong val)
2839 {
2840     env->hedeleg = val & vs_delegable_excps;
2841     return RISCV_EXCP_NONE;
2842 }
2843 
2844 static RISCVException rmw_hideleg64(CPURISCVState *env, int csrno,
2845                                     uint64_t *ret_val,
2846                                     uint64_t new_val, uint64_t wr_mask)
2847 {
2848     uint64_t mask = wr_mask & vs_delegable_ints;
2849 
2850     if (ret_val) {
2851         *ret_val = env->hideleg & vs_delegable_ints;
2852     }
2853 
2854     env->hideleg = (env->hideleg & ~mask) | (new_val & mask);
2855     return RISCV_EXCP_NONE;
2856 }
2857 
2858 static RISCVException rmw_hideleg(CPURISCVState *env, int csrno,
2859                                   target_ulong *ret_val,
2860                                   target_ulong new_val, target_ulong wr_mask)
2861 {
2862     uint64_t rval;
2863     RISCVException ret;
2864 
2865     ret = rmw_hideleg64(env, csrno, &rval, new_val, wr_mask);
2866     if (ret_val) {
2867         *ret_val = rval;
2868     }
2869 
2870     return ret;
2871 }
2872 
2873 static RISCVException rmw_hidelegh(CPURISCVState *env, int csrno,
2874                                    target_ulong *ret_val,
2875                                    target_ulong new_val, target_ulong wr_mask)
2876 {
2877     uint64_t rval;
2878     RISCVException ret;
2879 
2880     ret = rmw_hideleg64(env, csrno, &rval,
2881         ((uint64_t)new_val) << 32, ((uint64_t)wr_mask) << 32);
2882     if (ret_val) {
2883         *ret_val = rval >> 32;
2884     }
2885 
2886     return ret;
2887 }
2888 
2889 static RISCVException rmw_hvip64(CPURISCVState *env, int csrno,
2890                                  uint64_t *ret_val,
2891                                  uint64_t new_val, uint64_t wr_mask)
2892 {
2893     RISCVException ret;
2894 
2895     ret = rmw_mip64(env, csrno, ret_val, new_val,
2896                     wr_mask & hvip_writable_mask);
2897     if (ret_val) {
2898         *ret_val &= VS_MODE_INTERRUPTS;
2899     }
2900 
2901     return ret;
2902 }
2903 
2904 static RISCVException rmw_hvip(CPURISCVState *env, int csrno,
2905                                target_ulong *ret_val,
2906                                target_ulong new_val, target_ulong wr_mask)
2907 {
2908     uint64_t rval;
2909     RISCVException ret;
2910 
2911     ret = rmw_hvip64(env, csrno, &rval, new_val, wr_mask);
2912     if (ret_val) {
2913         *ret_val = rval;
2914     }
2915 
2916     return ret;
2917 }
2918 
2919 static RISCVException rmw_hviph(CPURISCVState *env, int csrno,
2920                                 target_ulong *ret_val,
2921                                 target_ulong new_val, target_ulong wr_mask)
2922 {
2923     uint64_t rval;
2924     RISCVException ret;
2925 
2926     ret = rmw_hvip64(env, csrno, &rval,
2927         ((uint64_t)new_val) << 32, ((uint64_t)wr_mask) << 32);
2928     if (ret_val) {
2929         *ret_val = rval >> 32;
2930     }
2931 
2932     return ret;
2933 }
2934 
2935 static RISCVException rmw_hip(CPURISCVState *env, int csrno,
2936                               target_ulong *ret_value,
2937                               target_ulong new_value, target_ulong write_mask)
2938 {
2939     int ret = rmw_mip(env, csrno, ret_value, new_value,
2940                       write_mask & hip_writable_mask);
2941 
2942     if (ret_value) {
2943         *ret_value &= HS_MODE_INTERRUPTS;
2944     }
2945     return ret;
2946 }
2947 
2948 static RISCVException rmw_hie(CPURISCVState *env, int csrno,
2949                               target_ulong *ret_val,
2950                               target_ulong new_val, target_ulong wr_mask)
2951 {
2952     uint64_t rval;
2953     RISCVException ret;
2954 
2955     ret = rmw_mie64(env, csrno, &rval, new_val, wr_mask & HS_MODE_INTERRUPTS);
2956     if (ret_val) {
2957         *ret_val = rval & HS_MODE_INTERRUPTS;
2958     }
2959 
2960     return ret;
2961 }
2962 
2963 static RISCVException read_hcounteren(CPURISCVState *env, int csrno,
2964                                       target_ulong *val)
2965 {
2966     *val = env->hcounteren;
2967     return RISCV_EXCP_NONE;
2968 }
2969 
2970 static RISCVException write_hcounteren(CPURISCVState *env, int csrno,
2971                                        target_ulong val)
2972 {
2973     env->hcounteren = val;
2974     return RISCV_EXCP_NONE;
2975 }
2976 
2977 static RISCVException read_hgeie(CPURISCVState *env, int csrno,
2978                                  target_ulong *val)
2979 {
2980     if (val) {
2981         *val = env->hgeie;
2982     }
2983     return RISCV_EXCP_NONE;
2984 }
2985 
2986 static RISCVException write_hgeie(CPURISCVState *env, int csrno,
2987                                   target_ulong val)
2988 {
2989     /* Only GEILEN:1 bits implemented and BIT0 is never implemented */
2990     val &= ((((target_ulong)1) << env->geilen) - 1) << 1;
2991     env->hgeie = val;
2992     /* Update mip.SGEIP bit */
2993     riscv_cpu_update_mip(env_archcpu(env), MIP_SGEIP,
2994                          BOOL_TO_MASK(!!(env->hgeie & env->hgeip)));
2995     return RISCV_EXCP_NONE;
2996 }
2997 
2998 static RISCVException read_htval(CPURISCVState *env, int csrno,
2999                                  target_ulong *val)
3000 {
3001     *val = env->htval;
3002     return RISCV_EXCP_NONE;
3003 }
3004 
3005 static RISCVException write_htval(CPURISCVState *env, int csrno,
3006                                   target_ulong val)
3007 {
3008     env->htval = val;
3009     return RISCV_EXCP_NONE;
3010 }
3011 
3012 static RISCVException read_htinst(CPURISCVState *env, int csrno,
3013                                   target_ulong *val)
3014 {
3015     *val = env->htinst;
3016     return RISCV_EXCP_NONE;
3017 }
3018 
3019 static RISCVException write_htinst(CPURISCVState *env, int csrno,
3020                                    target_ulong val)
3021 {
3022     return RISCV_EXCP_NONE;
3023 }
3024 
3025 static RISCVException read_hgeip(CPURISCVState *env, int csrno,
3026                                  target_ulong *val)
3027 {
3028     if (val) {
3029         *val = env->hgeip;
3030     }
3031     return RISCV_EXCP_NONE;
3032 }
3033 
3034 static RISCVException read_hgatp(CPURISCVState *env, int csrno,
3035                                  target_ulong *val)
3036 {
3037     *val = env->hgatp;
3038     return RISCV_EXCP_NONE;
3039 }
3040 
3041 static RISCVException write_hgatp(CPURISCVState *env, int csrno,
3042                                   target_ulong val)
3043 {
3044     env->hgatp = val;
3045     return RISCV_EXCP_NONE;
3046 }
3047 
3048 static RISCVException read_htimedelta(CPURISCVState *env, int csrno,
3049                                       target_ulong *val)
3050 {
3051     if (!env->rdtime_fn) {
3052         return RISCV_EXCP_ILLEGAL_INST;
3053     }
3054 
3055     *val = env->htimedelta;
3056     return RISCV_EXCP_NONE;
3057 }
3058 
3059 static RISCVException write_htimedelta(CPURISCVState *env, int csrno,
3060                                        target_ulong val)
3061 {
3062     RISCVCPU *cpu = env_archcpu(env);
3063 
3064     if (!env->rdtime_fn) {
3065         return RISCV_EXCP_ILLEGAL_INST;
3066     }
3067 
3068     if (riscv_cpu_mxl(env) == MXL_RV32) {
3069         env->htimedelta = deposit64(env->htimedelta, 0, 32, (uint64_t)val);
3070     } else {
3071         env->htimedelta = val;
3072     }
3073 
3074     if (cpu->cfg.ext_sstc && env->rdtime_fn) {
3075         riscv_timer_write_timecmp(cpu, env->vstimer, env->vstimecmp,
3076                                   env->htimedelta, MIP_VSTIP);
3077     }
3078 
3079     return RISCV_EXCP_NONE;
3080 }
3081 
3082 static RISCVException read_htimedeltah(CPURISCVState *env, int csrno,
3083                                        target_ulong *val)
3084 {
3085     if (!env->rdtime_fn) {
3086         return RISCV_EXCP_ILLEGAL_INST;
3087     }
3088 
3089     *val = env->htimedelta >> 32;
3090     return RISCV_EXCP_NONE;
3091 }
3092 
3093 static RISCVException write_htimedeltah(CPURISCVState *env, int csrno,
3094                                         target_ulong val)
3095 {
3096     RISCVCPU *cpu = env_archcpu(env);
3097 
3098     if (!env->rdtime_fn) {
3099         return RISCV_EXCP_ILLEGAL_INST;
3100     }
3101 
3102     env->htimedelta = deposit64(env->htimedelta, 32, 32, (uint64_t)val);
3103 
3104     if (cpu->cfg.ext_sstc && env->rdtime_fn) {
3105         riscv_timer_write_timecmp(cpu, env->vstimer, env->vstimecmp,
3106                                   env->htimedelta, MIP_VSTIP);
3107     }
3108 
3109     return RISCV_EXCP_NONE;
3110 }
3111 
3112 static int read_hvictl(CPURISCVState *env, int csrno, target_ulong *val)
3113 {
3114     *val = env->hvictl;
3115     return RISCV_EXCP_NONE;
3116 }
3117 
3118 static int write_hvictl(CPURISCVState *env, int csrno, target_ulong val)
3119 {
3120     env->hvictl = val & HVICTL_VALID_MASK;
3121     return RISCV_EXCP_NONE;
3122 }
3123 
3124 static int read_hvipriox(CPURISCVState *env, int first_index,
3125                          uint8_t *iprio, target_ulong *val)
3126 {
3127     int i, irq, rdzero, num_irqs = 4 * (riscv_cpu_mxl_bits(env) / 32);
3128 
3129     /* First index has to be a multiple of number of irqs per register */
3130     if (first_index % num_irqs) {
3131         return (riscv_cpu_virt_enabled(env)) ?
3132                RISCV_EXCP_VIRT_INSTRUCTION_FAULT : RISCV_EXCP_ILLEGAL_INST;
3133     }
3134 
3135     /* Fill-up return value */
3136     *val = 0;
3137     for (i = 0; i < num_irqs; i++) {
3138         if (riscv_cpu_hviprio_index2irq(first_index + i, &irq, &rdzero)) {
3139             continue;
3140         }
3141         if (rdzero) {
3142             continue;
3143         }
3144         *val |= ((target_ulong)iprio[irq]) << (i * 8);
3145     }
3146 
3147     return RISCV_EXCP_NONE;
3148 }
3149 
3150 static int write_hvipriox(CPURISCVState *env, int first_index,
3151                           uint8_t *iprio, target_ulong val)
3152 {
3153     int i, irq, rdzero, num_irqs = 4 * (riscv_cpu_mxl_bits(env) / 32);
3154 
3155     /* First index has to be a multiple of number of irqs per register */
3156     if (first_index % num_irqs) {
3157         return (riscv_cpu_virt_enabled(env)) ?
3158                RISCV_EXCP_VIRT_INSTRUCTION_FAULT : RISCV_EXCP_ILLEGAL_INST;
3159     }
3160 
3161     /* Fill-up priority arrary */
3162     for (i = 0; i < num_irqs; i++) {
3163         if (riscv_cpu_hviprio_index2irq(first_index + i, &irq, &rdzero)) {
3164             continue;
3165         }
3166         if (rdzero) {
3167             iprio[irq] = 0;
3168         } else {
3169             iprio[irq] = (val >> (i * 8)) & 0xff;
3170         }
3171     }
3172 
3173     return RISCV_EXCP_NONE;
3174 }
3175 
3176 static int read_hviprio1(CPURISCVState *env, int csrno, target_ulong *val)
3177 {
3178     return read_hvipriox(env, 0, env->hviprio, val);
3179 }
3180 
3181 static int write_hviprio1(CPURISCVState *env, int csrno, target_ulong val)
3182 {
3183     return write_hvipriox(env, 0, env->hviprio, val);
3184 }
3185 
3186 static int read_hviprio1h(CPURISCVState *env, int csrno, target_ulong *val)
3187 {
3188     return read_hvipriox(env, 4, env->hviprio, val);
3189 }
3190 
3191 static int write_hviprio1h(CPURISCVState *env, int csrno, target_ulong val)
3192 {
3193     return write_hvipriox(env, 4, env->hviprio, val);
3194 }
3195 
3196 static int read_hviprio2(CPURISCVState *env, int csrno, target_ulong *val)
3197 {
3198     return read_hvipriox(env, 8, env->hviprio, val);
3199 }
3200 
3201 static int write_hviprio2(CPURISCVState *env, int csrno, target_ulong val)
3202 {
3203     return write_hvipriox(env, 8, env->hviprio, val);
3204 }
3205 
3206 static int read_hviprio2h(CPURISCVState *env, int csrno, target_ulong *val)
3207 {
3208     return read_hvipriox(env, 12, env->hviprio, val);
3209 }
3210 
3211 static int write_hviprio2h(CPURISCVState *env, int csrno, target_ulong val)
3212 {
3213     return write_hvipriox(env, 12, env->hviprio, val);
3214 }
3215 
3216 /* Virtual CSR Registers */
3217 static RISCVException read_vsstatus(CPURISCVState *env, int csrno,
3218                                     target_ulong *val)
3219 {
3220     *val = env->vsstatus;
3221     return RISCV_EXCP_NONE;
3222 }
3223 
3224 static RISCVException write_vsstatus(CPURISCVState *env, int csrno,
3225                                      target_ulong val)
3226 {
3227     uint64_t mask = (target_ulong)-1;
3228     if ((val & VSSTATUS64_UXL) == 0) {
3229         mask &= ~VSSTATUS64_UXL;
3230     }
3231     env->vsstatus = (env->vsstatus & ~mask) | (uint64_t)val;
3232     return RISCV_EXCP_NONE;
3233 }
3234 
3235 static int read_vstvec(CPURISCVState *env, int csrno, target_ulong *val)
3236 {
3237     *val = env->vstvec;
3238     return RISCV_EXCP_NONE;
3239 }
3240 
3241 static RISCVException write_vstvec(CPURISCVState *env, int csrno,
3242                                    target_ulong val)
3243 {
3244     env->vstvec = val;
3245     return RISCV_EXCP_NONE;
3246 }
3247 
3248 static RISCVException read_vsscratch(CPURISCVState *env, int csrno,
3249                                      target_ulong *val)
3250 {
3251     *val = env->vsscratch;
3252     return RISCV_EXCP_NONE;
3253 }
3254 
3255 static RISCVException write_vsscratch(CPURISCVState *env, int csrno,
3256                                       target_ulong val)
3257 {
3258     env->vsscratch = val;
3259     return RISCV_EXCP_NONE;
3260 }
3261 
3262 static RISCVException read_vsepc(CPURISCVState *env, int csrno,
3263                                  target_ulong *val)
3264 {
3265     *val = env->vsepc;
3266     return RISCV_EXCP_NONE;
3267 }
3268 
3269 static RISCVException write_vsepc(CPURISCVState *env, int csrno,
3270                                   target_ulong val)
3271 {
3272     env->vsepc = val;
3273     return RISCV_EXCP_NONE;
3274 }
3275 
3276 static RISCVException read_vscause(CPURISCVState *env, int csrno,
3277                                    target_ulong *val)
3278 {
3279     *val = env->vscause;
3280     return RISCV_EXCP_NONE;
3281 }
3282 
3283 static RISCVException write_vscause(CPURISCVState *env, int csrno,
3284                                     target_ulong val)
3285 {
3286     env->vscause = val;
3287     return RISCV_EXCP_NONE;
3288 }
3289 
3290 static RISCVException read_vstval(CPURISCVState *env, int csrno,
3291                                   target_ulong *val)
3292 {
3293     *val = env->vstval;
3294     return RISCV_EXCP_NONE;
3295 }
3296 
3297 static RISCVException write_vstval(CPURISCVState *env, int csrno,
3298                                    target_ulong val)
3299 {
3300     env->vstval = val;
3301     return RISCV_EXCP_NONE;
3302 }
3303 
3304 static RISCVException read_vsatp(CPURISCVState *env, int csrno,
3305                                  target_ulong *val)
3306 {
3307     *val = env->vsatp;
3308     return RISCV_EXCP_NONE;
3309 }
3310 
3311 static RISCVException write_vsatp(CPURISCVState *env, int csrno,
3312                                   target_ulong val)
3313 {
3314     env->vsatp = val;
3315     return RISCV_EXCP_NONE;
3316 }
3317 
3318 static RISCVException read_mtval2(CPURISCVState *env, int csrno,
3319                                   target_ulong *val)
3320 {
3321     *val = env->mtval2;
3322     return RISCV_EXCP_NONE;
3323 }
3324 
3325 static RISCVException write_mtval2(CPURISCVState *env, int csrno,
3326                                    target_ulong val)
3327 {
3328     env->mtval2 = val;
3329     return RISCV_EXCP_NONE;
3330 }
3331 
3332 static RISCVException read_mtinst(CPURISCVState *env, int csrno,
3333                                   target_ulong *val)
3334 {
3335     *val = env->mtinst;
3336     return RISCV_EXCP_NONE;
3337 }
3338 
3339 static RISCVException write_mtinst(CPURISCVState *env, int csrno,
3340                                    target_ulong val)
3341 {
3342     env->mtinst = val;
3343     return RISCV_EXCP_NONE;
3344 }
3345 
3346 /* Physical Memory Protection */
3347 static RISCVException read_mseccfg(CPURISCVState *env, int csrno,
3348                                    target_ulong *val)
3349 {
3350     *val = mseccfg_csr_read(env);
3351     return RISCV_EXCP_NONE;
3352 }
3353 
3354 static RISCVException write_mseccfg(CPURISCVState *env, int csrno,
3355                          target_ulong val)
3356 {
3357     mseccfg_csr_write(env, val);
3358     return RISCV_EXCP_NONE;
3359 }
3360 
3361 static bool check_pmp_reg_index(CPURISCVState *env, uint32_t reg_index)
3362 {
3363     /* TODO: RV128 restriction check */
3364     if ((reg_index & 1) && (riscv_cpu_mxl(env) == MXL_RV64)) {
3365         return false;
3366     }
3367     return true;
3368 }
3369 
3370 static RISCVException read_pmpcfg(CPURISCVState *env, int csrno,
3371                                   target_ulong *val)
3372 {
3373     uint32_t reg_index = csrno - CSR_PMPCFG0;
3374 
3375     if (!check_pmp_reg_index(env, reg_index)) {
3376         return RISCV_EXCP_ILLEGAL_INST;
3377     }
3378     *val = pmpcfg_csr_read(env, csrno - CSR_PMPCFG0);
3379     return RISCV_EXCP_NONE;
3380 }
3381 
3382 static RISCVException write_pmpcfg(CPURISCVState *env, int csrno,
3383                                    target_ulong val)
3384 {
3385     uint32_t reg_index = csrno - CSR_PMPCFG0;
3386 
3387     if (!check_pmp_reg_index(env, reg_index)) {
3388         return RISCV_EXCP_ILLEGAL_INST;
3389     }
3390     pmpcfg_csr_write(env, csrno - CSR_PMPCFG0, val);
3391     return RISCV_EXCP_NONE;
3392 }
3393 
3394 static RISCVException read_pmpaddr(CPURISCVState *env, int csrno,
3395                                    target_ulong *val)
3396 {
3397     *val = pmpaddr_csr_read(env, csrno - CSR_PMPADDR0);
3398     return RISCV_EXCP_NONE;
3399 }
3400 
3401 static RISCVException write_pmpaddr(CPURISCVState *env, int csrno,
3402                                     target_ulong val)
3403 {
3404     pmpaddr_csr_write(env, csrno - CSR_PMPADDR0, val);
3405     return RISCV_EXCP_NONE;
3406 }
3407 
3408 static RISCVException read_tselect(CPURISCVState *env, int csrno,
3409                                    target_ulong *val)
3410 {
3411     *val = tselect_csr_read(env);
3412     return RISCV_EXCP_NONE;
3413 }
3414 
3415 static RISCVException write_tselect(CPURISCVState *env, int csrno,
3416                                     target_ulong val)
3417 {
3418     tselect_csr_write(env, val);
3419     return RISCV_EXCP_NONE;
3420 }
3421 
3422 static RISCVException read_tdata(CPURISCVState *env, int csrno,
3423                                  target_ulong *val)
3424 {
3425     /* return 0 in tdata1 to end the trigger enumeration */
3426     if (env->trigger_cur >= RV_MAX_TRIGGERS && csrno == CSR_TDATA1) {
3427         *val = 0;
3428         return RISCV_EXCP_NONE;
3429     }
3430 
3431     if (!tdata_available(env, csrno - CSR_TDATA1)) {
3432         return RISCV_EXCP_ILLEGAL_INST;
3433     }
3434 
3435     *val = tdata_csr_read(env, csrno - CSR_TDATA1);
3436     return RISCV_EXCP_NONE;
3437 }
3438 
3439 static RISCVException write_tdata(CPURISCVState *env, int csrno,
3440                                   target_ulong val)
3441 {
3442     if (!tdata_available(env, csrno - CSR_TDATA1)) {
3443         return RISCV_EXCP_ILLEGAL_INST;
3444     }
3445 
3446     tdata_csr_write(env, csrno - CSR_TDATA1, val);
3447     return RISCV_EXCP_NONE;
3448 }
3449 
3450 static RISCVException read_tinfo(CPURISCVState *env, int csrno,
3451                                  target_ulong *val)
3452 {
3453     *val = tinfo_csr_read(env);
3454     return RISCV_EXCP_NONE;
3455 }
3456 
3457 /*
3458  * Functions to access Pointer Masking feature registers
3459  * We have to check if current priv lvl could modify
3460  * csr in given mode
3461  */
3462 static bool check_pm_current_disabled(CPURISCVState *env, int csrno)
3463 {
3464     int csr_priv = get_field(csrno, 0x300);
3465     int pm_current;
3466 
3467     if (env->debugger) {
3468         return false;
3469     }
3470     /*
3471      * If priv lvls differ that means we're accessing csr from higher priv lvl,
3472      * so allow the access
3473      */
3474     if (env->priv != csr_priv) {
3475         return false;
3476     }
3477     switch (env->priv) {
3478     case PRV_M:
3479         pm_current = get_field(env->mmte, M_PM_CURRENT);
3480         break;
3481     case PRV_S:
3482         pm_current = get_field(env->mmte, S_PM_CURRENT);
3483         break;
3484     case PRV_U:
3485         pm_current = get_field(env->mmte, U_PM_CURRENT);
3486         break;
3487     default:
3488         g_assert_not_reached();
3489     }
3490     /* It's same priv lvl, so we allow to modify csr only if pm.current==1 */
3491     return !pm_current;
3492 }
3493 
3494 static RISCVException read_mmte(CPURISCVState *env, int csrno,
3495                                 target_ulong *val)
3496 {
3497     *val = env->mmte & MMTE_MASK;
3498     return RISCV_EXCP_NONE;
3499 }
3500 
3501 static RISCVException write_mmte(CPURISCVState *env, int csrno,
3502                                  target_ulong val)
3503 {
3504     uint64_t mstatus;
3505     target_ulong wpri_val = val & MMTE_MASK;
3506 
3507     if (val != wpri_val) {
3508         qemu_log_mask(LOG_GUEST_ERROR, "%s" TARGET_FMT_lx " %s" TARGET_FMT_lx "\n",
3509                       "MMTE: WPRI violation written 0x", val,
3510                       "vs expected 0x", wpri_val);
3511     }
3512     /* for machine mode pm.current is hardwired to 1 */
3513     wpri_val |= MMTE_M_PM_CURRENT;
3514 
3515     /* hardwiring pm.instruction bit to 0, since it's not supported yet */
3516     wpri_val &= ~(MMTE_M_PM_INSN | MMTE_S_PM_INSN | MMTE_U_PM_INSN);
3517     env->mmte = wpri_val | PM_EXT_DIRTY;
3518     riscv_cpu_update_mask(env);
3519 
3520     /* Set XS and SD bits, since PM CSRs are dirty */
3521     mstatus = env->mstatus | MSTATUS_XS;
3522     write_mstatus(env, csrno, mstatus);
3523     return RISCV_EXCP_NONE;
3524 }
3525 
3526 static RISCVException read_smte(CPURISCVState *env, int csrno,
3527                                 target_ulong *val)
3528 {
3529     *val = env->mmte & SMTE_MASK;
3530     return RISCV_EXCP_NONE;
3531 }
3532 
3533 static RISCVException write_smte(CPURISCVState *env, int csrno,
3534                                  target_ulong val)
3535 {
3536     target_ulong wpri_val = val & SMTE_MASK;
3537 
3538     if (val != wpri_val) {
3539         qemu_log_mask(LOG_GUEST_ERROR, "%s" TARGET_FMT_lx " %s" TARGET_FMT_lx "\n",
3540                       "SMTE: WPRI violation written 0x", val,
3541                       "vs expected 0x", wpri_val);
3542     }
3543 
3544     /* if pm.current==0 we can't modify current PM CSRs */
3545     if (check_pm_current_disabled(env, csrno)) {
3546         return RISCV_EXCP_NONE;
3547     }
3548 
3549     wpri_val |= (env->mmte & ~SMTE_MASK);
3550     write_mmte(env, csrno, wpri_val);
3551     return RISCV_EXCP_NONE;
3552 }
3553 
3554 static RISCVException read_umte(CPURISCVState *env, int csrno,
3555                                 target_ulong *val)
3556 {
3557     *val = env->mmte & UMTE_MASK;
3558     return RISCV_EXCP_NONE;
3559 }
3560 
3561 static RISCVException write_umte(CPURISCVState *env, int csrno,
3562                                  target_ulong val)
3563 {
3564     target_ulong wpri_val = val & UMTE_MASK;
3565 
3566     if (val != wpri_val) {
3567         qemu_log_mask(LOG_GUEST_ERROR, "%s" TARGET_FMT_lx " %s" TARGET_FMT_lx "\n",
3568                       "UMTE: WPRI violation written 0x", val,
3569                       "vs expected 0x", wpri_val);
3570     }
3571 
3572     if (check_pm_current_disabled(env, csrno)) {
3573         return RISCV_EXCP_NONE;
3574     }
3575 
3576     wpri_val |= (env->mmte & ~UMTE_MASK);
3577     write_mmte(env, csrno, wpri_val);
3578     return RISCV_EXCP_NONE;
3579 }
3580 
3581 static RISCVException read_mpmmask(CPURISCVState *env, int csrno,
3582                                    target_ulong *val)
3583 {
3584     *val = env->mpmmask;
3585     return RISCV_EXCP_NONE;
3586 }
3587 
3588 static RISCVException write_mpmmask(CPURISCVState *env, int csrno,
3589                                     target_ulong val)
3590 {
3591     uint64_t mstatus;
3592 
3593     env->mpmmask = val;
3594     if ((env->priv == PRV_M) && (env->mmte & M_PM_ENABLE)) {
3595         env->cur_pmmask = val;
3596     }
3597     env->mmte |= PM_EXT_DIRTY;
3598 
3599     /* Set XS and SD bits, since PM CSRs are dirty */
3600     mstatus = env->mstatus | MSTATUS_XS;
3601     write_mstatus(env, csrno, mstatus);
3602     return RISCV_EXCP_NONE;
3603 }
3604 
3605 static RISCVException read_spmmask(CPURISCVState *env, int csrno,
3606                                    target_ulong *val)
3607 {
3608     *val = env->spmmask;
3609     return RISCV_EXCP_NONE;
3610 }
3611 
3612 static RISCVException write_spmmask(CPURISCVState *env, int csrno,
3613                                     target_ulong val)
3614 {
3615     uint64_t mstatus;
3616 
3617     /* if pm.current==0 we can't modify current PM CSRs */
3618     if (check_pm_current_disabled(env, csrno)) {
3619         return RISCV_EXCP_NONE;
3620     }
3621     env->spmmask = val;
3622     if ((env->priv == PRV_S) && (env->mmte & S_PM_ENABLE)) {
3623         env->cur_pmmask = val;
3624     }
3625     env->mmte |= PM_EXT_DIRTY;
3626 
3627     /* Set XS and SD bits, since PM CSRs are dirty */
3628     mstatus = env->mstatus | MSTATUS_XS;
3629     write_mstatus(env, csrno, mstatus);
3630     return RISCV_EXCP_NONE;
3631 }
3632 
3633 static RISCVException read_upmmask(CPURISCVState *env, int csrno,
3634                                    target_ulong *val)
3635 {
3636     *val = env->upmmask;
3637     return RISCV_EXCP_NONE;
3638 }
3639 
3640 static RISCVException write_upmmask(CPURISCVState *env, int csrno,
3641                                     target_ulong val)
3642 {
3643     uint64_t mstatus;
3644 
3645     /* if pm.current==0 we can't modify current PM CSRs */
3646     if (check_pm_current_disabled(env, csrno)) {
3647         return RISCV_EXCP_NONE;
3648     }
3649     env->upmmask = val;
3650     if ((env->priv == PRV_U) && (env->mmte & U_PM_ENABLE)) {
3651         env->cur_pmmask = val;
3652     }
3653     env->mmte |= PM_EXT_DIRTY;
3654 
3655     /* Set XS and SD bits, since PM CSRs are dirty */
3656     mstatus = env->mstatus | MSTATUS_XS;
3657     write_mstatus(env, csrno, mstatus);
3658     return RISCV_EXCP_NONE;
3659 }
3660 
3661 static RISCVException read_mpmbase(CPURISCVState *env, int csrno,
3662                                    target_ulong *val)
3663 {
3664     *val = env->mpmbase;
3665     return RISCV_EXCP_NONE;
3666 }
3667 
3668 static RISCVException write_mpmbase(CPURISCVState *env, int csrno,
3669                                     target_ulong val)
3670 {
3671     uint64_t mstatus;
3672 
3673     env->mpmbase = val;
3674     if ((env->priv == PRV_M) && (env->mmte & M_PM_ENABLE)) {
3675         env->cur_pmbase = val;
3676     }
3677     env->mmte |= PM_EXT_DIRTY;
3678 
3679     /* Set XS and SD bits, since PM CSRs are dirty */
3680     mstatus = env->mstatus | MSTATUS_XS;
3681     write_mstatus(env, csrno, mstatus);
3682     return RISCV_EXCP_NONE;
3683 }
3684 
3685 static RISCVException read_spmbase(CPURISCVState *env, int csrno,
3686                                    target_ulong *val)
3687 {
3688     *val = env->spmbase;
3689     return RISCV_EXCP_NONE;
3690 }
3691 
3692 static RISCVException write_spmbase(CPURISCVState *env, int csrno,
3693                                     target_ulong val)
3694 {
3695     uint64_t mstatus;
3696 
3697     /* if pm.current==0 we can't modify current PM CSRs */
3698     if (check_pm_current_disabled(env, csrno)) {
3699         return RISCV_EXCP_NONE;
3700     }
3701     env->spmbase = val;
3702     if ((env->priv == PRV_S) && (env->mmte & S_PM_ENABLE)) {
3703         env->cur_pmbase = val;
3704     }
3705     env->mmte |= PM_EXT_DIRTY;
3706 
3707     /* Set XS and SD bits, since PM CSRs are dirty */
3708     mstatus = env->mstatus | MSTATUS_XS;
3709     write_mstatus(env, csrno, mstatus);
3710     return RISCV_EXCP_NONE;
3711 }
3712 
3713 static RISCVException read_upmbase(CPURISCVState *env, int csrno,
3714                                    target_ulong *val)
3715 {
3716     *val = env->upmbase;
3717     return RISCV_EXCP_NONE;
3718 }
3719 
3720 static RISCVException write_upmbase(CPURISCVState *env, int csrno,
3721                                     target_ulong val)
3722 {
3723     uint64_t mstatus;
3724 
3725     /* if pm.current==0 we can't modify current PM CSRs */
3726     if (check_pm_current_disabled(env, csrno)) {
3727         return RISCV_EXCP_NONE;
3728     }
3729     env->upmbase = val;
3730     if ((env->priv == PRV_U) && (env->mmte & U_PM_ENABLE)) {
3731         env->cur_pmbase = val;
3732     }
3733     env->mmte |= PM_EXT_DIRTY;
3734 
3735     /* Set XS and SD bits, since PM CSRs are dirty */
3736     mstatus = env->mstatus | MSTATUS_XS;
3737     write_mstatus(env, csrno, mstatus);
3738     return RISCV_EXCP_NONE;
3739 }
3740 
3741 #endif
3742 
3743 /* Crypto Extension */
3744 static RISCVException rmw_seed(CPURISCVState *env, int csrno,
3745                                target_ulong *ret_value,
3746                                target_ulong new_value,
3747                                target_ulong write_mask)
3748 {
3749     uint16_t random_v;
3750     Error *random_e = NULL;
3751     int random_r;
3752     target_ulong rval;
3753 
3754     random_r = qemu_guest_getrandom(&random_v, 2, &random_e);
3755     if (unlikely(random_r < 0)) {
3756         /*
3757          * Failed, for unknown reasons in the crypto subsystem.
3758          * The best we can do is log the reason and return a
3759          * failure indication to the guest.  There is no reason
3760          * we know to expect the failure to be transitory, so
3761          * indicate DEAD to avoid having the guest spin on WAIT.
3762          */
3763         qemu_log_mask(LOG_UNIMP, "%s: Crypto failure: %s",
3764                       __func__, error_get_pretty(random_e));
3765         error_free(random_e);
3766         rval = SEED_OPST_DEAD;
3767     } else {
3768         rval = random_v | SEED_OPST_ES16;
3769     }
3770 
3771     if (ret_value) {
3772         *ret_value = rval;
3773     }
3774 
3775     return RISCV_EXCP_NONE;
3776 }
3777 
3778 /*
3779  * riscv_csrrw - read and/or update control and status register
3780  *
3781  * csrr   <->  riscv_csrrw(env, csrno, ret_value, 0, 0);
3782  * csrrw  <->  riscv_csrrw(env, csrno, ret_value, value, -1);
3783  * csrrs  <->  riscv_csrrw(env, csrno, ret_value, -1, value);
3784  * csrrc  <->  riscv_csrrw(env, csrno, ret_value, 0, value);
3785  */
3786 
3787 static inline RISCVException riscv_csrrw_check(CPURISCVState *env,
3788                                                int csrno,
3789                                                bool write_mask,
3790                                                RISCVCPU *cpu)
3791 {
3792     /* check privileges and return RISCV_EXCP_ILLEGAL_INST if check fails */
3793     int read_only = get_field(csrno, 0xC00) == 3;
3794     int csr_min_priv = csr_ops[csrno].min_priv_ver;
3795 
3796     /* ensure the CSR extension is enabled. */
3797     if (!cpu->cfg.ext_icsr) {
3798         return RISCV_EXCP_ILLEGAL_INST;
3799     }
3800 
3801     if (env->priv_ver < csr_min_priv) {
3802         return RISCV_EXCP_ILLEGAL_INST;
3803     }
3804 
3805     /* check predicate */
3806     if (!csr_ops[csrno].predicate) {
3807         return RISCV_EXCP_ILLEGAL_INST;
3808     }
3809 
3810     if (write_mask && read_only) {
3811         return RISCV_EXCP_ILLEGAL_INST;
3812     }
3813 
3814     RISCVException ret = csr_ops[csrno].predicate(env, csrno);
3815     if (ret != RISCV_EXCP_NONE) {
3816         return ret;
3817     }
3818 
3819 #if !defined(CONFIG_USER_ONLY)
3820     int csr_priv, effective_priv = env->priv;
3821 
3822     if (riscv_has_ext(env, RVH) && env->priv == PRV_S &&
3823         !riscv_cpu_virt_enabled(env)) {
3824         /*
3825          * We are in HS mode. Add 1 to the effective privledge level to
3826          * allow us to access the Hypervisor CSRs.
3827          */
3828         effective_priv++;
3829     }
3830 
3831     csr_priv = get_field(csrno, 0x300);
3832     if (!env->debugger && (effective_priv < csr_priv)) {
3833         if (csr_priv == (PRV_S + 1) && riscv_cpu_virt_enabled(env)) {
3834             return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
3835         }
3836         return RISCV_EXCP_ILLEGAL_INST;
3837     }
3838 #endif
3839     return RISCV_EXCP_NONE;
3840 }
3841 
3842 static RISCVException riscv_csrrw_do64(CPURISCVState *env, int csrno,
3843                                        target_ulong *ret_value,
3844                                        target_ulong new_value,
3845                                        target_ulong write_mask)
3846 {
3847     RISCVException ret;
3848     target_ulong old_value;
3849 
3850     /* execute combined read/write operation if it exists */
3851     if (csr_ops[csrno].op) {
3852         return csr_ops[csrno].op(env, csrno, ret_value, new_value, write_mask);
3853     }
3854 
3855     /* if no accessor exists then return failure */
3856     if (!csr_ops[csrno].read) {
3857         return RISCV_EXCP_ILLEGAL_INST;
3858     }
3859     /* read old value */
3860     ret = csr_ops[csrno].read(env, csrno, &old_value);
3861     if (ret != RISCV_EXCP_NONE) {
3862         return ret;
3863     }
3864 
3865     /* write value if writable and write mask set, otherwise drop writes */
3866     if (write_mask) {
3867         new_value = (old_value & ~write_mask) | (new_value & write_mask);
3868         if (csr_ops[csrno].write) {
3869             ret = csr_ops[csrno].write(env, csrno, new_value);
3870             if (ret != RISCV_EXCP_NONE) {
3871                 return ret;
3872             }
3873         }
3874     }
3875 
3876     /* return old value */
3877     if (ret_value) {
3878         *ret_value = old_value;
3879     }
3880 
3881     return RISCV_EXCP_NONE;
3882 }
3883 
3884 RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
3885                            target_ulong *ret_value,
3886                            target_ulong new_value, target_ulong write_mask)
3887 {
3888     RISCVCPU *cpu = env_archcpu(env);
3889 
3890     RISCVException ret = riscv_csrrw_check(env, csrno, write_mask, cpu);
3891     if (ret != RISCV_EXCP_NONE) {
3892         return ret;
3893     }
3894 
3895     return riscv_csrrw_do64(env, csrno, ret_value, new_value, write_mask);
3896 }
3897 
3898 static RISCVException riscv_csrrw_do128(CPURISCVState *env, int csrno,
3899                                         Int128 *ret_value,
3900                                         Int128 new_value,
3901                                         Int128 write_mask)
3902 {
3903     RISCVException ret;
3904     Int128 old_value;
3905 
3906     /* read old value */
3907     ret = csr_ops[csrno].read128(env, csrno, &old_value);
3908     if (ret != RISCV_EXCP_NONE) {
3909         return ret;
3910     }
3911 
3912     /* write value if writable and write mask set, otherwise drop writes */
3913     if (int128_nz(write_mask)) {
3914         new_value = int128_or(int128_and(old_value, int128_not(write_mask)),
3915                               int128_and(new_value, write_mask));
3916         if (csr_ops[csrno].write128) {
3917             ret = csr_ops[csrno].write128(env, csrno, new_value);
3918             if (ret != RISCV_EXCP_NONE) {
3919                 return ret;
3920             }
3921         } else if (csr_ops[csrno].write) {
3922             /* avoids having to write wrappers for all registers */
3923             ret = csr_ops[csrno].write(env, csrno, int128_getlo(new_value));
3924             if (ret != RISCV_EXCP_NONE) {
3925                 return ret;
3926             }
3927         }
3928     }
3929 
3930     /* return old value */
3931     if (ret_value) {
3932         *ret_value = old_value;
3933     }
3934 
3935     return RISCV_EXCP_NONE;
3936 }
3937 
3938 RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno,
3939                                 Int128 *ret_value,
3940                                 Int128 new_value, Int128 write_mask)
3941 {
3942     RISCVException ret;
3943     RISCVCPU *cpu = env_archcpu(env);
3944 
3945     ret = riscv_csrrw_check(env, csrno, int128_nz(write_mask), cpu);
3946     if (ret != RISCV_EXCP_NONE) {
3947         return ret;
3948     }
3949 
3950     if (csr_ops[csrno].read128) {
3951         return riscv_csrrw_do128(env, csrno, ret_value, new_value, write_mask);
3952     }
3953 
3954     /*
3955      * Fall back to 64-bit version for now, if the 128-bit alternative isn't
3956      * at all defined.
3957      * Note, some CSRs don't need to extend to MXLEN (64 upper bits non
3958      * significant), for those, this fallback is correctly handling the accesses
3959      */
3960     target_ulong old_value;
3961     ret = riscv_csrrw_do64(env, csrno, &old_value,
3962                            int128_getlo(new_value),
3963                            int128_getlo(write_mask));
3964     if (ret == RISCV_EXCP_NONE && ret_value) {
3965         *ret_value = int128_make64(old_value);
3966     }
3967     return ret;
3968 }
3969 
3970 /*
3971  * Debugger support.  If not in user mode, set env->debugger before the
3972  * riscv_csrrw call and clear it after the call.
3973  */
3974 RISCVException riscv_csrrw_debug(CPURISCVState *env, int csrno,
3975                                  target_ulong *ret_value,
3976                                  target_ulong new_value,
3977                                  target_ulong write_mask)
3978 {
3979     RISCVException ret;
3980 #if !defined(CONFIG_USER_ONLY)
3981     env->debugger = true;
3982 #endif
3983     ret = riscv_csrrw(env, csrno, ret_value, new_value, write_mask);
3984 #if !defined(CONFIG_USER_ONLY)
3985     env->debugger = false;
3986 #endif
3987     return ret;
3988 }
3989 
3990 /* Control and Status Register function table */
3991 riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
3992     /* User Floating-Point CSRs */
3993     [CSR_FFLAGS]   = { "fflags",   fs,     read_fflags,  write_fflags },
3994     [CSR_FRM]      = { "frm",      fs,     read_frm,     write_frm    },
3995     [CSR_FCSR]     = { "fcsr",     fs,     read_fcsr,    write_fcsr   },
3996     /* Vector CSRs */
3997     [CSR_VSTART]   = { "vstart",   vs,     read_vstart,  write_vstart },
3998     [CSR_VXSAT]    = { "vxsat",    vs,     read_vxsat,   write_vxsat  },
3999     [CSR_VXRM]     = { "vxrm",     vs,     read_vxrm,    write_vxrm   },
4000     [CSR_VCSR]     = { "vcsr",     vs,     read_vcsr,    write_vcsr   },
4001     [CSR_VL]       = { "vl",       vs,     read_vl                    },
4002     [CSR_VTYPE]    = { "vtype",    vs,     read_vtype                 },
4003     [CSR_VLENB]    = { "vlenb",    vs,     read_vlenb                 },
4004     /* User Timers and Counters */
4005     [CSR_CYCLE]    = { "cycle",    ctr,    read_hpmcounter  },
4006     [CSR_INSTRET]  = { "instret",  ctr,    read_hpmcounter  },
4007     [CSR_CYCLEH]   = { "cycleh",   ctr32,  read_hpmcounterh },
4008     [CSR_INSTRETH] = { "instreth", ctr32,  read_hpmcounterh },
4009 
4010     /*
4011      * In privileged mode, the monitor will have to emulate TIME CSRs only if
4012      * rdtime callback is not provided by machine/platform emulation.
4013      */
4014     [CSR_TIME]  = { "time",  ctr,   read_time  },
4015     [CSR_TIMEH] = { "timeh", ctr32, read_timeh },
4016 
4017     /* Crypto Extension */
4018     [CSR_SEED] = { "seed", seed, NULL, NULL, rmw_seed },
4019 
4020 #if !defined(CONFIG_USER_ONLY)
4021     /* Machine Timers and Counters */
4022     [CSR_MCYCLE]    = { "mcycle",    any,   read_hpmcounter,
4023                         write_mhpmcounter                    },
4024     [CSR_MINSTRET]  = { "minstret",  any,   read_hpmcounter,
4025                         write_mhpmcounter                    },
4026     [CSR_MCYCLEH]   = { "mcycleh",   any32, read_hpmcounterh,
4027                         write_mhpmcounterh                   },
4028     [CSR_MINSTRETH] = { "minstreth", any32, read_hpmcounterh,
4029                         write_mhpmcounterh                   },
4030 
4031     /* Machine Information Registers */
4032     [CSR_MVENDORID] = { "mvendorid", any,   read_mvendorid },
4033     [CSR_MARCHID]   = { "marchid",   any,   read_marchid   },
4034     [CSR_MIMPID]    = { "mimpid",    any,   read_mimpid    },
4035     [CSR_MHARTID]   = { "mhartid",   any,   read_mhartid   },
4036 
4037     [CSR_MCONFIGPTR]  = { "mconfigptr", any,   read_zero,
4038                           .min_priv_ver = PRIV_VERSION_1_12_0 },
4039     /* Machine Trap Setup */
4040     [CSR_MSTATUS]     = { "mstatus",    any,   read_mstatus, write_mstatus,
4041                           NULL,                read_mstatus_i128           },
4042     [CSR_MISA]        = { "misa",       any,   read_misa,    write_misa,
4043                           NULL,                read_misa_i128              },
4044     [CSR_MIDELEG]     = { "mideleg",    any,   NULL, NULL,   rmw_mideleg   },
4045     [CSR_MEDELEG]     = { "medeleg",    any,   read_medeleg, write_medeleg },
4046     [CSR_MIE]         = { "mie",        any,   NULL, NULL,   rmw_mie       },
4047     [CSR_MTVEC]       = { "mtvec",      any,   read_mtvec,   write_mtvec   },
4048     [CSR_MCOUNTEREN]  = { "mcounteren", umode, read_mcounteren,
4049                           write_mcounteren                                 },
4050 
4051     [CSR_MSTATUSH]    = { "mstatush",   any32, read_mstatush,
4052                           write_mstatush                                   },
4053 
4054     /* Machine Trap Handling */
4055     [CSR_MSCRATCH] = { "mscratch", any,  read_mscratch, write_mscratch,
4056                        NULL, read_mscratch_i128, write_mscratch_i128   },
4057     [CSR_MEPC]     = { "mepc",     any,  read_mepc,     write_mepc     },
4058     [CSR_MCAUSE]   = { "mcause",   any,  read_mcause,   write_mcause   },
4059     [CSR_MTVAL]    = { "mtval",    any,  read_mtval,    write_mtval    },
4060     [CSR_MIP]      = { "mip",      any,  NULL,    NULL, rmw_mip        },
4061 
4062     /* Machine-Level Window to Indirectly Accessed Registers (AIA) */
4063     [CSR_MISELECT] = { "miselect", aia_any,   NULL, NULL,    rmw_xiselect },
4064     [CSR_MIREG]    = { "mireg",    aia_any,   NULL, NULL,    rmw_xireg },
4065 
4066     /* Machine-Level Interrupts (AIA) */
4067     [CSR_MTOPEI]   = { "mtopei",   aia_any, NULL, NULL, rmw_xtopei },
4068     [CSR_MTOPI]    = { "mtopi",    aia_any, read_mtopi },
4069 
4070     /* Virtual Interrupts for Supervisor Level (AIA) */
4071     [CSR_MVIEN]    = { "mvien",    aia_any, read_zero, write_ignore },
4072     [CSR_MVIP]     = { "mvip",     aia_any, read_zero, write_ignore },
4073 
4074     /* Machine-Level High-Half CSRs (AIA) */
4075     [CSR_MIDELEGH] = { "midelegh", aia_any32, NULL, NULL, rmw_midelegh },
4076     [CSR_MIEH]     = { "mieh",     aia_any32, NULL, NULL, rmw_mieh     },
4077     [CSR_MVIENH]   = { "mvienh",   aia_any32, read_zero,  write_ignore },
4078     [CSR_MVIPH]    = { "mviph",    aia_any32, read_zero,  write_ignore },
4079     [CSR_MIPH]     = { "miph",     aia_any32, NULL, NULL, rmw_miph     },
4080 
4081     /* Execution environment configuration */
4082     [CSR_MENVCFG]  = { "menvcfg",  umode, read_menvcfg,  write_menvcfg,
4083                        .min_priv_ver = PRIV_VERSION_1_12_0              },
4084     [CSR_MENVCFGH] = { "menvcfgh", umode32, read_menvcfgh, write_menvcfgh,
4085                        .min_priv_ver = PRIV_VERSION_1_12_0              },
4086     [CSR_SENVCFG]  = { "senvcfg",  smode, read_senvcfg,  write_senvcfg,
4087                        .min_priv_ver = PRIV_VERSION_1_12_0              },
4088     [CSR_HENVCFG]  = { "henvcfg",  hmode, read_henvcfg, write_henvcfg,
4089                        .min_priv_ver = PRIV_VERSION_1_12_0              },
4090     [CSR_HENVCFGH] = { "henvcfgh", hmode32, read_henvcfgh, write_henvcfgh,
4091                        .min_priv_ver = PRIV_VERSION_1_12_0              },
4092 
4093     /* Smstateen extension CSRs */
4094     [CSR_MSTATEEN0] = { "mstateen0", mstateen, read_mstateen, write_mstateen0,
4095                         .min_priv_ver = PRIV_VERSION_1_12_0 },
4096     [CSR_MSTATEEN0H] = { "mstateen0h", mstateen, read_mstateenh,
4097                           write_mstateen0h,
4098                          .min_priv_ver = PRIV_VERSION_1_12_0 },
4099     [CSR_MSTATEEN1] = { "mstateen1", mstateen, read_mstateen,
4100                         write_mstateen_1_3,
4101                         .min_priv_ver = PRIV_VERSION_1_12_0 },
4102     [CSR_MSTATEEN1H] = { "mstateen1h", mstateen, read_mstateenh,
4103                          write_mstateenh_1_3,
4104                          .min_priv_ver = PRIV_VERSION_1_12_0 },
4105     [CSR_MSTATEEN2] = { "mstateen2", mstateen, read_mstateen,
4106                         write_mstateen_1_3,
4107                         .min_priv_ver = PRIV_VERSION_1_12_0 },
4108     [CSR_MSTATEEN2H] = { "mstateen2h", mstateen, read_mstateenh,
4109                          write_mstateenh_1_3,
4110                          .min_priv_ver = PRIV_VERSION_1_12_0 },
4111     [CSR_MSTATEEN3] = { "mstateen3", mstateen, read_mstateen,
4112                         write_mstateen_1_3,
4113                         .min_priv_ver = PRIV_VERSION_1_12_0 },
4114     [CSR_MSTATEEN3H] = { "mstateen3h", mstateen, read_mstateenh,
4115                          write_mstateenh_1_3,
4116                          .min_priv_ver = PRIV_VERSION_1_12_0 },
4117     [CSR_HSTATEEN0] = { "hstateen0", hstateen, read_hstateen, write_hstateen0,
4118                         .min_priv_ver = PRIV_VERSION_1_12_0 },
4119     [CSR_HSTATEEN0H] = { "hstateen0h", hstateenh, read_hstateenh,
4120                          write_hstateen0h,
4121                          .min_priv_ver = PRIV_VERSION_1_12_0 },
4122     [CSR_HSTATEEN1] = { "hstateen1", hstateen, read_hstateen,
4123                         write_hstateen_1_3,
4124                         .min_priv_ver = PRIV_VERSION_1_12_0 },
4125     [CSR_HSTATEEN1H] = { "hstateen1h", hstateenh, read_hstateenh,
4126                          write_hstateenh_1_3,
4127                          .min_priv_ver = PRIV_VERSION_1_12_0 },
4128     [CSR_HSTATEEN2] = { "hstateen2", hstateen, read_hstateen,
4129                         write_hstateen_1_3,
4130                         .min_priv_ver = PRIV_VERSION_1_12_0 },
4131     [CSR_HSTATEEN2H] = { "hstateen2h", hstateenh, read_hstateenh,
4132                          write_hstateenh_1_3,
4133                          .min_priv_ver = PRIV_VERSION_1_12_0 },
4134     [CSR_HSTATEEN3] = { "hstateen3", hstateen, read_hstateen,
4135                         write_hstateen_1_3,
4136                         .min_priv_ver = PRIV_VERSION_1_12_0 },
4137     [CSR_HSTATEEN3H] = { "hstateen3h", hstateenh, read_hstateenh,
4138                          write_hstateenh_1_3,
4139                          .min_priv_ver = PRIV_VERSION_1_12_0 },
4140     [CSR_SSTATEEN0] = { "sstateen0", sstateen, read_sstateen, write_sstateen0,
4141                         .min_priv_ver = PRIV_VERSION_1_12_0 },
4142     [CSR_SSTATEEN1] = { "sstateen1", sstateen, read_sstateen,
4143                         write_sstateen_1_3,
4144                         .min_priv_ver = PRIV_VERSION_1_12_0 },
4145     [CSR_SSTATEEN2] = { "sstateen2", sstateen, read_sstateen,
4146                         write_sstateen_1_3,
4147                         .min_priv_ver = PRIV_VERSION_1_12_0 },
4148     [CSR_SSTATEEN3] = { "sstateen3", sstateen, read_sstateen,
4149                         write_sstateen_1_3,
4150                         .min_priv_ver = PRIV_VERSION_1_12_0 },
4151 
4152     /* Supervisor Trap Setup */
4153     [CSR_SSTATUS]    = { "sstatus",    smode, read_sstatus,    write_sstatus,
4154                          NULL,                read_sstatus_i128               },
4155     [CSR_SIE]        = { "sie",        smode, NULL,   NULL,    rmw_sie        },
4156     [CSR_STVEC]      = { "stvec",      smode, read_stvec,      write_stvec    },
4157     [CSR_SCOUNTEREN] = { "scounteren", smode, read_scounteren,
4158                          write_scounteren                                     },
4159 
4160     /* Supervisor Trap Handling */
4161     [CSR_SSCRATCH] = { "sscratch", smode, read_sscratch, write_sscratch,
4162                        NULL, read_sscratch_i128, write_sscratch_i128    },
4163     [CSR_SEPC]     = { "sepc",     smode, read_sepc,     write_sepc     },
4164     [CSR_SCAUSE]   = { "scause",   smode, read_scause,   write_scause   },
4165     [CSR_STVAL]    = { "stval",    smode, read_stval,    write_stval    },
4166     [CSR_SIP]      = { "sip",      smode, NULL,    NULL, rmw_sip        },
4167     [CSR_STIMECMP] = { "stimecmp", sstc, read_stimecmp, write_stimecmp,
4168                        .min_priv_ver = PRIV_VERSION_1_12_0 },
4169     [CSR_STIMECMPH] = { "stimecmph", sstc_32, read_stimecmph, write_stimecmph,
4170                         .min_priv_ver = PRIV_VERSION_1_12_0 },
4171     [CSR_VSTIMECMP] = { "vstimecmp", sstc, read_vstimecmp,
4172                         write_vstimecmp,
4173                         .min_priv_ver = PRIV_VERSION_1_12_0 },
4174     [CSR_VSTIMECMPH] = { "vstimecmph", sstc_32, read_vstimecmph,
4175                          write_vstimecmph,
4176                          .min_priv_ver = PRIV_VERSION_1_12_0 },
4177 
4178     /* Supervisor Protection and Translation */
4179     [CSR_SATP]     = { "satp",     smode, read_satp,     write_satp     },
4180 
4181     /* Supervisor-Level Window to Indirectly Accessed Registers (AIA) */
4182     [CSR_SISELECT]   = { "siselect",   aia_smode, NULL, NULL, rmw_xiselect },
4183     [CSR_SIREG]      = { "sireg",      aia_smode, NULL, NULL, rmw_xireg },
4184 
4185     /* Supervisor-Level Interrupts (AIA) */
4186     [CSR_STOPEI]     = { "stopei",     aia_smode, NULL, NULL, rmw_xtopei },
4187     [CSR_STOPI]      = { "stopi",      aia_smode, read_stopi },
4188 
4189     /* Supervisor-Level High-Half CSRs (AIA) */
4190     [CSR_SIEH]       = { "sieh",   aia_smode32, NULL, NULL, rmw_sieh },
4191     [CSR_SIPH]       = { "siph",   aia_smode32, NULL, NULL, rmw_siph },
4192 
4193     [CSR_HSTATUS]     = { "hstatus",     hmode,   read_hstatus, write_hstatus,
4194                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4195     [CSR_HEDELEG]     = { "hedeleg",     hmode,   read_hedeleg, write_hedeleg,
4196                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4197     [CSR_HIDELEG]     = { "hideleg",     hmode,   NULL,   NULL, rmw_hideleg,
4198                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4199     [CSR_HVIP]        = { "hvip",        hmode,   NULL,   NULL, rmw_hvip,
4200                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4201     [CSR_HIP]         = { "hip",         hmode,   NULL,   NULL, rmw_hip,
4202                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4203     [CSR_HIE]         = { "hie",         hmode,   NULL,   NULL, rmw_hie,
4204                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4205     [CSR_HCOUNTEREN]  = { "hcounteren",  hmode,   read_hcounteren,
4206                           write_hcounteren,
4207                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4208     [CSR_HGEIE]       = { "hgeie",       hmode,   read_hgeie,   write_hgeie,
4209                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4210     [CSR_HTVAL]       = { "htval",       hmode,   read_htval,   write_htval,
4211                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4212     [CSR_HTINST]      = { "htinst",      hmode,   read_htinst,  write_htinst,
4213                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4214     [CSR_HGEIP]       = { "hgeip",       hmode,   read_hgeip,
4215                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4216     [CSR_HGATP]       = { "hgatp",       hmode,   read_hgatp,   write_hgatp,
4217                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4218     [CSR_HTIMEDELTA]  = { "htimedelta",  hmode,   read_htimedelta,
4219                           write_htimedelta,
4220                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4221     [CSR_HTIMEDELTAH] = { "htimedeltah", hmode32, read_htimedeltah,
4222                           write_htimedeltah,
4223                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4224 
4225     [CSR_VSSTATUS]    = { "vsstatus",    hmode,   read_vsstatus,
4226                           write_vsstatus,
4227                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4228     [CSR_VSIP]        = { "vsip",        hmode,   NULL,    NULL, rmw_vsip,
4229                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4230     [CSR_VSIE]        = { "vsie",        hmode,   NULL,    NULL, rmw_vsie ,
4231                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4232     [CSR_VSTVEC]      = { "vstvec",      hmode,   read_vstvec,   write_vstvec,
4233                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4234     [CSR_VSSCRATCH]   = { "vsscratch",   hmode,   read_vsscratch,
4235                           write_vsscratch,
4236                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4237     [CSR_VSEPC]       = { "vsepc",       hmode,   read_vsepc,    write_vsepc,
4238                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4239     [CSR_VSCAUSE]     = { "vscause",     hmode,   read_vscause,  write_vscause,
4240                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4241     [CSR_VSTVAL]      = { "vstval",      hmode,   read_vstval,   write_vstval,
4242                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4243     [CSR_VSATP]       = { "vsatp",       hmode,   read_vsatp,    write_vsatp,
4244                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4245 
4246     [CSR_MTVAL2]      = { "mtval2",      hmode,   read_mtval2,   write_mtval2,
4247                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4248     [CSR_MTINST]      = { "mtinst",      hmode,   read_mtinst,   write_mtinst,
4249                           .min_priv_ver = PRIV_VERSION_1_12_0                },
4250 
4251     /* Virtual Interrupts and Interrupt Priorities (H-extension with AIA) */
4252     [CSR_HVIEN]       = { "hvien",       aia_hmode, read_zero, write_ignore },
4253     [CSR_HVICTL]      = { "hvictl",      aia_hmode, read_hvictl,
4254                           write_hvictl                                      },
4255     [CSR_HVIPRIO1]    = { "hviprio1",    aia_hmode, read_hviprio1,
4256                           write_hviprio1                                    },
4257     [CSR_HVIPRIO2]    = { "hviprio2",    aia_hmode, read_hviprio2,
4258                           write_hviprio2                                    },
4259 
4260     /*
4261      * VS-Level Window to Indirectly Accessed Registers (H-extension with AIA)
4262      */
4263     [CSR_VSISELECT]   = { "vsiselect",   aia_hmode, NULL, NULL,
4264                           rmw_xiselect                                     },
4265     [CSR_VSIREG]      = { "vsireg",      aia_hmode, NULL, NULL, rmw_xireg  },
4266 
4267     /* VS-Level Interrupts (H-extension with AIA) */
4268     [CSR_VSTOPEI]     = { "vstopei",     aia_hmode, NULL, NULL, rmw_xtopei },
4269     [CSR_VSTOPI]      = { "vstopi",      aia_hmode, read_vstopi },
4270 
4271     /* Hypervisor and VS-Level High-Half CSRs (H-extension with AIA) */
4272     [CSR_HIDELEGH]    = { "hidelegh",    aia_hmode32, NULL, NULL,
4273                           rmw_hidelegh                                      },
4274     [CSR_HVIENH]      = { "hvienh",      aia_hmode32, read_zero,
4275                           write_ignore                                      },
4276     [CSR_HVIPH]       = { "hviph",       aia_hmode32, NULL, NULL, rmw_hviph },
4277     [CSR_HVIPRIO1H]   = { "hviprio1h",   aia_hmode32, read_hviprio1h,
4278                           write_hviprio1h                                   },
4279     [CSR_HVIPRIO2H]   = { "hviprio2h",   aia_hmode32, read_hviprio2h,
4280                           write_hviprio2h                                   },
4281     [CSR_VSIEH]       = { "vsieh",       aia_hmode32, NULL, NULL, rmw_vsieh },
4282     [CSR_VSIPH]       = { "vsiph",       aia_hmode32, NULL, NULL, rmw_vsiph },
4283 
4284     /* Physical Memory Protection */
4285     [CSR_MSECCFG]    = { "mseccfg",  epmp, read_mseccfg, write_mseccfg,
4286                          .min_priv_ver = PRIV_VERSION_1_11_0           },
4287     [CSR_PMPCFG0]    = { "pmpcfg0",   pmp, read_pmpcfg,  write_pmpcfg  },
4288     [CSR_PMPCFG1]    = { "pmpcfg1",   pmp, read_pmpcfg,  write_pmpcfg  },
4289     [CSR_PMPCFG2]    = { "pmpcfg2",   pmp, read_pmpcfg,  write_pmpcfg  },
4290     [CSR_PMPCFG3]    = { "pmpcfg3",   pmp, read_pmpcfg,  write_pmpcfg  },
4291     [CSR_PMPADDR0]   = { "pmpaddr0",  pmp, read_pmpaddr, write_pmpaddr },
4292     [CSR_PMPADDR1]   = { "pmpaddr1",  pmp, read_pmpaddr, write_pmpaddr },
4293     [CSR_PMPADDR2]   = { "pmpaddr2",  pmp, read_pmpaddr, write_pmpaddr },
4294     [CSR_PMPADDR3]   = { "pmpaddr3",  pmp, read_pmpaddr, write_pmpaddr },
4295     [CSR_PMPADDR4]   = { "pmpaddr4",  pmp, read_pmpaddr, write_pmpaddr },
4296     [CSR_PMPADDR5]   = { "pmpaddr5",  pmp, read_pmpaddr, write_pmpaddr },
4297     [CSR_PMPADDR6]   = { "pmpaddr6",  pmp, read_pmpaddr, write_pmpaddr },
4298     [CSR_PMPADDR7]   = { "pmpaddr7",  pmp, read_pmpaddr, write_pmpaddr },
4299     [CSR_PMPADDR8]   = { "pmpaddr8",  pmp, read_pmpaddr, write_pmpaddr },
4300     [CSR_PMPADDR9]   = { "pmpaddr9",  pmp, read_pmpaddr, write_pmpaddr },
4301     [CSR_PMPADDR10]  = { "pmpaddr10", pmp, read_pmpaddr, write_pmpaddr },
4302     [CSR_PMPADDR11]  = { "pmpaddr11", pmp, read_pmpaddr, write_pmpaddr },
4303     [CSR_PMPADDR12]  = { "pmpaddr12", pmp, read_pmpaddr, write_pmpaddr },
4304     [CSR_PMPADDR13]  = { "pmpaddr13", pmp, read_pmpaddr, write_pmpaddr },
4305     [CSR_PMPADDR14] =  { "pmpaddr14", pmp, read_pmpaddr, write_pmpaddr },
4306     [CSR_PMPADDR15] =  { "pmpaddr15", pmp, read_pmpaddr, write_pmpaddr },
4307 
4308     /* Debug CSRs */
4309     [CSR_TSELECT]   =  { "tselect", debug, read_tselect, write_tselect },
4310     [CSR_TDATA1]    =  { "tdata1",  debug, read_tdata,   write_tdata   },
4311     [CSR_TDATA2]    =  { "tdata2",  debug, read_tdata,   write_tdata   },
4312     [CSR_TDATA3]    =  { "tdata3",  debug, read_tdata,   write_tdata   },
4313     [CSR_TINFO]     =  { "tinfo",   debug, read_tinfo,   write_ignore  },
4314 
4315     /* User Pointer Masking */
4316     [CSR_UMTE]    =    { "umte",    pointer_masking, read_umte,  write_umte },
4317     [CSR_UPMMASK] =    { "upmmask", pointer_masking, read_upmmask,
4318                          write_upmmask                                      },
4319     [CSR_UPMBASE] =    { "upmbase", pointer_masking, read_upmbase,
4320                          write_upmbase                                      },
4321     /* Machine Pointer Masking */
4322     [CSR_MMTE]    =    { "mmte",    pointer_masking, read_mmte,  write_mmte },
4323     [CSR_MPMMASK] =    { "mpmmask", pointer_masking, read_mpmmask,
4324                          write_mpmmask                                      },
4325     [CSR_MPMBASE] =    { "mpmbase", pointer_masking, read_mpmbase,
4326                          write_mpmbase                                      },
4327     /* Supervisor Pointer Masking */
4328     [CSR_SMTE]    =    { "smte",    pointer_masking, read_smte,  write_smte },
4329     [CSR_SPMMASK] =    { "spmmask", pointer_masking, read_spmmask,
4330                          write_spmmask                                      },
4331     [CSR_SPMBASE] =    { "spmbase", pointer_masking, read_spmbase,
4332                          write_spmbase                                      },
4333 
4334     /* Performance Counters */
4335     [CSR_HPMCOUNTER3]    = { "hpmcounter3",    ctr,    read_hpmcounter },
4336     [CSR_HPMCOUNTER4]    = { "hpmcounter4",    ctr,    read_hpmcounter },
4337     [CSR_HPMCOUNTER5]    = { "hpmcounter5",    ctr,    read_hpmcounter },
4338     [CSR_HPMCOUNTER6]    = { "hpmcounter6",    ctr,    read_hpmcounter },
4339     [CSR_HPMCOUNTER7]    = { "hpmcounter7",    ctr,    read_hpmcounter },
4340     [CSR_HPMCOUNTER8]    = { "hpmcounter8",    ctr,    read_hpmcounter },
4341     [CSR_HPMCOUNTER9]    = { "hpmcounter9",    ctr,    read_hpmcounter },
4342     [CSR_HPMCOUNTER10]   = { "hpmcounter10",   ctr,    read_hpmcounter },
4343     [CSR_HPMCOUNTER11]   = { "hpmcounter11",   ctr,    read_hpmcounter },
4344     [CSR_HPMCOUNTER12]   = { "hpmcounter12",   ctr,    read_hpmcounter },
4345     [CSR_HPMCOUNTER13]   = { "hpmcounter13",   ctr,    read_hpmcounter },
4346     [CSR_HPMCOUNTER14]   = { "hpmcounter14",   ctr,    read_hpmcounter },
4347     [CSR_HPMCOUNTER15]   = { "hpmcounter15",   ctr,    read_hpmcounter },
4348     [CSR_HPMCOUNTER16]   = { "hpmcounter16",   ctr,    read_hpmcounter },
4349     [CSR_HPMCOUNTER17]   = { "hpmcounter17",   ctr,    read_hpmcounter },
4350     [CSR_HPMCOUNTER18]   = { "hpmcounter18",   ctr,    read_hpmcounter },
4351     [CSR_HPMCOUNTER19]   = { "hpmcounter19",   ctr,    read_hpmcounter },
4352     [CSR_HPMCOUNTER20]   = { "hpmcounter20",   ctr,    read_hpmcounter },
4353     [CSR_HPMCOUNTER21]   = { "hpmcounter21",   ctr,    read_hpmcounter },
4354     [CSR_HPMCOUNTER22]   = { "hpmcounter22",   ctr,    read_hpmcounter },
4355     [CSR_HPMCOUNTER23]   = { "hpmcounter23",   ctr,    read_hpmcounter },
4356     [CSR_HPMCOUNTER24]   = { "hpmcounter24",   ctr,    read_hpmcounter },
4357     [CSR_HPMCOUNTER25]   = { "hpmcounter25",   ctr,    read_hpmcounter },
4358     [CSR_HPMCOUNTER26]   = { "hpmcounter26",   ctr,    read_hpmcounter },
4359     [CSR_HPMCOUNTER27]   = { "hpmcounter27",   ctr,    read_hpmcounter },
4360     [CSR_HPMCOUNTER28]   = { "hpmcounter28",   ctr,    read_hpmcounter },
4361     [CSR_HPMCOUNTER29]   = { "hpmcounter29",   ctr,    read_hpmcounter },
4362     [CSR_HPMCOUNTER30]   = { "hpmcounter30",   ctr,    read_hpmcounter },
4363     [CSR_HPMCOUNTER31]   = { "hpmcounter31",   ctr,    read_hpmcounter },
4364 
4365     [CSR_MHPMCOUNTER3]   = { "mhpmcounter3",   mctr,    read_hpmcounter,
4366                              write_mhpmcounter                         },
4367     [CSR_MHPMCOUNTER4]   = { "mhpmcounter4",   mctr,    read_hpmcounter,
4368                              write_mhpmcounter                         },
4369     [CSR_MHPMCOUNTER5]   = { "mhpmcounter5",   mctr,    read_hpmcounter,
4370                              write_mhpmcounter                         },
4371     [CSR_MHPMCOUNTER6]   = { "mhpmcounter6",   mctr,    read_hpmcounter,
4372                              write_mhpmcounter                         },
4373     [CSR_MHPMCOUNTER7]   = { "mhpmcounter7",   mctr,    read_hpmcounter,
4374                              write_mhpmcounter                         },
4375     [CSR_MHPMCOUNTER8]   = { "mhpmcounter8",   mctr,    read_hpmcounter,
4376                              write_mhpmcounter                         },
4377     [CSR_MHPMCOUNTER9]   = { "mhpmcounter9",   mctr,    read_hpmcounter,
4378                              write_mhpmcounter                         },
4379     [CSR_MHPMCOUNTER10]  = { "mhpmcounter10",  mctr,    read_hpmcounter,
4380                              write_mhpmcounter                         },
4381     [CSR_MHPMCOUNTER11]  = { "mhpmcounter11",  mctr,    read_hpmcounter,
4382                              write_mhpmcounter                         },
4383     [CSR_MHPMCOUNTER12]  = { "mhpmcounter12",  mctr,    read_hpmcounter,
4384                              write_mhpmcounter                         },
4385     [CSR_MHPMCOUNTER13]  = { "mhpmcounter13",  mctr,    read_hpmcounter,
4386                              write_mhpmcounter                         },
4387     [CSR_MHPMCOUNTER14]  = { "mhpmcounter14",  mctr,    read_hpmcounter,
4388                              write_mhpmcounter                         },
4389     [CSR_MHPMCOUNTER15]  = { "mhpmcounter15",  mctr,    read_hpmcounter,
4390                              write_mhpmcounter                         },
4391     [CSR_MHPMCOUNTER16]  = { "mhpmcounter16",  mctr,    read_hpmcounter,
4392                              write_mhpmcounter                         },
4393     [CSR_MHPMCOUNTER17]  = { "mhpmcounter17",  mctr,    read_hpmcounter,
4394                              write_mhpmcounter                         },
4395     [CSR_MHPMCOUNTER18]  = { "mhpmcounter18",  mctr,    read_hpmcounter,
4396                              write_mhpmcounter                         },
4397     [CSR_MHPMCOUNTER19]  = { "mhpmcounter19",  mctr,    read_hpmcounter,
4398                              write_mhpmcounter                         },
4399     [CSR_MHPMCOUNTER20]  = { "mhpmcounter20",  mctr,    read_hpmcounter,
4400                              write_mhpmcounter                         },
4401     [CSR_MHPMCOUNTER21]  = { "mhpmcounter21",  mctr,    read_hpmcounter,
4402                              write_mhpmcounter                         },
4403     [CSR_MHPMCOUNTER22]  = { "mhpmcounter22",  mctr,    read_hpmcounter,
4404                              write_mhpmcounter                         },
4405     [CSR_MHPMCOUNTER23]  = { "mhpmcounter23",  mctr,    read_hpmcounter,
4406                              write_mhpmcounter                         },
4407     [CSR_MHPMCOUNTER24]  = { "mhpmcounter24",  mctr,    read_hpmcounter,
4408                              write_mhpmcounter                         },
4409     [CSR_MHPMCOUNTER25]  = { "mhpmcounter25",  mctr,    read_hpmcounter,
4410                              write_mhpmcounter                         },
4411     [CSR_MHPMCOUNTER26]  = { "mhpmcounter26",  mctr,    read_hpmcounter,
4412                              write_mhpmcounter                         },
4413     [CSR_MHPMCOUNTER27]  = { "mhpmcounter27",  mctr,    read_hpmcounter,
4414                              write_mhpmcounter                         },
4415     [CSR_MHPMCOUNTER28]  = { "mhpmcounter28",  mctr,    read_hpmcounter,
4416                              write_mhpmcounter                         },
4417     [CSR_MHPMCOUNTER29]  = { "mhpmcounter29",  mctr,    read_hpmcounter,
4418                              write_mhpmcounter                         },
4419     [CSR_MHPMCOUNTER30]  = { "mhpmcounter30",  mctr,    read_hpmcounter,
4420                              write_mhpmcounter                         },
4421     [CSR_MHPMCOUNTER31]  = { "mhpmcounter31",  mctr,    read_hpmcounter,
4422                              write_mhpmcounter                         },
4423 
4424     [CSR_MCOUNTINHIBIT]  = { "mcountinhibit",  any, read_mcountinhibit,
4425                              write_mcountinhibit,
4426                              .min_priv_ver = PRIV_VERSION_1_11_0       },
4427 
4428     [CSR_MHPMEVENT3]     = { "mhpmevent3",     any,    read_mhpmevent,
4429                              write_mhpmevent                           },
4430     [CSR_MHPMEVENT4]     = { "mhpmevent4",     any,    read_mhpmevent,
4431                              write_mhpmevent                           },
4432     [CSR_MHPMEVENT5]     = { "mhpmevent5",     any,    read_mhpmevent,
4433                              write_mhpmevent                           },
4434     [CSR_MHPMEVENT6]     = { "mhpmevent6",     any,    read_mhpmevent,
4435                              write_mhpmevent                           },
4436     [CSR_MHPMEVENT7]     = { "mhpmevent7",     any,    read_mhpmevent,
4437                              write_mhpmevent                           },
4438     [CSR_MHPMEVENT8]     = { "mhpmevent8",     any,    read_mhpmevent,
4439                              write_mhpmevent                           },
4440     [CSR_MHPMEVENT9]     = { "mhpmevent9",     any,    read_mhpmevent,
4441                              write_mhpmevent                           },
4442     [CSR_MHPMEVENT10]    = { "mhpmevent10",    any,    read_mhpmevent,
4443                              write_mhpmevent                           },
4444     [CSR_MHPMEVENT11]    = { "mhpmevent11",    any,    read_mhpmevent,
4445                              write_mhpmevent                           },
4446     [CSR_MHPMEVENT12]    = { "mhpmevent12",    any,    read_mhpmevent,
4447                              write_mhpmevent                           },
4448     [CSR_MHPMEVENT13]    = { "mhpmevent13",    any,    read_mhpmevent,
4449                              write_mhpmevent                           },
4450     [CSR_MHPMEVENT14]    = { "mhpmevent14",    any,    read_mhpmevent,
4451                              write_mhpmevent                           },
4452     [CSR_MHPMEVENT15]    = { "mhpmevent15",    any,    read_mhpmevent,
4453                              write_mhpmevent                           },
4454     [CSR_MHPMEVENT16]    = { "mhpmevent16",    any,    read_mhpmevent,
4455                              write_mhpmevent                           },
4456     [CSR_MHPMEVENT17]    = { "mhpmevent17",    any,    read_mhpmevent,
4457                              write_mhpmevent                           },
4458     [CSR_MHPMEVENT18]    = { "mhpmevent18",    any,    read_mhpmevent,
4459                              write_mhpmevent                           },
4460     [CSR_MHPMEVENT19]    = { "mhpmevent19",    any,    read_mhpmevent,
4461                              write_mhpmevent                           },
4462     [CSR_MHPMEVENT20]    = { "mhpmevent20",    any,    read_mhpmevent,
4463                              write_mhpmevent                           },
4464     [CSR_MHPMEVENT21]    = { "mhpmevent21",    any,    read_mhpmevent,
4465                              write_mhpmevent                           },
4466     [CSR_MHPMEVENT22]    = { "mhpmevent22",    any,    read_mhpmevent,
4467                              write_mhpmevent                           },
4468     [CSR_MHPMEVENT23]    = { "mhpmevent23",    any,    read_mhpmevent,
4469                              write_mhpmevent                           },
4470     [CSR_MHPMEVENT24]    = { "mhpmevent24",    any,    read_mhpmevent,
4471                              write_mhpmevent                           },
4472     [CSR_MHPMEVENT25]    = { "mhpmevent25",    any,    read_mhpmevent,
4473                              write_mhpmevent                           },
4474     [CSR_MHPMEVENT26]    = { "mhpmevent26",    any,    read_mhpmevent,
4475                              write_mhpmevent                           },
4476     [CSR_MHPMEVENT27]    = { "mhpmevent27",    any,    read_mhpmevent,
4477                              write_mhpmevent                           },
4478     [CSR_MHPMEVENT28]    = { "mhpmevent28",    any,    read_mhpmevent,
4479                              write_mhpmevent                           },
4480     [CSR_MHPMEVENT29]    = { "mhpmevent29",    any,    read_mhpmevent,
4481                              write_mhpmevent                           },
4482     [CSR_MHPMEVENT30]    = { "mhpmevent30",    any,    read_mhpmevent,
4483                              write_mhpmevent                           },
4484     [CSR_MHPMEVENT31]    = { "mhpmevent31",    any,    read_mhpmevent,
4485                              write_mhpmevent                           },
4486 
4487     [CSR_MHPMEVENT3H]    = { "mhpmevent3h",    sscofpmf,  read_mhpmeventh,
4488                              write_mhpmeventh,
4489                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4490     [CSR_MHPMEVENT4H]    = { "mhpmevent4h",    sscofpmf,  read_mhpmeventh,
4491                              write_mhpmeventh,
4492                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4493     [CSR_MHPMEVENT5H]    = { "mhpmevent5h",    sscofpmf,  read_mhpmeventh,
4494                              write_mhpmeventh,
4495                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4496     [CSR_MHPMEVENT6H]    = { "mhpmevent6h",    sscofpmf,  read_mhpmeventh,
4497                              write_mhpmeventh,
4498                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4499     [CSR_MHPMEVENT7H]    = { "mhpmevent7h",    sscofpmf,  read_mhpmeventh,
4500                              write_mhpmeventh,
4501                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4502     [CSR_MHPMEVENT8H]    = { "mhpmevent8h",    sscofpmf,  read_mhpmeventh,
4503                              write_mhpmeventh,
4504                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4505     [CSR_MHPMEVENT9H]    = { "mhpmevent9h",    sscofpmf,  read_mhpmeventh,
4506                              write_mhpmeventh,
4507                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4508     [CSR_MHPMEVENT10H]   = { "mhpmevent10h",    sscofpmf,  read_mhpmeventh,
4509                              write_mhpmeventh,
4510                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4511     [CSR_MHPMEVENT11H]   = { "mhpmevent11h",    sscofpmf,  read_mhpmeventh,
4512                              write_mhpmeventh,
4513                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4514     [CSR_MHPMEVENT12H]   = { "mhpmevent12h",    sscofpmf,  read_mhpmeventh,
4515                              write_mhpmeventh,
4516                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4517     [CSR_MHPMEVENT13H]   = { "mhpmevent13h",    sscofpmf,  read_mhpmeventh,
4518                              write_mhpmeventh,
4519                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4520     [CSR_MHPMEVENT14H]   = { "mhpmevent14h",    sscofpmf,  read_mhpmeventh,
4521                              write_mhpmeventh,
4522                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4523     [CSR_MHPMEVENT15H]   = { "mhpmevent15h",    sscofpmf,  read_mhpmeventh,
4524                              write_mhpmeventh,
4525                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4526     [CSR_MHPMEVENT16H]   = { "mhpmevent16h",    sscofpmf,  read_mhpmeventh,
4527                              write_mhpmeventh,
4528                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4529     [CSR_MHPMEVENT17H]   = { "mhpmevent17h",    sscofpmf,  read_mhpmeventh,
4530                              write_mhpmeventh,
4531                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4532     [CSR_MHPMEVENT18H]   = { "mhpmevent18h",    sscofpmf,  read_mhpmeventh,
4533                              write_mhpmeventh,
4534                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4535     [CSR_MHPMEVENT19H]   = { "mhpmevent19h",    sscofpmf,  read_mhpmeventh,
4536                              write_mhpmeventh,
4537                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4538     [CSR_MHPMEVENT20H]   = { "mhpmevent20h",    sscofpmf,  read_mhpmeventh,
4539                              write_mhpmeventh,
4540                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4541     [CSR_MHPMEVENT21H]   = { "mhpmevent21h",    sscofpmf,  read_mhpmeventh,
4542                              write_mhpmeventh,
4543                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4544     [CSR_MHPMEVENT22H]   = { "mhpmevent22h",    sscofpmf,  read_mhpmeventh,
4545                              write_mhpmeventh,
4546                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4547     [CSR_MHPMEVENT23H]   = { "mhpmevent23h",    sscofpmf,  read_mhpmeventh,
4548                              write_mhpmeventh,
4549                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4550     [CSR_MHPMEVENT24H]   = { "mhpmevent24h",    sscofpmf,  read_mhpmeventh,
4551                              write_mhpmeventh,
4552                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4553     [CSR_MHPMEVENT25H]   = { "mhpmevent25h",    sscofpmf,  read_mhpmeventh,
4554                              write_mhpmeventh,
4555                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4556     [CSR_MHPMEVENT26H]   = { "mhpmevent26h",    sscofpmf,  read_mhpmeventh,
4557                              write_mhpmeventh,
4558                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4559     [CSR_MHPMEVENT27H]   = { "mhpmevent27h",    sscofpmf,  read_mhpmeventh,
4560                              write_mhpmeventh,
4561                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4562     [CSR_MHPMEVENT28H]   = { "mhpmevent28h",    sscofpmf,  read_mhpmeventh,
4563                              write_mhpmeventh,
4564                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4565     [CSR_MHPMEVENT29H]   = { "mhpmevent29h",    sscofpmf,  read_mhpmeventh,
4566                              write_mhpmeventh,
4567                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4568     [CSR_MHPMEVENT30H]   = { "mhpmevent30h",    sscofpmf,  read_mhpmeventh,
4569                              write_mhpmeventh,
4570                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4571     [CSR_MHPMEVENT31H]   = { "mhpmevent31h",    sscofpmf,  read_mhpmeventh,
4572                              write_mhpmeventh,
4573                              .min_priv_ver = PRIV_VERSION_1_12_0        },
4574 
4575     [CSR_HPMCOUNTER3H]   = { "hpmcounter3h",   ctr32,  read_hpmcounterh },
4576     [CSR_HPMCOUNTER4H]   = { "hpmcounter4h",   ctr32,  read_hpmcounterh },
4577     [CSR_HPMCOUNTER5H]   = { "hpmcounter5h",   ctr32,  read_hpmcounterh },
4578     [CSR_HPMCOUNTER6H]   = { "hpmcounter6h",   ctr32,  read_hpmcounterh },
4579     [CSR_HPMCOUNTER7H]   = { "hpmcounter7h",   ctr32,  read_hpmcounterh },
4580     [CSR_HPMCOUNTER8H]   = { "hpmcounter8h",   ctr32,  read_hpmcounterh },
4581     [CSR_HPMCOUNTER9H]   = { "hpmcounter9h",   ctr32,  read_hpmcounterh },
4582     [CSR_HPMCOUNTER10H]  = { "hpmcounter10h",  ctr32,  read_hpmcounterh },
4583     [CSR_HPMCOUNTER11H]  = { "hpmcounter11h",  ctr32,  read_hpmcounterh },
4584     [CSR_HPMCOUNTER12H]  = { "hpmcounter12h",  ctr32,  read_hpmcounterh },
4585     [CSR_HPMCOUNTER13H]  = { "hpmcounter13h",  ctr32,  read_hpmcounterh },
4586     [CSR_HPMCOUNTER14H]  = { "hpmcounter14h",  ctr32,  read_hpmcounterh },
4587     [CSR_HPMCOUNTER15H]  = { "hpmcounter15h",  ctr32,  read_hpmcounterh },
4588     [CSR_HPMCOUNTER16H]  = { "hpmcounter16h",  ctr32,  read_hpmcounterh },
4589     [CSR_HPMCOUNTER17H]  = { "hpmcounter17h",  ctr32,  read_hpmcounterh },
4590     [CSR_HPMCOUNTER18H]  = { "hpmcounter18h",  ctr32,  read_hpmcounterh },
4591     [CSR_HPMCOUNTER19H]  = { "hpmcounter19h",  ctr32,  read_hpmcounterh },
4592     [CSR_HPMCOUNTER20H]  = { "hpmcounter20h",  ctr32,  read_hpmcounterh },
4593     [CSR_HPMCOUNTER21H]  = { "hpmcounter21h",  ctr32,  read_hpmcounterh },
4594     [CSR_HPMCOUNTER22H]  = { "hpmcounter22h",  ctr32,  read_hpmcounterh },
4595     [CSR_HPMCOUNTER23H]  = { "hpmcounter23h",  ctr32,  read_hpmcounterh },
4596     [CSR_HPMCOUNTER24H]  = { "hpmcounter24h",  ctr32,  read_hpmcounterh },
4597     [CSR_HPMCOUNTER25H]  = { "hpmcounter25h",  ctr32,  read_hpmcounterh },
4598     [CSR_HPMCOUNTER26H]  = { "hpmcounter26h",  ctr32,  read_hpmcounterh },
4599     [CSR_HPMCOUNTER27H]  = { "hpmcounter27h",  ctr32,  read_hpmcounterh },
4600     [CSR_HPMCOUNTER28H]  = { "hpmcounter28h",  ctr32,  read_hpmcounterh },
4601     [CSR_HPMCOUNTER29H]  = { "hpmcounter29h",  ctr32,  read_hpmcounterh },
4602     [CSR_HPMCOUNTER30H]  = { "hpmcounter30h",  ctr32,  read_hpmcounterh },
4603     [CSR_HPMCOUNTER31H]  = { "hpmcounter31h",  ctr32,  read_hpmcounterh },
4604 
4605     [CSR_MHPMCOUNTER3H]  = { "mhpmcounter3h",  mctr32,  read_hpmcounterh,
4606                              write_mhpmcounterh                         },
4607     [CSR_MHPMCOUNTER4H]  = { "mhpmcounter4h",  mctr32,  read_hpmcounterh,
4608                              write_mhpmcounterh                         },
4609     [CSR_MHPMCOUNTER5H]  = { "mhpmcounter5h",  mctr32,  read_hpmcounterh,
4610                              write_mhpmcounterh                         },
4611     [CSR_MHPMCOUNTER6H]  = { "mhpmcounter6h",  mctr32,  read_hpmcounterh,
4612                              write_mhpmcounterh                         },
4613     [CSR_MHPMCOUNTER7H]  = { "mhpmcounter7h",  mctr32,  read_hpmcounterh,
4614                              write_mhpmcounterh                         },
4615     [CSR_MHPMCOUNTER8H]  = { "mhpmcounter8h",  mctr32,  read_hpmcounterh,
4616                              write_mhpmcounterh                         },
4617     [CSR_MHPMCOUNTER9H]  = { "mhpmcounter9h",  mctr32,  read_hpmcounterh,
4618                              write_mhpmcounterh                         },
4619     [CSR_MHPMCOUNTER10H] = { "mhpmcounter10h", mctr32,  read_hpmcounterh,
4620                              write_mhpmcounterh                         },
4621     [CSR_MHPMCOUNTER11H] = { "mhpmcounter11h", mctr32,  read_hpmcounterh,
4622                              write_mhpmcounterh                         },
4623     [CSR_MHPMCOUNTER12H] = { "mhpmcounter12h", mctr32,  read_hpmcounterh,
4624                              write_mhpmcounterh                         },
4625     [CSR_MHPMCOUNTER13H] = { "mhpmcounter13h", mctr32,  read_hpmcounterh,
4626                              write_mhpmcounterh                         },
4627     [CSR_MHPMCOUNTER14H] = { "mhpmcounter14h", mctr32,  read_hpmcounterh,
4628                              write_mhpmcounterh                         },
4629     [CSR_MHPMCOUNTER15H] = { "mhpmcounter15h", mctr32,  read_hpmcounterh,
4630                              write_mhpmcounterh                         },
4631     [CSR_MHPMCOUNTER16H] = { "mhpmcounter16h", mctr32,  read_hpmcounterh,
4632                              write_mhpmcounterh                         },
4633     [CSR_MHPMCOUNTER17H] = { "mhpmcounter17h", mctr32,  read_hpmcounterh,
4634                              write_mhpmcounterh                         },
4635     [CSR_MHPMCOUNTER18H] = { "mhpmcounter18h", mctr32,  read_hpmcounterh,
4636                              write_mhpmcounterh                         },
4637     [CSR_MHPMCOUNTER19H] = { "mhpmcounter19h", mctr32,  read_hpmcounterh,
4638                              write_mhpmcounterh                         },
4639     [CSR_MHPMCOUNTER20H] = { "mhpmcounter20h", mctr32,  read_hpmcounterh,
4640                              write_mhpmcounterh                         },
4641     [CSR_MHPMCOUNTER21H] = { "mhpmcounter21h", mctr32,  read_hpmcounterh,
4642                              write_mhpmcounterh                         },
4643     [CSR_MHPMCOUNTER22H] = { "mhpmcounter22h", mctr32,  read_hpmcounterh,
4644                              write_mhpmcounterh                         },
4645     [CSR_MHPMCOUNTER23H] = { "mhpmcounter23h", mctr32,  read_hpmcounterh,
4646                              write_mhpmcounterh                         },
4647     [CSR_MHPMCOUNTER24H] = { "mhpmcounter24h", mctr32,  read_hpmcounterh,
4648                              write_mhpmcounterh                         },
4649     [CSR_MHPMCOUNTER25H] = { "mhpmcounter25h", mctr32,  read_hpmcounterh,
4650                              write_mhpmcounterh                         },
4651     [CSR_MHPMCOUNTER26H] = { "mhpmcounter26h", mctr32,  read_hpmcounterh,
4652                              write_mhpmcounterh                         },
4653     [CSR_MHPMCOUNTER27H] = { "mhpmcounter27h", mctr32,  read_hpmcounterh,
4654                              write_mhpmcounterh                         },
4655     [CSR_MHPMCOUNTER28H] = { "mhpmcounter28h", mctr32,  read_hpmcounterh,
4656                              write_mhpmcounterh                         },
4657     [CSR_MHPMCOUNTER29H] = { "mhpmcounter29h", mctr32,  read_hpmcounterh,
4658                              write_mhpmcounterh                         },
4659     [CSR_MHPMCOUNTER30H] = { "mhpmcounter30h", mctr32,  read_hpmcounterh,
4660                              write_mhpmcounterh                         },
4661     [CSR_MHPMCOUNTER31H] = { "mhpmcounter31h", mctr32,  read_hpmcounterh,
4662                              write_mhpmcounterh                         },
4663     [CSR_SCOUNTOVF]      = { "scountovf", sscofpmf,  read_scountovf,
4664                              .min_priv_ver = PRIV_VERSION_1_12_0 },
4665 
4666 #endif /* !CONFIG_USER_ONLY */
4667 };
4668