gem5  v19.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
miscregs.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2010-2013, 2015-2020 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 
51 namespace ArmISA
52 {
53 
55 decodeCP14Reg(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 
129 using namespace std;
130 
132 decodeCP15Reg(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 4:
261  return MISCREG_HCR2;
262  case 3:
263  return MISCREG_HSTR;
264  case 7:
265  return MISCREG_HACR;
266  }
267  }
268  }
269  break;
270  case 2:
271  if (opc1 == 0 && crm == 0) {
272  switch (opc2) {
273  case 0:
274  return MISCREG_TTBR0;
275  case 1:
276  return MISCREG_TTBR1;
277  case 2:
278  return MISCREG_TTBCR;
279  }
280  } else if (opc1 == 4) {
281  if (crm == 0 && opc2 == 2)
282  return MISCREG_HTCR;
283  else if (crm == 1 && opc2 == 2)
284  return MISCREG_VTCR;
285  }
286  break;
287  case 3:
288  if (opc1 == 0 && crm == 0 && opc2 == 0) {
289  return MISCREG_DACR;
290  }
291  break;
292  case 4:
293  if (opc1 == 0 && crm == 6 && opc2 == 0) {
294  return MISCREG_ICC_PMR;
295  }
296  break;
297  case 5:
298  if (opc1 == 0) {
299  if (crm == 0) {
300  if (opc2 == 0) {
301  return MISCREG_DFSR;
302  } else if (opc2 == 1) {
303  return MISCREG_IFSR;
304  }
305  } else if (crm == 1) {
306  if (opc2 == 0) {
307  return MISCREG_ADFSR;
308  } else if (opc2 == 1) {
309  return MISCREG_AIFSR;
310  }
311  }
312  } else if (opc1 == 4) {
313  if (crm == 1) {
314  if (opc2 == 0)
315  return MISCREG_HADFSR;
316  else if (opc2 == 1)
317  return MISCREG_HAIFSR;
318  } else if (crm == 2 && opc2 == 0) {
319  return MISCREG_HSR;
320  }
321  }
322  break;
323  case 6:
324  if (opc1 == 0 && crm == 0) {
325  switch (opc2) {
326  case 0:
327  return MISCREG_DFAR;
328  case 2:
329  return MISCREG_IFAR;
330  }
331  } else if (opc1 == 4 && crm == 0) {
332  switch (opc2) {
333  case 0:
334  return MISCREG_HDFAR;
335  case 2:
336  return MISCREG_HIFAR;
337  case 4:
338  return MISCREG_HPFAR;
339  }
340  }
341  break;
342  case 7:
343  if (opc1 == 0) {
344  switch (crm) {
345  case 0:
346  if (opc2 == 4) {
347  return MISCREG_NOP;
348  }
349  break;
350  case 1:
351  switch (opc2) {
352  case 0:
353  return MISCREG_ICIALLUIS;
354  case 6:
355  return MISCREG_BPIALLIS;
356  }
357  break;
358  case 4:
359  if (opc2 == 0) {
360  return MISCREG_PAR;
361  }
362  break;
363  case 5:
364  switch (opc2) {
365  case 0:
366  return MISCREG_ICIALLU;
367  case 1:
368  return MISCREG_ICIMVAU;
369  case 4:
370  return MISCREG_CP15ISB;
371  case 6:
372  return MISCREG_BPIALL;
373  case 7:
374  return MISCREG_BPIMVA;
375  }
376  break;
377  case 6:
378  if (opc2 == 1) {
379  return MISCREG_DCIMVAC;
380  } else if (opc2 == 2) {
381  return MISCREG_DCISW;
382  }
383  break;
384  case 8:
385  switch (opc2) {
386  case 0:
387  return MISCREG_ATS1CPR;
388  case 1:
389  return MISCREG_ATS1CPW;
390  case 2:
391  return MISCREG_ATS1CUR;
392  case 3:
393  return MISCREG_ATS1CUW;
394  case 4:
395  return MISCREG_ATS12NSOPR;
396  case 5:
397  return MISCREG_ATS12NSOPW;
398  case 6:
399  return MISCREG_ATS12NSOUR;
400  case 7:
401  return MISCREG_ATS12NSOUW;
402  }
403  break;
404  case 10:
405  switch (opc2) {
406  case 1:
407  return MISCREG_DCCMVAC;
408  case 2:
409  return MISCREG_DCCSW;
410  case 4:
411  return MISCREG_CP15DSB;
412  case 5:
413  return MISCREG_CP15DMB;
414  }
415  break;
416  case 11:
417  if (opc2 == 1) {
418  return MISCREG_DCCMVAU;
419  }
420  break;
421  case 13:
422  if (opc2 == 1) {
423  return MISCREG_NOP;
424  }
425  break;
426  case 14:
427  if (opc2 == 1) {
428  return MISCREG_DCCIMVAC;
429  } else if (opc2 == 2) {
430  return MISCREG_DCCISW;
431  }
432  break;
433  }
434  } else if (opc1 == 4 && crm == 8) {
435  if (opc2 == 0)
436  return MISCREG_ATS1HR;
437  else if (opc2 == 1)
438  return MISCREG_ATS1HW;
439  }
440  break;
441  case 8:
442  if (opc1 == 0) {
443  switch (crm) {
444  case 3:
445  switch (opc2) {
446  case 0:
447  return MISCREG_TLBIALLIS;
448  case 1:
449  return MISCREG_TLBIMVAIS;
450  case 2:
451  return MISCREG_TLBIASIDIS;
452  case 3:
453  return MISCREG_TLBIMVAAIS;
454  case 5:
455  return MISCREG_TLBIMVALIS;
456  case 7:
457  return MISCREG_TLBIMVAALIS;
458  }
459  break;
460  case 5:
461  switch (opc2) {
462  case 0:
463  return MISCREG_ITLBIALL;
464  case 1:
465  return MISCREG_ITLBIMVA;
466  case 2:
467  return MISCREG_ITLBIASID;
468  }
469  break;
470  case 6:
471  switch (opc2) {
472  case 0:
473  return MISCREG_DTLBIALL;
474  case 1:
475  return MISCREG_DTLBIMVA;
476  case 2:
477  return MISCREG_DTLBIASID;
478  }
479  break;
480  case 7:
481  switch (opc2) {
482  case 0:
483  return MISCREG_TLBIALL;
484  case 1:
485  return MISCREG_TLBIMVA;
486  case 2:
487  return MISCREG_TLBIASID;
488  case 3:
489  return MISCREG_TLBIMVAA;
490  case 5:
491  return MISCREG_TLBIMVAL;
492  case 7:
493  return MISCREG_TLBIMVAAL;
494  }
495  break;
496  }
497  } else if (opc1 == 4) {
498  if (crm == 0) {
499  switch (opc2) {
500  case 1:
501  return MISCREG_TLBIIPAS2IS;
502  case 5:
503  return MISCREG_TLBIIPAS2LIS;
504  }
505  } else if (crm == 3) {
506  switch (opc2) {
507  case 0:
508  return MISCREG_TLBIALLHIS;
509  case 1:
510  return MISCREG_TLBIMVAHIS;
511  case 4:
512  return MISCREG_TLBIALLNSNHIS;
513  case 5:
514  return MISCREG_TLBIMVALHIS;
515  }
516  } else if (crm == 4) {
517  switch (opc2) {
518  case 1:
519  return MISCREG_TLBIIPAS2;
520  case 5:
521  return MISCREG_TLBIIPAS2L;
522  }
523  } else if (crm == 7) {
524  switch (opc2) {
525  case 0:
526  return MISCREG_TLBIALLH;
527  case 1:
528  return MISCREG_TLBIMVAH;
529  case 4:
530  return MISCREG_TLBIALLNSNH;
531  case 5:
532  return MISCREG_TLBIMVALH;
533  }
534  }
535  }
536  break;
537  case 9:
538  // Every cop register with CRn = 9 and CRm in
539  // {0-2}, {5-8} is implementation defined regardless
540  // of opc1 and opc2.
541  switch (crm) {
542  case 0:
543  case 1:
544  case 2:
545  case 5:
546  case 6:
547  case 7:
548  case 8:
549  return MISCREG_IMPDEF_UNIMPL;
550  }
551  if (opc1 == 0) {
552  switch (crm) {
553  case 12:
554  switch (opc2) {
555  case 0:
556  return MISCREG_PMCR;
557  case 1:
558  return MISCREG_PMCNTENSET;
559  case 2:
560  return MISCREG_PMCNTENCLR;
561  case 3:
562  return MISCREG_PMOVSR;
563  case 4:
564  return MISCREG_PMSWINC;
565  case 5:
566  return MISCREG_PMSELR;
567  case 6:
568  return MISCREG_PMCEID0;
569  case 7:
570  return MISCREG_PMCEID1;
571  }
572  break;
573  case 13:
574  switch (opc2) {
575  case 0:
576  return MISCREG_PMCCNTR;
577  case 1:
578  // Selector is PMSELR.SEL
580  case 2:
581  return MISCREG_PMXEVCNTR;
582  }
583  break;
584  case 14:
585  switch (opc2) {
586  case 0:
587  return MISCREG_PMUSERENR;
588  case 1:
589  return MISCREG_PMINTENSET;
590  case 2:
591  return MISCREG_PMINTENCLR;
592  case 3:
593  return MISCREG_PMOVSSET;
594  }
595  break;
596  }
597  } else if (opc1 == 1) {
598  switch (crm) {
599  case 0:
600  switch (opc2) {
601  case 2: // L2CTLR, L2 Control Register
602  return MISCREG_L2CTLR;
603  case 3:
604  return MISCREG_L2ECTLR;
605  }
606  break;
607  break;
608  }
609  }
610  break;
611  case 10:
612  if (opc1 == 0) {
613  // crm 0, 1, 4, and 8, with op2 0 - 7, reserved for TLB lockdown
614  if (crm < 2) {
615  return MISCREG_IMPDEF_UNIMPL;
616  } else if (crm == 2) { // TEX Remap Registers
617  if (opc2 == 0) {
618  // Selector is TTBCR.EAE
619  return MISCREG_PRRR_MAIR0;
620  } else if (opc2 == 1) {
621  // Selector is TTBCR.EAE
622  return MISCREG_NMRR_MAIR1;
623  }
624  } else if (crm == 3) {
625  if (opc2 == 0) {
626  return MISCREG_AMAIR0;
627  } else if (opc2 == 1) {
628  return MISCREG_AMAIR1;
629  }
630  }
631  } else if (opc1 == 4) {
632  // crm 0, 1, 4, and 8, with op2 0 - 7, reserved for TLB lockdown
633  if (crm == 2) {
634  if (opc2 == 0)
635  return MISCREG_HMAIR0;
636  else if (opc2 == 1)
637  return MISCREG_HMAIR1;
638  } else if (crm == 3) {
639  if (opc2 == 0)
640  return MISCREG_HAMAIR0;
641  else if (opc2 == 1)
642  return MISCREG_HAMAIR1;
643  }
644  }
645  break;
646  case 11:
647  if (opc1 <=7) {
648  switch (crm) {
649  case 0:
650  case 1:
651  case 2:
652  case 3:
653  case 4:
654  case 5:
655  case 6:
656  case 7:
657  case 8:
658  case 15:
659  // Reserved for DMA operations for TCM access
660  return MISCREG_IMPDEF_UNIMPL;
661  default:
662  break;
663  }
664  }
665  break;
666  case 12:
667  if (opc1 == 0) {
668  if (crm == 0) {
669  if (opc2 == 0) {
670  return MISCREG_VBAR;
671  } else if (opc2 == 1) {
672  return MISCREG_MVBAR;
673  }
674  } else if (crm == 1) {
675  if (opc2 == 0) {
676  return MISCREG_ISR;
677  }
678  } else if (crm == 8) {
679  switch (opc2) {
680  case 0:
681  return MISCREG_ICC_IAR0;
682  case 1:
683  return MISCREG_ICC_EOIR0;
684  case 2:
685  return MISCREG_ICC_HPPIR0;
686  case 3:
687  return MISCREG_ICC_BPR0;
688  case 4:
689  return MISCREG_ICC_AP0R0;
690  case 5:
691  return MISCREG_ICC_AP0R1;
692  case 6:
693  return MISCREG_ICC_AP0R2;
694  case 7:
695  return MISCREG_ICC_AP0R3;
696  }
697  } else if (crm == 9) {
698  switch (opc2) {
699  case 0:
700  return MISCREG_ICC_AP1R0;
701  case 1:
702  return MISCREG_ICC_AP1R1;
703  case 2:
704  return MISCREG_ICC_AP1R2;
705  case 3:
706  return MISCREG_ICC_AP1R3;
707  }
708  } else if (crm == 11) {
709  switch (opc2) {
710  case 1:
711  return MISCREG_ICC_DIR;
712  case 3:
713  return MISCREG_ICC_RPR;
714  }
715  } else if (crm == 12) {
716  switch (opc2) {
717  case 0:
718  return MISCREG_ICC_IAR1;
719  case 1:
720  return MISCREG_ICC_EOIR1;
721  case 2:
722  return MISCREG_ICC_HPPIR1;
723  case 3:
724  return MISCREG_ICC_BPR1;
725  case 4:
726  return MISCREG_ICC_CTLR;
727  case 5:
728  return MISCREG_ICC_SRE;
729  case 6:
730  return MISCREG_ICC_IGRPEN0;
731  case 7:
732  return MISCREG_ICC_IGRPEN1;
733  }
734  }
735  } else if (opc1 == 4) {
736  if (crm == 0 && opc2 == 0) {
737  return MISCREG_HVBAR;
738  } else if (crm == 8) {
739  switch (opc2) {
740  case 0:
741  return MISCREG_ICH_AP0R0;
742  case 1:
743  return MISCREG_ICH_AP0R1;
744  case 2:
745  return MISCREG_ICH_AP0R2;
746  case 3:
747  return MISCREG_ICH_AP0R3;
748  }
749  } else if (crm == 9) {
750  switch (opc2) {
751  case 0:
752  return MISCREG_ICH_AP1R0;
753  case 1:
754  return MISCREG_ICH_AP1R1;
755  case 2:
756  return MISCREG_ICH_AP1R2;
757  case 3:
758  return MISCREG_ICH_AP1R3;
759  case 5:
760  return MISCREG_ICC_HSRE;
761  }
762  } else if (crm == 11) {
763  switch (opc2) {
764  case 0:
765  return MISCREG_ICH_HCR;
766  case 1:
767  return MISCREG_ICH_VTR;
768  case 2:
769  return MISCREG_ICH_MISR;
770  case 3:
771  return MISCREG_ICH_EISR;
772  case 5:
773  return MISCREG_ICH_ELRSR;
774  case 7:
775  return MISCREG_ICH_VMCR;
776  }
777  } else if (crm == 12) {
778  switch (opc2) {
779  case 0:
780  return MISCREG_ICH_LR0;
781  case 1:
782  return MISCREG_ICH_LR1;
783  case 2:
784  return MISCREG_ICH_LR2;
785  case 3:
786  return MISCREG_ICH_LR3;
787  case 4:
788  return MISCREG_ICH_LR4;
789  case 5:
790  return MISCREG_ICH_LR5;
791  case 6:
792  return MISCREG_ICH_LR6;
793  case 7:
794  return MISCREG_ICH_LR7;
795  }
796  } else if (crm == 13) {
797  switch (opc2) {
798  case 0:
799  return MISCREG_ICH_LR8;
800  case 1:
801  return MISCREG_ICH_LR9;
802  case 2:
803  return MISCREG_ICH_LR10;
804  case 3:
805  return MISCREG_ICH_LR11;
806  case 4:
807  return MISCREG_ICH_LR12;
808  case 5:
809  return MISCREG_ICH_LR13;
810  case 6:
811  return MISCREG_ICH_LR14;
812  case 7:
813  return MISCREG_ICH_LR15;
814  }
815  } else if (crm == 14) {
816  switch (opc2) {
817  case 0:
818  return MISCREG_ICH_LRC0;
819  case 1:
820  return MISCREG_ICH_LRC1;
821  case 2:
822  return MISCREG_ICH_LRC2;
823  case 3:
824  return MISCREG_ICH_LRC3;
825  case 4:
826  return MISCREG_ICH_LRC4;
827  case 5:
828  return MISCREG_ICH_LRC5;
829  case 6:
830  return MISCREG_ICH_LRC6;
831  case 7:
832  return MISCREG_ICH_LRC7;
833  }
834  } else if (crm == 15) {
835  switch (opc2) {
836  case 0:
837  return MISCREG_ICH_LRC8;
838  case 1:
839  return MISCREG_ICH_LRC9;
840  case 2:
841  return MISCREG_ICH_LRC10;
842  case 3:
843  return MISCREG_ICH_LRC11;
844  case 4:
845  return MISCREG_ICH_LRC12;
846  case 5:
847  return MISCREG_ICH_LRC13;
848  case 6:
849  return MISCREG_ICH_LRC14;
850  case 7:
851  return MISCREG_ICH_LRC15;
852  }
853  }
854  } else if (opc1 == 6) {
855  if (crm == 12) {
856  switch (opc2) {
857  case 4:
858  return MISCREG_ICC_MCTLR;
859  case 5:
860  return MISCREG_ICC_MSRE;
861  case 7:
862  return MISCREG_ICC_MGRPEN1;
863  }
864  }
865  }
866  break;
867  case 13:
868  if (opc1 == 0) {
869  if (crm == 0) {
870  switch (opc2) {
871  case 0:
872  return MISCREG_FCSEIDR;
873  case 1:
874  return MISCREG_CONTEXTIDR;
875  case 2:
876  return MISCREG_TPIDRURW;
877  case 3:
878  return MISCREG_TPIDRURO;
879  case 4:
880  return MISCREG_TPIDRPRW;
881  }
882  }
883  } else if (opc1 == 4) {
884  if (crm == 0 && opc2 == 2)
885  return MISCREG_HTPIDR;
886  }
887  break;
888  case 14:
889  if (opc1 == 0) {
890  switch (crm) {
891  case 0:
892  if (opc2 == 0)
893  return MISCREG_CNTFRQ;
894  break;
895  case 1:
896  if (opc2 == 0)
897  return MISCREG_CNTKCTL;
898  break;
899  case 2:
900  if (opc2 == 0)
901  return MISCREG_CNTP_TVAL;
902  else if (opc2 == 1)
903  return MISCREG_CNTP_CTL;
904  break;
905  case 3:
906  if (opc2 == 0)
907  return MISCREG_CNTV_TVAL;
908  else if (opc2 == 1)
909  return MISCREG_CNTV_CTL;
910  break;
911  }
912  } else if (opc1 == 4) {
913  if (crm == 1 && opc2 == 0) {
914  return MISCREG_CNTHCTL;
915  } else if (crm == 2) {
916  if (opc2 == 0)
917  return MISCREG_CNTHP_TVAL;
918  else if (opc2 == 1)
919  return MISCREG_CNTHP_CTL;
920  }
921  }
922  break;
923  case 15:
924  // Implementation defined
925  return MISCREG_IMPDEF_UNIMPL;
926  }
927  // Unrecognized register
928  return MISCREG_CP15_UNIMPL;
929 }
930 
932 decodeCP15Reg64(unsigned crm, unsigned opc1)
933 {
934  switch (crm) {
935  case 2:
936  switch (opc1) {
937  case 0:
938  return MISCREG_TTBR0;
939  case 1:
940  return MISCREG_TTBR1;
941  case 4:
942  return MISCREG_HTTBR;
943  case 6:
944  return MISCREG_VTTBR;
945  }
946  break;
947  case 7:
948  if (opc1 == 0)
949  return MISCREG_PAR;
950  break;
951  case 14:
952  switch (opc1) {
953  case 0:
954  return MISCREG_CNTPCT;
955  case 1:
956  return MISCREG_CNTVCT;
957  case 2:
958  return MISCREG_CNTP_CVAL;
959  case 3:
960  return MISCREG_CNTV_CVAL;
961  case 4:
962  return MISCREG_CNTVOFF;
963  case 6:
964  return MISCREG_CNTHP_CVAL;
965  }
966  break;
967  case 12:
968  switch (opc1) {
969  case 0:
970  return MISCREG_ICC_SGI1R;
971  case 1:
972  return MISCREG_ICC_ASGI1R;
973  case 2:
974  return MISCREG_ICC_SGI0R;
975  default:
976  break;
977  }
978  break;
979  case 15:
980  if (opc1 == 0)
981  return MISCREG_CPUMERRSR;
982  else if (opc1 == 1)
983  return MISCREG_L2MERRSR;
984  break;
985  }
986  // Unrecognized register
987  return MISCREG_CP15_UNIMPL;
988 }
989 
990 std::tuple<bool, bool>
991 canReadCoprocReg(MiscRegIndex reg, SCR scr, CPSR cpsr)
992 {
993  bool secure = !scr.ns;
994  bool canRead = false;
995  bool undefined = false;
996 
997  switch (cpsr.mode) {
998  case MODE_USER:
999  canRead = secure ? miscRegInfo[reg][MISCREG_USR_S_RD] :
1001  break;
1002  case MODE_FIQ:
1003  case MODE_IRQ:
1004  case MODE_SVC:
1005  case MODE_ABORT:
1006  case MODE_UNDEFINED:
1007  case MODE_SYSTEM:
1008  canRead = secure ? miscRegInfo[reg][MISCREG_PRI_S_RD] :
1010  break;
1011  case MODE_MON:
1012  canRead = secure ? miscRegInfo[reg][MISCREG_MON_NS0_RD] :
1014  break;
1015  case MODE_HYP:
1016  canRead = miscRegInfo[reg][MISCREG_HYP_RD];
1017  break;
1018  default:
1019  undefined = true;
1020  }
1021  // can't do permissions checkes on the root of a banked pair of regs
1022  assert(!miscRegInfo[reg][MISCREG_BANKED]);
1023  return std::make_tuple(canRead, undefined);
1024 }
1025 
1026 std::tuple<bool, bool>
1027 canWriteCoprocReg(MiscRegIndex reg, SCR scr, CPSR cpsr)
1028 {
1029  bool secure = !scr.ns;
1030  bool canWrite = false;
1031  bool undefined = false;
1032 
1033  switch (cpsr.mode) {
1034  case MODE_USER:
1035  canWrite = secure ? miscRegInfo[reg][MISCREG_USR_S_WR] :
1037  break;
1038  case MODE_FIQ:
1039  case MODE_IRQ:
1040  case MODE_SVC:
1041  case MODE_ABORT:
1042  case MODE_UNDEFINED:
1043  case MODE_SYSTEM:
1044  canWrite = secure ? miscRegInfo[reg][MISCREG_PRI_S_WR] :
1046  break;
1047  case MODE_MON:
1048  canWrite = secure ? miscRegInfo[reg][MISCREG_MON_NS0_WR] :
1050  break;
1051  case MODE_HYP:
1052  canWrite = miscRegInfo[reg][MISCREG_HYP_WR];
1053  break;
1054  default:
1055  undefined = true;
1056  }
1057  // can't do permissions checkes on the root of a banked pair of regs
1058  assert(!miscRegInfo[reg][MISCREG_BANKED]);
1059  return std::make_tuple(canWrite, undefined);
1060 }
1061 
1062 int
1064 {
1065  SCR scr = tc->readMiscReg(MISCREG_SCR);
1066  return snsBankedIndex(reg, tc, scr.ns);
1067 }
1068 
1069 int
1071 {
1072  int reg_as_int = static_cast<int>(reg);
1073  if (miscRegInfo[reg][MISCREG_BANKED]) {
1074  reg_as_int += (ArmSystem::haveSecurity(tc) &&
1075  !ArmSystem::highestELIs64(tc) && !ns) ? 2 : 1;
1076  }
1077  return reg_as_int;
1078 }
1079 
1080 int
1082 {
1083  auto *isa = static_cast<ArmISA::ISA *>(tc->getIsaPtr());
1084  SCR scr = tc->readMiscReg(MISCREG_SCR);
1085  return isa->snsBankedIndex64(reg, scr.ns);
1086 }
1087 
1097 
1098 void
1100 {
1101  int reg = -1;
1102  for (int i = 0 ; i < NUM_MISCREGS; i++){
1104  reg = i;
1106  unflattenResultMiscReg[i] = reg;
1107  else
1108  unflattenResultMiscReg[i] = i;
1109  // if this assert fails, no parent was found, and something is broken
1110  assert(unflattenResultMiscReg[i] > -1);
1111  }
1112 }
1113 
1114 int
1116 {
1117  return unflattenResultMiscReg[reg];
1118 }
1119 
1120 bool
1121 canReadAArch64SysReg(MiscRegIndex reg, HCR hcr, SCR scr, CPSR cpsr,
1122  ThreadContext *tc)
1123 {
1124  // Check for SP_EL0 access while SPSEL == 0
1125  if ((reg == MISCREG_SP_EL0) && (tc->readMiscReg(MISCREG_SPSEL) == 0))
1126  return false;
1127 
1128  // Check for RVBAR access
1129  if (reg == MISCREG_RVBAR_EL1) {
1130  ExceptionLevel highest_el = ArmSystem::highestEL(tc);
1131  if (highest_el == EL2 || highest_el == EL3)
1132  return false;
1133  }
1134  if (reg == MISCREG_RVBAR_EL2) {
1135  ExceptionLevel highest_el = ArmSystem::highestEL(tc);
1136  if (highest_el == EL3)
1137  return false;
1138  }
1139 
1140  bool secure = ArmSystem::haveSecurity(tc) && !scr.ns;
1141  bool el2_host = EL2Enabled(tc) && hcr.e2h;
1142 
1143  switch (currEL(cpsr)) {
1144  case EL0:
1145  return secure ? miscRegInfo[reg][MISCREG_USR_S_RD] :
1147  case EL1:
1148  return secure ? miscRegInfo[reg][MISCREG_PRI_S_RD] :
1150  case EL2:
1151  return el2_host ? miscRegInfo[reg][MISCREG_HYP_E2H_RD] :
1153  case EL3:
1154  return el2_host ? miscRegInfo[reg][MISCREG_MON_E2H_RD] :
1155  secure ? miscRegInfo[reg][MISCREG_MON_NS0_RD] :
1157  default:
1158  panic("Invalid exception level");
1159  }
1160 }
1161 
1162 bool
1163 canWriteAArch64SysReg(MiscRegIndex reg, HCR hcr, SCR scr, CPSR cpsr,
1164  ThreadContext *tc)
1165 {
1166  // Check for SP_EL0 access while SPSEL == 0
1167  if ((reg == MISCREG_SP_EL0) && (tc->readMiscReg(MISCREG_SPSEL) == 0))
1168  return false;
1169  ExceptionLevel el = currEL(cpsr);
1170  if (reg == MISCREG_DAIF) {
1171  SCTLR sctlr = tc->readMiscReg(MISCREG_SCTLR_EL1);
1172  if (el == EL0 && !sctlr.uma)
1173  return false;
1174  }
1175  if (FullSystem && reg == MISCREG_DC_ZVA_Xt) {
1176  // In syscall-emulation mode, this test is skipped and DCZVA is always
1177  // allowed at EL0
1178  SCTLR sctlr = tc->readMiscReg(MISCREG_SCTLR_EL1);
1179  if (el == EL0 && !sctlr.dze)
1180  return false;
1181  }
1182  if (reg == MISCREG_DC_CVAC_Xt || reg == MISCREG_DC_CIVAC_Xt) {
1183  SCTLR sctlr = tc->readMiscReg(MISCREG_SCTLR_EL1);
1184  if (el == EL0 && !sctlr.uci)
1185  return false;
1186  }
1187 
1188  bool secure = ArmSystem::haveSecurity(tc) && !scr.ns;
1189  bool el2_host = EL2Enabled(tc) && hcr.e2h;
1190 
1191  switch (el) {
1192  case EL0:
1193  return secure ? miscRegInfo[reg][MISCREG_USR_S_WR] :
1195  case EL1:
1196  return secure ? miscRegInfo[reg][MISCREG_PRI_S_WR] :
1198  case EL2:
1199  return el2_host ? miscRegInfo[reg][MISCREG_HYP_E2H_WR] :
1201  case EL3:
1202  return el2_host ? miscRegInfo[reg][MISCREG_MON_E2H_WR] :
1203  secure ? miscRegInfo[reg][MISCREG_MON_NS0_WR] :
1205  default:
1206  panic("Invalid exception level");
1207  }
1208 }
1209 
1211 decodeAArch64SysReg(unsigned op0, unsigned op1,
1212  unsigned crn, unsigned crm,
1213  unsigned op2)
1214 {
1215  switch (op0) {
1216  case 1:
1217  switch (crn) {
1218  case 7:
1219  switch (op1) {
1220  case 0:
1221  switch (crm) {
1222  case 1:
1223  switch (op2) {
1224  case 0:
1225  return MISCREG_IC_IALLUIS;
1226  }
1227  break;
1228  case 5:
1229  switch (op2) {
1230  case 0:
1231  return MISCREG_IC_IALLU;
1232  }
1233  break;
1234  case 6:
1235  switch (op2) {
1236  case 1:
1237  return MISCREG_DC_IVAC_Xt;
1238  case 2:
1239  return MISCREG_DC_ISW_Xt;
1240  }
1241  break;
1242  case 8:
1243  switch (op2) {
1244  case 0:
1245  return MISCREG_AT_S1E1R_Xt;
1246  case 1:
1247  return MISCREG_AT_S1E1W_Xt;
1248  case 2:
1249  return MISCREG_AT_S1E0R_Xt;
1250  case 3:
1251  return MISCREG_AT_S1E0W_Xt;
1252  }
1253  break;
1254  case 10:
1255  switch (op2) {
1256  case 2:
1257  return MISCREG_DC_CSW_Xt;
1258  }
1259  break;
1260  case 14:
1261  switch (op2) {
1262  case 2:
1263  return MISCREG_DC_CISW_Xt;
1264  }
1265  break;
1266  }
1267  break;
1268  case 3:
1269  switch (crm) {
1270  case 4:
1271  switch (op2) {
1272  case 1:
1273  return MISCREG_DC_ZVA_Xt;
1274  }
1275  break;
1276  case 5:
1277  switch (op2) {
1278  case 1:
1279  return MISCREG_IC_IVAU_Xt;
1280  }
1281  break;
1282  case 10:
1283  switch (op2) {
1284  case 1:
1285  return MISCREG_DC_CVAC_Xt;
1286  }
1287  break;
1288  case 11:
1289  switch (op2) {
1290  case 1:
1291  return MISCREG_DC_CVAU_Xt;
1292  }
1293  break;
1294  case 14:
1295  switch (op2) {
1296  case 1:
1297  return MISCREG_DC_CIVAC_Xt;
1298  }
1299  break;
1300  }
1301  break;
1302  case 4:
1303  switch (crm) {
1304  case 8:
1305  switch (op2) {
1306  case 0:
1307  return MISCREG_AT_S1E2R_Xt;
1308  case 1:
1309  return MISCREG_AT_S1E2W_Xt;
1310  case 4:
1311  return MISCREG_AT_S12E1R_Xt;
1312  case 5:
1313  return MISCREG_AT_S12E1W_Xt;
1314  case 6:
1315  return MISCREG_AT_S12E0R_Xt;
1316  case 7:
1317  return MISCREG_AT_S12E0W_Xt;
1318  }
1319  break;
1320  }
1321  break;
1322  case 6:
1323  switch (crm) {
1324  case 8:
1325  switch (op2) {
1326  case 0:
1327  return MISCREG_AT_S1E3R_Xt;
1328  case 1:
1329  return MISCREG_AT_S1E3W_Xt;
1330  }
1331  break;
1332  }
1333  break;
1334  }
1335  break;
1336  case 8:
1337  switch (op1) {
1338  case 0:
1339  switch (crm) {
1340  case 3:
1341  switch (op2) {
1342  case 0:
1343  return MISCREG_TLBI_VMALLE1IS;
1344  case 1:
1345  return MISCREG_TLBI_VAE1IS_Xt;
1346  case 2:
1347  return MISCREG_TLBI_ASIDE1IS_Xt;
1348  case 3:
1349  return MISCREG_TLBI_VAAE1IS_Xt;
1350  case 5:
1351  return MISCREG_TLBI_VALE1IS_Xt;
1352  case 7:
1353  return MISCREG_TLBI_VAALE1IS_Xt;
1354  }
1355  break;
1356  case 7:
1357  switch (op2) {
1358  case 0:
1359  return MISCREG_TLBI_VMALLE1;
1360  case 1:
1361  return MISCREG_TLBI_VAE1_Xt;
1362  case 2:
1363  return MISCREG_TLBI_ASIDE1_Xt;
1364  case 3:
1365  return MISCREG_TLBI_VAAE1_Xt;
1366  case 5:
1367  return MISCREG_TLBI_VALE1_Xt;
1368  case 7:
1369  return MISCREG_TLBI_VAALE1_Xt;
1370  }
1371  break;
1372  }
1373  break;
1374  case 4:
1375  switch (crm) {
1376  case 0:
1377  switch (op2) {
1378  case 1:
1380  case 5:
1382  }
1383  break;
1384  case 3:
1385  switch (op2) {
1386  case 0:
1387  return MISCREG_TLBI_ALLE2IS;
1388  case 1:
1389  return MISCREG_TLBI_VAE2IS_Xt;
1390  case 4:
1391  return MISCREG_TLBI_ALLE1IS;
1392  case 5:
1393  return MISCREG_TLBI_VALE2IS_Xt;
1394  case 6:
1396  }
1397  break;
1398  case 4:
1399  switch (op2) {
1400  case 1:
1401  return MISCREG_TLBI_IPAS2E1_Xt;
1402  case 5:
1403  return MISCREG_TLBI_IPAS2LE1_Xt;
1404  }
1405  break;
1406  case 7:
1407  switch (op2) {
1408  case 0:
1409  return MISCREG_TLBI_ALLE2;
1410  case 1:
1411  return MISCREG_TLBI_VAE2_Xt;
1412  case 4:
1413  return MISCREG_TLBI_ALLE1;
1414  case 5:
1415  return MISCREG_TLBI_VALE2_Xt;
1416  case 6:
1417  return MISCREG_TLBI_VMALLS12E1;
1418  }
1419  break;
1420  }
1421  break;
1422  case 6:
1423  switch (crm) {
1424  case 3:
1425  switch (op2) {
1426  case 0:
1427  return MISCREG_TLBI_ALLE3IS;
1428  case 1:
1429  return MISCREG_TLBI_VAE3IS_Xt;
1430  case 5:
1431  return MISCREG_TLBI_VALE3IS_Xt;
1432  }
1433  break;
1434  case 7:
1435  switch (op2) {
1436  case 0:
1437  return MISCREG_TLBI_ALLE3;
1438  case 1:
1439  return MISCREG_TLBI_VAE3_Xt;
1440  case 5:
1441  return MISCREG_TLBI_VALE3_Xt;
1442  }
1443  break;
1444  }
1445  break;
1446  }
1447  break;
1448  case 11:
1449  case 15:
1450  // SYS Instruction with CRn = { 11, 15 }
1451  // (Trappable by HCR_EL2.TIDCP)
1452  return MISCREG_IMPDEF_UNIMPL;
1453  }
1454  break;
1455  case 2:
1456  switch (crn) {
1457  case 0:
1458  switch (op1) {
1459  case 0:
1460  switch (crm) {
1461  case 0:
1462  switch (op2) {
1463  case 2:
1464  return MISCREG_OSDTRRX_EL1;
1465  case 4:
1466  return MISCREG_DBGBVR0_EL1;
1467  case 5:
1468  return MISCREG_DBGBCR0_EL1;
1469  case 6:
1470  return MISCREG_DBGWVR0_EL1;
1471  case 7:
1472  return MISCREG_DBGWCR0_EL1;
1473  }
1474  break;
1475  case 1:
1476  switch (op2) {
1477  case 4:
1478  return MISCREG_DBGBVR1_EL1;
1479  case 5:
1480  return MISCREG_DBGBCR1_EL1;
1481  case 6:
1482  return MISCREG_DBGWVR1_EL1;
1483  case 7:
1484  return MISCREG_DBGWCR1_EL1;
1485  }
1486  break;
1487  case 2:
1488  switch (op2) {
1489  case 0:
1490  return MISCREG_MDCCINT_EL1;
1491  case 2:
1492  return MISCREG_MDSCR_EL1;
1493  case 4:
1494  return MISCREG_DBGBVR2_EL1;
1495  case 5:
1496  return MISCREG_DBGBCR2_EL1;
1497  case 6:
1498  return MISCREG_DBGWVR2_EL1;
1499  case 7:
1500  return MISCREG_DBGWCR2_EL1;
1501  }
1502  break;
1503  case 3:
1504  switch (op2) {
1505  case 2:
1506  return MISCREG_OSDTRTX_EL1;
1507  case 4:
1508  return MISCREG_DBGBVR3_EL1;
1509  case 5:
1510  return MISCREG_DBGBCR3_EL1;
1511  case 6:
1512  return MISCREG_DBGWVR3_EL1;
1513  case 7:
1514  return MISCREG_DBGWCR3_EL1;
1515  }
1516  break;
1517  case 4:
1518  switch (op2) {
1519  case 4:
1520  return MISCREG_DBGBVR4_EL1;
1521  case 5:
1522  return MISCREG_DBGBCR4_EL1;
1523  }
1524  break;
1525  case 5:
1526  switch (op2) {
1527  case 4:
1528  return MISCREG_DBGBVR5_EL1;
1529  case 5:
1530  return MISCREG_DBGBCR5_EL1;
1531  }
1532  break;
1533  case 6:
1534  switch (op2) {
1535  case 2:
1536  return MISCREG_OSECCR_EL1;
1537  }
1538  break;
1539  }
1540  break;
1541  case 2:
1542  switch (crm) {
1543  case 0:
1544  switch (op2) {
1545  case 0:
1546  return MISCREG_TEECR32_EL1;
1547  }
1548  break;
1549  }
1550  break;
1551  case 3:
1552  switch (crm) {
1553  case 1:
1554  switch (op2) {
1555  case 0:
1556  return MISCREG_MDCCSR_EL0;
1557  }
1558  break;
1559  case 4:
1560  switch (op2) {
1561  case 0:
1562  return MISCREG_MDDTR_EL0;
1563  }
1564  break;
1565  case 5:
1566  switch (op2) {
1567  case 0:
1568  return MISCREG_MDDTRRX_EL0;
1569  }
1570  break;
1571  }
1572  break;
1573  case 4:
1574  switch (crm) {
1575  case 7:
1576  switch (op2) {
1577  case 0:
1578  return MISCREG_DBGVCR32_EL2;
1579  }
1580  break;
1581  }
1582  break;
1583  }
1584  break;
1585  case 1:
1586  switch (op1) {
1587  case 0:
1588  switch (crm) {
1589  case 0:
1590  switch (op2) {
1591  case 0:
1592  return MISCREG_MDRAR_EL1;
1593  case 4:
1594  return MISCREG_OSLAR_EL1;
1595  }
1596  break;
1597  case 1:
1598  switch (op2) {
1599  case 4:
1600  return MISCREG_OSLSR_EL1;
1601  }
1602  break;
1603  case 3:
1604  switch (op2) {
1605  case 4:
1606  return MISCREG_OSDLR_EL1;
1607  }
1608  break;
1609  case 4:
1610  switch (op2) {
1611  case 4:
1612  return MISCREG_DBGPRCR_EL1;
1613  }
1614  break;
1615  }
1616  break;
1617  case 2:
1618  switch (crm) {
1619  case 0:
1620  switch (op2) {
1621  case 0:
1622  return MISCREG_TEEHBR32_EL1;
1623  }
1624  break;
1625  }
1626  break;
1627  }
1628  break;
1629  case 7:
1630  switch (op1) {
1631  case 0:
1632  switch (crm) {
1633  case 8:
1634  switch (op2) {
1635  case 6:
1636  return MISCREG_DBGCLAIMSET_EL1;
1637  }
1638  break;
1639  case 9:
1640  switch (op2) {
1641  case 6:
1642  return MISCREG_DBGCLAIMCLR_EL1;
1643  }
1644  break;
1645  case 14:
1646  switch (op2) {
1647  case 6:
1649  }
1650  break;
1651  }
1652  break;
1653  }
1654  break;
1655  }
1656  break;
1657  case 3:
1658  switch (crn) {
1659  case 0:
1660  switch (op1) {
1661  case 0:
1662  switch (crm) {
1663  case 0:
1664  switch (op2) {
1665  case 0:
1666  return MISCREG_MIDR_EL1;
1667  case 5:
1668  return MISCREG_MPIDR_EL1;
1669  case 6:
1670  return MISCREG_REVIDR_EL1;
1671  }
1672  break;
1673  case 1:
1674  switch (op2) {
1675  case 0:
1676  return MISCREG_ID_PFR0_EL1;
1677  case 1:
1678  return MISCREG_ID_PFR1_EL1;
1679  case 2:
1680  return MISCREG_ID_DFR0_EL1;
1681  case 3:
1682  return MISCREG_ID_AFR0_EL1;
1683  case 4:
1684  return MISCREG_ID_MMFR0_EL1;
1685  case 5:
1686  return MISCREG_ID_MMFR1_EL1;
1687  case 6:
1688  return MISCREG_ID_MMFR2_EL1;
1689  case 7:
1690  return MISCREG_ID_MMFR3_EL1;
1691  }
1692  break;
1693  case 2:
1694  switch (op2) {
1695  case 0:
1696  return MISCREG_ID_ISAR0_EL1;
1697  case 1:
1698  return MISCREG_ID_ISAR1_EL1;
1699  case 2:
1700  return MISCREG_ID_ISAR2_EL1;
1701  case 3:
1702  return MISCREG_ID_ISAR3_EL1;
1703  case 4:
1704  return MISCREG_ID_ISAR4_EL1;
1705  case 5:
1706  return MISCREG_ID_ISAR5_EL1;
1707  }
1708  break;
1709  case 3:
1710  switch (op2) {
1711  case 0:
1712  return MISCREG_MVFR0_EL1;
1713  case 1:
1714  return MISCREG_MVFR1_EL1;
1715  case 2:
1716  return MISCREG_MVFR2_EL1;
1717  case 3 ... 7:
1718  return MISCREG_RAZ;
1719  }
1720  break;
1721  case 4:
1722  switch (op2) {
1723  case 0:
1724  return MISCREG_ID_AA64PFR0_EL1;
1725  case 1:
1726  return MISCREG_ID_AA64PFR1_EL1;
1727  case 2 ... 3:
1728  return MISCREG_RAZ;
1729  case 4:
1730  return MISCREG_ID_AA64ZFR0_EL1;
1731  case 5 ... 7:
1732  return MISCREG_RAZ;
1733  }
1734  break;
1735  case 5:
1736  switch (op2) {
1737  case 0:
1738  return MISCREG_ID_AA64DFR0_EL1;
1739  case 1:
1740  return MISCREG_ID_AA64DFR1_EL1;
1741  case 4:
1742  return MISCREG_ID_AA64AFR0_EL1;
1743  case 5:
1744  return MISCREG_ID_AA64AFR1_EL1;
1745  case 2:
1746  case 3:
1747  case 6:
1748  case 7:
1749  return MISCREG_RAZ;
1750  }
1751  break;
1752  case 6:
1753  switch (op2) {
1754  case 0:
1755  return MISCREG_ID_AA64ISAR0_EL1;
1756  case 1:
1757  return MISCREG_ID_AA64ISAR1_EL1;
1758  case 2 ... 7:
1759  return MISCREG_RAZ;
1760  }
1761  break;
1762  case 7:
1763  switch (op2) {
1764  case 0:
1765  return MISCREG_ID_AA64MMFR0_EL1;
1766  case 1:
1767  return MISCREG_ID_AA64MMFR1_EL1;
1768  case 2:
1769  return MISCREG_ID_AA64MMFR2_EL1;
1770  case 3 ... 7:
1771  return MISCREG_RAZ;
1772  }
1773  break;
1774  }
1775  break;
1776  case 1:
1777  switch (crm) {
1778  case 0:
1779  switch (op2) {
1780  case 0:
1781  return MISCREG_CCSIDR_EL1;
1782  case 1:
1783  return MISCREG_CLIDR_EL1;
1784  case 7:
1785  return MISCREG_AIDR_EL1;
1786  }
1787  break;
1788  }
1789  break;
1790  case 2:
1791  switch (crm) {
1792  case 0:
1793  switch (op2) {
1794  case 0:
1795  return MISCREG_CSSELR_EL1;
1796  }
1797  break;
1798  }
1799  break;
1800  case 3:
1801  switch (crm) {
1802  case 0:
1803  switch (op2) {
1804  case 1:
1805  return MISCREG_CTR_EL0;
1806  case 7:
1807  return MISCREG_DCZID_EL0;
1808  }
1809  break;
1810  }
1811  break;
1812  case 4:
1813  switch (crm) {
1814  case 0:
1815  switch (op2) {
1816  case 0:
1817  return MISCREG_VPIDR_EL2;
1818  case 5:
1819  return MISCREG_VMPIDR_EL2;
1820  }
1821  break;
1822  }
1823  break;
1824  }
1825  break;
1826  case 1:
1827  switch (op1) {
1828  case 0:
1829  switch (crm) {
1830  case 0:
1831  switch (op2) {
1832  case 0:
1833  return MISCREG_SCTLR_EL1;
1834  case 1:
1835  return MISCREG_ACTLR_EL1;
1836  case 2:
1837  return MISCREG_CPACR_EL1;
1838  }
1839  break;
1840  case 2:
1841  switch (op2) {
1842  case 0:
1843  return MISCREG_ZCR_EL1;
1844  }
1845  break;
1846  }
1847  break;
1848  case 4:
1849  switch (crm) {
1850  case 0:
1851  switch (op2) {
1852  case 0:
1853  return MISCREG_SCTLR_EL2;
1854  case 1:
1855  return MISCREG_ACTLR_EL2;
1856  }
1857  break;
1858  case 1:
1859  switch (op2) {
1860  case 0:
1861  return MISCREG_HCR_EL2;
1862  case 1:
1863  return MISCREG_MDCR_EL2;
1864  case 2:
1865  return MISCREG_CPTR_EL2;
1866  case 3:
1867  return MISCREG_HSTR_EL2;
1868  case 7:
1869  return MISCREG_HACR_EL2;
1870  }
1871  break;
1872  case 2:
1873  switch (op2) {
1874  case 0:
1875  return MISCREG_ZCR_EL2;
1876  }
1877  break;
1878  }
1879  break;
1880  case 5:
1881  switch (crm) {
1882  case 2:
1883  switch (op2) {
1884  case 0:
1885  return MISCREG_ZCR_EL12;
1886  }
1887  break;
1888  }
1889  break;
1890  case 6:
1891  switch (crm) {
1892  case 0:
1893  switch (op2) {
1894  case 0:
1895  return MISCREG_SCTLR_EL3;
1896  case 1:
1897  return MISCREG_ACTLR_EL3;
1898  }
1899  break;
1900  case 1:
1901  switch (op2) {
1902  case 0:
1903  return MISCREG_SCR_EL3;
1904  case 1:
1905  return MISCREG_SDER32_EL3;
1906  case 2:
1907  return MISCREG_CPTR_EL3;
1908  }
1909  break;
1910  case 2:
1911  switch (op2) {
1912  case 0:
1913  return MISCREG_ZCR_EL3;
1914  }
1915  break;
1916  case 3:
1917  switch (op2) {
1918  case 1:
1919  return MISCREG_MDCR_EL3;
1920  }
1921  break;
1922  }
1923  break;
1924  }
1925  break;
1926  case 2:
1927  switch (op1) {
1928  case 0:
1929  switch (crm) {
1930  case 0:
1931  switch (op2) {
1932  case 0:
1933  return MISCREG_TTBR0_EL1;
1934  case 1:
1935  return MISCREG_TTBR1_EL1;
1936  case 2:
1937  return MISCREG_TCR_EL1;
1938  }
1939  break;
1940  case 0x1:
1941  switch (op2) {
1942  case 0x0:
1943  return MISCREG_APIAKeyLo_EL1;
1944  case 0x1:
1945  return MISCREG_APIAKeyHi_EL1;
1946  case 0x2:
1947  return MISCREG_APIBKeyLo_EL1;
1948  case 0x3:
1949  return MISCREG_APIBKeyHi_EL1;
1950  }
1951  break;
1952  case 0x2:
1953  switch (op2) {
1954  case 0x0:
1955  return MISCREG_APDAKeyLo_EL1;
1956  case 0x1:
1957  return MISCREG_APDAKeyHi_EL1;
1958  case 0x2:
1959  return MISCREG_APDBKeyLo_EL1;
1960  case 0x3:
1961  return MISCREG_APDBKeyHi_EL1;
1962  }
1963  break;
1964 
1965  case 0x3:
1966  switch (op2) {
1967  case 0x0:
1968  return MISCREG_APGAKeyLo_EL1;
1969  case 0x1:
1970  return MISCREG_APGAKeyHi_EL1;
1971  }
1972  break;
1973  }
1974  break;
1975  case 4:
1976  switch (crm) {
1977  case 0:
1978  switch (op2) {
1979  case 0:
1980  return MISCREG_TTBR0_EL2;
1981  case 1:
1982  return MISCREG_TTBR1_EL2;
1983  case 2:
1984  return MISCREG_TCR_EL2;
1985  }
1986  break;
1987  case 1:
1988  switch (op2) {
1989  case 0:
1990  return MISCREG_VTTBR_EL2;
1991  case 2:
1992  return MISCREG_VTCR_EL2;
1993  }
1994  break;
1995  }
1996  break;
1997  case 6:
1998  switch (crm) {
1999  case 0:
2000  switch (op2) {
2001  case 0:
2002  return MISCREG_TTBR0_EL3;
2003  case 2:
2004  return MISCREG_TCR_EL3;
2005  }
2006  break;
2007  }
2008  break;
2009  }
2010  break;
2011  case 3:
2012  switch (op1) {
2013  case 4:
2014  switch (crm) {
2015  case 0:
2016  switch (op2) {
2017  case 0:
2018  return MISCREG_DACR32_EL2;
2019  }
2020  break;
2021  }
2022  break;
2023  }
2024  break;
2025  case 4:
2026  switch (op1) {
2027  case 0:
2028  switch (crm) {
2029  case 0:
2030  switch (op2) {
2031  case 0:
2032  return MISCREG_SPSR_EL1;
2033  case 1:
2034  return MISCREG_ELR_EL1;
2035  }
2036  break;
2037  case 1:
2038  switch (op2) {
2039  case 0:
2040  return MISCREG_SP_EL0;
2041  }
2042  break;
2043  case 2:
2044  switch (op2) {
2045  case 0:
2046  return MISCREG_SPSEL;
2047  case 2:
2048  return MISCREG_CURRENTEL;
2049  case 3:
2050  return MISCREG_PAN;
2051  }
2052  break;
2053  case 6:
2054  switch (op2) {
2055  case 0:
2056  return MISCREG_ICC_PMR_EL1;
2057  }
2058  break;
2059  }
2060  break;
2061  case 3:
2062  switch (crm) {
2063  case 2:
2064  switch (op2) {
2065  case 0:
2066  return MISCREG_NZCV;
2067  case 1:
2068  return MISCREG_DAIF;
2069  }
2070  break;
2071  case 4:
2072  switch (op2) {
2073  case 0:
2074  return MISCREG_FPCR;
2075  case 1:
2076  return MISCREG_FPSR;
2077  }
2078  break;
2079  case 5:
2080  switch (op2) {
2081  case 0:
2082  return MISCREG_DSPSR_EL0;
2083  case 1:
2084  return MISCREG_DLR_EL0;
2085  }
2086  break;
2087  }
2088  break;
2089  case 4:
2090  switch (crm) {
2091  case 0:
2092  switch (op2) {
2093  case 0:
2094  return MISCREG_SPSR_EL2;
2095  case 1:
2096  return MISCREG_ELR_EL2;
2097  }
2098  break;
2099  case 1:
2100  switch (op2) {
2101  case 0:
2102  return MISCREG_SP_EL1;
2103  }
2104  break;
2105  case 3:
2106  switch (op2) {
2107  case 0:
2108  return MISCREG_SPSR_IRQ_AA64;
2109  case 1:
2110  return MISCREG_SPSR_ABT_AA64;
2111  case 2:
2112  return MISCREG_SPSR_UND_AA64;
2113  case 3:
2114  return MISCREG_SPSR_FIQ_AA64;
2115  }
2116  break;
2117  }
2118  break;
2119  case 6:
2120  switch (crm) {
2121  case 0:
2122  switch (op2) {
2123  case 0:
2124  return MISCREG_SPSR_EL3;
2125  case 1:
2126  return MISCREG_ELR_EL3;
2127  }
2128  break;
2129  case 1:
2130  switch (op2) {
2131  case 0:
2132  return MISCREG_SP_EL2;
2133  }
2134  break;
2135  }
2136  break;
2137  }
2138  break;
2139  case 5:
2140  switch (op1) {
2141  case 0:
2142  switch (crm) {
2143  case 1:
2144  switch (op2) {
2145  case 0:
2146  return MISCREG_AFSR0_EL1;
2147  case 1:
2148  return MISCREG_AFSR1_EL1;
2149  }
2150  break;
2151  case 2:
2152  switch (op2) {
2153  case 0:
2154  return MISCREG_ESR_EL1;
2155  }
2156  break;
2157  case 3:
2158  switch (op2) {
2159  case 0:
2160  return MISCREG_ERRIDR_EL1;
2161  case 1:
2162  return MISCREG_ERRSELR_EL1;
2163  }
2164  break;
2165  case 4:
2166  switch (op2) {
2167  case 0:
2168  return MISCREG_ERXFR_EL1;
2169  case 1:
2170  return MISCREG_ERXCTLR_EL1;
2171  case 2:
2172  return MISCREG_ERXSTATUS_EL1;
2173  case 3:
2174  return MISCREG_ERXADDR_EL1;
2175  }
2176  break;
2177  case 5:
2178  switch (op2) {
2179  case 0:
2180  return MISCREG_ERXMISC0_EL1;
2181  case 1:
2182  return MISCREG_ERXMISC1_EL1;
2183  }
2184  break;
2185  }
2186  break;
2187  case 4:
2188  switch (crm) {
2189  case 0:
2190  switch (op2) {
2191  case 1:
2192  return MISCREG_IFSR32_EL2;
2193  }
2194  break;
2195  case 1:
2196  switch (op2) {
2197  case 0:
2198  return MISCREG_AFSR0_EL2;
2199  case 1:
2200  return MISCREG_AFSR1_EL2;
2201  }
2202  break;
2203  case 2:
2204  switch (op2) {
2205  case 0:
2206  return MISCREG_ESR_EL2;
2207  case 3:
2208  return MISCREG_VSESR_EL2;
2209  }
2210  break;
2211  case 3:
2212  switch (op2) {
2213  case 0:
2214  return MISCREG_FPEXC32_EL2;
2215  }
2216  break;
2217  }
2218  break;
2219  case 6:
2220  switch (crm) {
2221  case 1:
2222  switch (op2) {
2223  case 0:
2224  return MISCREG_AFSR0_EL3;
2225  case 1:
2226  return MISCREG_AFSR1_EL3;
2227  }
2228  break;
2229  case 2:
2230  switch (op2) {
2231  case 0:
2232  return MISCREG_ESR_EL3;
2233  }
2234  break;
2235  }
2236  break;
2237  }
2238  break;
2239  case 6:
2240  switch (op1) {
2241  case 0:
2242  switch (crm) {
2243  case 0:
2244  switch (op2) {
2245  case 0:
2246  return MISCREG_FAR_EL1;
2247  }
2248  break;
2249  }
2250  break;
2251  case 4:
2252  switch (crm) {
2253  case 0:
2254  switch (op2) {
2255  case 0:
2256  return MISCREG_FAR_EL2;
2257  case 4:
2258  return MISCREG_HPFAR_EL2;
2259  }
2260  break;
2261  }
2262  break;
2263  case 6:
2264  switch (crm) {
2265  case 0:
2266  switch (op2) {
2267  case 0:
2268  return MISCREG_FAR_EL3;
2269  }
2270  break;
2271  }
2272  break;
2273  }
2274  break;
2275  case 7:
2276  switch (op1) {
2277  case 0:
2278  switch (crm) {
2279  case 4:
2280  switch (op2) {
2281  case 0:
2282  return MISCREG_PAR_EL1;
2283  }
2284  break;
2285  }
2286  break;
2287  }
2288  break;
2289  case 9:
2290  switch (op1) {
2291  case 0:
2292  switch (crm) {
2293  case 14:
2294  switch (op2) {
2295  case 1:
2296  return MISCREG_PMINTENSET_EL1;
2297  case 2:
2298  return MISCREG_PMINTENCLR_EL1;
2299  }
2300  break;
2301  }
2302  break;
2303  case 3:
2304  switch (crm) {
2305  case 12:
2306  switch (op2) {
2307  case 0:
2308  return MISCREG_PMCR_EL0;
2309  case 1:
2310  return MISCREG_PMCNTENSET_EL0;
2311  case 2:
2312  return MISCREG_PMCNTENCLR_EL0;
2313  case 3:
2314  return MISCREG_PMOVSCLR_EL0;
2315  case 4:
2316  return MISCREG_PMSWINC_EL0;
2317  case 5:
2318  return MISCREG_PMSELR_EL0;
2319  case 6:
2320  return MISCREG_PMCEID0_EL0;
2321  case 7:
2322  return MISCREG_PMCEID1_EL0;
2323  }
2324  break;
2325  case 13:
2326  switch (op2) {
2327  case 0:
2328  return MISCREG_PMCCNTR_EL0;
2329  case 1:
2330  return MISCREG_PMXEVTYPER_EL0;
2331  case 2:
2332  return MISCREG_PMXEVCNTR_EL0;
2333  }
2334  break;
2335  case 14:
2336  switch (op2) {
2337  case 0:
2338  return MISCREG_PMUSERENR_EL0;
2339  case 3:
2340  return MISCREG_PMOVSSET_EL0;
2341  }
2342  break;
2343  }
2344  break;
2345  }
2346  break;
2347  case 10:
2348  switch (op1) {
2349  case 0:
2350  switch (crm) {
2351  case 2:
2352  switch (op2) {
2353  case 0:
2354  return MISCREG_MAIR_EL1;
2355  }
2356  break;
2357  case 3:
2358  switch (op2) {
2359  case 0:
2360  return MISCREG_AMAIR_EL1;
2361  }
2362  break;
2363  }
2364  break;
2365  case 4:
2366  switch (crm) {
2367  case 2:
2368  switch (op2) {
2369  case 0:
2370  return MISCREG_MAIR_EL2;
2371  }
2372  break;
2373  case 3:
2374  switch (op2) {
2375  case 0:
2376  return MISCREG_AMAIR_EL2;
2377  }
2378  break;
2379  }
2380  break;
2381  case 6:
2382  switch (crm) {
2383  case 2:
2384  switch (op2) {
2385  case 0:
2386  return MISCREG_MAIR_EL3;
2387  }
2388  break;
2389  case 3:
2390  switch (op2) {
2391  case 0:
2392  return MISCREG_AMAIR_EL3;
2393  }
2394  break;
2395  }
2396  break;
2397  }
2398  break;
2399  case 11:
2400  switch (op1) {
2401  case 1:
2402  switch (crm) {
2403  case 0:
2404  switch (op2) {
2405  case 2:
2406  return MISCREG_L2CTLR_EL1;
2407  case 3:
2408  return MISCREG_L2ECTLR_EL1;
2409  }
2410  break;
2411  }
2413  default:
2414  // S3_<op1>_11_<Cm>_<op2>
2415  return MISCREG_IMPDEF_UNIMPL;
2416  }
2417  M5_UNREACHABLE;
2418  case 12:
2419  switch (op1) {
2420  case 0:
2421  switch (crm) {
2422  case 0:
2423  switch (op2) {
2424  case 0:
2425  return MISCREG_VBAR_EL1;
2426  case 1:
2427  return MISCREG_RVBAR_EL1;
2428  }
2429  break;
2430  case 1:
2431  switch (op2) {
2432  case 0:
2433  return MISCREG_ISR_EL1;
2434  case 1:
2435  return MISCREG_DISR_EL1;
2436  }
2437  break;
2438  case 8:
2439  switch (op2) {
2440  case 0:
2441  return MISCREG_ICC_IAR0_EL1;
2442  case 1:
2443  return MISCREG_ICC_EOIR0_EL1;
2444  case 2:
2445  return MISCREG_ICC_HPPIR0_EL1;
2446  case 3:
2447  return MISCREG_ICC_BPR0_EL1;
2448  case 4:
2449  return MISCREG_ICC_AP0R0_EL1;
2450  case 5:
2451  return MISCREG_ICC_AP0R1_EL1;
2452  case 6:
2453  return MISCREG_ICC_AP0R2_EL1;
2454  case 7:
2455  return MISCREG_ICC_AP0R3_EL1;
2456  }
2457  break;
2458  case 9:
2459  switch (op2) {
2460  case 0:
2461  return MISCREG_ICC_AP1R0_EL1;
2462  case 1:
2463  return MISCREG_ICC_AP1R1_EL1;
2464  case 2:
2465  return MISCREG_ICC_AP1R2_EL1;
2466  case 3:
2467  return MISCREG_ICC_AP1R3_EL1;
2468  }
2469  break;
2470  case 11:
2471  switch (op2) {
2472  case 1:
2473  return MISCREG_ICC_DIR_EL1;
2474  case 3:
2475  return MISCREG_ICC_RPR_EL1;
2476  case 5:
2477  return MISCREG_ICC_SGI1R_EL1;
2478  case 6:
2479  return MISCREG_ICC_ASGI1R_EL1;
2480  case 7:
2481  return MISCREG_ICC_SGI0R_EL1;
2482  }
2483  break;
2484  case 12:
2485  switch (op2) {
2486  case 0:
2487  return MISCREG_ICC_IAR1_EL1;
2488  case 1:
2489  return MISCREG_ICC_EOIR1_EL1;
2490  case 2:
2491  return MISCREG_ICC_HPPIR1_EL1;
2492  case 3:
2493  return MISCREG_ICC_BPR1_EL1;
2494  case 4:
2495  return MISCREG_ICC_CTLR_EL1;
2496  case 5:
2497  return MISCREG_ICC_SRE_EL1;
2498  case 6:
2499  return MISCREG_ICC_IGRPEN0_EL1;
2500  case 7:
2501  return MISCREG_ICC_IGRPEN1_EL1;
2502  }
2503  break;
2504  }
2505  break;
2506  case 4:
2507  switch (crm) {
2508  case 0:
2509  switch (op2) {
2510  case 0:
2511  return MISCREG_VBAR_EL2;
2512  case 1:
2513  return MISCREG_RVBAR_EL2;
2514  }
2515  break;
2516  case 1:
2517  switch (op2) {
2518  case 1:
2519  return MISCREG_VDISR_EL2;
2520  }
2521  break;
2522  case 8:
2523  switch (op2) {
2524  case 0:
2525  return MISCREG_ICH_AP0R0_EL2;
2526  case 1:
2527  return MISCREG_ICH_AP0R1_EL2;
2528  case 2:
2529  return MISCREG_ICH_AP0R2_EL2;
2530  case 3:
2531  return MISCREG_ICH_AP0R3_EL2;
2532  }
2533  break;
2534  case 9:
2535  switch (op2) {
2536  case 0:
2537  return MISCREG_ICH_AP1R0_EL2;
2538  case 1:
2539  return MISCREG_ICH_AP1R1_EL2;
2540  case 2:
2541  return MISCREG_ICH_AP1R2_EL2;
2542  case 3:
2543  return MISCREG_ICH_AP1R3_EL2;
2544  case 5:
2545  return MISCREG_ICC_SRE_EL2;
2546  }
2547  break;
2548  case 11:
2549  switch (op2) {
2550  case 0:
2551  return MISCREG_ICH_HCR_EL2;
2552  case 1:
2553  return MISCREG_ICH_VTR_EL2;
2554  case 2:
2555  return MISCREG_ICH_MISR_EL2;
2556  case 3:
2557  return MISCREG_ICH_EISR_EL2;
2558  case 5:
2559  return MISCREG_ICH_ELRSR_EL2;
2560  case 7:
2561  return MISCREG_ICH_VMCR_EL2;
2562  }
2563  break;
2564  case 12:
2565  switch (op2) {
2566  case 0:
2567  return MISCREG_ICH_LR0_EL2;
2568  case 1:
2569  return MISCREG_ICH_LR1_EL2;
2570  case 2:
2571  return MISCREG_ICH_LR2_EL2;
2572  case 3:
2573  return MISCREG_ICH_LR3_EL2;
2574  case 4:
2575  return MISCREG_ICH_LR4_EL2;
2576  case 5:
2577  return MISCREG_ICH_LR5_EL2;
2578  case 6:
2579  return MISCREG_ICH_LR6_EL2;
2580  case 7:
2581  return MISCREG_ICH_LR7_EL2;
2582  }
2583  break;
2584  case 13:
2585  switch (op2) {
2586  case 0:
2587  return MISCREG_ICH_LR8_EL2;
2588  case 1:
2589  return MISCREG_ICH_LR9_EL2;
2590  case 2:
2591  return MISCREG_ICH_LR10_EL2;
2592  case 3:
2593  return MISCREG_ICH_LR11_EL2;
2594  case 4:
2595  return MISCREG_ICH_LR12_EL2;
2596  case 5:
2597  return MISCREG_ICH_LR13_EL2;
2598  case 6:
2599  return MISCREG_ICH_LR14_EL2;
2600  case 7:
2601  return MISCREG_ICH_LR15_EL2;
2602  }
2603  break;
2604  }
2605  break;
2606  case 6:
2607  switch (crm) {
2608  case 0:
2609  switch (op2) {
2610  case 0:
2611  return MISCREG_VBAR_EL3;
2612  case 1:
2613  return MISCREG_RVBAR_EL3;
2614  case 2:
2615  return MISCREG_RMR_EL3;
2616  }
2617  break;
2618  case 12:
2619  switch (op2) {
2620  case 4:
2621  return MISCREG_ICC_CTLR_EL3;
2622  case 5:
2623  return MISCREG_ICC_SRE_EL3;
2624  case 7:
2625  return MISCREG_ICC_IGRPEN1_EL3;
2626  }
2627  break;
2628  }
2629  break;
2630  }
2631  break;
2632  case 13:
2633  switch (op1) {
2634  case 0:
2635  switch (crm) {
2636  case 0:
2637  switch (op2) {
2638  case 1:
2639  return MISCREG_CONTEXTIDR_EL1;
2640  case 4:
2641  return MISCREG_TPIDR_EL1;
2642  }
2643  break;
2644  }
2645  break;
2646  case 3:
2647  switch (crm) {
2648  case 0:
2649  switch (op2) {
2650  case 2:
2651  return MISCREG_TPIDR_EL0;
2652  case 3:
2653  return MISCREG_TPIDRRO_EL0;
2654  }
2655  break;
2656  }
2657  break;
2658  case 4:
2659  switch (crm) {
2660  case 0:
2661  switch (op2) {
2662  case 1:
2663  return MISCREG_CONTEXTIDR_EL2;
2664  case 2:
2665  return MISCREG_TPIDR_EL2;
2666  }
2667  break;
2668  }
2669  break;
2670  case 6:
2671  switch (crm) {
2672  case 0:
2673  switch (op2) {
2674  case 2:
2675  return MISCREG_TPIDR_EL3;
2676  }
2677  break;
2678  }
2679  break;
2680  }
2681  break;
2682  case 14:
2683  switch (op1) {
2684  case 0:
2685  switch (crm) {
2686  case 1:
2687  switch (op2) {
2688  case 0:
2689  return MISCREG_CNTKCTL_EL1;
2690  }
2691  break;
2692  }
2693  break;
2694  case 3:
2695  switch (crm) {
2696  case 0:
2697  switch (op2) {
2698  case 0:
2699  return MISCREG_CNTFRQ_EL0;
2700  case 1:
2701  return MISCREG_CNTPCT_EL0;
2702  case 2:
2703  return MISCREG_CNTVCT_EL0;
2704  }
2705  break;
2706  case 2:
2707  switch (op2) {
2708  case 0:
2709  return MISCREG_CNTP_TVAL_EL0;
2710  case 1:
2711  return MISCREG_CNTP_CTL_EL0;
2712  case 2:
2713  return MISCREG_CNTP_CVAL_EL0;
2714  }
2715  break;
2716  case 3:
2717  switch (op2) {
2718  case 0:
2719  return MISCREG_CNTV_TVAL_EL0;
2720  case 1:
2721  return MISCREG_CNTV_CTL_EL0;
2722  case 2:
2723  return MISCREG_CNTV_CVAL_EL0;
2724  }
2725  break;
2726  case 8:
2727  switch (op2) {
2728  case 0:
2729  return MISCREG_PMEVCNTR0_EL0;
2730  case 1:
2731  return MISCREG_PMEVCNTR1_EL0;
2732  case 2:
2733  return MISCREG_PMEVCNTR2_EL0;
2734  case 3:
2735  return MISCREG_PMEVCNTR3_EL0;
2736  case 4:
2737  return MISCREG_PMEVCNTR4_EL0;
2738  case 5:
2739  return MISCREG_PMEVCNTR5_EL0;
2740  }
2741  break;
2742  case 12:
2743  switch (op2) {
2744  case 0:
2745  return MISCREG_PMEVTYPER0_EL0;
2746  case 1:
2747  return MISCREG_PMEVTYPER1_EL0;
2748  case 2:
2749  return MISCREG_PMEVTYPER2_EL0;
2750  case 3:
2751  return MISCREG_PMEVTYPER3_EL0;
2752  case 4:
2753  return MISCREG_PMEVTYPER4_EL0;
2754  case 5:
2755  return MISCREG_PMEVTYPER5_EL0;
2756  }
2757  break;
2758  case 15:
2759  switch (op2) {
2760  case 7:
2761  return MISCREG_PMCCFILTR_EL0;
2762  }
2763  }
2764  break;
2765  case 4:
2766  switch (crm) {
2767  case 0:
2768  switch (op2) {
2769  case 3:
2770  return MISCREG_CNTVOFF_EL2;
2771  }
2772  break;
2773  case 1:
2774  switch (op2) {
2775  case 0:
2776  return MISCREG_CNTHCTL_EL2;
2777  }
2778  break;
2779  case 2:
2780  switch (op2) {
2781  case 0:
2782  return MISCREG_CNTHP_TVAL_EL2;
2783  case 1:
2784  return MISCREG_CNTHP_CTL_EL2;
2785  case 2:
2786  return MISCREG_CNTHP_CVAL_EL2;
2787  }
2788  break;
2789  case 3:
2790  switch (op2) {
2791  case 0:
2792  return MISCREG_CNTHV_TVAL_EL2;
2793  case 1:
2794  return MISCREG_CNTHV_CTL_EL2;
2795  case 2:
2796  return MISCREG_CNTHV_CVAL_EL2;
2797  }
2798  break;
2799  }
2800  break;
2801  case 7:
2802  switch (crm) {
2803  case 2:
2804  switch (op2) {
2805  case 0:
2806  return MISCREG_CNTPS_TVAL_EL1;
2807  case 1:
2808  return MISCREG_CNTPS_CTL_EL1;
2809  case 2:
2810  return MISCREG_CNTPS_CVAL_EL1;
2811  }
2812  break;
2813  }
2814  break;
2815  }
2816  break;
2817  case 15:
2818  switch (op1) {
2819  case 0:
2820  switch (crm) {
2821  case 0:
2822  switch (op2) {
2823  case 0:
2824  return MISCREG_IL1DATA0_EL1;
2825  case 1:
2826  return MISCREG_IL1DATA1_EL1;
2827  case 2:
2828  return MISCREG_IL1DATA2_EL1;
2829  case 3:
2830  return MISCREG_IL1DATA3_EL1;
2831  }
2832  break;
2833  case 1:
2834  switch (op2) {
2835  case 0:
2836  return MISCREG_DL1DATA0_EL1;
2837  case 1:
2838  return MISCREG_DL1DATA1_EL1;
2839  case 2:
2840  return MISCREG_DL1DATA2_EL1;
2841  case 3:
2842  return MISCREG_DL1DATA3_EL1;
2843  case 4:
2844  return MISCREG_DL1DATA4_EL1;
2845  }
2846  break;
2847  }
2848  break;
2849  case 1:
2850  switch (crm) {
2851  case 0:
2852  switch (op2) {
2853  case 0:
2854  return MISCREG_L2ACTLR_EL1;
2855  }
2856  break;
2857  case 2:
2858  switch (op2) {
2859  case 0:
2860  return MISCREG_CPUACTLR_EL1;
2861  case 1:
2862  return MISCREG_CPUECTLR_EL1;
2863  case 2:
2864  return MISCREG_CPUMERRSR_EL1;
2865  case 3:
2866  return MISCREG_L2MERRSR_EL1;
2867  }
2868  break;
2869  case 3:
2870  switch (op2) {
2871  case 0:
2872  return MISCREG_CBAR_EL1;
2873 
2874  }
2875  break;
2876  }
2877  break;
2878  }
2879  // S3_<op1>_15_<Cm>_<op2>
2880  return MISCREG_IMPDEF_UNIMPL;
2881  }
2882  break;
2883  }
2884 
2885  return MISCREG_UNKNOWN;
2886 }
2887 
2888 bitset<NUM_MISCREG_INFOS> miscRegInfo[NUM_MISCREGS]; // initialized below
2889 
2890 void
2892 {
2893  // the MiscReg metadata tables are shared across all instances of the
2894  // ISA object, so there's no need to initialize them multiple times.
2895  static bool completed = false;
2896  if (completed)
2897  return;
2898 
2899  // This boolean variable specifies if the system is running in aarch32 at
2900  // EL3 (aarch32EL3 = true). It is false if EL3 is not implemented, or it
2901  // is running in aarch64 (aarch32EL3 = false)
2902  bool aarch32EL3 = haveSecurity && !highestELIs64;
2903 
2904  // Set Privileged Access Never on taking an exception to EL1 (Arm 8.1+),
2905  // unsupported
2906  bool SPAN = false;
2907 
2908  // Implicit error synchronization event enable (Arm 8.2+), unsupported
2909  bool IESB = false;
2910 
2911  // Load Multiple and Store Multiple Atomicity and Ordering (Arm 8.2+),
2912  // unsupported
2913  bool LSMAOE = false;
2914 
2915  // No Trap Load Multiple and Store Multiple (Arm 8.2+), unsupported
2916  bool nTLSMD = false;
2917 
2918  // Pointer authentication (Arm 8.3+), unsupported
2919  bool EnDA = true; // using APDAKey_EL1 key of instr addrs in ELs 0,1
2920  bool EnDB = true; // using APDBKey_EL1 key of instr addrs in ELs 0,1
2921  bool EnIA = true; // using APIAKey_EL1 key of instr addrs in ELs 0,1
2922  bool EnIB = true; // using APIBKey_EL1 key of instr addrs in ELs 0,1
2923 
2937  InitReg(MISCREG_CPSR)
2938  .allPrivileges();
2939  InitReg(MISCREG_SPSR)
2940  .allPrivileges();
2941  InitReg(MISCREG_SPSR_FIQ)
2942  .allPrivileges();
2943  InitReg(MISCREG_SPSR_IRQ)
2944  .allPrivileges();
2945  InitReg(MISCREG_SPSR_SVC)
2946  .allPrivileges();
2947  InitReg(MISCREG_SPSR_MON)
2948  .allPrivileges();
2949  InitReg(MISCREG_SPSR_ABT)
2950  .allPrivileges();
2951  InitReg(MISCREG_SPSR_HYP)
2952  .allPrivileges();
2953  InitReg(MISCREG_SPSR_UND)
2954  .allPrivileges();
2955  InitReg(MISCREG_ELR_HYP)
2956  .allPrivileges();
2957  InitReg(MISCREG_FPSID)
2958  .allPrivileges();
2959  InitReg(MISCREG_FPSCR)
2960  .allPrivileges();
2961  InitReg(MISCREG_MVFR1)
2962  .allPrivileges();
2963  InitReg(MISCREG_MVFR0)
2964  .allPrivileges();
2965  InitReg(MISCREG_FPEXC)
2966  .allPrivileges();
2967 
2968  // Helper registers
2969  InitReg(MISCREG_CPSR_MODE)
2970  .allPrivileges();
2971  InitReg(MISCREG_CPSR_Q)
2972  .allPrivileges();
2973  InitReg(MISCREG_FPSCR_EXC)
2974  .allPrivileges();
2975  InitReg(MISCREG_FPSCR_QC)
2976  .allPrivileges();
2977  InitReg(MISCREG_LOCKADDR)
2978  .allPrivileges();
2979  InitReg(MISCREG_LOCKFLAG)
2980  .allPrivileges();
2981  InitReg(MISCREG_PRRR_MAIR0)
2982  .mutex()
2983  .banked();
2984  InitReg(MISCREG_PRRR_MAIR0_NS)
2985  .mutex()
2986  .privSecure(!aarch32EL3)
2987  .bankedChild();
2988  InitReg(MISCREG_PRRR_MAIR0_S)
2989  .mutex()
2990  .bankedChild();
2991  InitReg(MISCREG_NMRR_MAIR1)
2992  .mutex()
2993  .banked();
2994  InitReg(MISCREG_NMRR_MAIR1_NS)
2995  .mutex()
2996  .privSecure(!aarch32EL3)
2997  .bankedChild();
2998  InitReg(MISCREG_NMRR_MAIR1_S)
2999  .mutex()
3000  .bankedChild();
3002  .mutex();
3003  InitReg(MISCREG_SCTLR_RST)
3004  .allPrivileges();
3005  InitReg(MISCREG_SEV_MAILBOX)
3006  .allPrivileges();
3007 
3008  // AArch32 CP14 registers
3009  InitReg(MISCREG_DBGDIDR)
3010  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3011  InitReg(MISCREG_DBGDSCRint)
3012  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3013  InitReg(MISCREG_DBGDCCINT)
3014  .unimplemented()
3015  .allPrivileges();
3016  InitReg(MISCREG_DBGDTRTXint)
3017  .unimplemented()
3018  .allPrivileges();
3019  InitReg(MISCREG_DBGDTRRXint)
3020  .unimplemented()
3021  .allPrivileges();
3022  InitReg(MISCREG_DBGWFAR)
3023  .unimplemented()
3024  .allPrivileges();
3025  InitReg(MISCREG_DBGVCR)
3026  .unimplemented()
3027  .allPrivileges();
3028  InitReg(MISCREG_DBGDTRRXext)
3029  .unimplemented()
3030  .allPrivileges();
3031  InitReg(MISCREG_DBGDSCRext)
3032  .unimplemented()
3033  .warnNotFail()
3034  .allPrivileges();
3035  InitReg(MISCREG_DBGDTRTXext)
3036  .unimplemented()
3037  .allPrivileges();
3038  InitReg(MISCREG_DBGOSECCR)
3039  .unimplemented()
3040  .allPrivileges();
3041  InitReg(MISCREG_DBGBVR0)
3042  .unimplemented()
3043  .allPrivileges();
3044  InitReg(MISCREG_DBGBVR1)
3045  .unimplemented()
3046  .allPrivileges();
3047  InitReg(MISCREG_DBGBVR2)
3048  .unimplemented()
3049  .allPrivileges();
3050  InitReg(MISCREG_DBGBVR3)
3051  .unimplemented()
3052  .allPrivileges();
3053  InitReg(MISCREG_DBGBVR4)
3054  .unimplemented()
3055  .allPrivileges();
3056  InitReg(MISCREG_DBGBVR5)
3057  .unimplemented()
3058  .allPrivileges();
3059  InitReg(MISCREG_DBGBCR0)
3060  .unimplemented()
3061  .allPrivileges();
3062  InitReg(MISCREG_DBGBCR1)
3063  .unimplemented()
3064  .allPrivileges();
3065  InitReg(MISCREG_DBGBCR2)
3066  .unimplemented()
3067  .allPrivileges();
3068  InitReg(MISCREG_DBGBCR3)
3069  .unimplemented()
3070  .allPrivileges();
3071  InitReg(MISCREG_DBGBCR4)
3072  .unimplemented()
3073  .allPrivileges();
3074  InitReg(MISCREG_DBGBCR5)
3075  .unimplemented()
3076  .allPrivileges();
3077  InitReg(MISCREG_DBGWVR0)
3078  .unimplemented()
3079  .allPrivileges();
3080  InitReg(MISCREG_DBGWVR1)
3081  .unimplemented()
3082  .allPrivileges();
3083  InitReg(MISCREG_DBGWVR2)
3084  .unimplemented()
3085  .allPrivileges();
3086  InitReg(MISCREG_DBGWVR3)
3087  .unimplemented()
3088  .allPrivileges();
3089  InitReg(MISCREG_DBGWCR0)
3090  .unimplemented()
3091  .allPrivileges();
3092  InitReg(MISCREG_DBGWCR1)
3093  .unimplemented()
3094  .allPrivileges();
3095  InitReg(MISCREG_DBGWCR2)
3096  .unimplemented()
3097  .allPrivileges();
3098  InitReg(MISCREG_DBGWCR3)
3099  .unimplemented()
3100  .allPrivileges();
3101  InitReg(MISCREG_DBGDRAR)
3102  .unimplemented()
3103  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3104  InitReg(MISCREG_DBGBXVR4)
3105  .unimplemented()
3106  .allPrivileges();
3107  InitReg(MISCREG_DBGBXVR5)
3108  .unimplemented()
3109  .allPrivileges();
3110  InitReg(MISCREG_DBGOSLAR)
3111  .unimplemented()
3112  .allPrivileges().monSecureRead(0).monNonSecureRead(0);
3113  InitReg(MISCREG_DBGOSLSR)
3114  .unimplemented()
3115  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3116  InitReg(MISCREG_DBGOSDLR)
3117  .unimplemented()
3118  .allPrivileges();
3119  InitReg(MISCREG_DBGPRCR)
3120  .unimplemented()
3121  .allPrivileges();
3122  InitReg(MISCREG_DBGDSAR)
3123  .unimplemented()
3124  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3125  InitReg(MISCREG_DBGCLAIMSET)
3126  .unimplemented()
3127  .allPrivileges();
3128  InitReg(MISCREG_DBGCLAIMCLR)
3129  .unimplemented()
3130  .allPrivileges();
3131  InitReg(MISCREG_DBGAUTHSTATUS)
3132  .unimplemented()
3133  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3134  InitReg(MISCREG_DBGDEVID2)
3135  .unimplemented()
3136  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3137  InitReg(MISCREG_DBGDEVID1)
3138  .unimplemented()
3139  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3140  InitReg(MISCREG_DBGDEVID0)
3141  .unimplemented()
3142  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3143  InitReg(MISCREG_TEECR)
3144  .unimplemented()
3145  .allPrivileges();
3146  InitReg(MISCREG_JIDR)
3147  .allPrivileges();
3148  InitReg(MISCREG_TEEHBR)
3149  .allPrivileges();
3150  InitReg(MISCREG_JOSCR)
3151  .allPrivileges();
3152  InitReg(MISCREG_JMCR)
3153  .allPrivileges();
3154 
3155  // AArch32 CP15 registers
3156  InitReg(MISCREG_MIDR)
3157  .allPrivileges().exceptUserMode().writes(0);
3158  InitReg(MISCREG_CTR)
3159  .allPrivileges().exceptUserMode().writes(0);
3160  InitReg(MISCREG_TCMTR)
3161  .allPrivileges().exceptUserMode().writes(0);
3162  InitReg(MISCREG_TLBTR)
3163  .allPrivileges().exceptUserMode().writes(0);
3164  InitReg(MISCREG_MPIDR)
3165  .allPrivileges().exceptUserMode().writes(0);
3166  InitReg(MISCREG_REVIDR)
3167  .unimplemented()
3168  .warnNotFail()
3169  .allPrivileges().exceptUserMode().writes(0);
3170  InitReg(MISCREG_ID_PFR0)
3171  .allPrivileges().exceptUserMode().writes(0);
3172  InitReg(MISCREG_ID_PFR1)
3173  .allPrivileges().exceptUserMode().writes(0);
3174  InitReg(MISCREG_ID_DFR0)
3175  .allPrivileges().exceptUserMode().writes(0);
3176  InitReg(MISCREG_ID_AFR0)
3177  .allPrivileges().exceptUserMode().writes(0);
3178  InitReg(MISCREG_ID_MMFR0)
3179  .allPrivileges().exceptUserMode().writes(0);
3180  InitReg(MISCREG_ID_MMFR1)
3181  .allPrivileges().exceptUserMode().writes(0);
3182  InitReg(MISCREG_ID_MMFR2)
3183  .allPrivileges().exceptUserMode().writes(0);
3184  InitReg(MISCREG_ID_MMFR3)
3185  .allPrivileges().exceptUserMode().writes(0);
3186  InitReg(MISCREG_ID_ISAR0)
3187  .allPrivileges().exceptUserMode().writes(0);
3188  InitReg(MISCREG_ID_ISAR1)
3189  .allPrivileges().exceptUserMode().writes(0);
3190  InitReg(MISCREG_ID_ISAR2)
3191  .allPrivileges().exceptUserMode().writes(0);
3192  InitReg(MISCREG_ID_ISAR3)
3193  .allPrivileges().exceptUserMode().writes(0);
3194  InitReg(MISCREG_ID_ISAR4)
3195  .allPrivileges().exceptUserMode().writes(0);
3196  InitReg(MISCREG_ID_ISAR5)
3197  .allPrivileges().exceptUserMode().writes(0);
3198  InitReg(MISCREG_CCSIDR)
3199  .allPrivileges().exceptUserMode().writes(0);
3200  InitReg(MISCREG_CLIDR)
3201  .allPrivileges().exceptUserMode().writes(0);
3202  InitReg(MISCREG_AIDR)
3203  .allPrivileges().exceptUserMode().writes(0);
3204  InitReg(MISCREG_CSSELR)
3205  .banked();
3206  InitReg(MISCREG_CSSELR_NS)
3207  .bankedChild()
3208  .privSecure(!aarch32EL3)
3209  .nonSecure().exceptUserMode();
3210  InitReg(MISCREG_CSSELR_S)
3211  .bankedChild()
3212  .secure().exceptUserMode();
3213  InitReg(MISCREG_VPIDR)
3214  .hyp().monNonSecure();
3215  InitReg(MISCREG_VMPIDR)
3216  .hyp().monNonSecure();
3217  InitReg(MISCREG_SCTLR)
3218  .banked()
3219  // readMiscRegNoEffect() uses this metadata
3220  // despite using children (below) as backing store
3221  .res0(0x8d22c600)
3222  .res1(0x00400800 | (SPAN ? 0 : 0x800000)
3223  | (LSMAOE ? 0 : 0x10)
3224  | (nTLSMD ? 0 : 0x8));
3225  InitReg(MISCREG_SCTLR_NS)
3226  .bankedChild()
3227  .privSecure(!aarch32EL3)
3228  .nonSecure().exceptUserMode();
3229  InitReg(MISCREG_SCTLR_S)
3230  .bankedChild()
3231  .secure().exceptUserMode();
3232  InitReg(MISCREG_ACTLR)
3233  .banked();
3234  InitReg(MISCREG_ACTLR_NS)
3235  .bankedChild()
3236  .privSecure(!aarch32EL3)
3237  .nonSecure().exceptUserMode();
3238  InitReg(MISCREG_ACTLR_S)
3239  .bankedChild()
3240  .secure().exceptUserMode();
3241  InitReg(MISCREG_CPACR)
3242  .allPrivileges().exceptUserMode();
3243  InitReg(MISCREG_SCR)
3244  .mon().secure().exceptUserMode()
3245  .res0(0xff40) // [31:16], [6]
3246  .res1(0x0030); // [5:4]
3247  InitReg(MISCREG_SDER)
3248  .mon();
3249  InitReg(MISCREG_NSACR)
3250  .allPrivileges().hypWrite(0).privNonSecureWrite(0).exceptUserMode();
3251  InitReg(MISCREG_HSCTLR)
3252  .hyp().monNonSecure()
3253  .res0(0x0512c7c0 | (EnDB ? 0 : 0x2000)
3254  | (IESB ? 0 : 0x200000)
3255  | (EnDA ? 0 : 0x8000000)
3256  | (EnIB ? 0 : 0x40000000)
3257  | (EnIA ? 0 : 0x80000000))
3258  .res1(0x30c50830);
3259  InitReg(MISCREG_HACTLR)
3260  .hyp().monNonSecure();
3261  InitReg(MISCREG_HCR)
3262  .hyp().monNonSecure()
3263  .res0(0x90000000);
3264  InitReg(MISCREG_HCR2)
3265  .hyp().monNonSecure()
3266  .res0(0xffa9ff8c);
3267  InitReg(MISCREG_HDCR)
3268  .hyp().monNonSecure();
3269  InitReg(MISCREG_HCPTR)
3270  .hyp().monNonSecure();
3271  InitReg(MISCREG_HSTR)
3272  .hyp().monNonSecure();
3273  InitReg(MISCREG_HACR)
3274  .unimplemented()
3275  .warnNotFail()
3276  .hyp().monNonSecure();
3277  InitReg(MISCREG_TTBR0)
3278  .banked();
3279  InitReg(MISCREG_TTBR0_NS)
3280  .bankedChild()
3281  .privSecure(!aarch32EL3)
3282  .nonSecure().exceptUserMode();
3283  InitReg(MISCREG_TTBR0_S)
3284  .bankedChild()
3285  .secure().exceptUserMode();
3286  InitReg(MISCREG_TTBR1)
3287  .banked();
3288  InitReg(MISCREG_TTBR1_NS)
3289  .bankedChild()
3290  .privSecure(!aarch32EL3)
3291  .nonSecure().exceptUserMode();
3292  InitReg(MISCREG_TTBR1_S)
3293  .bankedChild()
3294  .secure().exceptUserMode();
3295  InitReg(MISCREG_TTBCR)
3296  .banked();
3297  InitReg(MISCREG_TTBCR_NS)
3298  .bankedChild()
3299  .privSecure(!aarch32EL3)
3300  .nonSecure().exceptUserMode();
3301  InitReg(MISCREG_TTBCR_S)
3302  .bankedChild()
3303  .secure().exceptUserMode();
3304  InitReg(MISCREG_HTCR)
3305  .hyp().monNonSecure();
3306  InitReg(MISCREG_VTCR)
3307  .hyp().monNonSecure();
3308  InitReg(MISCREG_DACR)
3309  .banked();
3310  InitReg(MISCREG_DACR_NS)
3311  .bankedChild()
3312  .privSecure(!aarch32EL3)
3313  .nonSecure().exceptUserMode();
3314  InitReg(MISCREG_DACR_S)
3315  .bankedChild()
3316  .secure().exceptUserMode();
3317  InitReg(MISCREG_DFSR)
3318  .banked();
3319  InitReg(MISCREG_DFSR_NS)
3320  .bankedChild()
3321  .privSecure(!aarch32EL3)
3322  .nonSecure().exceptUserMode();
3323  InitReg(MISCREG_DFSR_S)
3324  .bankedChild()
3325  .secure().exceptUserMode();
3326  InitReg(MISCREG_IFSR)
3327  .banked();
3328  InitReg(MISCREG_IFSR_NS)
3329  .bankedChild()
3330  .privSecure(!aarch32EL3)
3331  .nonSecure().exceptUserMode();
3332  InitReg(MISCREG_IFSR_S)
3333  .bankedChild()
3334  .secure().exceptUserMode();
3335  InitReg(MISCREG_ADFSR)
3336  .unimplemented()
3337  .warnNotFail()
3338  .banked();
3339  InitReg(MISCREG_ADFSR_NS)
3340  .unimplemented()
3341  .warnNotFail()
3342  .bankedChild()
3343  .privSecure(!aarch32EL3)
3344  .nonSecure().exceptUserMode();
3345  InitReg(MISCREG_ADFSR_S)
3346  .unimplemented()
3347  .warnNotFail()
3348  .bankedChild()
3349  .secure().exceptUserMode();
3350  InitReg(MISCREG_AIFSR)
3351  .unimplemented()
3352  .warnNotFail()
3353  .banked();
3354  InitReg(MISCREG_AIFSR_NS)
3355  .unimplemented()
3356  .warnNotFail()
3357  .bankedChild()
3358  .privSecure(!aarch32EL3)
3359  .nonSecure().exceptUserMode();
3360  InitReg(MISCREG_AIFSR_S)
3361  .unimplemented()
3362  .warnNotFail()
3363  .bankedChild()
3364  .secure().exceptUserMode();
3365  InitReg(MISCREG_HADFSR)
3366  .hyp().monNonSecure();
3367  InitReg(MISCREG_HAIFSR)
3368  .hyp().monNonSecure();
3369  InitReg(MISCREG_HSR)
3370  .hyp().monNonSecure();
3371  InitReg(MISCREG_DFAR)
3372  .banked();
3373  InitReg(MISCREG_DFAR_NS)
3374  .bankedChild()
3375  .privSecure(!aarch32EL3)
3376  .nonSecure().exceptUserMode();
3377  InitReg(MISCREG_DFAR_S)
3378  .bankedChild()
3379  .secure().exceptUserMode();
3380  InitReg(MISCREG_IFAR)
3381  .banked();
3382  InitReg(MISCREG_IFAR_NS)
3383  .bankedChild()
3384  .privSecure(!aarch32EL3)
3385  .nonSecure().exceptUserMode();
3386  InitReg(MISCREG_IFAR_S)
3387  .bankedChild()
3388  .secure().exceptUserMode();
3389  InitReg(MISCREG_HDFAR)
3390  .hyp().monNonSecure();
3391  InitReg(MISCREG_HIFAR)
3392  .hyp().monNonSecure();
3393  InitReg(MISCREG_HPFAR)
3394  .hyp().monNonSecure();
3395  InitReg(MISCREG_ICIALLUIS)
3396  .unimplemented()
3397  .warnNotFail()
3398  .writes(1).exceptUserMode();
3399  InitReg(MISCREG_BPIALLIS)
3400  .unimplemented()
3401  .warnNotFail()
3402  .writes(1).exceptUserMode();
3403  InitReg(MISCREG_PAR)
3404  .banked();
3405  InitReg(MISCREG_PAR_NS)
3406  .bankedChild()
3407  .privSecure(!aarch32EL3)
3408  .nonSecure().exceptUserMode();
3409  InitReg(MISCREG_PAR_S)
3410  .bankedChild()
3411  .secure().exceptUserMode();
3412  InitReg(MISCREG_ICIALLU)
3413  .writes(1).exceptUserMode();
3414  InitReg(MISCREG_ICIMVAU)
3415  .unimplemented()
3416  .warnNotFail()
3417  .writes(1).exceptUserMode();
3418  InitReg(MISCREG_CP15ISB)
3419  .writes(1);
3420  InitReg(MISCREG_BPIALL)
3421  .unimplemented()
3422  .warnNotFail()
3423  .writes(1).exceptUserMode();
3424  InitReg(MISCREG_BPIMVA)
3425  .unimplemented()
3426  .warnNotFail()
3427  .writes(1).exceptUserMode();
3428  InitReg(MISCREG_DCIMVAC)
3429  .unimplemented()
3430  .warnNotFail()
3431  .writes(1).exceptUserMode();
3432  InitReg(MISCREG_DCISW)
3433  .unimplemented()
3434  .warnNotFail()
3435  .writes(1).exceptUserMode();
3436  InitReg(MISCREG_ATS1CPR)
3437  .writes(1).exceptUserMode();
3438  InitReg(MISCREG_ATS1CPW)
3439  .writes(1).exceptUserMode();
3440  InitReg(MISCREG_ATS1CUR)
3441  .writes(1).exceptUserMode();
3442  InitReg(MISCREG_ATS1CUW)
3443  .writes(1).exceptUserMode();
3444  InitReg(MISCREG_ATS12NSOPR)
3445  .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite();
3446  InitReg(MISCREG_ATS12NSOPW)
3447  .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite();
3448  InitReg(MISCREG_ATS12NSOUR)
3449  .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite();
3450  InitReg(MISCREG_ATS12NSOUW)
3451  .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite();
3452  InitReg(MISCREG_DCCMVAC)
3453  .writes(1).exceptUserMode();
3454  InitReg(MISCREG_DCCSW)
3455  .unimplemented()
3456  .warnNotFail()
3457  .writes(1).exceptUserMode();
3458  InitReg(MISCREG_CP15DSB)
3459  .writes(1);
3460  InitReg(MISCREG_CP15DMB)
3461  .writes(1);
3462  InitReg(MISCREG_DCCMVAU)
3463  .unimplemented()
3464  .warnNotFail()
3465  .writes(1).exceptUserMode();
3466  InitReg(MISCREG_DCCIMVAC)
3467  .unimplemented()
3468  .warnNotFail()
3469  .writes(1).exceptUserMode();
3470  InitReg(MISCREG_DCCISW)
3471  .unimplemented()
3472  .warnNotFail()
3473  .writes(1).exceptUserMode();
3474  InitReg(MISCREG_ATS1HR)
3475  .monNonSecureWrite().hypWrite();
3476  InitReg(MISCREG_ATS1HW)
3477  .monNonSecureWrite().hypWrite();
3478  InitReg(MISCREG_TLBIALLIS)
3479  .writes(1).exceptUserMode();
3480  InitReg(MISCREG_TLBIMVAIS)
3481  .writes(1).exceptUserMode();
3482  InitReg(MISCREG_TLBIASIDIS)
3483  .writes(1).exceptUserMode();
3484  InitReg(MISCREG_TLBIMVAAIS)
3485  .writes(1).exceptUserMode();
3486  InitReg(MISCREG_TLBIMVALIS)
3487  .writes(1).exceptUserMode();
3488  InitReg(MISCREG_TLBIMVAALIS)
3489  .writes(1).exceptUserMode();
3490  InitReg(MISCREG_ITLBIALL)
3491  .writes(1).exceptUserMode();
3492  InitReg(MISCREG_ITLBIMVA)
3493  .writes(1).exceptUserMode();
3494  InitReg(MISCREG_ITLBIASID)
3495  .writes(1).exceptUserMode();
3496  InitReg(MISCREG_DTLBIALL)
3497  .writes(1).exceptUserMode();
3498  InitReg(MISCREG_DTLBIMVA)
3499  .writes(1).exceptUserMode();
3500  InitReg(MISCREG_DTLBIASID)
3501  .writes(1).exceptUserMode();
3502  InitReg(MISCREG_TLBIALL)
3503  .writes(1).exceptUserMode();
3504  InitReg(MISCREG_TLBIMVA)
3505  .writes(1).exceptUserMode();
3506  InitReg(MISCREG_TLBIASID)
3507  .writes(1).exceptUserMode();
3508  InitReg(MISCREG_TLBIMVAA)
3509  .writes(1).exceptUserMode();
3510  InitReg(MISCREG_TLBIMVAL)
3511  .writes(1).exceptUserMode();
3512  InitReg(MISCREG_TLBIMVAAL)
3513  .writes(1).exceptUserMode();
3514  InitReg(MISCREG_TLBIIPAS2IS)
3515  .monNonSecureWrite().hypWrite();
3516  InitReg(MISCREG_TLBIIPAS2LIS)
3517  .monNonSecureWrite().hypWrite();
3518  InitReg(MISCREG_TLBIALLHIS)
3519  .monNonSecureWrite().hypWrite();
3520  InitReg(MISCREG_TLBIMVAHIS)
3521  .monNonSecureWrite().hypWrite();
3522  InitReg(MISCREG_TLBIALLNSNHIS)
3523  .monNonSecureWrite().hypWrite();
3524  InitReg(MISCREG_TLBIMVALHIS)
3525  .monNonSecureWrite().hypWrite();
3526  InitReg(MISCREG_TLBIIPAS2)
3527  .monNonSecureWrite().hypWrite();
3528  InitReg(MISCREG_TLBIIPAS2L)
3529  .monNonSecureWrite().hypWrite();
3530  InitReg(MISCREG_TLBIALLH)
3531  .monNonSecureWrite().hypWrite();
3532  InitReg(MISCREG_TLBIMVAH)
3533  .monNonSecureWrite().hypWrite();
3534  InitReg(MISCREG_TLBIALLNSNH)
3535  .monNonSecureWrite().hypWrite();
3536  InitReg(MISCREG_TLBIMVALH)
3537  .monNonSecureWrite().hypWrite();
3538  InitReg(MISCREG_PMCR)
3539  .allPrivileges();
3540  InitReg(MISCREG_PMCNTENSET)
3541  .allPrivileges();
3542  InitReg(MISCREG_PMCNTENCLR)
3543  .allPrivileges();
3544  InitReg(MISCREG_PMOVSR)
3545  .allPrivileges();
3546  InitReg(MISCREG_PMSWINC)
3547  .allPrivileges();
3548  InitReg(MISCREG_PMSELR)
3549  .allPrivileges();
3550  InitReg(MISCREG_PMCEID0)
3551  .allPrivileges();
3552  InitReg(MISCREG_PMCEID1)
3553  .allPrivileges();
3554  InitReg(MISCREG_PMCCNTR)
3555  .allPrivileges();
3556  InitReg(MISCREG_PMXEVTYPER)
3557  .allPrivileges();
3558  InitReg(MISCREG_PMCCFILTR)
3559  .allPrivileges();
3560  InitReg(MISCREG_PMXEVCNTR)
3561  .allPrivileges();
3562  InitReg(MISCREG_PMUSERENR)
3563  .allPrivileges().userNonSecureWrite(0).userSecureWrite(0);
3564  InitReg(MISCREG_PMINTENSET)
3565  .allPrivileges().exceptUserMode();
3566  InitReg(MISCREG_PMINTENCLR)
3567  .allPrivileges().exceptUserMode();
3568  InitReg(MISCREG_PMOVSSET)
3569  .unimplemented()
3570  .allPrivileges();
3571  InitReg(MISCREG_L2CTLR)
3572  .allPrivileges().exceptUserMode();
3573  InitReg(MISCREG_L2ECTLR)
3574  .unimplemented()
3575  .allPrivileges().exceptUserMode();
3576  InitReg(MISCREG_PRRR)
3577  .banked();
3578  InitReg(MISCREG_PRRR_NS)
3579  .bankedChild()
3580  .privSecure(!aarch32EL3)
3581  .nonSecure().exceptUserMode();
3582  InitReg(MISCREG_PRRR_S)
3583  .bankedChild()
3584  .secure().exceptUserMode();
3585  InitReg(MISCREG_MAIR0)
3586  .banked();
3587  InitReg(MISCREG_MAIR0_NS)
3588  .bankedChild()
3589  .privSecure(!aarch32EL3)
3590  .nonSecure().exceptUserMode();
3591  InitReg(MISCREG_MAIR0_S)
3592  .bankedChild()
3593  .secure().exceptUserMode();
3594  InitReg(MISCREG_NMRR)
3595  .banked();
3596  InitReg(MISCREG_NMRR_NS)
3597  .bankedChild()
3598  .privSecure(!aarch32EL3)
3599  .nonSecure().exceptUserMode();
3600  InitReg(MISCREG_NMRR_S)
3601  .bankedChild()
3602  .secure().exceptUserMode();
3603  InitReg(MISCREG_MAIR1)
3604  .banked();
3605  InitReg(MISCREG_MAIR1_NS)
3606  .bankedChild()
3607  .privSecure(!aarch32EL3)
3608  .nonSecure().exceptUserMode();
3609  InitReg(MISCREG_MAIR1_S)
3610  .bankedChild()
3611  .secure().exceptUserMode();
3612  InitReg(MISCREG_AMAIR0)
3613  .banked();
3614  InitReg(MISCREG_AMAIR0_NS)
3615  .bankedChild()
3616  .privSecure(!aarch32EL3)
3617  .nonSecure().exceptUserMode();
3618  InitReg(MISCREG_AMAIR0_S)
3619  .bankedChild()
3620  .secure().exceptUserMode();
3621  InitReg(MISCREG_AMAIR1)
3622  .banked();
3623  InitReg(MISCREG_AMAIR1_NS)
3624  .bankedChild()
3625  .privSecure(!aarch32EL3)
3626  .nonSecure().exceptUserMode();
3627  InitReg(MISCREG_AMAIR1_S)
3628  .bankedChild()
3629  .secure().exceptUserMode();
3630  InitReg(MISCREG_HMAIR0)
3631  .hyp().monNonSecure();
3632  InitReg(MISCREG_HMAIR1)
3633  .hyp().monNonSecure();
3634  InitReg(MISCREG_HAMAIR0)
3635  .unimplemented()
3636  .warnNotFail()
3637  .hyp().monNonSecure();
3638  InitReg(MISCREG_HAMAIR1)
3639  .unimplemented()
3640  .warnNotFail()
3641  .hyp().monNonSecure();
3642  InitReg(MISCREG_VBAR)
3643  .banked();
3644  InitReg(MISCREG_VBAR_NS)
3645  .bankedChild()
3646  .privSecure(!aarch32EL3)
3647  .nonSecure().exceptUserMode();
3648  InitReg(MISCREG_VBAR_S)
3649  .bankedChild()
3650  .secure().exceptUserMode();
3651  InitReg(MISCREG_MVBAR)
3652  .mon().secure()
3653  .hypRead(FullSystem && system->highestEL() == EL2)
3654  .privRead(FullSystem && system->highestEL() == EL1)
3655  .exceptUserMode();
3656  InitReg(MISCREG_RMR)
3657  .unimplemented()
3658  .mon().secure().exceptUserMode();
3659  InitReg(MISCREG_ISR)
3660  .allPrivileges().exceptUserMode().writes(0);
3661  InitReg(MISCREG_HVBAR)
3662  .hyp().monNonSecure()
3663  .res0(0x1f);
3664  InitReg(MISCREG_FCSEIDR)
3665  .unimplemented()
3666  .warnNotFail()
3667  .allPrivileges().exceptUserMode();
3668  InitReg(MISCREG_CONTEXTIDR)
3669  .banked();
3670  InitReg(MISCREG_CONTEXTIDR_NS)
3671  .bankedChild()
3672  .privSecure(!aarch32EL3)
3673  .nonSecure().exceptUserMode();
3674  InitReg(MISCREG_CONTEXTIDR_S)
3675  .bankedChild()
3676  .secure().exceptUserMode();
3677  InitReg(MISCREG_TPIDRURW)
3678  .banked();
3679  InitReg(MISCREG_TPIDRURW_NS)
3680  .bankedChild()
3681  .allPrivileges()
3682  .privSecure(!aarch32EL3)
3683  .monSecure(0);
3684  InitReg(MISCREG_TPIDRURW_S)
3685  .bankedChild()
3686  .secure();
3687  InitReg(MISCREG_TPIDRURO)
3688  .banked();
3689  InitReg(MISCREG_TPIDRURO_NS)
3690  .bankedChild()
3691  .allPrivileges()
3692  .userNonSecureWrite(0).userSecureRead(1)
3693  .privSecure(!aarch32EL3)
3694  .monSecure(0);
3695  InitReg(MISCREG_TPIDRURO_S)
3696  .bankedChild()
3697  .secure().userSecureWrite(0);
3698  InitReg(MISCREG_TPIDRPRW)
3699  .banked();
3700  InitReg(MISCREG_TPIDRPRW_NS)
3701  .bankedChild()
3702  .nonSecure().exceptUserMode()
3703  .privSecure(!aarch32EL3);
3704  InitReg(MISCREG_TPIDRPRW_S)
3705  .bankedChild()
3706  .secure().exceptUserMode();
3707  InitReg(MISCREG_HTPIDR)
3708  .hyp().monNonSecure();
3709  InitReg(MISCREG_CNTFRQ)
3710  .reads(1)
3711  .highest(system)
3712  .privSecureWrite(aarch32EL3);
3713  InitReg(MISCREG_CNTKCTL)
3714  .allPrivileges().exceptUserMode();
3715  InitReg(MISCREG_CNTP_TVAL)
3716  .banked();
3717  InitReg(MISCREG_CNTP_TVAL_NS)
3718  .bankedChild()
3719  .allPrivileges()
3720  .privSecure(!aarch32EL3)
3721  .monSecure(0);
3722  InitReg(MISCREG_CNTP_TVAL_S)
3723  .bankedChild()
3724  .secure().user(1);
3725  InitReg(MISCREG_CNTP_CTL)
3726  .banked();
3727  InitReg(MISCREG_CNTP_CTL_NS)
3728  .bankedChild()
3729  .allPrivileges()
3730  .privSecure(!aarch32EL3)
3731  .monSecure(0);
3732  InitReg(MISCREG_CNTP_CTL_S)
3733  .bankedChild()
3734  .secure().user(1);
3735  InitReg(MISCREG_CNTV_TVAL)
3736  .allPrivileges();
3737  InitReg(MISCREG_CNTV_CTL)
3738  .allPrivileges();
3739  InitReg(MISCREG_CNTHCTL)
3740  .hypWrite().monNonSecureRead();
3741  InitReg(MISCREG_CNTHP_TVAL)
3742  .hypWrite().monNonSecureRead();
3743  InitReg(MISCREG_CNTHP_CTL)
3744  .hypWrite().monNonSecureRead();
3745  InitReg(MISCREG_IL1DATA0)
3746  .unimplemented()
3747  .allPrivileges().exceptUserMode();
3748  InitReg(MISCREG_IL1DATA1)
3749  .unimplemented()
3750  .allPrivileges().exceptUserMode();
3751  InitReg(MISCREG_IL1DATA2)
3752  .unimplemented()
3753  .allPrivileges().exceptUserMode();
3754  InitReg(MISCREG_IL1DATA3)
3755  .unimplemented()
3756  .allPrivileges().exceptUserMode();
3757  InitReg(MISCREG_DL1DATA0)
3758  .unimplemented()
3759  .allPrivileges().exceptUserMode();
3760  InitReg(MISCREG_DL1DATA1)
3761  .unimplemented()
3762  .allPrivileges().exceptUserMode();
3763  InitReg(MISCREG_DL1DATA2)
3764  .unimplemented()
3765  .allPrivileges().exceptUserMode();
3766  InitReg(MISCREG_DL1DATA3)
3767  .unimplemented()
3768  .allPrivileges().exceptUserMode();
3769  InitReg(MISCREG_DL1DATA4)
3770  .unimplemented()
3771  .allPrivileges().exceptUserMode();
3772  InitReg(MISCREG_RAMINDEX)
3773  .unimplemented()
3774  .writes(1).exceptUserMode();
3775  InitReg(MISCREG_L2ACTLR)
3776  .unimplemented()
3777  .allPrivileges().exceptUserMode();
3778  InitReg(MISCREG_CBAR)
3779  .unimplemented()
3780  .allPrivileges().exceptUserMode().writes(0);
3781  InitReg(MISCREG_HTTBR)
3782  .hyp().monNonSecure();
3783  InitReg(MISCREG_VTTBR)
3784  .hyp().monNonSecure();
3785  InitReg(MISCREG_CNTPCT)
3786  .reads(1);
3787  InitReg(MISCREG_CNTVCT)
3788  .unverifiable()
3789  .reads(1);
3790  InitReg(MISCREG_CNTP_CVAL)
3791  .banked();
3792  InitReg(MISCREG_CNTP_CVAL_NS)
3793  .bankedChild()
3794  .allPrivileges()
3795  .privSecure(!aarch32EL3)
3796  .monSecure(0);
3797  InitReg(MISCREG_CNTP_CVAL_S)
3798  .bankedChild()
3799  .secure().user(1);
3800  InitReg(MISCREG_CNTV_CVAL)
3801  .allPrivileges();
3802  InitReg(MISCREG_CNTVOFF)
3803  .hyp().monNonSecure();
3804  InitReg(MISCREG_CNTHP_CVAL)
3805  .hypWrite().monNonSecureRead();
3806  InitReg(MISCREG_CPUMERRSR)
3807  .unimplemented()
3808  .allPrivileges().exceptUserMode();
3809  InitReg(MISCREG_L2MERRSR)
3810  .unimplemented()
3811  .warnNotFail()
3812  .allPrivileges().exceptUserMode();
3813 
3814  // AArch64 registers (Op0=2);
3815  InitReg(MISCREG_MDCCINT_EL1)
3816  .allPrivileges();
3817  InitReg(MISCREG_OSDTRRX_EL1)
3818  .allPrivileges()
3819  .mapsTo(MISCREG_DBGDTRRXext);
3820  InitReg(MISCREG_MDSCR_EL1)
3821  .allPrivileges()
3822  .mapsTo(MISCREG_DBGDSCRext);
3823  InitReg(MISCREG_OSDTRTX_EL1)
3824  .allPrivileges()
3825  .mapsTo(MISCREG_DBGDTRTXext);
3826  InitReg(MISCREG_OSECCR_EL1)
3827  .allPrivileges()
3828  .mapsTo(MISCREG_DBGOSECCR);
3829  InitReg(MISCREG_DBGBVR0_EL1)
3830  .allPrivileges()
3831  .mapsTo(MISCREG_DBGBVR0 /*, MISCREG_DBGBXVR0 */);
3832  InitReg(MISCREG_DBGBVR1_EL1)
3833  .allPrivileges()
3834  .mapsTo(MISCREG_DBGBVR1 /*, MISCREG_DBGBXVR1 */);
3835  InitReg(MISCREG_DBGBVR2_EL1)
3836  .allPrivileges()
3837  .mapsTo(MISCREG_DBGBVR2 /*, MISCREG_DBGBXVR2 */);
3838  InitReg(MISCREG_DBGBVR3_EL1)
3839  .allPrivileges()
3840  .mapsTo(MISCREG_DBGBVR3 /*, MISCREG_DBGBXVR3 */);
3841  InitReg(MISCREG_DBGBVR4_EL1)
3842  .allPrivileges()
3843  .mapsTo(MISCREG_DBGBVR4 /*, MISCREG_DBGBXVR4 */);
3844  InitReg(MISCREG_DBGBVR5_EL1)
3845  .allPrivileges()
3846  .mapsTo(MISCREG_DBGBVR5 /*, MISCREG_DBGBXVR5 */);
3847  InitReg(MISCREG_DBGBCR0_EL1)
3848  .allPrivileges()
3849  .mapsTo(MISCREG_DBGBCR0);
3850  InitReg(MISCREG_DBGBCR1_EL1)
3851  .allPrivileges()
3852  .mapsTo(MISCREG_DBGBCR1);
3853  InitReg(MISCREG_DBGBCR2_EL1)
3854  .allPrivileges()
3855  .mapsTo(MISCREG_DBGBCR2);
3856  InitReg(MISCREG_DBGBCR3_EL1)
3857  .allPrivileges()
3858  .mapsTo(MISCREG_DBGBCR3);
3859  InitReg(MISCREG_DBGBCR4_EL1)
3860  .allPrivileges()
3861  .mapsTo(MISCREG_DBGBCR4);
3862  InitReg(MISCREG_DBGBCR5_EL1)
3863  .allPrivileges()
3864  .mapsTo(MISCREG_DBGBCR5);
3865  InitReg(MISCREG_DBGWVR0_EL1)
3866  .allPrivileges()
3867  .mapsTo(MISCREG_DBGWVR0);
3868  InitReg(MISCREG_DBGWVR1_EL1)
3869  .allPrivileges()
3870  .mapsTo(MISCREG_DBGWVR1);
3871  InitReg(MISCREG_DBGWVR2_EL1)
3872  .allPrivileges()
3873  .mapsTo(MISCREG_DBGWVR2);
3874  InitReg(MISCREG_DBGWVR3_EL1)
3875  .allPrivileges()
3876  .mapsTo(MISCREG_DBGWVR3);
3877  InitReg(MISCREG_DBGWCR0_EL1)
3878  .allPrivileges()
3879  .mapsTo(MISCREG_DBGWCR0);
3880  InitReg(MISCREG_DBGWCR1_EL1)
3881  .allPrivileges()
3882  .mapsTo(MISCREG_DBGWCR1);
3883  InitReg(MISCREG_DBGWCR2_EL1)
3884  .allPrivileges()
3885  .mapsTo(MISCREG_DBGWCR2);
3886  InitReg(MISCREG_DBGWCR3_EL1)
3887  .allPrivileges()
3888  .mapsTo(MISCREG_DBGWCR3);
3889  InitReg(MISCREG_MDCCSR_EL0)
3890  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0)
3891  .mapsTo(MISCREG_DBGDSCRint);
3892  InitReg(MISCREG_MDDTR_EL0)
3893  .allPrivileges();
3894  InitReg(MISCREG_MDDTRTX_EL0)
3895  .allPrivileges();
3896  InitReg(MISCREG_MDDTRRX_EL0)
3897  .allPrivileges();
3898  InitReg(MISCREG_DBGVCR32_EL2)
3899  .allPrivileges()
3900  .mapsTo(MISCREG_DBGVCR);
3901  InitReg(MISCREG_MDRAR_EL1)
3902  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0)
3903  .mapsTo(MISCREG_DBGDRAR);
3904  InitReg(MISCREG_OSLAR_EL1)
3905  .allPrivileges().monSecureRead(0).monNonSecureRead(0)
3906  .mapsTo(MISCREG_DBGOSLAR);
3907  InitReg(MISCREG_OSLSR_EL1)
3908  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0)
3909  .mapsTo(MISCREG_DBGOSLSR);
3910  InitReg(MISCREG_OSDLR_EL1)
3911  .allPrivileges()
3912  .mapsTo(MISCREG_DBGOSDLR);
3913  InitReg(MISCREG_DBGPRCR_EL1)
3914  .allPrivileges()
3915  .mapsTo(MISCREG_DBGPRCR);
3916  InitReg(MISCREG_DBGCLAIMSET_EL1)
3917  .allPrivileges()
3918  .mapsTo(MISCREG_DBGCLAIMSET);
3919  InitReg(MISCREG_DBGCLAIMCLR_EL1)
3920  .allPrivileges()
3921  .mapsTo(MISCREG_DBGCLAIMCLR);
3922  InitReg(MISCREG_DBGAUTHSTATUS_EL1)
3923  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0)
3924  .mapsTo(MISCREG_DBGAUTHSTATUS);
3925  InitReg(MISCREG_TEECR32_EL1);
3926  InitReg(MISCREG_TEEHBR32_EL1);
3927 
3928  // AArch64 registers (Op0=1,3);
3929  InitReg(MISCREG_MIDR_EL1)
3930  .allPrivileges().exceptUserMode().writes(0);
3931  InitReg(MISCREG_MPIDR_EL1)
3932  .allPrivileges().exceptUserMode().writes(0);
3933  InitReg(MISCREG_REVIDR_EL1)
3934  .allPrivileges().exceptUserMode().writes(0);
3935  InitReg(MISCREG_ID_PFR0_EL1)
3936  .allPrivileges().exceptUserMode().writes(0)
3937  .mapsTo(MISCREG_ID_PFR0);
3938  InitReg(MISCREG_ID_PFR1_EL1)
3939  .allPrivileges().exceptUserMode().writes(0)
3940  .mapsTo(MISCREG_ID_PFR1);
3941  InitReg(MISCREG_ID_DFR0_EL1)
3942  .allPrivileges().exceptUserMode().writes(0)
3943  .mapsTo(MISCREG_ID_DFR0);
3944  InitReg(MISCREG_ID_AFR0_EL1)
3945  .allPrivileges().exceptUserMode().writes(0)
3946  .mapsTo(MISCREG_ID_AFR0);
3947  InitReg(MISCREG_ID_MMFR0_EL1)
3948  .allPrivileges().exceptUserMode().writes(0)
3949  .mapsTo(MISCREG_ID_MMFR0);
3950  InitReg(MISCREG_ID_MMFR1_EL1)
3951  .allPrivileges().exceptUserMode().writes(0)
3952  .mapsTo(MISCREG_ID_MMFR1);
3953  InitReg(MISCREG_ID_MMFR2_EL1)
3954  .allPrivileges().exceptUserMode().writes(0)
3955  .mapsTo(MISCREG_ID_MMFR2);
3956  InitReg(MISCREG_ID_MMFR3_EL1)
3957  .allPrivileges().exceptUserMode().writes(0)
3958  .mapsTo(MISCREG_ID_MMFR3);
3959  InitReg(MISCREG_ID_ISAR0_EL1)
3960  .allPrivileges().exceptUserMode().writes(0)
3961  .mapsTo(MISCREG_ID_ISAR0);
3962  InitReg(MISCREG_ID_ISAR1_EL1)
3963  .allPrivileges().exceptUserMode().writes(0)
3964  .mapsTo(MISCREG_ID_ISAR1);
3965  InitReg(MISCREG_ID_ISAR2_EL1)
3966  .allPrivileges().exceptUserMode().writes(0)
3967  .mapsTo(MISCREG_ID_ISAR2);
3968  InitReg(MISCREG_ID_ISAR3_EL1)
3969  .allPrivileges().exceptUserMode().writes(0)
3970  .mapsTo(MISCREG_ID_ISAR3);
3971  InitReg(MISCREG_ID_ISAR4_EL1)
3972  .allPrivileges().exceptUserMode().writes(0)
3973  .mapsTo(MISCREG_ID_ISAR4);
3974  InitReg(MISCREG_ID_ISAR5_EL1)
3975  .allPrivileges().exceptUserMode().writes(0)
3976  .mapsTo(MISCREG_ID_ISAR5);
3977  InitReg(MISCREG_MVFR0_EL1)
3978  .allPrivileges().exceptUserMode().writes(0);
3979  InitReg(MISCREG_MVFR1_EL1)
3980  .allPrivileges().exceptUserMode().writes(0);
3981  InitReg(MISCREG_MVFR2_EL1)
3982  .allPrivileges().exceptUserMode().writes(0);
3983  InitReg(MISCREG_ID_AA64PFR0_EL1)
3984  .allPrivileges().exceptUserMode().writes(0);
3985  InitReg(MISCREG_ID_AA64PFR1_EL1)
3986  .allPrivileges().exceptUserMode().writes(0);
3987  InitReg(MISCREG_ID_AA64DFR0_EL1)
3988  .allPrivileges().exceptUserMode().writes(0);
3989  InitReg(MISCREG_ID_AA64DFR1_EL1)
3990  .allPrivileges().exceptUserMode().writes(0);
3991  InitReg(MISCREG_ID_AA64AFR0_EL1)
3992  .allPrivileges().exceptUserMode().writes(0);
3993  InitReg(MISCREG_ID_AA64AFR1_EL1)
3994  .allPrivileges().exceptUserMode().writes(0);
3995  InitReg(MISCREG_ID_AA64ISAR0_EL1)
3996  .allPrivileges().exceptUserMode().writes(0);
3997  InitReg(MISCREG_ID_AA64ISAR1_EL1)
3998  .allPrivileges().exceptUserMode().writes(0);
3999  InitReg(MISCREG_ID_AA64MMFR0_EL1)
4000  .allPrivileges().exceptUserMode().writes(0);
4001  InitReg(MISCREG_ID_AA64MMFR1_EL1)
4002  .allPrivileges().exceptUserMode().writes(0);
4003  InitReg(MISCREG_ID_AA64MMFR2_EL1)
4004  .allPrivileges().exceptUserMode().writes(0);
4005 
4006  InitReg(MISCREG_APDAKeyHi_EL1)
4007  .allPrivileges().exceptUserMode();
4008  InitReg(MISCREG_APDAKeyLo_EL1)
4009  .allPrivileges().exceptUserMode();
4010  InitReg(MISCREG_APDBKeyHi_EL1)
4011  .allPrivileges().exceptUserMode();
4012  InitReg(MISCREG_APDBKeyLo_EL1)
4013  .allPrivileges().exceptUserMode();
4014  InitReg(MISCREG_APGAKeyHi_EL1)
4015  .allPrivileges().exceptUserMode();
4016  InitReg(MISCREG_APGAKeyLo_EL1)
4017  .allPrivileges().exceptUserMode();
4018  InitReg(MISCREG_APIAKeyHi_EL1)
4019  .allPrivileges().exceptUserMode();
4020  InitReg(MISCREG_APIAKeyLo_EL1)
4021  .allPrivileges().exceptUserMode();
4022  InitReg(MISCREG_APIBKeyHi_EL1)
4023  .allPrivileges().exceptUserMode();
4024  InitReg(MISCREG_APIBKeyLo_EL1)
4025  .allPrivileges().exceptUserMode();
4026 
4027  InitReg(MISCREG_CCSIDR_EL1)
4028  .allPrivileges().exceptUserMode().writes(0);
4029  InitReg(MISCREG_CLIDR_EL1)
4030  .allPrivileges().exceptUserMode().writes(0);
4031  InitReg(MISCREG_AIDR_EL1)
4032  .allPrivileges().exceptUserMode().writes(0);
4033  InitReg(MISCREG_CSSELR_EL1)
4034  .allPrivileges().exceptUserMode()
4035  .mapsTo(MISCREG_CSSELR_NS);
4036  InitReg(MISCREG_CTR_EL0)
4037  .reads(1);
4038  InitReg(MISCREG_DCZID_EL0)
4039  .reads(1);
4040  InitReg(MISCREG_VPIDR_EL2)
4041  .hyp().mon()
4042  .mapsTo(MISCREG_VPIDR);
4043  InitReg(MISCREG_VMPIDR_EL2)
4044  .hyp().mon()
4045  .mapsTo(MISCREG_VMPIDR);
4046  InitReg(MISCREG_SCTLR_EL1)
4047  .allPrivileges().exceptUserMode()
4048  .res0( 0x20440 | (EnDB ? 0 : 0x2000)
4049  | (IESB ? 0 : 0x200000)
4050  | (EnDA ? 0 : 0x8000000)
4051  | (EnIB ? 0 : 0x40000000)
4052  | (EnIA ? 0 : 0x80000000))
4053  .res1(0x500800 | (SPAN ? 0 : 0x800000)
4054  | (nTLSMD ? 0 : 0x8000000)
4055  | (LSMAOE ? 0 : 0x10000000))
4056  .mapsTo(MISCREG_SCTLR_NS);
4057  InitReg(MISCREG_ACTLR_EL1)
4058  .allPrivileges().exceptUserMode()
4059  .mapsTo(MISCREG_ACTLR_NS);
4060  InitReg(MISCREG_CPACR_EL1)
4061  .allPrivileges().exceptUserMode()
4062  .mapsTo(MISCREG_CPACR);
4063  InitReg(MISCREG_SCTLR_EL2)
4064  .hyp().mon()
4065  .res0(0x0512c7c0 | (EnDB ? 0 : 0x2000)
4066  | (IESB ? 0 : 0x200000)
4067  | (EnDA ? 0 : 0x8000000)
4068  | (EnIB ? 0 : 0x40000000)
4069  | (EnIA ? 0 : 0x80000000))
4070  .res1(0x30c50830)
4071  .mapsTo(MISCREG_HSCTLR);
4072  InitReg(MISCREG_ACTLR_EL2)
4073  .hyp().mon()
4074  .mapsTo(MISCREG_HACTLR);
4075  InitReg(MISCREG_HCR_EL2)
4076  .hyp().mon()
4077  .mapsTo(MISCREG_HCR, MISCREG_HCR2);
4078  InitReg(MISCREG_MDCR_EL2)
4079  .hyp().mon()
4080  .mapsTo(MISCREG_HDCR);
4081  InitReg(MISCREG_CPTR_EL2)
4082  .hyp().mon()
4083  .mapsTo(MISCREG_HCPTR);
4084  InitReg(MISCREG_HSTR_EL2)
4085  .hyp().mon()
4086  .mapsTo(MISCREG_HSTR);
4087  InitReg(MISCREG_HACR_EL2)
4088  .hyp().mon()
4089  .mapsTo(MISCREG_HACR);
4090  InitReg(MISCREG_SCTLR_EL3)
4091  .mon()
4092  .res0(0x0512c7c0 | (EnDB ? 0 : 0x2000)
4093  | (IESB ? 0 : 0x200000)
4094  | (EnDA ? 0 : 0x8000000)
4095  | (EnIB ? 0 : 0x40000000)
4096  | (EnIA ? 0 : 0x80000000))
4097  .res1(0x30c50830);
4098  InitReg(MISCREG_ACTLR_EL3)
4099  .mon();
4100  InitReg(MISCREG_SCR_EL3)
4101  .mon()
4102  .mapsTo(MISCREG_SCR); // NAM D7-2005
4103  InitReg(MISCREG_SDER32_EL3)
4104  .mon()
4105  .mapsTo(MISCREG_SDER);
4106  InitReg(MISCREG_CPTR_EL3)
4107  .mon();
4108  InitReg(MISCREG_MDCR_EL3)
4109  .mon();
4110  InitReg(MISCREG_TTBR0_EL1)
4111  .allPrivileges().exceptUserMode()
4112  .mapsTo(MISCREG_TTBR0_NS);
4113  InitReg(MISCREG_TTBR1_EL1)
4114  .allPrivileges().exceptUserMode()
4115  .mapsTo(MISCREG_TTBR1_NS);
4116  InitReg(MISCREG_TCR_EL1)
4117  .allPrivileges().exceptUserMode()
4118  .mapsTo(MISCREG_TTBCR_NS);
4119  InitReg(MISCREG_TTBR0_EL2)
4120  .hyp().mon()
4121  .mapsTo(MISCREG_HTTBR);
4122  InitReg(MISCREG_TTBR1_EL2)
4123  .hyp().mon();
4124  InitReg(MISCREG_TCR_EL2)
4125  .hyp().mon()
4126  .mapsTo(MISCREG_HTCR);
4127  InitReg(MISCREG_VTTBR_EL2)
4128  .hyp().mon()
4129  .mapsTo(MISCREG_VTTBR);
4130  InitReg(MISCREG_VTCR_EL2)
4131  .hyp().mon()
4132  .mapsTo(MISCREG_VTCR);
4133  InitReg(MISCREG_TTBR0_EL3)
4134  .mon();
4135  InitReg(MISCREG_TCR_EL3)
4136  .mon();
4137  InitReg(MISCREG_DACR32_EL2)
4138  .hyp().mon()
4139  .mapsTo(MISCREG_DACR_NS);
4140  InitReg(MISCREG_SPSR_EL1)
4141  .allPrivileges().exceptUserMode()
4142  .mapsTo(MISCREG_SPSR_SVC); // NAM C5.2.17 SPSR_EL1
4143  InitReg(MISCREG_ELR_EL1)
4144  .allPrivileges().exceptUserMode();
4145  InitReg(MISCREG_SP_EL0)
4146  .allPrivileges().exceptUserMode();
4147  InitReg(MISCREG_SPSEL)
4148  .allPrivileges().exceptUserMode();
4149  InitReg(MISCREG_CURRENTEL)
4150  .allPrivileges().exceptUserMode().writes(0);
4151  InitReg(MISCREG_PAN)
4152  .allPrivileges().exceptUserMode()
4153  .implemented(havePAN);
4154  InitReg(MISCREG_NZCV)
4155  .allPrivileges();
4156  InitReg(MISCREG_DAIF)
4157  .allPrivileges();
4158  InitReg(MISCREG_FPCR)
4159  .allPrivileges();
4160  InitReg(MISCREG_FPSR)
4161  .allPrivileges();
4162  InitReg(MISCREG_DSPSR_EL0)
4163  .allPrivileges();
4164  InitReg(MISCREG_DLR_EL0)
4165  .allPrivileges();
4166  InitReg(MISCREG_SPSR_EL2)
4167  .hyp().mon()
4168  .mapsTo(MISCREG_SPSR_HYP); // NAM C5.2.18 SPSR_EL2
4169  InitReg(MISCREG_ELR_EL2)
4170  .hyp().mon();
4171  InitReg(MISCREG_SP_EL1)
4172  .hyp().mon();
4173  InitReg(MISCREG_SPSR_IRQ_AA64)
4174  .hyp().mon();
4175  InitReg(MISCREG_SPSR_ABT_AA64)
4176  .hyp().mon();
4177  InitReg(MISCREG_SPSR_UND_AA64)
4178  .hyp().mon();
4179  InitReg(MISCREG_SPSR_FIQ_AA64)
4180  .hyp().mon();
4181  InitReg(MISCREG_SPSR_EL3)
4182  .mon()
4183  .mapsTo(MISCREG_SPSR_MON); // NAM C5.2.19 SPSR_EL3
4184  InitReg(MISCREG_ELR_EL3)
4185  .mon();
4186  InitReg(MISCREG_SP_EL2)
4187  .mon();
4188  InitReg(MISCREG_AFSR0_EL1)
4189  .allPrivileges().exceptUserMode()
4190  .mapsTo(MISCREG_ADFSR_NS);
4191  InitReg(MISCREG_AFSR1_EL1)
4192  .allPrivileges().exceptUserMode()
4193  .mapsTo(MISCREG_AIFSR_NS);
4194  InitReg(MISCREG_ESR_EL1)
4195  .allPrivileges().exceptUserMode();
4196  InitReg(MISCREG_IFSR32_EL2)
4197  .hyp().mon()
4198  .mapsTo(MISCREG_IFSR_NS);
4199  InitReg(MISCREG_AFSR0_EL2)
4200  .hyp().mon()
4201  .mapsTo(MISCREG_HADFSR);
4202  InitReg(MISCREG_AFSR1_EL2)
4203  .hyp().mon()
4204  .mapsTo(MISCREG_HAIFSR);
4205  InitReg(MISCREG_ESR_EL2)
4206  .hyp().mon()
4207  .mapsTo(MISCREG_HSR);
4208  InitReg(MISCREG_FPEXC32_EL2)
4209  .hyp().mon().mapsTo(MISCREG_FPEXC);
4210  InitReg(MISCREG_AFSR0_EL3)
4211  .mon();
4212  InitReg(MISCREG_AFSR1_EL3)
4213  .mon();
4214  InitReg(MISCREG_ESR_EL3)
4215  .mon();
4216  InitReg(MISCREG_FAR_EL1)
4217  .allPrivileges().exceptUserMode()
4218  .mapsTo(MISCREG_DFAR_NS, MISCREG_IFAR_NS);
4219  InitReg(MISCREG_FAR_EL2)
4220  .hyp().mon()
4221  .mapsTo(MISCREG_HDFAR, MISCREG_HIFAR);
4222  InitReg(MISCREG_HPFAR_EL2)
4223  .hyp().mon()
4224  .mapsTo(MISCREG_HPFAR);
4225  InitReg(MISCREG_FAR_EL3)
4226  .mon();
4227  InitReg(MISCREG_IC_IALLUIS)
4228  .warnNotFail()
4229  .writes(1).exceptUserMode();
4230  InitReg(MISCREG_PAR_EL1)
4231  .allPrivileges().exceptUserMode()
4232  .mapsTo(MISCREG_PAR_NS);
4233  InitReg(MISCREG_IC_IALLU)
4234  .warnNotFail()
4235  .writes(1).exceptUserMode();
4236  InitReg(MISCREG_DC_IVAC_Xt)
4237  .warnNotFail()
4238  .writes(1).exceptUserMode();
4239  InitReg(MISCREG_DC_ISW_Xt)
4240  .warnNotFail()
4241  .writes(1).exceptUserMode();
4242  InitReg(MISCREG_AT_S1E1R_Xt)
4243  .writes(1).exceptUserMode();
4244  InitReg(MISCREG_AT_S1E1W_Xt)
4245  .writes(1).exceptUserMode();
4246  InitReg(MISCREG_AT_S1E0R_Xt)
4247  .writes(1).exceptUserMode();
4248  InitReg(MISCREG_AT_S1E0W_Xt)
4249  .writes(1).exceptUserMode();
4250  InitReg(MISCREG_DC_CSW_Xt)
4251  .warnNotFail()
4252  .writes(1).exceptUserMode();
4253  InitReg(MISCREG_DC_CISW_Xt)
4254  .warnNotFail()
4255  .writes(1).exceptUserMode();
4256  InitReg(MISCREG_DC_ZVA_Xt)
4257  .warnNotFail()
4258  .writes(1).userSecureWrite(0);
4259  InitReg(MISCREG_IC_IVAU_Xt)
4260  .writes(1);
4261  InitReg(MISCREG_DC_CVAC_Xt)
4262  .warnNotFail()
4263  .writes(1);
4264  InitReg(MISCREG_DC_CVAU_Xt)
4265  .warnNotFail()
4266  .writes(1);
4267  InitReg(MISCREG_DC_CIVAC_Xt)
4268  .warnNotFail()
4269  .writes(1);
4270  InitReg(MISCREG_AT_S1E2R_Xt)
4271  .monNonSecureWrite().hypWrite();
4272  InitReg(MISCREG_AT_S1E2W_Xt)
4273  .monNonSecureWrite().hypWrite();
4274  InitReg(MISCREG_AT_S12E1R_Xt)
4275  .hypWrite().monSecureWrite().monNonSecureWrite();
4276  InitReg(MISCREG_AT_S12E1W_Xt)
4277  .hypWrite().monSecureWrite().monNonSecureWrite();
4278  InitReg(MISCREG_AT_S12E0R_Xt)
4279  .hypWrite().monSecureWrite().monNonSecureWrite();
4280  InitReg(MISCREG_AT_S12E0W_Xt)
4281  .hypWrite().monSecureWrite().monNonSecureWrite();
4282  InitReg(MISCREG_AT_S1E3R_Xt)
4283  .monSecureWrite().monNonSecureWrite();
4284  InitReg(MISCREG_AT_S1E3W_Xt)
4285  .monSecureWrite().monNonSecureWrite();
4286  InitReg(MISCREG_TLBI_VMALLE1IS)
4287  .writes(1).exceptUserMode();
4288  InitReg(MISCREG_TLBI_VAE1IS_Xt)
4289  .writes(1).exceptUserMode();
4290  InitReg(MISCREG_TLBI_ASIDE1IS_Xt)
4291  .writes(1).exceptUserMode();
4292  InitReg(MISCREG_TLBI_VAAE1IS_Xt)
4293  .writes(1).exceptUserMode();
4294  InitReg(MISCREG_TLBI_VALE1IS_Xt)
4295  .writes(1).exceptUserMode();
4296  InitReg(MISCREG_TLBI_VAALE1IS_Xt)
4297  .writes(1).exceptUserMode();
4298  InitReg(MISCREG_TLBI_VMALLE1)
4299  .writes(1).exceptUserMode();
4300  InitReg(MISCREG_TLBI_VAE1_Xt)
4301  .writes(1).exceptUserMode();
4302  InitReg(MISCREG_TLBI_ASIDE1_Xt)
4303  .writes(1).exceptUserMode();
4304  InitReg(MISCREG_TLBI_VAAE1_Xt)
4305  .writes(1).exceptUserMode();
4306  InitReg(MISCREG_TLBI_VALE1_Xt)
4307  .writes(1).exceptUserMode();
4308  InitReg(MISCREG_TLBI_VAALE1_Xt)
4309  .writes(1).exceptUserMode();
4310  InitReg(MISCREG_TLBI_IPAS2E1IS_Xt)
4311  .hypWrite().monSecureWrite().monNonSecureWrite();
4313  .hypWrite().monSecureWrite().monNonSecureWrite();
4314  InitReg(MISCREG_TLBI_ALLE2IS)
4315  .monNonSecureWrite().hypWrite();
4316  InitReg(MISCREG_TLBI_VAE2IS_Xt)
4317  .monNonSecureWrite().hypWrite();
4318  InitReg(MISCREG_TLBI_ALLE1IS)
4319  .hypWrite().monSecureWrite().monNonSecureWrite();
4320  InitReg(MISCREG_TLBI_VALE2IS_Xt)
4321  .monNonSecureWrite().hypWrite();
4322  InitReg(MISCREG_TLBI_VMALLS12E1IS)
4323  .hypWrite().monSecureWrite().monNonSecureWrite();
4324  InitReg(MISCREG_TLBI_IPAS2E1_Xt)
4325  .hypWrite().monSecureWrite().monNonSecureWrite();
4326  InitReg(MISCREG_TLBI_IPAS2LE1_Xt)
4327  .hypWrite().monSecureWrite().monNonSecureWrite();
4328  InitReg(MISCREG_TLBI_ALLE2)
4329  .monNonSecureWrite().hypWrite();
4330  InitReg(MISCREG_TLBI_VAE2_Xt)
4331  .monNonSecureWrite().hypWrite();
4332  InitReg(MISCREG_TLBI_ALLE1)
4333  .hypWrite().monSecureWrite().monNonSecureWrite();
4334  InitReg(MISCREG_TLBI_VALE2_Xt)
4335  .monNonSecureWrite().hypWrite();
4336  InitReg(MISCREG_TLBI_VMALLS12E1)
4337  .hypWrite().monSecureWrite().monNonSecureWrite();
4338  InitReg(MISCREG_TLBI_ALLE3IS)
4339  .monSecureWrite().monNonSecureWrite();
4340  InitReg(MISCREG_TLBI_VAE3IS_Xt)
4341  .monSecureWrite().monNonSecureWrite();
4342  InitReg(MISCREG_TLBI_VALE3IS_Xt)
4343  .monSecureWrite().monNonSecureWrite();
4344  InitReg(MISCREG_TLBI_ALLE3)
4345  .monSecureWrite().monNonSecureWrite();
4346  InitReg(MISCREG_TLBI_VAE3_Xt)
4347  .monSecureWrite().monNonSecureWrite();
4348  InitReg(MISCREG_TLBI_VALE3_Xt)
4349  .monSecureWrite().monNonSecureWrite();
4350  InitReg(MISCREG_PMINTENSET_EL1)
4351  .allPrivileges().exceptUserMode()
4352  .mapsTo(MISCREG_PMINTENSET);
4353  InitReg(MISCREG_PMINTENCLR_EL1)
4354  .allPrivileges().exceptUserMode()
4355  .mapsTo(MISCREG_PMINTENCLR);
4356  InitReg(MISCREG_PMCR_EL0)
4357  .allPrivileges()
4358  .mapsTo(MISCREG_PMCR);
4359  InitReg(MISCREG_PMCNTENSET_EL0)
4360  .allPrivileges()
4361  .mapsTo(MISCREG_PMCNTENSET);
4362  InitReg(MISCREG_PMCNTENCLR_EL0)
4363  .allPrivileges()
4364  .mapsTo(MISCREG_PMCNTENCLR);
4365  InitReg(MISCREG_PMOVSCLR_EL0)
4366  .allPrivileges();
4367 // .mapsTo(MISCREG_PMOVSCLR);
4368  InitReg(MISCREG_PMSWINC_EL0)
4369  .writes(1).user()
4370  .mapsTo(MISCREG_PMSWINC);
4371  InitReg(MISCREG_PMSELR_EL0)
4372  .allPrivileges()
4373  .mapsTo(MISCREG_PMSELR);
4374  InitReg(MISCREG_PMCEID0_EL0)
4375  .reads(1).user()
4376  .mapsTo(MISCREG_PMCEID0);
4377  InitReg(MISCREG_PMCEID1_EL0)
4378  .reads(1).user()
4379  .mapsTo(MISCREG_PMCEID1);
4380  InitReg(MISCREG_PMCCNTR_EL0)
4381  .allPrivileges()
4382  .mapsTo(MISCREG_PMCCNTR);
4383  InitReg(MISCREG_PMXEVTYPER_EL0)
4384  .allPrivileges()
4385  .mapsTo(MISCREG_PMXEVTYPER);
4386  InitReg(MISCREG_PMCCFILTR_EL0)
4387  .allPrivileges();
4388  InitReg(MISCREG_PMXEVCNTR_EL0)
4389  .allPrivileges()
4390  .mapsTo(MISCREG_PMXEVCNTR);
4391  InitReg(MISCREG_PMUSERENR_EL0)
4392  .allPrivileges().userNonSecureWrite(0).userSecureWrite(0)
4393  .mapsTo(MISCREG_PMUSERENR);
4394  InitReg(MISCREG_PMOVSSET_EL0)
4395  .allPrivileges()
4396  .mapsTo(MISCREG_PMOVSSET);
4397  InitReg(MISCREG_MAIR_EL1)
4398  .allPrivileges().exceptUserMode()
4399  .mapsTo(MISCREG_PRRR_NS, MISCREG_NMRR_NS);
4400  InitReg(MISCREG_AMAIR_EL1)
4401  .allPrivileges().exceptUserMode()
4403  InitReg(MISCREG_MAIR_EL2)
4404  .hyp().mon()
4405  .mapsTo(MISCREG_HMAIR0, MISCREG_HMAIR1);
4406  InitReg(MISCREG_AMAIR_EL2)
4407  .hyp().mon()
4408  .mapsTo(MISCREG_HAMAIR0, MISCREG_HAMAIR1);
4409  InitReg(MISCREG_MAIR_EL3)
4410  .mon();
4411  InitReg(MISCREG_AMAIR_EL3)
4412  .mon();
4413  InitReg(MISCREG_L2CTLR_EL1)
4414  .allPrivileges().exceptUserMode();
4415  InitReg(MISCREG_L2ECTLR_EL1)
4416  .allPrivileges().exceptUserMode();
4417  InitReg(MISCREG_VBAR_EL1)
4418  .allPrivileges().exceptUserMode()
4419  .mapsTo(MISCREG_VBAR_NS);
4420  InitReg(MISCREG_RVBAR_EL1)
4421  .allPrivileges().exceptUserMode().writes(0);
4422  InitReg(MISCREG_ISR_EL1)
4423  .allPrivileges().exceptUserMode().writes(0);
4424  InitReg(MISCREG_VBAR_EL2)
4425  .hyp().mon()
4426  .res0(0x7ff)
4427  .mapsTo(MISCREG_HVBAR);
4428  InitReg(MISCREG_RVBAR_EL2)
4429  .mon().hyp().writes(0);
4430  InitReg(MISCREG_VBAR_EL3)
4431  .mon();
4432  InitReg(MISCREG_RVBAR_EL3)
4433  .mon().writes(0);
4434  InitReg(MISCREG_RMR_EL3)
4435  .mon();
4436  InitReg(MISCREG_CONTEXTIDR_EL1)
4437  .allPrivileges().exceptUserMode()
4438  .mapsTo(MISCREG_CONTEXTIDR_NS);
4439  InitReg(MISCREG_TPIDR_EL1)
4440  .allPrivileges().exceptUserMode()
4441  .mapsTo(MISCREG_TPIDRPRW_NS);
4442  InitReg(MISCREG_TPIDR_EL0)
4443  .allPrivileges()
4444  .mapsTo(MISCREG_TPIDRURW_NS);
4445  InitReg(MISCREG_TPIDRRO_EL0)
4446  .allPrivileges().userNonSecureWrite(0).userSecureWrite(0)
4447  .mapsTo(MISCREG_TPIDRURO_NS);
4448  InitReg(MISCREG_TPIDR_EL2)
4449  .hyp().mon()
4450  .mapsTo(MISCREG_HTPIDR);
4451  InitReg(MISCREG_TPIDR_EL3)
4452  .mon();
4453  InitReg(MISCREG_CNTKCTL_EL1)
4454  .allPrivileges().exceptUserMode()
4455  .mapsTo(MISCREG_CNTKCTL);
4456  InitReg(MISCREG_CNTFRQ_EL0)
4457  .reads(1)
4458  .highest(system)
4459  .privSecureWrite(aarch32EL3)
4460  .mapsTo(MISCREG_CNTFRQ);
4461  InitReg(MISCREG_CNTPCT_EL0)
4462  .reads(1)
4463  .mapsTo(MISCREG_CNTPCT); /* 64b */
4464  InitReg(MISCREG_CNTVCT_EL0)
4465  .unverifiable()
4466  .reads(1)
4467  .mapsTo(MISCREG_CNTVCT); /* 64b */
4468  InitReg(MISCREG_CNTP_TVAL_EL0)
4469  .allPrivileges()
4470  .mapsTo(MISCREG_CNTP_TVAL_NS);
4471  InitReg(MISCREG_CNTP_CTL_EL0)
4472  .allPrivileges()
4473  .mapsTo(MISCREG_CNTP_CTL_NS);
4474  InitReg(MISCREG_CNTP_CVAL_EL0)
4475  .allPrivileges()
4476  .mapsTo(MISCREG_CNTP_CVAL_NS); /* 64b */
4477  InitReg(MISCREG_CNTV_TVAL_EL0)
4478  .allPrivileges()
4479  .mapsTo(MISCREG_CNTV_TVAL);
4480  InitReg(MISCREG_CNTV_CTL_EL0)
4481  .allPrivileges()
4482  .mapsTo(MISCREG_CNTV_CTL);
4483  InitReg(MISCREG_CNTV_CVAL_EL0)
4484  .allPrivileges()
4485  .mapsTo(MISCREG_CNTV_CVAL); /* 64b */
4486  InitReg(MISCREG_PMEVCNTR0_EL0)
4487  .allPrivileges();
4488 // .mapsTo(MISCREG_PMEVCNTR0);
4489  InitReg(MISCREG_PMEVCNTR1_EL0)
4490  .allPrivileges();
4491 // .mapsTo(MISCREG_PMEVCNTR1);
4492  InitReg(MISCREG_PMEVCNTR2_EL0)
4493  .allPrivileges();
4494 // .mapsTo(MISCREG_PMEVCNTR2);
4495  InitReg(MISCREG_PMEVCNTR3_EL0)
4496  .allPrivileges();
4497 // .mapsTo(MISCREG_PMEVCNTR3);
4498  InitReg(MISCREG_PMEVCNTR4_EL0)
4499  .allPrivileges();
4500 // .mapsTo(MISCREG_PMEVCNTR4);
4501  InitReg(MISCREG_PMEVCNTR5_EL0)
4502  .allPrivileges();
4503 // .mapsTo(MISCREG_PMEVCNTR5);
4504  InitReg(MISCREG_PMEVTYPER0_EL0)
4505  .allPrivileges();
4506 // .mapsTo(MISCREG_PMEVTYPER0);
4507  InitReg(MISCREG_PMEVTYPER1_EL0)
4508  .allPrivileges();
4509 // .mapsTo(MISCREG_PMEVTYPER1);
4510  InitReg(MISCREG_PMEVTYPER2_EL0)
4511  .allPrivileges();
4512 // .mapsTo(MISCREG_PMEVTYPER2);
4513  InitReg(MISCREG_PMEVTYPER3_EL0)
4514  .allPrivileges();
4515 // .mapsTo(MISCREG_PMEVTYPER3);
4516  InitReg(MISCREG_PMEVTYPER4_EL0)
4517  .allPrivileges();
4518 // .mapsTo(MISCREG_PMEVTYPER4);
4519  InitReg(MISCREG_PMEVTYPER5_EL0)
4520  .allPrivileges();
4521 // .mapsTo(MISCREG_PMEVTYPER5);
4522  InitReg(MISCREG_CNTVOFF_EL2)
4523  .hyp().mon()
4524  .mapsTo(MISCREG_CNTVOFF); /* 64b */
4525  InitReg(MISCREG_CNTHCTL_EL2)
4526  .mon().hyp()
4527  .mapsTo(MISCREG_CNTHCTL);
4528  InitReg(MISCREG_CNTHP_TVAL_EL2)
4529  .mon().hyp()
4530  .mapsTo(MISCREG_CNTHP_TVAL);
4531  InitReg(MISCREG_CNTHP_CTL_EL2)
4532  .mon().hyp()
4533  .mapsTo(MISCREG_CNTHP_CTL);
4534  InitReg(MISCREG_CNTHP_CVAL_EL2)
4535  .mon().hyp()
4536  .mapsTo(MISCREG_CNTHP_CVAL); /* 64b */
4537  InitReg(MISCREG_CNTPS_TVAL_EL1)
4538  .mon().privSecure();
4539  InitReg(MISCREG_CNTPS_CTL_EL1)
4540  .mon().privSecure();
4541  InitReg(MISCREG_CNTPS_CVAL_EL1)
4542  .mon().privSecure();
4543  InitReg(MISCREG_IL1DATA0_EL1)
4544  .allPrivileges().exceptUserMode();
4545  InitReg(MISCREG_IL1DATA1_EL1)
4546  .allPrivileges().exceptUserMode();
4547  InitReg(MISCREG_IL1DATA2_EL1)
4548  .allPrivileges().exceptUserMode();
4549  InitReg(MISCREG_IL1DATA3_EL1)
4550  .allPrivileges().exceptUserMode();
4551  InitReg(MISCREG_DL1DATA0_EL1)
4552  .allPrivileges().exceptUserMode();
4553  InitReg(MISCREG_DL1DATA1_EL1)
4554  .allPrivileges().exceptUserMode();
4555  InitReg(MISCREG_DL1DATA2_EL1)
4556  .allPrivileges().exceptUserMode();
4557  InitReg(MISCREG_DL1DATA3_EL1)
4558  .allPrivileges().exceptUserMode();
4559  InitReg(MISCREG_DL1DATA4_EL1)
4560  .allPrivileges().exceptUserMode();
4561  InitReg(MISCREG_L2ACTLR_EL1)
4562  .allPrivileges().exceptUserMode();
4563  InitReg(MISCREG_CPUACTLR_EL1)
4564  .allPrivileges().exceptUserMode();
4565  InitReg(MISCREG_CPUECTLR_EL1)
4566  .allPrivileges().exceptUserMode();
4567  InitReg(MISCREG_CPUMERRSR_EL1)
4568  .allPrivileges().exceptUserMode();
4569  InitReg(MISCREG_L2MERRSR_EL1)
4570  .unimplemented()
4571  .warnNotFail()
4572  .allPrivileges().exceptUserMode();
4573  InitReg(MISCREG_CBAR_EL1)
4574  .allPrivileges().exceptUserMode().writes(0);
4575  InitReg(MISCREG_CONTEXTIDR_EL2)
4576  .mon().hyp();
4577 
4578  // GICv3 AArch64
4579  InitReg(MISCREG_ICC_PMR_EL1)
4580  .res0(0xffffff00) // [31:8]
4581  .allPrivileges().exceptUserMode()
4582  .mapsTo(MISCREG_ICC_PMR);
4583  InitReg(MISCREG_ICC_IAR0_EL1)
4584  .allPrivileges().exceptUserMode().writes(0)
4585  .mapsTo(MISCREG_ICC_IAR0);
4586  InitReg(MISCREG_ICC_EOIR0_EL1)
4587  .allPrivileges().exceptUserMode().reads(0)
4588  .mapsTo(MISCREG_ICC_EOIR0);
4589  InitReg(MISCREG_ICC_HPPIR0_EL1)
4590  .allPrivileges().exceptUserMode().writes(0)
4591  .mapsTo(MISCREG_ICC_HPPIR0);
4592  InitReg(MISCREG_ICC_BPR0_EL1)
4593  .res0(0xfffffff8) // [31:3]
4594  .allPrivileges().exceptUserMode()
4595  .mapsTo(MISCREG_ICC_BPR0);
4596  InitReg(MISCREG_ICC_AP0R0_EL1)
4597  .allPrivileges().exceptUserMode()
4598  .mapsTo(MISCREG_ICC_AP0R0);
4599  InitReg(MISCREG_ICC_AP0R1_EL1)
4600  .allPrivileges().exceptUserMode()
4601  .mapsTo(MISCREG_ICC_AP0R1);
4602  InitReg(MISCREG_ICC_AP0R2_EL1)
4603  .allPrivileges().exceptUserMode()
4604  .mapsTo(MISCREG_ICC_AP0R2);
4605  InitReg(MISCREG_ICC_AP0R3_EL1)
4606  .allPrivileges().exceptUserMode()
4607  .mapsTo(MISCREG_ICC_AP0R3);
4608  InitReg(MISCREG_ICC_AP1R0_EL1)
4609  .banked64()
4610  .mapsTo(MISCREG_ICC_AP1R0);
4611  InitReg(MISCREG_ICC_AP1R0_EL1_NS)
4612  .bankedChild()
4613  .allPrivileges().exceptUserMode()
4614  .mapsTo(MISCREG_ICC_AP1R0_NS);
4615  InitReg(MISCREG_ICC_AP1R0_EL1_S)
4616  .bankedChild()
4617  .allPrivileges().exceptUserMode()
4618  .mapsTo(MISCREG_ICC_AP1R0_S);
4619  InitReg(MISCREG_ICC_AP1R1_EL1)
4620  .banked64()
4621  .mapsTo(MISCREG_ICC_AP1R1);
4622  InitReg(MISCREG_ICC_AP1R1_EL1_NS)
4623  .bankedChild()
4624  .allPrivileges().exceptUserMode()
4625  .mapsTo(MISCREG_ICC_AP1R1_NS);
4626  InitReg(MISCREG_ICC_AP1R1_EL1_S)
4627  .bankedChild()
4628  .allPrivileges().exceptUserMode()
4629  .mapsTo(MISCREG_ICC_AP1R1_S);
4630  InitReg(MISCREG_ICC_AP1R2_EL1)
4631  .banked64()
4632  .mapsTo(MISCREG_ICC_AP1R2);
4633  InitReg(MISCREG_ICC_AP1R2_EL1_NS)
4634  .bankedChild()
4635  .allPrivileges().exceptUserMode()
4636  .mapsTo(MISCREG_ICC_AP1R2_NS);
4637  InitReg(MISCREG_ICC_AP1R2_EL1_S)
4638  .bankedChild()
4639  .allPrivileges().exceptUserMode()
4640  .mapsTo(MISCREG_ICC_AP1R2_S);
4641  InitReg(MISCREG_ICC_AP1R3_EL1)
4642  .banked64()
4643  .mapsTo(MISCREG_ICC_AP1R3);
4644  InitReg(MISCREG_ICC_AP1R3_EL1_NS)
4645  .bankedChild()
4646  .allPrivileges().exceptUserMode()
4647  .mapsTo(MISCREG_ICC_AP1R3_NS);
4648  InitReg(MISCREG_ICC_AP1R3_EL1_S)
4649  .bankedChild()
4650  .allPrivileges().exceptUserMode()
4651  .mapsTo(MISCREG_ICC_AP1R3_S);
4652  InitReg(MISCREG_ICC_DIR_EL1)
4653  .res0(0xFF000000) // [31:24]
4654  .allPrivileges().exceptUserMode().reads(0)
4655  .mapsTo(MISCREG_ICC_DIR);
4656  InitReg(MISCREG_ICC_RPR_EL1)
4657  .allPrivileges().exceptUserMode().writes(0)
4658  .mapsTo(MISCREG_ICC_RPR);
4659  InitReg(MISCREG_ICC_SGI1R_EL1)
4660  .allPrivileges().exceptUserMode().reads(0)
4661  .mapsTo(MISCREG_ICC_SGI1R);
4662  InitReg(MISCREG_ICC_ASGI1R_EL1)
4663  .allPrivileges().exceptUserMode().reads(0)
4664  .mapsTo(MISCREG_ICC_ASGI1R);
4665  InitReg(MISCREG_ICC_SGI0R_EL1)
4666  .allPrivileges().exceptUserMode().reads(0)
4667  .mapsTo(MISCREG_ICC_SGI0R);
4668  InitReg(MISCREG_ICC_IAR1_EL1)
4669  .allPrivileges().exceptUserMode().writes(0)
4670  .mapsTo(MISCREG_ICC_IAR1);
4671  InitReg(MISCREG_ICC_EOIR1_EL1)
4672  .res0(0xFF000000) // [31:24]
4673  .allPrivileges().exceptUserMode().reads(0)
4674  .mapsTo(MISCREG_ICC_EOIR1);
4675  InitReg(MISCREG_ICC_HPPIR1_EL1)
4676  .allPrivileges().exceptUserMode().writes(0)
4677  .mapsTo(MISCREG_ICC_HPPIR1);
4678  InitReg(MISCREG_ICC_BPR1_EL1)
4679  .banked64()
4680  .mapsTo(MISCREG_ICC_BPR1);
4681  InitReg(MISCREG_ICC_BPR1_EL1_NS)
4682  .bankedChild()
4683  .res0(0xfffffff8) // [31:3]
4684  .allPrivileges().exceptUserMode()
4685  .mapsTo(MISCREG_ICC_BPR1_NS);
4686  InitReg(MISCREG_ICC_BPR1_EL1_S)
4687  .bankedChild()
4688  .res0(0xfffffff8) // [31:3]
4689  .secure().exceptUserMode()
4690  .mapsTo(MISCREG_ICC_BPR1_S);
4691  InitReg(MISCREG_ICC_CTLR_EL1)
4692  .banked64()
4693  .mapsTo(MISCREG_ICC_CTLR);
4694  InitReg(MISCREG_ICC_CTLR_EL1_NS)
4695  .bankedChild()
4696  .res0(0xFFFB00BC) // [31:19, 17:16, 7, 5:2]
4697  .allPrivileges().exceptUserMode()
4698  .mapsTo(MISCREG_ICC_CTLR_NS);
4699  InitReg(MISCREG_ICC_CTLR_EL1_S)
4700  .bankedChild()
4701  .res0(0xFFFB00BC) // [31:19, 17:16, 7, 5:2]
4702  .secure().exceptUserMode()
4703  .mapsTo(MISCREG_ICC_CTLR_S);
4704  InitReg(MISCREG_ICC_SRE_EL1)
4705  .banked()
4706  .mapsTo(MISCREG_ICC_SRE);
4707  InitReg(MISCREG_ICC_SRE_EL1_NS)
4708  .bankedChild()
4709  .res0(0xFFFFFFF8) // [31:3]
4710  .allPrivileges().exceptUserMode()
4711  .mapsTo(MISCREG_ICC_SRE_NS);
4712  InitReg(MISCREG_ICC_SRE_EL1_S)
4713  .bankedChild()
4714  .res0(0xFFFFFFF8) // [31:3]
4715  .secure().exceptUserMode()
4716  .mapsTo(MISCREG_ICC_SRE_S);
4717  InitReg(MISCREG_ICC_IGRPEN0_EL1)
4718  .res0(0xFFFFFFFE) // [31:1]
4719  .allPrivileges().exceptUserMode()
4720  .mapsTo(MISCREG_ICC_IGRPEN0);
4721  InitReg(MISCREG_ICC_IGRPEN1_EL1)
4722  .banked64()
4723  .mapsTo(MISCREG_ICC_IGRPEN1);
4725  .bankedChild()
4726  .res0(0xFFFFFFFE) // [31:1]
4727  .allPrivileges().exceptUserMode()
4728  .mapsTo(MISCREG_ICC_IGRPEN1_NS);
4729  InitReg(MISCREG_ICC_IGRPEN1_EL1_S)
4730  .bankedChild()
4731  .res0(0xFFFFFFFE) // [31:1]
4732  .secure().exceptUserMode()
4733  .mapsTo(MISCREG_ICC_IGRPEN1_S);
4734  InitReg(MISCREG_ICC_SRE_EL2)
4735  .hyp().mon()
4736  .mapsTo(MISCREG_ICC_HSRE);
4737  InitReg(MISCREG_ICC_CTLR_EL3)
4738  .allPrivileges().exceptUserMode()
4739  .mapsTo(MISCREG_ICC_MCTLR);
4740  InitReg(MISCREG_ICC_SRE_EL3)
4741  .allPrivileges().exceptUserMode()
4742  .mapsTo(MISCREG_ICC_MSRE);
4743  InitReg(MISCREG_ICC_IGRPEN1_EL3)
4744  .allPrivileges().exceptUserMode()
4745  .mapsTo(MISCREG_ICC_MGRPEN1);
4746 
4747  InitReg(MISCREG_ICH_AP0R0_EL2)
4748  .hyp().mon()
4749  .mapsTo(MISCREG_ICH_AP0R0);
4750  InitReg(MISCREG_ICH_AP0R1_EL2)
4751  .hyp().mon()
4752  .unimplemented()
4753  .mapsTo(MISCREG_ICH_AP0R1);
4754  InitReg(MISCREG_ICH_AP0R2_EL2)
4755  .hyp().mon()
4756  .unimplemented()
4757  .mapsTo(MISCREG_ICH_AP0R2);
4758  InitReg(MISCREG_ICH_AP0R3_EL2)
4759  .hyp().mon()
4760  .unimplemented()
4761  .mapsTo(MISCREG_ICH_AP0R3);
4762  InitReg(MISCREG_ICH_AP1R0_EL2)
4763  .hyp().mon()
4764  .mapsTo(MISCREG_ICH_AP1R0);
4765  InitReg(MISCREG_ICH_AP1R1_EL2)
4766  .hyp().mon()
4767  .unimplemented()
4768  .mapsTo(MISCREG_ICH_AP1R1);
4769  InitReg(MISCREG_ICH_AP1R2_EL2)
4770  .hyp().mon()
4771  .unimplemented()
4772  .mapsTo(MISCREG_ICH_AP1R2);
4773  InitReg(MISCREG_ICH_AP1R3_EL2)
4774  .hyp().mon()
4775  .unimplemented()
4776  .mapsTo(MISCREG_ICH_AP1R3);
4777  InitReg(MISCREG_ICH_HCR_EL2)
4778  .hyp().mon()
4779  .mapsTo(MISCREG_ICH_HCR);
4780  InitReg(MISCREG_ICH_VTR_EL2)
4781  .hyp().mon().writes(0)
4782  .mapsTo(MISCREG_ICH_VTR);
4783  InitReg(MISCREG_ICH_MISR_EL2)
4784  .hyp().mon().writes(0)
4785  .mapsTo(MISCREG_ICH_MISR);
4786  InitReg(MISCREG_ICH_EISR_EL2)
4787  .hyp().mon().writes(0)
4788  .mapsTo(MISCREG_ICH_EISR);
4789  InitReg(MISCREG_ICH_ELRSR_EL2)
4790  .hyp().mon().writes(0)
4791  .mapsTo(MISCREG_ICH_ELRSR);
4792  InitReg(MISCREG_ICH_VMCR_EL2)
4793  .hyp().mon()
4794  .mapsTo(MISCREG_ICH_VMCR);
4795  InitReg(MISCREG_ICH_LR0_EL2)
4796  .hyp().mon()
4797  .allPrivileges().exceptUserMode();
4798  InitReg(MISCREG_ICH_LR1_EL2)
4799  .hyp().mon()
4800  .allPrivileges().exceptUserMode();
4801  InitReg(MISCREG_ICH_LR2_EL2)
4802  .hyp().mon()
4803  .allPrivileges().exceptUserMode();
4804  InitReg(MISCREG_ICH_LR3_EL2)
4805  .hyp().mon()
4806  .allPrivileges().exceptUserMode();
4807  InitReg(MISCREG_ICH_LR4_EL2)
4808  .hyp().mon()
4809  .allPrivileges().exceptUserMode();
4810  InitReg(MISCREG_ICH_LR5_EL2)
4811  .hyp().mon()
4812  .allPrivileges().exceptUserMode();
4813  InitReg(MISCREG_ICH_LR6_EL2)
4814  .hyp().mon()
4815  .allPrivileges().exceptUserMode();
4816  InitReg(MISCREG_ICH_LR7_EL2)
4817  .hyp().mon()
4818  .allPrivileges().exceptUserMode();
4819  InitReg(MISCREG_ICH_LR8_EL2)
4820  .hyp().mon()
4821  .allPrivileges().exceptUserMode();
4822  InitReg(MISCREG_ICH_LR9_EL2)
4823  .hyp().mon()
4824  .allPrivileges().exceptUserMode();
4825  InitReg(MISCREG_ICH_LR10_EL2)
4826  .hyp().mon()
4827  .allPrivileges().exceptUserMode();
4828  InitReg(MISCREG_ICH_LR11_EL2)
4829  .hyp().mon()
4830  .allPrivileges().exceptUserMode();
4831  InitReg(MISCREG_ICH_LR12_EL2)
4832  .hyp().mon()
4833  .allPrivileges().exceptUserMode();
4834  InitReg(MISCREG_ICH_LR13_EL2)
4835  .hyp().mon()
4836  .allPrivileges().exceptUserMode();
4837  InitReg(MISCREG_ICH_LR14_EL2)
4838  .hyp().mon()
4839  .allPrivileges().exceptUserMode();
4840  InitReg(MISCREG_ICH_LR15_EL2)
4841  .hyp().mon()
4842  .allPrivileges().exceptUserMode();
4843 
4844  // GICv3 AArch32
4845  InitReg(MISCREG_ICC_AP0R0)
4846  .allPrivileges().exceptUserMode();
4847  InitReg(MISCREG_ICC_AP0R1)
4848  .allPrivileges().exceptUserMode();
4849  InitReg(MISCREG_ICC_AP0R2)
4850  .allPrivileges().exceptUserMode();
4851  InitReg(MISCREG_ICC_AP0R3)
4852  .allPrivileges().exceptUserMode();
4853  InitReg(MISCREG_ICC_AP1R0)
4854  .allPrivileges().exceptUserMode();
4855  InitReg(MISCREG_ICC_AP1R0_NS)
4856  .allPrivileges().exceptUserMode();
4857  InitReg(MISCREG_ICC_AP1R0_S)
4858  .allPrivileges().exceptUserMode();
4859  InitReg(MISCREG_ICC_AP1R1)
4860  .allPrivileges().exceptUserMode();
4861  InitReg(MISCREG_ICC_AP1R1_NS)
4862  .allPrivileges().exceptUserMode();
4863  InitReg(MISCREG_ICC_AP1R1_S)
4864  .allPrivileges().exceptUserMode();
4865  InitReg(MISCREG_ICC_AP1R2)
4866  .allPrivileges().exceptUserMode();
4867  InitReg(MISCREG_ICC_AP1R2_NS)
4868  .allPrivileges().exceptUserMode();
4869  InitReg(MISCREG_ICC_AP1R2_S)
4870  .allPrivileges().exceptUserMode();
4871  InitReg(MISCREG_ICC_AP1R3)
4872  .allPrivileges().exceptUserMode();
4873  InitReg(MISCREG_ICC_AP1R3_NS)
4874  .allPrivileges().exceptUserMode();
4875  InitReg(MISCREG_ICC_AP1R3_S)
4876  .allPrivileges().exceptUserMode();
4877  InitReg(MISCREG_ICC_ASGI1R)
4878  .allPrivileges().exceptUserMode().reads(0);
4879  InitReg(MISCREG_ICC_BPR0)
4880  .allPrivileges().exceptUserMode();
4881  InitReg(MISCREG_ICC_BPR1)
4882  .allPrivileges().exceptUserMode();
4883  InitReg(MISCREG_ICC_BPR1_NS)
4884  .allPrivileges().exceptUserMode();
4885  InitReg(MISCREG_ICC_BPR1_S)
4886  .allPrivileges().exceptUserMode();
4887  InitReg(MISCREG_ICC_CTLR)
4888  .allPrivileges().exceptUserMode();
4889  InitReg(MISCREG_ICC_CTLR_NS)
4890  .allPrivileges().exceptUserMode();
4891  InitReg(MISCREG_ICC_CTLR_S)
4892  .allPrivileges().exceptUserMode();
4893  InitReg(MISCREG_ICC_DIR)
4894  .allPrivileges().exceptUserMode().reads(0);
4895  InitReg(MISCREG_ICC_EOIR0)
4896  .allPrivileges().exceptUserMode().reads(0);
4897  InitReg(MISCREG_ICC_EOIR1)
4898  .allPrivileges().exceptUserMode().reads(0);
4899  InitReg(MISCREG_ICC_HPPIR0)
4900  .allPrivileges().exceptUserMode().writes(0);
4901  InitReg(MISCREG_ICC_HPPIR1)
4902  .allPrivileges().exceptUserMode().writes(0);
4903  InitReg(MISCREG_ICC_HSRE)
4904  .allPrivileges().exceptUserMode();
4905  InitReg(MISCREG_ICC_IAR0)
4906  .allPrivileges().exceptUserMode().writes(0);
4907  InitReg(MISCREG_ICC_IAR1)
4908  .allPrivileges().exceptUserMode().writes(0);
4909  InitReg(MISCREG_ICC_IGRPEN0)
4910  .allPrivileges().exceptUserMode();
4911  InitReg(MISCREG_ICC_IGRPEN1)
4912  .allPrivileges().exceptUserMode();
4913  InitReg(MISCREG_ICC_IGRPEN1_NS)
4914  .allPrivileges().exceptUserMode();
4915  InitReg(MISCREG_ICC_IGRPEN1_S)
4916  .allPrivileges().exceptUserMode();
4917  InitReg(MISCREG_ICC_MCTLR)
4918  .allPrivileges().exceptUserMode();
4919  InitReg(MISCREG_ICC_MGRPEN1)
4920  .allPrivileges().exceptUserMode();
4921  InitReg(MISCREG_ICC_MSRE)
4922  .allPrivileges().exceptUserMode();
4923  InitReg(MISCREG_ICC_PMR)
4924  .allPrivileges().exceptUserMode();
4925  InitReg(MISCREG_ICC_RPR)
4926  .allPrivileges().exceptUserMode().writes(0);
4927  InitReg(MISCREG_ICC_SGI0R)
4928  .allPrivileges().exceptUserMode().reads(0);
4929  InitReg(MISCREG_ICC_SGI1R)
4930  .allPrivileges().exceptUserMode().reads(0);
4931  InitReg(MISCREG_ICC_SRE)
4932  .allPrivileges().exceptUserMode();
4933  InitReg(MISCREG_ICC_SRE_NS)
4934  .allPrivileges().exceptUserMode();
4935  InitReg(MISCREG_ICC_SRE_S)
4936  .allPrivileges().exceptUserMode();
4937 
4938  InitReg(MISCREG_ICH_AP0R0)
4939  .hyp().mon();
4940  InitReg(MISCREG_ICH_AP0R1)
4941  .hyp().mon();
4942  InitReg(MISCREG_ICH_AP0R2)
4943  .hyp().mon();
4944  InitReg(MISCREG_ICH_AP0R3)
4945  .hyp().mon();
4946  InitReg(MISCREG_ICH_AP1R0)
4947  .hyp().mon();
4948  InitReg(MISCREG_ICH_AP1R1)
4949  .hyp().mon();
4950  InitReg(MISCREG_ICH_AP1R2)
4951  .hyp().mon();
4952  InitReg(MISCREG_ICH_AP1R3)
4953  .hyp().mon();
4954  InitReg(MISCREG_ICH_HCR)
4955  .hyp().mon();
4956  InitReg(MISCREG_ICH_VTR)
4957  .hyp().mon().writes(0);
4958  InitReg(MISCREG_ICH_MISR)
4959  .hyp().mon().writes(0);
4960  InitReg(MISCREG_ICH_EISR)
4961  .hyp().mon().writes(0);
4962  InitReg(MISCREG_ICH_ELRSR)
4963  .hyp().mon().writes(0);
4964  InitReg(MISCREG_ICH_VMCR)
4965  .hyp().mon();
4966  InitReg(MISCREG_ICH_LR0)
4967  .hyp().mon();
4968  InitReg(MISCREG_ICH_LR1)
4969  .hyp().mon();
4970  InitReg(MISCREG_ICH_LR2)
4971  .hyp().mon();
4972  InitReg(MISCREG_ICH_LR3)
4973  .hyp().mon();
4974  InitReg(MISCREG_ICH_LR4)
4975  .hyp().mon();
4976  InitReg(MISCREG_ICH_LR5)
4977  .hyp().mon();
4978  InitReg(MISCREG_ICH_LR6)
4979  .hyp().mon();
4980  InitReg(MISCREG_ICH_LR7)
4981  .hyp().mon();
4982  InitReg(MISCREG_ICH_LR8)
4983  .hyp().mon();
4984  InitReg(MISCREG_ICH_LR9)
4985  .hyp().mon();
4986  InitReg(MISCREG_ICH_LR10)
4987  .hyp().mon();
4988  InitReg(MISCREG_ICH_LR11)
4989  .hyp().mon();
4990  InitReg(MISCREG_ICH_LR12)
4991  .hyp().mon();
4992  InitReg(MISCREG_ICH_LR13)
4993  .hyp().mon();
4994  InitReg(MISCREG_ICH_LR14)
4995  .hyp().mon();
4996  InitReg(MISCREG_ICH_LR15)
4997  .hyp().mon();
4998  InitReg(MISCREG_ICH_LRC0)
4999  .mapsTo(MISCREG_ICH_LR0)
5000  .hyp().mon();
5001  InitReg(MISCREG_ICH_LRC1)
5002  .mapsTo(MISCREG_ICH_LR1)
5003  .hyp().mon();
5004  InitReg(MISCREG_ICH_LRC2)
5005  .mapsTo(MISCREG_ICH_LR2)
5006  .hyp().mon();
5007  InitReg(MISCREG_ICH_LRC3)
5008  .mapsTo(MISCREG_ICH_LR3)
5009  .hyp().mon();
5010  InitReg(MISCREG_ICH_LRC4)
5011  .mapsTo(MISCREG_ICH_LR4)
5012  .hyp().mon();
5013  InitReg(MISCREG_ICH_LRC5)
5014  .mapsTo(MISCREG_ICH_LR5)
5015  .hyp().mon();
5016  InitReg(MISCREG_ICH_LRC6)
5017  .mapsTo(MISCREG_ICH_LR6)
5018  .hyp().mon();
5019  InitReg(MISCREG_ICH_LRC7)
5020  .mapsTo(MISCREG_ICH_LR7)
5021  .hyp().mon();
5022  InitReg(MISCREG_ICH_LRC8)
5023  .mapsTo(MISCREG_ICH_LR8)
5024  .hyp().mon();
5025  InitReg(MISCREG_ICH_LRC9)
5026  .mapsTo(MISCREG_ICH_LR9)
5027  .hyp().mon();
5028  InitReg(MISCREG_ICH_LRC10)
5029  .mapsTo(MISCREG_ICH_LR10)
5030  .hyp().mon();
5031  InitReg(MISCREG_ICH_LRC11)
5032  .mapsTo(MISCREG_ICH_LR11)
5033  .hyp().mon();
5034  InitReg(MISCREG_ICH_LRC12)
5035  .mapsTo(MISCREG_ICH_LR12)
5036  .hyp().mon();
5037  InitReg(MISCREG_ICH_LRC13)
5038  .mapsTo(MISCREG_ICH_LR13)
5039  .hyp().mon();
5040  InitReg(MISCREG_ICH_LRC14)
5041  .mapsTo(MISCREG_ICH_LR14)
5042  .hyp().mon();
5043  InitReg(MISCREG_ICH_LRC15)
5044  .mapsTo(MISCREG_ICH_LR15)
5045  .hyp().mon();
5046 
5047  InitReg(MISCREG_CNTHV_CTL_EL2)
5048  .mon().hyp();
5049  InitReg(MISCREG_CNTHV_CVAL_EL2)
5050  .mon().hyp();
5051  InitReg(MISCREG_CNTHV_TVAL_EL2)
5052  .mon().hyp();
5053 
5054  // SVE
5055  InitReg(MISCREG_ID_AA64ZFR0_EL1)
5056  .allPrivileges().exceptUserMode().writes(0);
5057  InitReg(MISCREG_ZCR_EL3)
5058  .mon();
5059  InitReg(MISCREG_ZCR_EL2)
5060  .hyp().mon();
5061  InitReg(MISCREG_ZCR_EL12)
5062  .unimplemented().warnNotFail();
5063  InitReg(MISCREG_ZCR_EL1)
5064  .allPrivileges().exceptUserMode();
5065 
5066  // Dummy registers
5067  InitReg(MISCREG_NOP)
5068  .allPrivileges();
5069  InitReg(MISCREG_RAZ)
5070  .allPrivileges().exceptUserMode().writes(0);
5071  InitReg(MISCREG_CP14_UNIMPL)
5072  .unimplemented()
5073  .warnNotFail();
5074  InitReg(MISCREG_CP15_UNIMPL)
5075  .unimplemented()
5076  .warnNotFail();
5077  InitReg(MISCREG_UNKNOWN);
5078  InitReg(MISCREG_IMPDEF_UNIMPL)
5079  .unimplemented()
5080  .warnNotFail(impdefAsNop);
5081 
5082  // RAS extension (unimplemented)
5083  InitReg(MISCREG_ERRIDR_EL1)
5084  .unimplemented()
5085  .warnNotFail();
5086  InitReg(MISCREG_ERRSELR_EL1)
5087  .unimplemented()
5088  .warnNotFail();
5089  InitReg(MISCREG_ERXFR_EL1)
5090  .unimplemented()
5091  .warnNotFail();
5092  InitReg(MISCREG_ERXCTLR_EL1)
5093  .unimplemented()
5094  .warnNotFail();
5095  InitReg(MISCREG_ERXSTATUS_EL1)
5096  .unimplemented()
5097  .warnNotFail();
5098  InitReg(MISCREG_ERXADDR_EL1)
5099  .unimplemented()
5100  .warnNotFail();
5101  InitReg(MISCREG_ERXMISC0_EL1)
5102  .unimplemented()
5103  .warnNotFail();
5104  InitReg(MISCREG_ERXMISC1_EL1)
5105  .unimplemented()
5106  .warnNotFail();
5107  InitReg(MISCREG_DISR_EL1)
5108  .unimplemented()
5109  .warnNotFail();
5110  InitReg(MISCREG_VSESR_EL2)
5111  .unimplemented()
5112  .warnNotFail();
5113  InitReg(MISCREG_VDISR_EL2)
5114  .unimplemented()
5115  .warnNotFail();
5116 
5117  // Register mappings for some unimplemented registers:
5118  // ESR_EL1 -> DFSR
5119  // RMR_EL1 -> RMR
5120  // RMR_EL2 -> HRMR
5121  // DBGDTR_EL0 -> DBGDTR{R or T}Xint
5122  // DBGDTRRX_EL0 -> DBGDTRRXint
5123  // DBGDTRTX_EL0 -> DBGDTRRXint
5124  // MDCR_EL3 -> SDCR, NAM D7-2108 (the latter is unimpl. in gem5)
5125 
5126  completed = true;
5127 }
5128 
5129 } // namespace ArmISA
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:167
int snsBankedIndex64(MiscRegIndex reg, ThreadContext *tc)
Definition: miscregs.cc:1081
MiscRegIndex
Definition: miscregs.hh:57
bitset< NUM_MISCREG_INFOS > miscRegInfo[NUM_MISCREGS]
Definition: miscregs.cc:2888
Bitfield< 5, 3 > reg
Definition: types.hh:89
static ExceptionLevel currEL(ThreadContext *tc)
Definition: utility.hh:144
Bitfield< 7 > i
bool haveSecurity() const
Returns true if this system implements the Security Extensions.
Definition: system.hh:185
bool highestELIs64() const
Returns true if the register width of the highest implemented exception level is 64 bits (ARMv8) ...
Definition: system.hh:221
bool FullSystem
The FullSystem variable can be used to determine the current mode of simulation.
Definition: root.cc:136
void preUnflattenMiscReg()
Definition: miscregs.cc:1099
Overload hash function for BasicBlockRange type.
Definition: vec_reg.hh:586
Definition: ccregs.hh:42
ThreadContext is the external interface to all thread state for anything outside of the CPU...
int unflattenResultMiscReg[NUM_MISCREGS]
If the reg is a child reg of a banked set, then the parent is the last banked one in the list...
Definition: miscregs.cc:1096
ExceptionLevel
Definition: types.hh:585
MiscRegIndex decodeCP15Reg64(unsigned crm, unsigned opc1)
Definition: miscregs.cc:932
Bitfield< 0 > ns
Bitfield< 3, 2 > el
int unflattenMiscReg(int reg)
Definition: miscregs.cc:1115
void initializeMiscRegMetadata()
Definition: miscregs.cc:2891
MiscRegIndex decodeAArch64SysReg(unsigned op0, unsigned op1, unsigned crn, unsigned crm, unsigned op2)
Definition: miscregs.cc:1211
#define M5_FALLTHROUGH
Definition: compiler.hh:86
bool canReadAArch64SysReg(MiscRegIndex reg, HCR hcr, SCR scr, CPSR cpsr, ThreadContext *tc)
Definition: miscregs.cc:1121
virtual BaseISA * getIsaPtr()=0
std::tuple< bool, bool > canReadCoprocReg(MiscRegIndex reg, SCR scr, CPSR cpsr)
Check for permission to read coprocessor registers.
Definition: miscregs.cc:991
Bitfield< 15 > system
Definition: misc.hh:999
std::tuple< bool, bool > canWriteCoprocReg(MiscRegIndex reg, SCR scr, CPSR cpsr)
Check for permission to write coprocessor registers.
Definition: miscregs.cc:1027
ExceptionLevel highestEL() const
Returns the highest implemented exception level.
Definition: system.hh:224
int snsBankedIndex(MiscRegIndex reg, ThreadContext *tc)
Definition: miscregs.cc:1063
Bitfield< 7, 5 > opc2
Definition: types.hh:116
#define warn(...)
Definition: logging.hh:212
bool EL2Enabled(ThreadContext *tc)
Definition: utility.cc:325
MiscRegIndex decodeCP15Reg(unsigned crn, unsigned opc1, unsigned crm, unsigned opc2)
Definition: miscregs.cc:132
virtual RegVal readMiscReg(RegIndex misc_reg)=0
MiscRegIndex decodeCP14Reg(unsigned crn, unsigned opc1, unsigned crm, unsigned opc2)
Definition: miscregs.cc:55
bool canWriteAArch64SysReg(MiscRegIndex reg, HCR hcr, SCR scr, CPSR cpsr, ThreadContext *tc)
Definition: miscregs.cc:1163

Generated on Fri Feb 28 2020 16:26:57 for gem5 by doxygen 1.8.13