gem5  v21.1.0.2
misc.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 
38 #include "arch/arm/regs/misc.hh"
39 
40 #include <tuple>
41 
42 #include "arch/arm/isa.hh"
43 #include "base/logging.hh"
44 #include "cpu/thread_context.hh"
45 #include "sim/full_system.hh"
46 
47 namespace gem5
48 {
49 
50 namespace ArmISA
51 {
52 
54 decodeCP14Reg(unsigned crn, unsigned opc1, unsigned crm, unsigned opc2)
55 {
56  switch(crn) {
57  case 0:
58  switch (opc1) {
59  case 0:
60  switch (opc2) {
61  case 0:
62  switch (crm) {
63  case 0:
64  return MISCREG_DBGDIDR;
65  case 1:
66  return MISCREG_DBGDSCRint;
67  case 7:
68  return MISCREG_DBGVCR;
69  }
70  break;
71  case 2:
72  switch (crm) {
73  case 0:
74  return MISCREG_DBGDTRRXext;
75  case 2:
76  return MISCREG_DBGDSCRext;
77  case 3:
78  return MISCREG_DBGDTRTXext;
79  case 6:
80  return MISCREG_DBGOSECCR;
81  }
82  break;
83  case 4:
84  switch (crm) {
85  case 0:
86  return MISCREG_DBGBVR0;
87  case 1:
88  return MISCREG_DBGBVR1;
89  case 2:
90  return MISCREG_DBGBVR2;
91  case 3:
92  return MISCREG_DBGBVR3;
93  case 4:
94  return MISCREG_DBGBVR4;
95  case 5:
96  return MISCREG_DBGBVR5;
97  case 6:
98  return MISCREG_DBGBVR6;
99  case 7:
100  return MISCREG_DBGBVR7;
101  case 8:
102  return MISCREG_DBGBVR8;
103  case 9:
104  return MISCREG_DBGBVR9;
105  case 10:
106  return MISCREG_DBGBVR10;
107  case 11:
108  return MISCREG_DBGBVR11;
109  case 12:
110  return MISCREG_DBGBVR12;
111  case 13:
112  return MISCREG_DBGBVR13;
113  case 14:
114  return MISCREG_DBGBVR14;
115  case 15:
116  return MISCREG_DBGBVR15;
117  }
118  break;
119  case 5:
120  switch (crm) {
121  case 0:
122  return MISCREG_DBGBCR0;
123  case 1:
124  return MISCREG_DBGBCR1;
125  case 2:
126  return MISCREG_DBGBCR2;
127  case 3:
128  return MISCREG_DBGBCR3;
129  case 4:
130  return MISCREG_DBGBCR4;
131  case 5:
132  return MISCREG_DBGBCR5;
133  case 6:
134  return MISCREG_DBGBCR6;
135  case 7:
136  return MISCREG_DBGBCR7;
137  case 8:
138  return MISCREG_DBGBCR8;
139  case 9:
140  return MISCREG_DBGBCR9;
141  case 10:
142  return MISCREG_DBGBCR10;
143  case 11:
144  return MISCREG_DBGBCR11;
145  case 12:
146  return MISCREG_DBGBCR12;
147  case 13:
148  return MISCREG_DBGBCR13;
149  case 14:
150  return MISCREG_DBGBCR14;
151  case 15:
152  return MISCREG_DBGBCR15;
153  }
154  break;
155  case 6:
156  switch (crm) {
157  case 0:
158  return MISCREG_DBGWVR0;
159  case 1:
160  return MISCREG_DBGWVR1;
161  case 2:
162  return MISCREG_DBGWVR2;
163  case 3:
164  return MISCREG_DBGWVR3;
165  case 4:
166  return MISCREG_DBGWVR4;
167  case 5:
168  return MISCREG_DBGWVR5;
169  case 6:
170  return MISCREG_DBGWVR6;
171  case 7:
172  return MISCREG_DBGWVR7;
173  case 8:
174  return MISCREG_DBGWVR8;
175  case 9:
176  return MISCREG_DBGWVR9;
177  case 10:
178  return MISCREG_DBGWVR10;
179  case 11:
180  return MISCREG_DBGWVR11;
181  case 12:
182  return MISCREG_DBGWVR12;
183  case 13:
184  return MISCREG_DBGWVR13;
185  case 14:
186  return MISCREG_DBGWVR14;
187  case 15:
188  return MISCREG_DBGWVR15;
189  break;
190  }
191  break;
192  case 7:
193  switch (crm) {
194  case 0:
195  return MISCREG_DBGWCR0;
196  case 1:
197  return MISCREG_DBGWCR1;
198  case 2:
199  return MISCREG_DBGWCR2;
200  case 3:
201  return MISCREG_DBGWCR3;
202  case 4:
203  return MISCREG_DBGWCR4;
204  case 5:
205  return MISCREG_DBGWCR5;
206  case 6:
207  return MISCREG_DBGWCR6;
208  case 7:
209  return MISCREG_DBGWCR7;
210  case 8:
211  return MISCREG_DBGWCR8;
212  case 9:
213  return MISCREG_DBGWCR9;
214  case 10:
215  return MISCREG_DBGWCR10;
216  case 11:
217  return MISCREG_DBGWCR11;
218  case 12:
219  return MISCREG_DBGWCR12;
220  case 13:
221  return MISCREG_DBGWCR13;
222  case 14:
223  return MISCREG_DBGWCR14;
224  case 15:
225  return MISCREG_DBGWCR15;
226  }
227  break;
228  }
229  break;
230  case 7:
231  switch (opc2) {
232  case 0:
233  switch (crm) {
234  case 0:
235  return MISCREG_JIDR;
236  }
237  break;
238  }
239  break;
240  }
241  break;
242  case 1:
243  switch (opc1) {
244  case 0:
245  switch(opc2) {
246  case 1:
247  switch(crm) {
248  case 0:
249  return MISCREG_DBGBXVR0;
250  case 1:
251  return MISCREG_DBGBXVR1;
252  case 2:
253  return MISCREG_DBGBXVR2;
254  case 3:
255  return MISCREG_DBGBXVR3;
256  case 4:
257  return MISCREG_DBGBXVR4;
258  case 5:
259  return MISCREG_DBGBXVR5;
260  case 6:
261  return MISCREG_DBGBXVR6;
262  case 7:
263  return MISCREG_DBGBXVR7;
264  case 8:
265  return MISCREG_DBGBXVR8;
266  case 9:
267  return MISCREG_DBGBXVR9;
268  case 10:
269  return MISCREG_DBGBXVR10;
270  case 11:
271  return MISCREG_DBGBXVR11;
272  case 12:
273  return MISCREG_DBGBXVR12;
274  case 13:
275  return MISCREG_DBGBXVR13;
276  case 14:
277  return MISCREG_DBGBXVR14;
278  case 15:
279  return MISCREG_DBGBXVR15;
280  }
281  break;
282  case 4:
283  switch (crm) {
284  case 0:
285  return MISCREG_DBGOSLAR;
286  case 1:
287  return MISCREG_DBGOSLSR;
288  case 3:
289  return MISCREG_DBGOSDLR;
290  case 4:
291  return MISCREG_DBGPRCR;
292  }
293  break;
294  }
295  break;
296  case 6:
297  switch (crm) {
298  case 0:
299  switch (opc2) {
300  case 0:
301  return MISCREG_TEEHBR;
302  }
303  break;
304  }
305  break;
306  case 7:
307  switch (crm) {
308  case 0:
309  switch (opc2) {
310  case 0:
311  return MISCREG_JOSCR;
312  }
313  break;
314  }
315  break;
316  }
317  break;
318  case 2:
319  switch (opc1) {
320  case 7:
321  switch (crm) {
322  case 0:
323  switch (opc2) {
324  case 0:
325  return MISCREG_JMCR;
326  }
327  break;
328  }
329  break;
330  }
331  break;
332  }
333  // If we get here then it must be a register that we haven't implemented
334  warn("CP14 unimplemented crn[%d], opc1[%d], crm[%d], opc2[%d]",
335  crn, opc1, crm, opc2);
336  return MISCREG_CP14_UNIMPL;
337 }
338 
340 decodeCP15Reg(unsigned crn, unsigned opc1, unsigned crm, unsigned opc2)
341 {
342  switch (crn) {
343  case 0:
344  switch (opc1) {
345  case 0:
346  switch (crm) {
347  case 0:
348  switch (opc2) {
349  case 1:
350  return MISCREG_CTR;
351  case 2:
352  return MISCREG_TCMTR;
353  case 3:
354  return MISCREG_TLBTR;
355  case 5:
356  return MISCREG_MPIDR;
357  case 6:
358  return MISCREG_REVIDR;
359  default:
360  return MISCREG_MIDR;
361  }
362  break;
363  case 1:
364  switch (opc2) {
365  case 0:
366  return MISCREG_ID_PFR0;
367  case 1:
368  return MISCREG_ID_PFR1;
369  case 2:
370  return MISCREG_ID_DFR0;
371  case 3:
372  return MISCREG_ID_AFR0;
373  case 4:
374  return MISCREG_ID_MMFR0;
375  case 5:
376  return MISCREG_ID_MMFR1;
377  case 6:
378  return MISCREG_ID_MMFR2;
379  case 7:
380  return MISCREG_ID_MMFR3;
381  }
382  break;
383  case 2:
384  switch (opc2) {
385  case 0:
386  return MISCREG_ID_ISAR0;
387  case 1:
388  return MISCREG_ID_ISAR1;
389  case 2:
390  return MISCREG_ID_ISAR2;
391  case 3:
392  return MISCREG_ID_ISAR3;
393  case 4:
394  return MISCREG_ID_ISAR4;
395  case 5:
396  return MISCREG_ID_ISAR5;
397  case 6:
398  return MISCREG_ID_MMFR4;
399  case 7:
400  return MISCREG_ID_ISAR6;
401  }
402  break;
403  default:
404  return MISCREG_RAZ; // read as zero
405  }
406  break;
407  case 1:
408  if (crm == 0) {
409  switch (opc2) {
410  case 0:
411  return MISCREG_CCSIDR;
412  case 1:
413  return MISCREG_CLIDR;
414  case 7:
415  return MISCREG_AIDR;
416  }
417  }
418  break;
419  case 2:
420  if (crm == 0 && opc2 == 0) {
421  return MISCREG_CSSELR;
422  }
423  break;
424  case 4:
425  if (crm == 0) {
426  if (opc2 == 0)
427  return MISCREG_VPIDR;
428  else if (opc2 == 5)
429  return MISCREG_VMPIDR;
430  }
431  break;
432  }
433  break;
434  case 1:
435  if (opc1 == 0) {
436  if (crm == 0) {
437  switch (opc2) {
438  case 0:
439  return MISCREG_SCTLR;
440  case 1:
441  return MISCREG_ACTLR;
442  case 0x2:
443  return MISCREG_CPACR;
444  }
445  } else if (crm == 1) {
446  switch (opc2) {
447  case 0:
448  return MISCREG_SCR;
449  case 1:
450  return MISCREG_SDER;
451  case 2:
452  return MISCREG_NSACR;
453  }
454  } else if (crm == 3) {
455  if ( opc2 == 1)
456  return MISCREG_SDCR;
457  }
458  } else if (opc1 == 4) {
459  if (crm == 0) {
460  if (opc2 == 0)
461  return MISCREG_HSCTLR;
462  else if (opc2 == 1)
463  return MISCREG_HACTLR;
464  } else if (crm == 1) {
465  switch (opc2) {
466  case 0:
467  return MISCREG_HCR;
468  case 1:
469  return MISCREG_HDCR;
470  case 2:
471  return MISCREG_HCPTR;
472  case 4:
473  return MISCREG_HCR2;
474  case 3:
475  return MISCREG_HSTR;
476  case 7:
477  return MISCREG_HACR;
478  }
479  }
480  }
481  break;
482  case 2:
483  if (opc1 == 0 && crm == 0) {
484  switch (opc2) {
485  case 0:
486  return MISCREG_TTBR0;
487  case 1:
488  return MISCREG_TTBR1;
489  case 2:
490  return MISCREG_TTBCR;
491  }
492  } else if (opc1 == 4) {
493  if (crm == 0 && opc2 == 2)
494  return MISCREG_HTCR;
495  else if (crm == 1 && opc2 == 2)
496  return MISCREG_VTCR;
497  }
498  break;
499  case 3:
500  if (opc1 == 0 && crm == 0 && opc2 == 0) {
501  return MISCREG_DACR;
502  }
503  break;
504  case 4:
505  if (opc1 == 0 && crm == 6 && opc2 == 0) {
506  return MISCREG_ICC_PMR;
507  }
508  break;
509  case 5:
510  if (opc1 == 0) {
511  if (crm == 0) {
512  if (opc2 == 0) {
513  return MISCREG_DFSR;
514  } else if (opc2 == 1) {
515  return MISCREG_IFSR;
516  }
517  } else if (crm == 1) {
518  if (opc2 == 0) {
519  return MISCREG_ADFSR;
520  } else if (opc2 == 1) {
521  return MISCREG_AIFSR;
522  }
523  }
524  } else if (opc1 == 4) {
525  if (crm == 1) {
526  if (opc2 == 0)
527  return MISCREG_HADFSR;
528  else if (opc2 == 1)
529  return MISCREG_HAIFSR;
530  } else if (crm == 2 && opc2 == 0) {
531  return MISCREG_HSR;
532  }
533  }
534  break;
535  case 6:
536  if (opc1 == 0 && crm == 0) {
537  switch (opc2) {
538  case 0:
539  return MISCREG_DFAR;
540  case 2:
541  return MISCREG_IFAR;
542  }
543  } else if (opc1 == 4 && crm == 0) {
544  switch (opc2) {
545  case 0:
546  return MISCREG_HDFAR;
547  case 2:
548  return MISCREG_HIFAR;
549  case 4:
550  return MISCREG_HPFAR;
551  }
552  }
553  break;
554  case 7:
555  if (opc1 == 0) {
556  switch (crm) {
557  case 0:
558  if (opc2 == 4) {
559  return MISCREG_NOP;
560  }
561  break;
562  case 1:
563  switch (opc2) {
564  case 0:
565  return MISCREG_ICIALLUIS;
566  case 6:
567  return MISCREG_BPIALLIS;
568  }
569  break;
570  case 2:
571  switch (opc2) {
572  case 7:
573  return MISCREG_DBGDEVID0;
574  }
575  break;
576  case 4:
577  if (opc2 == 0) {
578  return MISCREG_PAR;
579  }
580  break;
581  case 5:
582  switch (opc2) {
583  case 0:
584  return MISCREG_ICIALLU;
585  case 1:
586  return MISCREG_ICIMVAU;
587  case 4:
588  return MISCREG_CP15ISB;
589  case 6:
590  return MISCREG_BPIALL;
591  case 7:
592  return MISCREG_BPIMVA;
593  }
594  break;
595  case 6:
596  if (opc2 == 1) {
597  return MISCREG_DCIMVAC;
598  } else if (opc2 == 2) {
599  return MISCREG_DCISW;
600  }
601  break;
602  case 8:
603  switch (opc2) {
604  case 0:
605  return MISCREG_ATS1CPR;
606  case 1:
607  return MISCREG_ATS1CPW;
608  case 2:
609  return MISCREG_ATS1CUR;
610  case 3:
611  return MISCREG_ATS1CUW;
612  case 4:
613  return MISCREG_ATS12NSOPR;
614  case 5:
615  return MISCREG_ATS12NSOPW;
616  case 6:
617  return MISCREG_ATS12NSOUR;
618  case 7:
619  return MISCREG_ATS12NSOUW;
620  }
621  break;
622  case 10:
623  switch (opc2) {
624  case 1:
625  return MISCREG_DCCMVAC;
626  case 2:
627  return MISCREG_DCCSW;
628  case 4:
629  return MISCREG_CP15DSB;
630  case 5:
631  return MISCREG_CP15DMB;
632  }
633  break;
634  case 11:
635  if (opc2 == 1) {
636  return MISCREG_DCCMVAU;
637  }
638  break;
639  case 13:
640  if (opc2 == 1) {
641  return MISCREG_NOP;
642  }
643  break;
644  case 14:
645  if (opc2 == 1) {
646  return MISCREG_DCCIMVAC;
647  } else if (opc2 == 2) {
648  return MISCREG_DCCISW;
649  }
650  break;
651  }
652  } else if (opc1 == 4 && crm == 8) {
653  if (opc2 == 0)
654  return MISCREG_ATS1HR;
655  else if (opc2 == 1)
656  return MISCREG_ATS1HW;
657  }
658  break;
659  case 8:
660  if (opc1 == 0) {
661  switch (crm) {
662  case 3:
663  switch (opc2) {
664  case 0:
665  return MISCREG_TLBIALLIS;
666  case 1:
667  return MISCREG_TLBIMVAIS;
668  case 2:
669  return MISCREG_TLBIASIDIS;
670  case 3:
671  return MISCREG_TLBIMVAAIS;
672  case 5:
673  return MISCREG_TLBIMVALIS;
674  case 7:
675  return MISCREG_TLBIMVAALIS;
676  }
677  break;
678  case 5:
679  switch (opc2) {
680  case 0:
681  return MISCREG_ITLBIALL;
682  case 1:
683  return MISCREG_ITLBIMVA;
684  case 2:
685  return MISCREG_ITLBIASID;
686  }
687  break;
688  case 6:
689  switch (opc2) {
690  case 0:
691  return MISCREG_DTLBIALL;
692  case 1:
693  return MISCREG_DTLBIMVA;
694  case 2:
695  return MISCREG_DTLBIASID;
696  }
697  break;
698  case 7:
699  switch (opc2) {
700  case 0:
701  return MISCREG_TLBIALL;
702  case 1:
703  return MISCREG_TLBIMVA;
704  case 2:
705  return MISCREG_TLBIASID;
706  case 3:
707  return MISCREG_TLBIMVAA;
708  case 5:
709  return MISCREG_TLBIMVAL;
710  case 7:
711  return MISCREG_TLBIMVAAL;
712  }
713  break;
714  }
715  } else if (opc1 == 4) {
716  if (crm == 0) {
717  switch (opc2) {
718  case 1:
719  return MISCREG_TLBIIPAS2IS;
720  case 5:
721  return MISCREG_TLBIIPAS2LIS;
722  }
723  } else if (crm == 3) {
724  switch (opc2) {
725  case 0:
726  return MISCREG_TLBIALLHIS;
727  case 1:
728  return MISCREG_TLBIMVAHIS;
729  case 4:
730  return MISCREG_TLBIALLNSNHIS;
731  case 5:
732  return MISCREG_TLBIMVALHIS;
733  }
734  } else if (crm == 4) {
735  switch (opc2) {
736  case 1:
737  return MISCREG_TLBIIPAS2;
738  case 5:
739  return MISCREG_TLBIIPAS2L;
740  }
741  } else if (crm == 7) {
742  switch (opc2) {
743  case 0:
744  return MISCREG_TLBIALLH;
745  case 1:
746  return MISCREG_TLBIMVAH;
747  case 4:
748  return MISCREG_TLBIALLNSNH;
749  case 5:
750  return MISCREG_TLBIMVALH;
751  }
752  }
753  }
754  break;
755  case 9:
756  // Every cop register with CRn = 9 and CRm in
757  // {0-2}, {5-8} is implementation defined regardless
758  // of opc1 and opc2.
759  switch (crm) {
760  case 0:
761  case 1:
762  case 2:
763  case 5:
764  case 6:
765  case 7:
766  case 8:
767  return MISCREG_IMPDEF_UNIMPL;
768  }
769  if (opc1 == 0) {
770  switch (crm) {
771  case 12:
772  switch (opc2) {
773  case 0:
774  return MISCREG_PMCR;
775  case 1:
776  return MISCREG_PMCNTENSET;
777  case 2:
778  return MISCREG_PMCNTENCLR;
779  case 3:
780  return MISCREG_PMOVSR;
781  case 4:
782  return MISCREG_PMSWINC;
783  case 5:
784  return MISCREG_PMSELR;
785  case 6:
786  return MISCREG_PMCEID0;
787  case 7:
788  return MISCREG_PMCEID1;
789  }
790  break;
791  case 13:
792  switch (opc2) {
793  case 0:
794  return MISCREG_PMCCNTR;
795  case 1:
796  // Selector is PMSELR.SEL
798  case 2:
799  return MISCREG_PMXEVCNTR;
800  }
801  break;
802  case 14:
803  switch (opc2) {
804  case 0:
805  return MISCREG_PMUSERENR;
806  case 1:
807  return MISCREG_PMINTENSET;
808  case 2:
809  return MISCREG_PMINTENCLR;
810  case 3:
811  return MISCREG_PMOVSSET;
812  }
813  break;
814  }
815  } else if (opc1 == 1) {
816  switch (crm) {
817  case 0:
818  switch (opc2) {
819  case 2: // L2CTLR, L2 Control Register
820  return MISCREG_L2CTLR;
821  case 3:
822  return MISCREG_L2ECTLR;
823  }
824  break;
825  break;
826  }
827  }
828  break;
829  case 10:
830  if (opc1 == 0) {
831  // crm 0, 1, 4, and 8, with op2 0 - 7, reserved for TLB lockdown
832  if (crm < 2) {
833  return MISCREG_IMPDEF_UNIMPL;
834  } else if (crm == 2) { // TEX Remap Registers
835  if (opc2 == 0) {
836  // Selector is TTBCR.EAE
837  return MISCREG_PRRR_MAIR0;
838  } else if (opc2 == 1) {
839  // Selector is TTBCR.EAE
840  return MISCREG_NMRR_MAIR1;
841  }
842  } else if (crm == 3) {
843  if (opc2 == 0) {
844  return MISCREG_AMAIR0;
845  } else if (opc2 == 1) {
846  return MISCREG_AMAIR1;
847  }
848  }
849  } else if (opc1 == 4) {
850  // crm 0, 1, 4, and 8, with op2 0 - 7, reserved for TLB lockdown
851  if (crm == 2) {
852  if (opc2 == 0)
853  return MISCREG_HMAIR0;
854  else if (opc2 == 1)
855  return MISCREG_HMAIR1;
856  } else if (crm == 3) {
857  if (opc2 == 0)
858  return MISCREG_HAMAIR0;
859  else if (opc2 == 1)
860  return MISCREG_HAMAIR1;
861  }
862  }
863  break;
864  case 11:
865  if (opc1 <=7) {
866  switch (crm) {
867  case 0:
868  case 1:
869  case 2:
870  case 3:
871  case 4:
872  case 5:
873  case 6:
874  case 7:
875  case 8:
876  case 15:
877  // Reserved for DMA operations for TCM access
878  return MISCREG_IMPDEF_UNIMPL;
879  default:
880  break;
881  }
882  }
883  break;
884  case 12:
885  if (opc1 == 0) {
886  if (crm == 0) {
887  if (opc2 == 0) {
888  return MISCREG_VBAR;
889  } else if (opc2 == 1) {
890  return MISCREG_MVBAR;
891  }
892  } else if (crm == 1) {
893  if (opc2 == 0) {
894  return MISCREG_ISR;
895  }
896  } else if (crm == 8) {
897  switch (opc2) {
898  case 0:
899  return MISCREG_ICC_IAR0;
900  case 1:
901  return MISCREG_ICC_EOIR0;
902  case 2:
903  return MISCREG_ICC_HPPIR0;
904  case 3:
905  return MISCREG_ICC_BPR0;
906  case 4:
907  return MISCREG_ICC_AP0R0;
908  case 5:
909  return MISCREG_ICC_AP0R1;
910  case 6:
911  return MISCREG_ICC_AP0R2;
912  case 7:
913  return MISCREG_ICC_AP0R3;
914  }
915  } else if (crm == 9) {
916  switch (opc2) {
917  case 0:
918  return MISCREG_ICC_AP1R0;
919  case 1:
920  return MISCREG_ICC_AP1R1;
921  case 2:
922  return MISCREG_ICC_AP1R2;
923  case 3:
924  return MISCREG_ICC_AP1R3;
925  }
926  } else if (crm == 11) {
927  switch (opc2) {
928  case 1:
929  return MISCREG_ICC_DIR;
930  case 3:
931  return MISCREG_ICC_RPR;
932  }
933  } else if (crm == 12) {
934  switch (opc2) {
935  case 0:
936  return MISCREG_ICC_IAR1;
937  case 1:
938  return MISCREG_ICC_EOIR1;
939  case 2:
940  return MISCREG_ICC_HPPIR1;
941  case 3:
942  return MISCREG_ICC_BPR1;
943  case 4:
944  return MISCREG_ICC_CTLR;
945  case 5:
946  return MISCREG_ICC_SRE;
947  case 6:
948  return MISCREG_ICC_IGRPEN0;
949  case 7:
950  return MISCREG_ICC_IGRPEN1;
951  }
952  }
953  } else if (opc1 == 4) {
954  if (crm == 0 && opc2 == 0) {
955  return MISCREG_HVBAR;
956  } else if (crm == 8) {
957  switch (opc2) {
958  case 0:
959  return MISCREG_ICH_AP0R0;
960  case 1:
961  return MISCREG_ICH_AP0R1;
962  case 2:
963  return MISCREG_ICH_AP0R2;
964  case 3:
965  return MISCREG_ICH_AP0R3;
966  }
967  } else if (crm == 9) {
968  switch (opc2) {
969  case 0:
970  return MISCREG_ICH_AP1R0;
971  case 1:
972  return MISCREG_ICH_AP1R1;
973  case 2:
974  return MISCREG_ICH_AP1R2;
975  case 3:
976  return MISCREG_ICH_AP1R3;
977  case 5:
978  return MISCREG_ICC_HSRE;
979  }
980  } else if (crm == 11) {
981  switch (opc2) {
982  case 0:
983  return MISCREG_ICH_HCR;
984  case 1:
985  return MISCREG_ICH_VTR;
986  case 2:
987  return MISCREG_ICH_MISR;
988  case 3:
989  return MISCREG_ICH_EISR;
990  case 5:
991  return MISCREG_ICH_ELRSR;
992  case 7:
993  return MISCREG_ICH_VMCR;
994  }
995  } else if (crm == 12) {
996  switch (opc2) {
997  case 0:
998  return MISCREG_ICH_LR0;
999  case 1:
1000  return MISCREG_ICH_LR1;
1001  case 2:
1002  return MISCREG_ICH_LR2;
1003  case 3:
1004  return MISCREG_ICH_LR3;
1005  case 4:
1006  return MISCREG_ICH_LR4;
1007  case 5:
1008  return MISCREG_ICH_LR5;
1009  case 6:
1010  return MISCREG_ICH_LR6;
1011  case 7:
1012  return MISCREG_ICH_LR7;
1013  }
1014  } else if (crm == 13) {
1015  switch (opc2) {
1016  case 0:
1017  return MISCREG_ICH_LR8;
1018  case 1:
1019  return MISCREG_ICH_LR9;
1020  case 2:
1021  return MISCREG_ICH_LR10;
1022  case 3:
1023  return MISCREG_ICH_LR11;
1024  case 4:
1025  return MISCREG_ICH_LR12;
1026  case 5:
1027  return MISCREG_ICH_LR13;
1028  case 6:
1029  return MISCREG_ICH_LR14;
1030  case 7:
1031  return MISCREG_ICH_LR15;
1032  }
1033  } else if (crm == 14) {
1034  switch (opc2) {
1035  case 0:
1036  return MISCREG_ICH_LRC0;
1037  case 1:
1038  return MISCREG_ICH_LRC1;
1039  case 2:
1040  return MISCREG_ICH_LRC2;
1041  case 3:
1042  return MISCREG_ICH_LRC3;
1043  case 4:
1044  return MISCREG_ICH_LRC4;
1045  case 5:
1046  return MISCREG_ICH_LRC5;
1047  case 6:
1048  return MISCREG_ICH_LRC6;
1049  case 7:
1050  return MISCREG_ICH_LRC7;
1051  }
1052  } else if (crm == 15) {
1053  switch (opc2) {
1054  case 0:
1055  return MISCREG_ICH_LRC8;
1056  case 1:
1057  return MISCREG_ICH_LRC9;
1058  case 2:
1059  return MISCREG_ICH_LRC10;
1060  case 3:
1061  return MISCREG_ICH_LRC11;
1062  case 4:
1063  return MISCREG_ICH_LRC12;
1064  case 5:
1065  return MISCREG_ICH_LRC13;
1066  case 6:
1067  return MISCREG_ICH_LRC14;
1068  case 7:
1069  return MISCREG_ICH_LRC15;
1070  }
1071  }
1072  } else if (opc1 == 6) {
1073  if (crm == 12) {
1074  switch (opc2) {
1075  case 4:
1076  return MISCREG_ICC_MCTLR;
1077  case 5:
1078  return MISCREG_ICC_MSRE;
1079  case 7:
1080  return MISCREG_ICC_MGRPEN1;
1081  }
1082  }
1083  }
1084  break;
1085  case 13:
1086  if (opc1 == 0) {
1087  if (crm == 0) {
1088  switch (opc2) {
1089  case 0:
1090  return MISCREG_FCSEIDR;
1091  case 1:
1092  return MISCREG_CONTEXTIDR;
1093  case 2:
1094  return MISCREG_TPIDRURW;
1095  case 3:
1096  return MISCREG_TPIDRURO;
1097  case 4:
1098  return MISCREG_TPIDRPRW;
1099  }
1100  }
1101  } else if (opc1 == 4) {
1102  if (crm == 0 && opc2 == 2)
1103  return MISCREG_HTPIDR;
1104  }
1105  break;
1106  case 14:
1107  if (opc1 == 0) {
1108  switch (crm) {
1109  case 0:
1110  if (opc2 == 0)
1111  return MISCREG_CNTFRQ;
1112  break;
1113  case 1:
1114  if (opc2 == 0)
1115  return MISCREG_CNTKCTL;
1116  break;
1117  case 2:
1118  if (opc2 == 0)
1119  return MISCREG_CNTP_TVAL;
1120  else if (opc2 == 1)
1121  return MISCREG_CNTP_CTL;
1122  break;
1123  case 3:
1124  if (opc2 == 0)
1125  return MISCREG_CNTV_TVAL;
1126  else if (opc2 == 1)
1127  return MISCREG_CNTV_CTL;
1128  break;
1129  }
1130  } else if (opc1 == 4) {
1131  if (crm == 1 && opc2 == 0) {
1132  return MISCREG_CNTHCTL;
1133  } else if (crm == 2) {
1134  if (opc2 == 0)
1135  return MISCREG_CNTHP_TVAL;
1136  else if (opc2 == 1)
1137  return MISCREG_CNTHP_CTL;
1138  }
1139  }
1140  break;
1141  case 15:
1142  // Implementation defined
1143  return MISCREG_IMPDEF_UNIMPL;
1144  }
1145  // Unrecognized register
1146  return MISCREG_CP15_UNIMPL;
1147 }
1148 
1150 decodeCP15Reg64(unsigned crm, unsigned opc1)
1151 {
1152  switch (crm) {
1153  case 2:
1154  switch (opc1) {
1155  case 0:
1156  return MISCREG_TTBR0;
1157  case 1:
1158  return MISCREG_TTBR1;
1159  case 4:
1160  return MISCREG_HTTBR;
1161  case 6:
1162  return MISCREG_VTTBR;
1163  }
1164  break;
1165  case 7:
1166  if (opc1 == 0)
1167  return MISCREG_PAR;
1168  break;
1169  case 14:
1170  switch (opc1) {
1171  case 0:
1172  return MISCREG_CNTPCT;
1173  case 1:
1174  return MISCREG_CNTVCT;
1175  case 2:
1176  return MISCREG_CNTP_CVAL;
1177  case 3:
1178  return MISCREG_CNTV_CVAL;
1179  case 4:
1180  return MISCREG_CNTVOFF;
1181  case 6:
1182  return MISCREG_CNTHP_CVAL;
1183  }
1184  break;
1185  case 12:
1186  switch (opc1) {
1187  case 0:
1188  return MISCREG_ICC_SGI1R;
1189  case 1:
1190  return MISCREG_ICC_ASGI1R;
1191  case 2:
1192  return MISCREG_ICC_SGI0R;
1193  default:
1194  break;
1195  }
1196  break;
1197  case 15:
1198  if (opc1 == 0)
1199  return MISCREG_CPUMERRSR;
1200  else if (opc1 == 1)
1201  return MISCREG_L2MERRSR;
1202  break;
1203  }
1204  // Unrecognized register
1205  return MISCREG_CP15_UNIMPL;
1206 }
1207 
1208 std::tuple<bool, bool>
1210 {
1211  bool secure = !scr.ns;
1212  bool canRead = false;
1213  bool undefined = false;
1214 
1215  switch (cpsr.mode) {
1216  case MODE_USER:
1217  canRead = secure ? miscRegInfo[reg][MISCREG_USR_S_RD] :
1219  break;
1220  case MODE_FIQ:
1221  case MODE_IRQ:
1222  case MODE_SVC:
1223  case MODE_ABORT:
1224  case MODE_UNDEFINED:
1225  case MODE_SYSTEM:
1226  canRead = secure ? miscRegInfo[reg][MISCREG_PRI_S_RD] :
1228  break;
1229  case MODE_MON:
1230  canRead = secure ? miscRegInfo[reg][MISCREG_MON_NS0_RD] :
1232  break;
1233  case MODE_HYP:
1234  canRead = miscRegInfo[reg][MISCREG_HYP_NS_RD];
1235  break;
1236  default:
1237  undefined = true;
1238  }
1239 
1240  switch (reg) {
1242  if (!undefined)
1243  undefined = AArch32isUndefinedGenericTimer(reg, tc);
1244  break;
1245  default:
1246  break;
1247  }
1248 
1249  // can't do permissions checkes on the root of a banked pair of regs
1250  assert(!miscRegInfo[reg][MISCREG_BANKED]);
1251  return std::make_tuple(canRead, undefined);
1252 }
1253 
1254 std::tuple<bool, bool>
1256 {
1257  bool secure = !scr.ns;
1258  bool canWrite = false;
1259  bool undefined = false;
1260 
1261  switch (cpsr.mode) {
1262  case MODE_USER:
1263  canWrite = secure ? miscRegInfo[reg][MISCREG_USR_S_WR] :
1265  break;
1266  case MODE_FIQ:
1267  case MODE_IRQ:
1268  case MODE_SVC:
1269  case MODE_ABORT:
1270  case MODE_UNDEFINED:
1271  case MODE_SYSTEM:
1272  canWrite = secure ? miscRegInfo[reg][MISCREG_PRI_S_WR] :
1274  break;
1275  case MODE_MON:
1276  canWrite = secure ? miscRegInfo[reg][MISCREG_MON_NS0_WR] :
1278  break;
1279  case MODE_HYP:
1280  canWrite = miscRegInfo[reg][MISCREG_HYP_NS_WR];
1281  break;
1282  default:
1283  undefined = true;
1284  }
1285 
1286  switch (reg) {
1288  if (!undefined)
1289  undefined = AArch32isUndefinedGenericTimer(reg, tc);
1290  break;
1291  default:
1292  break;
1293  }
1294 
1295  // can't do permissions checkes on the root of a banked pair of regs
1296  assert(!miscRegInfo[reg][MISCREG_BANKED]);
1297  return std::make_tuple(canWrite, undefined);
1298 }
1299 
1300 bool
1302 {
1303  if (currEL(tc) == EL0 && ELIs32(tc, EL1)) {
1304  const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
1305  bool trap_cond = condGenericTimerSystemAccessTrapEL1(reg, tc);
1306  if (trap_cond && (!EL2Enabled(tc) || !hcr.tge))
1307  return true;
1308  }
1309  return false;
1310 }
1311 
1312 int
1314 {
1315  SCR scr = tc->readMiscReg(MISCREG_SCR);
1316  return snsBankedIndex(reg, tc, scr.ns);
1317 }
1318 
1319 int
1321 {
1322  int reg_as_int = static_cast<int>(reg);
1323  if (miscRegInfo[reg][MISCREG_BANKED]) {
1324  reg_as_int += (ArmSystem::haveSecurity(tc) &&
1325  !ArmSystem::highestELIs64(tc) && !ns) ? 2 : 1;
1326  }
1327  return reg_as_int;
1328 }
1329 
1330 int
1332 {
1333  auto *isa = static_cast<ArmISA::ISA *>(tc->getIsaPtr());
1334  SCR scr = tc->readMiscReg(MISCREG_SCR);
1335  return isa->snsBankedIndex64(reg, scr.ns);
1336 }
1337 
1347 
1348 void
1350 {
1351  int reg = -1;
1352  for (int i = 0 ; i < NUM_MISCREGS; i++){
1354  reg = i;
1357  else
1359  // if this assert fails, no parent was found, and something is broken
1360  assert(unflattenResultMiscReg[i] > -1);
1361  }
1362 }
1363 
1364 int
1366 {
1367  return unflattenResultMiscReg[reg];
1368 }
1369 
1370 bool
1371 canReadAArch64SysReg(MiscRegIndex reg, HCR hcr, SCR scr, CPSR cpsr,
1372  ThreadContext *tc)
1373 {
1374  // Check for SP_EL0 access while SPSEL == 0
1375  if ((reg == MISCREG_SP_EL0) && (tc->readMiscReg(MISCREG_SPSEL) == 0))
1376  return false;
1377 
1378  // Check for RVBAR access
1379  if (reg == MISCREG_RVBAR_EL1) {
1380  ExceptionLevel highest_el = ArmSystem::highestEL(tc);
1381  if (highest_el == EL2 || highest_el == EL3)
1382  return false;
1383  }
1384  if (reg == MISCREG_RVBAR_EL2) {
1385  ExceptionLevel highest_el = ArmSystem::highestEL(tc);
1386  if (highest_el == EL3)
1387  return false;
1388  }
1389 
1390  bool secure = ArmSystem::haveSecurity(tc) && !scr.ns;
1391  bool el2_host = EL2Enabled(tc) && hcr.e2h;
1392 
1393  switch (currEL(cpsr)) {
1394  case EL0:
1395  return secure ? miscRegInfo[reg][MISCREG_USR_S_RD] :
1397  case EL1:
1398  return secure ? miscRegInfo[reg][MISCREG_PRI_S_RD] :
1400  case EL2:
1401  if (el2_host) {
1402  return secure ? miscRegInfo[reg][MISCREG_HYP_E2H_S_RD] :
1404  } else {
1405  return secure ? miscRegInfo[reg][MISCREG_HYP_S_RD] :
1407  }
1408  case EL3:
1409  return el2_host ? miscRegInfo[reg][MISCREG_MON_E2H_RD] :
1410  secure ? miscRegInfo[reg][MISCREG_MON_NS0_RD] :
1412  default:
1413  panic("Invalid exception level");
1414  }
1415 }
1416 
1417 bool
1418 canWriteAArch64SysReg(MiscRegIndex reg, HCR hcr, SCR scr, CPSR cpsr,
1419  ThreadContext *tc)
1420 {
1421  // Check for SP_EL0 access while SPSEL == 0
1422  if ((reg == MISCREG_SP_EL0) && (tc->readMiscReg(MISCREG_SPSEL) == 0))
1423  return false;
1424  ExceptionLevel el = currEL(cpsr);
1425 
1426  bool secure = ArmSystem::haveSecurity(tc) && !scr.ns;
1427  bool el2_host = EL2Enabled(tc) && hcr.e2h;
1428 
1429  switch (el) {
1430  case EL0:
1431  return secure ? miscRegInfo[reg][MISCREG_USR_S_WR] :
1433  case EL1:
1434  return secure ? miscRegInfo[reg][MISCREG_PRI_S_WR] :
1436  case EL2:
1437  if (el2_host) {
1438  return secure ? miscRegInfo[reg][MISCREG_HYP_E2H_S_WR] :
1440  } else {
1441  return secure ? miscRegInfo[reg][MISCREG_HYP_S_WR] :
1443  }
1444  case EL3:
1445  return el2_host ? miscRegInfo[reg][MISCREG_MON_E2H_WR] :
1446  secure ? miscRegInfo[reg][MISCREG_MON_NS0_WR] :
1448  default:
1449  panic("Invalid exception level");
1450  }
1451 }
1452 
1454 decodeAArch64SysReg(unsigned op0, unsigned op1,
1455  unsigned crn, unsigned crm,
1456  unsigned op2)
1457 {
1458  switch (op0) {
1459  case 1:
1460  switch (crn) {
1461  case 7:
1462  switch (op1) {
1463  case 0:
1464  switch (crm) {
1465  case 1:
1466  switch (op2) {
1467  case 0:
1468  return MISCREG_IC_IALLUIS;
1469  }
1470  break;
1471  case 5:
1472  switch (op2) {
1473  case 0:
1474  return MISCREG_IC_IALLU;
1475  }
1476  break;
1477  case 6:
1478  switch (op2) {
1479  case 1:
1480  return MISCREG_DC_IVAC_Xt;
1481  case 2:
1482  return MISCREG_DC_ISW_Xt;
1483  }
1484  break;
1485  case 8:
1486  switch (op2) {
1487  case 0:
1488  return MISCREG_AT_S1E1R_Xt;
1489  case 1:
1490  return MISCREG_AT_S1E1W_Xt;
1491  case 2:
1492  return MISCREG_AT_S1E0R_Xt;
1493  case 3:
1494  return MISCREG_AT_S1E0W_Xt;
1495  }
1496  break;
1497  case 10:
1498  switch (op2) {
1499  case 2:
1500  return MISCREG_DC_CSW_Xt;
1501  }
1502  break;
1503  case 14:
1504  switch (op2) {
1505  case 2:
1506  return MISCREG_DC_CISW_Xt;
1507  }
1508  break;
1509  }
1510  break;
1511  case 3:
1512  switch (crm) {
1513  case 4:
1514  switch (op2) {
1515  case 1:
1516  return MISCREG_DC_ZVA_Xt;
1517  }
1518  break;
1519  case 5:
1520  switch (op2) {
1521  case 1:
1522  return MISCREG_IC_IVAU_Xt;
1523  }
1524  break;
1525  case 10:
1526  switch (op2) {
1527  case 1:
1528  return MISCREG_DC_CVAC_Xt;
1529  }
1530  break;
1531  case 11:
1532  switch (op2) {
1533  case 1:
1534  return MISCREG_DC_CVAU_Xt;
1535  }
1536  break;
1537  case 14:
1538  switch (op2) {
1539  case 1:
1540  return MISCREG_DC_CIVAC_Xt;
1541  }
1542  break;
1543  }
1544  break;
1545  case 4:
1546  switch (crm) {
1547  case 8:
1548  switch (op2) {
1549  case 0:
1550  return MISCREG_AT_S1E2R_Xt;
1551  case 1:
1552  return MISCREG_AT_S1E2W_Xt;
1553  case 4:
1554  return MISCREG_AT_S12E1R_Xt;
1555  case 5:
1556  return MISCREG_AT_S12E1W_Xt;
1557  case 6:
1558  return MISCREG_AT_S12E0R_Xt;
1559  case 7:
1560  return MISCREG_AT_S12E0W_Xt;
1561  }
1562  break;
1563  }
1564  break;
1565  case 6:
1566  switch (crm) {
1567  case 8:
1568  switch (op2) {
1569  case 0:
1570  return MISCREG_AT_S1E3R_Xt;
1571  case 1:
1572  return MISCREG_AT_S1E3W_Xt;
1573  }
1574  break;
1575  }
1576  break;
1577  }
1578  break;
1579  case 8:
1580  switch (op1) {
1581  case 0:
1582  switch (crm) {
1583  case 3:
1584  switch (op2) {
1585  case 0:
1586  return MISCREG_TLBI_VMALLE1IS;
1587  case 1:
1588  return MISCREG_TLBI_VAE1IS_Xt;
1589  case 2:
1590  return MISCREG_TLBI_ASIDE1IS_Xt;
1591  case 3:
1592  return MISCREG_TLBI_VAAE1IS_Xt;
1593  case 5:
1594  return MISCREG_TLBI_VALE1IS_Xt;
1595  case 7:
1596  return MISCREG_TLBI_VAALE1IS_Xt;
1597  }
1598  break;
1599  case 7:
1600  switch (op2) {
1601  case 0:
1602  return MISCREG_TLBI_VMALLE1;
1603  case 1:
1604  return MISCREG_TLBI_VAE1_Xt;
1605  case 2:
1606  return MISCREG_TLBI_ASIDE1_Xt;
1607  case 3:
1608  return MISCREG_TLBI_VAAE1_Xt;
1609  case 5:
1610  return MISCREG_TLBI_VALE1_Xt;
1611  case 7:
1612  return MISCREG_TLBI_VAALE1_Xt;
1613  }
1614  break;
1615  }
1616  break;
1617  case 4:
1618  switch (crm) {
1619  case 0:
1620  switch (op2) {
1621  case 1:
1623  case 5:
1625  }
1626  break;
1627  case 3:
1628  switch (op2) {
1629  case 0:
1630  return MISCREG_TLBI_ALLE2IS;
1631  case 1:
1632  return MISCREG_TLBI_VAE2IS_Xt;
1633  case 4:
1634  return MISCREG_TLBI_ALLE1IS;
1635  case 5:
1636  return MISCREG_TLBI_VALE2IS_Xt;
1637  case 6:
1639  }
1640  break;
1641  case 4:
1642  switch (op2) {
1643  case 1:
1644  return MISCREG_TLBI_IPAS2E1_Xt;
1645  case 5:
1646  return MISCREG_TLBI_IPAS2LE1_Xt;
1647  }
1648  break;
1649  case 7:
1650  switch (op2) {
1651  case 0:
1652  return MISCREG_TLBI_ALLE2;
1653  case 1:
1654  return MISCREG_TLBI_VAE2_Xt;
1655  case 4:
1656  return MISCREG_TLBI_ALLE1;
1657  case 5:
1658  return MISCREG_TLBI_VALE2_Xt;
1659  case 6:
1660  return MISCREG_TLBI_VMALLS12E1;
1661  }
1662  break;
1663  }
1664  break;
1665  case 6:
1666  switch (crm) {
1667  case 3:
1668  switch (op2) {
1669  case 0:
1670  return MISCREG_TLBI_ALLE3IS;
1671  case 1:
1672  return MISCREG_TLBI_VAE3IS_Xt;
1673  case 5:
1674  return MISCREG_TLBI_VALE3IS_Xt;
1675  }
1676  break;
1677  case 7:
1678  switch (op2) {
1679  case 0:
1680  return MISCREG_TLBI_ALLE3;
1681  case 1:
1682  return MISCREG_TLBI_VAE3_Xt;
1683  case 5:
1684  return MISCREG_TLBI_VALE3_Xt;
1685  }
1686  break;
1687  }
1688  break;
1689  }
1690  break;
1691  case 11:
1692  case 15:
1693  // SYS Instruction with CRn = { 11, 15 }
1694  // (Trappable by HCR_EL2.TIDCP)
1695  return MISCREG_IMPDEF_UNIMPL;
1696  }
1697  break;
1698  case 2:
1699  switch (crn) {
1700  case 0:
1701  switch (op1) {
1702  case 0:
1703  switch (crm) {
1704  case 0:
1705  switch (op2) {
1706  case 2:
1707  return MISCREG_OSDTRRX_EL1;
1708  case 4:
1709  return MISCREG_DBGBVR0_EL1;
1710  case 5:
1711  return MISCREG_DBGBCR0_EL1;
1712  case 6:
1713  return MISCREG_DBGWVR0_EL1;
1714  case 7:
1715  return MISCREG_DBGWCR0_EL1;
1716  }
1717  break;
1718  case 1:
1719  switch (op2) {
1720  case 4:
1721  return MISCREG_DBGBVR1_EL1;
1722  case 5:
1723  return MISCREG_DBGBCR1_EL1;
1724  case 6:
1725  return MISCREG_DBGWVR1_EL1;
1726  case 7:
1727  return MISCREG_DBGWCR1_EL1;
1728  }
1729  break;
1730  case 2:
1731  switch (op2) {
1732  case 0:
1733  return MISCREG_MDCCINT_EL1;
1734  case 2:
1735  return MISCREG_MDSCR_EL1;
1736  case 4:
1737  return MISCREG_DBGBVR2_EL1;
1738  case 5:
1739  return MISCREG_DBGBCR2_EL1;
1740  case 6:
1741  return MISCREG_DBGWVR2_EL1;
1742  case 7:
1743  return MISCREG_DBGWCR2_EL1;
1744  }
1745  break;
1746  case 3:
1747  switch (op2) {
1748  case 2:
1749  return MISCREG_OSDTRTX_EL1;
1750  case 4:
1751  return MISCREG_DBGBVR3_EL1;
1752  case 5:
1753  return MISCREG_DBGBCR3_EL1;
1754  case 6:
1755  return MISCREG_DBGWVR3_EL1;
1756  case 7:
1757  return MISCREG_DBGWCR3_EL1;
1758  }
1759  break;
1760  case 4:
1761  switch (op2) {
1762  case 4:
1763  return MISCREG_DBGBVR4_EL1;
1764  case 5:
1765  return MISCREG_DBGBCR4_EL1;
1766  case 6:
1767  return MISCREG_DBGWVR4_EL1;
1768  case 7:
1769  return MISCREG_DBGWCR4_EL1;
1770  }
1771  break;
1772  case 5:
1773  switch (op2) {
1774  case 4:
1775  return MISCREG_DBGBVR5_EL1;
1776  case 5:
1777  return MISCREG_DBGBCR5_EL1;
1778  case 6:
1779  return MISCREG_DBGWVR5_EL1;
1780  case 7:
1781  return MISCREG_DBGWCR5_EL1;
1782  }
1783  break;
1784  case 6:
1785  switch (op2) {
1786  case 2:
1787  return MISCREG_OSECCR_EL1;
1788  case 4:
1789  return MISCREG_DBGBVR6_EL1;
1790  case 5:
1791  return MISCREG_DBGBCR6_EL1;
1792  case 6:
1793  return MISCREG_DBGWVR6_EL1;
1794  case 7:
1795  return MISCREG_DBGWCR6_EL1;
1796  }
1797  break;
1798  case 7:
1799  switch (op2) {
1800  case 4:
1801  return MISCREG_DBGBVR7_EL1;
1802  case 5:
1803  return MISCREG_DBGBCR7_EL1;
1804  case 6:
1805  return MISCREG_DBGWVR7_EL1;
1806  case 7:
1807  return MISCREG_DBGWCR7_EL1;
1808  }
1809  break;
1810  case 8:
1811  switch (op2) {
1812  case 4:
1813  return MISCREG_DBGBVR8_EL1;
1814  case 5:
1815  return MISCREG_DBGBCR8_EL1;
1816  case 6:
1817  return MISCREG_DBGWVR8_EL1;
1818  case 7:
1819  return MISCREG_DBGWCR8_EL1;
1820  }
1821  break;
1822  case 9:
1823  switch (op2) {
1824  case 4:
1825  return MISCREG_DBGBVR9_EL1;
1826  case 5:
1827  return MISCREG_DBGBCR9_EL1;
1828  case 6:
1829  return MISCREG_DBGWVR9_EL1;
1830  case 7:
1831  return MISCREG_DBGWCR9_EL1;
1832  }
1833  break;
1834  case 10:
1835  switch (op2) {
1836  case 4:
1837  return MISCREG_DBGBVR10_EL1;
1838  case 5:
1839  return MISCREG_DBGBCR10_EL1;
1840  case 6:
1841  return MISCREG_DBGWVR10_EL1;
1842  case 7:
1843  return MISCREG_DBGWCR10_EL1;
1844  }
1845  break;
1846  case 11:
1847  switch (op2) {
1848  case 4:
1849  return MISCREG_DBGBVR11_EL1;
1850  case 5:
1851  return MISCREG_DBGBCR11_EL1;
1852  case 6:
1853  return MISCREG_DBGWVR11_EL1;
1854  case 7:
1855  return MISCREG_DBGWCR11_EL1;
1856  }
1857  break;
1858  case 12:
1859  switch (op2) {
1860  case 4:
1861  return MISCREG_DBGBVR12_EL1;
1862  case 5:
1863  return MISCREG_DBGBCR12_EL1;
1864  case 6:
1865  return MISCREG_DBGWVR12_EL1;
1866  case 7:
1867  return MISCREG_DBGWCR12_EL1;
1868  }
1869  break;
1870  case 13:
1871  switch (op2) {
1872  case 4:
1873  return MISCREG_DBGBVR13_EL1;
1874  case 5:
1875  return MISCREG_DBGBCR13_EL1;
1876  case 6:
1877  return MISCREG_DBGWVR13_EL1;
1878  case 7:
1879  return MISCREG_DBGWCR13_EL1;
1880  }
1881  break;
1882  case 14:
1883  switch (op2) {
1884  case 4:
1885  return MISCREG_DBGBVR14_EL1;
1886  case 5:
1887  return MISCREG_DBGBCR14_EL1;
1888  case 6:
1889  return MISCREG_DBGWVR14_EL1;
1890  case 7:
1891  return MISCREG_DBGWCR14_EL1;
1892  }
1893  break;
1894  case 15:
1895  switch (op2) {
1896  case 4:
1897  return MISCREG_DBGBVR15_EL1;
1898  case 5:
1899  return MISCREG_DBGBCR15_EL1;
1900  case 6:
1901  return MISCREG_DBGWVR15_EL1;
1902  case 7:
1903  return MISCREG_DBGWCR15_EL1;
1904  }
1905  break;
1906  }
1907  break;
1908  case 2:
1909  switch (crm) {
1910  case 0:
1911  switch (op2) {
1912  case 0:
1913  return MISCREG_TEECR32_EL1;
1914  }
1915  break;
1916  }
1917  break;
1918  case 3:
1919  switch (crm) {
1920  case 1:
1921  switch (op2) {
1922  case 0:
1923  return MISCREG_MDCCSR_EL0;
1924  }
1925  break;
1926  case 4:
1927  switch (op2) {
1928  case 0:
1929  return MISCREG_MDDTR_EL0;
1930  }
1931  break;
1932  case 5:
1933  switch (op2) {
1934  case 0:
1935  return MISCREG_MDDTRRX_EL0;
1936  }
1937  break;
1938  }
1939  break;
1940  case 4:
1941  switch (crm) {
1942  case 7:
1943  switch (op2) {
1944  case 0:
1945  return MISCREG_DBGVCR32_EL2;
1946  }
1947  break;
1948  }
1949  break;
1950  }
1951  break;
1952  case 1:
1953  switch (op1) {
1954  case 0:
1955  switch (crm) {
1956  case 0:
1957  switch (op2) {
1958  case 0:
1959  return MISCREG_MDRAR_EL1;
1960  case 4:
1961  return MISCREG_OSLAR_EL1;
1962  }
1963  break;
1964  case 1:
1965  switch (op2) {
1966  case 4:
1967  return MISCREG_OSLSR_EL1;
1968  }
1969  break;
1970  case 3:
1971  switch (op2) {
1972  case 4:
1973  return MISCREG_OSDLR_EL1;
1974  }
1975  break;
1976  case 4:
1977  switch (op2) {
1978  case 4:
1979  return MISCREG_DBGPRCR_EL1;
1980  }
1981  break;
1982  }
1983  break;
1984  case 2:
1985  switch (crm) {
1986  case 0:
1987  switch (op2) {
1988  case 0:
1989  return MISCREG_TEEHBR32_EL1;
1990  }
1991  break;
1992  }
1993  break;
1994  }
1995  break;
1996  case 7:
1997  switch (op1) {
1998  case 0:
1999  switch (crm) {
2000  case 8:
2001  switch (op2) {
2002  case 6:
2003  return MISCREG_DBGCLAIMSET_EL1;
2004  }
2005  break;
2006  case 9:
2007  switch (op2) {
2008  case 6:
2009  return MISCREG_DBGCLAIMCLR_EL1;
2010  }
2011  break;
2012  case 14:
2013  switch (op2) {
2014  case 6:
2016  }
2017  break;
2018  }
2019  break;
2020  }
2021  break;
2022  }
2023  break;
2024  case 3:
2025  switch (crn) {
2026  case 0:
2027  switch (op1) {
2028  case 0:
2029  switch (crm) {
2030  case 0:
2031  switch (op2) {
2032  case 0:
2033  return MISCREG_MIDR_EL1;
2034  case 5:
2035  return MISCREG_MPIDR_EL1;
2036  case 6:
2037  return MISCREG_REVIDR_EL1;
2038  }
2039  break;
2040  case 1:
2041  switch (op2) {
2042  case 0:
2043  return MISCREG_ID_PFR0_EL1;
2044  case 1:
2045  return MISCREG_ID_PFR1_EL1;
2046  case 2:
2047  return MISCREG_ID_DFR0_EL1;
2048  case 3:
2049  return MISCREG_ID_AFR0_EL1;
2050  case 4:
2051  return MISCREG_ID_MMFR0_EL1;
2052  case 5:
2053  return MISCREG_ID_MMFR1_EL1;
2054  case 6:
2055  return MISCREG_ID_MMFR2_EL1;
2056  case 7:
2057  return MISCREG_ID_MMFR3_EL1;
2058  }
2059  break;
2060  case 2:
2061  switch (op2) {
2062  case 0:
2063  return MISCREG_ID_ISAR0_EL1;
2064  case 1:
2065  return MISCREG_ID_ISAR1_EL1;
2066  case 2:
2067  return MISCREG_ID_ISAR2_EL1;
2068  case 3:
2069  return MISCREG_ID_ISAR3_EL1;
2070  case 4:
2071  return MISCREG_ID_ISAR4_EL1;
2072  case 5:
2073  return MISCREG_ID_ISAR5_EL1;
2074  case 6:
2075  return MISCREG_ID_MMFR4_EL1;
2076  case 7:
2077  return MISCREG_ID_ISAR6_EL1;
2078  }
2079  break;
2080  case 3:
2081  switch (op2) {
2082  case 0:
2083  return MISCREG_MVFR0_EL1;
2084  case 1:
2085  return MISCREG_MVFR1_EL1;
2086  case 2:
2087  return MISCREG_MVFR2_EL1;
2088  case 3 ... 7:
2089  return MISCREG_RAZ;
2090  }
2091  break;
2092  case 4:
2093  switch (op2) {
2094  case 0:
2095  return MISCREG_ID_AA64PFR0_EL1;
2096  case 1:
2097  return MISCREG_ID_AA64PFR1_EL1;
2098  case 2 ... 3:
2099  return MISCREG_RAZ;
2100  case 4:
2101  return MISCREG_ID_AA64ZFR0_EL1;
2102  case 5 ... 7:
2103  return MISCREG_RAZ;
2104  }
2105  break;
2106  case 5:
2107  switch (op2) {
2108  case 0:
2109  return MISCREG_ID_AA64DFR0_EL1;
2110  case 1:
2111  return MISCREG_ID_AA64DFR1_EL1;
2112  case 4:
2113  return MISCREG_ID_AA64AFR0_EL1;
2114  case 5:
2115  return MISCREG_ID_AA64AFR1_EL1;
2116  case 2:
2117  case 3:
2118  case 6:
2119  case 7:
2120  return MISCREG_RAZ;
2121  }
2122  break;
2123  case 6:
2124  switch (op2) {
2125  case 0:
2126  return MISCREG_ID_AA64ISAR0_EL1;
2127  case 1:
2128  return MISCREG_ID_AA64ISAR1_EL1;
2129  case 2 ... 7:
2130  return MISCREG_RAZ;
2131  }
2132  break;
2133  case 7:
2134  switch (op2) {
2135  case 0:
2136  return MISCREG_ID_AA64MMFR0_EL1;
2137  case 1:
2138  return MISCREG_ID_AA64MMFR1_EL1;
2139  case 2:
2140  return MISCREG_ID_AA64MMFR2_EL1;
2141  case 3 ... 7:
2142  return MISCREG_RAZ;
2143  }
2144  break;
2145  }
2146  break;
2147  case 1:
2148  switch (crm) {
2149  case 0:
2150  switch (op2) {
2151  case 0:
2152  return MISCREG_CCSIDR_EL1;
2153  case 1:
2154  return MISCREG_CLIDR_EL1;
2155  case 7:
2156  return MISCREG_AIDR_EL1;
2157  }
2158  break;
2159  }
2160  break;
2161  case 2:
2162  switch (crm) {
2163  case 0:
2164  switch (op2) {
2165  case 0:
2166  return MISCREG_CSSELR_EL1;
2167  }
2168  break;
2169  }
2170  break;
2171  case 3:
2172  switch (crm) {
2173  case 0:
2174  switch (op2) {
2175  case 1:
2176  return MISCREG_CTR_EL0;
2177  case 7:
2178  return MISCREG_DCZID_EL0;
2179  }
2180  break;
2181  }
2182  break;
2183  case 4:
2184  switch (crm) {
2185  case 0:
2186  switch (op2) {
2187  case 0:
2188  return MISCREG_VPIDR_EL2;
2189  case 5:
2190  return MISCREG_VMPIDR_EL2;
2191  }
2192  break;
2193  }
2194  break;
2195  }
2196  break;
2197  case 1:
2198  switch (op1) {
2199  case 0:
2200  switch (crm) {
2201  case 0:
2202  switch (op2) {
2203  case 0:
2204  return MISCREG_SCTLR_EL1;
2205  case 1:
2206  return MISCREG_ACTLR_EL1;
2207  case 2:
2208  return MISCREG_CPACR_EL1;
2209  }
2210  break;
2211  case 2:
2212  switch (op2) {
2213  case 0:
2214  return MISCREG_ZCR_EL1;
2215  }
2216  break;
2217  }
2218  break;
2219  case 4:
2220  switch (crm) {
2221  case 0:
2222  switch (op2) {
2223  case 0:
2224  return MISCREG_SCTLR_EL2;
2225  case 1:
2226  return MISCREG_ACTLR_EL2;
2227  }
2228  break;
2229  case 1:
2230  switch (op2) {
2231  case 0:
2232  return MISCREG_HCR_EL2;
2233  case 1:
2234  return MISCREG_MDCR_EL2;
2235  case 2:
2236  return MISCREG_CPTR_EL2;
2237  case 3:
2238  return MISCREG_HSTR_EL2;
2239  case 7:
2240  return MISCREG_HACR_EL2;
2241  }
2242  break;
2243  case 2:
2244  switch (op2) {
2245  case 0:
2246  return MISCREG_ZCR_EL2;
2247  }
2248  break;
2249  }
2250  break;
2251  case 5:
2252  /* op0: 3 Crn:1 op1:5 */
2253  switch (crm) {
2254  case 0:
2255  switch (op2) {
2256  case 0:
2257  return MISCREG_SCTLR_EL12;
2258  case 2:
2259  return MISCREG_CPACR_EL12;
2260  }
2261  break;
2262  case 2:
2263  switch (op2) {
2264  case 0:
2265  return MISCREG_ZCR_EL12;
2266  }
2267  break;
2268  }
2269  break;
2270  case 6:
2271  switch (crm) {
2272  case 0:
2273  switch (op2) {
2274  case 0:
2275  return MISCREG_SCTLR_EL3;
2276  case 1:
2277  return MISCREG_ACTLR_EL3;
2278  }
2279  break;
2280  case 1:
2281  switch (op2) {
2282  case 0:
2283  return MISCREG_SCR_EL3;
2284  case 1:
2285  return MISCREG_SDER32_EL3;
2286  case 2:
2287  return MISCREG_CPTR_EL3;
2288  }
2289  break;
2290  case 2:
2291  switch (op2) {
2292  case 0:
2293  return MISCREG_ZCR_EL3;
2294  }
2295  break;
2296  case 3:
2297  switch (op2) {
2298  case 1:
2299  return MISCREG_MDCR_EL3;
2300  }
2301  break;
2302  }
2303  break;
2304  }
2305  break;
2306  case 2:
2307  switch (op1) {
2308  case 0:
2309  switch (crm) {
2310  case 0:
2311  switch (op2) {
2312  case 0:
2313  return MISCREG_TTBR0_EL1;
2314  case 1:
2315  return MISCREG_TTBR1_EL1;
2316  case 2:
2317  return MISCREG_TCR_EL1;
2318  }
2319  break;
2320  case 0x1:
2321  switch (op2) {
2322  case 0x0:
2323  return MISCREG_APIAKeyLo_EL1;
2324  case 0x1:
2325  return MISCREG_APIAKeyHi_EL1;
2326  case 0x2:
2327  return MISCREG_APIBKeyLo_EL1;
2328  case 0x3:
2329  return MISCREG_APIBKeyHi_EL1;
2330  }
2331  break;
2332  case 0x2:
2333  switch (op2) {
2334  case 0x0:
2335  return MISCREG_APDAKeyLo_EL1;
2336  case 0x1:
2337  return MISCREG_APDAKeyHi_EL1;
2338  case 0x2:
2339  return MISCREG_APDBKeyLo_EL1;
2340  case 0x3:
2341  return MISCREG_APDBKeyHi_EL1;
2342  }
2343  break;
2344 
2345  case 0x3:
2346  switch (op2) {
2347  case 0x0:
2348  return MISCREG_APGAKeyLo_EL1;
2349  case 0x1:
2350  return MISCREG_APGAKeyHi_EL1;
2351  }
2352  break;
2353  }
2354  break;
2355  case 4:
2356  switch (crm) {
2357  case 0:
2358  switch (op2) {
2359  case 0:
2360  return MISCREG_TTBR0_EL2;
2361  case 1:
2362  return MISCREG_TTBR1_EL2;
2363  case 2:
2364  return MISCREG_TCR_EL2;
2365  }
2366  break;
2367  case 1:
2368  switch (op2) {
2369  case 0:
2370  return MISCREG_VTTBR_EL2;
2371  case 2:
2372  return MISCREG_VTCR_EL2;
2373  }
2374  break;
2375  case 6:
2376  switch (op2) {
2377  case 0:
2378  return MISCREG_VSTTBR_EL2;
2379  case 2:
2380  return MISCREG_VSTCR_EL2;
2381  }
2382  break;
2383  }
2384  break;
2385  case 5:
2386  /* op0: 3 Crn:2 op1:5 */
2387  switch (crm) {
2388  case 0:
2389  switch (op2) {
2390  case 0:
2391  return MISCREG_TTBR0_EL12;
2392  case 1:
2393  return MISCREG_TTBR1_EL12;
2394  case 2:
2395  return MISCREG_TCR_EL12;
2396  }
2397  break;
2398  }
2399  break;
2400  case 6:
2401  switch (crm) {
2402  case 0:
2403  switch (op2) {
2404  case 0:
2405  return MISCREG_TTBR0_EL3;
2406  case 2:
2407  return MISCREG_TCR_EL3;
2408  }
2409  break;
2410  }
2411  break;
2412  }
2413  break;
2414  case 3:
2415  switch (op1) {
2416  case 4:
2417  switch (crm) {
2418  case 0:
2419  switch (op2) {
2420  case 0:
2421  return MISCREG_DACR32_EL2;
2422  }
2423  break;
2424  }
2425  break;
2426  }
2427  break;
2428  case 4:
2429  switch (op1) {
2430  case 0:
2431  switch (crm) {
2432  case 0:
2433  switch (op2) {
2434  case 0:
2435  return MISCREG_SPSR_EL1;
2436  case 1:
2437  return MISCREG_ELR_EL1;
2438  }
2439  break;
2440  case 1:
2441  switch (op2) {
2442  case 0:
2443  return MISCREG_SP_EL0;
2444  }
2445  break;
2446  case 2:
2447  switch (op2) {
2448  case 0:
2449  return MISCREG_SPSEL;
2450  case 2:
2451  return MISCREG_CURRENTEL;
2452  case 3:
2453  return MISCREG_PAN;
2454  }
2455  break;
2456  case 6:
2457  switch (op2) {
2458  case 0:
2459  return MISCREG_ICC_PMR_EL1;
2460  }
2461  break;
2462  }
2463  break;
2464  case 3:
2465  switch (crm) {
2466  case 2:
2467  switch (op2) {
2468  case 0:
2469  return MISCREG_NZCV;
2470  case 1:
2471  return MISCREG_DAIF;
2472  }
2473  break;
2474  case 4:
2475  switch (op2) {
2476  case 0:
2477  return MISCREG_FPCR;
2478  case 1:
2479  return MISCREG_FPSR;
2480  }
2481  break;
2482  case 5:
2483  switch (op2) {
2484  case 0:
2485  return MISCREG_DSPSR_EL0;
2486  case 1:
2487  return MISCREG_DLR_EL0;
2488  }
2489  break;
2490  }
2491  break;
2492  case 4:
2493  switch (crm) {
2494  case 0:
2495  switch (op2) {
2496  case 0:
2497  return MISCREG_SPSR_EL2;
2498  case 1:
2499  return MISCREG_ELR_EL2;
2500  }
2501  break;
2502  case 1:
2503  switch (op2) {
2504  case 0:
2505  return MISCREG_SP_EL1;
2506  }
2507  break;
2508  case 3:
2509  switch (op2) {
2510  case 0:
2511  return MISCREG_SPSR_IRQ_AA64;
2512  case 1:
2513  return MISCREG_SPSR_ABT_AA64;
2514  case 2:
2515  return MISCREG_SPSR_UND_AA64;
2516  case 3:
2517  return MISCREG_SPSR_FIQ_AA64;
2518  }
2519  break;
2520  }
2521  break;
2522  case 5:
2523  switch (crm) {
2524  case 0:
2525  switch (op2) {
2526  case 0:
2527  return MISCREG_SPSR_EL12;
2528  case 1:
2529  return MISCREG_ELR_EL12;
2530  }
2531  break;
2532  }
2533  break;
2534  case 6:
2535  switch (crm) {
2536  case 0:
2537  switch (op2) {
2538  case 0:
2539  return MISCREG_SPSR_EL3;
2540  case 1:
2541  return MISCREG_ELR_EL3;
2542  }
2543  break;
2544  case 1:
2545  switch (op2) {
2546  case 0:
2547  return MISCREG_SP_EL2;
2548  }
2549  break;
2550  }
2551  break;
2552  }
2553  break;
2554  case 5:
2555  switch (op1) {
2556  case 0:
2557  switch (crm) {
2558  case 1:
2559  switch (op2) {
2560  case 0:
2561  return MISCREG_AFSR0_EL1;
2562  case 1:
2563  return MISCREG_AFSR1_EL1;
2564  }
2565  break;
2566  case 2:
2567  switch (op2) {
2568  case 0:
2569  return MISCREG_ESR_EL1;
2570  }
2571  break;
2572  case 3:
2573  switch (op2) {
2574  case 0:
2575  return MISCREG_ERRIDR_EL1;
2576  case 1:
2577  return MISCREG_ERRSELR_EL1;
2578  }
2579  break;
2580  case 4:
2581  switch (op2) {
2582  case 0:
2583  return MISCREG_ERXFR_EL1;
2584  case 1:
2585  return MISCREG_ERXCTLR_EL1;
2586  case 2:
2587  return MISCREG_ERXSTATUS_EL1;
2588  case 3:
2589  return MISCREG_ERXADDR_EL1;
2590  }
2591  break;
2592  case 5:
2593  switch (op2) {
2594  case 0:
2595  return MISCREG_ERXMISC0_EL1;
2596  case 1:
2597  return MISCREG_ERXMISC1_EL1;
2598  }
2599  break;
2600  }
2601  break;
2602  case 4:
2603  switch (crm) {
2604  case 0:
2605  switch (op2) {
2606  case 1:
2607  return MISCREG_IFSR32_EL2;
2608  }
2609  break;
2610  case 1:
2611  switch (op2) {
2612  case 0:
2613  return MISCREG_AFSR0_EL2;
2614  case 1:
2615  return MISCREG_AFSR1_EL2;
2616  }
2617  break;
2618  case 2:
2619  switch (op2) {
2620  case 0:
2621  return MISCREG_ESR_EL2;
2622  case 3:
2623  return MISCREG_VSESR_EL2;
2624  }
2625  break;
2626  case 3:
2627  switch (op2) {
2628  case 0:
2629  return MISCREG_FPEXC32_EL2;
2630  }
2631  break;
2632  }
2633  break;
2634  case 5:
2635  switch (crm) {
2636  case 1:
2637  switch (op2) {
2638  case 0:
2639  return MISCREG_AFSR0_EL12;
2640  case 1:
2641  return MISCREG_AFSR1_EL12;
2642  }
2643  break;
2644  case 2:
2645  switch (op2) {
2646  case 0:
2647  return MISCREG_ESR_EL12;
2648  }
2649  break;
2650  }
2651  break;
2652  case 6:
2653  switch (crm) {
2654  case 1:
2655  switch (op2) {
2656  case 0:
2657  return MISCREG_AFSR0_EL3;
2658  case 1:
2659  return MISCREG_AFSR1_EL3;
2660  }
2661  break;
2662  case 2:
2663  switch (op2) {
2664  case 0:
2665  return MISCREG_ESR_EL3;
2666  }
2667  break;
2668  }
2669  break;
2670  }
2671  break;
2672  case 6:
2673  switch (op1) {
2674  case 0:
2675  switch (crm) {
2676  case 0:
2677  switch (op2) {
2678  case 0:
2679  return MISCREG_FAR_EL1;
2680  }
2681  break;
2682  }
2683  break;
2684  case 4:
2685  switch (crm) {
2686  case 0:
2687  switch (op2) {
2688  case 0:
2689  return MISCREG_FAR_EL2;
2690  case 4:
2691  return MISCREG_HPFAR_EL2;
2692  }
2693  break;
2694  }
2695  break;
2696  case 5:
2697  switch (crm) {
2698  case 0:
2699  switch (op2) {
2700  case 0:
2701  return MISCREG_FAR_EL12;
2702  }
2703  break;
2704  }
2705  break;
2706  case 6:
2707  switch (crm) {
2708  case 0:
2709  switch (op2) {
2710  case 0:
2711  return MISCREG_FAR_EL3;
2712  }
2713  break;
2714  }
2715  break;
2716  }
2717  break;
2718  case 7:
2719  switch (op1) {
2720  case 0:
2721  switch (crm) {
2722  case 4:
2723  switch (op2) {
2724  case 0:
2725  return MISCREG_PAR_EL1;
2726  }
2727  break;
2728  }
2729  break;
2730  }
2731  break;
2732  case 9:
2733  switch (op1) {
2734  case 0:
2735  switch (crm) {
2736  case 14:
2737  switch (op2) {
2738  case 1:
2739  return MISCREG_PMINTENSET_EL1;
2740  case 2:
2741  return MISCREG_PMINTENCLR_EL1;
2742  }
2743  break;
2744  }
2745  break;
2746  case 3:
2747  switch (crm) {
2748  case 12:
2749  switch (op2) {
2750  case 0:
2751  return MISCREG_PMCR_EL0;
2752  case 1:
2753  return MISCREG_PMCNTENSET_EL0;
2754  case 2:
2755  return MISCREG_PMCNTENCLR_EL0;
2756  case 3:
2757  return MISCREG_PMOVSCLR_EL0;
2758  case 4:
2759  return MISCREG_PMSWINC_EL0;
2760  case 5:
2761  return MISCREG_PMSELR_EL0;
2762  case 6:
2763  return MISCREG_PMCEID0_EL0;
2764  case 7:
2765  return MISCREG_PMCEID1_EL0;
2766  }
2767  break;
2768  case 13:
2769  switch (op2) {
2770  case 0:
2771  return MISCREG_PMCCNTR_EL0;
2772  case 1:
2773  return MISCREG_PMXEVTYPER_EL0;
2774  case 2:
2775  return MISCREG_PMXEVCNTR_EL0;
2776  }
2777  break;
2778  case 14:
2779  switch (op2) {
2780  case 0:
2781  return MISCREG_PMUSERENR_EL0;
2782  case 3:
2783  return MISCREG_PMOVSSET_EL0;
2784  }
2785  break;
2786  }
2787  break;
2788  }
2789  break;
2790  case 10:
2791  switch (op1) {
2792  case 0:
2793  switch (crm) {
2794  case 2:
2795  switch (op2) {
2796  case 0:
2797  return MISCREG_MAIR_EL1;
2798  }
2799  break;
2800  case 3:
2801  switch (op2) {
2802  case 0:
2803  return MISCREG_AMAIR_EL1;
2804  }
2805  break;
2806  }
2807  break;
2808  case 4:
2809  switch (crm) {
2810  case 2:
2811  switch (op2) {
2812  case 0:
2813  return MISCREG_MAIR_EL2;
2814  }
2815  break;
2816  case 3:
2817  switch (op2) {
2818  case 0:
2819  return MISCREG_AMAIR_EL2;
2820  }
2821  break;
2822  }
2823  break;
2824  case 5:
2825  switch (crm) {
2826  case 2:
2827  switch (op2) {
2828  case 0:
2829  return MISCREG_MAIR_EL12;
2830  }
2831  break;
2832  case 3:
2833  switch (op2) {
2834  case 0:
2835  return MISCREG_AMAIR_EL12;
2836  }
2837  break;
2838  }
2839  break;
2840  case 6:
2841  switch (crm) {
2842  case 2:
2843  switch (op2) {
2844  case 0:
2845  return MISCREG_MAIR_EL3;
2846  }
2847  break;
2848  case 3:
2849  switch (op2) {
2850  case 0:
2851  return MISCREG_AMAIR_EL3;
2852  }
2853  break;
2854  }
2855  break;
2856  }
2857  break;
2858  case 11:
2859  switch (op1) {
2860  case 1:
2861  switch (crm) {
2862  case 0:
2863  switch (op2) {
2864  case 2:
2865  return MISCREG_L2CTLR_EL1;
2866  case 3:
2867  return MISCREG_L2ECTLR_EL1;
2868  }
2869  break;
2870  }
2872  default:
2873  // S3_<op1>_11_<Cm>_<op2>
2874  return MISCREG_IMPDEF_UNIMPL;
2875  }
2876  GEM5_UNREACHABLE;
2877  case 12:
2878  switch (op1) {
2879  case 0:
2880  switch (crm) {
2881  case 0:
2882  switch (op2) {
2883  case 0:
2884  return MISCREG_VBAR_EL1;
2885  case 1:
2886  return MISCREG_RVBAR_EL1;
2887  }
2888  break;
2889  case 1:
2890  switch (op2) {
2891  case 0:
2892  return MISCREG_ISR_EL1;
2893  case 1:
2894  return MISCREG_DISR_EL1;
2895  }
2896  break;
2897  case 8:
2898  switch (op2) {
2899  case 0:
2900  return MISCREG_ICC_IAR0_EL1;
2901  case 1:
2902  return MISCREG_ICC_EOIR0_EL1;
2903  case 2:
2904  return MISCREG_ICC_HPPIR0_EL1;
2905  case 3:
2906  return MISCREG_ICC_BPR0_EL1;
2907  case 4:
2908  return MISCREG_ICC_AP0R0_EL1;
2909  case 5:
2910  return MISCREG_ICC_AP0R1_EL1;
2911  case 6:
2912  return MISCREG_ICC_AP0R2_EL1;
2913  case 7:
2914  return MISCREG_ICC_AP0R3_EL1;
2915  }
2916  break;
2917  case 9:
2918  switch (op2) {
2919  case 0:
2920  return MISCREG_ICC_AP1R0_EL1;
2921  case 1:
2922  return MISCREG_ICC_AP1R1_EL1;
2923  case 2:
2924  return MISCREG_ICC_AP1R2_EL1;
2925  case 3:
2926  return MISCREG_ICC_AP1R3_EL1;
2927  }
2928  break;
2929  case 11:
2930  switch (op2) {
2931  case 1:
2932  return MISCREG_ICC_DIR_EL1;
2933  case 3:
2934  return MISCREG_ICC_RPR_EL1;
2935  case 5:
2936  return MISCREG_ICC_SGI1R_EL1;
2937  case 6:
2938  return MISCREG_ICC_ASGI1R_EL1;
2939  case 7:
2940  return MISCREG_ICC_SGI0R_EL1;
2941  }
2942  break;
2943  case 12:
2944  switch (op2) {
2945  case 0:
2946  return MISCREG_ICC_IAR1_EL1;
2947  case 1:
2948  return MISCREG_ICC_EOIR1_EL1;
2949  case 2:
2950  return MISCREG_ICC_HPPIR1_EL1;
2951  case 3:
2952  return MISCREG_ICC_BPR1_EL1;
2953  case 4:
2954  return MISCREG_ICC_CTLR_EL1;
2955  case 5:
2956  return MISCREG_ICC_SRE_EL1;
2957  case 6:
2958  return MISCREG_ICC_IGRPEN0_EL1;
2959  case 7:
2960  return MISCREG_ICC_IGRPEN1_EL1;
2961  }
2962  break;
2963  }
2964  break;
2965  case 4:
2966  switch (crm) {
2967  case 0:
2968  switch (op2) {
2969  case 0:
2970  return MISCREG_VBAR_EL2;
2971  case 1:
2972  return MISCREG_RVBAR_EL2;
2973  }
2974  break;
2975  case 1:
2976  switch (op2) {
2977  case 1:
2978  return MISCREG_VDISR_EL2;
2979  }
2980  break;
2981  case 8:
2982  switch (op2) {
2983  case 0:
2984  return MISCREG_ICH_AP0R0_EL2;
2985  case 1:
2986  return MISCREG_ICH_AP0R1_EL2;
2987  case 2:
2988  return MISCREG_ICH_AP0R2_EL2;
2989  case 3:
2990  return MISCREG_ICH_AP0R3_EL2;
2991  }
2992  break;
2993  case 9:
2994  switch (op2) {
2995  case 0:
2996  return MISCREG_ICH_AP1R0_EL2;
2997  case 1:
2998  return MISCREG_ICH_AP1R1_EL2;
2999  case 2:
3000  return MISCREG_ICH_AP1R2_EL2;
3001  case 3:
3002  return MISCREG_ICH_AP1R3_EL2;
3003  case 5:
3004  return MISCREG_ICC_SRE_EL2;
3005  }
3006  break;
3007  case 11:
3008  switch (op2) {
3009  case 0:
3010  return MISCREG_ICH_HCR_EL2;
3011  case 1:
3012  return MISCREG_ICH_VTR_EL2;
3013  case 2:
3014  return MISCREG_ICH_MISR_EL2;
3015  case 3:
3016  return MISCREG_ICH_EISR_EL2;
3017  case 5:
3018  return MISCREG_ICH_ELRSR_EL2;
3019  case 7:
3020  return MISCREG_ICH_VMCR_EL2;
3021  }
3022  break;
3023  case 12:
3024  switch (op2) {
3025  case 0:
3026  return MISCREG_ICH_LR0_EL2;
3027  case 1:
3028  return MISCREG_ICH_LR1_EL2;
3029  case 2:
3030  return MISCREG_ICH_LR2_EL2;
3031  case 3:
3032  return MISCREG_ICH_LR3_EL2;
3033  case 4:
3034  return MISCREG_ICH_LR4_EL2;
3035  case 5:
3036  return MISCREG_ICH_LR5_EL2;
3037  case 6:
3038  return MISCREG_ICH_LR6_EL2;
3039  case 7:
3040  return MISCREG_ICH_LR7_EL2;
3041  }
3042  break;
3043  case 13:
3044  switch (op2) {
3045  case 0:
3046  return MISCREG_ICH_LR8_EL2;
3047  case 1:
3048  return MISCREG_ICH_LR9_EL2;
3049  case 2:
3050  return MISCREG_ICH_LR10_EL2;
3051  case 3:
3052  return MISCREG_ICH_LR11_EL2;
3053  case 4:
3054  return MISCREG_ICH_LR12_EL2;
3055  case 5:
3056  return MISCREG_ICH_LR13_EL2;
3057  case 6:
3058  return MISCREG_ICH_LR14_EL2;
3059  case 7:
3060  return MISCREG_ICH_LR15_EL2;
3061  }
3062  break;
3063  }
3064  break;
3065  case 5:
3066  switch (crm) {
3067  case 0:
3068  switch (op2) {
3069  case 0:
3070  return MISCREG_VBAR_EL12;
3071  }
3072  break;
3073  }
3074  break;
3075  case 6:
3076  switch (crm) {
3077  case 0:
3078  switch (op2) {
3079  case 0:
3080  return MISCREG_VBAR_EL3;
3081  case 1:
3082  return MISCREG_RVBAR_EL3;
3083  case 2:
3084  return MISCREG_RMR_EL3;
3085  }
3086  break;
3087  case 12:
3088  switch (op2) {
3089  case 4:
3090  return MISCREG_ICC_CTLR_EL3;
3091  case 5:
3092  return MISCREG_ICC_SRE_EL3;
3093  case 7:
3094  return MISCREG_ICC_IGRPEN1_EL3;
3095  }
3096  break;
3097  }
3098  break;
3099  }
3100  break;
3101  case 13:
3102  switch (op1) {
3103  case 0:
3104  switch (crm) {
3105  case 0:
3106  switch (op2) {
3107  case 1:
3108  return MISCREG_CONTEXTIDR_EL1;
3109  case 4:
3110  return MISCREG_TPIDR_EL1;
3111  }
3112  break;
3113  }
3114  break;
3115  case 3:
3116  switch (crm) {
3117  case 0:
3118  switch (op2) {
3119  case 2:
3120  return MISCREG_TPIDR_EL0;
3121  case 3:
3122  return MISCREG_TPIDRRO_EL0;
3123  }
3124  break;
3125  }
3126  break;
3127  case 4:
3128  switch (crm) {
3129  case 0:
3130  switch (op2) {
3131  case 1:
3132  return MISCREG_CONTEXTIDR_EL2;
3133  case 2:
3134  return MISCREG_TPIDR_EL2;
3135  }
3136  break;
3137  }
3138  break;
3139  case 5:
3140  switch (crm) {
3141  case 0:
3142  switch (op2) {
3143  case 1:
3144  return MISCREG_CONTEXTIDR_EL12;
3145  }
3146  break;
3147  }
3148  break;
3149  case 6:
3150  switch (crm) {
3151  case 0:
3152  switch (op2) {
3153  case 2:
3154  return MISCREG_TPIDR_EL3;
3155  }
3156  break;
3157  }
3158  break;
3159  }
3160  break;
3161  case 14:
3162  switch (op1) {
3163  case 0:
3164  switch (crm) {
3165  case 1:
3166  switch (op2) {
3167  case 0:
3168  return MISCREG_CNTKCTL_EL1;
3169  }
3170  break;
3171  }
3172  break;
3173  case 3:
3174  switch (crm) {
3175  case 0:
3176  switch (op2) {
3177  case 0:
3178  return MISCREG_CNTFRQ_EL0;
3179  case 1:
3180  return MISCREG_CNTPCT_EL0;
3181  case 2:
3182  return MISCREG_CNTVCT_EL0;
3183  }
3184  break;
3185  case 2:
3186  switch (op2) {
3187  case 0:
3188  return MISCREG_CNTP_TVAL_EL0;
3189  case 1:
3190  return MISCREG_CNTP_CTL_EL0;
3191  case 2:
3192  return MISCREG_CNTP_CVAL_EL0;
3193  }
3194  break;
3195  case 3:
3196  switch (op2) {
3197  case 0:
3198  return MISCREG_CNTV_TVAL_EL0;
3199  case 1:
3200  return MISCREG_CNTV_CTL_EL0;
3201  case 2:
3202  return MISCREG_CNTV_CVAL_EL0;
3203  }
3204  break;
3205  case 8:
3206  switch (op2) {
3207  case 0:
3208  return MISCREG_PMEVCNTR0_EL0;
3209  case 1:
3210  return MISCREG_PMEVCNTR1_EL0;
3211  case 2:
3212  return MISCREG_PMEVCNTR2_EL0;
3213  case 3:
3214  return MISCREG_PMEVCNTR3_EL0;
3215  case 4:
3216  return MISCREG_PMEVCNTR4_EL0;
3217  case 5:
3218  return MISCREG_PMEVCNTR5_EL0;
3219  }
3220  break;
3221  case 12:
3222  switch (op2) {
3223  case 0:
3224  return MISCREG_PMEVTYPER0_EL0;
3225  case 1:
3226  return MISCREG_PMEVTYPER1_EL0;
3227  case 2:
3228  return MISCREG_PMEVTYPER2_EL0;
3229  case 3:
3230  return MISCREG_PMEVTYPER3_EL0;
3231  case 4:
3232  return MISCREG_PMEVTYPER4_EL0;
3233  case 5:
3234  return MISCREG_PMEVTYPER5_EL0;
3235  }
3236  break;
3237  case 15:
3238  switch (op2) {
3239  case 7:
3240  return MISCREG_PMCCFILTR_EL0;
3241  }
3242  }
3243  break;
3244  case 4:
3245  switch (crm) {
3246  case 0:
3247  switch (op2) {
3248  case 3:
3249  return MISCREG_CNTVOFF_EL2;
3250  }
3251  break;
3252  case 1:
3253  switch (op2) {
3254  case 0:
3255  return MISCREG_CNTHCTL_EL2;
3256  }
3257  break;
3258  case 2:
3259  switch (op2) {
3260  case 0:
3261  return MISCREG_CNTHP_TVAL_EL2;
3262  case 1:
3263  return MISCREG_CNTHP_CTL_EL2;
3264  case 2:
3265  return MISCREG_CNTHP_CVAL_EL2;
3266  }
3267  break;
3268  case 3:
3269  switch (op2) {
3270  case 0:
3271  return MISCREG_CNTHV_TVAL_EL2;
3272  case 1:
3273  return MISCREG_CNTHV_CTL_EL2;
3274  case 2:
3275  return MISCREG_CNTHV_CVAL_EL2;
3276  }
3277  break;
3278  }
3279  break;
3280  case 5:
3281  switch (crm) {
3282  case 1:
3283  switch (op2) {
3284  case 0:
3285  return MISCREG_CNTKCTL_EL12;
3286  }
3287  break;
3288  case 2:
3289  switch (op2) {
3290  case 0:
3291  return MISCREG_CNTP_TVAL_EL02;
3292  case 1:
3293  return MISCREG_CNTP_CTL_EL02;
3294  case 2:
3295  return MISCREG_CNTP_CVAL_EL02;
3296  }
3297  break;
3298  case 3:
3299  switch (op2) {
3300  case 0:
3301  return MISCREG_CNTV_TVAL_EL02;
3302  case 1:
3303  return MISCREG_CNTV_CTL_EL02;
3304  case 2:
3305  return MISCREG_CNTV_CVAL_EL02;
3306  }
3307  break;
3308  }
3309  break;
3310  case 7:
3311  switch (crm) {
3312  case 2:
3313  switch (op2) {
3314  case 0:
3315  return MISCREG_CNTPS_TVAL_EL1;
3316  case 1:
3317  return MISCREG_CNTPS_CTL_EL1;
3318  case 2:
3319  return MISCREG_CNTPS_CVAL_EL1;
3320  }
3321  break;
3322  }
3323  break;
3324  }
3325  break;
3326  case 15:
3327  switch (op1) {
3328  case 0:
3329  switch (crm) {
3330  case 0:
3331  switch (op2) {
3332  case 0:
3333  return MISCREG_IL1DATA0_EL1;
3334  case 1:
3335  return MISCREG_IL1DATA1_EL1;
3336  case 2:
3337  return MISCREG_IL1DATA2_EL1;
3338  case 3:
3339  return MISCREG_IL1DATA3_EL1;
3340  }
3341  break;
3342  case 1:
3343  switch (op2) {
3344  case 0:
3345  return MISCREG_DL1DATA0_EL1;
3346  case 1:
3347  return MISCREG_DL1DATA1_EL1;
3348  case 2:
3349  return MISCREG_DL1DATA2_EL1;
3350  case 3:
3351  return MISCREG_DL1DATA3_EL1;
3352  case 4:
3353  return MISCREG_DL1DATA4_EL1;
3354  }
3355  break;
3356  }
3357  break;
3358  case 1:
3359  switch (crm) {
3360  case 0:
3361  switch (op2) {
3362  case 0:
3363  return MISCREG_L2ACTLR_EL1;
3364  }
3365  break;
3366  case 2:
3367  switch (op2) {
3368  case 0:
3369  return MISCREG_CPUACTLR_EL1;
3370  case 1:
3371  return MISCREG_CPUECTLR_EL1;
3372  case 2:
3373  return MISCREG_CPUMERRSR_EL1;
3374  case 3:
3375  return MISCREG_L2MERRSR_EL1;
3376  }
3377  break;
3378  case 3:
3379  switch (op2) {
3380  case 0:
3381  return MISCREG_CBAR_EL1;
3382 
3383  }
3384  break;
3385  }
3386  break;
3387  }
3388  // S3_<op1>_15_<Cm>_<op2>
3389  return MISCREG_IMPDEF_UNIMPL;
3390  }
3391  break;
3392  }
3393 
3394  return MISCREG_UNKNOWN;
3395 }
3396 
3397 std::bitset<NUM_MISCREG_INFOS> miscRegInfo[NUM_MISCREGS]; // initialized below
3398 
3399 void
3401 {
3402  // the MiscReg metadata tables are shared across all instances of the
3403  // ISA object, so there's no need to initialize them multiple times.
3404  static bool completed = false;
3405  if (completed)
3406  return;
3407 
3408  // This boolean variable specifies if the system is running in aarch32 at
3409  // EL3 (aarch32EL3 = true). It is false if EL3 is not implemented, or it
3410  // is running in aarch64 (aarch32EL3 = false)
3411  bool aarch32EL3 = haveSecurity && !highestELIs64;
3412 
3413  // Set Privileged Access Never on taking an exception to EL1 (Arm 8.1+),
3414  // unsupported
3415  bool SPAN = false;
3416 
3417  // Implicit error synchronization event enable (Arm 8.2+), unsupported
3418  bool IESB = false;
3419 
3420  // Load Multiple and Store Multiple Atomicity and Ordering (Arm 8.2+),
3421  // unsupported
3422  bool LSMAOE = false;
3423 
3424  // No Trap Load Multiple and Store Multiple (Arm 8.2+), unsupported
3425  bool nTLSMD = false;
3426 
3427  // Pointer authentication (Arm 8.3+), unsupported
3428  bool EnDA = true; // using APDAKey_EL1 key of instr addrs in ELs 0,1
3429  bool EnDB = true; // using APDBKey_EL1 key of instr addrs in ELs 0,1
3430  bool EnIA = true; // using APIAKey_EL1 key of instr addrs in ELs 0,1
3431  bool EnIB = true; // using APIBKey_EL1 key of instr addrs in ELs 0,1
3432 
3447  .allPrivileges();
3449  .allPrivileges();
3451  .allPrivileges();
3453  .allPrivileges();
3455  .allPrivileges();
3457  .allPrivileges();
3459  .allPrivileges();
3461  .allPrivileges();
3463  .allPrivileges();
3465  .allPrivileges();
3467  .allPrivileges();
3469  .allPrivileges();
3471  .allPrivileges();
3473  .allPrivileges();
3475  .allPrivileges();
3476 
3477  // Helper registers
3479  .allPrivileges();
3481  .allPrivileges();
3483  .allPrivileges();
3485  .allPrivileges();
3487  .allPrivileges();
3489  .allPrivileges();
3491  .mutex()
3492  .banked();
3494  .mutex()
3495  .privSecure(!aarch32EL3)
3496  .bankedChild();
3498  .mutex()
3499  .bankedChild();
3501  .mutex()
3502  .banked();
3504  .mutex()
3505  .privSecure(!aarch32EL3)
3506  .bankedChild();
3508  .mutex()
3509  .bankedChild();
3511  .mutex();
3513  .allPrivileges();
3515  .allPrivileges();
3516 
3517  // AArch32 CP14 registers
3519  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3521  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3523  .unimplemented()
3524  .allPrivileges();
3526  .unimplemented()
3527  .allPrivileges();
3529  .unimplemented()
3530  .allPrivileges();
3532  .unimplemented()
3533  .allPrivileges();
3535  .allPrivileges().exceptUserMode();
3537  .unimplemented()
3538  .allPrivileges();
3540  .allPrivileges();
3542  .unimplemented()
3543  .allPrivileges();
3545  .unimplemented()
3546  .allPrivileges();
3548  .allPrivileges().exceptUserMode();
3550  .allPrivileges().exceptUserMode();
3552  .allPrivileges().exceptUserMode();
3554  .allPrivileges().exceptUserMode();
3556  .allPrivileges().exceptUserMode();
3558  .allPrivileges().exceptUserMode();
3560  .allPrivileges().exceptUserMode();
3562  .allPrivileges().exceptUserMode();
3564  .allPrivileges().exceptUserMode();
3566  .allPrivileges().exceptUserMode();
3568  .allPrivileges().exceptUserMode();
3570  .allPrivileges().exceptUserMode();
3572  .allPrivileges().exceptUserMode();
3574  .allPrivileges().exceptUserMode();
3576  .allPrivileges().exceptUserMode();
3578  .allPrivileges().exceptUserMode();
3580  .allPrivileges().exceptUserMode();
3582  .allPrivileges().exceptUserMode();
3584  .allPrivileges().exceptUserMode();
3586  .allPrivileges().exceptUserMode();
3588  .allPrivileges().exceptUserMode();
3590  .allPrivileges().exceptUserMode();
3592  .allPrivileges().exceptUserMode();
3594  .allPrivileges().exceptUserMode();
3596  .allPrivileges().exceptUserMode();
3598  .allPrivileges().exceptUserMode();
3600  .allPrivileges().exceptUserMode();
3602  .allPrivileges().exceptUserMode();
3604  .allPrivileges().exceptUserMode();
3606  .allPrivileges().exceptUserMode();
3608  .allPrivileges().exceptUserMode();
3610  .allPrivileges().exceptUserMode();
3612  .allPrivileges().exceptUserMode();
3614  .allPrivileges().exceptUserMode();
3616  .allPrivileges().exceptUserMode();
3618  .allPrivileges().exceptUserMode();
3620  .allPrivileges().exceptUserMode();
3622  .allPrivileges().exceptUserMode();
3624  .allPrivileges().exceptUserMode();
3626  .allPrivileges().exceptUserMode();
3628  .allPrivileges().exceptUserMode();
3630  .allPrivileges().exceptUserMode();
3632  .allPrivileges().exceptUserMode();
3634  .allPrivileges().exceptUserMode();
3636  .allPrivileges().exceptUserMode();
3638  .allPrivileges().exceptUserMode();
3640  .allPrivileges().exceptUserMode();
3642  .allPrivileges().exceptUserMode();
3644  .allPrivileges().exceptUserMode();
3646  .allPrivileges().exceptUserMode();
3648  .allPrivileges().exceptUserMode();
3650  .allPrivileges().exceptUserMode();
3652  .allPrivileges().exceptUserMode();
3654  .allPrivileges().exceptUserMode();
3656  .allPrivileges().exceptUserMode();
3658  .allPrivileges().exceptUserMode();
3660  .allPrivileges().exceptUserMode();
3662  .allPrivileges().exceptUserMode();
3664  .allPrivileges().exceptUserMode();
3666  .allPrivileges().exceptUserMode();
3668  .allPrivileges().exceptUserMode();
3670  .allPrivileges().exceptUserMode();
3672  .allPrivileges().exceptUserMode();
3674  .allPrivileges().exceptUserMode();
3676  .unimplemented()
3677  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3679  .allPrivileges().exceptUserMode();
3681  .allPrivileges().exceptUserMode();
3683  .allPrivileges().exceptUserMode();
3685  .allPrivileges().exceptUserMode();
3687  .allPrivileges().exceptUserMode();
3689  .allPrivileges().exceptUserMode();
3691  .allPrivileges().exceptUserMode();
3693  .allPrivileges().exceptUserMode();
3695  .allPrivileges().exceptUserMode();
3697  .allPrivileges().exceptUserMode();
3699  .allPrivileges().exceptUserMode();
3701  .allPrivileges().exceptUserMode();
3703  .allPrivileges().exceptUserMode();
3705  .allPrivileges().exceptUserMode();
3707  .allPrivileges().exceptUserMode();
3709  .allPrivileges().exceptUserMode();
3711  .allPrivileges().exceptUserMode();
3713  .allPrivileges().monSecureRead(0).monNonSecureRead(0);
3715  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3717  .unimplemented()
3718  .warnNotFail()
3719  .allPrivileges();
3721  .unimplemented()
3722  .allPrivileges();
3724  .unimplemented()
3725  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3727  .unimplemented()
3728  .allPrivileges();
3730  .unimplemented()
3731  .allPrivileges();
3733  .unimplemented()
3734  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3736  .unimplemented()
3737  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3739  .unimplemented()
3740  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3742  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
3744  .unimplemented()
3745  .allPrivileges();
3747  .allPrivileges();
3749  .allPrivileges();
3751  .allPrivileges();
3753  .allPrivileges();
3754 
3755  // AArch32 CP15 registers
3757  .allPrivileges().exceptUserMode().writes(0);
3759  .allPrivileges().exceptUserMode().writes(0);
3761  .allPrivileges().exceptUserMode().writes(0);
3763  .allPrivileges().exceptUserMode().writes(0);
3765  .allPrivileges().exceptUserMode().writes(0);
3767  .unimplemented()
3768  .warnNotFail()
3769  .allPrivileges().exceptUserMode().writes(0);
3771  .allPrivileges().exceptUserMode().writes(0);
3773  .allPrivileges().exceptUserMode().writes(0);
3775  .allPrivileges().exceptUserMode().writes(0);
3777  .allPrivileges().exceptUserMode().writes(0);
3779  .allPrivileges().exceptUserMode().writes(0);
3781  .allPrivileges().exceptUserMode().writes(0);
3783  .allPrivileges().exceptUserMode().writes(0);
3785  .allPrivileges().exceptUserMode().writes(0);
3787  .allPrivileges().exceptUserMode().writes(0);
3789  .allPrivileges().exceptUserMode().writes(0);
3791  .allPrivileges().exceptUserMode().writes(0);
3793  .allPrivileges().exceptUserMode().writes(0);
3795  .allPrivileges().exceptUserMode().writes(0);
3797  .allPrivileges().exceptUserMode().writes(0);
3799  .allPrivileges().exceptUserMode().writes(0);
3801  .allPrivileges().exceptUserMode().writes(0);
3803  .allPrivileges().exceptUserMode().writes(0);
3805  .allPrivileges().exceptUserMode().writes(0);
3807  .allPrivileges().exceptUserMode().writes(0);
3809  .banked();
3811  .bankedChild()
3812  .privSecure(!aarch32EL3)
3813  .nonSecure().exceptUserMode();
3815  .bankedChild()
3816  .secure().exceptUserMode();
3818  .hyp().monNonSecure();
3820  .hyp().monNonSecure();
3822  .banked()
3823  // readMiscRegNoEffect() uses this metadata
3824  // despite using children (below) as backing store
3825  .res0(0x8d22c600)
3826  .res1(0x00400800 | (SPAN ? 0 : 0x800000)
3827  | (LSMAOE ? 0 : 0x10)
3828  | (nTLSMD ? 0 : 0x8));
3830  .bankedChild()
3831  .privSecure(!aarch32EL3)
3832  .nonSecure().exceptUserMode();
3834  .bankedChild()
3835  .secure().exceptUserMode();
3837  .banked();
3839  .bankedChild()
3840  .privSecure(!aarch32EL3)
3841  .nonSecure().exceptUserMode();
3843  .bankedChild()
3844  .secure().exceptUserMode();
3846  .allPrivileges().exceptUserMode();
3848  .mon();
3850  .mon().secure().exceptUserMode()
3851  .res0(0xff40) // [31:16], [6]
3852  .res1(0x0030); // [5:4]
3854  .mon();
3856  .allPrivileges().hypWrite(0).privNonSecureWrite(0).exceptUserMode();
3858  .hyp().monNonSecure()
3859  .res0(0x0512c7c0 | (EnDB ? 0 : 0x2000)
3860  | (IESB ? 0 : 0x200000)
3861  | (EnDA ? 0 : 0x8000000)
3862  | (EnIB ? 0 : 0x40000000)
3863  | (EnIA ? 0 : 0x80000000))
3864  .res1(0x30c50830);
3866  .hyp().monNonSecure();
3868  .hyp().monNonSecure()
3869  .res0(0x90000000);
3871  .hyp().monNonSecure()
3872  .res0(0xffa9ff8c);
3874  .hyp().monNonSecure();
3876  .hyp().monNonSecure();
3878  .hyp().monNonSecure();
3880  .unimplemented()
3881  .warnNotFail()
3882  .hyp().monNonSecure();
3884  .banked();
3886  .bankedChild()
3887  .privSecure(!aarch32EL3)
3888  .nonSecure().exceptUserMode();
3890  .bankedChild()
3891  .secure().exceptUserMode();
3893  .banked();
3895  .bankedChild()
3896  .privSecure(!aarch32EL3)
3897  .nonSecure().exceptUserMode();
3899  .bankedChild()
3900  .secure().exceptUserMode();
3902  .banked();
3904  .bankedChild()
3905  .privSecure(!aarch32EL3)
3906  .nonSecure().exceptUserMode();
3908  .bankedChild()
3909  .secure().exceptUserMode();
3911  .hyp().monNonSecure();
3913  .hyp().monNonSecure();
3915  .banked();
3917  .bankedChild()
3918  .privSecure(!aarch32EL3)
3919  .nonSecure().exceptUserMode();
3921  .bankedChild()
3922  .secure().exceptUserMode();
3924  .banked();
3926  .bankedChild()
3927  .privSecure(!aarch32EL3)
3928  .nonSecure().exceptUserMode();
3930  .bankedChild()
3931  .secure().exceptUserMode();
3933  .banked();
3935  .bankedChild()
3936  .privSecure(!aarch32EL3)
3937  .nonSecure().exceptUserMode();
3939  .bankedChild()
3940  .secure().exceptUserMode();
3942  .unimplemented()
3943  .warnNotFail()
3944  .banked();
3946  .unimplemented()
3947  .warnNotFail()
3948  .bankedChild()
3949  .privSecure(!aarch32EL3)
3950  .nonSecure().exceptUserMode();
3952  .unimplemented()
3953  .warnNotFail()
3954  .bankedChild()
3955  .secure().exceptUserMode();
3957  .unimplemented()
3958  .warnNotFail()
3959  .banked();
3961  .unimplemented()
3962  .warnNotFail()
3963  .bankedChild()
3964  .privSecure(!aarch32EL3)
3965  .nonSecure().exceptUserMode();
3967  .unimplemented()
3968  .warnNotFail()
3969  .bankedChild()
3970  .secure().exceptUserMode();
3972  .hyp().monNonSecure();
3974  .hyp().monNonSecure();
3976  .hyp().monNonSecure();
3978  .banked();
3980  .bankedChild()
3981  .privSecure(!aarch32EL3)
3982  .nonSecure().exceptUserMode();
3984  .bankedChild()
3985  .secure().exceptUserMode();
3987  .banked();
3989  .bankedChild()
3990  .privSecure(!aarch32EL3)
3991  .nonSecure().exceptUserMode();
3993  .bankedChild()
3994  .secure().exceptUserMode();
3996  .hyp().monNonSecure();
3998  .hyp().monNonSecure();
4000  .hyp().monNonSecure();
4002  .unimplemented()
4003  .warnNotFail()
4004  .writes(1).exceptUserMode();
4006  .unimplemented()
4007  .warnNotFail()
4008  .writes(1).exceptUserMode();
4010  .banked();
4012  .bankedChild()
4013  .privSecure(!aarch32EL3)
4014  .nonSecure().exceptUserMode();
4016  .bankedChild()
4017  .secure().exceptUserMode();
4019  .writes(1).exceptUserMode();
4021  .unimplemented()
4022  .warnNotFail()
4023  .writes(1).exceptUserMode();
4025  .writes(1);
4027  .unimplemented()
4028  .warnNotFail()
4029  .writes(1).exceptUserMode();
4031  .unimplemented()
4032  .warnNotFail()
4033  .writes(1).exceptUserMode();
4035  .unimplemented()
4036  .warnNotFail()
4037  .writes(1).exceptUserMode();
4039  .unimplemented()
4040  .warnNotFail()
4041  .writes(1).exceptUserMode();
4043  .writes(1).exceptUserMode();
4045  .writes(1).exceptUserMode();
4047  .writes(1).exceptUserMode();
4049  .writes(1).exceptUserMode();
4051  .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite();
4053  .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite();
4055  .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite();
4057  .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite();
4059  .writes(1).exceptUserMode();
4061  .unimplemented()
4062  .warnNotFail()
4063  .writes(1).exceptUserMode();
4065  .writes(1);
4067  .writes(1);
4069  .unimplemented()
4070  .warnNotFail()
4071  .writes(1).exceptUserMode();
4073  .unimplemented()
4074  .warnNotFail()
4075  .writes(1).exceptUserMode();
4077  .unimplemented()
4078  .warnNotFail()
4079  .writes(1).exceptUserMode();
4081  .monNonSecureWrite().hypWrite();
4083  .monNonSecureWrite().hypWrite();
4085  .writes(1).exceptUserMode();
4087  .writes(1).exceptUserMode();
4089  .writes(1).exceptUserMode();
4091  .writes(1).exceptUserMode();
4093  .writes(1).exceptUserMode();
4095  .writes(1).exceptUserMode();
4097  .writes(1).exceptUserMode();
4099  .writes(1).exceptUserMode();
4101  .writes(1).exceptUserMode();
4103  .writes(1).exceptUserMode();
4105  .writes(1).exceptUserMode();
4107  .writes(1).exceptUserMode();
4109  .writes(1).exceptUserMode();
4111  .writes(1).exceptUserMode();
4113  .writes(1).exceptUserMode();
4115  .writes(1).exceptUserMode();
4117  .writes(1).exceptUserMode();
4119  .writes(1).exceptUserMode();
4121  .monNonSecureWrite().hypWrite();
4123  .monNonSecureWrite().hypWrite();
4125  .monNonSecureWrite().hypWrite();
4127  .monNonSecureWrite().hypWrite();
4129  .monNonSecureWrite().hypWrite();
4131  .monNonSecureWrite().hypWrite();
4133  .monNonSecureWrite().hypWrite();
4135  .monNonSecureWrite().hypWrite();
4137  .monNonSecureWrite().hypWrite();
4139  .monNonSecureWrite().hypWrite();
4141  .monNonSecureWrite().hypWrite();
4143  .monNonSecureWrite().hypWrite();
4145  .allPrivileges();
4147  .allPrivileges();
4149  .allPrivileges();
4151  .allPrivileges();
4153  .allPrivileges();
4155  .allPrivileges();
4157  .allPrivileges();
4159  .allPrivileges();
4161  .allPrivileges();
4163  .allPrivileges();
4165  .allPrivileges();
4167  .allPrivileges();
4169  .allPrivileges().userNonSecureWrite(0).userSecureWrite(0);
4171  .allPrivileges().exceptUserMode();
4173  .allPrivileges().exceptUserMode();
4175  .unimplemented()
4176  .allPrivileges();
4178  .allPrivileges().exceptUserMode();
4180  .unimplemented()
4181  .allPrivileges().exceptUserMode();
4183  .banked();
4185  .bankedChild()
4186  .privSecure(!aarch32EL3)
4187  .nonSecure().exceptUserMode();
4189  .bankedChild()
4190  .secure().exceptUserMode();
4192  .banked();
4194  .bankedChild()
4195  .privSecure(!aarch32EL3)
4196  .nonSecure().exceptUserMode();
4198  .bankedChild()
4199  .secure().exceptUserMode();
4201  .banked();
4203  .bankedChild()
4204  .privSecure(!aarch32EL3)
4205  .nonSecure().exceptUserMode();
4207  .bankedChild()
4208  .secure().exceptUserMode();
4210  .banked();
4212  .bankedChild()
4213  .privSecure(!aarch32EL3)
4214  .nonSecure().exceptUserMode();
4216  .bankedChild()
4217  .secure().exceptUserMode();
4219  .banked();
4221  .bankedChild()
4222  .privSecure(!aarch32EL3)
4223  .nonSecure().exceptUserMode();
4225  .bankedChild()
4226  .secure().exceptUserMode();
4228  .banked();
4230  .bankedChild()
4231  .privSecure(!aarch32EL3)
4232  .nonSecure().exceptUserMode();
4234  .bankedChild()
4235  .secure().exceptUserMode();
4237  .hyp().monNonSecure();
4239  .hyp().monNonSecure();
4241  .unimplemented()
4242  .warnNotFail()
4243  .hyp().monNonSecure();
4245  .unimplemented()
4246  .warnNotFail()
4247  .hyp().monNonSecure();
4249  .banked();
4251  .bankedChild()
4252  .privSecure(!aarch32EL3)
4253  .nonSecure().exceptUserMode();
4255  .bankedChild()
4256  .secure().exceptUserMode();
4258  .mon().secure()
4259  .hypRead(FullSystem && system->highestEL() == EL2)
4260  .privRead(FullSystem && system->highestEL() == EL1)
4261  .exceptUserMode();
4263  .unimplemented()
4264  .mon().secure().exceptUserMode();
4266  .allPrivileges().exceptUserMode().writes(0);
4268  .hyp().monNonSecure()
4269  .res0(0x1f);
4271  .unimplemented()
4272  .warnNotFail()
4273  .allPrivileges().exceptUserMode();
4275  .banked();
4277  .bankedChild()
4278  .privSecure(!aarch32EL3)
4279  .nonSecure().exceptUserMode();
4281  .bankedChild()
4282  .secure().exceptUserMode();
4284  .banked();
4286  .bankedChild()
4287  .allPrivileges()
4288  .privSecure(!aarch32EL3)
4289  .monSecure(0);
4291  .bankedChild()
4292  .secure();
4294  .banked();
4296  .bankedChild()
4297  .allPrivileges()
4298  .userNonSecureWrite(0).userSecureRead(1)
4299  .privSecure(!aarch32EL3)
4300  .monSecure(0);
4302  .bankedChild()
4303  .secure().userSecureWrite(0);
4305  .banked();
4307  .bankedChild()
4308  .nonSecure().exceptUserMode()
4309  .privSecure(!aarch32EL3);
4311  .bankedChild()
4312  .secure().exceptUserMode();
4314  .hyp().monNonSecure();
4315  // BEGIN Generic Timer (AArch32)
4317  .reads(1)
4318  .highest(system)
4319  .privSecureWrite(aarch32EL3);
4321  .unverifiable()
4322  .reads(1);
4324  .unverifiable()
4325  .reads(1);
4327  .banked();
4329  .bankedChild()
4330  .nonSecure()
4331  .privSecure(!aarch32EL3)
4332  .res0(0xfffffff8);
4334  .bankedChild()
4335  .secure()
4336  .privSecure(aarch32EL3)
4337  .res0(0xfffffff8);
4339  .banked();
4341  .bankedChild()
4342  .nonSecure()
4343  .privSecure(!aarch32EL3);
4345  .bankedChild()
4346  .secure()
4347  .privSecure(aarch32EL3);
4349  .banked();
4351  .bankedChild()
4352  .nonSecure()
4353  .privSecure(!aarch32EL3);
4355  .bankedChild()
4356  .secure()
4357  .privSecure(aarch32EL3);
4359  .allPrivileges()
4360  .res0(0xfffffff8);
4362  .allPrivileges();
4364  .allPrivileges();
4366  .allPrivileges()
4367  .exceptUserMode()
4368  .res0(0xfffdfc00);
4370  .monNonSecure()
4371  .hyp()
4372  .res0(0xfffdff00);
4374  .monNonSecure()
4375  .hyp()
4376  .res0(0xfffffff8);
4378  .monNonSecure()
4379  .hyp();
4381  .monNonSecure()
4382  .hyp();
4384  .monNonSecure()
4385  .hyp();
4386  // END Generic Timer (AArch32)
4388  .unimplemented()
4389  .allPrivileges().exceptUserMode();
4391  .unimplemented()
4392  .allPrivileges().exceptUserMode();
4394  .unimplemented()
4395  .allPrivileges().exceptUserMode();
4397  .unimplemented()
4398  .allPrivileges().exceptUserMode();
4400  .unimplemented()
4401  .allPrivileges().exceptUserMode();
4403  .unimplemented()
4404  .allPrivileges().exceptUserMode();
4406  .unimplemented()
4407  .allPrivileges().exceptUserMode();
4409  .unimplemented()
4410  .allPrivileges().exceptUserMode();
4412  .unimplemented()
4413  .allPrivileges().exceptUserMode();
4415  .unimplemented()
4416  .writes(1).exceptUserMode();
4418  .unimplemented()
4419  .allPrivileges().exceptUserMode();
4421  .unimplemented()
4422  .allPrivileges().exceptUserMode().writes(0);
4424  .hyp().monNonSecure();
4426  .hyp().monNonSecure();
4428  .unimplemented()
4429  .allPrivileges().exceptUserMode();
4431  .unimplemented()
4432  .warnNotFail()
4433  .allPrivileges().exceptUserMode();
4434 
4435  // AArch64 registers (Op0=2);
4437  .allPrivileges();
4439  .allPrivileges()
4440  .mapsTo(MISCREG_DBGDTRRXext);
4442  .allPrivileges()
4443  .mapsTo(MISCREG_DBGDSCRext);
4445  .allPrivileges()
4446  .mapsTo(MISCREG_DBGDTRTXext);
4448  .allPrivileges()
4449  .mapsTo(MISCREG_DBGOSECCR);
4451  .allPrivileges().exceptUserMode()
4454  .allPrivileges().exceptUserMode()
4457  .allPrivileges().exceptUserMode()
4460  .allPrivileges().exceptUserMode()
4463  .allPrivileges().exceptUserMode()
4466  .allPrivileges().exceptUserMode()
4469  .allPrivileges().exceptUserMode()
4472  .allPrivileges().exceptUserMode()
4475  .allPrivileges().exceptUserMode()
4478  .allPrivileges().exceptUserMode()
4481  .allPrivileges().exceptUserMode()
4484  .allPrivileges().exceptUserMode()
4487  .allPrivileges().exceptUserMode()
4490  .allPrivileges().exceptUserMode()
4493  .allPrivileges().exceptUserMode()
4496  .allPrivileges().exceptUserMode()
4499  .allPrivileges().exceptUserMode()
4500  .mapsTo(MISCREG_DBGBCR0);
4502  .allPrivileges().exceptUserMode()
4503  .mapsTo(MISCREG_DBGBCR1);
4505  .allPrivileges().exceptUserMode()
4506  .mapsTo(MISCREG_DBGBCR2);
4508  .allPrivileges().exceptUserMode()
4509  .mapsTo(MISCREG_DBGBCR3);
4511  .allPrivileges().exceptUserMode()
4512  .mapsTo(MISCREG_DBGBCR4);
4514  .allPrivileges().exceptUserMode()
4515  .mapsTo(MISCREG_DBGBCR5);
4517  .allPrivileges().exceptUserMode()
4518  .mapsTo(MISCREG_DBGBCR6);
4520  .allPrivileges().exceptUserMode()
4521  .mapsTo(MISCREG_DBGBCR7);
4523  .allPrivileges().exceptUserMode()
4524  .mapsTo(MISCREG_DBGBCR8);
4526  .allPrivileges().exceptUserMode()
4527  .mapsTo(MISCREG_DBGBCR9);
4529  .allPrivileges().exceptUserMode()
4530  .mapsTo(MISCREG_DBGBCR10);
4532  .allPrivileges().exceptUserMode()
4533  .mapsTo(MISCREG_DBGBCR11);
4535  .allPrivileges().exceptUserMode()
4536  .mapsTo(MISCREG_DBGBCR12);
4538  .allPrivileges().exceptUserMode()
4539  .mapsTo(MISCREG_DBGBCR13);
4541  .allPrivileges().exceptUserMode()
4542  .mapsTo(MISCREG_DBGBCR14);
4544  .allPrivileges().exceptUserMode()
4545  .mapsTo(MISCREG_DBGBCR15);
4547  .allPrivileges().exceptUserMode()
4548  .mapsTo(MISCREG_DBGWVR0);
4550  .allPrivileges().exceptUserMode()
4551  .mapsTo(MISCREG_DBGWVR1);
4553  .allPrivileges().exceptUserMode()
4554  .mapsTo(MISCREG_DBGWVR2);
4556  .allPrivileges().exceptUserMode()
4557  .mapsTo(MISCREG_DBGWVR3);
4559  .allPrivileges().exceptUserMode()
4560  .mapsTo(MISCREG_DBGWVR4);
4562  .allPrivileges().exceptUserMode()
4563  .mapsTo(MISCREG_DBGWVR5);
4565  .allPrivileges().exceptUserMode()
4566  .mapsTo(MISCREG_DBGWVR6);
4568  .allPrivileges().exceptUserMode()
4569  .mapsTo(MISCREG_DBGWVR7);
4571  .allPrivileges().exceptUserMode()
4572  .mapsTo(MISCREG_DBGWVR8);
4574  .allPrivileges().exceptUserMode()
4575  .mapsTo(MISCREG_DBGWVR9);
4577  .allPrivileges().exceptUserMode()
4578  .mapsTo(MISCREG_DBGWVR10);
4580  .allPrivileges().exceptUserMode()
4581  .mapsTo(MISCREG_DBGWVR11);
4583  .allPrivileges().exceptUserMode()
4584  .mapsTo(MISCREG_DBGWVR12);
4586  .allPrivileges().exceptUserMode()
4587  .mapsTo(MISCREG_DBGWVR13);
4589  .allPrivileges().exceptUserMode()
4590  .mapsTo(MISCREG_DBGWVR14);
4592  .allPrivileges().exceptUserMode()
4593  .mapsTo(MISCREG_DBGWVR15);
4595  .allPrivileges().exceptUserMode()
4596  .mapsTo(MISCREG_DBGWCR0);
4598  .allPrivileges().exceptUserMode()
4599  .mapsTo(MISCREG_DBGWCR1);
4601  .allPrivileges().exceptUserMode()
4602  .mapsTo(MISCREG_DBGWCR2);
4604  .allPrivileges().exceptUserMode()
4605  .mapsTo(MISCREG_DBGWCR3);
4607  .allPrivileges().exceptUserMode()
4608  .mapsTo(MISCREG_DBGWCR4);
4610  .allPrivileges().exceptUserMode()
4611  .mapsTo(MISCREG_DBGWCR5);
4613  .allPrivileges().exceptUserMode()
4614  .mapsTo(MISCREG_DBGWCR6);
4616  .allPrivileges().exceptUserMode()
4617  .mapsTo(MISCREG_DBGWCR7);
4619  .allPrivileges().exceptUserMode()
4620  .mapsTo(MISCREG_DBGWCR8);
4622  .allPrivileges().exceptUserMode()
4623  .mapsTo(MISCREG_DBGWCR9);
4625  .allPrivileges().exceptUserMode()
4626  .mapsTo(MISCREG_DBGWCR10);
4628  .allPrivileges().exceptUserMode()
4629  .mapsTo(MISCREG_DBGWCR11);
4631  .allPrivileges().exceptUserMode()
4632  .mapsTo(MISCREG_DBGWCR12);
4634  .allPrivileges().exceptUserMode()
4635  .mapsTo(MISCREG_DBGWCR13);
4637  .allPrivileges().exceptUserMode()
4638  .mapsTo(MISCREG_DBGWCR14);
4640  .allPrivileges().exceptUserMode()
4641  .mapsTo(MISCREG_DBGWCR15);
4643  .allPrivileges().writes(0)
4644  //monSecureWrite(0).monNonSecureWrite(0)
4645  .mapsTo(MISCREG_DBGDSCRint);
4647  .allPrivileges();
4649  .allPrivileges();
4651  .allPrivileges();
4653  .hyp().mon()
4654  .mapsTo(MISCREG_DBGVCR);
4656  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0)
4657  .mapsTo(MISCREG_DBGDRAR);
4659  .allPrivileges().monSecureRead(0).monNonSecureRead(0)
4660  .mapsTo(MISCREG_DBGOSLAR);
4662  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0)
4663  .mapsTo(MISCREG_DBGOSLSR);
4665  .allPrivileges()
4666  .mapsTo(MISCREG_DBGOSDLR);
4668  .allPrivileges()
4669  .mapsTo(MISCREG_DBGPRCR);
4671  .allPrivileges()
4672  .mapsTo(MISCREG_DBGCLAIMSET);
4674  .allPrivileges()
4675  .mapsTo(MISCREG_DBGCLAIMCLR);
4677  .allPrivileges().monSecureWrite(0).monNonSecureWrite(0)
4678  .mapsTo(MISCREG_DBGAUTHSTATUS);
4681 
4682  // AArch64 registers (Op0=1,3);
4684  .allPrivileges().exceptUserMode().writes(0);
4686  .allPrivileges().exceptUserMode().writes(0);
4688  .allPrivileges().exceptUserMode().writes(0);
4690  .allPrivileges().exceptUserMode().writes(0)
4691  .mapsTo(MISCREG_ID_PFR0);
4693  .allPrivileges().exceptUserMode().writes(0)
4694  .mapsTo(MISCREG_ID_PFR1);
4696  .allPrivileges().exceptUserMode().writes(0)
4697  .mapsTo(MISCREG_ID_DFR0);
4699  .allPrivileges().exceptUserMode().writes(0)
4700  .mapsTo(MISCREG_ID_AFR0);
4702  .allPrivileges().exceptUserMode().writes(0)
4703  .mapsTo(MISCREG_ID_MMFR0);
4705  .allPrivileges().exceptUserMode().writes(0)
4706  .mapsTo(MISCREG_ID_MMFR1);
4708  .allPrivileges().exceptUserMode().writes(0)
4709  .mapsTo(MISCREG_ID_MMFR2);
4711  .allPrivileges().exceptUserMode().writes(0)
4712  .mapsTo(MISCREG_ID_MMFR3);
4714  .allPrivileges().exceptUserMode().writes(0)
4715  .mapsTo(MISCREG_ID_MMFR4);
4717  .allPrivileges().exceptUserMode().writes(0)
4718  .mapsTo(MISCREG_ID_ISAR0);
4720  .allPrivileges().exceptUserMode().writes(0)
4721  .mapsTo(MISCREG_ID_ISAR1);
4723  .allPrivileges().exceptUserMode().writes(0)
4724  .mapsTo(MISCREG_ID_ISAR2);
4726  .allPrivileges().exceptUserMode().writes(0)
4727  .mapsTo(MISCREG_ID_ISAR3);
4729  .allPrivileges().exceptUserMode().writes(0)
4730  .mapsTo(MISCREG_ID_ISAR4);
4732  .allPrivileges().exceptUserMode().writes(0)
4733  .mapsTo(MISCREG_ID_ISAR5);
4735  .allPrivileges().exceptUserMode().writes(0)
4736  .mapsTo(MISCREG_ID_ISAR6);
4738  .allPrivileges().exceptUserMode().writes(0);
4740  .allPrivileges().exceptUserMode().writes(0);
4742  .allPrivileges().exceptUserMode().writes(0);
4744  .allPrivileges().exceptUserMode().writes(0);
4746  .allPrivileges().exceptUserMode().writes(0);
4748  .allPrivileges().exceptUserMode().writes(0);
4750  .allPrivileges().exceptUserMode().writes(0);
4752  .allPrivileges().exceptUserMode().writes(0);
4754  .allPrivileges().exceptUserMode().writes(0);
4756  .allPrivileges().exceptUserMode().writes(0);
4758  .allPrivileges().exceptUserMode().writes(0);
4760  .allPrivileges().exceptUserMode().writes(0);
4762  .allPrivileges().exceptUserMode().writes(0);
4764  .allPrivileges().exceptUserMode().writes(0);
4765 
4767  .allPrivileges().exceptUserMode();
4769  .allPrivileges().exceptUserMode();
4771  .allPrivileges().exceptUserMode();
4773  .allPrivileges().exceptUserMode();
4775  .allPrivileges().exceptUserMode();
4777  .allPrivileges().exceptUserMode();
4779  .allPrivileges().exceptUserMode();
4781  .allPrivileges().exceptUserMode();
4783  .allPrivileges().exceptUserMode();
4785  .allPrivileges().exceptUserMode();
4786 
4788  .allPrivileges().exceptUserMode().writes(0);
4790  .allPrivileges().exceptUserMode().writes(0);
4792  .allPrivileges().exceptUserMode().writes(0);
4794  .allPrivileges().exceptUserMode()
4795  .mapsTo(MISCREG_CSSELR_NS);
4797  .reads(1);
4799  .reads(1);
4801  .hyp().mon()
4802  .mapsTo(MISCREG_VPIDR);
4804  .hyp().mon()
4805  .mapsTo(MISCREG_VMPIDR);
4807  .allPrivileges().exceptUserMode()
4808  .res0( 0x20440 | (EnDB ? 0 : 0x2000)
4809  | (IESB ? 0 : 0x200000)
4810  | (EnDA ? 0 : 0x8000000)
4811  | (EnIB ? 0 : 0x40000000)
4812  | (EnIA ? 0 : 0x80000000))
4813  .res1(0x500800 | (SPAN ? 0 : 0x800000)
4814  | (nTLSMD ? 0 : 0x8000000)
4815  | (LSMAOE ? 0 : 0x10000000))
4816  .mapsTo(MISCREG_SCTLR_NS);
4818  .allPrivileges().exceptUserMode()
4819  .res0( 0x20440 | (EnDB ? 0 : 0x2000)
4820  | (IESB ? 0 : 0x200000)
4821  | (EnDA ? 0 : 0x8000000)
4822  | (EnIB ? 0 : 0x40000000)
4823  | (EnIA ? 0 : 0x80000000))
4824  .res1(0x500800 | (SPAN ? 0 : 0x800000)
4825  | (nTLSMD ? 0 : 0x8000000)
4826  | (LSMAOE ? 0 : 0x10000000))
4827  .mapsTo(MISCREG_SCTLR_EL1);
4829  .allPrivileges().exceptUserMode()
4830  .mapsTo(MISCREG_ACTLR_NS);
4832  .allPrivileges().exceptUserMode()
4833  .mapsTo(MISCREG_CPACR);
4835  .allPrivileges().exceptUserMode()
4836  .mapsTo(MISCREG_CPACR_EL1);
4838  .hyp().mon()
4839  .res0(0x0512c7c0 | (EnDB ? 0 : 0x2000)
4840  | (IESB ? 0 : 0x200000)
4841  | (EnDA ? 0 : 0x8000000)
4842  | (EnIB ? 0 : 0x40000000)
4843  | (EnIA ? 0 : 0x80000000))
4844  .res1(0x30c50830)
4845  .mapsTo(MISCREG_HSCTLR);
4847  .hyp().mon()
4848  .mapsTo(MISCREG_HACTLR);
4850  .hyp().mon()
4851  .mapsTo(MISCREG_HCR, MISCREG_HCR2);
4853  .hyp().mon()
4854  .mapsTo(MISCREG_HDCR);
4856  .hyp().mon()
4857  .mapsTo(MISCREG_HCPTR);
4859  .hyp().mon()
4860  .mapsTo(MISCREG_HSTR);
4862  .hyp().mon()
4863  .mapsTo(MISCREG_HACR);
4865  .mon()
4866  .res0(0x0512c7c0 | (EnDB ? 0 : 0x2000)
4867  | (IESB ? 0 : 0x200000)
4868  | (EnDA ? 0 : 0x8000000)
4869  | (EnIB ? 0 : 0x40000000)
4870  | (EnIA ? 0 : 0x80000000))
4871  .res1(0x30c50830);
4873  .mon();
4875  .mon()
4876  .mapsTo(MISCREG_SCR); // NAM D7-2005
4878  .mon()
4879  .mapsTo(MISCREG_SDER);
4881  .mon();
4883  .mon()
4884  .mapsTo(MISCREG_SDCR);
4886  .allPrivileges().exceptUserMode()
4887  .mapsTo(MISCREG_TTBR0_NS);
4889  .allPrivileges().exceptUserMode()
4890  .mapsTo(MISCREG_TTBR0_EL1);
4892  .allPrivileges().exceptUserMode()
4893  .mapsTo(MISCREG_TTBR1_NS);
4895  .allPrivileges().exceptUserMode()
4896  .mapsTo(MISCREG_TTBR1_EL1);
4898  .allPrivileges().exceptUserMode()
4899  .mapsTo(MISCREG_TTBCR_NS);
4901  .allPrivileges().exceptUserMode()
4902  .mapsTo(MISCREG_TTBCR_NS);
4904  .hyp().mon()
4905  .mapsTo(MISCREG_HTTBR);
4907  .hyp().mon();
4909  .hyp().mon()
4910  .mapsTo(MISCREG_HTCR);
4912  .hyp().mon()
4913  .mapsTo(MISCREG_VTTBR);
4915  .hyp().mon()
4916  .mapsTo(MISCREG_VTCR);
4918  .hypSecure().mon();
4920  .hypSecure().mon();
4922  .mon();
4924  .mon();
4926  .hyp().mon()
4927  .mapsTo(MISCREG_DACR_NS);
4929  .allPrivileges().exceptUserMode()
4930  .mapsTo(MISCREG_SPSR_SVC); // NAM C5.2.17 SPSR_EL1
4932  .allPrivileges().exceptUserMode()
4933  .mapsTo(MISCREG_SPSR_SVC);
4935  .allPrivileges().exceptUserMode();
4937  .allPrivileges().exceptUserMode()
4938  .mapsTo(MISCREG_ELR_EL1);
4940  .allPrivileges().exceptUserMode();
4942  .allPrivileges().exceptUserMode();
4944  .allPrivileges().exceptUserMode().writes(0);
4946  .allPrivileges().exceptUserMode()
4947  .implemented(havePAN);
4949  .allPrivileges();
4951  .allPrivileges();
4953  .allPrivileges();
4955  .allPrivileges();
4957  .allPrivileges();
4959  .allPrivileges();
4961  .hyp().mon()
4962  .mapsTo(MISCREG_SPSR_HYP); // NAM C5.2.18 SPSR_EL2
4964  .hyp().mon();
4966  .hyp().mon();
4968  .hyp().mon();
4970  .hyp().mon();
4972  .hyp().mon();
4974  .hyp().mon();
4976  .mon()
4977  .mapsTo(MISCREG_SPSR_MON); // NAM C5.2.19 SPSR_EL3
4979  .mon();
4981  .mon();
4983  .allPrivileges().exceptUserMode()
4984  .mapsTo(MISCREG_ADFSR_NS);
4986  .allPrivileges().exceptUserMode()
4987  .mapsTo(MISCREG_ADFSR_NS);
4989  .allPrivileges().exceptUserMode()
4990  .mapsTo(MISCREG_AIFSR_NS);
4992  .allPrivileges().exceptUserMode()
4993  .mapsTo(MISCREG_AIFSR_NS);
4995  .allPrivileges().exceptUserMode();
4997  .allPrivileges().exceptUserMode()
4998  .mapsTo(MISCREG_ESR_EL1);
5000  .hyp().mon()
5001  .mapsTo(MISCREG_IFSR_NS);
5003  .hyp().mon()
5004  .mapsTo(MISCREG_HADFSR);
5006  .hyp().mon()
5007  .mapsTo(MISCREG_HAIFSR);
5009  .hyp().mon()
5010  .mapsTo(MISCREG_HSR);
5012  .hyp().mon().mapsTo(MISCREG_FPEXC);
5014  .mon();
5016  .mon();
5018  .mon();
5020  .allPrivileges().exceptUserMode()
5021  .mapsTo(MISCREG_DFAR_NS, MISCREG_IFAR_NS);
5023  .allPrivileges().exceptUserMode()
5024  .mapsTo(MISCREG_DFAR_NS, MISCREG_IFAR_NS);
5026  .hyp().mon()
5027  .mapsTo(MISCREG_HDFAR, MISCREG_HIFAR);
5029  .hyp().mon()
5030  .mapsTo(MISCREG_HPFAR);
5032  .mon();
5034  .warnNotFail()
5035  .writes(1).exceptUserMode();
5037  .allPrivileges().exceptUserMode()
5038  .mapsTo(MISCREG_PAR_NS);
5040  .warnNotFail()
5041  .writes(1).exceptUserMode();
5043  .warnNotFail()
5044  .writes(1).exceptUserMode();
5046  .warnNotFail()
5047  .writes(1).excep