Deleted Added
sdiff udiff text old ( 12499:b81688796004 ) new ( 12502:ba8a94a77482 )
full compact
1/*
2 * Copyright (c) 2010-2013, 2015-2017 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * Authors: Gabe Black
38 * Ali Saidi
39 * Giacomo Gabrielli
40 */
41
42#include "arch/arm/miscregs.hh"
43
44#include <tuple>
45
46#include "arch/arm/isa.hh"
47#include "base/logging.hh"
48#include "cpu/thread_context.hh"
49#include "sim/full_system.hh"
50
51namespace ArmISA
52{
53
54MiscRegIndex
55decodeCP14Reg(unsigned crn, unsigned opc1, unsigned crm, unsigned opc2)
56{
57 switch(crn) {
58 case 0:
59 switch (opc1) {
60 case 0:
61 switch (opc2) {
62 case 0:
63 switch (crm) {
64 case 0:
65 return MISCREG_DBGDIDR;
66 case 1:
67 return MISCREG_DBGDSCRint;
68 }
69 break;
70 }
71 break;
72 case 7:
73 switch (opc2) {
74 case 0:
75 switch (crm) {
76 case 0:
77 return MISCREG_JIDR;
78 }
79 break;
80 }
81 break;
82 }
83 break;
84 case 1:
85 switch (opc1) {
86 case 6:
87 switch (crm) {
88 case 0:
89 switch (opc2) {
90 case 0:
91 return MISCREG_TEEHBR;
92 }
93 break;
94 }
95 break;
96 case 7:
97 switch (crm) {
98 case 0:
99 switch (opc2) {
100 case 0:
101 return MISCREG_JOSCR;
102 }
103 break;
104 }
105 break;
106 }
107 break;
108 case 2:
109 switch (opc1) {
110 case 7:
111 switch (crm) {
112 case 0:
113 switch (opc2) {
114 case 0:
115 return MISCREG_JMCR;
116 }
117 break;
118 }
119 break;
120 }
121 break;
122 }
123 // If we get here then it must be a register that we haven't implemented
124 warn("CP14 unimplemented crn[%d], opc1[%d], crm[%d], opc2[%d]",
125 crn, opc1, crm, opc2);
126 return MISCREG_CP14_UNIMPL;
127}
128
129using namespace std;
130
131MiscRegIndex
132decodeCP15Reg(unsigned crn, unsigned opc1, unsigned crm, unsigned opc2)
133{
134 switch (crn) {
135 case 0:
136 switch (opc1) {
137 case 0:
138 switch (crm) {
139 case 0:
140 switch (opc2) {
141 case 1:
142 return MISCREG_CTR;
143 case 2:
144 return MISCREG_TCMTR;
145 case 3:
146 return MISCREG_TLBTR;
147 case 5:
148 return MISCREG_MPIDR;
149 case 6:
150 return MISCREG_REVIDR;
151 default:
152 return MISCREG_MIDR;
153 }
154 break;
155 case 1:
156 switch (opc2) {
157 case 0:
158 return MISCREG_ID_PFR0;
159 case 1:
160 return MISCREG_ID_PFR1;
161 case 2:
162 return MISCREG_ID_DFR0;
163 case 3:
164 return MISCREG_ID_AFR0;
165 case 4:
166 return MISCREG_ID_MMFR0;
167 case 5:
168 return MISCREG_ID_MMFR1;
169 case 6:
170 return MISCREG_ID_MMFR2;
171 case 7:
172 return MISCREG_ID_MMFR3;
173 }
174 break;
175 case 2:
176 switch (opc2) {
177 case 0:
178 return MISCREG_ID_ISAR0;
179 case 1:
180 return MISCREG_ID_ISAR1;
181 case 2:
182 return MISCREG_ID_ISAR2;
183 case 3:
184 return MISCREG_ID_ISAR3;
185 case 4:
186 return MISCREG_ID_ISAR4;
187 case 5:
188 return MISCREG_ID_ISAR5;
189 case 6:
190 case 7:
191 return MISCREG_RAZ; // read as zero
192 }
193 break;
194 default:
195 return MISCREG_RAZ; // read as zero
196 }
197 break;
198 case 1:
199 if (crm == 0) {
200 switch (opc2) {
201 case 0:
202 return MISCREG_CCSIDR;
203 case 1:
204 return MISCREG_CLIDR;
205 case 7:
206 return MISCREG_AIDR;
207 }
208 }
209 break;
210 case 2:
211 if (crm == 0 && opc2 == 0) {
212 return MISCREG_CSSELR;
213 }
214 break;
215 case 4:
216 if (crm == 0) {
217 if (opc2 == 0)
218 return MISCREG_VPIDR;
219 else if (opc2 == 5)
220 return MISCREG_VMPIDR;
221 }
222 break;
223 }
224 break;
225 case 1:
226 if (opc1 == 0) {
227 if (crm == 0) {
228 switch (opc2) {
229 case 0:
230 return MISCREG_SCTLR;
231 case 1:
232 return MISCREG_ACTLR;
233 case 0x2:
234 return MISCREG_CPACR;
235 }
236 } else if (crm == 1) {
237 switch (opc2) {
238 case 0:
239 return MISCREG_SCR;
240 case 1:
241 return MISCREG_SDER;
242 case 2:
243 return MISCREG_NSACR;
244 }
245 }
246 } else if (opc1 == 4) {
247 if (crm == 0) {
248 if (opc2 == 0)
249 return MISCREG_HSCTLR;
250 else if (opc2 == 1)
251 return MISCREG_HACTLR;
252 } else if (crm == 1) {
253 switch (opc2) {
254 case 0:
255 return MISCREG_HCR;
256 case 1:
257 return MISCREG_HDCR;
258 case 2:
259 return MISCREG_HCPTR;
260 case 3:
261 return MISCREG_HSTR;
262 case 7:
263 return MISCREG_HACR;
264 }
265 }
266 }
267 break;
268 case 2:
269 if (opc1 == 0 && crm == 0) {
270 switch (opc2) {
271 case 0:
272 return MISCREG_TTBR0;
273 case 1:
274 return MISCREG_TTBR1;
275 case 2:
276 return MISCREG_TTBCR;
277 }
278 } else if (opc1 == 4) {
279 if (crm == 0 && opc2 == 2)
280 return MISCREG_HTCR;
281 else if (crm == 1 && opc2 == 2)
282 return MISCREG_VTCR;
283 }
284 break;
285 case 3:
286 if (opc1 == 0 && crm == 0 && opc2 == 0) {
287 return MISCREG_DACR;
288 }
289 break;
290 case 5:
291 if (opc1 == 0) {
292 if (crm == 0) {
293 if (opc2 == 0) {
294 return MISCREG_DFSR;
295 } else if (opc2 == 1) {
296 return MISCREG_IFSR;
297 }
298 } else if (crm == 1) {
299 if (opc2 == 0) {
300 return MISCREG_ADFSR;
301 } else if (opc2 == 1) {
302 return MISCREG_AIFSR;
303 }
304 }
305 } else if (opc1 == 4) {
306 if (crm == 1) {
307 if (opc2 == 0)
308 return MISCREG_HADFSR;
309 else if (opc2 == 1)
310 return MISCREG_HAIFSR;
311 } else if (crm == 2 && opc2 == 0) {
312 return MISCREG_HSR;
313 }
314 }
315 break;
316 case 6:
317 if (opc1 == 0 && crm == 0) {
318 switch (opc2) {
319 case 0:
320 return MISCREG_DFAR;
321 case 2:
322 return MISCREG_IFAR;
323 }
324 } else if (opc1 == 4 && crm == 0) {
325 switch (opc2) {
326 case 0:
327 return MISCREG_HDFAR;
328 case 2:
329 return MISCREG_HIFAR;
330 case 4:
331 return MISCREG_HPFAR;
332 }
333 }
334 break;
335 case 7:
336 if (opc1 == 0) {
337 switch (crm) {
338 case 0:
339 if (opc2 == 4) {
340 return MISCREG_NOP;
341 }
342 break;
343 case 1:
344 switch (opc2) {
345 case 0:
346 return MISCREG_ICIALLUIS;
347 case 6:
348 return MISCREG_BPIALLIS;
349 }
350 break;
351 case 4:
352 if (opc2 == 0) {
353 return MISCREG_PAR;
354 }
355 break;
356 case 5:
357 switch (opc2) {
358 case 0:
359 return MISCREG_ICIALLU;
360 case 1:
361 return MISCREG_ICIMVAU;
362 case 4:
363 return MISCREG_CP15ISB;
364 case 6:
365 return MISCREG_BPIALL;
366 case 7:
367 return MISCREG_BPIMVA;
368 }
369 break;
370 case 6:
371 if (opc2 == 1) {
372 return MISCREG_DCIMVAC;
373 } else if (opc2 == 2) {
374 return MISCREG_DCISW;
375 }
376 break;
377 case 8:
378 switch (opc2) {
379 case 0:
380 return MISCREG_ATS1CPR;
381 case 1:
382 return MISCREG_ATS1CPW;
383 case 2:
384 return MISCREG_ATS1CUR;
385 case 3:
386 return MISCREG_ATS1CUW;
387 case 4:
388 return MISCREG_ATS12NSOPR;
389 case 5:
390 return MISCREG_ATS12NSOPW;
391 case 6:
392 return MISCREG_ATS12NSOUR;
393 case 7:
394 return MISCREG_ATS12NSOUW;
395 }
396 break;
397 case 10:
398 switch (opc2) {
399 case 1:
400 return MISCREG_DCCMVAC;
401 case 2:
402 return MISCREG_DCCSW;
403 case 4:
404 return MISCREG_CP15DSB;
405 case 5:
406 return MISCREG_CP15DMB;
407 }
408 break;
409 case 11:
410 if (opc2 == 1) {
411 return MISCREG_DCCMVAU;
412 }
413 break;
414 case 13:
415 if (opc2 == 1) {
416 return MISCREG_NOP;
417 }
418 break;
419 case 14:
420 if (opc2 == 1) {
421 return MISCREG_DCCIMVAC;
422 } else if (opc2 == 2) {
423 return MISCREG_DCCISW;
424 }
425 break;
426 }
427 } else if (opc1 == 4 && crm == 8) {
428 if (opc2 == 0)
429 return MISCREG_ATS1HR;
430 else if (opc2 == 1)
431 return MISCREG_ATS1HW;
432 }
433 break;
434 case 8:
435 if (opc1 == 0) {
436 switch (crm) {
437 case 3:
438 switch (opc2) {
439 case 0:
440 return MISCREG_TLBIALLIS;
441 case 1:
442 return MISCREG_TLBIMVAIS;
443 case 2:
444 return MISCREG_TLBIASIDIS;
445 case 3:
446 return MISCREG_TLBIMVAAIS;
447 }
448 break;
449 case 5:
450 switch (opc2) {
451 case 0:
452 return MISCREG_ITLBIALL;
453 case 1:
454 return MISCREG_ITLBIMVA;
455 case 2:
456 return MISCREG_ITLBIASID;
457 }
458 break;
459 case 6:
460 switch (opc2) {
461 case 0:
462 return MISCREG_DTLBIALL;
463 case 1:
464 return MISCREG_DTLBIMVA;
465 case 2:
466 return MISCREG_DTLBIASID;
467 }
468 break;
469 case 7:
470 switch (opc2) {
471 case 0:
472 return MISCREG_TLBIALL;
473 case 1:
474 return MISCREG_TLBIMVA;
475 case 2:
476 return MISCREG_TLBIASID;
477 case 3:
478 return MISCREG_TLBIMVAA;
479 }
480 break;
481 }
482 } else if (opc1 == 4) {
483 if (crm == 3) {
484 switch (opc2) {
485 case 0:
486 return MISCREG_TLBIALLHIS;
487 case 1:
488 return MISCREG_TLBIMVAHIS;
489 case 4:
490 return MISCREG_TLBIALLNSNHIS;
491 }
492 } else if (crm == 7) {
493 switch (opc2) {
494 case 0:
495 return MISCREG_TLBIALLH;
496 case 1:
497 return MISCREG_TLBIMVAH;
498 case 4:
499 return MISCREG_TLBIALLNSNH;
500 }
501 }
502 }
503 break;
504 case 9:
505 if (opc1 == 0) {
506 switch (crm) {
507 case 12:
508 switch (opc2) {
509 case 0:
510 return MISCREG_PMCR;
511 case 1:
512 return MISCREG_PMCNTENSET;
513 case 2:
514 return MISCREG_PMCNTENCLR;
515 case 3:
516 return MISCREG_PMOVSR;
517 case 4:
518 return MISCREG_PMSWINC;
519 case 5:
520 return MISCREG_PMSELR;
521 case 6:
522 return MISCREG_PMCEID0;
523 case 7:
524 return MISCREG_PMCEID1;
525 }
526 break;
527 case 13:
528 switch (opc2) {
529 case 0:
530 return MISCREG_PMCCNTR;
531 case 1:
532 // Selector is PMSELR.SEL
533 return MISCREG_PMXEVTYPER_PMCCFILTR;
534 case 2:
535 return MISCREG_PMXEVCNTR;
536 }
537 break;
538 case 14:
539 switch (opc2) {
540 case 0:
541 return MISCREG_PMUSERENR;
542 case 1:
543 return MISCREG_PMINTENSET;
544 case 2:
545 return MISCREG_PMINTENCLR;
546 case 3:
547 return MISCREG_PMOVSSET;
548 }
549 break;
550 }
551 } else if (opc1 == 1) {
552 switch (crm) {
553 case 0:
554 switch (opc2) {
555 case 2: // L2CTLR, L2 Control Register
556 return MISCREG_L2CTLR;
557 case 3:
558 return MISCREG_L2ECTLR;
559 }
560 break;
561 break;
562 }
563 }
564 break;
565 case 10:
566 if (opc1 == 0) {
567 // crm 0, 1, 4, and 8, with op2 0 - 7, reserved for TLB lockdown
568 if (crm == 2) { // TEX Remap Registers
569 if (opc2 == 0) {
570 // Selector is TTBCR.EAE
571 return MISCREG_PRRR_MAIR0;
572 } else if (opc2 == 1) {
573 // Selector is TTBCR.EAE
574 return MISCREG_NMRR_MAIR1;
575 }
576 } else if (crm == 3) {
577 if (opc2 == 0) {
578 return MISCREG_AMAIR0;
579 } else if (opc2 == 1) {
580 return MISCREG_AMAIR1;
581 }
582 }
583 } else if (opc1 == 4) {
584 // crm 0, 1, 4, and 8, with op2 0 - 7, reserved for TLB lockdown
585 if (crm == 2) {
586 if (opc2 == 0)
587 return MISCREG_HMAIR0;
588 else if (opc2 == 1)
589 return MISCREG_HMAIR1;
590 } else if (crm == 3) {
591 if (opc2 == 0)
592 return MISCREG_HAMAIR0;
593 else if (opc2 == 1)
594 return MISCREG_HAMAIR1;
595 }
596 }
597 break;
598 case 11:
599 if (opc1 <=7) {
600 switch (crm) {
601 case 0:
602 case 1:
603 case 2:
604 case 3:
605 case 4:
606 case 5:
607 case 6:
608 case 7:
609 case 8:
610 case 15:
611 // Reserved for DMA operations for TCM access
612 break;
613 }
614 }
615 break;
616 case 12:
617 if (opc1 == 0) {
618 if (crm == 0) {
619 if (opc2 == 0) {
620 return MISCREG_VBAR;
621 } else if (opc2 == 1) {
622 return MISCREG_MVBAR;
623 }
624 } else if (crm == 1) {
625 if (opc2 == 0) {
626 return MISCREG_ISR;
627 }
628 }
629 } else if (opc1 == 4) {
630 if (crm == 0 && opc2 == 0)
631 return MISCREG_HVBAR;
632 }
633 break;
634 case 13:
635 if (opc1 == 0) {
636 if (crm == 0) {
637 switch (opc2) {
638 case 0:
639 return MISCREG_FCSEIDR;
640 case 1:
641 return MISCREG_CONTEXTIDR;
642 case 2:
643 return MISCREG_TPIDRURW;
644 case 3:
645 return MISCREG_TPIDRURO;
646 case 4:
647 return MISCREG_TPIDRPRW;
648 }
649 }
650 } else if (opc1 == 4) {
651 if (crm == 0 && opc2 == 2)
652 return MISCREG_HTPIDR;
653 }
654 break;
655 case 14:
656 if (opc1 == 0) {
657 switch (crm) {
658 case 0:
659 if (opc2 == 0)
660 return MISCREG_CNTFRQ;
661 break;
662 case 1:
663 if (opc2 == 0)
664 return MISCREG_CNTKCTL;
665 break;
666 case 2:
667 if (opc2 == 0)
668 return MISCREG_CNTP_TVAL;
669 else if (opc2 == 1)
670 return MISCREG_CNTP_CTL;
671 break;
672 case 3:
673 if (opc2 == 0)
674 return MISCREG_CNTV_TVAL;
675 else if (opc2 == 1)
676 return MISCREG_CNTV_CTL;
677 break;
678 }
679 } else if (opc1 == 4) {
680 if (crm == 1 && opc2 == 0) {
681 return MISCREG_CNTHCTL;
682 } else if (crm == 2) {
683 if (opc2 == 0)
684 return MISCREG_CNTHP_TVAL;
685 else if (opc2 == 1)
686 return MISCREG_CNTHP_CTL;
687 }
688 }
689 break;
690 case 15:
691 // Implementation defined
692 return MISCREG_CP15_UNIMPL;
693 }
694 // Unrecognized register
695 return MISCREG_CP15_UNIMPL;
696}
697
698MiscRegIndex
699decodeCP15Reg64(unsigned crm, unsigned opc1)
700{
701 switch (crm) {
702 case 2:
703 switch (opc1) {
704 case 0:
705 return MISCREG_TTBR0;
706 case 1:
707 return MISCREG_TTBR1;
708 case 4:
709 return MISCREG_HTTBR;
710 case 6:
711 return MISCREG_VTTBR;
712 }
713 break;
714 case 7:
715 if (opc1 == 0)
716 return MISCREG_PAR;
717 break;
718 case 14:
719 switch (opc1) {
720 case 0:
721 return MISCREG_CNTPCT;
722 case 1:
723 return MISCREG_CNTVCT;
724 case 2:
725 return MISCREG_CNTP_CVAL;
726 case 3:
727 return MISCREG_CNTV_CVAL;
728 case 4:
729 return MISCREG_CNTVOFF;
730 case 6:
731 return MISCREG_CNTHP_CVAL;
732 }
733 break;
734 case 15:
735 if (opc1 == 0)
736 return MISCREG_CPUMERRSR;
737 else if (opc1 == 1)
738 return MISCREG_L2MERRSR;
739 break;
740 }
741 // Unrecognized register
742 return MISCREG_CP15_UNIMPL;
743}
744
745std::tuple<bool, bool>
746canReadCoprocReg(MiscRegIndex reg, SCR scr, CPSR cpsr)
747{
748 bool secure = !scr.ns;
749 bool canRead = false;
750 bool undefined = false;
751
752 switch (cpsr.mode) {
753 case MODE_USER:
754 canRead = secure ? miscRegInfo[reg][MISCREG_USR_S_RD] :
755 miscRegInfo[reg][MISCREG_USR_NS_RD];
756 break;
757 case MODE_FIQ:
758 case MODE_IRQ:
759 case MODE_SVC:
760 case MODE_ABORT:
761 case MODE_UNDEFINED:
762 case MODE_SYSTEM:
763 canRead = secure ? miscRegInfo[reg][MISCREG_PRI_S_RD] :
764 miscRegInfo[reg][MISCREG_PRI_NS_RD];
765 break;
766 case MODE_MON:
767 canRead = secure ? miscRegInfo[reg][MISCREG_MON_NS0_RD] :
768 miscRegInfo[reg][MISCREG_MON_NS1_RD];
769 break;
770 case MODE_HYP:
771 canRead = miscRegInfo[reg][MISCREG_HYP_RD];
772 break;
773 default:
774 undefined = true;
775 }
776 // can't do permissions checkes on the root of a banked pair of regs
777 assert(!miscRegInfo[reg][MISCREG_BANKED]);
778 return std::make_tuple(canRead, undefined);
779}
780
781std::tuple<bool, bool>
782canWriteCoprocReg(MiscRegIndex reg, SCR scr, CPSR cpsr)
783{
784 bool secure = !scr.ns;
785 bool canWrite = false;
786 bool undefined = false;
787
788 switch (cpsr.mode) {
789 case MODE_USER:
790 canWrite = secure ? miscRegInfo[reg][MISCREG_USR_S_WR] :
791 miscRegInfo[reg][MISCREG_USR_NS_WR];
792 break;
793 case MODE_FIQ:
794 case MODE_IRQ:
795 case MODE_SVC:
796 case MODE_ABORT:
797 case MODE_UNDEFINED:
798 case MODE_SYSTEM:
799 canWrite = secure ? miscRegInfo[reg][MISCREG_PRI_S_WR] :
800 miscRegInfo[reg][MISCREG_PRI_NS_WR];
801 break;
802 case MODE_MON:
803 canWrite = secure ? miscRegInfo[reg][MISCREG_MON_NS0_WR] :
804 miscRegInfo[reg][MISCREG_MON_NS1_WR];
805 break;
806 case MODE_HYP:
807 canWrite = miscRegInfo[reg][MISCREG_HYP_WR];
808 break;
809 default:
810 undefined = true;
811 }
812 // can't do permissions checkes on the root of a banked pair of regs
813 assert(!miscRegInfo[reg][MISCREG_BANKED]);
814 return std::make_tuple(canWrite, undefined);
815}
816
817int
818snsBankedIndex(MiscRegIndex reg, ThreadContext *tc)
819{
820 SCR scr = tc->readMiscReg(MISCREG_SCR);
821 return snsBankedIndex(reg, tc, scr.ns);
822}
823
824int
825snsBankedIndex(MiscRegIndex reg, ThreadContext *tc, bool ns)
826{
827 int reg_as_int = static_cast<int>(reg);
828 if (miscRegInfo[reg][MISCREG_BANKED]) {
829 reg_as_int += (ArmSystem::haveSecurity(tc) &&
830 !ArmSystem::highestELIs64(tc) && !ns) ? 2 : 1;
831 }
832 return reg_as_int;
833}
834
835
836/**
837 * If the reg is a child reg of a banked set, then the parent is the last
838 * banked one in the list. This is messy, and the wish is to eventually have
839 * the bitmap replaced with a better data structure. the preUnflatten function
840 * initializes a lookup table to speed up the search for these banked
841 * registers.
842 */
843
844int unflattenResultMiscReg[NUM_MISCREGS];
845
846void
847preUnflattenMiscReg()
848{
849 int reg = -1;
850 for (int i = 0 ; i < NUM_MISCREGS; i++){
851 if (miscRegInfo[i][MISCREG_BANKED])
852 reg = i;
853 if (miscRegInfo[i][MISCREG_BANKED_CHILD])
854 unflattenResultMiscReg[i] = reg;
855 else
856 unflattenResultMiscReg[i] = i;
857 // if this assert fails, no parent was found, and something is broken
858 assert(unflattenResultMiscReg[i] > -1);
859 }
860}
861
862int
863unflattenMiscReg(int reg)
864{
865 return unflattenResultMiscReg[reg];
866}
867
868bool
869canReadAArch64SysReg(MiscRegIndex reg, SCR scr, CPSR cpsr, ThreadContext *tc)
870{
871 // Check for SP_EL0 access while SPSEL == 0
872 if ((reg == MISCREG_SP_EL0) && (tc->readMiscReg(MISCREG_SPSEL) == 0))
873 return false;
874
875 // Check for RVBAR access
876 if (reg == MISCREG_RVBAR_EL1) {
877 ExceptionLevel highest_el = ArmSystem::highestEL(tc);
878 if (highest_el == EL2 || highest_el == EL3)
879 return false;
880 }
881 if (reg == MISCREG_RVBAR_EL2) {
882 ExceptionLevel highest_el = ArmSystem::highestEL(tc);
883 if (highest_el == EL3)
884 return false;
885 }
886
887 bool secure = ArmSystem::haveSecurity(tc) && !scr.ns;
888
889 switch (opModeToEL((OperatingMode) (uint8_t) cpsr.mode)) {
890 case EL0:
891 return secure ? miscRegInfo[reg][MISCREG_USR_S_RD] :
892 miscRegInfo[reg][MISCREG_USR_NS_RD];
893 case EL1:
894 return secure ? miscRegInfo[reg][MISCREG_PRI_S_RD] :
895 miscRegInfo[reg][MISCREG_PRI_NS_RD];
896 case EL2:
897 return miscRegInfo[reg][MISCREG_HYP_RD];
898 case EL3:
899 return secure ? miscRegInfo[reg][MISCREG_MON_NS0_RD] :
900 miscRegInfo[reg][MISCREG_MON_NS1_RD];
901 default:
902 panic("Invalid exception level");
903 }
904}
905
906bool
907canWriteAArch64SysReg(MiscRegIndex reg, SCR scr, CPSR cpsr, ThreadContext *tc)
908{
909 // Check for SP_EL0 access while SPSEL == 0
910 if ((reg == MISCREG_SP_EL0) && (tc->readMiscReg(MISCREG_SPSEL) == 0))
911 return false;
912 ExceptionLevel el = opModeToEL((OperatingMode) (uint8_t) cpsr.mode);
913 if (reg == MISCREG_DAIF) {
914 SCTLR sctlr = tc->readMiscReg(MISCREG_SCTLR_EL1);
915 if (el == EL0 && !sctlr.uma)
916 return false;
917 }
918 if (FullSystem && reg == MISCREG_DC_ZVA_Xt) {
919 // In syscall-emulation mode, this test is skipped and DCZVA is always
920 // allowed at EL0
921 SCTLR sctlr = tc->readMiscReg(MISCREG_SCTLR_EL1);
922 if (el == EL0 && !sctlr.dze)
923 return false;
924 }
925 if (reg == MISCREG_DC_CVAC_Xt || reg == MISCREG_DC_CIVAC_Xt ||
926 reg == MISCREG_DC_IVAC_Xt) {
927 SCTLR sctlr = tc->readMiscReg(MISCREG_SCTLR_EL1);
928 if (el == EL0 && !sctlr.uci)
929 return false;
930 }
931
932 bool secure = ArmSystem::haveSecurity(tc) && !scr.ns;
933
934 switch (el) {
935 case EL0:
936 return secure ? miscRegInfo[reg][MISCREG_USR_S_WR] :
937 miscRegInfo[reg][MISCREG_USR_NS_WR];
938 case EL1:
939 return secure ? miscRegInfo[reg][MISCREG_PRI_S_WR] :
940 miscRegInfo[reg][MISCREG_PRI_NS_WR];
941 case EL2:
942 return miscRegInfo[reg][MISCREG_HYP_WR];
943 case EL3:
944 return secure ? miscRegInfo[reg][MISCREG_MON_NS0_WR] :
945 miscRegInfo[reg][MISCREG_MON_NS1_WR];
946 default:
947 panic("Invalid exception level");
948 }
949}
950
951MiscRegIndex
952decodeAArch64SysReg(unsigned op0, unsigned op1,
953 unsigned crn, unsigned crm,
954 unsigned op2)
955{
956 switch (op0) {
957 case 1:
958 switch (crn) {
959 case 7:
960 switch (op1) {
961 case 0:
962 switch (crm) {
963 case 1:
964 switch (op2) {
965 case 0:
966 return MISCREG_IC_IALLUIS;
967 }
968 break;
969 case 5:
970 switch (op2) {
971 case 0:
972 return MISCREG_IC_IALLU;
973 }
974 break;
975 case 6:
976 switch (op2) {
977 case 1:
978 return MISCREG_DC_IVAC_Xt;
979 case 2:
980 return MISCREG_DC_ISW_Xt;
981 }
982 break;
983 case 8:
984 switch (op2) {
985 case 0:
986 return MISCREG_AT_S1E1R_Xt;
987 case 1:
988 return MISCREG_AT_S1E1W_Xt;
989 case 2:
990 return MISCREG_AT_S1E0R_Xt;
991 case 3:
992 return MISCREG_AT_S1E0W_Xt;
993 }
994 break;
995 case 10:
996 switch (op2) {
997 case 2:
998 return MISCREG_DC_CSW_Xt;
999 }
1000 break;
1001 case 14:
1002 switch (op2) {
1003 case 2:
1004 return MISCREG_DC_CISW_Xt;
1005 }
1006 break;
1007 }
1008 break;
1009 case 3:
1010 switch (crm) {
1011 case 4:
1012 switch (op2) {
1013 case 1:
1014 return MISCREG_DC_ZVA_Xt;
1015 }
1016 break;
1017 case 5:
1018 switch (op2) {
1019 case 1:
1020 return MISCREG_IC_IVAU_Xt;
1021 }
1022 break;
1023 case 10:
1024 switch (op2) {
1025 case 1:
1026 return MISCREG_DC_CVAC_Xt;
1027 }
1028 break;
1029 case 11:
1030 switch (op2) {
1031 case 1:
1032 return MISCREG_DC_CVAU_Xt;
1033 }
1034 break;
1035 case 14:
1036 switch (op2) {
1037 case 1:
1038 return MISCREG_DC_CIVAC_Xt;
1039 }
1040 break;
1041 }
1042 break;
1043 case 4:
1044 switch (crm) {
1045 case 8:
1046 switch (op2) {
1047 case 0:
1048 return MISCREG_AT_S1E2R_Xt;
1049 case 1:
1050 return MISCREG_AT_S1E2W_Xt;
1051 case 4:
1052 return MISCREG_AT_S12E1R_Xt;
1053 case 5:
1054 return MISCREG_AT_S12E1W_Xt;
1055 case 6:
1056 return MISCREG_AT_S12E0R_Xt;
1057 case 7:
1058 return MISCREG_AT_S12E0W_Xt;
1059 }
1060 break;
1061 }
1062 break;
1063 case 6:
1064 switch (crm) {
1065 case 8:
1066 switch (op2) {
1067 case 0:
1068 return MISCREG_AT_S1E3R_Xt;
1069 case 1:
1070 return MISCREG_AT_S1E3W_Xt;
1071 }
1072 break;
1073 }
1074 break;
1075 }
1076 break;
1077 case 8:
1078 switch (op1) {
1079 case 0:
1080 switch (crm) {
1081 case 3:
1082 switch (op2) {
1083 case 0:
1084 return MISCREG_TLBI_VMALLE1IS;
1085 case 1:
1086 return MISCREG_TLBI_VAE1IS_Xt;
1087 case 2:
1088 return MISCREG_TLBI_ASIDE1IS_Xt;
1089 case 3:
1090 return MISCREG_TLBI_VAAE1IS_Xt;
1091 case 5:
1092 return MISCREG_TLBI_VALE1IS_Xt;
1093 case 7:
1094 return MISCREG_TLBI_VAALE1IS_Xt;
1095 }
1096 break;
1097 case 7:
1098 switch (op2) {
1099 case 0:
1100 return MISCREG_TLBI_VMALLE1;
1101 case 1:
1102 return MISCREG_TLBI_VAE1_Xt;
1103 case 2:
1104 return MISCREG_TLBI_ASIDE1_Xt;
1105 case 3:
1106 return MISCREG_TLBI_VAAE1_Xt;
1107 case 5:
1108 return MISCREG_TLBI_VALE1_Xt;
1109 case 7:
1110 return MISCREG_TLBI_VAALE1_Xt;
1111 }
1112 break;
1113 }
1114 break;
1115 case 4:
1116 switch (crm) {
1117 case 0:
1118 switch (op2) {
1119 case 1:
1120 return MISCREG_TLBI_IPAS2E1IS_Xt;
1121 case 5:
1122 return MISCREG_TLBI_IPAS2LE1IS_Xt;
1123 }
1124 break;
1125 case 3:
1126 switch (op2) {
1127 case 0:
1128 return MISCREG_TLBI_ALLE2IS;
1129 case 1:
1130 return MISCREG_TLBI_VAE2IS_Xt;
1131 case 4:
1132 return MISCREG_TLBI_ALLE1IS;
1133 case 5:
1134 return MISCREG_TLBI_VALE2IS_Xt;
1135 case 6:
1136 return MISCREG_TLBI_VMALLS12E1IS;
1137 }
1138 break;
1139 case 4:
1140 switch (op2) {
1141 case 1:
1142 return MISCREG_TLBI_IPAS2E1_Xt;
1143 case 5:
1144 return MISCREG_TLBI_IPAS2LE1_Xt;
1145 }
1146 break;
1147 case 7:
1148 switch (op2) {
1149 case 0:
1150 return MISCREG_TLBI_ALLE2;
1151 case 1:
1152 return MISCREG_TLBI_VAE2_Xt;
1153 case 4:
1154 return MISCREG_TLBI_ALLE1;
1155 case 5:
1156 return MISCREG_TLBI_VALE2_Xt;
1157 case 6:
1158 return MISCREG_TLBI_VMALLS12E1;
1159 }
1160 break;
1161 }
1162 break;
1163 case 6:
1164 switch (crm) {
1165 case 3:
1166 switch (op2) {
1167 case 0:
1168 return MISCREG_TLBI_ALLE3IS;
1169 case 1:
1170 return MISCREG_TLBI_VAE3IS_Xt;
1171 case 5:
1172 return MISCREG_TLBI_VALE3IS_Xt;
1173 }
1174 break;
1175 case 7:
1176 switch (op2) {
1177 case 0:
1178 return MISCREG_TLBI_ALLE3;
1179 case 1:
1180 return MISCREG_TLBI_VAE3_Xt;
1181 case 5:
1182 return MISCREG_TLBI_VALE3_Xt;
1183 }
1184 break;
1185 }
1186 break;
1187 }
1188 break;
1189 }
1190 break;
1191 case 2:
1192 switch (crn) {
1193 case 0:
1194 switch (op1) {
1195 case 0:
1196 switch (crm) {
1197 case 0:
1198 switch (op2) {
1199 case 2:
1200 return MISCREG_OSDTRRX_EL1;
1201 case 4:
1202 return MISCREG_DBGBVR0_EL1;
1203 case 5:
1204 return MISCREG_DBGBCR0_EL1;
1205 case 6:
1206 return MISCREG_DBGWVR0_EL1;
1207 case 7:
1208 return MISCREG_DBGWCR0_EL1;
1209 }
1210 break;
1211 case 1:
1212 switch (op2) {
1213 case 4:
1214 return MISCREG_DBGBVR1_EL1;
1215 case 5:
1216 return MISCREG_DBGBCR1_EL1;
1217 case 6:
1218 return MISCREG_DBGWVR1_EL1;
1219 case 7:
1220 return MISCREG_DBGWCR1_EL1;
1221 }
1222 break;
1223 case 2:
1224 switch (op2) {
1225 case 0:
1226 return MISCREG_MDCCINT_EL1;
1227 case 2:
1228 return MISCREG_MDSCR_EL1;
1229 case 4:
1230 return MISCREG_DBGBVR2_EL1;
1231 case 5:
1232 return MISCREG_DBGBCR2_EL1;
1233 case 6:
1234 return MISCREG_DBGWVR2_EL1;
1235 case 7:
1236 return MISCREG_DBGWCR2_EL1;
1237 }
1238 break;
1239 case 3:
1240 switch (op2) {
1241 case 2:
1242 return MISCREG_OSDTRTX_EL1;
1243 case 4:
1244 return MISCREG_DBGBVR3_EL1;
1245 case 5:
1246 return MISCREG_DBGBCR3_EL1;
1247 case 6:
1248 return MISCREG_DBGWVR3_EL1;
1249 case 7:
1250 return MISCREG_DBGWCR3_EL1;
1251 }
1252 break;
1253 case 4:
1254 switch (op2) {
1255 case 4:
1256 return MISCREG_DBGBVR4_EL1;
1257 case 5:
1258 return MISCREG_DBGBCR4_EL1;
1259 }
1260 break;
1261 case 5:
1262 switch (op2) {
1263 case 4:
1264 return MISCREG_DBGBVR5_EL1;
1265 case 5:
1266 return MISCREG_DBGBCR5_EL1;
1267 }
1268 break;
1269 case 6:
1270 switch (op2) {
1271 case 2:
1272 return MISCREG_OSECCR_EL1;
1273 }
1274 break;
1275 }
1276 break;
1277 case 2:
1278 switch (crm) {
1279 case 0:
1280 switch (op2) {
1281 case 0:
1282 return MISCREG_TEECR32_EL1;
1283 }
1284 break;
1285 }
1286 break;
1287 case 3:
1288 switch (crm) {
1289 case 1:
1290 switch (op2) {
1291 case 0:
1292 return MISCREG_MDCCSR_EL0;
1293 }
1294 break;
1295 case 4:
1296 switch (op2) {
1297 case 0:
1298 return MISCREG_MDDTR_EL0;
1299 }
1300 break;
1301 case 5:
1302 switch (op2) {
1303 case 0:
1304 return MISCREG_MDDTRRX_EL0;
1305 }
1306 break;
1307 }
1308 break;
1309 case 4:
1310 switch (crm) {
1311 case 7:
1312 switch (op2) {
1313 case 0:
1314 return MISCREG_DBGVCR32_EL2;
1315 }
1316 break;
1317 }
1318 break;
1319 }
1320 break;
1321 case 1:
1322 switch (op1) {
1323 case 0:
1324 switch (crm) {
1325 case 0:
1326 switch (op2) {
1327 case 0:
1328 return MISCREG_MDRAR_EL1;
1329 case 4:
1330 return MISCREG_OSLAR_EL1;
1331 }
1332 break;
1333 case 1:
1334 switch (op2) {
1335 case 4:
1336 return MISCREG_OSLSR_EL1;
1337 }
1338 break;
1339 case 3:
1340 switch (op2) {
1341 case 4:
1342 return MISCREG_OSDLR_EL1;
1343 }
1344 break;
1345 case 4:
1346 switch (op2) {
1347 case 4:
1348 return MISCREG_DBGPRCR_EL1;
1349 }
1350 break;
1351 }
1352 break;
1353 case 2:
1354 switch (crm) {
1355 case 0:
1356 switch (op2) {
1357 case 0:
1358 return MISCREG_TEEHBR32_EL1;
1359 }
1360 break;
1361 }
1362 break;
1363 }
1364 break;
1365 case 7:
1366 switch (op1) {
1367 case 0:
1368 switch (crm) {
1369 case 8:
1370 switch (op2) {
1371 case 6:
1372 return MISCREG_DBGCLAIMSET_EL1;
1373 }
1374 break;
1375 case 9:
1376 switch (op2) {
1377 case 6:
1378 return MISCREG_DBGCLAIMCLR_EL1;
1379 }
1380 break;
1381 case 14:
1382 switch (op2) {
1383 case 6:
1384 return MISCREG_DBGAUTHSTATUS_EL1;
1385 }
1386 break;
1387 }
1388 break;
1389 }
1390 break;
1391 }
1392 break;
1393 case 3:
1394 switch (crn) {
1395 case 0:
1396 switch (op1) {
1397 case 0:
1398 switch (crm) {
1399 case 0:
1400 switch (op2) {
1401 case 0:
1402 return MISCREG_MIDR_EL1;
1403 case 5:
1404 return MISCREG_MPIDR_EL1;
1405 case 6:
1406 return MISCREG_REVIDR_EL1;
1407 }
1408 break;
1409 case 1:
1410 switch (op2) {
1411 case 0:
1412 return MISCREG_ID_PFR0_EL1;
1413 case 1:
1414 return MISCREG_ID_PFR1_EL1;
1415 case 2:
1416 return MISCREG_ID_DFR0_EL1;
1417 case 3:
1418 return MISCREG_ID_AFR0_EL1;
1419 case 4:
1420 return MISCREG_ID_MMFR0_EL1;
1421 case 5:
1422 return MISCREG_ID_MMFR1_EL1;
1423 case 6:
1424 return MISCREG_ID_MMFR2_EL1;
1425 case 7:
1426 return MISCREG_ID_MMFR3_EL1;
1427 }
1428 break;
1429 case 2:
1430 switch (op2) {
1431 case 0:
1432 return MISCREG_ID_ISAR0_EL1;
1433 case 1:
1434 return MISCREG_ID_ISAR1_EL1;
1435 case 2:
1436 return MISCREG_ID_ISAR2_EL1;
1437 case 3:
1438 return MISCREG_ID_ISAR3_EL1;
1439 case 4:
1440 return MISCREG_ID_ISAR4_EL1;
1441 case 5:
1442 return MISCREG_ID_ISAR5_EL1;
1443 }
1444 break;
1445 case 3:
1446 switch (op2) {
1447 case 0:
1448 return MISCREG_MVFR0_EL1;
1449 case 1:
1450 return MISCREG_MVFR1_EL1;
1451 case 2:
1452 return MISCREG_MVFR2_EL1;
1453 case 3 ... 7:
1454 return MISCREG_RAZ;
1455 }
1456 break;
1457 case 4:
1458 switch (op2) {
1459 case 0:
1460 return MISCREG_ID_AA64PFR0_EL1;
1461 case 1:
1462 return MISCREG_ID_AA64PFR1_EL1;
1463 case 2 ... 7:
1464 return MISCREG_RAZ;
1465 }
1466 break;
1467 case 5:
1468 switch (op2) {
1469 case 0:
1470 return MISCREG_ID_AA64DFR0_EL1;
1471 case 1:
1472 return MISCREG_ID_AA64DFR1_EL1;
1473 case 4:
1474 return MISCREG_ID_AA64AFR0_EL1;
1475 case 5:
1476 return MISCREG_ID_AA64AFR1_EL1;
1477 case 2:
1478 case 3:
1479 case 6:
1480 case 7:
1481 return MISCREG_RAZ;
1482 }
1483 break;
1484 case 6:
1485 switch (op2) {
1486 case 0:
1487 return MISCREG_ID_AA64ISAR0_EL1;
1488 case 1:
1489 return MISCREG_ID_AA64ISAR1_EL1;
1490 case 2 ... 7:
1491 return MISCREG_RAZ;
1492 }
1493 break;
1494 case 7:
1495 switch (op2) {
1496 case 0:
1497 return MISCREG_ID_AA64MMFR0_EL1;
1498 case 1:
1499 return MISCREG_ID_AA64MMFR1_EL1;
1500 case 2 ... 7:
1501 return MISCREG_RAZ;
1502 }
1503 break;
1504 }
1505 break;
1506 case 1:
1507 switch (crm) {
1508 case 0:
1509 switch (op2) {
1510 case 0:
1511 return MISCREG_CCSIDR_EL1;
1512 case 1:
1513 return MISCREG_CLIDR_EL1;
1514 case 7:
1515 return MISCREG_AIDR_EL1;
1516 }
1517 break;
1518 }
1519 break;
1520 case 2:
1521 switch (crm) {
1522 case 0:
1523 switch (op2) {
1524 case 0:
1525 return MISCREG_CSSELR_EL1;
1526 }
1527 break;
1528 }
1529 break;
1530 case 3:
1531 switch (crm) {
1532 case 0:
1533 switch (op2) {
1534 case 1:
1535 return MISCREG_CTR_EL0;
1536 case 7:
1537 return MISCREG_DCZID_EL0;
1538 }
1539 break;
1540 }
1541 break;
1542 case 4:
1543 switch (crm) {
1544 case 0:
1545 switch (op2) {
1546 case 0:
1547 return MISCREG_VPIDR_EL2;
1548 case 5:
1549 return MISCREG_VMPIDR_EL2;
1550 }
1551 break;
1552 }
1553 break;
1554 }
1555 break;
1556 case 1:
1557 switch (op1) {
1558 case 0:
1559 switch (crm) {
1560 case 0:
1561 switch (op2) {
1562 case 0:
1563 return MISCREG_SCTLR_EL1;
1564 case 1:
1565 return MISCREG_ACTLR_EL1;
1566 case 2:
1567 return MISCREG_CPACR_EL1;
1568 }
1569 break;
1570 }
1571 break;
1572 case 4:
1573 switch (crm) {
1574 case 0:
1575 switch (op2) {
1576 case 0:
1577 return MISCREG_SCTLR_EL2;
1578 case 1:
1579 return MISCREG_ACTLR_EL2;
1580 }
1581 break;
1582 case 1:
1583 switch (op2) {
1584 case 0:
1585 return MISCREG_HCR_EL2;
1586 case 1:
1587 return MISCREG_MDCR_EL2;
1588 case 2:
1589 return MISCREG_CPTR_EL2;
1590 case 3:
1591 return MISCREG_HSTR_EL2;
1592 case 7:
1593 return MISCREG_HACR_EL2;
1594 }
1595 break;
1596 }
1597 break;
1598 case 6:
1599 switch (crm) {
1600 case 0:
1601 switch (op2) {
1602 case 0:
1603 return MISCREG_SCTLR_EL3;
1604 case 1:
1605 return MISCREG_ACTLR_EL3;
1606 }
1607 break;
1608 case 1:
1609 switch (op2) {
1610 case 0:
1611 return MISCREG_SCR_EL3;
1612 case 1:
1613 return MISCREG_SDER32_EL3;
1614 case 2:
1615 return MISCREG_CPTR_EL3;
1616 }
1617 break;
1618 case 3:
1619 switch (op2) {
1620 case 1:
1621 return MISCREG_MDCR_EL3;
1622 }
1623 break;
1624 }
1625 break;
1626 }
1627 break;
1628 case 2:
1629 switch (op1) {
1630 case 0:
1631 switch (crm) {
1632 case 0:
1633 switch (op2) {
1634 case 0:
1635 return MISCREG_TTBR0_EL1;
1636 case 1:
1637 return MISCREG_TTBR1_EL1;
1638 case 2:
1639 return MISCREG_TCR_EL1;
1640 }
1641 break;
1642 }
1643 break;
1644 case 4:
1645 switch (crm) {
1646 case 0:
1647 switch (op2) {
1648 case 0:
1649 return MISCREG_TTBR0_EL2;
1650 case 2:
1651 return MISCREG_TCR_EL2;
1652 }
1653 break;
1654 case 1:
1655 switch (op2) {
1656 case 0:
1657 return MISCREG_VTTBR_EL2;
1658 case 2:
1659 return MISCREG_VTCR_EL2;
1660 }
1661 break;
1662 }
1663 break;
1664 case 6:
1665 switch (crm) {
1666 case 0:
1667 switch (op2) {
1668 case 0:
1669 return MISCREG_TTBR0_EL3;
1670 case 2:
1671 return MISCREG_TCR_EL3;
1672 }
1673 break;
1674 }
1675 break;
1676 }
1677 break;
1678 case 3:
1679 switch (op1) {
1680 case 4:
1681 switch (crm) {
1682 case 0:
1683 switch (op2) {
1684 case 0:
1685 return MISCREG_DACR32_EL2;
1686 }
1687 break;
1688 }
1689 break;
1690 }
1691 break;
1692 case 4:
1693 switch (op1) {
1694 case 0:
1695 switch (crm) {
1696 case 0:
1697 switch (op2) {
1698 case 0:
1699 return MISCREG_SPSR_EL1;
1700 case 1:
1701 return MISCREG_ELR_EL1;
1702 }
1703 break;
1704 case 1:
1705 switch (op2) {
1706 case 0:
1707 return MISCREG_SP_EL0;
1708 }
1709 break;
1710 case 2:
1711 switch (op2) {
1712 case 0:
1713 return MISCREG_SPSEL;
1714 case 2:
1715 return MISCREG_CURRENTEL;
1716 }
1717 break;
1718 }
1719 break;
1720 case 3:
1721 switch (crm) {
1722 case 2:
1723 switch (op2) {
1724 case 0:
1725 return MISCREG_NZCV;
1726 case 1:
1727 return MISCREG_DAIF;
1728 }
1729 break;
1730 case 4:
1731 switch (op2) {
1732 case 0:
1733 return MISCREG_FPCR;
1734 case 1:
1735 return MISCREG_FPSR;
1736 }
1737 break;
1738 case 5:
1739 switch (op2) {
1740 case 0:
1741 return MISCREG_DSPSR_EL0;
1742 case 1:
1743 return MISCREG_DLR_EL0;
1744 }
1745 break;
1746 }
1747 break;
1748 case 4:
1749 switch (crm) {
1750 case 0:
1751 switch (op2) {
1752 case 0:
1753 return MISCREG_SPSR_EL2;
1754 case 1:
1755 return MISCREG_ELR_EL2;
1756 }
1757 break;
1758 case 1:
1759 switch (op2) {
1760 case 0:
1761 return MISCREG_SP_EL1;
1762 }
1763 break;
1764 case 3:
1765 switch (op2) {
1766 case 0:
1767 return MISCREG_SPSR_IRQ_AA64;
1768 case 1:
1769 return MISCREG_SPSR_ABT_AA64;
1770 case 2:
1771 return MISCREG_SPSR_UND_AA64;
1772 case 3:
1773 return MISCREG_SPSR_FIQ_AA64;
1774 }
1775 break;
1776 }
1777 break;
1778 case 6:
1779 switch (crm) {
1780 case 0:
1781 switch (op2) {
1782 case 0:
1783 return MISCREG_SPSR_EL3;
1784 case 1:
1785 return MISCREG_ELR_EL3;
1786 }
1787 break;
1788 case 1:
1789 switch (op2) {
1790 case 0:
1791 return MISCREG_SP_EL2;
1792 }
1793 break;
1794 }
1795 break;
1796 }
1797 break;
1798 case 5:
1799 switch (op1) {
1800 case 0:
1801 switch (crm) {
1802 case 1:
1803 switch (op2) {
1804 case 0:
1805 return MISCREG_AFSR0_EL1;
1806 case 1:
1807 return MISCREG_AFSR1_EL1;
1808 }
1809 break;
1810 case 2:
1811 switch (op2) {
1812 case 0:
1813 return MISCREG_ESR_EL1;
1814 }
1815 break;
1816 }
1817 break;
1818 case 4:
1819 switch (crm) {
1820 case 0:
1821 switch (op2) {
1822 case 1:
1823 return MISCREG_IFSR32_EL2;
1824 }
1825 break;
1826 case 1:
1827 switch (op2) {
1828 case 0:
1829 return MISCREG_AFSR0_EL2;
1830 case 1:
1831 return MISCREG_AFSR1_EL2;
1832 }
1833 break;
1834 case 2:
1835 switch (op2) {
1836 case 0:
1837 return MISCREG_ESR_EL2;
1838 }
1839 break;
1840 case 3:
1841 switch (op2) {
1842 case 0:
1843 return MISCREG_FPEXC32_EL2;
1844 }
1845 break;
1846 }
1847 break;
1848 case 6:
1849 switch (crm) {
1850 case 1:
1851 switch (op2) {
1852 case 0:
1853 return MISCREG_AFSR0_EL3;
1854 case 1:
1855 return MISCREG_AFSR1_EL3;
1856 }
1857 break;
1858 case 2:
1859 switch (op2) {
1860 case 0:
1861 return MISCREG_ESR_EL3;
1862 }
1863 break;
1864 }
1865 break;
1866 }
1867 break;
1868 case 6:
1869 switch (op1) {
1870 case 0:
1871 switch (crm) {
1872 case 0:
1873 switch (op2) {
1874 case 0:
1875 return MISCREG_FAR_EL1;
1876 }
1877 break;
1878 }
1879 break;
1880 case 4:
1881 switch (crm) {
1882 case 0:
1883 switch (op2) {
1884 case 0:
1885 return MISCREG_FAR_EL2;
1886 case 4:
1887 return MISCREG_HPFAR_EL2;
1888 }
1889 break;
1890 }
1891 break;
1892 case 6:
1893 switch (crm) {
1894 case 0:
1895 switch (op2) {
1896 case 0:
1897 return MISCREG_FAR_EL3;
1898 }
1899 break;
1900 }
1901 break;
1902 }
1903 break;
1904 case 7:
1905 switch (op1) {
1906 case 0:
1907 switch (crm) {
1908 case 4:
1909 switch (op2) {
1910 case 0:
1911 return MISCREG_PAR_EL1;
1912 }
1913 break;
1914 }
1915 break;
1916 }
1917 break;
1918 case 9:
1919 switch (op1) {
1920 case 0:
1921 switch (crm) {
1922 case 14:
1923 switch (op2) {
1924 case 1:
1925 return MISCREG_PMINTENSET_EL1;
1926 case 2:
1927 return MISCREG_PMINTENCLR_EL1;
1928 }
1929 break;
1930 }
1931 break;
1932 case 3:
1933 switch (crm) {
1934 case 12:
1935 switch (op2) {
1936 case 0:
1937 return MISCREG_PMCR_EL0;
1938 case 1:
1939 return MISCREG_PMCNTENSET_EL0;
1940 case 2:
1941 return MISCREG_PMCNTENCLR_EL0;
1942 case 3:
1943 return MISCREG_PMOVSCLR_EL0;
1944 case 4:
1945 return MISCREG_PMSWINC_EL0;
1946 case 5:
1947 return MISCREG_PMSELR_EL0;
1948 case 6:
1949 return MISCREG_PMCEID0_EL0;
1950 case 7:
1951 return MISCREG_PMCEID1_EL0;
1952 }
1953 break;
1954 case 13:
1955 switch (op2) {
1956 case 0:
1957 return MISCREG_PMCCNTR_EL0;
1958 case 1:
1959 return MISCREG_PMXEVTYPER_EL0;
1960 case 2:
1961 return MISCREG_PMXEVCNTR_EL0;
1962 }
1963 break;
1964 case 14:
1965 switch (op2) {
1966 case 0:
1967 return MISCREG_PMUSERENR_EL0;
1968 case 3:
1969 return MISCREG_PMOVSSET_EL0;
1970 }
1971 break;
1972 }
1973 break;
1974 }
1975 break;
1976 case 10:
1977 switch (op1) {
1978 case 0:
1979 switch (crm) {
1980 case 2:
1981 switch (op2) {
1982 case 0:
1983 return MISCREG_MAIR_EL1;
1984 }
1985 break;
1986 case 3:
1987 switch (op2) {
1988 case 0:
1989 return MISCREG_AMAIR_EL1;
1990 }
1991 break;
1992 }
1993 break;
1994 case 4:
1995 switch (crm) {
1996 case 2:
1997 switch (op2) {
1998 case 0:
1999 return MISCREG_MAIR_EL2;
2000 }
2001 break;
2002 case 3:
2003 switch (op2) {
2004 case 0:
2005 return MISCREG_AMAIR_EL2;
2006 }
2007 break;
2008 }
2009 break;
2010 case 6:
2011 switch (crm) {
2012 case 2:
2013 switch (op2) {
2014 case 0:
2015 return MISCREG_MAIR_EL3;
2016 }
2017 break;
2018 case 3:
2019 switch (op2) {
2020 case 0:
2021 return MISCREG_AMAIR_EL3;
2022 }
2023 break;
2024 }
2025 break;
2026 }
2027 break;
2028 case 11:
2029 switch (op1) {
2030 case 1:
2031 switch (crm) {
2032 case 0:
2033 switch (op2) {
2034 case 2:
2035 return MISCREG_L2CTLR_EL1;
2036 case 3:
2037 return MISCREG_L2ECTLR_EL1;
2038 }
2039 break;
2040 }
2041 break;
2042 }
2043 break;
2044 case 12:
2045 switch (op1) {
2046 case 0:
2047 switch (crm) {
2048 case 0:
2049 switch (op2) {
2050 case 0:
2051 return MISCREG_VBAR_EL1;
2052 case 1:
2053 return MISCREG_RVBAR_EL1;
2054 }
2055 break;
2056 case 1:
2057 switch (op2) {
2058 case 0:
2059 return MISCREG_ISR_EL1;
2060 }
2061 break;
2062 }
2063 break;
2064 case 4:
2065 switch (crm) {
2066 case 0:
2067 switch (op2) {
2068 case 0:
2069 return MISCREG_VBAR_EL2;
2070 case 1:
2071 return MISCREG_RVBAR_EL2;
2072 }
2073 break;
2074 }
2075 break;
2076 case 6:
2077 switch (crm) {
2078 case 0:
2079 switch (op2) {
2080 case 0:
2081 return MISCREG_VBAR_EL3;
2082 case 1:
2083 return MISCREG_RVBAR_EL3;
2084 case 2:
2085 return MISCREG_RMR_EL3;
2086 }
2087 break;
2088 }
2089 break;
2090 }
2091 break;
2092 case 13:
2093 switch (op1) {
2094 case 0:
2095 switch (crm) {
2096 case 0:
2097 switch (op2) {
2098 case 1:
2099 return MISCREG_CONTEXTIDR_EL1;
2100 case 4:
2101 return MISCREG_TPIDR_EL1;
2102 }
2103 break;
2104 }
2105 break;
2106 case 3:
2107 switch (crm) {
2108 case 0:
2109 switch (op2) {
2110 case 2:
2111 return MISCREG_TPIDR_EL0;
2112 case 3:
2113 return MISCREG_TPIDRRO_EL0;
2114 }
2115 break;
2116 }
2117 break;
2118 case 4:
2119 switch (crm) {
2120 case 0:
2121 switch (op2) {
2122 case 1:
2123 return MISCREG_CONTEXTIDR_EL2;
2124 case 2:
2125 return MISCREG_TPIDR_EL2;
2126 }
2127 break;
2128 }
2129 break;
2130 case 6:
2131 switch (crm) {
2132 case 0:
2133 switch (op2) {
2134 case 2:
2135 return MISCREG_TPIDR_EL3;
2136 }
2137 break;
2138 }
2139 break;
2140 }
2141 break;
2142 case 14:
2143 switch (op1) {
2144 case 0:
2145 switch (crm) {
2146 case 1:
2147 switch (op2) {
2148 case 0:
2149 return MISCREG_CNTKCTL_EL1;
2150 }
2151 break;
2152 }
2153 break;
2154 case 3:
2155 switch (crm) {
2156 case 0:
2157 switch (op2) {
2158 case 0:
2159 return MISCREG_CNTFRQ_EL0;
2160 case 1:
2161 return MISCREG_CNTPCT_EL0;
2162 case 2:
2163 return MISCREG_CNTVCT_EL0;
2164 }
2165 break;
2166 case 2:
2167 switch (op2) {
2168 case 0:
2169 return MISCREG_CNTP_TVAL_EL0;
2170 case 1:
2171 return MISCREG_CNTP_CTL_EL0;
2172 case 2:
2173 return MISCREG_CNTP_CVAL_EL0;
2174 }
2175 break;
2176 case 3:
2177 switch (op2) {
2178 case 0:
2179 return MISCREG_CNTV_TVAL_EL0;
2180 case 1:
2181 return MISCREG_CNTV_CTL_EL0;
2182 case 2:
2183 return MISCREG_CNTV_CVAL_EL0;
2184 }
2185 break;
2186 case 8:
2187 switch (op2) {
2188 case 0:
2189 return MISCREG_PMEVCNTR0_EL0;
2190 case 1:
2191 return MISCREG_PMEVCNTR1_EL0;
2192 case 2:
2193 return MISCREG_PMEVCNTR2_EL0;
2194 case 3:
2195 return MISCREG_PMEVCNTR3_EL0;
2196 case 4:
2197 return MISCREG_PMEVCNTR4_EL0;
2198 case 5:
2199 return MISCREG_PMEVCNTR5_EL0;
2200 }
2201 break;
2202 case 12:
2203 switch (op2) {
2204 case 0:
2205 return MISCREG_PMEVTYPER0_EL0;
2206 case 1:
2207 return MISCREG_PMEVTYPER1_EL0;
2208 case 2:
2209 return MISCREG_PMEVTYPER2_EL0;
2210 case 3:
2211 return MISCREG_PMEVTYPER3_EL0;
2212 case 4:
2213 return MISCREG_PMEVTYPER4_EL0;
2214 case 5:
2215 return MISCREG_PMEVTYPER5_EL0;
2216 }
2217 break;
2218 case 15:
2219 switch (op2) {
2220 case 7:
2221 return MISCREG_PMCCFILTR_EL0;
2222 }
2223 }
2224 break;
2225 case 4:
2226 switch (crm) {
2227 case 0:
2228 switch (op2) {
2229 case 3:
2230 return MISCREG_CNTVOFF_EL2;
2231 }
2232 break;
2233 case 1:
2234 switch (op2) {
2235 case 0:
2236 return MISCREG_CNTHCTL_EL2;
2237 }
2238 break;
2239 case 2:
2240 switch (op2) {
2241 case 0:
2242 return MISCREG_CNTHP_TVAL_EL2;
2243 case 1:
2244 return MISCREG_CNTHP_CTL_EL2;
2245 case 2:
2246 return MISCREG_CNTHP_CVAL_EL2;
2247 }
2248 break;
2249 }
2250 break;
2251 case 7:
2252 switch (crm) {
2253 case 2:
2254 switch (op2) {
2255 case 0:
2256 return MISCREG_CNTPS_TVAL_EL1;
2257 case 1:
2258 return MISCREG_CNTPS_CTL_EL1;
2259 case 2:
2260 return MISCREG_CNTPS_CVAL_EL1;
2261 }
2262 break;
2263 }
2264 break;
2265 }
2266 break;
2267 case 15:
2268 switch (op1) {
2269 case 0:
2270 switch (crm) {
2271 case 0:
2272 switch (op2) {
2273 case 0:
2274 return MISCREG_IL1DATA0_EL1;
2275 case 1:
2276 return MISCREG_IL1DATA1_EL1;
2277 case 2:
2278 return MISCREG_IL1DATA2_EL1;
2279 case 3:
2280 return MISCREG_IL1DATA3_EL1;
2281 }
2282 break;
2283 case 1:
2284 switch (op2) {
2285 case 0:
2286 return MISCREG_DL1DATA0_EL1;
2287 case 1:
2288 return MISCREG_DL1DATA1_EL1;
2289 case 2:
2290 return MISCREG_DL1DATA2_EL1;
2291 case 3:
2292 return MISCREG_DL1DATA3_EL1;
2293 case 4:
2294 return MISCREG_DL1DATA4_EL1;
2295 }
2296 break;
2297 }
2298 break;
2299 case 1:
2300 switch (crm) {
2301 case 0:
2302 switch (op2) {
2303 case 0:
2304 return MISCREG_L2ACTLR_EL1;
2305 }
2306 break;
2307 case 2:
2308 switch (op2) {
2309 case 0:
2310 return MISCREG_CPUACTLR_EL1;
2311 case 1:
2312 return MISCREG_CPUECTLR_EL1;
2313 case 2:
2314 return MISCREG_CPUMERRSR_EL1;
2315 case 3:
2316 return MISCREG_L2MERRSR_EL1;
2317 }
2318 break;
2319 case 3:
2320 switch (op2) {
2321 case 0:
2322 return MISCREG_CBAR_EL1;
2323
2324 }
2325 break;
2326 }
2327 break;
2328 }
2329 break;
2330 }
2331 break;
2332 }
2333
2334 return MISCREG_UNKNOWN;
2335}
2336
2337bitset<NUM_MISCREG_INFOS> miscRegInfo[NUM_MISCREGS]; // initialized below
2338
2339void
2340ISA::initializeMiscRegMetadata()
2341{
2342 // the MiscReg metadata tables are shared across all instances of the
2343 // ISA object, so there's no need to initialize them multiple times.
2344 static bool completed = false;
2345 if (completed)
2346 return;
2347
2348 /**
2349 * Some registers alias with others, and therefore need to be translated.
2350 * When two mapping registers are given, they are the 32b lower and
2351 * upper halves, respectively, of the 64b register being mapped.
2352 * aligned with reference documentation ARM DDI 0487A.i pp 1540-1543
2353 *
2354 * NAM = "not architecturally mandated",
2355 * from ARM DDI 0487A.i, template text
2356 * "AArch64 System register ___ can be mapped to
2357 * AArch32 System register ___, but this is not
2358 * architecturally mandated."
2359 */
2360
2361 InitReg(MISCREG_CPSR)
2362 .allPrivileges();
2363 InitReg(MISCREG_SPSR)
2364 .allPrivileges();
2365 InitReg(MISCREG_SPSR_FIQ)
2366 .allPrivileges();
2367 InitReg(MISCREG_SPSR_IRQ)
2368 .allPrivileges();
2369 InitReg(MISCREG_SPSR_SVC)
2370 .allPrivileges();
2371 InitReg(MISCREG_SPSR_MON)
2372 .allPrivileges();
2373 InitReg(MISCREG_SPSR_ABT)
2374 .allPrivileges();
2375 InitReg(MISCREG_SPSR_HYP)
2376 .allPrivileges();
2377 InitReg(MISCREG_SPSR_UND)
2378 .allPrivileges();
2379 InitReg(MISCREG_ELR_HYP)
2380 .allPrivileges();
2381 InitReg(MISCREG_FPSID)
2382 .allPrivileges();
2383 InitReg(MISCREG_FPSCR)
2384 .allPrivileges();
2385 InitReg(MISCREG_MVFR1)
2386 .allPrivileges();
2387 InitReg(MISCREG_MVFR0)
2388 .allPrivileges();
2389 InitReg(MISCREG_FPEXC)
2390 .allPrivileges();
2391
2392 // Helper registers
2393 InitReg(MISCREG_CPSR_MODE)
2394 .allPrivileges();
2395 InitReg(MISCREG_CPSR_Q)
2396 .allPrivileges();
2397 InitReg(MISCREG_FPSCR_EXC)
2398 .allPrivileges();
2399 InitReg(MISCREG_FPSCR_QC)
2400 .allPrivileges();
2401 InitReg(MISCREG_LOCKADDR)
2402 .allPrivileges();
2403 InitReg(MISCREG_LOCKFLAG)
2404 .allPrivileges();
2405 InitReg(MISCREG_PRRR_MAIR0)
2406 .mutex()
2407 .banked();
2408 InitReg(MISCREG_PRRR_MAIR0_NS)
2409 .mutex()
2410 .bankedChild();
2411 InitReg(MISCREG_PRRR_MAIR0_S)
2412 .mutex()
2413 .bankedChild();
2414 InitReg(MISCREG_NMRR_MAIR1)
2415 .mutex()
2416 .banked();
2417 InitReg(MISCREG_NMRR_MAIR1_NS)
2418 .mutex()
2419 .bankedChild();
2420 InitReg(MISCREG_NMRR_MAIR1_S)
2421 .mutex()
2422 .bankedChild();
2423 InitReg(MISCREG_PMXEVTYPER_PMCCFILTR)
2424 .mutex();
2425 InitReg(MISCREG_SCTLR_RST)
2426 .allPrivileges();
2427 InitReg(MISCREG_SEV_MAILBOX)
2428 .allPrivileges();
2429
2430 // AArch32 CP14 registers
2431 InitReg(MISCREG_DBGDIDR)
2432 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
2433 InitReg(MISCREG_DBGDSCRint)
2434 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
2435 InitReg(MISCREG_DBGDCCINT)
2436 .unimplemented()
2437 .allPrivileges();
2438 InitReg(MISCREG_DBGDTRTXint)
2439 .unimplemented()
2440 .allPrivileges();
2441 InitReg(MISCREG_DBGDTRRXint)
2442 .unimplemented()
2443 .allPrivileges();
2444 InitReg(MISCREG_DBGWFAR)
2445 .unimplemented()
2446 .allPrivileges();
2447 InitReg(MISCREG_DBGVCR)
2448 .unimplemented()
2449 .allPrivileges();
2450 InitReg(MISCREG_DBGDTRRXext)
2451 .unimplemented()
2452 .allPrivileges();
2453 InitReg(MISCREG_DBGDSCRext)
2454 .unimplemented()
2455 .warnNotFail()
2456 .allPrivileges();
2457 InitReg(MISCREG_DBGDTRTXext)
2458 .unimplemented()
2459 .allPrivileges();
2460 InitReg(MISCREG_DBGOSECCR)
2461 .unimplemented()
2462 .allPrivileges();
2463 InitReg(MISCREG_DBGBVR0)
2464 .unimplemented()
2465 .allPrivileges();
2466 InitReg(MISCREG_DBGBVR1)
2467 .unimplemented()
2468 .allPrivileges();
2469 InitReg(MISCREG_DBGBVR2)
2470 .unimplemented()
2471 .allPrivileges();
2472 InitReg(MISCREG_DBGBVR3)
2473 .unimplemented()
2474 .allPrivileges();
2475 InitReg(MISCREG_DBGBVR4)
2476 .unimplemented()
2477 .allPrivileges();
2478 InitReg(MISCREG_DBGBVR5)
2479 .unimplemented()
2480 .allPrivileges();
2481 InitReg(MISCREG_DBGBCR0)
2482 .unimplemented()
2483 .allPrivileges();
2484 InitReg(MISCREG_DBGBCR1)
2485 .unimplemented()
2486 .allPrivileges();
2487 InitReg(MISCREG_DBGBCR2)
2488 .unimplemented()
2489 .allPrivileges();
2490 InitReg(MISCREG_DBGBCR3)
2491 .unimplemented()
2492 .allPrivileges();
2493 InitReg(MISCREG_DBGBCR4)
2494 .unimplemented()
2495 .allPrivileges();
2496 InitReg(MISCREG_DBGBCR5)
2497 .unimplemented()
2498 .allPrivileges();
2499 InitReg(MISCREG_DBGWVR0)
2500 .unimplemented()
2501 .allPrivileges();
2502 InitReg(MISCREG_DBGWVR1)
2503 .unimplemented()
2504 .allPrivileges();
2505 InitReg(MISCREG_DBGWVR2)
2506 .unimplemented()
2507 .allPrivileges();
2508 InitReg(MISCREG_DBGWVR3)
2509 .unimplemented()
2510 .allPrivileges();
2511 InitReg(MISCREG_DBGWCR0)
2512 .unimplemented()
2513 .allPrivileges();
2514 InitReg(MISCREG_DBGWCR1)
2515 .unimplemented()
2516 .allPrivileges();
2517 InitReg(MISCREG_DBGWCR2)
2518 .unimplemented()
2519 .allPrivileges();
2520 InitReg(MISCREG_DBGWCR3)
2521 .unimplemented()
2522 .allPrivileges();
2523 InitReg(MISCREG_DBGDRAR)
2524 .unimplemented()
2525 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
2526 InitReg(MISCREG_DBGBXVR4)
2527 .unimplemented()
2528 .allPrivileges();
2529 InitReg(MISCREG_DBGBXVR5)
2530 .unimplemented()
2531 .allPrivileges();
2532 InitReg(MISCREG_DBGOSLAR)
2533 .unimplemented()
2534 .allPrivileges().monSecureRead(0).monNonSecureRead(0);
2535 InitReg(MISCREG_DBGOSLSR)
2536 .unimplemented()
2537 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
2538 InitReg(MISCREG_DBGOSDLR)
2539 .unimplemented()
2540 .allPrivileges();
2541 InitReg(MISCREG_DBGPRCR)
2542 .unimplemented()
2543 .allPrivileges();
2544 InitReg(MISCREG_DBGDSAR)
2545 .unimplemented()
2546 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
2547 InitReg(MISCREG_DBGCLAIMSET)
2548 .unimplemented()
2549 .allPrivileges();
2550 InitReg(MISCREG_DBGCLAIMCLR)
2551 .unimplemented()
2552 .allPrivileges();
2553 InitReg(MISCREG_DBGAUTHSTATUS)
2554 .unimplemented()
2555 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
2556 InitReg(MISCREG_DBGDEVID2)
2557 .unimplemented()
2558 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
2559 InitReg(MISCREG_DBGDEVID1)
2560 .unimplemented()
2561 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
2562 InitReg(MISCREG_DBGDEVID0)
2563 .unimplemented()
2564 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
2565 InitReg(MISCREG_TEECR)
2566 .unimplemented()
2567 .allPrivileges();
2568 InitReg(MISCREG_JIDR)
2569 .allPrivileges();
2570 InitReg(MISCREG_TEEHBR)
2571 .allPrivileges();
2572 InitReg(MISCREG_JOSCR)
2573 .allPrivileges();
2574 InitReg(MISCREG_JMCR)
2575 .allPrivileges();
2576
2577 // AArch32 CP15 registers
2578 InitReg(MISCREG_MIDR)
2579 .allPrivileges().exceptUserMode().writes(0);
2580 InitReg(MISCREG_CTR)
2581 .allPrivileges().exceptUserMode().writes(0);
2582 InitReg(MISCREG_TCMTR)
2583 .allPrivileges().exceptUserMode().writes(0);
2584 InitReg(MISCREG_TLBTR)
2585 .allPrivileges().exceptUserMode().writes(0);
2586 InitReg(MISCREG_MPIDR)
2587 .allPrivileges().exceptUserMode().writes(0);
2588 InitReg(MISCREG_REVIDR)
2589 .unimplemented()
2590 .warnNotFail()
2591 .allPrivileges().exceptUserMode().writes(0);
2592 InitReg(MISCREG_ID_PFR0)
2593 .allPrivileges().exceptUserMode().writes(0);
2594 InitReg(MISCREG_ID_PFR1)
2595 .allPrivileges().exceptUserMode().writes(0);
2596 InitReg(MISCREG_ID_DFR0)
2597 .allPrivileges().exceptUserMode().writes(0);
2598 InitReg(MISCREG_ID_AFR0)
2599 .allPrivileges().exceptUserMode().writes(0);
2600 InitReg(MISCREG_ID_MMFR0)
2601 .allPrivileges().exceptUserMode().writes(0);
2602 InitReg(MISCREG_ID_MMFR1)
2603 .allPrivileges().exceptUserMode().writes(0);
2604 InitReg(MISCREG_ID_MMFR2)
2605 .allPrivileges().exceptUserMode().writes(0);
2606 InitReg(MISCREG_ID_MMFR3)
2607 .allPrivileges().exceptUserMode().writes(0);
2608 InitReg(MISCREG_ID_ISAR0)
2609 .allPrivileges().exceptUserMode().writes(0);
2610 InitReg(MISCREG_ID_ISAR1)
2611 .allPrivileges().exceptUserMode().writes(0);
2612 InitReg(MISCREG_ID_ISAR2)
2613 .allPrivileges().exceptUserMode().writes(0);
2614 InitReg(MISCREG_ID_ISAR3)
2615 .allPrivileges().exceptUserMode().writes(0);
2616 InitReg(MISCREG_ID_ISAR4)
2617 .allPrivileges().exceptUserMode().writes(0);
2618 InitReg(MISCREG_ID_ISAR5)
2619 .allPrivileges().exceptUserMode().writes(0);
2620 InitReg(MISCREG_CCSIDR)
2621 .allPrivileges().exceptUserMode().writes(0);
2622 InitReg(MISCREG_CLIDR)
2623 .allPrivileges().exceptUserMode().writes(0);
2624 InitReg(MISCREG_AIDR)
2625 .allPrivileges().exceptUserMode().writes(0);
2626 InitReg(MISCREG_CSSELR)
2627 .banked();
2628 InitReg(MISCREG_CSSELR_NS)
2629 .bankedChild()
2630 .nonSecure().exceptUserMode();
2631 InitReg(MISCREG_CSSELR_S)
2632 .bankedChild()
2633 .secure().exceptUserMode();
2634 InitReg(MISCREG_VPIDR)
2635 .hyp().monNonSecure();
2636 InitReg(MISCREG_VMPIDR)
2637 .hyp().monNonSecure();
2638 InitReg(MISCREG_SCTLR)
2639 .banked();
2640 InitReg(MISCREG_SCTLR_NS)
2641 .bankedChild()
2642 .nonSecure().exceptUserMode();
2643 InitReg(MISCREG_SCTLR_S)
2644 .bankedChild()
2645 .secure().exceptUserMode();
2646 InitReg(MISCREG_ACTLR)
2647 .banked();
2648 InitReg(MISCREG_ACTLR_NS)
2649 .bankedChild()
2650 .nonSecure().exceptUserMode();
2651 InitReg(MISCREG_ACTLR_S)
2652 .bankedChild()
2653 .secure().exceptUserMode();
2654 InitReg(MISCREG_CPACR)
2655 .allPrivileges().exceptUserMode();
2656 InitReg(MISCREG_SCR)
2657 .mon().secure().exceptUserMode()
2658 .res0(0xff40) // [31:16], [6]
2659 .res1(0x0030); // [5:4]
2660 InitReg(MISCREG_SDER)
2661 .mon();
2662 InitReg(MISCREG_NSACR)
2663 .allPrivileges().hypWrite(0).privNonSecureWrite(0).exceptUserMode();
2664 InitReg(MISCREG_HSCTLR)
2665 .hyp().monNonSecure();
2666 InitReg(MISCREG_HACTLR)
2667 .hyp().monNonSecure();
2668 InitReg(MISCREG_HCR)
2669 .hyp().monNonSecure();
2670 InitReg(MISCREG_HDCR)
2671 .hyp().monNonSecure();
2672 InitReg(MISCREG_HCPTR)
2673 .hyp().monNonSecure();
2674 InitReg(MISCREG_HSTR)
2675 .hyp().monNonSecure();
2676 InitReg(MISCREG_HACR)
2677 .unimplemented()
2678 .warnNotFail()
2679 .hyp().monNonSecure();
2680 InitReg(MISCREG_TTBR0)
2681 .banked();
2682 InitReg(MISCREG_TTBR0_NS)
2683 .bankedChild()
2684 .nonSecure().exceptUserMode();
2685 InitReg(MISCREG_TTBR0_S)
2686 .bankedChild()
2687 .secure().exceptUserMode();
2688 InitReg(MISCREG_TTBR1)
2689 .banked();
2690 InitReg(MISCREG_TTBR1_NS)
2691 .bankedChild()
2692 .nonSecure().exceptUserMode();
2693 InitReg(MISCREG_TTBR1_S)
2694 .bankedChild()
2695 .secure().exceptUserMode();
2696 InitReg(MISCREG_TTBCR)
2697 .banked();
2698 InitReg(MISCREG_TTBCR_NS)
2699 .bankedChild()
2700 .nonSecure().exceptUserMode();
2701 InitReg(MISCREG_TTBCR_S)
2702 .bankedChild()
2703 .secure().exceptUserMode();
2704 InitReg(MISCREG_HTCR)
2705 .hyp().monNonSecure();
2706 InitReg(MISCREG_VTCR)
2707 .hyp().monNonSecure();
2708 InitReg(MISCREG_DACR)
2709 .banked();
2710 InitReg(MISCREG_DACR_NS)
2711 .bankedChild()
2712 .nonSecure().exceptUserMode();
2713 InitReg(MISCREG_DACR_S)
2714 .bankedChild()
2715 .secure().exceptUserMode();
2716 InitReg(MISCREG_DFSR)
2717 .banked();
2718 InitReg(MISCREG_DFSR_NS)
2719 .bankedChild()
2720 .nonSecure().exceptUserMode();
2721 InitReg(MISCREG_DFSR_S)
2722 .bankedChild()
2723 .secure().exceptUserMode();
2724 InitReg(MISCREG_IFSR)
2725 .banked();
2726 InitReg(MISCREG_IFSR_NS)
2727 .bankedChild()
2728 .nonSecure().exceptUserMode();
2729 InitReg(MISCREG_IFSR_S)
2730 .bankedChild()
2731 .secure().exceptUserMode();
2732 InitReg(MISCREG_ADFSR)
2733 .unimplemented()
2734 .warnNotFail()
2735 .banked();
2736 InitReg(MISCREG_ADFSR_NS)
2737 .unimplemented()
2738 .warnNotFail()
2739 .bankedChild()
2740 .nonSecure().exceptUserMode();
2741 InitReg(MISCREG_ADFSR_S)
2742 .unimplemented()
2743 .warnNotFail()
2744 .bankedChild()
2745 .secure().exceptUserMode();
2746 InitReg(MISCREG_AIFSR)
2747 .unimplemented()
2748 .warnNotFail()
2749 .banked();
2750 InitReg(MISCREG_AIFSR_NS)
2751 .unimplemented()
2752 .warnNotFail()
2753 .bankedChild()
2754 .nonSecure().exceptUserMode();
2755 InitReg(MISCREG_AIFSR_S)
2756 .unimplemented()
2757 .warnNotFail()
2758 .bankedChild()
2759 .secure().exceptUserMode();
2760 InitReg(MISCREG_HADFSR)
2761 .hyp().monNonSecure();
2762 InitReg(MISCREG_HAIFSR)
2763 .hyp().monNonSecure();
2764 InitReg(MISCREG_HSR)
2765 .hyp().monNonSecure();
2766 InitReg(MISCREG_DFAR)
2767 .banked();
2768 InitReg(MISCREG_DFAR_NS)
2769 .bankedChild()
2770 .nonSecure().exceptUserMode();
2771 InitReg(MISCREG_DFAR_S)
2772 .bankedChild()
2773 .secure().exceptUserMode();
2774 InitReg(MISCREG_IFAR)
2775 .banked();
2776 InitReg(MISCREG_IFAR_NS)
2777 .bankedChild()
2778 .nonSecure().exceptUserMode();
2779 InitReg(MISCREG_IFAR_S)
2780 .bankedChild()
2781 .secure().exceptUserMode();
2782 InitReg(MISCREG_HDFAR)
2783 .hyp().monNonSecure();
2784 InitReg(MISCREG_HIFAR)
2785 .hyp().monNonSecure();
2786 InitReg(MISCREG_HPFAR)
2787 .hyp().monNonSecure();
2788 InitReg(MISCREG_ICIALLUIS)
2789 .unimplemented()
2790 .warnNotFail()
2791 .writes(1).exceptUserMode();
2792 InitReg(MISCREG_BPIALLIS)
2793 .unimplemented()
2794 .warnNotFail()
2795 .writes(1).exceptUserMode();
2796 InitReg(MISCREG_PAR)
2797 .banked();
2798 InitReg(MISCREG_PAR_NS)
2799 .bankedChild()
2800 .nonSecure().exceptUserMode();
2801 InitReg(MISCREG_PAR_S)
2802 .bankedChild()
2803 .secure().exceptUserMode();
2804 InitReg(MISCREG_ICIALLU)
2805 .writes(1).exceptUserMode();
2806 InitReg(MISCREG_ICIMVAU)
2807 .unimplemented()
2808 .warnNotFail()
2809 .writes(1).exceptUserMode();
2810 InitReg(MISCREG_CP15ISB)
2811 .writes(1);
2812 InitReg(MISCREG_BPIALL)
2813 .unimplemented()
2814 .warnNotFail()
2815 .writes(1).exceptUserMode();
2816 InitReg(MISCREG_BPIMVA)
2817 .unimplemented()
2818 .warnNotFail()
2819 .writes(1).exceptUserMode();
2820 InitReg(MISCREG_DCIMVAC)
2821 .unimplemented()
2822 .warnNotFail()
2823 .writes(1).exceptUserMode();
2824 InitReg(MISCREG_DCISW)
2825 .unimplemented()
2826 .warnNotFail()
2827 .writes(1).exceptUserMode();
2828 InitReg(MISCREG_ATS1CPR)
2829 .writes(1).exceptUserMode();
2830 InitReg(MISCREG_ATS1CPW)
2831 .writes(1).exceptUserMode();
2832 InitReg(MISCREG_ATS1CUR)
2833 .writes(1).exceptUserMode();
2834 InitReg(MISCREG_ATS1CUW)
2835 .writes(1).exceptUserMode();
2836 InitReg(MISCREG_ATS12NSOPR)
2837 .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite();
2838 InitReg(MISCREG_ATS12NSOPW)
2839 .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite();
2840 InitReg(MISCREG_ATS12NSOUR)
2841 .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite();
2842 InitReg(MISCREG_ATS12NSOUW)
2843 .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite();
2844 InitReg(MISCREG_DCCMVAC)
2845 .writes(1).exceptUserMode();
2846 InitReg(MISCREG_DCCSW)
2847 .unimplemented()
2848 .warnNotFail()
2849 .writes(1).exceptUserMode();
2850 InitReg(MISCREG_CP15DSB)
2851 .writes(1);
2852 InitReg(MISCREG_CP15DMB)
2853 .writes(1);
2854 InitReg(MISCREG_DCCMVAU)
2855 .unimplemented()
2856 .warnNotFail()
2857 .writes(1).exceptUserMode();
2858 InitReg(MISCREG_DCCIMVAC)
2859 .unimplemented()
2860 .warnNotFail()
2861 .writes(1).exceptUserMode();
2862 InitReg(MISCREG_DCCISW)
2863 .unimplemented()
2864 .warnNotFail()
2865 .writes(1).exceptUserMode();
2866 InitReg(MISCREG_ATS1HR)
2867 .monNonSecureWrite().hypWrite();
2868 InitReg(MISCREG_ATS1HW)
2869 .monNonSecureWrite().hypWrite();
2870 InitReg(MISCREG_TLBIALLIS)
2871 .writes(1).exceptUserMode();
2872 InitReg(MISCREG_TLBIMVAIS)
2873 .writes(1).exceptUserMode();
2874 InitReg(MISCREG_TLBIASIDIS)
2875 .writes(1).exceptUserMode();
2876 InitReg(MISCREG_TLBIMVAAIS)
2877 .writes(1).exceptUserMode();
2878 InitReg(MISCREG_TLBIMVALIS)
2879 .unimplemented()
2880 .writes(1).exceptUserMode();
2881 InitReg(MISCREG_TLBIMVAALIS)
2882 .unimplemented()
2883 .writes(1).exceptUserMode();
2884 InitReg(MISCREG_ITLBIALL)
2885 .writes(1).exceptUserMode();
2886 InitReg(MISCREG_ITLBIMVA)
2887 .writes(1).exceptUserMode();
2888 InitReg(MISCREG_ITLBIASID)
2889 .writes(1).exceptUserMode();
2890 InitReg(MISCREG_DTLBIALL)
2891 .writes(1).exceptUserMode();
2892 InitReg(MISCREG_DTLBIMVA)
2893 .writes(1).exceptUserMode();
2894 InitReg(MISCREG_DTLBIASID)
2895 .writes(1).exceptUserMode();
2896 InitReg(MISCREG_TLBIALL)
2897 .writes(1).exceptUserMode();
2898 InitReg(MISCREG_TLBIMVA)
2899 .writes(1).exceptUserMode();
2900 InitReg(MISCREG_TLBIASID)
2901 .writes(1).exceptUserMode();
2902 InitReg(MISCREG_TLBIMVAA)
2903 .writes(1).exceptUserMode();
2904 InitReg(MISCREG_TLBIMVAL)
2905 .unimplemented()
2906 .writes(1).exceptUserMode();
2907 InitReg(MISCREG_TLBIMVAAL)
2908 .unimplemented()
2909 .writes(1).exceptUserMode();
2910 InitReg(MISCREG_TLBIIPAS2IS)
2911 .unimplemented()
2912 .monNonSecureWrite().hypWrite();
2913 InitReg(MISCREG_TLBIIPAS2LIS)
2914 .unimplemented()
2915 .monNonSecureWrite().hypWrite();
2916 InitReg(MISCREG_TLBIALLHIS)
2917 .monNonSecureWrite().hypWrite();
2918 InitReg(MISCREG_TLBIMVAHIS)
2919 .monNonSecureWrite().hypWrite();
2920 InitReg(MISCREG_TLBIALLNSNHIS)
2921 .monNonSecureWrite().hypWrite();
2922 InitReg(MISCREG_TLBIMVALHIS)
2923 .unimplemented()
2924 .monNonSecureWrite().hypWrite();
2925 InitReg(MISCREG_TLBIIPAS2)
2926 .unimplemented()
2927 .monNonSecureWrite().hypWrite();
2928 InitReg(MISCREG_TLBIIPAS2L)
2929 .unimplemented()
2930 .monNonSecureWrite().hypWrite();
2931 InitReg(MISCREG_TLBIALLH)
2932 .monNonSecureWrite().hypWrite();
2933 InitReg(MISCREG_TLBIMVAH)
2934 .monNonSecureWrite().hypWrite();
2935 InitReg(MISCREG_TLBIALLNSNH)
2936 .monNonSecureWrite().hypWrite();
2937 InitReg(MISCREG_TLBIMVALH)
2938 .unimplemented()
2939 .monNonSecureWrite().hypWrite();
2940 InitReg(MISCREG_PMCR)
2941 .allPrivileges();
2942 InitReg(MISCREG_PMCNTENSET)
2943 .allPrivileges();
2944 InitReg(MISCREG_PMCNTENCLR)
2945 .allPrivileges();
2946 InitReg(MISCREG_PMOVSR)
2947 .allPrivileges();
2948 InitReg(MISCREG_PMSWINC)
2949 .allPrivileges();
2950 InitReg(MISCREG_PMSELR)
2951 .allPrivileges();
2952 InitReg(MISCREG_PMCEID0)
2953 .allPrivileges();
2954 InitReg(MISCREG_PMCEID1)
2955 .allPrivileges();
2956 InitReg(MISCREG_PMCCNTR)
2957 .allPrivileges();
2958 InitReg(MISCREG_PMXEVTYPER)
2959 .allPrivileges();
2960 InitReg(MISCREG_PMCCFILTR)
2961 .allPrivileges();
2962 InitReg(MISCREG_PMXEVCNTR)
2963 .allPrivileges();
2964 InitReg(MISCREG_PMUSERENR)
2965 .allPrivileges().userNonSecureWrite(0).userSecureWrite(0);
2966 InitReg(MISCREG_PMINTENSET)
2967 .allPrivileges().exceptUserMode();
2968 InitReg(MISCREG_PMINTENCLR)
2969 .allPrivileges().exceptUserMode();
2970 InitReg(MISCREG_PMOVSSET)
2971 .unimplemented()
2972 .allPrivileges();
2973 InitReg(MISCREG_L2CTLR)
2974 .allPrivileges().exceptUserMode();
2975 InitReg(MISCREG_L2ECTLR)
2976 .unimplemented()
2977 .allPrivileges().exceptUserMode();
2978 InitReg(MISCREG_PRRR)
2979 .banked();
2980 InitReg(MISCREG_PRRR_NS)
2981 .bankedChild()
2982 .nonSecure().exceptUserMode();
2983 InitReg(MISCREG_PRRR_S)
2984 .bankedChild()
2985 .secure().exceptUserMode();
2986 InitReg(MISCREG_MAIR0)
2987 .banked();
2988 InitReg(MISCREG_MAIR0_NS)
2989 .bankedChild()
2990 .nonSecure().exceptUserMode();
2991 InitReg(MISCREG_MAIR0_S)
2992 .bankedChild()
2993 .secure().exceptUserMode();
2994 InitReg(MISCREG_NMRR)
2995 .banked();
2996 InitReg(MISCREG_NMRR_NS)
2997 .bankedChild()
2998 .nonSecure().exceptUserMode();
2999 InitReg(MISCREG_NMRR_S)
3000 .bankedChild()
3001 .secure().exceptUserMode();
3002 InitReg(MISCREG_MAIR1)
3003 .banked();
3004 InitReg(MISCREG_MAIR1_NS)
3005 .bankedChild()
3006 .nonSecure().exceptUserMode();
3007 InitReg(MISCREG_MAIR1_S)
3008 .bankedChild()
3009 .secure().exceptUserMode();
3010 InitReg(MISCREG_AMAIR0)
3011 .banked();
3012 InitReg(MISCREG_AMAIR0_NS)
3013 .bankedChild()
3014 .nonSecure().exceptUserMode();
3015 InitReg(MISCREG_AMAIR0_S)
3016 .bankedChild()
3017 .secure().exceptUserMode();
3018 InitReg(MISCREG_AMAIR1)
3019 .banked();
3020 InitReg(MISCREG_AMAIR1_NS)
3021 .bankedChild()
3022 .nonSecure().exceptUserMode();
3023 InitReg(MISCREG_AMAIR1_S)
3024 .bankedChild()
3025 .secure().exceptUserMode();
3026 InitReg(MISCREG_HMAIR0)
3027 .hyp().monNonSecure();
3028 InitReg(MISCREG_HMAIR1)
3029 .hyp().monNonSecure();
3030 InitReg(MISCREG_HAMAIR0)
3031 .unimplemented()
3032 .warnNotFail()
3033 .hyp().monNonSecure();
3034 InitReg(MISCREG_HAMAIR1)
3035 .unimplemented()
3036 .warnNotFail()
3037 .hyp().monNonSecure();
3038 InitReg(MISCREG_VBAR)
3039 .banked();
3040 InitReg(MISCREG_VBAR_NS)
3041 .bankedChild()
3042 .nonSecure().exceptUserMode();
3043 InitReg(MISCREG_VBAR_S)
3044 .bankedChild()
3045 .secure().exceptUserMode();
3046 InitReg(MISCREG_MVBAR)
3047 .mon().secure().exceptUserMode();
3048 InitReg(MISCREG_RMR)
3049 .unimplemented()
3050 .mon().secure().exceptUserMode();
3051 InitReg(MISCREG_ISR)
3052 .allPrivileges().exceptUserMode().writes(0);
3053 InitReg(MISCREG_HVBAR)
3054 .hyp().monNonSecure();
3055 InitReg(MISCREG_FCSEIDR)
3056 .unimplemented()
3057 .warnNotFail()
3058 .allPrivileges().exceptUserMode();
3059 InitReg(MISCREG_CONTEXTIDR)
3060 .banked();
3061 InitReg(MISCREG_CONTEXTIDR_NS)
3062 .bankedChild()
3063 .nonSecure().exceptUserMode();
3064 InitReg(MISCREG_CONTEXTIDR_S)
3065 .bankedChild()
3066 .secure().exceptUserMode();
3067 InitReg(MISCREG_TPIDRURW)
3068 .banked();
3069 InitReg(MISCREG_TPIDRURW_NS)
3070 .bankedChild()
3071 .allPrivileges().monSecure(0).privSecure(0);
3072 InitReg(MISCREG_TPIDRURW_S)
3073 .bankedChild()
3074 .secure();
3075 InitReg(MISCREG_TPIDRURO)
3076 .banked();
3077 InitReg(MISCREG_TPIDRURO_NS)
3078 .bankedChild()
3079 .allPrivileges().secure(0).userNonSecureWrite(0).userSecureRead(1);
3080 InitReg(MISCREG_TPIDRURO_S)
3081 .bankedChild()
3082 .secure().userSecureWrite(0);
3083 InitReg(MISCREG_TPIDRPRW)
3084 .banked();
3085 InitReg(MISCREG_TPIDRPRW_NS)
3086 .bankedChild()
3087 .nonSecure().exceptUserMode();
3088 InitReg(MISCREG_TPIDRPRW_S)
3089 .bankedChild()
3090 .secure().exceptUserMode();
3091 InitReg(MISCREG_HTPIDR)
3092 .hyp().monNonSecure();
3093 InitReg(MISCREG_CNTFRQ)
3094 .unverifiable()
3095 .reads(1).mon();
3096 InitReg(MISCREG_CNTKCTL)
3097 .allPrivileges().exceptUserMode();
3098 InitReg(MISCREG_CNTP_TVAL)
3099 .banked();
3100 InitReg(MISCREG_CNTP_TVAL_NS)
3101 .bankedChild()
3102 .allPrivileges().monSecure(0).privSecure(0);
3103 InitReg(MISCREG_CNTP_TVAL_S)
3104 .unimplemented()
3105 .bankedChild()
3106 .secure().user(1);
3107 InitReg(MISCREG_CNTP_CTL)
3108 .banked();
3109 InitReg(MISCREG_CNTP_CTL_NS)
3110 .bankedChild()
3111 .allPrivileges().monSecure(0).privSecure(0);
3112 InitReg(MISCREG_CNTP_CTL_S)
3113 .unimplemented()
3114 .bankedChild()
3115 .secure().user(1);
3116 InitReg(MISCREG_CNTV_TVAL)
3117 .allPrivileges();
3118 InitReg(MISCREG_CNTV_CTL)
3119 .allPrivileges();
3120 InitReg(MISCREG_CNTHCTL)
3121 .unimplemented()
3122 .hypWrite().monNonSecureRead();
3123 InitReg(MISCREG_CNTHP_TVAL)
3124 .unimplemented()
3125 .hypWrite().monNonSecureRead();
3126 InitReg(MISCREG_CNTHP_CTL)
3127 .unimplemented()
3128 .hypWrite().monNonSecureRead();
3129 InitReg(MISCREG_IL1DATA0)
3130 .unimplemented()
3131 .allPrivileges().exceptUserMode();
3132 InitReg(MISCREG_IL1DATA1)
3133 .unimplemented()
3134 .allPrivileges().exceptUserMode();
3135 InitReg(MISCREG_IL1DATA2)
3136 .unimplemented()
3137 .allPrivileges().exceptUserMode();
3138 InitReg(MISCREG_IL1DATA3)
3139 .unimplemented()
3140 .allPrivileges().exceptUserMode();
3141 InitReg(MISCREG_DL1DATA0)
3142 .unimplemented()
3143 .allPrivileges().exceptUserMode();
3144 InitReg(MISCREG_DL1DATA1)
3145 .unimplemented()
3146 .allPrivileges().exceptUserMode();
3147 InitReg(MISCREG_DL1DATA2)
3148 .unimplemented()
3149 .allPrivileges().exceptUserMode();
3150 InitReg(MISCREG_DL1DATA3)
3151 .unimplemented()
3152 .allPrivileges().exceptUserMode();
3153 InitReg(MISCREG_DL1DATA4)
3154 .unimplemented()
3155 .allPrivileges().exceptUserMode();
3156 InitReg(MISCREG_RAMINDEX)
3157 .unimplemented()
3158 .writes(1).exceptUserMode();
3159 InitReg(MISCREG_L2ACTLR)
3160 .unimplemented()
3161 .allPrivileges().exceptUserMode();
3162 InitReg(MISCREG_CBAR)
3163 .unimplemented()
3164 .allPrivileges().exceptUserMode().writes(0);
3165 InitReg(MISCREG_HTTBR)
3166 .hyp().monNonSecure();
3167 InitReg(MISCREG_VTTBR)
3168 .hyp().monNonSecure();
3169 InitReg(MISCREG_CNTPCT)
3170 .reads(1);
3171 InitReg(MISCREG_CNTVCT)
3172 .unverifiable()
3173 .reads(1);
3174 InitReg(MISCREG_CNTP_CVAL)
3175 .banked();
3176 InitReg(MISCREG_CNTP_CVAL_NS)
3177 .bankedChild()
3178 .allPrivileges().monSecure(0).privSecure(0);
3179 InitReg(MISCREG_CNTP_CVAL_S)
3180 .unimplemented()
3181 .bankedChild()
3182 .secure().user(1);
3183 InitReg(MISCREG_CNTV_CVAL)
3184 .allPrivileges();
3185 InitReg(MISCREG_CNTVOFF)
3186 .hyp().monNonSecure();
3187 InitReg(MISCREG_CNTHP_CVAL)
3188 .unimplemented()
3189 .hypWrite().monNonSecureRead();
3190 InitReg(MISCREG_CPUMERRSR)
3191 .unimplemented()
3192 .allPrivileges().exceptUserMode();
3193 InitReg(MISCREG_L2MERRSR)
3194 .unimplemented()
3195 .warnNotFail()
3196 .allPrivileges().exceptUserMode();
3197
3198 // AArch64 registers (Op0=2);
3199 InitReg(MISCREG_MDCCINT_EL1)
3200 .allPrivileges();
3201 InitReg(MISCREG_OSDTRRX_EL1)
3202 .allPrivileges()
3203 .mapsTo(MISCREG_DBGDTRRXext);
3204 InitReg(MISCREG_MDSCR_EL1)
3205 .allPrivileges()
3206 .mapsTo(MISCREG_DBGDSCRext);
3207 InitReg(MISCREG_OSDTRTX_EL1)
3208 .allPrivileges()
3209 .mapsTo(MISCREG_DBGDTRTXext);
3210 InitReg(MISCREG_OSECCR_EL1)
3211 .allPrivileges()
3212 .mapsTo(MISCREG_DBGOSECCR);
3213 InitReg(MISCREG_DBGBVR0_EL1)
3214 .allPrivileges()
3215 .mapsTo(MISCREG_DBGBVR0 /*, MISCREG_DBGBXVR0 */);
3216 InitReg(MISCREG_DBGBVR1_EL1)
3217 .allPrivileges()
3218 .mapsTo(MISCREG_DBGBVR1 /*, MISCREG_DBGBXVR1 */);
3219 InitReg(MISCREG_DBGBVR2_EL1)
3220 .allPrivileges()
3221 .mapsTo(MISCREG_DBGBVR2 /*, MISCREG_DBGBXVR2 */);
3222 InitReg(MISCREG_DBGBVR3_EL1)
3223 .allPrivileges()
3224 .mapsTo(MISCREG_DBGBVR3 /*, MISCREG_DBGBXVR3 */);
3225 InitReg(MISCREG_DBGBVR4_EL1)
3226 .allPrivileges()
3227 .mapsTo(MISCREG_DBGBVR4 /*, MISCREG_DBGBXVR4 */);
3228 InitReg(MISCREG_DBGBVR5_EL1)
3229 .allPrivileges()
3230 .mapsTo(MISCREG_DBGBVR5 /*, MISCREG_DBGBXVR5 */);
3231 InitReg(MISCREG_DBGBCR0_EL1)
3232 .allPrivileges()
3233 .mapsTo(MISCREG_DBGBCR0);
3234 InitReg(MISCREG_DBGBCR1_EL1)
3235 .allPrivileges()
3236 .mapsTo(MISCREG_DBGBCR1);
3237 InitReg(MISCREG_DBGBCR2_EL1)
3238 .allPrivileges()
3239 .mapsTo(MISCREG_DBGBCR2);
3240 InitReg(MISCREG_DBGBCR3_EL1)
3241 .allPrivileges()
3242 .mapsTo(MISCREG_DBGBCR3);
3243 InitReg(MISCREG_DBGBCR4_EL1)
3244 .allPrivileges()
3245 .mapsTo(MISCREG_DBGBCR4);
3246 InitReg(MISCREG_DBGBCR5_EL1)
3247 .allPrivileges()
3248 .mapsTo(MISCREG_DBGBCR5);
3249 InitReg(MISCREG_DBGWVR0_EL1)
3250 .allPrivileges()
3251 .mapsTo(MISCREG_DBGWVR0);
3252 InitReg(MISCREG_DBGWVR1_EL1)
3253 .allPrivileges()
3254 .mapsTo(MISCREG_DBGWVR1);
3255 InitReg(MISCREG_DBGWVR2_EL1)
3256 .allPrivileges()
3257 .mapsTo(MISCREG_DBGWVR2);
3258 InitReg(MISCREG_DBGWVR3_EL1)
3259 .allPrivileges()
3260 .mapsTo(MISCREG_DBGWVR3);
3261 InitReg(MISCREG_DBGWCR0_EL1)
3262 .allPrivileges()
3263 .mapsTo(MISCREG_DBGWCR0);
3264 InitReg(MISCREG_DBGWCR1_EL1)
3265 .allPrivileges()
3266 .mapsTo(MISCREG_DBGWCR1);
3267 InitReg(MISCREG_DBGWCR2_EL1)
3268 .allPrivileges()
3269 .mapsTo(MISCREG_DBGWCR2);
3270 InitReg(MISCREG_DBGWCR3_EL1)
3271 .allPrivileges()
3272 .mapsTo(MISCREG_DBGWCR3);
3273 InitReg(MISCREG_MDCCSR_EL0)
3274 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0)
3275 .mapsTo(MISCREG_DBGDSCRint);
3276 InitReg(MISCREG_MDDTR_EL0)
3277 .allPrivileges();
3278 InitReg(MISCREG_MDDTRTX_EL0)
3279 .allPrivileges();
3280 InitReg(MISCREG_MDDTRRX_EL0)
3281 .allPrivileges();
3282 InitReg(MISCREG_DBGVCR32_EL2)
3283 .allPrivileges()
3284 .mapsTo(MISCREG_DBGVCR);
3285 InitReg(MISCREG_MDRAR_EL1)
3286 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0)
3287 .mapsTo(MISCREG_DBGDRAR);
3288 InitReg(MISCREG_OSLAR_EL1)
3289 .allPrivileges().monSecureRead(0).monNonSecureRead(0)
3290 .mapsTo(MISCREG_DBGOSLAR);
3291 InitReg(MISCREG_OSLSR_EL1)
3292 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0)
3293 .mapsTo(MISCREG_DBGOSLSR);
3294 InitReg(MISCREG_OSDLR_EL1)
3295 .allPrivileges()
3296 .mapsTo(MISCREG_DBGOSDLR);
3297 InitReg(MISCREG_DBGPRCR_EL1)
3298 .allPrivileges()
3299 .mapsTo(MISCREG_DBGPRCR);
3300 InitReg(MISCREG_DBGCLAIMSET_EL1)
3301 .allPrivileges()
3302 .mapsTo(MISCREG_DBGCLAIMSET);
3303 InitReg(MISCREG_DBGCLAIMCLR_EL1)
3304 .allPrivileges()
3305 .mapsTo(MISCREG_DBGCLAIMCLR);
3306 InitReg(MISCREG_DBGAUTHSTATUS_EL1)
3307 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0)
3308 .mapsTo(MISCREG_DBGAUTHSTATUS);
3309 InitReg(MISCREG_TEECR32_EL1);
3310 InitReg(MISCREG_TEEHBR32_EL1);
3311
3312 // AArch64 registers (Op0=1,3);
3313 InitReg(MISCREG_MIDR_EL1)
3314 .allPrivileges().exceptUserMode().writes(0);
3315 InitReg(MISCREG_MPIDR_EL1)
3316 .allPrivileges().exceptUserMode().writes(0);
3317 InitReg(MISCREG_REVIDR_EL1)
3318 .allPrivileges().exceptUserMode().writes(0);
3319 InitReg(MISCREG_ID_PFR0_EL1)
3320 .allPrivileges().exceptUserMode().writes(0);
3321 InitReg(MISCREG_ID_PFR1_EL1)
3322 .allPrivileges().exceptUserMode().writes(0);
3323 InitReg(MISCREG_ID_DFR0_EL1)
3324 .allPrivileges().exceptUserMode().writes(0)
3325 .mapsTo(MISCREG_ID_DFR0);
3326 InitReg(MISCREG_ID_AFR0_EL1)
3327 .allPrivileges().exceptUserMode().writes(0);
3328 InitReg(MISCREG_ID_MMFR0_EL1)
3329 .allPrivileges().exceptUserMode().writes(0);
3330 InitReg(MISCREG_ID_MMFR1_EL1)
3331 .allPrivileges().exceptUserMode().writes(0);
3332 InitReg(MISCREG_ID_MMFR2_EL1)
3333 .allPrivileges().exceptUserMode().writes(0);
3334 InitReg(MISCREG_ID_MMFR3_EL1)
3335 .allPrivileges().exceptUserMode().writes(0);
3336 InitReg(MISCREG_ID_ISAR0_EL1)
3337 .allPrivileges().exceptUserMode().writes(0);
3338 InitReg(MISCREG_ID_ISAR1_EL1)
3339 .allPrivileges().exceptUserMode().writes(0);
3340 InitReg(MISCREG_ID_ISAR2_EL1)
3341 .allPrivileges().exceptUserMode().writes(0);
3342 InitReg(MISCREG_ID_ISAR3_EL1)
3343 .allPrivileges().exceptUserMode().writes(0);
3344 InitReg(MISCREG_ID_ISAR4_EL1)
3345 .allPrivileges().exceptUserMode().writes(0);
3346 InitReg(MISCREG_ID_ISAR5_EL1)
3347 .allPrivileges().exceptUserMode().writes(0);
3348 InitReg(MISCREG_MVFR0_EL1)
3349 .allPrivileges().exceptUserMode().writes(0);
3350 InitReg(MISCREG_MVFR1_EL1)
3351 .allPrivileges().exceptUserMode().writes(0);
3352 InitReg(MISCREG_MVFR2_EL1)
3353 .allPrivileges().exceptUserMode().writes(0);
3354 InitReg(MISCREG_ID_AA64PFR0_EL1)
3355 .allPrivileges().exceptUserMode().writes(0);
3356 InitReg(MISCREG_ID_AA64PFR1_EL1)
3357 .allPrivileges().exceptUserMode().writes(0);
3358 InitReg(MISCREG_ID_AA64DFR0_EL1)
3359 .allPrivileges().exceptUserMode().writes(0);
3360 InitReg(MISCREG_ID_AA64DFR1_EL1)
3361 .allPrivileges().exceptUserMode().writes(0);
3362 InitReg(MISCREG_ID_AA64AFR0_EL1)
3363 .allPrivileges().exceptUserMode().writes(0);
3364 InitReg(MISCREG_ID_AA64AFR1_EL1)
3365 .allPrivileges().exceptUserMode().writes(0);
3366 InitReg(MISCREG_ID_AA64ISAR0_EL1)
3367 .allPrivileges().exceptUserMode().writes(0);
3368 InitReg(MISCREG_ID_AA64ISAR1_EL1)
3369 .allPrivileges().exceptUserMode().writes(0);
3370 InitReg(MISCREG_ID_AA64MMFR0_EL1)
3371 .allPrivileges().exceptUserMode().writes(0);
3372 InitReg(MISCREG_ID_AA64MMFR1_EL1)
3373 .allPrivileges().exceptUserMode().writes(0);
3374 InitReg(MISCREG_CCSIDR_EL1)
3375 .allPrivileges().exceptUserMode().writes(0);
3376 InitReg(MISCREG_CLIDR_EL1)
3377 .allPrivileges().exceptUserMode().writes(0);
3378 InitReg(MISCREG_AIDR_EL1)
3379 .allPrivileges().exceptUserMode().writes(0);
3380 InitReg(MISCREG_CSSELR_EL1)
3381 .allPrivileges().exceptUserMode()
3382 .mapsTo(MISCREG_CSSELR_NS);
3383 InitReg(MISCREG_CTR_EL0)
3384 .reads(1);
3385 InitReg(MISCREG_DCZID_EL0)
3386 .reads(1);
3387 InitReg(MISCREG_VPIDR_EL2)
3388 .hyp().mon()
3389 .mapsTo(MISCREG_VPIDR);
3390 InitReg(MISCREG_VMPIDR_EL2)
3391 .hyp().mon()
3392 .mapsTo(MISCREG_VMPIDR);
3393 InitReg(MISCREG_SCTLR_EL1)
3394 .allPrivileges().exceptUserMode()
3395 .mapsTo(MISCREG_SCTLR_NS);
3396 InitReg(MISCREG_ACTLR_EL1)
3397 .allPrivileges().exceptUserMode()
3398 .mapsTo(MISCREG_ACTLR_NS);
3399 InitReg(MISCREG_CPACR_EL1)
3400 .allPrivileges().exceptUserMode()
3401 .mapsTo(MISCREG_CPACR);
3402 InitReg(MISCREG_SCTLR_EL2)
3403 .hyp().mon()
3404 .mapsTo(MISCREG_HSCTLR);
3405 InitReg(MISCREG_ACTLR_EL2)
3406 .hyp().mon()
3407 .mapsTo(MISCREG_HACTLR);
3408 InitReg(MISCREG_HCR_EL2)
3409 .hyp().mon()
3410 .mapsTo(MISCREG_HCR /*, MISCREG_HCR2*/);
3411 InitReg(MISCREG_MDCR_EL2)
3412 .hyp().mon()
3413 .mapsTo(MISCREG_HDCR);
3414 InitReg(MISCREG_CPTR_EL2)
3415 .hyp().mon()
3416 .mapsTo(MISCREG_HCPTR);
3417 InitReg(MISCREG_HSTR_EL2)
3418 .hyp().mon()
3419 .mapsTo(MISCREG_HSTR);
3420 InitReg(MISCREG_HACR_EL2)
3421 .hyp().mon()
3422 .mapsTo(MISCREG_HACR);
3423 InitReg(MISCREG_SCTLR_EL3)
3424 .mon();
3425 InitReg(MISCREG_ACTLR_EL3)
3426 .mon();
3427 InitReg(MISCREG_SCR_EL3)
3428 .mon()
3429 .mapsTo(MISCREG_SCR); // NAM D7-2005
3430 InitReg(MISCREG_SDER32_EL3)
3431 .mon()
3432 .mapsTo(MISCREG_SDER);
3433 InitReg(MISCREG_CPTR_EL3)
3434 .mon();
3435 InitReg(MISCREG_MDCR_EL3)
3436 .mon();
3437 InitReg(MISCREG_TTBR0_EL1)
3438 .allPrivileges().exceptUserMode()
3439 .mapsTo(MISCREG_TTBR0_NS);
3440 InitReg(MISCREG_TTBR1_EL1)
3441 .allPrivileges().exceptUserMode()
3442 .mapsTo(MISCREG_TTBR1_NS);
3443 InitReg(MISCREG_TCR_EL1)
3444 .allPrivileges().exceptUserMode()
3445 .mapsTo(MISCREG_TTBCR_NS);
3446 InitReg(MISCREG_TTBR0_EL2)
3447 .hyp().mon()
3448 .mapsTo(MISCREG_HTTBR);
3449 InitReg(MISCREG_TCR_EL2)
3450 .hyp().mon()
3451 .mapsTo(MISCREG_HTCR);
3452 InitReg(MISCREG_VTTBR_EL2)
3453 .hyp().mon()
3454 .mapsTo(MISCREG_VTTBR);
3455 InitReg(MISCREG_VTCR_EL2)
3456 .hyp().mon()
3457 .mapsTo(MISCREG_VTCR);
3458 InitReg(MISCREG_TTBR0_EL3)
3459 .mon();
3460 InitReg(MISCREG_TCR_EL3)
3461 .mon();
3462 InitReg(MISCREG_DACR32_EL2)
3463 .hyp().mon()
3464 .mapsTo(MISCREG_DACR_NS);
3465 InitReg(MISCREG_SPSR_EL1)
3466 .allPrivileges().exceptUserMode()
3467 .mapsTo(MISCREG_SPSR_SVC); // NAM C5.2.17 SPSR_EL1
3468 InitReg(MISCREG_ELR_EL1)
3469 .allPrivileges().exceptUserMode();
3470 InitReg(MISCREG_SP_EL0)
3471 .allPrivileges().exceptUserMode();
3472 InitReg(MISCREG_SPSEL)
3473 .allPrivileges().exceptUserMode();
3474 InitReg(MISCREG_CURRENTEL)
3475 .allPrivileges().exceptUserMode().writes(0);
3476 InitReg(MISCREG_NZCV)
3477 .allPrivileges();
3478 InitReg(MISCREG_DAIF)
3479 .allPrivileges();
3480 InitReg(MISCREG_FPCR)
3481 .allPrivileges();
3482 InitReg(MISCREG_FPSR)
3483 .allPrivileges();
3484 InitReg(MISCREG_DSPSR_EL0)
3485 .allPrivileges();
3486 InitReg(MISCREG_DLR_EL0)
3487 .allPrivileges();
3488 InitReg(MISCREG_SPSR_EL2)
3489 .hyp().mon()
3490 .mapsTo(MISCREG_SPSR_HYP); // NAM C5.2.18 SPSR_EL2
3491 InitReg(MISCREG_ELR_EL2)
3492 .hyp().mon();
3493 InitReg(MISCREG_SP_EL1)
3494 .hyp().mon();
3495 InitReg(MISCREG_SPSR_IRQ_AA64)
3496 .hyp().mon();
3497 InitReg(MISCREG_SPSR_ABT_AA64)
3498 .hyp().mon();
3499 InitReg(MISCREG_SPSR_UND_AA64)
3500 .hyp().mon();
3501 InitReg(MISCREG_SPSR_FIQ_AA64)
3502 .hyp().mon();
3503 InitReg(MISCREG_SPSR_EL3)
3504 .mon()
3505 .mapsTo(MISCREG_SPSR_MON); // NAM C5.2.19 SPSR_EL3
3506 InitReg(MISCREG_ELR_EL3)
3507 .mon();
3508 InitReg(MISCREG_SP_EL2)
3509 .mon();
3510 InitReg(MISCREG_AFSR0_EL1)
3511 .allPrivileges().exceptUserMode()
3512 .mapsTo(MISCREG_ADFSR_NS);
3513 InitReg(MISCREG_AFSR1_EL1)
3514 .allPrivileges().exceptUserMode()
3515 .mapsTo(MISCREG_AIFSR_NS);
3516 InitReg(MISCREG_ESR_EL1)
3517 .allPrivileges().exceptUserMode();
3518 InitReg(MISCREG_IFSR32_EL2)
3519 .hyp().mon()
3520 .mapsTo(MISCREG_IFSR_NS);
3521 InitReg(MISCREG_AFSR0_EL2)
3522 .hyp().mon()
3523 .mapsTo(MISCREG_HADFSR);
3524 InitReg(MISCREG_AFSR1_EL2)
3525 .hyp().mon()
3526 .mapsTo(MISCREG_HAIFSR);
3527 InitReg(MISCREG_ESR_EL2)
3528 .hyp().mon()
3529 .mapsTo(MISCREG_HSR);
3530 InitReg(MISCREG_FPEXC32_EL2)
3531 .hyp().mon();
3532 InitReg(MISCREG_AFSR0_EL3)
3533 .mon();
3534 InitReg(MISCREG_AFSR1_EL3)
3535 .mon();
3536 InitReg(MISCREG_ESR_EL3)
3537 .mon();
3538 InitReg(MISCREG_FAR_EL1)
3539 .allPrivileges().exceptUserMode()
3540 .mapsTo(MISCREG_DFAR_NS, MISCREG_IFAR_NS);
3541 InitReg(MISCREG_FAR_EL2)
3542 .hyp().mon()
3543 .mapsTo(MISCREG_HDFAR, MISCREG_HIFAR);
3544 InitReg(MISCREG_HPFAR_EL2)
3545 .hyp().mon()
3546 .mapsTo(MISCREG_HPFAR);
3547 InitReg(MISCREG_FAR_EL3)
3548 .mon();
3549 InitReg(MISCREG_IC_IALLUIS)
3550 .warnNotFail()
3551 .writes(1).exceptUserMode();
3552 InitReg(MISCREG_PAR_EL1)
3553 .allPrivileges().exceptUserMode()
3554 .mapsTo(MISCREG_PAR_NS);
3555 InitReg(MISCREG_IC_IALLU)
3556 .warnNotFail()
3557 .writes(1).exceptUserMode();
3558 InitReg(MISCREG_DC_IVAC_Xt)
3559 .warnNotFail()
3560 .writes(1);
3561 InitReg(MISCREG_DC_ISW_Xt)
3562 .warnNotFail()
3563 .writes(1).exceptUserMode();
3564 InitReg(MISCREG_AT_S1E1R_Xt)
3565 .writes(1).exceptUserMode();
3566 InitReg(MISCREG_AT_S1E1W_Xt)
3567 .writes(1).exceptUserMode();
3568 InitReg(MISCREG_AT_S1E0R_Xt)
3569 .writes(1).exceptUserMode();
3570 InitReg(MISCREG_AT_S1E0W_Xt)
3571 .writes(1).exceptUserMode();
3572 InitReg(MISCREG_DC_CSW_Xt)
3573 .warnNotFail()
3574 .writes(1).exceptUserMode();
3575 InitReg(MISCREG_DC_CISW_Xt)
3576 .warnNotFail()
3577 .writes(1).exceptUserMode();
3578 InitReg(MISCREG_DC_ZVA_Xt)
3579 .warnNotFail()
3580 .writes(1).userSecureWrite(0);
3581 InitReg(MISCREG_IC_IVAU_Xt)
3582 .writes(1);
3583 InitReg(MISCREG_DC_CVAC_Xt)
3584 .warnNotFail()
3585 .writes(1);
3586 InitReg(MISCREG_DC_CVAU_Xt)
3587 .warnNotFail()
3588 .writes(1);
3589 InitReg(MISCREG_DC_CIVAC_Xt)
3590 .warnNotFail()
3591 .writes(1);
3592 InitReg(MISCREG_AT_S1E2R_Xt)
3593 .monNonSecureWrite().hypWrite();
3594 InitReg(MISCREG_AT_S1E2W_Xt)
3595 .monNonSecureWrite().hypWrite();
3596 InitReg(MISCREG_AT_S12E1R_Xt)
3597 .hypWrite().monSecureWrite().monNonSecureWrite();
3598 InitReg(MISCREG_AT_S12E1W_Xt)
3599 .hypWrite().monSecureWrite().monNonSecureWrite();
3600 InitReg(MISCREG_AT_S12E0R_Xt)
3601 .hypWrite().monSecureWrite().monNonSecureWrite();
3602 InitReg(MISCREG_AT_S12E0W_Xt)
3603 .hypWrite().monSecureWrite().monNonSecureWrite();
3604 InitReg(MISCREG_AT_S1E3R_Xt)
3605 .monSecureWrite().monNonSecureWrite();
3606 InitReg(MISCREG_AT_S1E3W_Xt)
3607 .monSecureWrite().monNonSecureWrite();
3608 InitReg(MISCREG_TLBI_VMALLE1IS)
3609 .writes(1).exceptUserMode();
3610 InitReg(MISCREG_TLBI_VAE1IS_Xt)
3611 .writes(1).exceptUserMode();
3612 InitReg(MISCREG_TLBI_ASIDE1IS_Xt)
3613 .writes(1).exceptUserMode();
3614 InitReg(MISCREG_TLBI_VAAE1IS_Xt)
3615 .writes(1).exceptUserMode();
3616 InitReg(MISCREG_TLBI_VALE1IS_Xt)
3617 .writes(1).exceptUserMode();
3618 InitReg(MISCREG_TLBI_VAALE1IS_Xt)
3619 .writes(1).exceptUserMode();
3620 InitReg(MISCREG_TLBI_VMALLE1)
3621 .writes(1).exceptUserMode();
3622 InitReg(MISCREG_TLBI_VAE1_Xt)
3623 .writes(1).exceptUserMode();
3624 InitReg(MISCREG_TLBI_ASIDE1_Xt)
3625 .writes(1).exceptUserMode();
3626 InitReg(MISCREG_TLBI_VAAE1_Xt)
3627 .writes(1).exceptUserMode();
3628 InitReg(MISCREG_TLBI_VALE1_Xt)
3629 .writes(1).exceptUserMode();
3630 InitReg(MISCREG_TLBI_VAALE1_Xt)
3631 .writes(1).exceptUserMode();
3632 InitReg(MISCREG_TLBI_IPAS2E1IS_Xt)
3633 .hypWrite().monSecureWrite().monNonSecureWrite();
3634 InitReg(MISCREG_TLBI_IPAS2LE1IS_Xt)
3635 .hypWrite().monSecureWrite().monNonSecureWrite();
3636 InitReg(MISCREG_TLBI_ALLE2IS)
3637 .monNonSecureWrite().hypWrite();
3638 InitReg(MISCREG_TLBI_VAE2IS_Xt)
3639 .monNonSecureWrite().hypWrite();
3640 InitReg(MISCREG_TLBI_ALLE1IS)
3641 .hypWrite().monSecureWrite().monNonSecureWrite();
3642 InitReg(MISCREG_TLBI_VALE2IS_Xt)
3643 .monNonSecureWrite().hypWrite();
3644 InitReg(MISCREG_TLBI_VMALLS12E1IS)
3645 .hypWrite().monSecureWrite().monNonSecureWrite();
3646 InitReg(MISCREG_TLBI_IPAS2E1_Xt)
3647 .hypWrite().monSecureWrite().monNonSecureWrite();
3648 InitReg(MISCREG_TLBI_IPAS2LE1_Xt)
3649 .hypWrite().monSecureWrite().monNonSecureWrite();
3650 InitReg(MISCREG_TLBI_ALLE2)
3651 .monNonSecureWrite().hypWrite();
3652 InitReg(MISCREG_TLBI_VAE2_Xt)
3653 .monNonSecureWrite().hypWrite();
3654 InitReg(MISCREG_TLBI_ALLE1)
3655 .hypWrite().monSecureWrite().monNonSecureWrite();
3656 InitReg(MISCREG_TLBI_VALE2_Xt)
3657 .monNonSecureWrite().hypWrite();
3658 InitReg(MISCREG_TLBI_VMALLS12E1)
3659 .hypWrite().monSecureWrite().monNonSecureWrite();
3660 InitReg(MISCREG_TLBI_ALLE3IS)
3661 .monSecureWrite().monNonSecureWrite();
3662 InitReg(MISCREG_TLBI_VAE3IS_Xt)
3663 .monSecureWrite().monNonSecureWrite();
3664 InitReg(MISCREG_TLBI_VALE3IS_Xt)
3665 .monSecureWrite().monNonSecureWrite();
3666 InitReg(MISCREG_TLBI_ALLE3)
3667 .monSecureWrite().monNonSecureWrite();
3668 InitReg(MISCREG_TLBI_VAE3_Xt)
3669 .monSecureWrite().monNonSecureWrite();
3670 InitReg(MISCREG_TLBI_VALE3_Xt)
3671 .monSecureWrite().monNonSecureWrite();
3672 InitReg(MISCREG_PMINTENSET_EL1)
3673 .allPrivileges().exceptUserMode()
3674 .mapsTo(MISCREG_PMINTENSET);
3675 InitReg(MISCREG_PMINTENCLR_EL1)
3676 .allPrivileges().exceptUserMode()
3677 .mapsTo(MISCREG_PMINTENCLR);
3678 InitReg(MISCREG_PMCR_EL0)
3679 .allPrivileges()
3680 .mapsTo(MISCREG_PMCR);
3681 InitReg(MISCREG_PMCNTENSET_EL0)
3682 .allPrivileges()
3683 .mapsTo(MISCREG_PMCNTENSET);
3684 InitReg(MISCREG_PMCNTENCLR_EL0)
3685 .allPrivileges()
3686 .mapsTo(MISCREG_PMCNTENCLR);
3687 InitReg(MISCREG_PMOVSCLR_EL0)
3688 .allPrivileges();
3689// .mapsTo(MISCREG_PMOVSCLR);
3690 InitReg(MISCREG_PMSWINC_EL0)
3691 .writes(1).user()
3692 .mapsTo(MISCREG_PMSWINC);
3693 InitReg(MISCREG_PMSELR_EL0)
3694 .allPrivileges()
3695 .mapsTo(MISCREG_PMSELR);
3696 InitReg(MISCREG_PMCEID0_EL0)
3697 .reads(1).user()
3698 .mapsTo(MISCREG_PMCEID0);
3699 InitReg(MISCREG_PMCEID1_EL0)
3700 .reads(1).user()
3701 .mapsTo(MISCREG_PMCEID1);
3702 InitReg(MISCREG_PMCCNTR_EL0)
3703 .allPrivileges()
3704 .mapsTo(MISCREG_PMCCNTR);
3705 InitReg(MISCREG_PMXEVTYPER_EL0)
3706 .allPrivileges()
3707 .mapsTo(MISCREG_PMXEVTYPER);
3708 InitReg(MISCREG_PMCCFILTR_EL0)
3709 .allPrivileges();
3710 InitReg(MISCREG_PMXEVCNTR_EL0)
3711 .allPrivileges()
3712 .mapsTo(MISCREG_PMXEVCNTR);
3713 InitReg(MISCREG_PMUSERENR_EL0)
3714 .allPrivileges().userNonSecureWrite(0).userSecureWrite(0)
3715 .mapsTo(MISCREG_PMUSERENR);
3716 InitReg(MISCREG_PMOVSSET_EL0)
3717 .allPrivileges()
3718 .mapsTo(MISCREG_PMOVSSET);
3719 InitReg(MISCREG_MAIR_EL1)
3720 .allPrivileges().exceptUserMode()
3721 .mapsTo(MISCREG_PRRR_NS, MISCREG_NMRR_NS);
3722 InitReg(MISCREG_AMAIR_EL1)
3723 .allPrivileges().exceptUserMode()
3724 .mapsTo(MISCREG_AMAIR0_NS, MISCREG_AMAIR1_NS);
3725 InitReg(MISCREG_MAIR_EL2)
3726 .hyp().mon()
3727 .mapsTo(MISCREG_HMAIR0, MISCREG_HMAIR1);
3728 InitReg(MISCREG_AMAIR_EL2)
3729 .hyp().mon()
3730 .mapsTo(MISCREG_HAMAIR0, MISCREG_HAMAIR1);
3731 InitReg(MISCREG_MAIR_EL3)
3732 .mon();
3733 InitReg(MISCREG_AMAIR_EL3)
3734 .mon();
3735 InitReg(MISCREG_L2CTLR_EL1)
3736 .allPrivileges().exceptUserMode();
3737 InitReg(MISCREG_L2ECTLR_EL1)
3738 .allPrivileges().exceptUserMode();
3739 InitReg(MISCREG_VBAR_EL1)
3740 .allPrivileges().exceptUserMode()
3741 .mapsTo(MISCREG_VBAR_NS);
3742 InitReg(MISCREG_RVBAR_EL1)
3743 .allPrivileges().exceptUserMode().writes(0);
3744 InitReg(MISCREG_ISR_EL1)
3745 .allPrivileges().exceptUserMode().writes(0);
3746 InitReg(MISCREG_VBAR_EL2)
3747 .hyp().mon()
3748 .mapsTo(MISCREG_HVBAR);
3749 InitReg(MISCREG_RVBAR_EL2)
3750 .mon().hyp().writes(0);
3751 InitReg(MISCREG_VBAR_EL3)
3752 .mon();
3753 InitReg(MISCREG_RVBAR_EL3)
3754 .mon().writes(0);
3755 InitReg(MISCREG_RMR_EL3)
3756 .mon();
3757 InitReg(MISCREG_CONTEXTIDR_EL1)
3758 .allPrivileges().exceptUserMode()
3759 .mapsTo(MISCREG_CONTEXTIDR_NS);
3760 InitReg(MISCREG_TPIDR_EL1)
3761 .allPrivileges().exceptUserMode()
3762 .mapsTo(MISCREG_TPIDRPRW_NS);
3763 InitReg(MISCREG_TPIDR_EL0)
3764 .allPrivileges()
3765 .mapsTo(MISCREG_TPIDRURW_NS);
3766 InitReg(MISCREG_TPIDRRO_EL0)
3767 .allPrivileges().userNonSecureWrite(0).userSecureWrite(0)
3768 .mapsTo(MISCREG_TPIDRURO_NS);
3769 InitReg(MISCREG_TPIDR_EL2)
3770 .hyp().mon()
3771 .mapsTo(MISCREG_HTPIDR);
3772 InitReg(MISCREG_TPIDR_EL3)
3773 .mon();
3774 InitReg(MISCREG_CNTKCTL_EL1)
3775 .allPrivileges().exceptUserMode()
3776 .mapsTo(MISCREG_CNTKCTL);
3777 InitReg(MISCREG_CNTFRQ_EL0)
3778 .reads(1).mon()
3779 .mapsTo(MISCREG_CNTFRQ);
3780 InitReg(MISCREG_CNTPCT_EL0)
3781 .reads(1)
3782 .mapsTo(MISCREG_CNTPCT); /* 64b */
3783 InitReg(MISCREG_CNTVCT_EL0)
3784 .unverifiable()
3785 .reads(1)
3786 .mapsTo(MISCREG_CNTVCT); /* 64b */
3787 InitReg(MISCREG_CNTP_TVAL_EL0)
3788 .allPrivileges()
3789 .mapsTo(MISCREG_CNTP_TVAL_NS);
3790 InitReg(MISCREG_CNTP_CTL_EL0)
3791 .allPrivileges()
3792 .mapsTo(MISCREG_CNTP_CTL_NS);
3793 InitReg(MISCREG_CNTP_CVAL_EL0)
3794 .allPrivileges()
3795 .mapsTo(MISCREG_CNTP_CVAL_NS); /* 64b */
3796 InitReg(MISCREG_CNTV_TVAL_EL0)
3797 .allPrivileges()
3798 .mapsTo(MISCREG_CNTV_TVAL);
3799 InitReg(MISCREG_CNTV_CTL_EL0)
3800 .allPrivileges()
3801 .mapsTo(MISCREG_CNTV_CTL);
3802 InitReg(MISCREG_CNTV_CVAL_EL0)
3803 .allPrivileges()
3804 .mapsTo(MISCREG_CNTV_CVAL); /* 64b */
3805 InitReg(MISCREG_PMEVCNTR0_EL0)
3806 .allPrivileges();
3807// .mapsTo(MISCREG_PMEVCNTR0);
3808 InitReg(MISCREG_PMEVCNTR1_EL0)
3809 .allPrivileges();
3810// .mapsTo(MISCREG_PMEVCNTR1);
3811 InitReg(MISCREG_PMEVCNTR2_EL0)
3812 .allPrivileges();
3813// .mapsTo(MISCREG_PMEVCNTR2);
3814 InitReg(MISCREG_PMEVCNTR3_EL0)
3815 .allPrivileges();
3816// .mapsTo(MISCREG_PMEVCNTR3);
3817 InitReg(MISCREG_PMEVCNTR4_EL0)
3818 .allPrivileges();
3819// .mapsTo(MISCREG_PMEVCNTR4);
3820 InitReg(MISCREG_PMEVCNTR5_EL0)
3821 .allPrivileges();
3822// .mapsTo(MISCREG_PMEVCNTR5);
3823 InitReg(MISCREG_PMEVTYPER0_EL0)
3824 .allPrivileges();
3825// .mapsTo(MISCREG_PMEVTYPER0);
3826 InitReg(MISCREG_PMEVTYPER1_EL0)
3827 .allPrivileges();
3828// .mapsTo(MISCREG_PMEVTYPER1);
3829 InitReg(MISCREG_PMEVTYPER2_EL0)
3830 .allPrivileges();
3831// .mapsTo(MISCREG_PMEVTYPER2);
3832 InitReg(MISCREG_PMEVTYPER3_EL0)
3833 .allPrivileges();
3834// .mapsTo(MISCREG_PMEVTYPER3);
3835 InitReg(MISCREG_PMEVTYPER4_EL0)
3836 .allPrivileges();
3837// .mapsTo(MISCREG_PMEVTYPER4);
3838 InitReg(MISCREG_PMEVTYPER5_EL0)
3839 .allPrivileges();
3840// .mapsTo(MISCREG_PMEVTYPER5);
3841 InitReg(MISCREG_CNTVOFF_EL2)
3842 .hyp().mon()
3843 .mapsTo(MISCREG_CNTVOFF); /* 64b */
3844 InitReg(MISCREG_CNTHCTL_EL2)
3845 .unimplemented()
3846 .warnNotFail()
3847 .mon().monNonSecureWrite(0).hypWrite()
3848 .mapsTo(MISCREG_CNTHCTL);
3849 InitReg(MISCREG_CNTHP_TVAL_EL2)
3850 .unimplemented()
3851 .mon().monNonSecureWrite(0).hypWrite()
3852 .mapsTo(MISCREG_CNTHP_TVAL);
3853 InitReg(MISCREG_CNTHP_CTL_EL2)
3854 .unimplemented()
3855 .mon().monNonSecureWrite(0).hypWrite()
3856 .mapsTo(MISCREG_CNTHP_CTL);
3857 InitReg(MISCREG_CNTHP_CVAL_EL2)
3858 .unimplemented()
3859 .mon().monNonSecureWrite(0).hypWrite()
3860 .mapsTo(MISCREG_CNTHP_CVAL); /* 64b */
3861 InitReg(MISCREG_CNTPS_TVAL_EL1)
3862 .unimplemented()
3863 .mon().monNonSecureWrite(0).hypWrite();
3864 InitReg(MISCREG_CNTPS_CTL_EL1)
3865 .unimplemented()
3866 .mon().monNonSecureWrite(0).hypWrite();
3867 InitReg(MISCREG_CNTPS_CVAL_EL1)
3868 .unimplemented()
3869 .mon().monNonSecureWrite(0).hypWrite();
3870 InitReg(MISCREG_IL1DATA0_EL1)
3871 .allPrivileges().exceptUserMode();
3872 InitReg(MISCREG_IL1DATA1_EL1)
3873 .allPrivileges().exceptUserMode();
3874 InitReg(MISCREG_IL1DATA2_EL1)
3875 .allPrivileges().exceptUserMode();
3876 InitReg(MISCREG_IL1DATA3_EL1)
3877 .allPrivileges().exceptUserMode();
3878 InitReg(MISCREG_DL1DATA0_EL1)
3879 .allPrivileges().exceptUserMode();
3880 InitReg(MISCREG_DL1DATA1_EL1)
3881 .allPrivileges().exceptUserMode();
3882 InitReg(MISCREG_DL1DATA2_EL1)
3883 .allPrivileges().exceptUserMode();
3884 InitReg(MISCREG_DL1DATA3_EL1)
3885 .allPrivileges().exceptUserMode();
3886 InitReg(MISCREG_DL1DATA4_EL1)
3887 .allPrivileges().exceptUserMode();
3888 InitReg(MISCREG_L2ACTLR_EL1)
3889 .allPrivileges().exceptUserMode();
3890 InitReg(MISCREG_CPUACTLR_EL1)
3891 .allPrivileges().exceptUserMode();
3892 InitReg(MISCREG_CPUECTLR_EL1)
3893 .allPrivileges().exceptUserMode();
3894 InitReg(MISCREG_CPUMERRSR_EL1)
3895 .allPrivileges().exceptUserMode();
3896 InitReg(MISCREG_L2MERRSR_EL1)
3897 .unimplemented()
3898 .warnNotFail()
3899 .allPrivileges().exceptUserMode();
3900 InitReg(MISCREG_CBAR_EL1)
3901 .allPrivileges().exceptUserMode().writes(0);
3902 InitReg(MISCREG_CONTEXTIDR_EL2)
3903 .mon().hyp();
3904
3905 // Dummy registers
3906 InitReg(MISCREG_NOP)
3907 .allPrivileges();
3908 InitReg(MISCREG_RAZ)
3909 .allPrivileges().exceptUserMode().writes(0);
3910 InitReg(MISCREG_CP14_UNIMPL)
3911 .unimplemented()
3912 .warnNotFail();
3913 InitReg(MISCREG_CP15_UNIMPL)
3914 .unimplemented()
3915 .warnNotFail();
3916 InitReg(MISCREG_A64_UNIMPL)
3917 .unimplemented()
3918 .warnNotFail();
3919 InitReg(MISCREG_UNKNOWN);
3920
3921 // Register mappings for some unimplemented registers:
3922 // ESR_EL1 -> DFSR
3923 // RMR_EL1 -> RMR
3924 // RMR_EL2 -> HRMR
3925 // DBGDTR_EL0 -> DBGDTR{R or T}Xint
3926 // DBGDTRRX_EL0 -> DBGDTRRXint
3927 // DBGDTRTX_EL0 -> DBGDTRRXint
3928 // MDCR_EL3 -> SDCR, NAM D7-2108 (the latter is unimpl. in gem5)
3929
3930 completed = true;
3931}
3932
3933} // namespace ArmISA