Skip to main content

regio/arm64/
spec.rs

1// Copyright 2026 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5//! This module stamps out [`SysRegSpec`] instances corresponding to known
6//! arm64 system registers, named by their official mnemonic (e.g.,
7//! `SCTLR_EL1`).
8
9#![allow(non_camel_case_types)]
10
11use super::SysRegSpec;
12use crate::{Ro, RwSafe, RwUnsafe, WoSafe};
13
14// This information is primarily found in the "AArch64 System Register
15// Encoding" chapter in the ARM A-profile Architecture Reference Manual.
16//
17// The usage of RwSafe vs. RwUnsafe depends on the nature of the particular
18// system register.
19macro_rules! for_each_spec {
20    ($macro:path) => {
21        $macro!(ACCDATA_EL1, 0b11, 0b000, 0b1101, 0b0000, 0b101, RwSafe);
22        $macro!(ACTLR_EL1, 0b11, 0b000, 0b0001, 0b0000, 0b001, RwSafe);
23        $macro!(ACTLR_EL12, 0b11, 0b101, 0b0001, 0b0000, 0b001, RwSafe);
24        $macro!(ACTLR_EL2, 0b11, 0b100, 0b0001, 0b0000, 0b001, RwSafe);
25        $macro!(ACTLR_EL3, 0b11, 0b110, 0b0001, 0b0000, 0b001, RwSafe);
26        $macro!(AFSR0_EL1, 0b11, 0b000, 0b0101, 0b0001, 0b000, RwSafe);
27        $macro!(AFSR0_EL12, 0b11, 0b101, 0b0101, 0b0001, 0b000, RwSafe);
28        $macro!(AFSR0_EL2, 0b11, 0b100, 0b0101, 0b0001, 0b000, RwSafe);
29        $macro!(AFSR0_EL3, 0b11, 0b110, 0b0101, 0b0001, 0b000, RwSafe);
30        $macro!(AFSR1_EL1, 0b11, 0b000, 0b0101, 0b0001, 0b001, RwSafe);
31        $macro!(AFSR1_EL12, 0b11, 0b101, 0b0101, 0b0001, 0b001, RwSafe);
32        $macro!(AFSR1_EL2, 0b11, 0b100, 0b0101, 0b0001, 0b001, RwSafe);
33        $macro!(AFSR1_EL3, 0b11, 0b110, 0b0101, 0b0001, 0b001, RwSafe);
34        $macro!(AIDR_EL1, 0b11, 0b001, 0b0000, 0b0000, 0b111, Ro);
35        $macro!(ALLINT, 0b11, 0b000, 0b0100, 0b0011, 0b000, RwSafe);
36
37        //
38        // Can change cacheability.
39        //
40        $macro!(AMAIR_EL1, 0b11, 0b000, 0b1010, 0b0011, 0b000, RwUnsafe);
41        $macro!(AMAIR_EL12, 0b11, 0b101, 0b1010, 0b0011, 0b000, RwUnsafe);
42        $macro!(AMAIR_EL2, 0b11, 0b100, 0b1010, 0b0011, 0b000, RwUnsafe);
43        $macro!(AMAIR_EL3, 0b11, 0b110, 0b1010, 0b0011, 0b000, RwUnsafe);
44        $macro!(AMAIR2_EL1, 0b11, 0b000, 0b1010, 0b0011, 0b001, RwUnsafe);
45        $macro!(AMAIR2_EL12, 0b11, 0b101, 0b1010, 0b0011, 0b001, RwUnsafe);
46        $macro!(AMAIR2_EL2, 0b11, 0b100, 0b1010, 0b0011, 0b001, RwUnsafe);
47        $macro!(AMAIR2_EL3, 0b11, 0b110, 0b1010, 0b0011, 0b001, RwUnsafe);
48
49        $macro!(AMCFGR_EL0, 0b11, 0b011, 0b1101, 0b0010, 0b001, Ro);
50        $macro!(AMCGCR_EL0, 0b11, 0b011, 0b1101, 0b0010, 0b010, Ro);
51        $macro!(AMCG1IDR_EL0, 0b11, 0b011, 0b1101, 0b0010, 0b110, Ro);
52        $macro!(AMCNTENCLR0_EL0, 0b11, 0b011, 0b1101, 0b0010, 0b100, RwSafe);
53        $macro!(AMCNTENCLR1_EL0, 0b11, 0b011, 0b1101, 0b0011, 0b000, RwSafe);
54        $macro!(AMCNTENSET0_EL0, 0b11, 0b011, 0b1101, 0b0010, 0b101, RwSafe);
55        $macro!(AMCNTENSET1_EL0, 0b11, 0b011, 0b1101, 0b0011, 0b001, RwSafe);
56        $macro!(AMCR_EL0, 0b11, 0b011, 0b1101, 0b0010, 0b000, RwSafe);
57        $macro!(AMUSERENR_EL0, 0b11, 0b011, 0b1101, 0b0010, 0b011, RwSafe);
58        $macro!(APDAKeyHi_EL1, 0b11, 0b000, 0b0010, 0b0010, 0b001, RwSafe);
59        $macro!(APDAKeyLo_EL1, 0b11, 0b000, 0b0010, 0b0010, 0b000, RwSafe);
60        $macro!(APDBKeyHi_EL1, 0b11, 0b000, 0b0010, 0b0010, 0b011, RwSafe);
61        $macro!(APDBKeyLo_EL1, 0b11, 0b000, 0b0010, 0b0010, 0b010, RwSafe);
62        $macro!(APGAKeyHi_EL1, 0b11, 0b000, 0b0010, 0b0011, 0b001, RwSafe);
63        $macro!(APGAKeyLo_EL1, 0b11, 0b000, 0b0010, 0b0011, 0b000, RwSafe);
64        $macro!(APIAKeyHi_EL1, 0b11, 0b000, 0b0010, 0b0001, 0b001, RwSafe);
65        $macro!(APIAKeyLo_EL1, 0b11, 0b000, 0b0010, 0b0001, 0b000, RwSafe);
66        $macro!(APIBKeyHi_EL1, 0b11, 0b000, 0b0010, 0b0001, 0b011, RwSafe);
67        $macro!(APIBKeyLo_EL1, 0b11, 0b000, 0b0010, 0b0001, 0b010, RwSafe);
68        $macro!(BRBCR_EL1, 0b10, 0b001, 0b1001, 0b0000, 0b000, RwSafe);
69        $macro!(BRBCR_EL12, 0b10, 0b101, 0b1001, 0b0000, 0b000, RwSafe);
70        $macro!(BRBCR_EL2, 0b10, 0b100, 0b1001, 0b0000, 0b000, RwSafe);
71        $macro!(BRBFCR_EL1, 0b10, 0b001, 0b1001, 0b0000, 0b001, RwSafe);
72        $macro!(BRBIDR0_EL1, 0b10, 0b001, 0b1001, 0b0010, 0b000, Ro);
73        $macro!(BRBINFINJ_EL1, 0b10, 0b001, 0b1001, 0b0001, 0b000, RwSafe);
74        $macro!(BRBSRCINJ_EL1, 0b10, 0b001, 0b1001, 0b0001, 0b001, RwSafe);
75        $macro!(BRBTGTINJ_EL1, 0b10, 0b001, 0b1001, 0b0001, 0b010, RwSafe);
76        $macro!(BRBTS_EL1, 0b10, 0b001, 0b1001, 0b0000, 0b010, RwSafe);
77        $macro!(CCSIDR_EL1, 0b11, 0b001, 0b0000, 0b0000, 0b000, Ro);
78        $macro!(CCSIDR2_EL1, 0b11, 0b001, 0b0000, 0b0000, 0b010, Ro);
79        $macro!(CLIDR_EL1, 0b11, 0b001, 0b0000, 0b0000, 0b001, Ro);
80        $macro!(CNTFRQ_EL0, 0b11, 0b011, 0b1110, 0b0000, 0b000, RwSafe);
81        $macro!(CNTHCTL_EL2, 0b11, 0b100, 0b1110, 0b0001, 0b000, RwSafe);
82        $macro!(CNTHP_CTL_EL2, 0b11, 0b100, 0b1110, 0b0010, 0b001, RwSafe);
83        $macro!(CNTHP_CVAL_EL2, 0b11, 0b100, 0b1110, 0b0010, 0b010, RwSafe);
84        $macro!(CNTHP_TVAL_EL2, 0b11, 0b100, 0b1110, 0b0010, 0b000, RwSafe);
85        $macro!(CNTHPS_CTL_EL2, 0b11, 0b100, 0b1110, 0b0101, 0b001, RwSafe);
86        $macro!(CNTHPS_CVAL_EL2, 0b11, 0b100, 0b1110, 0b0101, 0b010, RwSafe);
87        $macro!(CNTHPS_TVAL_EL2, 0b11, 0b100, 0b1110, 0b0101, 0b000, RwSafe);
88        $macro!(CNTHV_CTL_EL2, 0b11, 0b100, 0b1110, 0b0011, 0b001, RwSafe);
89        $macro!(CNTHV_CVAL_EL2, 0b11, 0b100, 0b1110, 0b0011, 0b010, RwSafe);
90        $macro!(CNTHV_TVAL_EL2, 0b11, 0b100, 0b1110, 0b0011, 0b000, RwSafe);
91        $macro!(CNTHVS_CTL_EL2, 0b11, 0b100, 0b1110, 0b0100, 0b001, RwSafe);
92        $macro!(CNTHVS_CVAL_EL2, 0b11, 0b100, 0b1110, 0b0100, 0b010, RwSafe);
93        $macro!(CNTHVS_TVAL_EL2, 0b11, 0b100, 0b1110, 0b0100, 0b000, RwSafe);
94        $macro!(CNTKCTL_EL1, 0b11, 0b000, 0b1110, 0b0001, 0b000, RwSafe);
95        $macro!(CNTKCTL_EL12, 0b11, 0b101, 0b1110, 0b0001, 0b000, RwSafe);
96        $macro!(CNTP_CTL_EL0, 0b11, 0b011, 0b1110, 0b0010, 0b001, RwSafe);
97        $macro!(CNTP_CTL_EL02, 0b11, 0b101, 0b1110, 0b0010, 0b001, RwSafe);
98        $macro!(CNTP_CVAL_EL0, 0b11, 0b011, 0b1110, 0b0010, 0b010, RwSafe);
99        $macro!(CNTP_CVAL_EL02, 0b11, 0b101, 0b1110, 0b0010, 0b010, RwSafe);
100        $macro!(CNTP_TVAL_EL0, 0b11, 0b011, 0b1110, 0b0010, 0b000, RwSafe);
101        $macro!(CNTP_TVAL_EL02, 0b11, 0b101, 0b1110, 0b0010, 0b000, RwSafe);
102        $macro!(CNTPCT_EL0, 0b11, 0b011, 0b1110, 0b0000, 0b001, Ro);
103        $macro!(CNTPCTSS_EL0, 0b11, 0b011, 0b1110, 0b0000, 0b101, Ro);
104        $macro!(CNTPOFF_EL2, 0b11, 0b100, 0b1110, 0b0000, 0b110, RwSafe);
105        $macro!(CNTPS_CTL_EL1, 0b11, 0b111, 0b1110, 0b0010, 0b001, RwSafe);
106        $macro!(CNTPS_CVAL_EL1, 0b11, 0b111, 0b1110, 0b0010, 0b010, RwSafe);
107        $macro!(CNTPS_TVAL_EL1, 0b11, 0b111, 0b1110, 0b0010, 0b000, RwSafe);
108        $macro!(CNTV_CTL_EL0, 0b11, 0b011, 0b1110, 0b0011, 0b001, RwSafe);
109        $macro!(CNTV_CTL_EL02, 0b11, 0b101, 0b1110, 0b0011, 0b001, RwSafe);
110        $macro!(CNTV_CVAL_EL0, 0b11, 0b011, 0b1110, 0b0011, 0b010, RwSafe);
111        $macro!(CNTV_CVAL_EL02, 0b11, 0b101, 0b1110, 0b0011, 0b010, RwSafe);
112        $macro!(CNTV_TVAL_EL0, 0b11, 0b011, 0b1110, 0b0011, 0b000, RwSafe);
113        $macro!(CNTV_TVAL_EL02, 0b11, 0b101, 0b1110, 0b0011, 0b000, RwSafe);
114        $macro!(CNTVCT_EL0, 0b11, 0b011, 0b1110, 0b0000, 0b010, Ro);
115        $macro!(CNTVCTSS_EL0, 0b11, 0b011, 0b1110, 0b0000, 0b110, Ro);
116        $macro!(CNTVOFF_EL2, 0b11, 0b100, 0b1110, 0b0000, 0b011, RwSafe);
117        $macro!(CONTEXTIDR_EL1, 0b11, 0b000, 0b1101, 0b0000, 0b001, RwSafe);
118        $macro!(CONTEXTIDR_EL12, 0b11, 0b101, 0b1101, 0b0000, 0b001, RwSafe);
119        $macro!(CONTEXTIDR_EL2, 0b11, 0b100, 0b1101, 0b0000, 0b001, RwSafe);
120        $macro!(CPACR_EL1, 0b11, 0b000, 0b0001, 0b0000, 0b010, RwSafe);
121        $macro!(CPACR_EL12, 0b11, 0b101, 0b0001, 0b0000, 0b010, RwSafe);
122        $macro!(CPTR_EL2, 0b11, 0b100, 0b0001, 0b0001, 0b010, RwSafe);
123        $macro!(CPTR_EL3, 0b11, 0b110, 0b0001, 0b0001, 0b010, RwSafe);
124        $macro!(CSSELR_EL1, 0b11, 0b010, 0b0000, 0b0000, 0b000, RwSafe);
125        $macro!(CTR_EL0, 0b11, 0b011, 0b0000, 0b0000, 0b001, Ro);
126        $macro!(CurrentEL, 0b11, 0b000, 0b0100, 0b0010, 0b010, Ro);
127        $macro!(DACR32_EL2, 0b11, 0b100, 0b0011, 0b0000, 0b000, RwSafe);
128        $macro!(DAIF, 0b11, 0b011, 0b0100, 0b0010, 0b001, RwSafe);
129        $macro!(DBGAUTHSTATUS_EL1, 0b10, 0b000, 0b0111, 0b1110, 0b110, Ro);
130        $macro!(DBGBCR0_EL1, 0b10, 0b000, 0b0000, 0b0000, 0b101, RwSafe);
131        $macro!(DBGBCR1_EL1, 0b10, 0b000, 0b0000, 0b0001, 0b101, RwSafe);
132        $macro!(DBGBCR2_EL1, 0b10, 0b000, 0b0000, 0b0010, 0b101, RwSafe);
133        $macro!(DBGBCR3_EL1, 0b10, 0b000, 0b0000, 0b0011, 0b101, RwSafe);
134        $macro!(DBGBCR4_EL1, 0b10, 0b000, 0b0000, 0b0100, 0b101, RwSafe);
135        $macro!(DBGBCR5_EL1, 0b10, 0b000, 0b0000, 0b0101, 0b101, RwSafe);
136        $macro!(DBGBCR6_EL1, 0b10, 0b000, 0b0000, 0b0110, 0b101, RwSafe);
137        $macro!(DBGBCR7_EL1, 0b10, 0b000, 0b0000, 0b0111, 0b101, RwSafe);
138        $macro!(DBGBCR8_EL1, 0b10, 0b000, 0b0000, 0b1000, 0b101, RwSafe);
139        $macro!(DBGBCR9_EL1, 0b10, 0b000, 0b0000, 0b1001, 0b101, RwSafe);
140        $macro!(DBGBCR10_EL1, 0b10, 0b000, 0b0000, 0b1010, 0b101, RwSafe);
141        $macro!(DBGBCR11_EL1, 0b10, 0b000, 0b0000, 0b1011, 0b101, RwSafe);
142        $macro!(DBGBCR12_EL1, 0b10, 0b000, 0b0000, 0b1100, 0b101, RwSafe);
143        $macro!(DBGBCR13_EL1, 0b10, 0b000, 0b0000, 0b1101, 0b101, RwSafe);
144        $macro!(DBGBCR14_EL1, 0b10, 0b000, 0b0000, 0b1110, 0b101, RwSafe);
145        $macro!(DBGBCR15_EL1, 0b10, 0b000, 0b0000, 0b1111, 0b101, RwSafe);
146        $macro!(DBGBVR0_EL1, 0b10, 0b000, 0b0000, 0b0000, 0b100, RwSafe);
147        $macro!(DBGBVR1_EL1, 0b10, 0b000, 0b0000, 0b0001, 0b100, RwSafe);
148        $macro!(DBGBVR2_EL1, 0b10, 0b000, 0b0000, 0b0010, 0b100, RwSafe);
149        $macro!(DBGBVR3_EL1, 0b10, 0b000, 0b0000, 0b0011, 0b100, RwSafe);
150        $macro!(DBGBVR4_EL1, 0b10, 0b000, 0b0000, 0b0100, 0b100, RwSafe);
151        $macro!(DBGBVR5_EL1, 0b10, 0b000, 0b0000, 0b0101, 0b100, RwSafe);
152        $macro!(DBGBVR6_EL1, 0b10, 0b000, 0b0000, 0b0110, 0b100, RwSafe);
153        $macro!(DBGBVR7_EL1, 0b10, 0b000, 0b0000, 0b0111, 0b100, RwSafe);
154        $macro!(DBGBVR8_EL1, 0b10, 0b000, 0b0000, 0b1000, 0b100, RwSafe);
155        $macro!(DBGBVR9_EL1, 0b10, 0b000, 0b0000, 0b1001, 0b100, RwSafe);
156        $macro!(DBGBVR10_EL1, 0b10, 0b000, 0b0000, 0b1010, 0b100, RwSafe);
157        $macro!(DBGBVR11_EL1, 0b10, 0b000, 0b0000, 0b1011, 0b100, RwSafe);
158        $macro!(DBGBVR12_EL1, 0b10, 0b000, 0b0000, 0b1100, 0b100, RwSafe);
159        $macro!(DBGBVR13_EL1, 0b10, 0b000, 0b0000, 0b1101, 0b100, RwSafe);
160        $macro!(DBGBVR14_EL1, 0b10, 0b000, 0b0000, 0b1110, 0b100, RwSafe);
161        $macro!(DBGBVR15_EL1, 0b10, 0b000, 0b0000, 0b1111, 0b100, RwSafe);
162        $macro!(DBGCLAIMCLR_EL1, 0b10, 0b000, 0b0111, 0b1001, 0b110, RwSafe);
163        $macro!(DBGCLAIMSET_EL1, 0b10, 0b000, 0b0111, 0b1000, 0b110, RwSafe);
164        $macro!(DBGDTR_EL0, 0b10, 0b011, 0b0000, 0b0100, 0b000, RwSafe);
165        $macro!(DBGDTRRX_EL0, 0b10, 0b011, 0b0000, 0b0101, 0b000, Ro);
166        $macro!(DBGDTRTX_EL0, 0b10, 0b011, 0b0000, 0b0101, 0b000, WoSafe);
167        $macro!(DBGPRCR_EL1, 0b10, 0b000, 0b0001, 0b0100, 0b100, RwSafe);
168        $macro!(DBGVCR32_EL2, 0b10, 0b100, 0b0000, 0b0111, 0b000, RwSafe);
169        $macro!(DBGWCR0_EL1, 0b10, 0b000, 0b0000, 0b0000, 0b111, RwSafe);
170        $macro!(DBGWCR1_EL1, 0b10, 0b000, 0b0000, 0b0001, 0b111, RwSafe);
171        $macro!(DBGWCR2_EL1, 0b10, 0b000, 0b0000, 0b0010, 0b111, RwSafe);
172        $macro!(DBGWCR3_EL1, 0b10, 0b000, 0b0000, 0b0011, 0b111, RwSafe);
173        $macro!(DBGWCR4_EL1, 0b10, 0b000, 0b0000, 0b0100, 0b111, RwSafe);
174        $macro!(DBGWCR5_EL1, 0b10, 0b000, 0b0000, 0b0101, 0b111, RwSafe);
175        $macro!(DBGWCR6_EL1, 0b10, 0b000, 0b0000, 0b0110, 0b111, RwSafe);
176        $macro!(DBGWCR7_EL1, 0b10, 0b000, 0b0000, 0b0111, 0b111, RwSafe);
177        $macro!(DBGWCR8_EL1, 0b10, 0b000, 0b0000, 0b1000, 0b111, RwSafe);
178        $macro!(DBGWCR9_EL1, 0b10, 0b000, 0b0000, 0b1001, 0b111, RwSafe);
179        $macro!(DBGWCR10_EL1, 0b10, 0b000, 0b0000, 0b1010, 0b111, RwSafe);
180        $macro!(DBGWCR11_EL1, 0b10, 0b000, 0b0000, 0b1011, 0b111, RwSafe);
181        $macro!(DBGWCR12_EL1, 0b10, 0b000, 0b0000, 0b1100, 0b111, RwSafe);
182        $macro!(DBGWCR13_EL1, 0b10, 0b000, 0b0000, 0b1101, 0b111, RwSafe);
183        $macro!(DBGWCR14_EL1, 0b10, 0b000, 0b0000, 0b1110, 0b111, RwSafe);
184        $macro!(DBGWCR15_EL1, 0b10, 0b000, 0b0000, 0b1111, 0b111, RwSafe);
185        $macro!(DBGWVR0_EL1, 0b10, 0b000, 0b0000, 0b0000, 0b110, RwSafe);
186        $macro!(DBGWVR1_EL1, 0b10, 0b000, 0b0000, 0b0001, 0b110, RwSafe);
187        $macro!(DBGWVR2_EL1, 0b10, 0b000, 0b0000, 0b0010, 0b110, RwSafe);
188        $macro!(DBGWVR3_EL1, 0b10, 0b000, 0b0000, 0b0011, 0b110, RwSafe);
189        $macro!(DBGWVR4_EL1, 0b10, 0b000, 0b0000, 0b0100, 0b110, RwSafe);
190        $macro!(DBGWVR5_EL1, 0b10, 0b000, 0b0000, 0b0101, 0b110, RwSafe);
191        $macro!(DBGWVR6_EL1, 0b10, 0b000, 0b0000, 0b0110, 0b110, RwSafe);
192        $macro!(DBGWVR7_EL1, 0b10, 0b000, 0b0000, 0b0111, 0b110, RwSafe);
193        $macro!(DBGWVR8_EL1, 0b10, 0b000, 0b0000, 0b1000, 0b110, RwSafe);
194        $macro!(DBGWVR9_EL1, 0b10, 0b000, 0b0000, 0b1001, 0b110, RwSafe);
195        $macro!(DBGWVR10_EL1, 0b10, 0b000, 0b0000, 0b1010, 0b110, RwSafe);
196        $macro!(DBGWVR11_EL1, 0b10, 0b000, 0b0000, 0b1011, 0b110, RwSafe);
197        $macro!(DBGWVR12_EL1, 0b10, 0b000, 0b0000, 0b1100, 0b110, RwSafe);
198        $macro!(DBGWVR13_EL1, 0b10, 0b000, 0b0000, 0b1101, 0b110, RwSafe);
199        $macro!(DBGWVR14_EL1, 0b10, 0b000, 0b0000, 0b1110, 0b110, RwSafe);
200        $macro!(DBGWVR15_EL1, 0b10, 0b000, 0b0000, 0b1111, 0b110, RwSafe);
201        $macro!(DCZID_EL0, 0b11, 0b011, 0b0000, 0b0000, 0b111, Ro);
202        $macro!(DISR_EL1, 0b11, 0b000, 0b1100, 0b0001, 0b001, RwSafe);
203        $macro!(DIT, 0b11, 0b011, 0b0100, 0b0010, 0b101, RwSafe);
204
205        //
206        // Can change the return address.
207        //
208        $macro!(DLR_EL0, 0b11, 0b011, 0b0100, 0b0101, 0b001, RwUnsafe);
209        $macro!(DSPSR_EL0, 0b11, 0b011, 0b0100, 0b0101, 0b000, RwUnsafe);
210        $macro!(ELR_EL1, 0b11, 0b000, 0b0100, 0b0000, 0b001, RwUnsafe);
211        $macro!(ELR_EL12, 0b11, 0b101, 0b0100, 0b0000, 0b001, RwUnsafe);
212        $macro!(ELR_EL2, 0b11, 0b100, 0b0100, 0b0000, 0b001, RwUnsafe);
213        $macro!(ELR_EL3, 0b11, 0b110, 0b0100, 0b0000, 0b001, RwUnsafe);
214
215        $macro!(ERRIDR_EL1, 0b11, 0b000, 0b0101, 0b0011, 0b000, Ro);
216        $macro!(ERRSELR_EL1, 0b11, 0b000, 0b0101, 0b0011, 0b001, RwSafe);
217        $macro!(ERXADDR_EL1, 0b11, 0b000, 0b0101, 0b0100, 0b011, RwSafe);
218        $macro!(ERXCTLR_EL1, 0b11, 0b000, 0b0101, 0b0100, 0b001, RwSafe);
219        $macro!(ERXFR_EL1, 0b11, 0b000, 0b0101, 0b0100, 0b000, Ro);
220        $macro!(ERXGSR_EL1, 0b11, 0b000, 0b0101, 0b0011, 0b010, Ro);
221        $macro!(ERXMISC0_EL1, 0b11, 0b000, 0b0101, 0b0101, 0b000, RwSafe);
222        $macro!(ERXMISC1_EL1, 0b11, 0b000, 0b0101, 0b0101, 0b001, RwSafe);
223        $macro!(ERXMISC2_EL1, 0b11, 0b000, 0b0101, 0b0101, 0b010, RwSafe);
224        $macro!(ERXMISC3_EL1, 0b11, 0b000, 0b0101, 0b0101, 0b011, RwSafe);
225        $macro!(ERXPFGCDN_EL1, 0b11, 0b000, 0b0101, 0b0100, 0b110, RwSafe);
226        $macro!(ERXPFGCTL_EL1, 0b11, 0b000, 0b0101, 0b0100, 0b101, RwSafe);
227        $macro!(ERXPFGF_EL1, 0b11, 0b000, 0b0101, 0b0100, 0b100, Ro);
228        $macro!(ERXSTATUS_EL1, 0b11, 0b000, 0b0101, 0b0100, 0b010, RwSafe);
229        $macro!(ESR_EL1, 0b11, 0b000, 0b0101, 0b0010, 0b000, RwSafe);
230        $macro!(ESR_EL12, 0b11, 0b101, 0b0101, 0b0010, 0b000, RwSafe);
231        $macro!(ESR_EL2, 0b11, 0b100, 0b0101, 0b0010, 0b000, RwSafe);
232        $macro!(ESR_EL3, 0b11, 0b110, 0b0101, 0b0010, 0b000, RwSafe);
233        $macro!(FAR_EL1, 0b11, 0b000, 0b0110, 0b0000, 0b000, RwSafe);
234        $macro!(FAR_EL12, 0b11, 0b101, 0b0110, 0b0000, 0b000, RwSafe);
235        $macro!(FAR_EL2, 0b11, 0b100, 0b0110, 0b0000, 0b000, RwSafe);
236        $macro!(FAR_EL3, 0b11, 0b110, 0b0110, 0b0000, 0b000, RwSafe);
237        $macro!(FGWTE3_EL3, 0b11, 0b110, 0b0001, 0b0001, 0b101, RwSafe);
238        $macro!(FPCR, 0b11, 0b011, 0b0100, 0b0100, 0b000, RwSafe);
239        $macro!(FPEXC32_EL2, 0b11, 0b100, 0b0101, 0b0011, 0b000, RwSafe);
240        $macro!(FPMR, 0b11, 0b011, 0b0100, 0b0100, 0b010, RwSafe);
241        $macro!(FPSR, 0b11, 0b011, 0b0100, 0b0100, 0b001, RwSafe);
242        $macro!(GCR_EL1, 0b11, 0b000, 0b0001, 0b0000, 0b110, RwSafe);
243        $macro!(GCSCR_EL1, 0b11, 0b000, 0b0010, 0b0101, 0b000, RwSafe);
244        $macro!(GCSCR_EL12, 0b11, 0b101, 0b0010, 0b0101, 0b000, RwSafe);
245        $macro!(GCSCR_EL2, 0b11, 0b100, 0b0010, 0b0101, 0b000, RwSafe);
246        $macro!(GCSCR_EL3, 0b11, 0b110, 0b0010, 0b0101, 0b000, RwSafe);
247        $macro!(GCSCRE0_EL1, 0b11, 0b000, 0b0010, 0b0101, 0b010, RwSafe);
248
249        //
250        // Can change active shadow stack pointer.
251        //
252        $macro!(GCSPR_EL0, 0b11, 0b011, 0b0010, 0b0101, 0b001, RwUnsafe);
253        $macro!(GCSPR_EL1, 0b11, 0b000, 0b0010, 0b0101, 0b001, RwUnsafe);
254        $macro!(GCSPR_EL12, 0b11, 0b101, 0b0010, 0b0101, 0b001, RwUnsafe);
255        $macro!(GCSPR_EL2, 0b11, 0b100, 0b0010, 0b0101, 0b001, RwUnsafe);
256        $macro!(GCSPR_EL3, 0b11, 0b110, 0b0010, 0b0101, 0b001, RwUnsafe);
257
258        $macro!(GMID_EL1, 0b11, 0b001, 0b0000, 0b0000, 0b100, Ro);
259        $macro!(GPCCR_EL3, 0b11, 0b110, 0b0010, 0b0001, 0b110, RwSafe);
260        $macro!(GPTBR_EL3, 0b11, 0b110, 0b0010, 0b0001, 0b100, RwSafe);
261        $macro!(HACDBSBR_EL2, 0b11, 0b100, 0b0010, 0b0011, 0b100, RwSafe);
262        $macro!(HACDBSCONS_EL2, 0b11, 0b100, 0b0010, 0b0011, 0b101, RwSafe);
263        $macro!(HACR_EL2, 0b11, 0b100, 0b0001, 0b0001, 0b111, RwSafe);
264        $macro!(HAFGRTR_EL2, 0b11, 0b100, 0b0011, 0b0001, 0b110, RwSafe);
265
266        //
267        // Safe-writable, since the writer's execution context is not subject
268        // to the related (stage 2) memory mappings.
269        //
270        $macro!(HCR_EL2, 0b11, 0b100, 0b0001, 0b0001, 0b000, RwSafe);
271        $macro!(HCRX_EL2, 0b11, 0b100, 0b0001, 0b0010, 0b010, RwSafe);
272
273        $macro!(HDBSSBR_EL2, 0b11, 0b100, 0b0010, 0b0011, 0b010, RwSafe);
274        $macro!(HDBSSPRoD_EL2, 0b11, 0b100, 0b0010, 0b0011, 0b011, RwSafe);
275        $macro!(HDFGRTR_EL2, 0b11, 0b100, 0b0011, 0b0001, 0b100, RwSafe);
276        $macro!(HDFGRTR2_EL2, 0b11, 0b100, 0b0011, 0b0001, 0b000, RwSafe);
277        $macro!(HDFGWTR_EL2, 0b11, 0b100, 0b0011, 0b0001, 0b101, RwSafe);
278        $macro!(HDFGWTR2_EL2, 0b11, 0b100, 0b0011, 0b0001, 0b001, RwSafe);
279        $macro!(HFGITR_EL2, 0b11, 0b100, 0b0001, 0b0001, 0b110, RwSafe);
280        $macro!(HFGITR2_EL2, 0b11, 0b100, 0b0011, 0b0001, 0b111, RwSafe);
281        $macro!(HFGRTR_EL2, 0b11, 0b100, 0b0001, 0b0001, 0b100, RwSafe);
282        $macro!(HFGRTR2_EL2, 0b11, 0b100, 0b0011, 0b0001, 0b010, RwSafe);
283        $macro!(HFGWTR_EL2, 0b11, 0b100, 0b0001, 0b0001, 0b101, RwSafe);
284        $macro!(HFGWTR2_EL2, 0b11, 0b100, 0b0011, 0b0001, 0b011, RwSafe);
285        $macro!(HPFAR_EL2, 0b11, 0b100, 0b0110, 0b0000, 0b100, RwSafe);
286        $macro!(HSTR_EL2, 0b11, 0b100, 0b0001, 0b0001, 0b011, RwSafe);
287        $macro!(ICC_ASGI1R_EL1, 0b11, 0b000, 0b1100, 0b1011, 0b110, WoSafe);
288        $macro!(ICC_BPR0_EL1, 0b11, 0b000, 0b1100, 0b1000, 0b011, RwSafe);
289        $macro!(ICC_BPR1_EL1, 0b11, 0b000, 0b1100, 0b1100, 0b011, RwSafe);
290        $macro!(ICC_CTLR_EL1, 0b11, 0b000, 0b1100, 0b1100, 0b100, RwSafe);
291        $macro!(ICC_CTLR_EL3, 0b11, 0b110, 0b1100, 0b1100, 0b100, RwSafe);
292        $macro!(ICC_DIR_EL1, 0b11, 0b000, 0b1100, 0b1011, 0b001, WoSafe);
293        $macro!(ICC_EOIR0_EL1, 0b11, 0b000, 0b1100, 0b1000, 0b001, WoSafe);
294        $macro!(ICC_EOIR1_EL1, 0b11, 0b000, 0b1100, 0b1100, 0b001, WoSafe);
295        $macro!(ICC_HPPIR0_EL1, 0b11, 0b000, 0b1100, 0b1000, 0b010, Ro);
296        $macro!(ICC_HPPIR1_EL1, 0b11, 0b000, 0b1100, 0b1100, 0b010, Ro);
297        $macro!(ICC_IAR0_EL1, 0b11, 0b000, 0b1100, 0b1000, 0b000, Ro);
298        $macro!(ICC_IAR1_EL1, 0b11, 0b000, 0b1100, 0b1100, 0b000, Ro);
299        $macro!(ICC_IGRPEN0_EL1, 0b11, 0b000, 0b1100, 0b1100, 0b110, RwSafe);
300        $macro!(ICC_IGRPEN1_EL1, 0b11, 0b000, 0b1100, 0b1100, 0b111, RwSafe);
301        $macro!(ICC_IGRPEN1_EL3, 0b11, 0b110, 0b1100, 0b1100, 0b111, RwSafe);
302        $macro!(ICC_NMIAR1_EL1, 0b11, 0b000, 0b1100, 0b1001, 0b101, Ro);
303        $macro!(ICC_PMR_EL1, 0b11, 0b000, 0b0100, 0b0110, 0b000, RwSafe);
304        $macro!(ICC_RPR_EL1, 0b11, 0b000, 0b1100, 0b1011, 0b011, Ro);
305        $macro!(ICC_SGI0R_EL1, 0b11, 0b000, 0b1100, 0b1011, 0b111, WoSafe);
306        $macro!(ICC_SGI1R_EL1, 0b11, 0b000, 0b1100, 0b1011, 0b101, WoSafe);
307        $macro!(ICC_SRE_EL1, 0b11, 0b000, 0b1100, 0b1100, 0b101, RwSafe);
308        $macro!(ICC_SRE_EL2, 0b11, 0b100, 0b1100, 0b1001, 0b101, RwSafe);
309        $macro!(ICC_SRE_EL3, 0b11, 0b110, 0b1100, 0b1100, 0b101, RwSafe);
310        $macro!(ICH_EISR_EL2, 0b11, 0b100, 0b1100, 0b1011, 0b011, Ro);
311        $macro!(ICH_ELRSR_EL2, 0b11, 0b100, 0b1100, 0b1011, 0b101, Ro);
312        $macro!(ICH_HCR_EL2, 0b11, 0b100, 0b1100, 0b1011, 0b000, RwSafe);
313        $macro!(ICH_MISR_EL2, 0b11, 0b100, 0b1100, 0b1011, 0b010, Ro);
314        $macro!(ICH_VMCR_EL2, 0b11, 0b100, 0b1100, 0b1011, 0b111, RwSafe);
315        $macro!(ICH_VTR_EL2, 0b11, 0b100, 0b1100, 0b1011, 0b001, Ro);
316        $macro!(ID_AA64AFR0_EL1, 0b11, 0b000, 0b0000, 0b0101, 0b100, Ro);
317        $macro!(ID_AA64AFR1_EL1, 0b11, 0b000, 0b0000, 0b0101, 0b101, Ro);
318        $macro!(ID_AA64DFR0_EL1, 0b11, 0b000, 0b0000, 0b0101, 0b000, Ro);
319        $macro!(ID_AA64DFR1_EL1, 0b11, 0b000, 0b0000, 0b0101, 0b001, Ro);
320        $macro!(ID_AA64DFR2_EL1, 0b11, 0b000, 0b0000, 0b0101, 0b010, Ro);
321        $macro!(ID_AA64FPFR0_EL1, 0b11, 0b000, 0b0000, 0b0100, 0b111, Ro);
322        $macro!(ID_AA64ISAR0_EL1, 0b11, 0b000, 0b0000, 0b0110, 0b000, Ro);
323        $macro!(ID_AA64ISAR1_EL1, 0b11, 0b000, 0b0000, 0b0110, 0b001, Ro);
324        $macro!(ID_AA64ISAR2_EL1, 0b11, 0b000, 0b0000, 0b0110, 0b010, Ro);
325        $macro!(ID_AA64ISAR3_EL1, 0b11, 0b000, 0b0000, 0b0110, 0b011, Ro);
326        $macro!(ID_AA64MMFR0_EL1, 0b11, 0b000, 0b0000, 0b0111, 0b000, Ro);
327        $macro!(ID_AA64MMFR1_EL1, 0b11, 0b000, 0b0000, 0b0111, 0b001, Ro);
328        $macro!(ID_AA64MMFR2_EL1, 0b11, 0b000, 0b0000, 0b0111, 0b010, Ro);
329        $macro!(ID_AA64MMFR3_EL1, 0b11, 0b000, 0b0000, 0b0111, 0b011, Ro);
330        $macro!(ID_AA64MMFR4_EL1, 0b11, 0b000, 0b0000, 0b0111, 0b100, Ro);
331        $macro!(ID_AA64PFR0_EL1, 0b11, 0b000, 0b0000, 0b0100, 0b000, Ro);
332        $macro!(ID_AA64PFR1_EL1, 0b11, 0b000, 0b0000, 0b0100, 0b001, Ro);
333        $macro!(ID_AA64PFR2_EL1, 0b11, 0b000, 0b0000, 0b0100, 0b010, Ro);
334        $macro!(ID_AA64SMFR0_EL1, 0b11, 0b000, 0b0000, 0b0100, 0b101, Ro);
335        $macro!(ID_AA64ZFR0_EL1, 0b11, 0b000, 0b0000, 0b0100, 0b100, Ro);
336        $macro!(ID_AFR0_EL1, 0b11, 0b000, 0b0000, 0b0001, 0b011, Ro);
337        $macro!(ID_DFR0_EL1, 0b11, 0b000, 0b0000, 0b0001, 0b010, Ro);
338        $macro!(ID_DFR1_EL1, 0b11, 0b000, 0b0000, 0b0011, 0b101, Ro);
339        $macro!(ID_ISAR0_EL1, 0b11, 0b000, 0b0000, 0b0010, 0b000, Ro);
340        $macro!(ID_ISAR1_EL1, 0b11, 0b000, 0b0000, 0b0010, 0b001, Ro);
341        $macro!(ID_ISAR2_EL1, 0b11, 0b000, 0b0000, 0b0010, 0b010, Ro);
342        $macro!(ID_ISAR3_EL1, 0b11, 0b000, 0b0000, 0b0010, 0b011, Ro);
343        $macro!(ID_ISAR4_EL1, 0b11, 0b000, 0b0000, 0b0010, 0b100, Ro);
344        $macro!(ID_ISAR5_EL1, 0b11, 0b000, 0b0000, 0b0010, 0b101, Ro);
345        $macro!(ID_ISAR6_EL1, 0b11, 0b000, 0b0000, 0b0010, 0b111, Ro);
346        $macro!(ID_MMFR0_EL1, 0b11, 0b000, 0b0000, 0b0001, 0b100, Ro);
347        $macro!(ID_MMFR1_EL1, 0b11, 0b000, 0b0000, 0b0001, 0b101, Ro);
348        $macro!(ID_MMFR2_EL1, 0b11, 0b000, 0b0000, 0b0001, 0b110, Ro);
349        $macro!(ID_MMFR3_EL1, 0b11, 0b000, 0b0000, 0b0001, 0b111, Ro);
350        $macro!(ID_MMFR4_EL1, 0b11, 0b000, 0b0000, 0b0010, 0b110, Ro);
351        $macro!(ID_MMFR5_EL1, 0b11, 0b000, 0b0000, 0b0011, 0b110, Ro);
352        $macro!(ID_PFR0_EL1, 0b11, 0b000, 0b0000, 0b0001, 0b000, Ro);
353        $macro!(ID_PFR1_EL1, 0b11, 0b000, 0b0000, 0b0001, 0b001, Ro);
354        $macro!(ID_PFR2_EL1, 0b11, 0b000, 0b0000, 0b0011, 0b100, Ro);
355        $macro!(IFSR32_EL2, 0b11, 0b100, 0b0101, 0b0000, 0b001, RwSafe);
356        $macro!(ISR_EL1, 0b11, 0b000, 0b1100, 0b0001, 0b000, Ro);
357        $macro!(LORC_EL1, 0b11, 0b000, 0b1010, 0b0100, 0b011, RwSafe);
358        $macro!(LOREA_EL1, 0b11, 0b000, 0b1010, 0b0100, 0b001, RwSafe);
359        $macro!(LORID_EL1, 0b11, 0b000, 0b1010, 0b0100, 0b111, Ro);
360        $macro!(LORN_EL1, 0b11, 0b000, 0b1010, 0b0100, 0b010, RwSafe);
361        $macro!(LORSA_EL1, 0b11, 0b000, 0b1010, 0b0100, 0b000, RwSafe);
362
363        //
364        // Can change cacheability.
365        //
366        $macro!(MAIR_EL1, 0b11, 0b000, 0b1010, 0b0010, 0b000, RwUnsafe);
367        $macro!(MAIR_EL12, 0b11, 0b101, 0b1010, 0b0010, 0b000, RwUnsafe);
368        $macro!(MAIR_EL2, 0b11, 0b100, 0b1010, 0b0010, 0b000, RwUnsafe);
369        $macro!(MAIR_EL3, 0b11, 0b110, 0b1010, 0b0010, 0b000, RwUnsafe);
370        $macro!(MAIR2_EL1, 0b11, 0b000, 0b1010, 0b0010, 0b001, RwUnsafe);
371        $macro!(MAIR2_EL12, 0b11, 0b101, 0b1010, 0b0010, 0b001, RwUnsafe);
372        $macro!(MAIR2_EL2, 0b11, 0b100, 0b1010, 0b0001, 0b001, RwUnsafe);
373        $macro!(MAIR2_EL3, 0b11, 0b110, 0b1010, 0b0001, 0b001, RwUnsafe);
374
375        $macro!(MDCCINT_EL1, 0b10, 0b000, 0b0000, 0b0010, 0b000, RwSafe);
376        $macro!(MDCCSR_EL0, 0b10, 0b011, 0b0000, 0b0001, 0b000, Ro);
377        $macro!(MDCR_EL2, 0b11, 0b100, 0b0001, 0b0001, 0b001, RwSafe);
378        $macro!(MDCR_EL3, 0b11, 0b110, 0b0001, 0b0011, 0b001, RwSafe);
379        $macro!(MDRAR_EL1, 0b10, 0b000, 0b0001, 0b0000, 0b000, Ro);
380        $macro!(MDSCR_EL1, 0b10, 0b000, 0b0000, 0b0010, 0b010, RwSafe);
381        $macro!(MDSELR_EL1, 0b10, 0b000, 0b0000, 0b0100, 0b010, RwSafe);
382        $macro!(MDSTEPOP_EL1, 0b10, 0b000, 0b0000, 0b0101, 0b010, RwSafe);
383        $macro!(MECID_A0_EL2, 0b11, 0b100, 0b1010, 0b1000, 0b001, RwSafe);
384        $macro!(MECID_A1_EL2, 0b11, 0b100, 0b1010, 0b1000, 0b011, RwSafe);
385        $macro!(MECID_P0_EL2, 0b11, 0b100, 0b1010, 0b1000, 0b000, RwSafe);
386        $macro!(MECID_P1_EL2, 0b11, 0b100, 0b1010, 0b1000, 0b010, RwSafe);
387        $macro!(MECID_RL_A_EL3, 0b11, 0b110, 0b1010, 0b1010, 0b001, RwSafe);
388        $macro!(MECIDR_EL2, 0b11, 0b100, 0b1010, 0b1000, 0b111, Ro);
389        $macro!(MFAR_EL3, 0b11, 0b110, 0b0110, 0b0000, 0b101, RwSafe);
390        $macro!(MIDR_EL1, 0b11, 0b000, 0b0000, 0b0000, 0b000, Ro);
391        $macro!(MPAMHCR_EL2, 0b11, 0b100, 0b1010, 0b0100, 0b000, RwSafe);
392        $macro!(MPAMIDR_EL1, 0b11, 0b000, 0b1010, 0b0100, 0b100, Ro);
393        $macro!(MPAMSM_EL1, 0b11, 0b000, 0b1010, 0b0101, 0b011, RwSafe);
394        $macro!(MPAMVPMV_EL2, 0b11, 0b100, 0b1010, 0b0100, 0b001, RwSafe);
395        $macro!(MPAMVPM0_EL2, 0b11, 0b100, 0b1010, 0b0110, 0b000, RwSafe);
396        $macro!(MPAMVPM1_EL2, 0b11, 0b100, 0b1010, 0b0110, 0b001, RwSafe);
397        $macro!(MPAMVPM2_EL2, 0b11, 0b100, 0b1010, 0b0110, 0b010, RwSafe);
398        $macro!(MPAMVPM3_EL2, 0b11, 0b100, 0b1010, 0b0110, 0b011, RwSafe);
399        $macro!(MPAMVPM4_EL2, 0b11, 0b100, 0b1010, 0b0110, 0b100, RwSafe);
400        $macro!(MPAMVPM5_EL2, 0b11, 0b100, 0b1010, 0b0110, 0b101, RwSafe);
401        $macro!(MPAMVPM6_EL2, 0b11, 0b100, 0b1010, 0b0110, 0b110, RwSafe);
402        $macro!(MPAMVPM7_EL2, 0b11, 0b100, 0b1010, 0b0110, 0b111, RwSafe);
403        $macro!(MPAM0_EL1, 0b11, 0b000, 0b1010, 0b0101, 0b001, RwSafe);
404        $macro!(MPAM1_EL1, 0b11, 0b000, 0b1010, 0b0101, 0b000, RwSafe);
405        $macro!(MPAM1_EL12, 0b11, 0b101, 0b1010, 0b0101, 0b000, RwSafe);
406        $macro!(MPAM2_EL2, 0b11, 0b100, 0b1010, 0b0101, 0b000, RwSafe);
407        $macro!(MPAM3_EL3, 0b11, 0b110, 0b1010, 0b0101, 0b000, RwSafe);
408        $macro!(MPIDR_EL1, 0b11, 0b000, 0b0000, 0b0000, 0b101, Ro);
409        $macro!(MVFR0_EL1, 0b11, 0b000, 0b0000, 0b0011, 0b000, Ro);
410        $macro!(MVFR1_EL1, 0b11, 0b000, 0b0000, 0b0011, 0b001, Ro);
411        $macro!(MVFR2_EL1, 0b11, 0b000, 0b0000, 0b0011, 0b010, Ro);
412        $macro!(NZCV, 0b11, 0b011, 0b0100, 0b0010, 0b000, RwSafe);
413        $macro!(OSDLR_EL1, 0b10, 0b000, 0b0001, 0b0011, 0b100, RwSafe);
414        $macro!(OSDTRRX_EL1, 0b10, 0b000, 0b0000, 0b0000, 0b010, RwSafe);
415        $macro!(OSDTRTX_EL1, 0b10, 0b000, 0b0000, 0b0011, 0b010, RwSafe);
416        $macro!(OSECCR_EL1, 0b10, 0b000, 0b0000, 0b0110, 0b010, RwSafe);
417        $macro!(OSLAR_EL1, 0b10, 0b000, 0b0001, 0b0000, 0b100, WoSafe);
418        $macro!(OSLSR_EL1, 0b10, 0b000, 0b0001, 0b0001, 0b100, Ro);
419        $macro!(PAN, 0b11, 0b000, 0b0100, 0b0010, 0b011, RwSafe);
420        $macro!(PAR_EL1, 0b11, 0b000, 0b0111, 0b0100, 0b000, RwSafe);
421        $macro!(PFAR_EL1, 0b11, 0b000, 0b0110, 0b0000, 0b101, RwSafe);
422        $macro!(PFAR_EL12, 0b11, 0b101, 0b0110, 0b0000, 0b101, RwSafe);
423        $macro!(PFAR_EL2, 0b11, 0b100, 0b0110, 0b0000, 0b101, RwSafe);
424        $macro!(PIR_EL1, 0b11, 0b000, 0b1010, 0b0010, 0b011, RwSafe);
425        $macro!(PIR_EL12, 0b11, 0b101, 0b1010, 0b0010, 0b011, RwSafe);
426        $macro!(PIR_EL2, 0b11, 0b100, 0b1010, 0b0010, 0b011, RwSafe);
427        $macro!(PIR_EL3, 0b11, 0b110, 0b1010, 0b0010, 0b011, RwSafe);
428        $macro!(PIRE0_EL1, 0b11, 0b000, 0b1010, 0b0010, 0b010, RwSafe);
429        $macro!(PIRE0_EL12, 0b11, 0b101, 0b1010, 0b0010, 0b010, RwSafe);
430        $macro!(PIRE0_EL2, 0b11, 0b100, 0b1010, 0b0010, 0b010, RwSafe);
431        $macro!(PM, 0b11, 0b000, 0b0100, 0b0011, 0b001, RwSafe);
432        $macro!(PMBIDR_EL1, 0b11, 0b000, 0b1001, 0b1010, 0b111, Ro);
433        $macro!(PMBLIMITR_EL1, 0b11, 0b000, 0b1001, 0b1010, 0b000, RwSafe);
434        $macro!(PMBPTR_EL1, 0b11, 0b000, 0b1001, 0b1010, 0b001, RwSafe);
435        $macro!(PMBSR_EL1, 0b11, 0b000, 0b1001, 0b1010, 0b011, RwSafe);
436        $macro!(PMCCFILTR_EL0, 0b11, 0b011, 0b1110, 0b1111, 0b111, RwSafe);
437        $macro!(PMCCNTR_EL0, 0b11, 0b011, 0b1001, 0b1101, 0b000, RwSafe);
438        $macro!(PMCCNTSVR_EL1, 0b10, 0b000, 0b1110, 0b1011, 0b111, Ro);
439        $macro!(PMCEID0_EL0, 0b11, 0b011, 0b1001, 0b1100, 0b110, Ro);
440        $macro!(PMCEID1_EL0, 0b11, 0b011, 0b1001, 0b1100, 0b111, Ro);
441        $macro!(PMCNTENCLR_EL0, 0b11, 0b011, 0b1001, 0b1100, 0b010, RwSafe);
442        $macro!(PMCNTENSET_EL0, 0b11, 0b011, 0b1001, 0b1100, 0b001, RwSafe);
443        $macro!(PMCR_EL0, 0b11, 0b011, 0b1001, 0b1100, 0b000, RwSafe);
444        $macro!(PMECR_EL1, 0b11, 0b000, 0b1001, 0b1110, 0b101, RwSafe);
445        $macro!(PMIAR_EL1, 0b11, 0b000, 0b1001, 0b1110, 0b111, RwSafe);
446        $macro!(PMICFILTR_EL0, 0b11, 0b011, 0b1001, 0b0110, 0b000, RwSafe);
447        $macro!(PMICNTR_EL0, 0b11, 0b011, 0b1001, 0b0100, 0b000, RwSafe);
448        $macro!(PMICNTSVR_EL1, 0b10, 0b000, 0b1110, 0b1100, 0b000, Ro);
449        $macro!(PMINTENCLR_EL1, 0b11, 0b000, 0b1001, 0b1110, 0b010, RwSafe);
450        $macro!(PMINTENSET_EL1, 0b11, 0b000, 0b1001, 0b1110, 0b001, RwSafe);
451        $macro!(PMMIR_EL1, 0b11, 0b000, 0b1001, 0b1110, 0b110, Ro);
452        $macro!(PMOVSCLR_EL0, 0b11, 0b011, 0b1001, 0b1100, 0b011, RwSafe);
453        $macro!(PMOVSSET_EL0, 0b11, 0b011, 0b1001, 0b1110, 0b011, RwSafe);
454        $macro!(PMSCR_EL1, 0b11, 0b000, 0b1001, 0b1001, 0b000, RwSafe);
455        $macro!(PMSCR_EL12, 0b11, 0b101, 0b1001, 0b1001, 0b000, RwSafe);
456        $macro!(PMSCR_EL2, 0b11, 0b100, 0b1001, 0b1001, 0b000, RwSafe);
457        $macro!(PMSDSFR_EL1, 0b11, 0b000, 0b1001, 0b1010, 0b100, RwSafe);
458        $macro!(PMSELR_EL0, 0b11, 0b011, 0b1001, 0b1100, 0b101, RwSafe);
459        $macro!(PMSEVFR_EL1, 0b11, 0b000, 0b1001, 0b1001, 0b101, RwSafe);
460        $macro!(PMSFCR_EL1, 0b11, 0b000, 0b1001, 0b1001, 0b100, RwSafe);
461        $macro!(PMSICR_EL1, 0b11, 0b000, 0b1001, 0b1001, 0b010, RwSafe);
462        $macro!(PMSIDR_EL1, 0b11, 0b000, 0b1001, 0b1001, 0b111, Ro);
463        $macro!(PMSIRR_EL1, 0b11, 0b000, 0b1001, 0b1001, 0b011, RwSafe);
464        $macro!(PMSLATFR_EL1, 0b11, 0b000, 0b1001, 0b1001, 0b110, RwSafe);
465        $macro!(PMSNEVFR_EL1, 0b11, 0b000, 0b1001, 0b1001, 0b001, RwSafe);
466        $macro!(PMSSCR_EL1, 0b11, 0b000, 0b1001, 0b1101, 0b011, RwSafe);
467        $macro!(PMSWINC_EL0, 0b11, 0b011, 0b1001, 0b1100, 0b100, WoSafe);
468        $macro!(PMUACR_EL1, 0b11, 0b000, 0b1001, 0b1110, 0b100, RwSafe);
469        $macro!(PMUSERENR_EL0, 0b11, 0b011, 0b1001, 0b1110, 0b000, RwSafe);
470        $macro!(PMXEVCNTR_EL0, 0b11, 0b011, 0b1001, 0b1101, 0b010, RwSafe);
471        $macro!(PMXEVTYPER_EL0, 0b11, 0b011, 0b1001, 0b1101, 0b001, RwSafe);
472        $macro!(PMZR_EL0, 0b11, 0b011, 0b1001, 0b1101, 0b100, WoSafe);
473        $macro!(POR_EL0, 0b11, 0b011, 0b1010, 0b0010, 0b100, RwSafe);
474        $macro!(POR_EL1, 0b11, 0b000, 0b1010, 0b0010, 0b100, RwSafe);
475        $macro!(POR_EL12, 0b11, 0b101, 0b1010, 0b0010, 0b100, RwSafe);
476        $macro!(POR_EL2, 0b11, 0b100, 0b1010, 0b0010, 0b100, RwSafe);
477        $macro!(POR_EL3, 0b11, 0b110, 0b1010, 0b0010, 0b100, RwSafe);
478        $macro!(RCWMASK_EL1, 0b11, 0b000, 0b1101, 0b0000, 0b110, RwSafe);
479        $macro!(RCWSMASK_EL1, 0b11, 0b000, 0b1101, 0b0000, 0b011, RwSafe);
480        $macro!(REVIDR_EL1, 0b11, 0b000, 0b0000, 0b0000, 0b110, Ro);
481        $macro!(RGSR_EL1, 0b11, 0b000, 0b0001, 0b0000, 0b101, RwSafe);
482        $macro!(RMR_EL1, 0b11, 0b000, 0b1100, 0b0000, 0b010, RwSafe);
483        $macro!(RMR_EL2, 0b11, 0b100, 0b1100, 0b0000, 0b010, RwSafe);
484        $macro!(RMR_EL3, 0b11, 0b110, 0b1100, 0b0000, 0b010, RwSafe);
485        $macro!(RNDR, 0b11, 0b011, 0b0010, 0b0100, 0b000, Ro);
486        $macro!(RNDRRS, 0b11, 0b011, 0b0010, 0b0100, 0b001, Ro);
487        $macro!(RVBAR_EL1, 0b11, 0b000, 0b1100, 0b0000, 0b001, Ro);
488        $macro!(RVBAR_EL2, 0b11, 0b100, 0b1100, 0b0000, 0b001, Ro);
489        $macro!(RVBAR_EL3, 0b11, 0b110, 0b1100, 0b0000, 0b001, Ro);
490        $macro!(SCR_EL3, 0b11, 0b110, 0b0001, 0b0001, 0b000, RwSafe);
491
492        //
493        // Can disable paging, and change cache coherency and memory ordering semantics.
494        //
495        $macro!(SCTLR_EL1, 0b11, 0b000, 0b0001, 0b0000, 0b000, RwUnsafe);
496        $macro!(SCTLR_EL12, 0b11, 0b101, 0b0001, 0b0000, 0b000, RwUnsafe);
497        $macro!(SCTLR_EL2, 0b11, 0b100, 0b0001, 0b0000, 0b000, RwUnsafe);
498        $macro!(SCTLR_EL3, 0b11, 0b110, 0b0001, 0b0000, 0b000, RwUnsafe);
499        $macro!(SCTLR2_EL1, 0b11, 0b000, 0b0001, 0b0000, 0b011, RwUnsafe);
500        $macro!(SCTLR2_EL12, 0b11, 0b101, 0b0001, 0b0000, 0b011, RwUnsafe);
501        $macro!(SCTLR2_EL2, 0b11, 0b100, 0b0001, 0b0000, 0b011, RwUnsafe);
502        $macro!(SCTLR2_EL3, 0b11, 0b110, 0b0001, 0b0000, 0b011, RwUnsafe);
503
504        $macro!(SCXTNUM_EL0, 0b11, 0b011, 0b1101, 0b0000, 0b111, RwSafe);
505        $macro!(SCXTNUM_EL1, 0b11, 0b000, 0b1101, 0b0000, 0b111, RwSafe);
506        $macro!(SCXTNUM_EL12, 0b11, 0b101, 0b1101, 0b0000, 0b111, RwSafe);
507        $macro!(SCXTNUM_EL2, 0b11, 0b100, 0b1101, 0b0000, 0b111, RwSafe);
508        $macro!(SCXTNUM_EL3, 0b11, 0b110, 0b1101, 0b0000, 0b111, RwSafe);
509        $macro!(SDER32_EL2, 0b11, 0b100, 0b0001, 0b0011, 0b001, RwSafe);
510        $macro!(SDER32_EL3, 0b11, 0b110, 0b0001, 0b0001, 0b001, RwSafe);
511        $macro!(SMCR_EL1, 0b11, 0b000, 0b0001, 0b0010, 0b110, RwSafe);
512        $macro!(SMCR_EL12, 0b11, 0b101, 0b0001, 0b0010, 0b110, RwSafe);
513        $macro!(SMCR_EL2, 0b11, 0b100, 0b0001, 0b0010, 0b110, RwSafe);
514        $macro!(SMCR_EL3, 0b11, 0b110, 0b0001, 0b0010, 0b110, RwSafe);
515        $macro!(SMIDR_EL1, 0b11, 0b001, 0b0000, 0b0000, 0b110, Ro);
516        $macro!(SMPRI_EL1, 0b11, 0b000, 0b0001, 0b0010, 0b100, RwSafe);
517        $macro!(SMPRIMAP_EL2, 0b11, 0b100, 0b0001, 0b0010, 0b101, RwSafe);
518
519        //
520        // Can change active stack pointer, corrupting stack frames.
521        //
522        $macro!(SP_EL0, 0b11, 0b000, 0b0100, 0b0001, 0b000, RwUnsafe);
523        $macro!(SP_EL1, 0b11, 0b100, 0b0100, 0b0001, 0b000, RwUnsafe);
524        $macro!(SP_EL2, 0b11, 0b110, 0b0100, 0b0001, 0b000, RwUnsafe);
525
526        $macro!(SPMACCESSR_EL1, 0b10, 0b000, 0b1001, 0b1101, 0b011, RwSafe);
527        $macro!(SPMACCESSR_EL12, 0b10, 0b101, 0b1001, 0b1101, 0b011, RwSafe);
528        $macro!(SPMACCESSR_EL2, 0b10, 0b100, 0b1001, 0b1101, 0b011, RwSafe);
529        $macro!(SPMACCESSR_EL3, 0b10, 0b110, 0b1001, 0b1101, 0b011, RwSafe);
530        $macro!(SPMCFGR_EL1, 0b10, 0b000, 0b1001, 0b1101, 0b111, Ro);
531        $macro!(SPMCNTENCLR_EL0, 0b10, 0b011, 0b1001, 0b1100, 0b010, RwSafe);
532        $macro!(SPMCNTENSET_EL0, 0b10, 0b011, 0b1001, 0b1100, 0b001, RwSafe);
533        $macro!(SPMCR_EL0, 0b10, 0b011, 0b1001, 0b1100, 0b000, RwSafe);
534        $macro!(SPMDEVAFF_EL1, 0b10, 0b000, 0b1001, 0b1101, 0b110, Ro);
535        $macro!(SPMDEVARCH_EL1, 0b10, 0b000, 0b1001, 0b1101, 0b101, Ro);
536        $macro!(SPMIIDR_EL1, 0b10, 0b000, 0b1001, 0b1101, 0b100, Ro);
537        $macro!(SPMINTENCLR_EL1, 0b10, 0b000, 0b1001, 0b1110, 0b010, RwSafe);
538        $macro!(SPMINTENSET_EL1, 0b10, 0b000, 0b1001, 0b1110, 0b001, RwSafe);
539        $macro!(SPMOVSCLR_EL0, 0b10, 0b011, 0b1001, 0b1100, 0b011, RwSafe);
540        $macro!(SPMOVSSET_EL0, 0b10, 0b011, 0b1001, 0b1110, 0b011, RwSafe);
541        $macro!(SPMRoOTCR_EL3, 0b10, 0b110, 0b1001, 0b1110, 0b111, RwSafe);
542        $macro!(SPMSCR_EL1, 0b10, 0b111, 0b1001, 0b1110, 0b111, RwSafe);
543        $macro!(SPMSELR_EL0, 0b10, 0b011, 0b1001, 0b1100, 0b101, RwSafe);
544        $macro!(SPMZR_EL0, 0b10, 0b011, 0b1001, 0b1100, 0b100, WoSafe);
545
546        //
547        // Can change saved execution state restored on return.
548        //
549        $macro!(SPSR_EL1, 0b11, 0b000, 0b0100, 0b0000, 0b000, RwUnsafe);
550        $macro!(SPSR_EL12, 0b11, 0b101, 0b0100, 0b0000, 0b000, RwUnsafe);
551        $macro!(SPSR_EL2, 0b11, 0b100, 0b0100, 0b0000, 0b000, RwUnsafe);
552        $macro!(SPSR_EL3, 0b11, 0b110, 0b0100, 0b0000, 0b000, RwUnsafe);
553        $macro!(SPSR_abt, 0b11, 0b100, 0b0100, 0b0011, 0b001, RwUnsafe);
554        $macro!(SPSR_fiq, 0b11, 0b100, 0b0100, 0b0011, 0b011, RwUnsafe);
555        $macro!(SPSR_irq, 0b11, 0b100, 0b0100, 0b0011, 0b000, RwUnsafe);
556        $macro!(SPSR_und, 0b11, 0b100, 0b0100, 0b0011, 0b010, RwUnsafe);
557
558        // Can change active stack pointer, corrupting stack frames.
559        $macro!(SPSel, 0b11, 0b000, 0b0100, 0b0010, 0b000, RwUnsafe);
560
561        $macro!(SSBS, 0b11, 0b011, 0b0100, 0b0010, 0b110, RwSafe);
562        $macro!(SVCR, 0b11, 0b011, 0b0100, 0b0010, 0b010, RwSafe);
563        $macro!(S2PIR_EL2, 0b11, 0b100, 0b1010, 0b0010, 0b101, RwSafe);
564        $macro!(S2POR_EL1, 0b11, 0b000, 0b1010, 0b0010, 0b101, RwSafe);
565        $macro!(TCO, 0b11, 0b011, 0b0100, 0b0010, 0b111, RwSafe);
566
567        //
568        // Can change address bounds and translation walk attributes.
569        //
570        $macro!(TCR_EL1, 0b11, 0b000, 0b0010, 0b0000, 0b010, RwUnsafe);
571        $macro!(TCR_EL12, 0b11, 0b101, 0b0010, 0b0000, 0b010, RwUnsafe);
572        $macro!(TCR_EL2, 0b11, 0b100, 0b0010, 0b0000, 0b010, RwUnsafe);
573        $macro!(TCR_EL3, 0b11, 0b110, 0b0010, 0b0000, 0b010, RwUnsafe);
574        $macro!(TCR2_EL1, 0b11, 0b000, 0b0010, 0b0000, 0b011, RwUnsafe);
575        $macro!(TCR2_EL12, 0b11, 0b101, 0b0010, 0b0000, 0b011, RwUnsafe);
576        $macro!(TCR2_EL2, 0b11, 0b100, 0b0010, 0b0000, 0b011, RwUnsafe);
577
578        $macro!(TFSR_EL1, 0b11, 0b000, 0b0101, 0b0110, 0b000, RwSafe);
579        $macro!(TFSR_EL12, 0b11, 0b101, 0b0101, 0b0110, 0b000, RwSafe);
580        $macro!(TFSR_EL2, 0b11, 0b100, 0b0101, 0b0110, 0b000, RwSafe);
581        $macro!(TFSR_EL3, 0b11, 0b110, 0b0101, 0b0110, 0b000, RwSafe);
582        $macro!(TFSRE0_EL1, 0b11, 0b000, 0b0101, 0b0110, 0b001, RwSafe);
583        $macro!(TPIDR_EL0, 0b11, 0b011, 0b1101, 0b0000, 0b010, RwSafe);
584        $macro!(TPIDR_EL1, 0b11, 0b000, 0b1101, 0b0000, 0b100, RwSafe);
585        $macro!(TPIDR_EL2, 0b11, 0b100, 0b1101, 0b0000, 0b010, RwSafe);
586        $macro!(TPIDR_EL3, 0b11, 0b110, 0b1101, 0b0000, 0b010, RwSafe);
587        $macro!(TPIDRRo_EL0, 0b11, 0b011, 0b1101, 0b0000, 0b011, RwSafe);
588        $macro!(TPIDR2_EL0, 0b11, 0b011, 0b1101, 0b0000, 0b101, RwSafe);
589        $macro!(TRBBASER_EL1, 0b11, 0b000, 0b1001, 0b1011, 0b010, RwSafe);
590        $macro!(TRBIDR_EL1, 0b11, 0b000, 0b1001, 0b1011, 0b111, Ro);
591        $macro!(TRBLIMITR_EL1, 0b11, 0b000, 0b1001, 0b1011, 0b000, RwSafe);
592        $macro!(TRBMAR_EL1, 0b11, 0b000, 0b1001, 0b1011, 0b100, RwSafe);
593        $macro!(TRBMPAM_EL1, 0b11, 0b000, 0b1001, 0b1011, 0b101, RwSafe);
594        $macro!(TRBPTR_EL1, 0b11, 0b000, 0b1001, 0b1011, 0b001, RwSafe);
595        $macro!(TRBSR_EL1, 0b11, 0b000, 0b1001, 0b1011, 0b011, RwSafe);
596        $macro!(TRBTRG_EL1, 0b11, 0b000, 0b1001, 0b1011, 0b110, RwSafe);
597        $macro!(TRCAUTHSTATUS, 0b10, 0b001, 0b0111, 0b1110, 0b110, Ro);
598        $macro!(TRCAUXCTLR, 0b10, 0b001, 0b0000, 0b0110, 0b000, RwSafe);
599        $macro!(TRCBBCTLR, 0b10, 0b001, 0b0000, 0b1111, 0b000, RwSafe);
600        $macro!(TRCCCCTLR, 0b10, 0b001, 0b0000, 0b1110, 0b000, RwSafe);
601        $macro!(TRCCIDCCTLR0, 0b10, 0b001, 0b0011, 0b0000, 0b010, RwSafe);
602        $macro!(TRCCIDCCTLR1, 0b10, 0b001, 0b0011, 0b0001, 0b010, RwSafe);
603        $macro!(TRCCLAIMCLR, 0b10, 0b001, 0b0111, 0b1001, 0b110, RwSafe);
604        $macro!(TRCCLAIMSET, 0b10, 0b001, 0b0111, 0b1000, 0b110, RwSafe);
605        $macro!(TRCCONFIGR, 0b10, 0b001, 0b0000, 0b0100, 0b000, RwSafe);
606        $macro!(TRCDEVARCH, 0b10, 0b001, 0b0111, 0b1111, 0b110, Ro);
607        $macro!(TRCDEVID, 0b10, 0b001, 0b0111, 0b0010, 0b111, Ro);
608        $macro!(TRCEVENTCTL0R, 0b10, 0b001, 0b0000, 0b1000, 0b000, RwSafe);
609        $macro!(TRCEVENTCTL1R, 0b10, 0b001, 0b0000, 0b1001, 0b000, RwSafe);
610        $macro!(TRCIDR0, 0b10, 0b001, 0b0000, 0b1000, 0b111, Ro);
611        $macro!(TRCIDR1, 0b10, 0b001, 0b0000, 0b1001, 0b111, Ro);
612        $macro!(TRCIDR10, 0b10, 0b001, 0b0000, 0b0010, 0b110, Ro);
613        $macro!(TRCIDR11, 0b10, 0b001, 0b0000, 0b0011, 0b110, Ro);
614        $macro!(TRCIDR12, 0b10, 0b001, 0b0000, 0b0100, 0b110, Ro);
615        $macro!(TRCIDR13, 0b10, 0b001, 0b0000, 0b0101, 0b110, Ro);
616        $macro!(TRCIDR2, 0b10, 0b001, 0b0000, 0b1010, 0b111, Ro);
617        $macro!(TRCIDR3, 0b10, 0b001, 0b0000, 0b1011, 0b111, Ro);
618        $macro!(TRCIDR4, 0b10, 0b001, 0b0000, 0b1100, 0b111, Ro);
619        $macro!(TRCIDR5, 0b10, 0b001, 0b0000, 0b1101, 0b111, Ro);
620        $macro!(TRCIDR6, 0b10, 0b001, 0b0000, 0b1110, 0b111, Ro);
621        $macro!(TRCIDR7, 0b10, 0b001, 0b0000, 0b1111, 0b111, Ro);
622        $macro!(TRCIDR8, 0b10, 0b001, 0b0000, 0b0000, 0b110, Ro);
623        $macro!(TRCIDR9, 0b10, 0b001, 0b0000, 0b0001, 0b110, Ro);
624        $macro!(TRCIMSPEC0, 0b10, 0b001, 0b0000, 0b0000, 0b111, RwSafe);
625        $macro!(TRCITECR_EL1, 0b11, 0b000, 0b0001, 0b0010, 0b011, RwSafe);
626        $macro!(TRCITECR_EL12, 0b11, 0b101, 0b0001, 0b0010, 0b011, RwSafe);
627        $macro!(TRCITECR_EL2, 0b11, 0b100, 0b0001, 0b0010, 0b011, RwSafe);
628        $macro!(TRCITEEDCR, 0b10, 0b001, 0b0000, 0b0010, 0b001, RwSafe);
629        $macro!(TRCOSLSR, 0b10, 0b001, 0b0001, 0b0001, 0b100, Ro);
630        $macro!(TRCPRGCTLR, 0b10, 0b001, 0b0000, 0b0001, 0b000, RwSafe);
631        $macro!(TRCQCTLR, 0b10, 0b001, 0b0000, 0b0001, 0b001, RwSafe);
632        $macro!(TRCRSR, 0b10, 0b001, 0b0000, 0b1010, 0b000, RwSafe);
633        $macro!(TRCSEQRSTEVR, 0b10, 0b001, 0b0000, 0b0110, 0b100, RwSafe);
634        $macro!(TRCSEQSTR, 0b10, 0b001, 0b0000, 0b0111, 0b100, RwSafe);
635        $macro!(TRCSTALLCTLR, 0b10, 0b001, 0b0000, 0b1011, 0b000, RwSafe);
636        $macro!(TRCSTATR, 0b10, 0b001, 0b0000, 0b0011, 0b000, Ro);
637        $macro!(TRCSYNCPR, 0b10, 0b001, 0b0000, 0b1101, 0b000, RwSafe);
638        $macro!(TRCTRACEIDR, 0b10, 0b001, 0b0000, 0b0000, 0b001, RwSafe);
639        $macro!(TRCTSCTLR, 0b10, 0b001, 0b0000, 0b1100, 0b000, RwSafe);
640        $macro!(TRCVICTLR, 0b10, 0b001, 0b0000, 0b0000, 0b010, RwSafe);
641        $macro!(TRCVIIECTLR, 0b10, 0b001, 0b0000, 0b0001, 0b010, RwSafe);
642        $macro!(TRCVIPCSSCTLR, 0b10, 0b001, 0b0000, 0b0011, 0b010, RwSafe);
643        $macro!(TRCVISSCTLR, 0b10, 0b001, 0b0000, 0b0010, 0b010, RwSafe);
644        $macro!(TRCVMIDCCTLR0, 0b10, 0b001, 0b0011, 0b0010, 0b010, RwSafe);
645        $macro!(TRCVMIDCCTLR1, 0b10, 0b001, 0b0011, 0b0011, 0b010, RwSafe);
646        $macro!(TRFCR_EL1, 0b11, 0b000, 0b0001, 0b0010, 0b001, RwSafe);
647        $macro!(TRFCR_EL12, 0b11, 0b101, 0b0001, 0b0010, 0b001, RwSafe);
648        $macro!(TRFCR_EL2, 0b11, 0b100, 0b0001, 0b0010, 0b001, RwSafe);
649
650        //
651        // Can change memory mappings.
652        //
653        $macro!(TTBR0_EL1, 0b11, 0b000, 0b0010, 0b0000, 0b000, RwUnsafe);
654        $macro!(TTBR0_EL12, 0b11, 0b101, 0b0010, 0b0000, 0b000, RwUnsafe);
655        $macro!(TTBR0_EL2, 0b11, 0b100, 0b0010, 0b0000, 0b000, RwUnsafe);
656        $macro!(TTBR0_EL3, 0b11, 0b110, 0b0010, 0b0000, 0b000, RwUnsafe);
657        $macro!(TTBR1_EL1, 0b11, 0b000, 0b0010, 0b0000, 0b001, RwUnsafe);
658        $macro!(TTBR1_EL12, 0b11, 0b101, 0b0010, 0b0000, 0b001, RwUnsafe);
659        $macro!(TTBR1_EL2, 0b11, 0b100, 0b0010, 0b0000, 0b001, RwUnsafe);
660
661        $macro!(UAO, 0b11, 0b000, 0b0100, 0b0010, 0b100, RwSafe);
662        $macro!(VBAR_EL1, 0b11, 0b000, 0b1100, 0b0000, 0b000, RwSafe);
663        $macro!(VBAR_EL12, 0b11, 0b101, 0b1100, 0b0000, 0b000, RwSafe);
664        $macro!(VBAR_EL2, 0b11, 0b100, 0b1100, 0b0000, 0b000, RwSafe);
665        $macro!(VBAR_EL3, 0b11, 0b110, 0b1100, 0b0000, 0b000, RwSafe);
666        $macro!(VDISR_EL2, 0b11, 0b100, 0b1100, 0b0001, 0b001, RwSafe);
667        $macro!(VDISR_EL3, 0b11, 0b110, 0b1100, 0b0001, 0b001, RwSafe);
668        $macro!(VMECID_A_EL2, 0b11, 0b100, 0b1010, 0b1001, 0b001, RwSafe);
669        $macro!(VMECID_P_EL2, 0b11, 0b100, 0b1010, 0b1001, 0b000, RwSafe);
670        $macro!(VMPIDR_EL2, 0b11, 0b100, 0b0000, 0b0000, 0b101, RwSafe);
671
672        // Safe-writable, since the writer's execution context is not subject to
673        // the VNCR page.
674        $macro!(VNCR_EL2, 0b11, 0b100, 0b0010, 0b0010, 0b000, RwSafe);
675
676        $macro!(VPIDR_EL2, 0b11, 0b100, 0b0000, 0b0000, 0b000, RwSafe);
677        $macro!(VSESR_EL2, 0b11, 0b100, 0b0101, 0b0010, 0b011, RwSafe);
678        $macro!(VSESR_EL3, 0b11, 0b110, 0b0101, 0b0010, 0b011, RwSafe);
679
680        // Safe-writable, since the writer's execution context is not subject to
681        // the related (stage 2) memory mappings.
682        $macro!(VSTCR_EL2, 0b11, 0b100, 0b0010, 0b0110, 0b010, RwSafe);
683
684        $macro!(VSTTBR_EL2, 0b11, 0b100, 0b0010, 0b0110, 0b000, RwSafe);
685        $macro!(VTCR_EL2, 0b11, 0b100, 0b0010, 0b0001, 0b010, RwSafe);
686        $macro!(VTTBR_EL2, 0b11, 0b100, 0b0010, 0b0001, 0b000, RwSafe);
687        $macro!(ZCR_EL1, 0b11, 0b000, 0b0001, 0b0010, 0b000, RwSafe);
688        $macro!(ZCR_EL12, 0b11, 0b101, 0b0001, 0b0010, 0b000, RwSafe);
689        $macro!(ZCR_EL2, 0b11, 0b100, 0b0001, 0b0010, 0b000, RwSafe);
690        $macro!(ZCR_EL3, 0b11, 0b110, 0b0001, 0b0010, 0b000, RwSafe);
691    };
692}
693
694macro_rules! define_spec {
695    ($mnemonic:ident, $op0:literal, $op1:literal, $crn:literal, $crm:literal, $op2:literal, $access:ty) => {
696        pub type $mnemonic = SysRegSpec<$op0, $op1, $crn, $crm, $op2, $access>;
697    };
698}
699
700for_each_spec!(define_spec);