1 /* $NetBSD: armreg.h,v 1.67 2025/02/27 08:39:54 andvar Exp $ */
2 
3 /*-
4  * Copyright (c) 2014 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Matt Thomas of 3am Software Foundry.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #ifndef _AARCH64_ARMREG_H_
33 #define _AARCH64_ARMREG_H_
34 
35 #include <arm/cputypes.h>
36 #include <sys/types.h>
37 
38 #ifdef __clang__
39 #define ATTR_ARCH(arch)                           ".arch " arch ";"
40 #define ATTR_TARGET_ARCH(x)
41 #define ASM_ARCH(x)                     x
42 #else
43 #define ATTR_ARCH(arch)                           __attribute__((target("arch=" arch)))
44 #define ATTR_TARGET_ARCH(x)             x
45 #define ASM_ARCH(x)
46 #endif
47 
48 #define AARCH64REG_READ_INLINE3(regname, regdesc, arch)               \
49 static __inline uint64_t ATTR_TARGET_ARCH(arch)                       \
50 reg_##regname##_read(void)                                            \
51 {                                                                               \
52           uint64_t __rv;                                                        \
53           __asm __volatile(                                           \
54               ASM_ARCH(arch)                                          \
55               "mrs %0, " #regdesc : "=r"(__rv)                        \
56           );                                                                    \
57           return __rv;                                                          \
58 }
59 
60 #define AARCH64REG_READ_INLINE2(regname, regdesc)           \
61           AARCH64REG_READ_INLINE3(regname, regdesc, )
62 
63 #define AARCH64REG_WRITE_INLINE3(regname, regdesc, arch)    \
64 static __inline void ATTR_TARGET_ARCH(arch)                           \
65 reg_##regname##_write(uint64_t __val)                                 \
66 {                                                                               \
67           __asm __volatile(                                           \
68               ASM_ARCH(arch)                                          \
69               "msr " #regdesc ", %0" :: "r"(__val) : "memory"         \
70           );                                                                    \
71 }
72 
73 #define AARCH64REG_WRITE_INLINE2(regname, regdesc)                    \
74           AARCH64REG_WRITE_INLINE3(regname, regdesc, )
75 
76 #define AARCH64REG_WRITEIMM_INLINE2(regname, regdesc)                 \
77 static __inline void __always_inline                                  \
78 reg_##regname##_write(const uint64_t __val)                           \
79 {                                                                               \
80           __asm __volatile(                                           \
81               "msr " #regdesc ", %0" :: "n"(__val) : "memory"         \
82           );                                                                    \
83 }
84 
85 #define AARCH64REG_READ_INLINE(regname)                               \
86           AARCH64REG_READ_INLINE2(regname, regname)
87 
88 #define AARCH64REG_WRITE_INLINE(regname)                              \
89           AARCH64REG_WRITE_INLINE2(regname, regname)
90 
91 #define AARCH64REG_WRITEIMM_INLINE(regname)                           \
92           AARCH64REG_WRITEIMM_INLINE2(regname, regname)
93 
94 #define AARCH64REG_READWRITE_INLINE2(regname, regdesc)                \
95           AARCH64REG_READ_INLINE2(regname, regdesc)                   \
96           AARCH64REG_WRITE_INLINE2(regname, regdesc)
97 
98 #define AARCH64REG_ATWRITE_INLINE2(regname, regdesc)                  \
99 static __inline void                                                            \
100 reg_##regname##_write(uint64_t __val)                                 \
101 {                                                                               \
102           __asm __volatile(                                           \
103               "at " #regdesc ", %0" :: "r"(__val) : "memory"          \
104           );                                                                    \
105 }
106 
107 #define AARCH64REG_ATWRITE_INLINE(regname)                            \
108           AARCH64REG_ATWRITE_INLINE2(regname, regname)
109 
110 /*
111  * System registers available at EL0 (user)
112  */
113 AARCH64REG_READ_INLINE(ctr_el0)                   // Cache Type Register
114 
115 #define   CTR_EL0_TMIN_LINE   __BITS(37,32)       // Tag MIN LINE size
116 #define   CTR_EL0_DIC                   __BIT(29) // Instruction cache requirement
117 #define   CTR_EL0_IDC                   __BIT(28) // Data Cache clean requirement
118 #define   CTR_EL0_CWG_LINE    __BITS(27,24)       // Cacheback Writeback Granule
119 #define   CTR_EL0_ERG_LINE    __BITS(23,20)       // Exclusives Reservation Granule
120 #define   CTR_EL0_DMIN_LINE   __BITS(19,16)       // Dcache MIN LINE size (log2 - 2)
121 #define   CTR_EL0_L1IP_MASK   __BITS(15,14)
122 #define    CTR_EL0_L1IP_VPIPT 0                   //  VMID-aware Physical Index, Physical Tag
123 #define    CTR_EL0_L1IP_AIVIVT          1                   //  ASID-tagged Virtual Index, Virtual Tag
124 #define    CTR_EL0_L1IP_VIPT  2                   //  Virtual Index, Physical Tag
125 #define    CTR_EL0_L1IP_PIPT  3                   //  Physical Index, Physical Tag
126 #define   CTR_EL0_IMIN_LINE   __BITS(3,0)         // Icache MIN LINE size (log2 - 2)
127 
AARCH64REG_READ_INLINE(dczid_el0)128 AARCH64REG_READ_INLINE(dczid_el0)       // Data Cache Zero ID Register
129 
130 #define   DCZID_DZP           __BIT(4)  // Data Zero Prohibited
131 #define   DCZID_BS            __BITS(3,0)         // Block Size (log2 - 2)
132 
133 AARCH64REG_READ_INLINE(fpcr)            // Floating Point Control Register
134 AARCH64REG_WRITE_INLINE(fpcr)
135 
136 #define   FPCR_AHP            __BIT(26) // Alternative Half Precision
137 #define   FPCR_DN                       __BIT(25) // Default Nan Control
138 #define   FPCR_FZ                       __BIT(24) // Flush-To-Zero
139 #define   FPCR_RMODE                    __BITS(23,22)       // Rounding Mode
140 #define    FPCR_RN            0                   //  Round Nearest
141 #define    FPCR_RP            1                   //  Round towards Plus infinity
142 #define    FPCR_RM            2                   //  Round towards Minus infinity
143 #define    FPCR_RZ            3                   //  Round towards Zero
144 #define   FPCR_STRIDE                   __BITS(21,20)
145 #define   FPCR_FZ16           __BIT(19) // Flush-To-Zero for FP16
146 #define   FPCR_LEN            __BITS(18,16)
147 #define   FPCR_IDE            __BIT(15) // Input Denormal Exception enable
148 #define   FPCR_IXE            __BIT(12) // IneXact Exception enable
149 #define   FPCR_UFE            __BIT(11) // UnderFlow Exception enable
150 #define   FPCR_OFE            __BIT(10) // OverFlow Exception enable
151 #define   FPCR_DZE            __BIT(9)  // Divide by Zero Exception enable
152 #define   FPCR_IOE            __BIT(8)  // Invalid Operation Exception enable
153 #define   FPCR_ESUM           0x1F00
154 
155 AARCH64REG_READ_INLINE(fpsr)            // Floating Point Status Register
156 AARCH64REG_WRITE_INLINE(fpsr)
157 
158 #define   FPSR_N32            __BIT(31) // AARCH32 Negative
159 #define   FPSR_Z32            __BIT(30) // AARCH32 Zero
160 #define   FPSR_C32            __BIT(29) // AARCH32 Carry
161 #define   FPSR_V32            __BIT(28) // AARCH32 Overflow
162 #define   FPSR_QC                       __BIT(27) // SIMD Saturation
163 #define   FPSR_IDC            __BIT(7)  // Input Denormal Cumulative status
164 #define   FPSR_IXC            __BIT(4)  // IneXact Cumulative status
165 #define   FPSR_UFC            __BIT(3)  // UnderFlow Cumulative status
166 #define   FPSR_OFC            __BIT(2)  // OverFlow Cumulative status
167 #define   FPSR_DZC            __BIT(1)  // Divide by Zero Cumulative status
168 #define   FPSR_IOC            __BIT(0)  // Invalid Operation Cumulative status
169 #define   FPSR_CSUM           0x1F
170 
171 AARCH64REG_READ_INLINE(nzcv)            // condition codes
172 AARCH64REG_WRITE_INLINE(nzcv)
173 
174 #define   NZCV_N                        __BIT(31) // Negative
175 #define   NZCV_Z                        __BIT(30) // Zero
176 #define   NZCV_C                        __BIT(29) // Carry
177 #define   NZCV_V                        __BIT(28) // Overflow
178 
179 AARCH64REG_READ_INLINE(tpidr_el0)       // Thread Pointer ID Register (RW)
180 AARCH64REG_WRITE_INLINE(tpidr_el0)
181 
182 AARCH64REG_READ_INLINE(tpidrro_el0)     // Thread Pointer ID Register (RO)
183 
184 /*
185  * From here on, these can only be accessed at EL1 (kernel)
186  */
187 
188 /*
189  * These are readonly registers
190  */
191 AARCH64REG_READ_INLINE(aidr_el1)
192 
193 AARCH64REG_READ_INLINE2(cbar_el1, s3_1_c15_c3_0)  // Cortex-A57
194 
195 #define   CBAR_PA                       __BITS(47,18)
196 
197 AARCH64REG_READ_INLINE(ccsidr_el1)
198 
199 /* 32bit format CCSIDR_EL1 */
200 #define   CCSIDR_WT           __BIT(31) // OBSOLETE: Write-through supported
201 #define   CCSIDR_WB           __BIT(30) // OBSOLETE: Write-back supported
202 #define   CCSIDR_RA           __BIT(29) // OBSOLETE: Read-allocation supported
203 #define   CCSIDR_WA           __BIT(28) // OBSOLETE: Write-allocation supported
204 #define   CCSIDR_NUMSET                 __BITS(27,13)       // (Number of sets in cache) - 1
205 #define   CCSIDR_ASSOC                  __BITS(12,3)        // (Associativity of cache) - 1
206 #define   CCSIDR_LINESIZE     __BITS(2,0)         // Number of bytes in cache line
207 
208 /* 64bit format CCSIDR_EL1 (ARMv8.3-CCIDX is implemented) */
209 #define   CCSIDR64_NUMSET               __BITS(55,32)       // (Number of sets in cache) - 1
210 #define   CCSIDR64_ASSOC                __BITS(23,3)        // (Associativity of cache) - 1
211 #define   CCSIDR64_LINESIZE   __BITS(2,0)         // Number of bytes in cache line
212 
213 AARCH64REG_READ_INLINE(clidr_el1)
214 
215 #define   CLIDR_ICB           __BITS(32,30)       // Inner cache boundary
216 #define   CLIDR_LOUU                    __BITS(29,27)       // Level of Unification Uniprocessor
217 #define   CLIDR_LOC           __BITS(26,24)       // Level of Coherency
218 #define   CLIDR_LOUIS                   __BITS(23,21)       // Level of Unification InnerShareable*/
219 #define   CLIDR_CTYPE7                  __BITS(20,18)       // Cache Type field for level7
220 #define   CLIDR_CTYPE6                  __BITS(17,15)       // Cache Type field for level6
221 #define   CLIDR_CTYPE5                  __BITS(14,12)       // Cache Type field for level5
222 #define   CLIDR_CTYPE4                  __BITS(11,9)        // Cache Type field for level4
223 #define   CLIDR_CTYPE3                  __BITS(8,6)         // Cache Type field for level3
224 #define   CLIDR_CTYPE2                  __BITS(5,3)         // Cache Type field for level2
225 #define   CLIDR_CTYPE1                  __BITS(2,0)         // Cache Type field for level1
226 #define    CLIDR_TYPE_NOCACHE  0                  //  No cache
227 #define    CLIDR_TYPE_ICACHE   1                  //  Instruction cache only
228 #define    CLIDR_TYPE_DCACHE   2                  //  Data cache only
229 #define    CLIDR_TYPE_IDCACHE  3                  //  Separate inst and data caches
230 #define    CLIDR_TYPE_UNIFIEDCACHE 4              //  Unified cache
231 
232 AARCH64REG_READ_INLINE(contextidr_el1)
233 AARCH64REG_WRITE_INLINE(contextidr_el1)
234 
235 AARCH64REG_READ_INLINE(currentel)
236 
237 #define   CURRENTEL_EL                  __BITS(3,2)         // Current exception Level
238 
239 AARCH64REG_READ_INLINE(id_aa64afr0_el1)
240 AARCH64REG_READ_INLINE(id_aa64afr1_el1)
241 AARCH64REG_READ_INLINE(id_aa64dfr0_el1)
242 
243 #define   ID_AA64DFR0_EL1_TRACEFILT     __BITS(43,40)
244 #define    ID_AA64DFR0_EL1_TRACEFILT_NONE          0
245 #define    ID_AA64DFR0_EL1_TRACEFILT_IMPL          1
246 #define   ID_AA64DFR0_EL1_DBLLOCK                 __BITS(39,36)
247 #define    ID_AA64DFR0_EL1_DBLLOCK_IMPL  0
248 #define    ID_AA64DFR0_EL1_DBLLOCK_NONE  15
249 #define   ID_AA64DFR0_EL1_PMSVER                  __BITS(35,32)
250 #define   ID_AA64DFR0_EL1_CTX_CMPS      __BITS(31,28)
251 #define   ID_AA64DFR0_EL1_WRPS                    __BITS(20,23)
252 #define   ID_AA64DFR0_EL1_BRPS                    __BITS(12,15)
253 #define   ID_AA64DFR0_EL1_PMUVER                  __BITS(8,11)
254 #define    ID_AA64DFR0_EL1_PMUVER_NONE   0
255 #define    ID_AA64DFR0_EL1_PMUVER_V3     1
256 #define    ID_AA64DFR0_EL1_PMUVER_NOV3   2
257 #define    ID_AA64DFR0_EL1_PMUVER_V3P1   4
258 #define    ID_AA64DFR0_EL1_PMUVER_V3P4   5
259 #define    ID_AA64DFR0_EL1_PMUVER_V3P5   6
260 #define    ID_AA64DFR0_EL1_PMUVER_V3P7   7
261 #define    ID_AA64DFR0_EL1_PMUVER_IMPL   15
262 #define   ID_AA64DFR0_EL1_TRACEVER      __BITS(4,7)
263 #define    ID_AA64DFR0_EL1_TRACEVER_NONE           0
264 #define    ID_AA64DFR0_EL1_TRACEVER_IMPL           1
265 #define   ID_AA64DFR0_EL1_DEBUGVER      __BITS(0,3)
266 #define    ID_AA64DFR0_EL1_DEBUGVER_V8A  6
267 
268 AARCH64REG_READ_INLINE(id_aa64dfr1_el1)
269 
270 AARCH64REG_READ_INLINE(id_aa64isar0_el1)
271 
272 #define   ID_AA64ISAR0_EL1_RNDR                   __BITS(63,60)
273 #define    ID_AA64ISAR0_EL1_RNDR_NONE    0
274 #define    ID_AA64ISAR0_EL1_RNDR_RNDRRS  1
275 #define   ID_AA64ISAR0_EL1_TLB                    __BITS(59,56)
276 #define    ID_AA64ISAR0_EL1_TLB_NONE     0
277 #define    ID_AA64ISAR0_EL1_TLB_OS       1
278 #define    ID_AA64ISAR0_EL1_TLB_OS_TLB   2
279 #define   ID_AA64ISAR0_EL1_TS           __BITS(55,52)
280 #define    ID_AA64ISAR0_EL1_TS_NONE      0
281 #define    ID_AA64ISAR0_EL1_TS_CFINV     1
282 #define    ID_AA64ISAR0_EL1_TS_AXFLAG    2
283 #define   ID_AA64ISAR0_EL1_FHM                    __BITS(51,48)
284 #define    ID_AA64ISAR0_EL1_FHM_NONE     0
285 #define    ID_AA64ISAR0_EL1_FHM_FMLAL    1
286 #define   ID_AA64ISAR0_EL1_DP           __BITS(47,44)
287 #define    ID_AA64ISAR0_EL1_DP_NONE      0
288 #define    ID_AA64ISAR0_EL1_DP_UDOT      1
289 #define   ID_AA64ISAR0_EL1_SM4                    __BITS(43,40)
290 #define    ID_AA64ISAR0_EL1_SM4_NONE     0
291 #define    ID_AA64ISAR0_EL1_SM4_SM4      1
292 #define   ID_AA64ISAR0_EL1_SM3                    __BITS(39,36)
293 #define    ID_AA64ISAR0_EL1_SM3_NONE     0
294 #define    ID_AA64ISAR0_EL1_SM3_SM3      1
295 #define   ID_AA64ISAR0_EL1_SHA3                   __BITS(35,32)
296 #define    ID_AA64ISAR0_EL1_SHA3_NONE    0
297 #define    ID_AA64ISAR0_EL1_SHA3_EOR3    1
298 #define   ID_AA64ISAR0_EL1_RDM                    __BITS(31,28)
299 #define    ID_AA64ISAR0_EL1_RDM_NONE     0
300 #define    ID_AA64ISAR0_EL1_RDM_SQRDML   1
301 #define   ID_AA64ISAR0_EL1_ATOMIC                 __BITS(23,20)
302 #define    ID_AA64ISAR0_EL1_ATOMIC_NONE  0
303 #define    ID_AA64ISAR0_EL1_ATOMIC_SWP   2
304 #define   ID_AA64ISAR0_EL1_CRC32                  __BITS(19,16)
305 #define    ID_AA64ISAR0_EL1_CRC32_NONE   0
306 #define    ID_AA64ISAR0_EL1_CRC32_CRC32X           1
307 #define   ID_AA64ISAR0_EL1_SHA2                   __BITS(15,12)
308 #define    ID_AA64ISAR0_EL1_SHA2_NONE    0
309 #define    ID_AA64ISAR0_EL1_SHA2_SHA256HSU 1
310 #define    ID_AA64ISAR0_EL1_SHA2_SHA512HSU 2
311 #define   ID_AA64ISAR0_EL1_SHA1                   __BITS(11,8)
312 #define    ID_AA64ISAR0_EL1_SHA1_NONE    0
313 #define    ID_AA64ISAR0_EL1_SHA1_SHA1CPMHSU 1
314 #define   ID_AA64ISAR0_EL1_AES                    __BITS(7,4)
315 #define    ID_AA64ISAR0_EL1_AES_NONE     0
316 #define    ID_AA64ISAR0_EL1_AES_AES      1
317 #define    ID_AA64ISAR0_EL1_AES_PMUL     2
318 
319 AARCH64REG_READ_INLINE(id_aa64isar1_el1)
320 
321 #define   ID_AA64ISAR1_EL1_I8MM                   __BITS(55,52)
322 #define    ID_AA64ISAR1_EL1_I8MM_NONE    0
323 #define    ID_AA64ISAR1_EL1_I8MM_SUPPORTED 1
324 #define   ID_AA64ISAR1_EL1_DGH                    __BITS(51,48)
325 #define    ID_AA64ISAR1_EL1_DGH_NONE     0
326 #define    ID_AA64ISAR1_EL1_DGH_SUPPORTED          1
327 #define   ID_AA64ISAR1_EL1_BF16                   __BITS(47,44)
328 #define    ID_AA64ISAR1_EL1_BF16_NONE    0
329 #define    ID_AA64ISAR1_EL1_BF16_BFDOT   1
330 #define   ID_AA64ISAR1_EL1_SPECRES      __BITS(43,40)
331 #define    ID_AA64ISAR1_EL1_SPECRES_NONE           0
332 #define    ID_AA64ISAR1_EL1_SPECRES_SUPPORTED 1
333 #define   ID_AA64ISAR1_EL1_SB           __BITS(39,36)
334 #define    ID_AA64ISAR1_EL1_SB_NONE      0
335 #define    ID_AA64ISAR1_EL1_SB_SUPPORTED           1
336 #define   ID_AA64ISAR1_EL1_FRINTTS      __BITS(35,32)
337 #define    ID_AA64ISAR1_EL1_FRINTTS_NONE           0
338 #define    ID_AA64ISAR1_EL1_FRINTTS_SUPPORTED 1
339 #define   ID_AA64ISAR1_EL1_GPI                    __BITS(31,28)
340 #define    ID_AA64ISAR1_EL1_GPI_NONE     0
341 #define    ID_AA64ISAR1_EL1_GPI_SUPPORTED          1
342 #define   ID_AA64ISAR1_EL1_GPA                    __BITS(27,24)
343 #define    ID_AA64ISAR1_EL1_GPA_NONE     0
344 #define    ID_AA64ISAR1_EL1_GPA_QARMA    1
345 #define   ID_AA64ISAR1_EL1_LRCPC                  __BITS(23,20)
346 #define    ID_AA64ISAR1_EL1_LRCPC_NONE   0
347 #define    ID_AA64ISAR1_EL1_LRCPC_PR     1
348 #define    ID_AA64ISAR1_EL1_LRCPC_PR_UR  2
349 #define   ID_AA64ISAR1_EL1_FCMA                   __BITS(19,16)
350 #define    ID_AA64ISAR1_EL1_FCMA_NONE    0
351 #define    ID_AA64ISAR1_EL1_FCMA_SUPPORTED 1
352 #define   ID_AA64ISAR1_EL1_JSCVT                  __BITS(15,12)
353 #define    ID_AA64ISAR1_EL1_JSCVT_NONE   0
354 #define    ID_AA64ISAR1_EL1_JSCVT_SUPPORTED 1
355 #define   ID_AA64ISAR1_EL1_API                    __BITS(11,8)
356 #define    ID_AA64ISAR1_EL1_API_NONE     0
357 #define    ID_AA64ISAR1_EL1_API_SUPPORTED          1
358 #define    ID_AA64ISAR1_EL1_API_ENHANCED           2
359 #define   ID_AA64ISAR1_EL1_APA                    __BITS(7,4)
360 #define    ID_AA64ISAR1_EL1_APA_NONE     0
361 #define    ID_AA64ISAR1_EL1_APA_QARMA    1
362 #define    ID_AA64ISAR1_EL1_APA_QARMA_ENH          2
363 #define   ID_AA64ISAR1_EL1_DPB                    __BITS(3,0)
364 #define    ID_AA64ISAR1_EL1_DPB_NONE     0
365 #define    ID_AA64ISAR1_EL1_DPB_CVAP     1
366 #define    ID_AA64ISAR1_EL1_DPB_CVAP_CVADP 2
367 
368 AARCH64REG_READ_INLINE(id_aa64mmfr0_el1)
369 
370 #define   ID_AA64MMFR0_EL1_EXS                    __BITS(43,40)
371 #define   ID_AA64MMFR0_EL1_TGRAN4                 __BITS(31,28)
372 #define    ID_AA64MMFR0_EL1_TGRAN4_4KB   0
373 #define    ID_AA64MMFR0_EL1_TGRAN4_NONE  15
374 #define   ID_AA64MMFR0_EL1_TGRAN64      __BITS(24,27)
375 #define    ID_AA64MMFR0_EL1_TGRAN64_64KB           0
376 #define    ID_AA64MMFR0_EL1_TGRAN64_NONE           15
377 #define   ID_AA64MMFR0_EL1_TGRAN16      __BITS(20,23)
378 #define    ID_AA64MMFR0_EL1_TGRAN16_NONE           0
379 #define    ID_AA64MMFR0_EL1_TGRAN16_16KB           1
380 #define   ID_AA64MMFR0_EL1_BIGENDEL0    __BITS(16,19)
381 #define    ID_AA64MMFR0_EL1_BIGENDEL0_NONE 0
382 #define    ID_AA64MMFR0_EL1_BIGENDEL0_MIX          1
383 #define   ID_AA64MMFR0_EL1_SNSMEM                 __BITS(12,15)
384 #define    ID_AA64MMFR0_EL1_SNSMEM_NONE  0
385 #define    ID_AA64MMFR0_EL1_SNSMEM_SNSMEM          1
386 #define   ID_AA64MMFR0_EL1_BIGEND                 __BITS(8,11)
387 #define    ID_AA64MMFR0_EL1_BIGEND_NONE  0
388 #define    ID_AA64MMFR0_EL1_BIGEND_MIX   1
389 #define   ID_AA64MMFR0_EL1_ASIDBITS     __BITS(4,7)
390 #define    ID_AA64MMFR0_EL1_ASIDBITS_8BIT          0
391 #define    ID_AA64MMFR0_EL1_ASIDBITS_16BIT 2
392 #define   ID_AA64MMFR0_EL1_PARANGE      __BITS(0,3)
393 #define    ID_AA64MMFR0_EL1_PARANGE_4G   0
394 #define    ID_AA64MMFR0_EL1_PARANGE_64G  1
395 #define    ID_AA64MMFR0_EL1_PARANGE_1T   2
396 #define    ID_AA64MMFR0_EL1_PARANGE_4T   3
397 #define    ID_AA64MMFR0_EL1_PARANGE_16T  4
398 #define    ID_AA64MMFR0_EL1_PARANGE_256T           5
399 #define    ID_AA64MMFR0_EL1_PARANGE_4P   6
400 
401 AARCH64REG_READ_INLINE(id_aa64mmfr1_el1)
402 
403 #define   ID_AA64MMFR1_EL1_XNX                    __BITS(31,28)
404 #define    ID_AA64MMFR1_EL1_XNX_NONE     0
405 #define    ID_AA64MMFR1_EL1_XNX_SUPPORTED          1
406 #define   ID_AA64MMFR1_EL1_SPECSEI      __BITS(27,24)
407 #define    ID_AA64MMFR1_EL1_SPECSEI_NONE           0
408 #define    ID_AA64MMFR1_EL1_SPECSEI_EXTINT 1
409 #define   ID_AA64MMFR1_EL1_PAN                    __BITS(23,20)
410 #define    ID_AA64MMFR1_EL1_PAN_NONE     0
411 #define    ID_AA64MMFR1_EL1_PAN_SUPPORTED          1
412 #define    ID_AA64MMFR1_EL1_PAN_S1E1     2
413 #define   ID_AA64MMFR1_EL1_LO           __BITS(19,16)
414 #define    ID_AA64MMFR1_EL1_LO_NONE      0
415 #define    ID_AA64MMFR1_EL1_LO_SUPPORTED           1
416 #define   ID_AA64MMFR1_EL1_HPDS                   __BITS(15,12)
417 #define    ID_AA64MMFR1_EL1_HPDS_NONE    0
418 #define    ID_AA64MMFR1_EL1_HPDS_SUPPORTED 1
419 #define    ID_AA64MMFR1_EL1_HPDS_EXTRA_PTD 2
420 #define   ID_AA64MMFR1_EL1_VH           __BITS(11,8)
421 #define    ID_AA64MMFR1_EL1_VH_NONE      0
422 #define    ID_AA64MMFR1_EL1_VH_SUPPORTED           1
423 #define   ID_AA64MMFR1_EL1_VMIDBITS     __BITS(7,4)
424 #define    ID_AA64MMFR1_EL1_VMIDBITS_8BIT          0
425 #define    ID_AA64MMFR1_EL1_VMIDBITS_16BIT 2
426 #define   ID_AA64MMFR1_EL1_HAFDBS                 __BITS(3,0)
427 #define    ID_AA64MMFR1_EL1_HAFDBS_NONE  0
428 #define    ID_AA64MMFR1_EL1_HAFDBS_A     1
429 #define    ID_AA64MMFR1_EL1_HAFDBS_AD    2
430 
431 AARCH64REG_READ_INLINE3(id_aa64mmfr2_el1, id_aa64mmfr2_el1,
432     ATTR_ARCH("armv8.2-a"))
433 
434 #define   ID_AA64MMFR2_EL1_E0PD                   __BITS(63,60)
435 #define    ID_AA64MMFR2_EL1_E0PD_NONE    0
436 #define    ID_AA64MMFR2_EL1_E0PD_SUPPORTED 1
437 #define   ID_AA64MMFR2_EL1_EVT                    __BITS(59,56)
438 #define    ID_AA64MMFR2_EL1_EVT_NONE     0
439 #define    ID_AA64MMFR2_EL1_EVT_TO_TI    1
440 #define    ID_AA64MMFR2_EL1_EVT_TO_TI_TTL          2
441 #define   ID_AA64MMFR2_EL1_BBM                    __BITS(55,52)
442 #define    ID_AA64MMFR2_EL1_BBM_L0       0
443 #define    ID_AA64MMFR2_EL1_BBM_L1       1
444 #define    ID_AA64MMFR2_EL1_BBM_L2       2
445 #define   ID_AA64MMFR2_EL1_TTL                    __BITS(51,48)
446 #define    ID_AA64MMFR2_EL1_TTL_NONE     0
447 #define    ID_AA64MMFR2_EL1_TTL_SUPPORTED          1
448 #define   ID_AA64MMFR2_EL1_FWB                    __BITS(43,40)
449 #define    ID_AA64MMFR2_EL1_FWB_NONE     0
450 #define    ID_AA64MMFR2_EL1_FWB_SUPPORTED          1
451 #define   ID_AA64MMFR2_EL1_IDS                    __BITS(39,36)
452 #define    ID_AA64MMFR2_EL1_IDS_0X0      0
453 #define    ID_AA64MMFR2_EL1_IDS_0X18     1
454 #define   ID_AA64MMFR2_EL1_AT           __BITS(35,32)
455 #define    ID_AA64MMFR2_EL1_AT_NONE      0
456 #define    ID_AA64MMFR2_EL1_AT_16BIT     1
457 #define   ID_AA64MMFR2_EL1_ST           __BITS(31,28)
458 #define    ID_AA64MMFR2_EL1_ST_39                  0
459 #define    ID_AA64MMFR2_EL1_ST_48                  1
460 #define   ID_AA64MMFR2_EL1_NV           __BITS(27,24)
461 #define    ID_AA64MMFR2_EL1_NV_NONE      0
462 #define    ID_AA64MMFR2_EL1_NV_HCR       1
463 #define    ID_AA64MMFR2_EL1_NV_HCR_VNCR  2
464 #define   ID_AA64MMFR2_EL1_CCIDX                  __BITS(23,20)
465 #define    ID_AA64MMFR2_EL1_CCIDX_32BIT  0
466 #define    ID_AA64MMFR2_EL1_CCIDX_64BIT  1
467 #define   ID_AA64MMFR2_EL1_VARANGE      __BITS(19,16)
468 #define    ID_AA64MMFR2_EL1_VARANGE_48BIT          0
469 #define    ID_AA64MMFR2_EL1_VARANGE_52BIT          1
470 #define   ID_AA64MMFR2_EL1_IESB                   __BITS(15,12)
471 #define    ID_AA64MMFR2_EL1_IESB_NONE    0
472 #define    ID_AA64MMFR2_EL1_IESB_SUPPORTED 1
473 #define   ID_AA64MMFR2_EL1_LSM                    __BITS(11,8)
474 #define    ID_AA64MMFR2_EL1_LSM_NONE     0
475 #define    ID_AA64MMFR2_EL1_LSM_SUPPORTED          1
476 #define   ID_AA64MMFR2_EL1_UAO                    __BITS(7,4)
477 #define    ID_AA64MMFR2_EL1_UAO_NONE     0
478 #define    ID_AA64MMFR2_EL1_UAO_SUPPORTED          1
479 #define   ID_AA64MMFR2_EL1_CNP                    __BITS(3,0)
480 #define    ID_AA64MMFR2_EL1_CNP_NONE     0
481 #define    ID_AA64MMFR2_EL1_CNP_SUPPORTED          1
482 
483 AARCH64REG_READ_INLINE2(a72_cpuactlr_el1, s3_1_c15_c2_0)
484 AARCH64REG_READ_INLINE(id_aa64pfr0_el1)
485 AARCH64REG_READ_INLINE(id_aa64pfr1_el1)
486 
487 #define   ID_AA64PFR1_EL1_RASFRAC                 __BITS(15,12)
488 #define    ID_AA64PFR1_EL1_RASFRAC_NORMAL          0
489 #define    ID_AA64PFR1_EL1_RASFRAC_EXTRA           1
490 #define   ID_AA64PFR1_EL1_MTE           __BITS(11,8)
491 #define    ID_AA64PFR1_EL1_MTE_NONE      0
492 #define    ID_AA64PFR1_EL1_MTE_PARTIAL   1
493 #define    ID_AA64PFR1_EL1_MTE_SUPPORTED           2
494 #define   ID_AA64PFR1_EL1_SSBS                    __BITS(7,4)
495 #define    ID_AA64PFR1_EL1_SSBS_NONE     0
496 #define    ID_AA64PFR1_EL1_SSBS_SUPPORTED          1
497 #define    ID_AA64PFR1_EL1_SSBS_MSR_MRS  2
498 #define   ID_AA64PFR1_EL1_BT            __BITS(3,0)
499 #define    ID_AA64PFR1_EL1_BT_NONE       0
500 #define    ID_AA64PFR1_EL1_BT_SUPPORTED  1
501 
502 AARCH64REG_READ_INLINE(id_aa64zfr0_el1)
503 AARCH64REG_READ_INLINE(id_pfr1_el1)
504 AARCH64REG_READ_INLINE(isr_el1)
505 AARCH64REG_READ_INLINE(midr_el1)
506 AARCH64REG_READ_INLINE(mpidr_el1)
507 
508 #define   MIDR_EL1_IMPL                 __BITS(31,24)                 // Implementor
509 #define   MIDR_EL1_VARIANT    __BITS(23,20)                 // CPU Variant
510 #define   MIDR_EL1_ARCH                 __BITS(19,16)                 // Architecture
511 #define   MIDR_EL1_PARTNUM    __BITS(15,4)                  // PartNum
512 #define   MIDR_EL1_REVISION   __BITS(3,0)                   // Revision
513 
514 #define   MPIDR_AFF3                    __BITS(32,39)
515 #define   MPIDR_U                       __BIT(30)           // 1 = Uni-Processor System
516 #define   MPIDR_MT            __BIT(24)           // 1 = SMT(AFF0 is logical)
517 #define   MPIDR_AFF2                    __BITS(16,23)
518 #define   MPIDR_AFF1                    __BITS(8,15)
519 #define   MPIDR_AFF0                    __BITS(0,7)
520 
521 AARCH64REG_READ_INLINE(mvfr0_el1)
522 
523 #define   MVFR0_FPROUND                 __BITS(31,28)
524 #define    MVFR0_FPROUND_NEAREST         0
525 #define    MVFR0_FPROUND_ALL   1
526 #define   MVFR0_FPSHVEC                 __BITS(27,24)
527 #define    MVFR0_FPSHVEC_NONE  0
528 #define    MVFR0_FPSHVEC_SHVEC           1
529 #define   MVFR0_FPSQRT                  __BITS(23,20)
530 #define    MVFR0_FPSQRT_NONE   0
531 #define    MVFR0_FPSQRT_VSQRT  1
532 #define   MVFR0_FPDIVIDE                __BITS(19,16)
533 #define    MVFR0_FPDIVIDE_NONE           0
534 #define    MVFR0_FPDIVIDE_VDIV           1
535 #define   MVFR0_FPTRAP                  __BITS(15,12)
536 #define    MVFR0_FPTRAP_NONE   0
537 #define    MVFR0_FPTRAP_TRAP   1
538 #define   MVFR0_FPDP                    __BITS(11,8)
539 #define    MVFR0_FPDP_NONE     0
540 #define    MVFR0_FPDP_VFPV2    1
541 #define    MVFR0_FPDP_VFPV3    2
542 #define   MVFR0_FPSP                    __BITS(7,4)
543 #define    MVFR0_FPSP_NONE     0
544 #define    MVFR0_FPSP_VFPV2    1
545 #define    MVFR0_FPSP_VFPV3    2
546 #define   MVFR0_SIMDREG                 __BITS(3,0)
547 #define    MVFR0_SIMDREG_NONE  0
548 #define    MVFR0_SIMDREG_16x64           1
549 #define    MVFR0_SIMDREG_32x64           2
550 
551 AARCH64REG_READ_INLINE(mvfr1_el1)
552 
553 #define   MVFR1_SIMDFMAC                __BITS(31,28)
554 #define    MVFR1_SIMDFMAC_NONE           0
555 #define    MVFR1_SIMDFMAC_FMAC           1
556 #define   MVFR1_FPHP                    __BITS(27,24)
557 #define    MVFR1_FPHP_NONE     0
558 #define    MVFR1_FPHP_HALF_SINGLE        1
559 #define    MVFR1_FPHP_HALF_DOUBLE        2
560 #define    MVFR1_FPHP_HALF_ARITH         3
561 #define   MVFR1_SIMDHP                  __BITS(23,20)
562 #define    MVFR1_SIMDHP_NONE   0
563 #define    MVFR1_SIMDHP_HALF   1
564 #define    MVFR1_SIMDHP_HALF_ARITH 3
565 #define   MVFR1_SIMDSP                  __BITS(19,16)
566 #define    MVFR1_SIMDSP_NONE   0
567 #define    MVFR1_SIMDSP_SINGLE           1
568 #define   MVFR1_SIMDINT                  __BITS(15,12)
569 #define    MVFR1_SIMDINT_NONE  0
570 #define    MVFR1_SIMDINT_INTEGER         1
571 #define   MVFR1_SIMDLS                  __BITS(11,8)
572 #define    MVFR1_SIMDLS_NONE   0
573 #define    MVFR1_SIMDLS_LOADSTORE        1
574 #define   MVFR1_FPDNAN                  __BITS(7,4)
575 #define    MVFR1_FPDNAN_NONE   0
576 #define    MVFR1_FPDNAN_NAN    1
577 #define   MVFR1_FPFTZ                   __BITS(3,0)
578 #define    MVFR1_FPFTZ_NONE    0
579 #define    MVFR1_FPFTZ_DENORMAL          1
580 
581 AARCH64REG_READ_INLINE(mvfr2_el1)
582 
583 #define   MVFR2_FPMISC                  __BITS(7,4)
584 #define    MVFR2_FPMISC_NONE   0
585 #define    MVFR2_FPMISC_SEL    1
586 #define    MVFR2_FPMISC_DROUND           2
587 #define    MVFR2_FPMISC_ROUNDINT         3
588 #define    MVFR2_FPMISC_MAXMIN           4
589 #define   MVFR2_SIMDMISC                __BITS(3,0)
590 #define    MVFR2_SIMDMISC_NONE           0
591 #define    MVFR2_SIMDMISC_DROUND         1
592 #define    MVFR2_SIMDMISC_ROUNDINT 2
593 #define    MVFR2_SIMDMISC_MAXMIN         3
594 
595 AARCH64REG_READ_INLINE(revidr_el1)
596 
597 /*
598  * These are read/write registers
599  */
600 AARCH64REG_READ_INLINE3(APIAKeyLo_EL1, apiakeylo_el1, ATTR_ARCH("armv8.3-a"))
601 AARCH64REG_WRITE_INLINE3(APIAKeyLo_EL1, apiakeylo_el1, ATTR_ARCH("armv8.3-a"))
602 AARCH64REG_READ_INLINE3(APIAKeyHi_EL1, apiakeyhi_el1, ATTR_ARCH("armv8.3-a"))
603 AARCH64REG_WRITE_INLINE3(APIAKeyHi_EL1, apiakeyhi_el1, ATTR_ARCH("armv8.3-a"))
604 
605 AARCH64REG_READ_INLINE3(APIBKeyLo_EL1, apibkeylo_el1, ATTR_ARCH("armv8.3-a"))
606 AARCH64REG_WRITE_INLINE3(APIBKeyLo_EL1, apibkeylo_el1, ATTR_ARCH("armv8.3-a"))
607 AARCH64REG_READ_INLINE3(APIBKeyHi_EL1, apibkeyhi_el1, ATTR_ARCH("armv8.3-a"))
608 AARCH64REG_WRITE_INLINE3(APIBKeyHi_EL1, apibkeyhi_el1, ATTR_ARCH("armv8.3-a"))
609 
610 AARCH64REG_READ_INLINE3(APDAKeyLo_EL1, apdakeylo_el1, ATTR_ARCH("armv8.3-a"))
611 AARCH64REG_WRITE_INLINE3(APDAKeyLo_EL1, apdakeylo_el1, ATTR_ARCH("armv8.3-a"))
612 AARCH64REG_READ_INLINE3(APDAKeyHi_EL1, apdakeyhi_el1, ATTR_ARCH("armv8.3-a"))
613 AARCH64REG_WRITE_INLINE3(APDAKeyHi_EL1, apdakeyhi_el1, ATTR_ARCH("armv8.3-a"))
614 
615 AARCH64REG_READ_INLINE3(APDBKeyLo_EL1, apdbkeylo_el1, ATTR_ARCH("armv8.3-a"))
616 AARCH64REG_WRITE_INLINE3(APDBKeyLo_EL1, apdbkeylo_el1, ATTR_ARCH("armv8.3-a"))
617 AARCH64REG_READ_INLINE3(APDBKeyHi_EL1, apdbkeyhi_el1, ATTR_ARCH("armv8.3-a"))
618 AARCH64REG_WRITE_INLINE3(APDBKeyHi_EL1, apdbkeyhi_el1, ATTR_ARCH("armv8.3-a"))
619 
620 AARCH64REG_READ_INLINE3(APGAKeyLo_EL1, apgakeylo_el1, ATTR_ARCH("armv8.3-a"))
621 AARCH64REG_WRITE_INLINE3(APGAKeyLo_EL1, apgakeylo_el1, ATTR_ARCH("armv8.3-a"))
622 AARCH64REG_READ_INLINE3(APGAKeyHi_EL1, apgakeyhi_el1, ATTR_ARCH("armv8.3-a"))
623 AARCH64REG_WRITE_INLINE3(APGAKeyHi_EL1, apgakeyhi_el1, ATTR_ARCH("armv8.3-a"))
624 
625 AARCH64REG_READ_INLINE3(pan, pan, ATTR_ARCH("armv8.1-a"))
626 AARCH64REG_WRITE_INLINE3(pan, pan, ATTR_ARCH("armv8.1-a"))
627 
628 AARCH64REG_READ_INLINE(cpacr_el1)       // Coprocessor Access Control Register
629 AARCH64REG_WRITE_INLINE(cpacr_el1)
630 
631 #define   CPACR_TTA           __BIT(28)  // System Register Access Traps
632 #define   CPACR_FPEN                    __BITS(21,20)
633 #define  CPACR_FPEN_NONE       __SHIFTIN(0, CPACR_FPEN)
634 #define    CPACR_FPEN_EL1                __SHIFTIN(1, CPACR_FPEN)
635 #define    CPACR_FPEN_NONE_2   __SHIFTIN(2, CPACR_FPEN)
636 #define    CPACR_FPEN_ALL                __SHIFTIN(3, CPACR_FPEN)
637 
638 AARCH64REG_READ_INLINE(csselr_el1)      // Cache Size Selection Register
639 AARCH64REG_WRITE_INLINE(csselr_el1)
640 
641 #define   CSSELR_LEVEL                  __BITS(3,1)         // Cache level of required cache
642 #define   CSSELR_IND                    __BIT(0)  // Instruction not Data bit
643 
644 AARCH64REG_READ_INLINE(daif)            // Debug Async Irq Fiq mask register
645 AARCH64REG_WRITE_INLINE(daif)
646 AARCH64REG_WRITEIMM_INLINE(daifclr)
647 AARCH64REG_WRITEIMM_INLINE(daifset)
648 
649 #define   DAIF_D                        __BIT(9)  // Debug Exception Mask
650 #define   DAIF_A                        __BIT(8)  // SError Abort Mask
651 #define   DAIF_I                        __BIT(7)  // IRQ Mask
652 #define   DAIF_F                        __BIT(6)  // FIQ Mask
653 #define   DAIF_SETCLR_SHIFT   6                   // for daifset/daifclr #imm shift
654 
655 AARCH64REG_READ_INLINE(elr_el1)                   // Exception Link Register
656 AARCH64REG_WRITE_INLINE(elr_el1)
657 
658 AARCH64REG_READ_INLINE(esr_el1)                   // Exception Symdrone Register
659 AARCH64REG_WRITE_INLINE(esr_el1)
660 
661 #define   ESR_EC                        __BITS(31,26) // Exception Cause
662 #define    ESR_EC_UNKNOWN                0x00     // AXX: Unknown Reason
663 #define    ESR_EC_WFX                    0x01     // AXX: WFI or WFE instruction execution
664 #define    ESR_EC_CP15_RT                0x03     // A32: MCR/MRC access to CP15 !EC=0
665 #define    ESR_EC_CP15_RRT     0x04     // A32: MCRR/MRRC access to CP15 !EC=0
666 #define    ESR_EC_CP14_RT                0x05     // A32: MCR/MRC access to CP14
667 #define    ESR_EC_CP14_DT                0x06     // A32: LDC/STC access to CP14
668 #define    ESR_EC_FP_ACCESS    0x07     // AXX: Access to SIMD/FP Registers
669 #define    ESR_EC_FPID                   0x08     // A32: MCR/MRC access to CP10 !EC=7
670 #define    ESR_EC_PAUTH                  0x09     // A64: Pointer auth trap (FEAT_PAUTH)
671 #define    ESR_EC_LS64                   0x0a     // AXX: LD64B/ST64B instruction (FEAT_LS64)                 // XXXNH
672 #define    ESR_EC_CP14_RRT     0x0c     // A32: MRRC access to CP14
673 #define    ESR_EC_BTE_A64                0x0d     // A64: Branch Target Exception (V8.5)
674 #define    ESR_EC_ILL_STATE    0x0e     // AXX: Illegal Execution State
675 #define    ESR_EC_SVC_A32                0x11     // A32: SVC Instruction Execution
676 #define    ESR_EC_HVC_A32                0x12     // A32: HVC Instruction Execution
677 #define    ESR_EC_SMC_A32                0x13     // A32: SMC Instruction Execution
678 #define    ESR_EC_SVC_A64                0x15     // A64: SVC Instruction Execution
679 #define    ESR_EC_HVC_A64                0x16     // A64: HVC Instruction Execution
680 #define    ESR_EC_SMC_A64                0x17     // A64: SMC Instruction Execution
681 #define    ESR_EC_SYS_REG                0x18     // A64: MSR/MRS/SYS instruction (!EC0/1/7)
682 #define    ESR_EC_SVE                    0x19     // AXX: SVE Instruction Execution (FEAT_SVE)
683 #define    ESR_EC_PAUTH_ERET   0x1a     // A64: ERET/ERETAA/ERETAB (FEAT_PAUTH and FEAT_NV)
684 #define    ESR_EC_TME                    0x1b     // A64: TSTART instruction (FEAT_TME)
685 #define    ESR_EC_FRAC                   0x1c     // A64: Pointer auth trap (FEAT_FPAC)
686 #define    ESR_EC_SME                    0x1d     // AXX: Access to SME (FEAT_SME)
687 #define    ESR_EC_RME                    0x1e     // A64: Granule Protection  Check (FEAT_RME)
688 #define    ESR_EC_INSN_ABT_EL_LOW        0x20     // AXX: Instruction Abort from lower level
689 #define    ESR_EC_INSN_ABT_EL_CUR        0x21     // AXX: Instruction Abort from current level
690 #define    ESR_EC_PC_ALIGNMENT           0x22     // AXX: Misaligned PC
691 #define    ESR_EC_DATA_ABT_EL_LOW        0x24     // AXX: Data Abort from lower level
692 #define    ESR_EC_DATA_ABT_EL_CUR        0x25     // AXX: Data Abort from current level
693 #define    ESR_EC_SP_ALIGNMENT           0x26     // AXX: Misaligned SP
694 #define    ESR_EC_MOPS                   0x27     // A64: Memory Operation Exception (FEAT_MOPS)
695 #define    ESR_EC_FP_TRAP_A32  0x28     // A32: FP Exception
696 #define    ESR_EC_FP_TRAP_A64  0x2c     // A64: FP Exception
697 #define    ESR_EC_SERROR                 0x2f     // AXX: SError Interrupt
698 #define    ESR_EC_BRKPNT_EL_LOW          0x30     // AXX: Breakpoint Exception from lower level
699 #define    ESR_EC_BRKPNT_EL_CUR          0x31     // AXX: Breakpoint Exception from current level
700 #define    ESR_EC_SW_STEP_EL_LOW         0x32     // AXX: Software Step from lower level
701 #define    ESR_EC_SW_STEP_EL_CUR         0x33     // AXX: Software Step from current level
702 #define    ESR_EC_WTCHPNT_EL_LOW         0x34     // AXX: Watchpoint from lower level
703 #define    ESR_EC_WTCHPNT_EL_CUR         0x35     // AXX: Watchpoint from current level
704 #define    ESR_EC_BKPT_INSN_A32          0x38     // A32: BKPT Instruction Execution
705 #define    ESR_EC_VECTOR_CATCH           0x3a     // A32: Vector Catch Exception
706 #define    ESR_EC_BKPT_INSN_A64          0x3c     // A64: BKPT Instruction Execution
707 /* alias for EL1 kernel */
708 #define    ESR_EC_INSN_ABT_EL0           ESR_EC_INSN_ABT_EL_LOW
709 #define    ESR_EC_INSN_ABT_EL1           ESR_EC_INSN_ABT_EL_CUR
710 #define    ESR_EC_DATA_ABT_EL0           ESR_EC_DATA_ABT_EL_LOW
711 #define    ESR_EC_DATA_ABT_EL1           ESR_EC_DATA_ABT_EL_CUR
712 #define    ESR_EC_BRKPNT_EL0   ESR_EC_BRKPNT_EL_LOW
713 #define    ESR_EC_BRKPNT_EL1   ESR_EC_BRKPNT_EL_CUR
714 #define    ESR_EC_SW_STEP_EL0  ESR_EC_SW_STEP_EL_LOW
715 #define    ESR_EC_SW_STEP_EL1  ESR_EC_SW_STEP_EL_CUR
716 #define    ESR_EC_WTCHPNT_EL0  ESR_EC_WTCHPNT_EL_LOW
717 #define    ESR_EC_WTCHPNT_EL1  ESR_EC_WTCHPNT_EL_CUR
718 #define   ESR_IL                        __BIT(25) // Instruction Length (1=32-bit)
719 #define   ESR_ISS                       __BITS(24,0)        // Instruction Specific Syndrome
720 #define   ESR_ISS_CV                    __BIT(24) // common
721 #define   ESR_ISS_COND                  __BITS(23,20)       // common
722 #define   ESR_ISS_WFX_TRAP_INSN         __BIT(0)  // for ESR_EC_WFX
723 #define   ESR_ISS_SYSREG_OP0  __BITS(21,20)       // for ESR_EC_SYS_REG
724 #define   ESR_ISS_SYSREG_OP2  __BITS(19,17)       // for ESR_EC_SYS_REG
725 #define   ESR_ISS_SYSREG_OP1  __BITS(16,14)       // for ESR_EC_SYS_REG
726 #define   ESR_ISS_SYSREG_CRN  __BITS(13,10)       // for ESR_EC_SYS_REG
727 #define   ESR_ISS_SYSREG_RT   __BITS(9,5)         // for ESR_EC_SYS_REG
728 #define   ESR_ISS_SYSREG_CRM  __BITS(4,1)         // for ESR_EC_SYS_REG
729 #define   ESR_ISS_SYSREG_DIRECTION __BIT(0)       // for ESR_EC_SYS_REG
730 #define   ESR_ISS_MRC_OPC2    __BITS(19,17)       // for ESR_EC_CP15_RT
731 #define   ESR_ISS_MRC_OPC1    __BITS(16,14)       // for ESR_EC_CP15_RT
732 #define   ESR_ISS_MRC_CRN               __BITS(13,10)       // for ESR_EC_CP15_RT
733 #define   ESR_ISS_MRC_RT                __BITS(9,5)         // for ESR_EC_CP15_RT
734 #define   ESR_ISS_MRC_CRM               __BITS(4,1)         // for ESR_EC_CP15_RT
735 #define   ESR_ISS_MRC_DIRECTION         __BIT(0)  // for ESR_EC_CP15_RT
736 #define   ESR_ISS_MCRR_OPC1   __BITS(19,16)       // for ESR_EC_CP15_RRT
737 #define   ESR_ISS_MCRR_RT2    __BITS(14,10)       // for ESR_EC_CP15_RRT
738 #define   ESR_ISS_MCRR_RT               __BITS(9,5)         // for ESR_EC_CP15_RRT
739 #define   ESR_ISS_MCRR_CRM    __BITS(4,1)         // for ESR_EC_CP15_RRT
740 #define   ESR_ISS_MCRR_DIRECTION        __BIT(0)  // for ESR_EC_CP15_RRT
741 #define   ESR_ISS_HVC_IMM16   __BITS(15,0)        // for ESR_EC_{SVC,HVC}
742 // ...
743 #define   ESR_ISS_INSNABORT_EA          __BIT(9)  // for ESC_RC_INSN_ABT_EL[01]
744 #define   ESR_ISS_INSNABORT_S1PTW       __BIT(7)  // for ESC_RC_INSN_ABT_EL[01]
745 #define   ESR_ISS_INSNABORT_IFSC        __BITS(0,5)         // for ESC_RC_INSN_ABT_EL[01]
746 #define   ESR_ISS_DATAABORT_ISV         __BIT(24) // for ESC_RC_DATA_ABT_EL[01]
747 #define   ESR_ISS_DATAABORT_SAS         __BITS(23,22)       // for ESC_RC_DATA_ABT_EL[01]
748 #define   ESR_ISS_DATAABORT_SSE         __BIT(21) // for ESC_RC_DATA_ABT_EL[01]
749 #define   ESR_ISS_DATAABORT_SRT         __BITS(20,16)       // for ESC_RC_DATA_ABT_EL[01]
750 #define   ESR_ISS_DATAABORT_SF          __BIT(15) // for ESC_RC_DATA_ABT_EL[01]
751 #define   ESR_ISS_DATAABORT_AR          __BIT(14) // for ESC_RC_DATA_ABT_EL[01]
752 #define   ESR_ISS_DATAABORT_EA          __BIT(9)  // for ESC_RC_DATA_ABT_EL[01]
753 #define   ESR_ISS_DATAABORT_CM          __BIT(8)  // for ESC_RC_DATA_ABT_EL[01]
754 #define   ESR_ISS_DATAABORT_S1PTW       __BIT(7)  // for ESC_RC_DATA_ABT_EL[01]
755 #define   ESR_ISS_DATAABORT_WnR         __BIT(6)  // for ESC_RC_DATA_ABT_EL[01]
756 #define   ESR_ISS_DATAABORT_DFSC        __BITS(0,5)         // for ESC_RC_DATA_ABT_EL[01]
757 
758 #define   ESR_ISS_FSC_ADDRESS_SIZE_FAULT_0                  0x00
759 #define   ESR_ISS_FSC_ADDRESS_SIZE_FAULT_1                  0x01
760 #define   ESR_ISS_FSC_ADDRESS_SIZE_FAULT_2                  0x02
761 #define   ESR_ISS_FSC_ADDRESS_SIZE_FAULT_3                  0x03
762 #define   ESR_ISS_FSC_TRANSLATION_FAULT_0                             0x04
763 #define   ESR_ISS_FSC_TRANSLATION_FAULT_1                             0x05
764 #define   ESR_ISS_FSC_TRANSLATION_FAULT_2                             0x06
765 #define   ESR_ISS_FSC_TRANSLATION_FAULT_3                             0x07
766 #define   ESR_ISS_FSC_ACCESS_FAULT_0                        0x08
767 #define   ESR_ISS_FSC_ACCESS_FAULT_1                        0x09
768 #define   ESR_ISS_FSC_ACCESS_FAULT_2                        0x0a
769 #define   ESR_ISS_FSC_ACCESS_FAULT_3                        0x0b
770 #define   ESR_ISS_FSC_PERM_FAULT_0                          0x0c
771 #define   ESR_ISS_FSC_PERM_FAULT_1                          0x0d
772 #define   ESR_ISS_FSC_PERM_FAULT_2                          0x0e
773 #define   ESR_ISS_FSC_PERM_FAULT_3                          0x0f
774 #define   ESR_ISS_FSC_SYNC_EXTERNAL_ABORT                             0x10
775 #define   ESR_ISS_FSC_SYNC_EXTERNAL_ABORT_TTWALK_0          0x14
776 #define   ESR_ISS_FSC_SYNC_EXTERNAL_ABORT_TTWALK_1          0x15
777 #define   ESR_ISS_FSC_SYNC_EXTERNAL_ABORT_TTWALK_2          0x16
778 #define   ESR_ISS_FSC_SYNC_EXTERNAL_ABORT_TTWALK_3          0x17
779 #define   ESR_ISS_FSC_SYNC_PARITY_ERROR                     0x18
780 #define   ESR_ISS_FSC_SYNC_PARITY_ERROR_ON_TTWALK_0         0x1c
781 #define   ESR_ISS_FSC_SYNC_PARITY_ERROR_ON_TTWALK_1         0x1d
782 #define   ESR_ISS_FSC_SYNC_PARITY_ERROR_ON_TTWALK_2         0x1e
783 #define   ESR_ISS_FSC_SYNC_PARITY_ERROR_ON_TTWALK_3         0x1f
784 #define   ESR_ISS_FSC_ALIGNMENT_FAULT                       0x21
785 #define   ESR_ISS_FSC_TLB_CONFLICT_FAULT                              0x30
786 #define   ESR_ISS_FSC_LOCKDOWN_ABORT                        0x34
787 #define   ESR_ISS_FSC_UNSUPPORTED_EXCLUSIVE                 0x35
788 #define   ESR_ISS_FSC_FIRST_LEVEL_DOMAIN_FAULT              0x3d
789 #define   ESR_ISS_FSC_SECOND_LEVEL_DOMAIN_FAULT             0x3e
790 
791 
792 AARCH64REG_READ_INLINE(far_el1)                   // Fault Address Register
793 AARCH64REG_WRITE_INLINE(far_el1)
794 AARCH64REG_READ_INLINE(far_el2)
795 AARCH64REG_WRITE_INLINE(far_el2)
796 
797 AARCH64REG_READ_INLINE(hcr_el2)                   // Hypervisor Configuration Register
798 AARCH64REG_WRITE_INLINE(hcr_el2)
799 
800 #define   HCR_EL2_TWEDEL                __BITS(63,60)       // TWE Delay (FEAT_TWED)
801 #define   HCR_EL2_TWEDEN                __BIT(59) // TWE Delay Enable (FEAT_TWED)
802 #define   HCR_EL2_TID5                  __BIT(58) // Trap ID group 5 (FEAT_MTE2)
803 #define   HCR_EL2_DCT                   __BIT(57) // Default Cacheability Tagging (FEAT_MTE2)
804 #define   HCR_EL2_ATA                   __BIT(56) // Allocation Tag Access (FEAT_MTE2)
805 #define   HCR_EL2_TTLBOS                __BIT(55) // Trap TLB maintenance OS (FEAT_EVT)
806 #define   HCR_EL2_TTLBIS                __BIT(54) // Trap TLB maintenance IS (FEAT_EVT)
807 #define   HCR_EL2_ENSCXT                __BIT(53) // Enable SCXTNUM_EL[01] access (FEAT_CSV2)
808 #define   HCR_EL2_TOCU                  __BIT(52) // Trap PoU cache maintenance
809 #define   HCR_EL2_AMVOFFEN    __BIT(51) // Activity Monitors Virtual Offsets Enable (FEAT_AMUv1p1)
810 #define   HCR_EL2_TICAB                 __BIT(50) // Trap IC all broadcast maintenance.
811 #define   HCR_EL2_TID4                  __BIT(49) // Trap ID group 4 (FEAT_EVT)
812 #define   HCR_EL2_GPF                   __BIT(48) // Granule Protection Faults (FEAT_RME)
813 #define   HCR_EL2_FIEN                  __BIT(47) // Fault Injection Enable (FEAT_RASv1p1)
814 #define   HCR_EL2_FWB                   __BIT(46) // Forced Write-Back (FEAT_S2FWB)
815 #define   HCR_EL2_NV2                   __BIT(45) // Nested Virtualization (FEAT_NV2)
816 #define   HCR_EL2_AT                    __BIT(44) // Address Translation (FEAT_NV)
817 #define   HCR_EL2_NV1                   __BIT(43) // Nested Virtualization (FEAT_NV2/FEAT_NV)
818 #define   HCR_EL2_NV                    __BIT(42) // Nested Virtualization (FEAT_NV2/FEAT_NV)
819 #define   HCR_EL2_API                   __BIT(41) // Pointer Authentication instruction (FEAT_PAuth)
820 #define   HCR_EL2_APK                   __BIT(40) // Pointer Authentication key (FEAT_PAuth)
821 #define   HCR_EL2_TME                   __BIT(39) // TME enable (FEAT_TME)
822 #define   HCR_EL2_MIOCNCE               __BIT(38) // Mismatched Inner/Outer Cacheable Non-Coherency Enable,
823 #define   HCR_EL2_TEA                   __BIT(37) // Route synchronous External abort exceptions to EL2 (FEAT_RAS)
824 #define   HCR_EL2_TERR                  __BIT(36) // Trap accesses of Error Record registers (FEAT_RAS)
825 #define   HCR_EL2_TLOR                  __BIT(35) // Trap LOR registers (FEAT_LOR)
826 #define   HCR_EL2_VHE                   __BIT(34) // EL2 Host (FEAT_VHE)
827 #define   HCR_EL2_ID                    __BIT(33) // stage2 IC disable
828 #define   HCR_EL2_CD                    __BIT(32) // stage2 DC disable
829 #define   HCR_EL2_RW                    __BIT(31) // register width
830 #define   HCR_EL2_TRVM                  __BIT(30) // trap VM control regs read
831 #define   HCR_EL2_HCD                   __BIT(29) // HVC disable
832 #define   HCR_EL2_TDZ                   __BIT(28) // trap DC ZVA
833 #define   HCR_EL2_TGE                   __BIT(27) // trap general exceptions
834 #define   HCR_EL2_TVM                   __BIT(26) // trap VM control regs write
835 #define   HCR_EL2_TTLB                  __BIT(25) // trap TLB maintenance op
836 #define   HCR_EL2_TPU                   __BIT(24) // trap IC {IVAU,IALLU,IALLUIS},DC CVAU
837 #define   HCR_EL2_TPC                   __BIT(23) // trap DC {IVAC,CIVAC,CVAC}
838 #define   HCR_EL2_TSW                   __BIT(22) // trap DC {ISW,CSW,CISW}
839 #define   HCR_EL2_TACR                  __BIT(21) // trap ACTRL_EL1 access
840 #define   HCR_EL2_TIDCP                 __BIT(20) // trap IMPLEMENTATION DEFINED system regs
841 #define   HCR_EL2_TSC                   __BIT(19) // trap SMC
842 #define   HCR_EL2_TID3                  __BIT(18) // trap ID group3 regs
843 #define   HCR_EL2_TID2                  __BIT(17) // trap ID group2 regs
844 #define   HCR_EL2_TID1                  __BIT(16) // trap ID group1 regs
845 #define   HCR_EL2_TID0                  __BIT(15) // trap ID group0 regs
846 #define   HCR_EL2_TWE                   __BIT(14) // trap WFE
847 #define   HCR_EL2_TWI                   __BIT(13) // trap WFI
848 #define   HCR_EL2_DC                    __BIT(12) // default cacheablility
849 #define   HCR_EL2_BSU                   __BITS(11,10)       // barrier shareability upgrade
850 #define   HCR_EL2_FB                    __BIT(9)  // force broadcast TLBI and IC
851 #define   HCR_EL2_VSE                   __BIT(8)  // inject Virtual SError
852 #define   HCR_EL2_VI                    __BIT(7)  // inject Virtual IRQ
853 #define   HCR_EL2_VF                    __BIT(6)  // inject Virtual FIQ
854 #define   HCR_EL2_AMO                   __BIT(5)  // trap SError/AsyncAbort
855 #define   HCR_EL2_IMO                   __BIT(4)  // trap IRQ
856 #define   HCR_EL2_FMO                   __BIT(3)  // trap FIQ
857 #define   HCR_EL2_PTW                   __BIT(2)  // Protect table walk
858 #define   HCR_EL2_SWIO                  __BIT(1)  // override DC ISW to DC CISW
859 #define   HCR_EL2_VM                    __BIT(0)  // enable stage2 translation
860 
861 AARCH64REG_READ_INLINE(hpfar_el2)                 // Hypervisor IPA Fault Address Register
862 AARCH64REG_WRITE_INLINE(hpfar_el2)
863 
864 #define HPFAR_EL2_NS                    __BIT(63) // Faulting IPA address space (FEAT_SEL2)
865 #define HPFAR_EL2_FIPA_D128   __BITS(47,4)        // Faulting Intermediate Physical Address Bits [55:12]
866 #define HPFAR_EL2_FIPA                  __BITS(43,4)    // Faulting Intermediate Physical Address Bits [51:12]
867 #define HPFAR_EL2_FIPA_BITSHIFT         12
868 
869 
870 AARCH64REG_READ_INLINE(hstr_el2)                  // Hypervisor System Trap Register
871 AARCH64REG_WRITE_INLINE(hstr_el2)
872 
873 #define   HSTR_EL2_T15        __BIT(15)
874 //                            __BIT(14) Res0
875 #define   HSTR_EL2_T13        __BIT(13)
876 #define   HSTR_EL2_T12        __BIT(12)
877 #define   HSTR_EL2_T11        __BIT(11)
878 #define   HSTR_EL2_T10        __BIT(10)
879 #define   HSTR_EL2_T9         __BIT(9)
880 #define   HSTR_EL2_T8         __BIT(8)
881 #define   HSTR_EL2_T7         __BIT(7)
882 #define   HSTR_EL2_T6         __BIT(6)
883 #define   HSTR_EL2_T5         __BIT(5)
884 //                            __BIT(4) Res0
885 #define   HSTR_EL2_T3         __BIT(3)
886 #define   HSTR_EL2_T2         __BIT(2)
887 #define   HSTR_EL2_T1         __BIT(1)
888 #define   HSTR_EL2_T0         __BIT(0)
889 
890 AARCH64REG_READ_INLINE2(l2ctlr_el1, s3_1_c11_c0_2)  // Cortex-A53,57,72,73
891 AARCH64REG_WRITE_INLINE2(l2ctlr_el1, s3_1_c11_c0_2) // Cortex-A53,57,72,73
892 
893 #define   L2CTLR_NUMOFCORE    __BITS(25,24)       // Number of cores
894 #define   L2CTLR_CPUCACHEPROT __BIT(22) // CPU Cache Protection
895 #define   L2CTLR_SCUL2CACHEPROT         __BIT(21) // SCU-L2 Cache Protection
896 #define   L2CTLR_L2_INPUT_LATENCY       __BIT(5)  // L2 Data RAM input latency
897 #define   L2CTLR_L2_OUTPUT_LATENCY __BIT(0)       // L2 Data RAM output latency
898 
899 AARCH64REG_READ_INLINE(mair_el1) // Memory Attribute Indirection Register
900 AARCH64REG_WRITE_INLINE(mair_el1)
901 AARCH64REG_READ_INLINE(mair_el2)
902 AARCH64REG_WRITE_INLINE(mair_el2)
903 AARCH64REG_READ_INLINE(amair_el1)       // Auxiliary MAIR
904 AARCH64REG_WRITE_INLINE(amair_el1)
905 AARCH64REG_READ_INLINE(amair_el2)
906 AARCH64REG_WRITE_INLINE(amair_el2)
907 
908 #define   MAIR_ATTR0                     __BITS(7,0)
909 #define   MAIR_ATTR1                     __BITS(15,8)
910 #define   MAIR_ATTR2                     __BITS(23,16)
911 #define   MAIR_ATTR3                     __BITS(31,24)
912 #define   MAIR_ATTR4                     __BITS(39,32)
913 #define   MAIR_ATTR5                     __BITS(47,40)
914 #define   MAIR_ATTR6                     __BITS(55,48)
915 #define   MAIR_ATTR7                     __BITS(63,56)
916 #define   MAIR_DEVICE_nGnRnE   0x00     // NoGathering,NoReordering,NoEarlyWriteAck.
917 #define   MAIR_DEVICE_nGnRE    0x04     // NoGathering,NoReordering,EarlyWriteAck.
918 #define   MAIR_NORMAL_NC                 0x44
919 #define   MAIR_NORMAL_WT                 0xbb
920 #define   MAIR_NORMAL_WB                 0xff
921 
922 AARCH64REG_READ_INLINE(par_el1)                   // Physical Address Register
923 AARCH64REG_WRITE_INLINE(par_el1)
924 
925 #define   PAR_ATTR            __BITS(63,56)       // F=0 memory attributes
926 #define   PAR_PA                        __BITS(51,12)       // F=0 physical address
927 #define   PAR_PA_SHIFT                  12
928 #define   PAR_PA_LOWMASK                __BITS(11,0)
929 #define   PAR_NS                        __BIT(9)  // F=0 non-secure
930 #define   PAR_SH                        __BITS(8,7)         // F=0 shareability attribute
931 #define    PAR_SH_NONE                   0
932 #define    PAR_SH_OUTER                  2
933 #define    PAR_SH_INNER                  3
934 
935 #define   PAR_S                         __BIT(9)  // F=1 failure stage
936 #define   PAR_PTW                       __BIT(8)  // F=1 partial table walk
937 #define   PAR_FST                       __BITS(6,1)         // F=1 fault status code
938 #define   PAR_F                         __BIT(0)  // translation failed
939 
940 AARCH64REG_READ_INLINE(rmr_el1)                   // Reset Management Register
941 AARCH64REG_WRITE_INLINE(rmr_el1)
942 
943 AARCH64REG_READ_INLINE(rvbar_el1)       // Reset Vector Base Address Register
944 AARCH64REG_WRITE_INLINE(rvbar_el1)
945 
946 AARCH64REG_ATWRITE_INLINE(s1e0r)        // Address Translate Stages 1 EL0
947 AARCH64REG_ATWRITE_INLINE(s1e0w)
948 AARCH64REG_ATWRITE_INLINE(s1e1r)        // Address Translate Stages 1 EL1
949 AARCH64REG_ATWRITE_INLINE(s1e1w)
950 AARCH64REG_ATWRITE_INLINE(s12e0r)       // Address Translate Stages 1 and 2 EL0
951 AARCH64REG_ATWRITE_INLINE(s12e0w)
952 AARCH64REG_ATWRITE_INLINE(s12e1r)       // Address Translate Stages 1 and 2 EL1
953 AARCH64REG_ATWRITE_INLINE(s12e1w)
954 
955 AARCH64REG_READ_INLINE(sctlr_el1)       // System Control Register
956 AARCH64REG_WRITE_INLINE(sctlr_el1)
957 AARCH64REG_READ_INLINE(sctlr_el2)
958 AARCH64REG_WRITE_INLINE(sctlr_el2)
959 
960 #define   SCTLR_RES0                    0xc8222400          // Reserved ARMv8.0, write 0
961 #define   SCTLR_RES1                    0x30d00800          // Reserved ARMv8.0, write 1
962 #define   SCTLR_M                       __BIT(0)
963 #define   SCTLR_A                       __BIT(1)
964 #define   SCTLR_C                       __BIT(2)
965 #define   SCTLR_SA            __BIT(3)
966 #define   SCTLR_SA0           __BIT(4)
967 #define   SCTLR_CP15BEN                 __BIT(5)
968 #define   SCTLR_nAA           __BIT(6)
969 #define   SCTLR_ITD           __BIT(7)
970 #define   SCTLR_SED           __BIT(8)
971 #define   SCTLR_UMA           __BIT(9)
972 #define   SCTLR_EnRCTX                  __BIT(10)
973 #define   SCTLR_EOS           __BIT(11)
974 #define   SCTLR_I                       __BIT(12)
975 #define   SCTLR_EnDB                    __BIT(13)
976 #define   SCTLR_DZE           __BIT(14)
977 #define   SCTLR_UCT           __BIT(15)
978 #define   SCTLR_nTWI                    __BIT(16)
979 #define   SCTLR_nTWE                    __BIT(18)
980 #define   SCTLR_WXN           __BIT(19)
981 #define   SCTLR_TSCXT                   __BIT(20)
982 #define   SCTLR_IESB                    __BIT(21)
983 #define   SCTLR_EIS           __BIT(22)
984 #define   SCTLR_SPAN                    __BIT(23)
985 #define   SCTLR_E0E           __BIT(24)
986 #define   SCTLR_EE            __BIT(25)
987 #define   SCTLR_UCI           __BIT(26)
988 #define   SCTLR_EnDA                    __BIT(27)
989 #define   SCTLR_nTLSMD                  __BIT(28)
990 #define   SCTLR_LSMAOE                  __BIT(29)
991 #define   SCTLR_EnIB                    __BIT(30)
992 #define   SCTLR_EnIA                    __BIT(31)
993 #define   SCTLR_BT0           __BIT(35)
994 #define   SCTLR_BT1           __BIT(36)
995 #define   SCTLR_ITFSB                   __BIT(37)
996 #define   SCTLR_TCF0                    __BITS(39,38)
997 #define   SCTLR_TCF           __BITS(41,40)
998 #define   SCTLR_ATA0                    __BIT(42)
999 #define   SCTLR_ATA           __BIT(43)
1000 #define   SCTLR_DSSBS                   __BIT(44)
1001 
1002 // current EL stack pointer
1003 static __inline uint64_t
1004 reg_sp_read(void)
1005 {
1006           uint64_t __rv;
1007           __asm __volatile ("mov %0, sp" : "=r"(__rv));
1008           return __rv;
1009 }
1010 
1011 AARCH64REG_READ_INLINE(sp_el0)                    // EL0 Stack Pointer
AARCH64REG_WRITE_INLINE(sp_el0)1012 AARCH64REG_WRITE_INLINE(sp_el0)
1013 AARCH64REG_READ_INLINE(sp_el1)                    // EL1 Stack Pointer
1014 AARCH64REG_WRITE_INLINE(sp_el1)
1015 
1016 AARCH64REG_READ_INLINE(spsel)           // Stack Pointer Select
1017 AARCH64REG_WRITE_INLINE(spsel)
1018 
1019 #define   SPSEL_SP            __BIT(0); // use SP_EL0 at all exception levels
1020 
1021 AARCH64REG_READ_INLINE(spsr_el1)        // Saved Program Status Register
1022 AARCH64REG_WRITE_INLINE(spsr_el1)
1023 
1024 #define   SPSR_NZCV                     __BITS(31,28)       // mask of N Z C V
1025 #define    SPSR_N                       __BIT(31) // Negative
1026 #define    SPSR_Z                       __BIT(30) // Zero
1027 #define    SPSR_C                       __BIT(29) // Carry
1028 #define    SPSR_V                       __BIT(28) // oVerflow
1029 #define   SPSR_A32_Q                    __BIT(27) // A32: Overflow
1030 #define   SPSR_A32_IT1                  __BIT(26) // A32: IT[1]
1031 #define   SPSR_A32_IT0                  __BIT(25) // A32: IT[0]
1032 #define   SPSR_PAN            __BIT(22) // Privileged Access Never
1033 #define   SPSR_SS                       __BIT(21) // Software Step
1034 #define   SPSR_SS_SHIFT                 21
1035 #define   SPSR_IL                       __BIT(20) // Instruction Length
1036 #define   SPSR_GE                       __BITS(19,16)       // A32: SIMD GE
1037 #define   SPSR_IT7            __BIT(15) // A32: IT[7]
1038 #define   SPSR_IT6            __BIT(14) // A32: IT[6]
1039 #define   SPSR_IT5            __BIT(13) // A32: IT[5]
1040 #define   SPSR_IT4            __BIT(12) // A32: IT[4]
1041 #define   SPSR_IT3            __BIT(11) // A32: IT[3]
1042 #define   SPSR_IT2            __BIT(10) // A32: IT[2]
1043 #define   SPSR_A64_BTYPE                __BITS(11,10)       // A64: BTYPE
1044 #define   SPSR_A64_D                    __BIT(9)  // A64: Debug Exception Mask
1045 #define   SPSR_A32_E                    __BIT(9)  // A32: BE Endian Mode
1046 #define   SPSR_A                        __BIT(8)  // Async abort (SError) Mask
1047 #define   SPSR_I                        __BIT(7)  // IRQ Mask
1048 #define   SPSR_F                        __BIT(6)  // FIQ Mask
1049 #define   SPSR_A32_T                    __BIT(5)  // A32 Thumb Mode
1050 #define   SPSR_A32            __BIT(4)  // A32 Mode (a part of SPSR_M)
1051 #define   SPSR_M                        __BITS(4,0)         // Execution State
1052 #define    SPSR_M_EL3H                   0x0d
1053 #define    SPSR_M_EL3T                   0x0c
1054 #define    SPSR_M_EL2H                   0x09
1055 #define    SPSR_M_EL2T                   0x08
1056 #define    SPSR_M_EL1H                   0x05
1057 #define    SPSR_M_EL1T                   0x04
1058 #define    SPSR_M_EL0T                   0x00
1059 #define    SPSR_M_SYS32                  0x1f
1060 #define    SPSR_M_UND32                  0x1b
1061 #define    SPSR_M_ABT32                  0x17
1062 #define    SPSR_M_SVC32                  0x13
1063 #define    SPSR_M_IRQ32                  0x12
1064 #define    SPSR_M_FIQ32                  0x11
1065 #define    SPSR_M_USR32                  0x10
1066 
1067 #define   SPSR_USER_P(spsr)   (((spsr) & (SPSR_M & ~SPSR_A32)) == 0)
1068 #define   SPSR_PRIVILEGED_P(spsr) (!SPSR_USER_P((spsr)))
1069 
1070 AARCH64REG_READ_INLINE(tcr_el1)                   // Translation Control Register
1071 AARCH64REG_WRITE_INLINE(tcr_el1)
1072 
1073 /* TCR_EL1 - Translation Control Register */
1074 #define TCR_TCMA1             __BIT(58)           /* ARMv8.5-MemTag control when ADDR[59:55] = 0b11111 */
1075 #define TCR_TCMA0             __BIT(57)           /* ARMv8.5-MemTag control when ADDR[59:55] = 0b00000 */
1076 #define TCR_E0PD1             __BIT(56)           /* ARMv8.5-E0PD Faulting control for EL0 by TTBR1 */
1077 #define TCR_E0PD0             __BIT(55)           /* ARMv8.5-E0PD Faulting control for EL0 by TTBR0 */
1078 #define TCR_NFD1              __BIT(54)           /* SVE Non-fault translation table walk disable (TTBR1) */
1079 #define TCR_NFD0              __BIT(53)           /* SVE Non-fault translation table walk disable (TTBR0) */
1080 #define TCR_TBID1             __BIT(52)           /* ARMv8.3-PAuth TBI for instruction addr (TTBR1) */
1081 #define TCR_TBID0             __BIT(51)           /* ARMv8.3-PAuth TBI for instruction addr (TTBR0) */
1082 #define TCR_HWU162            __BIT(50)           /* ARMv8.1-TTPBHA bit[62] of PTE (TTBR1) */
1083 #define TCR_HWU161            __BIT(49)           /* ARMv8.1-TTPBHA bit[61] of PTE (TTBR1) */
1084 #define TCR_HWU160            __BIT(48)           /* ARMv8.1-TTPBHA bit[60] of PTE (TTBR1) */
1085 #define TCR_HWU159            __BIT(47)           /* ARMv8.1-TTPBHA bit[59] of PTE (TTBR1) */
1086 #define TCR_HWU062            __BIT(46)           /* ARMv8.1-TTPBHA bit[62] of PTE (TTBR0) */
1087 #define TCR_HWU061            __BIT(45)           /* ARMv8.1-TTPBHA bit[61] of PTE (TTBR0) */
1088 #define TCR_HWU060            __BIT(44)           /* ARMv8.1-TTPBHA bit[60] of PTE (TTBR0) */
1089 #define TCR_HWU059            __BIT(43)           /* ARMv8.1-TTPBHA bit[59] of PTE (TTBR0) */
1090 #define TCR_HPD1              __BIT(42)           /* ARMv8.1-HPD Hierarchical Permission (TTBR1) */
1091 #define TCR_HPD0              __BIT(41)           /* ARMv8.1-HPD Hierarchical Permission (TTBR0) */
1092 #define TCR_HD                          __BIT(40)           /* ARMv8.1-TTHM Hardware Dirty flag */
1093 #define TCR_HA                          __BIT(39)           /* ARMv8.1-TTHM Hardware Access flag */
1094 #define TCR_TBI1              __BIT(38)           /* ignore Top Byte TTBR1_EL1 */
1095 #define TCR_TBI0              __BIT(37)           /* ignore Top Byte TTBR0_EL1 */
1096 #define TCR_AS64K             __BIT(36)           /* Use 64K ASIDs */
1097 #define TCR_IPS                         __BITS(34,32)                 /* Intermediate PhysAdr Size */
1098 #define  TCR_IPS_4PB                    __SHIFTIN(6,TCR_IPS)          /* 52 bits (  4 PB) */
1099 #define  TCR_IPS_256TB                  __SHIFTIN(5,TCR_IPS)          /* 48 bits (256 TB) */
1100 #define  TCR_IPS_16TB                   __SHIFTIN(4,TCR_IPS)          /* 44 bits  (16 TB) */
1101 #define  TCR_IPS_4TB                    __SHIFTIN(3,TCR_IPS)          /* 42 bits  ( 4 TB) */
1102 #define  TCR_IPS_1TB                    __SHIFTIN(2,TCR_IPS)          /* 40 bits  ( 1 TB) */
1103 #define  TCR_IPS_64GB                   __SHIFTIN(1,TCR_IPS)          /* 36 bits  (64 GB) */
1104 #define  TCR_IPS_4GB                    __SHIFTIN(0,TCR_IPS)          /* 32 bits   (4 GB) */
1105 #define TCR_TG1                         __BITS(31,30)                 /* TTBR1 Page Granule Size */
1106 #define  TCR_TG1_16KB                   __SHIFTIN(1,TCR_TG1)          /* 16KB page size */
1107 #define  TCR_TG1_4KB                    __SHIFTIN(2,TCR_TG1)          /* 4KB page size */
1108 #define  TCR_TG1_64KB                   __SHIFTIN(3,TCR_TG1)          /* 64KB page size */
1109 #define TCR_SH1                         __BITS(29,28)
1110 #define  TCR_SH1_NONE                   __SHIFTIN(0,TCR_SH1)
1111 #define  TCR_SH1_OUTER                  __SHIFTIN(2,TCR_SH1)
1112 #define  TCR_SH1_INNER                  __SHIFTIN(3,TCR_SH1)
1113 #define TCR_ORGN1             __BITS(27,26)                 /* TTBR1 Outer cacheability */
1114 #define  TCR_ORGN1_NC                   __SHIFTIN(0,TCR_ORGN1)        /* Non Cacheable */
1115 #define  TCR_ORGN1_WB_WA      __SHIFTIN(1,TCR_ORGN1)        /* WriteBack WriteAllocate */
1116 #define  TCR_ORGN1_WT                   __SHIFTIN(2,TCR_ORGN1)        /* WriteThrough */
1117 #define  TCR_ORGN1_WB                   __SHIFTIN(3,TCR_ORGN1)        /* WriteBack */
1118 #define TCR_IRGN1             __BITS(25,24)                 /* TTBR1 Inner cacheability */
1119 #define  TCR_IRGN1_NC                   __SHIFTIN(0,TCR_IRGN1)        /* Non Cacheable */
1120 #define  TCR_IRGN1_WB_WA      __SHIFTIN(1,TCR_IRGN1)        /* WriteBack WriteAllocate */
1121 #define  TCR_IRGN1_WT                   __SHIFTIN(2,TCR_IRGN1)        /* WriteThrough */
1122 #define  TCR_IRGN1_WB                   __SHIFTIN(3,TCR_IRGN1)        /* WriteBack */
1123 #define TCR_EPD1              __BIT(23)           /* Walk Disable for TTBR1_EL1 */
1124 #define TCR_A1                          __BIT(22)           /* ASID is in TTBR1_EL1 */
1125 #define TCR_T1SZ              __BITS(21,16)                 /* Size offset for TTBR1_EL1 */
1126 #define TCR_TG0                         __BITS(15,14)                 /* TTBR0 Page Granule Size */
1127 #define  TCR_TG0_4KB                    __SHIFTIN(0,TCR_TG0)          /* 4KB page size */
1128 #define  TCR_TG0_64KB                   __SHIFTIN(1,TCR_TG0)          /* 64KB page size */
1129 #define  TCR_TG0_16KB                   __SHIFTIN(2,TCR_TG0)          /* 16KB page size */
1130 #define TCR_SH0                         __BITS(13,12)
1131 #define  TCR_SH0_NONE                   __SHIFTIN(0,TCR_SH0)
1132 #define  TCR_SH0_OUTER                  __SHIFTIN(2,TCR_SH0)
1133 #define  TCR_SH0_INNER                  __SHIFTIN(3,TCR_SH0)
1134 #define TCR_ORGN0             __BITS(11,10)                 /* TTBR0 Outer cacheability */
1135 #define  TCR_ORGN0_NC                   __SHIFTIN(0,TCR_ORGN0)        /* Non Cacheable */
1136 #define  TCR_ORGN0_WB_WA      __SHIFTIN(1,TCR_ORGN0)        /* WriteBack WriteAllocate */
1137 #define  TCR_ORGN0_WT                   __SHIFTIN(2,TCR_ORGN0)        /* WriteThrough */
1138 #define  TCR_ORGN0_WB                   __SHIFTIN(3,TCR_ORGN0)        /* WriteBack */
1139 #define TCR_IRGN0             __BITS(9,8)                   /* TTBR0 Inner cacheability */
1140 #define  TCR_IRGN0_NC                   __SHIFTIN(0,TCR_IRGN0)        /* Non Cacheable */
1141 #define  TCR_IRGN0_WB_WA      __SHIFTIN(1,TCR_IRGN0)        /* WriteBack WriteAllocate */
1142 #define  TCR_IRGN0_WT                   __SHIFTIN(2,TCR_IRGN0)        /* WriteThrough */
1143 #define  TCR_IRGN0_WB                   __SHIFTIN(3,TCR_IRGN0)        /* WriteBack */
1144 #define TCR_EPD0              __BIT(7)            /* Walk Disable for TTBR0 */
1145 #define TCR_T0SZ              __BITS(5,0)                   /* Size offset for TTBR0_EL1 */
1146 
1147 AARCH64REG_READ_INLINE(tcr_el2)                   // Translation Control Register EL2
1148 AARCH64REG_WRITE_INLINE(tcr_el2)
1149 
1150 /* TCR_EL2 - Translation Control Register */
1151 //                                      __BITS(63, 34)      // Res0
1152 #define TCR_EL2_MTX           __BIT(33) // Extended memory tag checking
1153 #define TCR_EL2_DS            __BIT(32) // 52-bit output address (FEAT_LPA2)
1154 //                                      __BIT(31) // Res1
1155 #define TCR_EL2_TCMA                    __BIT(30) // Unchecked accesses control (FEAT_MTE2)
1156 #define TCR_EL2_TBID                    __BIT(29) // Top Byte Instruction address matching (FEAT_PAuth)
1157 #define TCR_EL2_HWU62                   __BIT(28) // Hardware use bit 62 (FEAT_HPDS2)
1158 #define TCR_EL2_HWU61                   __BIT(27) // Hardware use bit 61 (FEAT_HPDS2)
1159 #define TCR_EL2_HWU60                   __BIT(26) // Hardware use bit 60 (FEAT_HPDS2)
1160 #define TCR_EL2_HWU59                   __BIT(25) // Hardware use bit 59 (FEAT_HPDS2)
1161 #define TCR_EL2_HPD           __BIT(24) // Hierarchical Permission Disables (FEAT_HPDS)
1162 //                                      __BIT(23) // Res1
1163 #define TCR_EL2_HD            __BIT(22) // Hardware management of dirty state (FEAT_HAFDBS)
1164 #define TCR_EL2_HA            __BIT(21) // Hardware Access flag update (FEAT_HAFDBS)
1165 #define TCR_EL2_TBI           __BIT(20) // Top Byte Ignored
1166 //                                      __BIT(19) // Res1
1167 #define TCR_EL2_PS            __BITS(18,16)       // Physical Address Size
1168 #define TCR_EL2_TG0           __BITS(15,14)       // TTBR0_EL2 Granule size
1169 #define  TCR_EL2_TG0_4KB      __SHIFTIN(0,TCR_EL2_TG0)      //   4KB page size
1170 #define  TCR_EL2_TG0_64KB     __SHIFTIN(1,TCR_EL2_TG0)      //  64KB page size
1171 #define  TCR_EL2_TG0_16KB     __SHIFTIN(2,TCR_EL2_TG0)      //  16KB page size
1172 #define TCR_EL2_SH0           __BITS(13,12)       // TTBR0_EL2 Shareability attribute
1173 #define  TCR_EL2_SH0_NONE     __SHIFTIN(0,TCR_EL2_SH0)      //  non-shareable
1174 #define  TCR_EL2_SH0_OUTER    __SHIFTIN(2,TCR_EL2_SH0)      //  Outer shareable
1175 #define  TCR_EL2_SH0_INNER    __SHIFTIN(3,TCR_EL2_SH0)      //  Inner shareable
1176 #define TCR_EL2_ORGN0                   __BITS(11,10)       // TTBR0_EL2 Outer cacheability attribute
1177 #define  TCR_EL2_ORGN0_NC     __SHIFTIN(0,TCR_EL2_ORGN0)    //  Non Cacheable
1178 #define  TCR_EL2_ORGN0_WB_WA  __SHIFTIN(1,TCR_EL2_ORGN0)    //  WriteBack WriteAllocate
1179 #define  TCR_EL2_ORGN0_WT     __SHIFTIN(2,TCR_EL2_ORGN0)    //  WriteThrough
1180 #define  TCR_EL2_ORGN0_WB     __SHIFTIN(3,TCR_EL2_ORGN0)    //  WriteBack
1181 #define TCR_EL2_IRGN0                   __BITS(9,8)         // TTBR0_EL2 Inner cacheability attribute
1182 #define  TCR_EL2_IRGN0_NC     __SHIFTIN(0,TCR_EL2_IRGN0)    //  Non Cacheable
1183 #define  TCR_EL2_IRGN0_WB_WA  __SHIFTIN(1,TCR_EL2_IRGN0)    //  WriteBack WriteAllocate
1184 #define  TCR_EL2_IRGN0_WT     __SHIFTIN(2,TCR_EL2_IRGN0)    //  WriteThrough
1185 #define  TCR_EL2_IRGN0_WB     __SHIFTIN(3,TCR_EL2_IRGN0)    //  WriteBack
1186 #define TCR_EL2_T0SZ                    __BITS(5,0)         // TTBR0_EL2 Size offset
1187 
1188 AARCH64REG_READ_INLINE(tpidr_el1)       // Thread ID Register (EL1)
1189 AARCH64REG_WRITE_INLINE(tpidr_el1)
1190 AARCH64REG_READ_INLINE(tpidr_el2)       // Thread ID Register (EL2)
1191 AARCH64REG_WRITE_INLINE(tpidr_el2)
1192 
1193 AARCH64REG_WRITE_INLINE(tpidrro_el0)    // Thread ID Register (RO for EL0)
1194 
1195 AARCH64REG_READ_INLINE(ttbr0_el1)       // Translation Table Base Register 0 EL1
1196 AARCH64REG_WRITE_INLINE(ttbr0_el1)
1197 AARCH64REG_READ_INLINE(ttbr0_el2)       // Translation Table Base Register 0 EL2
1198 AARCH64REG_WRITE_INLINE(ttbr0_el2)
1199 
1200 AARCH64REG_READ_INLINE(ttbr1_el1)       // Translation Table Base Register 1 EL1
1201 AARCH64REG_WRITE_INLINE(ttbr1_el1)
1202 
1203 #define TTBR_ASID             __BITS(63,48)
1204 #define TTBR_BADDR            __BITS(47,0)
1205 
1206 AARCH64REG_READ_INLINE(vbar_el1)        // Vector Base Address Register
1207 AARCH64REG_WRITE_INLINE(vbar_el1)
1208 AARCH64REG_READ_INLINE(vbar_el2)
1209 AARCH64REG_WRITE_INLINE(vbar_el2)
1210 
1211 AARCH64REG_READ_INLINE(vpidr_el2)       // Virtualization Processor ID Register
1212 AARCH64REG_WRITE_INLINE(vpidr_el2)
1213 AARCH64REG_READ_INLINE(vmpidr_el2)      // Virtualization Multiprocessor ID Register
1214 AARCH64REG_WRITE_INLINE(vmpidr_el2)
1215 AARCH64REG_READ_INLINE(vtcr_el2)        // Virtualization Translation Control Register
1216 AARCH64REG_WRITE_INLINE(vtcr_el2)
1217 
1218 #define VTCR_EL2_HAFT                   __BIT(44) // Hardware managed Access Flag (FEAT_HAFT)
1219 //                                      __BITS(43, 42)      // Res0
1220 #define VTCR_EL2_TL0                    __BIT(41) // TopLevel0 permission attribute control (FEAT_THE)
1221 #define VTCR_EL2_GCSH                   __BIT(40) // Assured translations for guarded control stacks (FEAT_THE+FEAT_GCS)
1222 //                                      __BIT(39) // Res0
1223 #define VTCR_EL2_D128                   __BIT(38) // VMSAv9-128 (FEAT_D128)
1224 #define VTCR_EL2_S2POE                  __BIT(37) // Enable stage 2 Permission Overlay (FEAT_S2POE)
1225 #define VTCR_EL2_S2PIE                  __BIT(36) // Select Permission Model. (FEAT_S2PIE)
1226 #define VTCR_EL2_TL1                    __BIT(35) // TopLevel1 permission attribute control (FEAT_THE)
1227 #define VTCR_EL2_AO           __BIT(34) // AssuredOnly attribute enable (FEAT_THE)
1228 #define VTCR_EL2_SL2                    __BIT(33) // Stage 2 starting level (FEAT_LPA2)
1229 #define VTCR_EL2_DS           __BIT(32) // 52-bit output address (FEAT_LPA2)
1230 //                                      __BIT(31) // Res1
1231 #define VTCR_EL2_NSA                    __BIT(30) // Non-secure S2 translation output address space (FEAT_SEL2)
1232 #define VTCR_EL2_NSW                    __BIT(29) // Non-secure S2 translation table address space (FEAT_SEL2)
1233 #define VTCR_EL2_HWU62                  __BIT(28) // Hardware use bit 62 (FEAT_HPDS2)
1234 #define VTCR_EL2_HWU61                  __BIT(27) // Hardware use bit 61 (FEAT_HPDS2)
1235 #define VTCR_EL2_HWU60                  __BIT(26) // Hardware use bit 60 (FEAT_HPDS2)
1236 #define VTCR_EL2_HWU59                  __BIT(25) // Hardware use bit 59 (FEAT_HPDS2)
1237 //                                      __BITS(24, 23)      // Res0
1238 #define VTCR_EL2_HD           __BIT(22) // Hardware Dirty state management (FEAT_HAFDBS)
1239 #define VTCR_EL2_HA           __BIT(21) // Hardware Access flag management (FEAT_HAFDBS)
1240 #define VTCR_EL2_VS           __BIT(19) // VMID size (FEAT_VMID16)
1241 #define VTCR_EL2_PS           __BITS(18,16)       // Physical address Size
1242 #define VTCR_EL2_TG0                    __BITS(15,14)       // VTTBR_EL2 Granule size
1243 #define VTCR_EL2_SH0                    __BITS(13,12)       // V{,S}TTBR_EL2 shareability attribute
1244 #define VTCR_EL2_ORGN0                  __BITS(11,10)       // V{,S}TTBR_EL2 outer cacheability
1245 #define VTCR_EL2_IRGN0                  __BITS(9,8)         // V{,S}TTBR_EL2 inner cacheability
1246 #define VTCR_EL2_SL0                    __BITS(7,6)         // Start Level of S2 translation lookup.
1247 #define VTCR_EL2_T0SZ                   __BITS(5,0)         // VTTBR_EL2 Size offset
1248 
1249 
1250 AARCH64REG_READ_INLINE(vttbr_el2)       // Virtualization Translation Table Base Register
1251 AARCH64REG_WRITE_INLINE(vttbr_el2)
1252 
1253 #define VTTBR_VIMD            __BITS(55,48)
1254 #define VTTBR_BADDR           __BITS(47,0)
1255 
1256 /*
1257  * From here on, these are DEBUG registers
1258  */
1259 AARCH64REG_READ_INLINE(dbgbcr0_el1) // Debug Breakpoint Control Register 0
1260 AARCH64REG_WRITE_INLINE(dbgbcr0_el1)
1261 AARCH64REG_READ_INLINE(dbgbcr1_el1) // Debug Breakpoint Control Register 1
1262 AARCH64REG_WRITE_INLINE(dbgbcr1_el1)
1263 AARCH64REG_READ_INLINE(dbgbcr2_el1) // Debug Breakpoint Control Register 2
1264 AARCH64REG_WRITE_INLINE(dbgbcr2_el1)
1265 AARCH64REG_READ_INLINE(dbgbcr3_el1) // Debug Breakpoint Control Register 3
1266 AARCH64REG_WRITE_INLINE(dbgbcr3_el1)
1267 AARCH64REG_READ_INLINE(dbgbcr4_el1) // Debug Breakpoint Control Register 4
1268 AARCH64REG_WRITE_INLINE(dbgbcr4_el1)
1269 AARCH64REG_READ_INLINE(dbgbcr5_el1) // Debug Breakpoint Control Register 5
1270 AARCH64REG_WRITE_INLINE(dbgbcr5_el1)
1271 AARCH64REG_READ_INLINE(dbgbcr6_el1) // Debug Breakpoint Control Register 6
1272 AARCH64REG_WRITE_INLINE(dbgbcr6_el1)
1273 AARCH64REG_READ_INLINE(dbgbcr7_el1) // Debug Breakpoint Control Register 7
1274 AARCH64REG_WRITE_INLINE(dbgbcr7_el1)
1275 AARCH64REG_READ_INLINE(dbgbcr8_el1) // Debug Breakpoint Control Register 8
1276 AARCH64REG_WRITE_INLINE(dbgbcr8_el1)
1277 AARCH64REG_READ_INLINE(dbgbcr9_el1) // Debug Breakpoint Control Register 9
1278 AARCH64REG_WRITE_INLINE(dbgbcr9_el1)
1279 AARCH64REG_READ_INLINE(dbgbcr10_el1) // Debug Breakpoint Control Register 10
1280 AARCH64REG_WRITE_INLINE(dbgbcr10_el1)
1281 AARCH64REG_READ_INLINE(dbgbcr11_el1) // Debug Breakpoint Control Register 11
1282 AARCH64REG_WRITE_INLINE(dbgbcr11_el1)
1283 AARCH64REG_READ_INLINE(dbgbcr12_el1) // Debug Breakpoint Control Register 12
1284 AARCH64REG_WRITE_INLINE(dbgbcr12_el1)
1285 AARCH64REG_READ_INLINE(dbgbcr13_el1) // Debug Breakpoint Control Register 13
1286 AARCH64REG_WRITE_INLINE(dbgbcr13_el1)
1287 AARCH64REG_READ_INLINE(dbgbcr14_el1) // Debug Breakpoint Control Register 14
1288 AARCH64REG_WRITE_INLINE(dbgbcr14_el1)
1289 AARCH64REG_READ_INLINE(dbgbcr15_el1) // Debug Breakpoint Control Register 15
1290 AARCH64REG_WRITE_INLINE(dbgbcr15_el1)
1291 
1292 #define   DBGBCR_BT            __BITS(23,20)
1293 #define   DBGBCR_LBN                     __BITS(19,16)
1294 #define   DBGBCR_SSC                     __BITS(15,14)
1295 #define   DBGBCR_HMC                     __BIT(13)
1296 #define   DBGBCR_BAS                     __BITS(8,5)
1297 #define   DBGBCR_PMC                     __BITS(2,1)
1298 #define   DBGBCR_E             __BIT(0)
1299 
1300 AARCH64REG_READ_INLINE(dbgbvr0_el1) // Debug Breakpoint Value Register 0
1301 AARCH64REG_WRITE_INLINE(dbgbvr0_el1)
1302 AARCH64REG_READ_INLINE(dbgbvr1_el1) // Debug Breakpoint Value Register 1
1303 AARCH64REG_WRITE_INLINE(dbgbvr1_el1)
1304 AARCH64REG_READ_INLINE(dbgbvr2_el1) // Debug Breakpoint Value Register 2
1305 AARCH64REG_WRITE_INLINE(dbgbvr2_el1)
1306 AARCH64REG_READ_INLINE(dbgbvr3_el1) // Debug Breakpoint Value Register 3
1307 AARCH64REG_WRITE_INLINE(dbgbvr3_el1)
1308 AARCH64REG_READ_INLINE(dbgbvr4_el1) // Debug Breakpoint Value Register 4
1309 AARCH64REG_WRITE_INLINE(dbgbvr4_el1)
1310 AARCH64REG_READ_INLINE(dbgbvr5_el1) // Debug Breakpoint Value Register 5
1311 AARCH64REG_WRITE_INLINE(dbgbvr5_el1)
1312 AARCH64REG_READ_INLINE(dbgbvr6_el1) // Debug Breakpoint Value Register 6
1313 AARCH64REG_WRITE_INLINE(dbgbvr6_el1)
1314 AARCH64REG_READ_INLINE(dbgbvr7_el1) // Debug Breakpoint Value Register 7
1315 AARCH64REG_WRITE_INLINE(dbgbvr7_el1)
1316 AARCH64REG_READ_INLINE(dbgbvr8_el1) // Debug Breakpoint Value Register 8
1317 AARCH64REG_WRITE_INLINE(dbgbvr8_el1)
1318 AARCH64REG_READ_INLINE(dbgbvr9_el1) // Debug Breakpoint Value Register 9
1319 AARCH64REG_WRITE_INLINE(dbgbvr9_el1)
1320 AARCH64REG_READ_INLINE(dbgbvr10_el1) // Debug Breakpoint Value Register 10
1321 AARCH64REG_WRITE_INLINE(dbgbvr10_el1)
1322 AARCH64REG_READ_INLINE(dbgbvr11_el1) // Debug Breakpoint Value Register 11
1323 AARCH64REG_WRITE_INLINE(dbgbvr11_el1)
1324 AARCH64REG_READ_INLINE(dbgbvr12_el1) // Debug Breakpoint Value Register 12
1325 AARCH64REG_WRITE_INLINE(dbgbvr12_el1)
1326 AARCH64REG_READ_INLINE(dbgbvr13_el1) // Debug Breakpoint Value Register 13
1327 AARCH64REG_WRITE_INLINE(dbgbvr13_el1)
1328 AARCH64REG_READ_INLINE(dbgbvr14_el1) // Debug Breakpoint Value Register 14
1329 AARCH64REG_WRITE_INLINE(dbgbvr14_el1)
1330 AARCH64REG_READ_INLINE(dbgbvr15_el1) // Debug Breakpoint Value Register 15
1331 AARCH64REG_WRITE_INLINE(dbgbvr15_el1)
1332 
1333 #define   DBGBVR_MASK                    __BITS(63,2)
1334 
1335 AARCH64REG_READ_INLINE(dbgwcr0_el1) // Debug Watchpoint Control Register 0
1336 AARCH64REG_WRITE_INLINE(dbgwcr0_el1)
1337 AARCH64REG_READ_INLINE(dbgwcr1_el1) // Debug Watchpoint Control Register 1
1338 AARCH64REG_WRITE_INLINE(dbgwcr1_el1)
1339 AARCH64REG_READ_INLINE(dbgwcr2_el1) // Debug Watchpoint Control Register 2
1340 AARCH64REG_WRITE_INLINE(dbgwcr2_el1)
1341 AARCH64REG_READ_INLINE(dbgwcr3_el1) // Debug Watchpoint Control Register 3
1342 AARCH64REG_WRITE_INLINE(dbgwcr3_el1)
1343 AARCH64REG_READ_INLINE(dbgwcr4_el1) // Debug Watchpoint Control Register 4
1344 AARCH64REG_WRITE_INLINE(dbgwcr4_el1)
1345 AARCH64REG_READ_INLINE(dbgwcr5_el1) // Debug Watchpoint Control Register 5
1346 AARCH64REG_WRITE_INLINE(dbgwcr5_el1)
1347 AARCH64REG_READ_INLINE(dbgwcr6_el1) // Debug Watchpoint Control Register 6
1348 AARCH64REG_WRITE_INLINE(dbgwcr6_el1)
1349 AARCH64REG_READ_INLINE(dbgwcr7_el1) // Debug Watchpoint Control Register 7
1350 AARCH64REG_WRITE_INLINE(dbgwcr7_el1)
1351 AARCH64REG_READ_INLINE(dbgwcr8_el1) // Debug Watchpoint Control Register 8
1352 AARCH64REG_WRITE_INLINE(dbgwcr8_el1)
1353 AARCH64REG_READ_INLINE(dbgwcr9_el1) // Debug Watchpoint Control Register 9
1354 AARCH64REG_WRITE_INLINE(dbgwcr9_el1)
1355 AARCH64REG_READ_INLINE(dbgwcr10_el1) // Debug Watchpoint Control Register 10
1356 AARCH64REG_WRITE_INLINE(dbgwcr10_el1)
1357 AARCH64REG_READ_INLINE(dbgwcr11_el1) // Debug Watchpoint Control Register 11
1358 AARCH64REG_WRITE_INLINE(dbgwcr11_el1)
1359 AARCH64REG_READ_INLINE(dbgwcr12_el1) // Debug Watchpoint Control Register 12
1360 AARCH64REG_WRITE_INLINE(dbgwcr12_el1)
1361 AARCH64REG_READ_INLINE(dbgwcr13_el1) // Debug Watchpoint Control Register 13
1362 AARCH64REG_WRITE_INLINE(dbgwcr13_el1)
1363 AARCH64REG_READ_INLINE(dbgwcr14_el1) // Debug Watchpoint Control Register 14
1364 AARCH64REG_WRITE_INLINE(dbgwcr14_el1)
1365 AARCH64REG_READ_INLINE(dbgwcr15_el1) // Debug Watchpoint Control Register 15
1366 AARCH64REG_WRITE_INLINE(dbgwcr15_el1)
1367 
1368 #define   DBGWCR_MASK                    __BITS(28,24)
1369 #define   DBGWCR_WT            __BIT(20)
1370 #define   DBGWCR_LBN                     __BITS(19,16)
1371 #define   DBGWCR_SSC                     __BITS(15,14)
1372 #define   DBGWCR_HMC                     __BIT(13)
1373 #define   DBGWCR_BAS                     __BITS(12,5)
1374 #define   DBGWCR_LSC                     __BITS(4,3)
1375 #define   DBGWCR_PAC                     __BITS(2,1)
1376 #define   DBGWCR_E             __BIT(0)
1377 
1378 AARCH64REG_READ_INLINE(dbgwvr0_el1) // Debug Watchpoint Value Register 0
1379 AARCH64REG_WRITE_INLINE(dbgwvr0_el1)
1380 AARCH64REG_READ_INLINE(dbgwvr1_el1) // Debug Watchpoint Value Register 1
1381 AARCH64REG_WRITE_INLINE(dbgwvr1_el1)
1382 AARCH64REG_READ_INLINE(dbgwvr2_el1) // Debug Watchpoint Value Register 2
1383 AARCH64REG_WRITE_INLINE(dbgwvr2_el1)
1384 AARCH64REG_READ_INLINE(dbgwvr3_el1) // Debug Watchpoint Value Register 3
1385 AARCH64REG_WRITE_INLINE(dbgwvr3_el1)
1386 AARCH64REG_READ_INLINE(dbgwvr4_el1) // Debug Watchpoint Value Register 4
1387 AARCH64REG_WRITE_INLINE(dbgwvr4_el1)
1388 AARCH64REG_READ_INLINE(dbgwvr5_el1) // Debug Watchpoint Value Register 5
1389 AARCH64REG_WRITE_INLINE(dbgwvr5_el1)
1390 AARCH64REG_READ_INLINE(dbgwvr6_el1) // Debug Watchpoint Value Register 6
1391 AARCH64REG_WRITE_INLINE(dbgwvr6_el1)
1392 AARCH64REG_READ_INLINE(dbgwvr7_el1) // Debug Watchpoint Value Register 7
1393 AARCH64REG_WRITE_INLINE(dbgwvr7_el1)
1394 AARCH64REG_READ_INLINE(dbgwvr8_el1) // Debug Watchpoint Value Register 8
1395 AARCH64REG_WRITE_INLINE(dbgwvr8_el1)
1396 AARCH64REG_READ_INLINE(dbgwvr9_el1) // Debug Watchpoint Value Register 9
1397 AARCH64REG_WRITE_INLINE(dbgwvr9_el1)
1398 AARCH64REG_READ_INLINE(dbgwvr10_el1) // Debug Watchpoint Value Register 10
1399 AARCH64REG_WRITE_INLINE(dbgwvr10_el1)
1400 AARCH64REG_READ_INLINE(dbgwvr11_el1) // Debug Watchpoint Value Register 11
1401 AARCH64REG_WRITE_INLINE(dbgwvr11_el1)
1402 AARCH64REG_READ_INLINE(dbgwvr12_el1) // Debug Watchpoint Value Register 12
1403 AARCH64REG_WRITE_INLINE(dbgwvr12_el1)
1404 AARCH64REG_READ_INLINE(dbgwvr13_el1) // Debug Watchpoint Value Register 13
1405 AARCH64REG_WRITE_INLINE(dbgwvr13_el1)
1406 AARCH64REG_READ_INLINE(dbgwvr14_el1) // Debug Watchpoint Value Register 14
1407 AARCH64REG_WRITE_INLINE(dbgwvr14_el1)
1408 AARCH64REG_READ_INLINE(dbgwvr15_el1) // Debug Watchpoint Value Register 15
1409 AARCH64REG_WRITE_INLINE(dbgwvr15_el1)
1410 
1411 #define   DBGWVR_MASK                    __BITS(63,2)
1412 
1413 
1414 AARCH64REG_READ_INLINE(mdscr_el1) // Monitor Debug System Control Register
1415 AARCH64REG_WRITE_INLINE(mdscr_el1)
1416 
1417 #define   MDSCR_RXFULL                  __BIT(30) // for EDSCR.RXfull
1418 #define   MDSCR_TXFULL                  __BIT(29) // for EDSCR.TXfull
1419 #define   MDSCR_RXO           __BIT(27) // for EDSCR.RXO
1420 #define   MDSCR_TXU           __BIT(26) // for EDSCR.TXU
1421 #define   MDSCR_INTDIS                  __BITS(32,22)       // for EDSCR.INTdis
1422 #define   MDSCR_TDA           __BIT(21) // for EDSCR.TDA
1423 #define   MDSCR_MDE           __BIT(15) // Monitor debug events
1424 #define   MDSCR_HDE           __BIT(14) // for EDSCR.HDE
1425 #define   MDSCR_KDE           __BIT(13) // Local debug enable
1426 #define   MDSCR_TDCC                    __BIT(12) // Trap Debug CommCh access
1427 #define   MDSCR_ERR           __BIT(6)  // for EDSCR.ERR
1428 #define   MDSCR_SS            __BIT(0)  // Software step
1429 
1430 AARCH64REG_WRITE_INLINE(oslar_el1)      // OS Lock Access Register
1431 
1432 AARCH64REG_READ_INLINE(oslsr_el1)       // OS Lock Status Register
1433 
1434 /*
1435  * From here on, these are PMC registers
1436  */
1437 
1438 AARCH64REG_READ_INLINE(pmccfiltr_el0)
1439 AARCH64REG_WRITE_INLINE(pmccfiltr_el0)
1440 
1441 #define   PMCCFILTR_P                   __BIT(31) // Don't count cycles in EL1
1442 #define   PMCCFILTR_U                   __BIT(30) // Don't count cycles in EL0
1443 #define   PMCCFILTR_NSK                 __BIT(29) // Don't count cycles in NS EL1
1444 #define   PMCCFILTR_NSU                 __BIT(28) // Don't count cycles in NS EL0
1445 #define   PMCCFILTR_NSH                 __BIT(27) // Don't count cycles in NS EL2
1446 #define   PMCCFILTR_M                   __BIT(26) // Don't count cycles in EL3
1447 
1448 AARCH64REG_READ_INLINE(pmccntr_el0)
1449 
1450 AARCH64REG_READ_INLINE(pmceid0_el0)
1451 AARCH64REG_READ_INLINE(pmceid1_el0)
1452 
1453 AARCH64REG_WRITE_INLINE(pmcntenclr_el0)
1454 AARCH64REG_WRITE_INLINE(pmcntenset_el0)
1455 
1456 #define   PMCNTEN_C           __BIT(31) // Enable the cycle counter
1457 #define   PMCNTEN_P           __BITS(30,0)        // Enable event counter bits
1458 
1459 AARCH64REG_READ_INLINE(pmcr_el0)
1460 AARCH64REG_WRITE_INLINE(pmcr_el0)
1461 
1462 #define   PMCR_IMP            __BITS(31,24)       // Implementor code
1463 #define   PMCR_IDCODE                   __BITS(23,16)       // Identification code
1464 #define   PMCR_N                        __BITS(15,11)       // Number of event counters
1465 #define   PMCR_LP                       __BIT(7)  // Long event counter enable
1466 #define   PMCR_LC                       __BIT(6)  // Long cycle counter enable
1467 #define   PMCR_DP                       __BIT(5)  // Disable cycle counter when event
1468                                                             // counting is prohibited
1469 #define   PMCR_X                        __BIT(4)  // Enable export of events
1470 #define   PMCR_D                        __BIT(3)  // Clock divider
1471 #define   PMCR_C                        __BIT(2)  // Cycle counter reset
1472 #define   PMCR_P                        __BIT(1)  // Event counter reset
1473 #define   PMCR_E                        __BIT(0)  // Enable
1474 
1475 
1476 AARCH64REG_READ_INLINE(pmevcntr1_el0)
1477 AARCH64REG_WRITE_INLINE(pmevcntr1_el0)
1478 
1479 AARCH64REG_READ_INLINE(pmevtyper1_el0)
1480 AARCH64REG_WRITE_INLINE(pmevtyper1_el0)
1481 
1482 #define   PMEVTYPER_P                   __BIT(31) // Don't count events in EL1
1483 #define   PMEVTYPER_U                   __BIT(30) // Don't count events in EL0
1484 #define   PMEVTYPER_NSK                 __BIT(29) // Don't count events in NS EL1
1485 #define   PMEVTYPER_NSU                 __BIT(28) // Don't count events in NS EL0
1486 #define   PMEVTYPER_NSH                 __BIT(27) // Count events in NS EL2
1487 #define   PMEVTYPER_M                   __BIT(26) // Don't count events in EL3
1488 #define   PMEVTYPER_MT                  __BIT(25) // Count events on all CPUs with same
1489                                                             // aff1 level
1490 #define   PMEVTYPER_EVTCOUNT  __BITS(15,0)        // Event to count
1491 
1492 AARCH64REG_WRITE_INLINE(pmintenclr_el1)
1493 AARCH64REG_WRITE_INLINE(pmintenset_el1)
1494 
1495 #define PMINTEN_C             __BIT(31) // for the cycle counter
1496 #define PMINTEN_P             __BITS(30,0)        // for event counters (0-30)
1497 
1498 AARCH64REG_WRITE_INLINE(pmovsclr_el0)
1499 AARCH64REG_READ_INLINE(pmovsset_el0)
1500 AARCH64REG_WRITE_INLINE(pmovsset_el0)
1501 
1502 #define PMOVS_C                         __BIT(31) // for the cycle counter
1503 #define PMOVS_P                         __BITS(30,0)        // for event counters (0-30)
1504 
1505 AARCH64REG_WRITE_INLINE(pmselr_el0)
1506 
1507 AARCH64REG_WRITE_INLINE(pmswinc_el0)
1508 
1509 AARCH64REG_READ_INLINE(pmuserenr_el0)
1510 AARCH64REG_WRITE_INLINE(pmuserenr_el0)
1511 
1512 AARCH64REG_READ_INLINE(pmxevcntr_el0)
1513 AARCH64REG_WRITE_INLINE(pmxevcntr_el0)
1514 
1515 AARCH64REG_READ_INLINE(pmxevtyper_el0)
1516 AARCH64REG_WRITE_INLINE(pmxevtyper_el0)
1517 
1518 /*
1519  * Generic timer registers
1520  */
1521 
1522 AARCH64REG_READ_INLINE(cntfrq_el0)
1523 
1524 AARCH64REG_READ_INLINE(cnthctl_el2)
1525 AARCH64REG_WRITE_INLINE(cnthctl_el2)
1526 
1527 #define   CNTHCTL_EVNTDIR               __BIT(3)
1528 #define   CNTHCTL_EVNTEN                __BIT(2)
1529 #define   CNTHCTL_EL1PCEN               __BIT(1)
1530 #define   CNTHCTL_EL1PCTEN    __BIT(0)
1531 
1532 AARCH64REG_READ_INLINE(cntkctl_el1)
1533 AARCH64REG_WRITE_INLINE(cntkctl_el1)
1534 
1535 #define   CNTKCTL_EL0PTEN               __BIT(9)  // EL0 access for CNTP CVAL/TVAL/CTL
1536 #define   CNTKCTL_PL0PTEN               CNTKCTL_EL0PTEN
1537 #define   CNTKCTL_EL0VTEN               __BIT(8)  // EL0 access for CNTV CVAL/TVAL/CTL
1538 #define   CNTKCTL_PL0VTEN               CNTKCTL_EL0VTEN
1539 #define   CNTKCTL_ELNTI                 __BITS(7,4)
1540 #define   CNTKCTL_EVNTDIR               __BIT(3)
1541 #define   CNTKCTL_EVNTEN                __BIT(2)
1542 #define   CNTKCTL_EL0VCTEN    __BIT(1)  // EL0 access for CNTVCT and CNTFRQ
1543 #define   CNTKCTL_PL0VCTEN    CNTKCTL_EL0VCTEN
1544 #define   CNTKCTL_EL0PCTEN    __BIT(0)  // EL0 access for CNTPCT and CNTFRQ
1545 #define   CNTKCTL_PL0PCTEN    CNTKCTL_EL0PCTEN
1546 
1547 AARCH64REG_READ_INLINE(cntp_ctl_el0)
1548 AARCH64REG_WRITE_INLINE(cntp_ctl_el0)
1549 AARCH64REG_READ_INLINE(cntp_cval_el0)
1550 AARCH64REG_WRITE_INLINE(cntp_cval_el0)
1551 AARCH64REG_READ_INLINE(cntp_tval_el0)
1552 AARCH64REG_WRITE_INLINE(cntp_tval_el0)
1553 AARCH64REG_READ_INLINE(cntpct_el0)
1554 AARCH64REG_WRITE_INLINE(cntpct_el0)
1555 
1556 AARCH64REG_READ_INLINE(cntps_ctl_el1)
1557 AARCH64REG_WRITE_INLINE(cntps_ctl_el1)
1558 AARCH64REG_READ_INLINE(cntps_cval_el1)
1559 AARCH64REG_WRITE_INLINE(cntps_cval_el1)
1560 AARCH64REG_READ_INLINE(cntps_tval_el1)
1561 AARCH64REG_WRITE_INLINE(cntps_tval_el1)
1562 
1563 AARCH64REG_READ_INLINE(cntv_ctl_el0)
1564 AARCH64REG_WRITE_INLINE(cntv_ctl_el0)
1565 AARCH64REG_READ_INLINE(cntv_cval_el0)
1566 AARCH64REG_WRITE_INLINE(cntv_cval_el0)
1567 AARCH64REG_READ_INLINE(cntv_tval_el0)
1568 AARCH64REG_WRITE_INLINE(cntv_tval_el0)
1569 AARCH64REG_READ_INLINE(cntvct_el0)
1570 AARCH64REG_WRITE_INLINE(cntvct_el0)
1571 
1572 #define   CNTCTL_ISTATUS                __BIT(2)  // Interrupt Asserted
1573 #define   CNTCTL_IMASK                  __BIT(1)  // Timer Interrupt is Masked
1574 #define   CNTCTL_ENABLE                 __BIT(0)  // Timer Enabled
1575 
1576 // ID_AA64PFR0_EL1: AArch64 Processor Feature Register 0
1577 #define   ID_AA64PFR0_EL1_CSV3                    __BITS(63,60) // Speculative fault data
1578 #define    ID_AA64PFR0_EL1_CSV3_NONE    0
1579 #define    ID_AA64PFR0_EL1_CSV3_IMPL    1
1580 #define   ID_AA64PFR0_EL1_CSV2                    __BITS(59,56) // Speculative branches
1581 #define    ID_AA64PFR0_EL1_CSV2_NONE    0
1582 #define    ID_AA64PFR0_EL1_CSV2_IMPL    1
1583 // reserved [55:52]
1584 #define   ID_AA64PFR0_EL1_DIT           __BITS(51,48) // Data-indep. timing
1585 #define    ID_AA64PFR0_EL1_DIT_NONE     0
1586 #define    ID_AA64PFR0_EL1_DIT_IMPL     1
1587 #define   ID_AA64PFR0_EL1_AMU           __BITS(47,44) // Activity monitors ext.
1588 #define    ID_AA64PFR0_EL1_AMU_NONE     0
1589 #define    ID_AA64PFR0_EL1_AMU_IMPLv8_4 1
1590 #define    ID_AA64PFR0_EL1_AMU_IMPLv8_6 2
1591 #define   ID_AA64PFR0_EL1_MPAM                    __BITS(43,40) // MPAM Extension
1592 #define    ID_AA64PFR0_EL1_MPAM_NONE    0
1593 #define    ID_AA64PFR0_EL1_MPAM_IMPL    1
1594 #define   ID_AA64PFR0_EL1_SEL2                    __BITS(43,40) // Secure EL2
1595 #define    ID_AA64PFR0_EL1_SEL2_NONE    0
1596 #define    ID_AA64PFR0_EL1_SEL2_IMPL    1
1597 #define   ID_AA64PFR0_EL1_SVE           __BITS(35,32) // Scalable Vector
1598 #define    ID_AA64PFR0_EL1_SVE_NONE      0
1599 #define    ID_AA64PFR0_EL1_SVE_IMPL      1
1600 #define   ID_AA64PFR0_EL1_RAS           __BITS(31,28) // RAS Extension
1601 #define    ID_AA64PFR0_EL1_RAS_NONE      0
1602 #define    ID_AA64PFR0_EL1_RAS_IMPL      1
1603 #define    ID_AA64PFR0_EL1_RAS_ERX       2
1604 #define   ID_AA64PFR0_EL1_GIC           __BITS(24,27) // GIC CPU IF
1605 #define   ID_AA64PFR0_EL1_GIC_SHIFT     24
1606 #define    ID_AA64PFR0_EL1_GIC_CPUIF_EN  1
1607 #define    ID_AA64PFR0_EL1_GIC_CPUIF_NONE          0
1608 #define   ID_AA64PFR0_EL1_ADVSIMD                 __BITS(23,20) // SIMD
1609 #define    ID_AA64PFR0_EL1_ADV_SIMD_IMPL           0x0
1610 #define    ID_AA64PFR0_EL1_ADV_SIMD_HP   0x1
1611 #define    ID_AA64PFR0_EL1_ADV_SIMD_NONE           0xf
1612 #define   ID_AA64PFR0_EL1_FP            __BITS(19,16) // FP
1613 #define    ID_AA64PFR0_EL1_FP_IMPL       0x0
1614 #define    ID_AA64PFR0_EL1_FP_HP                   0x1
1615 #define    ID_AA64PFR0_EL1_FP_NONE       0xf
1616 #define   ID_AA64PFR0_EL1_EL3           __BITS(15,12) // EL3 handling
1617 #define    ID_AA64PFR0_EL1_EL3_NONE      0
1618 #define    ID_AA64PFR0_EL1_EL3_64                  1
1619 #define    ID_AA64PFR0_EL1_EL3_64_32     2
1620 #define   ID_AA64PFR0_EL1_EL2           __BITS(11,8) // EL2 handling
1621 #define    ID_AA64PFR0_EL1_EL2_NONE      0
1622 #define    ID_AA64PFR0_EL1_EL2_64                  1
1623 #define    ID_AA64PFR0_EL1_EL2_64_32     2
1624 #define   ID_AA64PFR0_EL1_EL1           __BITS(7,4) // EL1 handling
1625 #define    ID_AA64PFR0_EL1_EL1_64                  1
1626 #define    ID_AA64PFR0_EL1_EL1_64_32     2
1627 #define   ID_AA64PFR0_EL1_EL0           __BITS(3,0) // EL0 handling
1628 #define    ID_AA64PFR0_EL1_EL0_64                  1
1629 #define    ID_AA64PFR0_EL1_EL0_64_32     2
1630 
1631 /*
1632  * GICv3 system registers
1633  */
1634 AARCH64REG_READWRITE_INLINE2(icc_sre_el1, s3_0_c12_c12_5)
1635 AARCH64REG_READWRITE_INLINE2(icc_ctlr_el1, s3_0_c12_c12_4)
1636 AARCH64REG_READWRITE_INLINE2(icc_pmr_el1, s3_0_c4_c6_0)
1637 AARCH64REG_READWRITE_INLINE2(icc_bpr0_el1, s3_0_c12_c8_3)
1638 AARCH64REG_READWRITE_INLINE2(icc_bpr1_el1, s3_0_c12_c12_3)
1639 AARCH64REG_READWRITE_INLINE2(icc_igrpen0_el1, s3_0_c12_c12_6)
1640 AARCH64REG_READWRITE_INLINE2(icc_igrpen1_el1, s3_0_c12_c12_7)
1641 AARCH64REG_READWRITE_INLINE2(icc_eoir0_el1, s3_0_c12_c8_1)
1642 AARCH64REG_READWRITE_INLINE2(icc_eoir1_el1, s3_0_c12_c12_1)
1643 AARCH64REG_READWRITE_INLINE2(icc_sgi1r_el1, s3_0_c12_c11_5)
1644 AARCH64REG_READ_INLINE2(icc_iar1_el1, s3_0_c12_c12_0)
1645 
1646 // ICC_SRE_EL1: Interrupt Controller System Register Enable register
1647 #define   ICC_SRE_EL1_DIB               __BIT(2)
1648 #define   ICC_SRE_EL1_DFB               __BIT(1)
1649 #define   ICC_SRE_EL1_SRE               __BIT(0)
1650 
1651 // ICC_SRE_EL2: Interrupt Controller System Register Enable register
1652 #define   ICC_SRE_EL2_EN                __BIT(3)
1653 #define   ICC_SRE_EL2_DIB               __BIT(2)
1654 #define   ICC_SRE_EL2_DFB               __BIT(1)
1655 #define   ICC_SRE_EL2_SRE               __BIT(0)
1656 
1657 // ICC_BPR[01]_EL1: Interrupt Controller Binary Point Register 0/1
1658 #define   ICC_BPR_EL1_BinaryPoint       __BITS(2,0)
1659 
1660 // ICC_CTLR_EL1: Interrupt Controller Control Register
1661 #define   ICC_CTLR_EL1_A3V    __BIT(15)
1662 #define   ICC_CTLR_EL1_SEIS   __BIT(14)
1663 #define   ICC_CTLR_EL1_IDbits __BITS(13,11)
1664 #define   ICC_CTLR_EL1_PRIbits          __BITS(10,8)
1665 #define   ICC_CTLR_EL1_PMHE   __BIT(6)
1666 #define   ICC_CTLR_EL1_EOImode          __BIT(1)
1667 #define   ICC_CTLR_EL1_CBPR   __BIT(0)
1668 
1669 // ICC_IGRPEN[01]_EL1: Interrupt Controller Interrupt Group 0/1 Enable register
1670 #define   ICC_IGRPEN_EL1_Enable         __BIT(0)
1671 
1672 // ICC_SGI[01]R_EL1: Interrupt Controller Software Generated Interrupt Group 0/1 Register
1673 #define   ICC_SGIR_EL1_Aff3   __BITS(55,48)
1674 #define   ICC_SGIR_EL1_IRM    __BIT(40)
1675 #define   ICC_SGIR_EL1_Aff2   __BITS(39,32)
1676 #define   ICC_SGIR_EL1_INTID  __BITS(27,24)
1677 #define   ICC_SGIR_EL1_Aff1   __BITS(23,16)
1678 #define   ICC_SGIR_EL1_TargetList       __BITS(15,0)
1679 #define   ICC_SGIR_EL1_Aff    (ICC_SGIR_EL1_Aff3|ICC_SGIR_EL1_Aff2|ICC_SGIR_EL1_Aff1)
1680 
1681 // ICC_IAR[01]_EL1: Interrupt Controller Interrupt Acknowledge Register 0/1
1682 #define   ICC_IAR_INTID                 __BITS(23,0)
1683 #define   ICC_IAR_INTID_SPURIOUS        1023
1684 
1685 /*
1686  * GICv3 REGISTER ACCESS
1687  */
1688 
1689 #define   icc_sre_read                  reg_icc_sre_el1_read
1690 #define   icc_sre_write                 reg_icc_sre_el1_write
1691 #define   icc_pmr_read                  reg_icc_pmr_el1_read
1692 #define   icc_pmr_write                 reg_icc_pmr_el1_write
1693 #define   icc_bpr0_write                reg_icc_bpr0_el1_write
1694 #define   icc_bpr1_write                reg_icc_bpr1_el1_write
1695 #define   icc_ctlr_read                 reg_icc_ctlr_el1_read
1696 #define   icc_ctlr_write                reg_icc_ctlr_el1_write
1697 #define   icc_igrpen1_write   reg_icc_igrpen1_el1_write
1698 #define   icc_sgi1r_write               reg_icc_sgi1r_el1_write
1699 #define   icc_iar1_read                 reg_icc_iar1_el1_read
1700 #define   icc_eoi1r_write               reg_icc_eoir1_el1_write
1701 
1702 #if defined(_KERNEL)
1703 
1704 /*
1705  * CPU REGISTER ACCESS
1706  */
1707 static __inline register_t
1708 cpu_mpidr_aff_read(void)
1709 {
1710 
1711           return reg_mpidr_el1_read() &
1712               (MPIDR_AFF3|MPIDR_AFF2|MPIDR_AFF1|MPIDR_AFF0);
1713 }
1714 
1715 /*
1716  * GENERIC TIMER REGISTER ACCESS
1717  */
1718 static __inline uint32_t
gtmr_cntfrq_read(void)1719 gtmr_cntfrq_read(void)
1720 {
1721 
1722           return reg_cntfrq_el0_read();
1723 }
1724 
1725 static __inline uint32_t
gtmr_cntk_ctl_read(void)1726 gtmr_cntk_ctl_read(void)
1727 {
1728 
1729           return reg_cntkctl_el1_read();
1730 }
1731 
1732 static __inline void
gtmr_cntk_ctl_write(uint32_t val)1733 gtmr_cntk_ctl_write(uint32_t val)
1734 {
1735 
1736           reg_cntkctl_el1_write(val);
1737 }
1738 
1739 /*
1740  * Counter-timer Virtual Count timer
1741  */
1742 static __inline uint64_t
gtmr_cntpct_read(void)1743 gtmr_cntpct_read(void)
1744 {
1745 
1746           return reg_cntpct_el0_read();
1747 }
1748 
1749 static __inline uint64_t
gtmr_cntvct_read(void)1750 gtmr_cntvct_read(void)
1751 {
1752 
1753           return reg_cntvct_el0_read();
1754 }
1755 
1756 /*
1757  * Counter-timer Virtual Timer Control register
1758  */
1759 static __inline uint64_t
gtmr_cntv_ctl_read(void)1760 gtmr_cntv_ctl_read(void)
1761 {
1762 
1763           return reg_cntv_ctl_el0_read();
1764 }
1765 
1766 static __inline void
gtmr_cntv_ctl_write(uint64_t val)1767 gtmr_cntv_ctl_write(uint64_t val)
1768 {
1769 
1770           reg_cntv_ctl_el0_write(val);
1771 }
1772 
1773 /*
1774  * Counter-timer Physical Timer Control register
1775  */
1776 static __inline uint32_t
gtmr_cntp_ctl_read(void)1777 gtmr_cntp_ctl_read(void)
1778 {
1779 
1780           return reg_cntp_ctl_el0_read();
1781 }
1782 
1783 static __inline void
gtmr_cntp_ctl_write(uint32_t val)1784 gtmr_cntp_ctl_write(uint32_t val)
1785 {
1786 
1787           reg_cntp_ctl_el0_write(val);
1788 }
1789 
1790 /*
1791  * Counter-timer Physical Timer TimerValue register
1792  */
1793 static __inline uint32_t
gtmr_cntp_tval_read(void)1794 gtmr_cntp_tval_read(void)
1795 {
1796 
1797           return reg_cntp_tval_el0_read();
1798 }
1799 
1800 static __inline void
gtmr_cntp_tval_write(uint32_t val)1801 gtmr_cntp_tval_write(uint32_t val)
1802 {
1803 
1804           reg_cntp_tval_el0_write(val);
1805 }
1806 
1807 /*
1808  * Counter-timer Virtual Timer TimerValue register
1809  */
1810 static __inline uint32_t
gtmr_cntv_tval_read(void)1811 gtmr_cntv_tval_read(void)
1812 {
1813 
1814           return reg_cntv_tval_el0_read();
1815 }
1816 
1817 static __inline void
gtmr_cntv_tval_write(uint32_t val)1818 gtmr_cntv_tval_write(uint32_t val)
1819 {
1820 
1821           reg_cntv_tval_el0_write(val);
1822 }
1823 
1824 /*
1825  * Counter-timer Physical Timer CompareValue register
1826  */
1827 static __inline uint64_t
gtmr_cntp_cval_read(void)1828 gtmr_cntp_cval_read(void)
1829 {
1830 
1831           return reg_cntp_cval_el0_read();
1832 }
1833 
1834 static __inline void
gtmr_cntp_cval_write(uint64_t val)1835 gtmr_cntp_cval_write(uint64_t val)
1836 {
1837 
1838           reg_cntp_cval_el0_write(val);
1839 }
1840 
1841 /*
1842  * Counter-timer Virtual Timer CompareValue register
1843  */
1844 static __inline uint64_t
gtmr_cntv_cval_read(void)1845 gtmr_cntv_cval_read(void)
1846 {
1847 
1848           return reg_cntv_cval_el0_read();
1849 }
1850 
1851 static __inline void
gtmr_cntv_cval_write(uint64_t val)1852 gtmr_cntv_cval_write(uint64_t val)
1853 {
1854 
1855           reg_cntv_cval_el0_write(val);
1856 }
1857 #endif /* _KERNEL */
1858 
1859 /*
1860  * Structure attached to machdep.cpuN.cpu_id sysctl node.
1861  * Always add new members to the end, and avoid arrays.
1862  */
1863 struct aarch64_sysctl_cpu_id {
1864           uint64_t ac_midr;   /* Main ID Register */
1865           uint64_t ac_revidr; /* Revision ID Register */
1866           uint64_t ac_mpidr;  /* Multiprocessor Affinity Register */
1867 
1868           uint64_t ac_aa64dfr0;         /* A64 Debug Feature Register 0 */
1869           uint64_t ac_aa64dfr1;         /* A64 Debug Feature Register 1 */
1870 
1871           uint64_t ac_aa64isar0;        /* A64 Instruction Set Attribute Register 0 */
1872           uint64_t ac_aa64isar1;        /* A64 Instruction Set Attribute Register 1 */
1873 
1874           uint64_t ac_aa64mmfr0;        /* A64 Memory Model Feature Register 0 */
1875           uint64_t ac_aa64mmfr1;        /* A64 Memory Model Feature Register 1 */
1876           uint64_t ac_aa64mmfr2;        /* A64 Memory Model Feature Register 2 */
1877 
1878           uint64_t ac_aa64pfr0;         /* A64 Processor Feature Register 0 */
1879           uint64_t ac_aa64pfr1;         /* A64 Processor Feature Register 1 */
1880 
1881           uint64_t ac_aa64zfr0;         /* A64 SVE Feature ID Register 0 */
1882 
1883           uint32_t ac_mvfr0;  /* Media and VFP Feature Register 0 */
1884           uint32_t ac_mvfr1;  /* Media and VFP Feature Register 1 */
1885           uint32_t ac_mvfr2;  /* Media and VFP Feature Register 2 */
1886           uint32_t ac_pad;
1887 
1888           uint64_t ac_clidr;  /* Cache Level ID Register */
1889           uint64_t ac_ctr;    /* Cache Type Register */
1890 };
1891 
1892 #endif /* _AARCH64_ARMREG_H_ */
1893