armreg.h revision 1.9 1 1.9 ryo /* $NetBSD: armreg.h,v 1.9 2018/04/01 04:35:03 ryo Exp $ */
2 1.1 matt
3 1.1 matt /*-
4 1.1 matt * Copyright (c) 2014 The NetBSD Foundation, Inc.
5 1.1 matt * All rights reserved.
6 1.1 matt *
7 1.1 matt * This code is derived from software contributed to The NetBSD Foundation
8 1.1 matt * by Matt Thomas of 3am Software Foundry.
9 1.1 matt *
10 1.1 matt * Redistribution and use in source and binary forms, with or without
11 1.1 matt * modification, are permitted provided that the following conditions
12 1.1 matt * are met:
13 1.1 matt * 1. Redistributions of source code must retain the above copyright
14 1.1 matt * notice, this list of conditions and the following disclaimer.
15 1.1 matt * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 matt * notice, this list of conditions and the following disclaimer in the
17 1.1 matt * documentation and/or other materials provided with the distribution.
18 1.1 matt *
19 1.1 matt * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.1 matt * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 matt * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 matt * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 matt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 matt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 matt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 matt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 matt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 matt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 matt * POSSIBILITY OF SUCH DAMAGE.
30 1.1 matt */
31 1.1 matt
32 1.1 matt #ifndef _AARCH64_ARMREG_H_
33 1.1 matt #define _AARCH64_ARMREG_H_
34 1.1 matt
35 1.8 ryo #include <arm/cputypes.h>
36 1.1 matt #include <sys/types.h>
37 1.1 matt
38 1.7 skrll #define AARCH64REG_READ_INLINE2(regname, regdesc) \
39 1.7 skrll static uint64_t inline \
40 1.7 skrll reg_##regname##_read(void) \
41 1.7 skrll { \
42 1.7 skrll uint64_t __rv; \
43 1.7 skrll __asm __volatile("mrs %0, " #regdesc : "=r"(__rv)); \
44 1.7 skrll return __rv; \
45 1.1 matt }
46 1.1 matt
47 1.7 skrll #define AARCH64REG_WRITE_INLINE2(regname, regdesc) \
48 1.7 skrll static void inline \
49 1.7 skrll reg_##regname##_write(uint64_t __val) \
50 1.7 skrll { \
51 1.7 skrll __asm __volatile("msr " #regdesc ", %0" :: "r"(__val)); \
52 1.1 matt }
53 1.1 matt
54 1.7 skrll #define AARCH64REG_WRITEIMM_INLINE2(regname, regdesc) \
55 1.7 skrll static void inline \
56 1.7 skrll reg_##regname##_write(uint64_t __val) \
57 1.7 skrll { \
58 1.7 skrll __asm __volatile("msr " #regdesc ", %0" :: "n"(__val)); \
59 1.1 matt }
60 1.1 matt
61 1.7 skrll #define AARCH64REG_READ_INLINE(regname) \
62 1.1 matt AARCH64REG_READ_INLINE2(regname, regname)
63 1.1 matt
64 1.7 skrll #define AARCH64REG_WRITE_INLINE(regname) \
65 1.1 matt AARCH64REG_WRITE_INLINE2(regname, regname)
66 1.1 matt
67 1.7 skrll #define AARCH64REG_WRITEIMM_INLINE(regname) \
68 1.1 matt AARCH64REG_WRITEIMM_INLINE2(regname, regname)
69 1.1 matt /*
70 1.1 matt * System registers available at EL0 (user)
71 1.1 matt */
72 1.1 matt AARCH64REG_READ_INLINE(ctr_el0) // Cache Type Register
73 1.1 matt
74 1.1 matt static const uintmax_t
75 1.1 matt CTR_EL0_CWG_LINE = __BITS(27,24), // Cacheback Writeback Granule
76 1.1 matt CTR_EL0_ERG_LINE = __BITS(23,20), // Exclusives Reservation Granule
77 1.1 matt CTR_EL0_DMIN_LINE = __BITS(19,16), // Dcache MIN LINE size (log2 - 2)
78 1.1 matt CTR_EL0_L1IP_MASK = __BITS(15,14),
79 1.1 matt CTR_EL0_L1IP_AIVIVT = 1, // ASID-tagged Virtual Index, Virtual Tag
80 1.1 matt CTR_EL0_L1IP_VIPT = 2, // Virtual Index, Physical Tag
81 1.1 matt CTR_EL0_L1IP_PIPT = 3, // Physical Index, Physical Tag
82 1.1 matt CTR_EL0_IMIN_LINE = __BITS(3,0); // Icache MIN LINE size (log2 - 2)
83 1.1 matt
84 1.1 matt AARCH64REG_READ_INLINE(dczid_el0) // Data Cache Zero ID Register
85 1.1 matt
86 1.1 matt static const uintmax_t
87 1.1 matt DCZID_DZP = __BIT(4), // Data Zero Prohibited
88 1.1 matt DCZID_BS = __BITS(3,0); // Block Size (log2 - 2)
89 1.1 matt
90 1.1 matt AARCH64REG_READ_INLINE(fpcr) // Floating Point Control Register
91 1.1 matt AARCH64REG_WRITE_INLINE(fpcr)
92 1.1 matt
93 1.1 matt static const uintmax_t
94 1.1 matt FPCR_AHP = __BIT(26), // Alternative Half Precision
95 1.1 matt FPCR_DN = __BIT(25), // Default Nan Control
96 1.1 matt FPCR_FZ = __BIT(24), // Flush-To-Zero
97 1.1 matt FPCR_RMODE = __BITS(23,22),// Rounding Mode
98 1.1 matt FPCR_RN = 0, // Round Nearest
99 1.1 matt FPCR_RP = 1, // Round towards Plus infinity
100 1.1 matt FPCR_RM = 2, // Round towards Minus infinity
101 1.1 matt FPCR_RZ = 3, // Round towards Zero
102 1.1 matt FPCR_STRIDE = __BITS(21,20),
103 1.1 matt FPCR_LEN = __BITS(18,16),
104 1.1 matt FPCR_IDE = __BIT(15), // Input Denormal Exception enable
105 1.1 matt FPCR_IXE = __BIT(12), // IneXact Exception enable
106 1.1 matt FPCR_UFE = __BIT(11), // UnderFlow Exception enable
107 1.1 matt FPCR_OFE = __BIT(10), // OverFlow Exception enable
108 1.1 matt FPCR_DZE = __BIT(9), // Divide by Zero Exception enable
109 1.1 matt FPCR_IOE = __BIT(8), // Invalid Operation Exception enable
110 1.1 matt FPCR_ESUM = 0x1F00;
111 1.1 matt
112 1.1 matt AARCH64REG_READ_INLINE(fpsr) // Floating Point Status Register
113 1.1 matt AARCH64REG_WRITE_INLINE(fpsr)
114 1.1 matt
115 1.1 matt static const uintmax_t
116 1.1 matt FPSR_N32 = __BIT(31), // AARCH32 Negative
117 1.1 matt FPSR_Z32 = __BIT(30), // AARCH32 Zero
118 1.1 matt FPSR_C32 = __BIT(29), // AARCH32 Carry
119 1.1 matt FPSR_V32 = __BIT(28), // AARCH32 Overflow
120 1.1 matt FPSR_QC = __BIT(27), // SIMD Saturation
121 1.1 matt FPSR_IDC = __BIT(7), // Input Denormal Cumulative status
122 1.1 matt FPSR_IXC = __BIT(4), // IneXact Cumulative status
123 1.1 matt FPSR_UFC = __BIT(3), // UnderFlow Cumulative status
124 1.1 matt FPSR_OFC = __BIT(2), // OverFlow Cumulative status
125 1.1 matt FPSR_DZC = __BIT(1), // Divide by Zero Cumulative status
126 1.1 matt FPSR_IOC = __BIT(0), // Invalid Operation Cumulative status
127 1.1 matt FPSR_CSUM = 0x1F;
128 1.1 matt
129 1.1 matt AARCH64REG_READ_INLINE(nzcv) // condition codes
130 1.1 matt AARCH64REG_WRITE_INLINE(nzcv)
131 1.1 matt
132 1.1 matt static const uintmax_t
133 1.3 skrll NZCV_N = __BIT(31), // Negative
134 1.1 matt NZCV_Z = __BIT(30), // Zero
135 1.1 matt NZCV_C = __BIT(29), // Carry
136 1.1 matt NZCV_V = __BIT(28); // Overflow
137 1.1 matt
138 1.1 matt AARCH64REG_READ_INLINE(tpidr_el0) // Thread Pointer ID Register (RW)
139 1.1 matt AARCH64REG_WRITE_INLINE(tpidr_el0)
140 1.1 matt
141 1.9 ryo AARCH64REG_READ_INLINE(tpidrro_el0) // Thread Pointer ID Register (RO)
142 1.9 ryo
143 1.3 skrll /*
144 1.1 matt * From here on, these can only be accessed at EL1 (kernel)
145 1.1 matt */
146 1.1 matt
147 1.1 matt /*
148 1.1 matt * These are readonly registers
149 1.1 matt */
150 1.9 ryo AARCH64REG_READ_INLINE(aidr_el1)
151 1.9 ryo
152 1.1 matt AARCH64REG_READ_INLINE2(cbar_el1, s3_1_c15_c3_0) // Cortex-A57
153 1.1 matt
154 1.1 matt static const uintmax_t CBAR_PA = __BITS(47,18);
155 1.1 matt
156 1.9 ryo AARCH64REG_READ_INLINE(ccsidr_el1)
157 1.9 ryo
158 1.9 ryo static const uintmax_t
159 1.9 ryo CCSIDR_WT = __BIT(31), // Write-through supported
160 1.9 ryo CCSIDR_WB = __BIT(30), // Write-back supported
161 1.9 ryo CCSIDR_RA = __BIT(29), // Read-allocation supported
162 1.9 ryo CCSIDR_WA = __BIT(28), // Write-allocation supported
163 1.9 ryo CCSIDR_NUMSET = __BITS(27,13),// (Number of sets in cache) - 1
164 1.9 ryo CCSIDR_ASSOC = __BITS(12,3), // (Associativity of cache) - 1
165 1.9 ryo CCSIDR_LINESIZE = __BITS(2,0); // Number of bytes in cache line
166 1.9 ryo
167 1.1 matt AARCH64REG_READ_INLINE(clidr_el1)
168 1.9 ryo
169 1.9 ryo static const uintmax_t
170 1.9 ryo CLIDR_LOUU = __BITS(29,27), // Level of Unification Uniprocessor
171 1.9 ryo CLIDR_LOC = __BITS(26,24), // Level of Coherency
172 1.9 ryo CLIDR_LOUIS = __BITS(23,21), // Level of Unification InnerShareable*/
173 1.9 ryo CLIDR_CTYPE7 = __BITS(20,18), // Cache Type field for level7
174 1.9 ryo CLIDR_CTYPE6 = __BITS(17,15), // Cache Type field for level6
175 1.9 ryo CLIDR_CTYPE5 = __BITS(14,12), // Cache Type field for level5
176 1.9 ryo CLIDR_CTYPE4 = __BITS(11,9), // Cache Type field for level4
177 1.9 ryo CLIDR_CTYPE3 = __BITS(8,6), // Cache Type field for level3
178 1.9 ryo CLIDR_CTYPE2 = __BITS(5,3), // Cache Type field for level2
179 1.9 ryo CLIDR_CTYPE1 = __BITS(2,0), // Cache Type field for level1
180 1.9 ryo CLIDR_TYPE_NOCACHE = 0, // No cache
181 1.9 ryo CLIDR_TYPE_ICACHE = 1, // Instruction cache only
182 1.9 ryo CLIDR_TYPE_DCACHE = 2, // Data cache only
183 1.9 ryo CLIDR_TYPE_IDCACHE = 3, // Separate inst and data caches
184 1.9 ryo CLIDR_TYPE_UNIFIEDCACHE = 4; // Unified cache
185 1.9 ryo
186 1.9 ryo AARCH64REG_READ_INLINE(currentel)
187 1.9 ryo AARCH64REG_READ_INLINE(id_aa64afr0_el1)
188 1.9 ryo AARCH64REG_READ_INLINE(id_aa64afr1_el1)
189 1.9 ryo AARCH64REG_READ_INLINE(id_aa64dfr0_el1)
190 1.9 ryo
191 1.9 ryo static const uintmax_t
192 1.9 ryo ID_AA64DFR0_EL1_CTX_CMPS = __BITS(31,28),
193 1.9 ryo ID_AA64DFR0_EL1_WRPS = __BITS(20,23),
194 1.9 ryo ID_AA64DFR0_EL1_BRPS = __BITS(12,15),
195 1.9 ryo ID_AA64DFR0_EL1_PMUVER = __BITS(8,11),
196 1.9 ryo ID_AA64DFR0_EL1_PMUVER_NONE = 0,
197 1.9 ryo ID_AA64DFR0_EL1_PMUVER_V3 = 1,
198 1.9 ryo ID_AA64DFR0_EL1_PMUVER_NOV3 = 2,
199 1.9 ryo ID_AA64DFR0_EL1_TRACEVER = __BITS(4,7),
200 1.9 ryo ID_AA64DFR0_EL1_TRACEVER_NONE = 0,
201 1.9 ryo ID_AA64DFR0_EL1_TRACEVER_IMPL = 1,
202 1.9 ryo ID_AA64DFR0_EL1_DEBUGVER = __BITS(0,3),
203 1.9 ryo ID_AA64DFR0_EL1_DEBUGVER_V8A = 6;
204 1.9 ryo
205 1.9 ryo AARCH64REG_READ_INLINE(id_aa64dfr1_el1)
206 1.9 ryo
207 1.9 ryo AARCH64REG_READ_INLINE(id_aa64isar0_el1)
208 1.9 ryo
209 1.9 ryo static const uintmax_t
210 1.9 ryo ID_AA64ISAR0_EL1_CRC32 = __BITS(19,16),
211 1.9 ryo ID_AA64ISAR0_EL1_CRC32_NONE = 0,
212 1.9 ryo ID_AA64ISAR0_EL1_CRC32_CRC32X = 1,
213 1.9 ryo ID_AA64ISAR0_EL1_SHA2 = __BITS(15,12),
214 1.9 ryo ID_AA64ISAR0_EL1_SHA2_NONE = 0,
215 1.9 ryo ID_AA64ISAR0_EL1_SHA2_SHA256HSU = 1,
216 1.9 ryo ID_AA64ISAR0_EL1_SHA1 = __BITS(11,8),
217 1.9 ryo ID_AA64ISAR0_EL1_SHA1_NONE = 0,
218 1.9 ryo ID_AA64ISAR0_EL1_SHA1_SHA1CPMHSU = 1,
219 1.9 ryo ID_AA64ISAR0_EL1_AES = __BITS(7,4),
220 1.9 ryo ID_AA64ISAR0_EL1_AES_NONE = 0,
221 1.9 ryo ID_AA64ISAR0_EL1_AES_AES = 1,
222 1.9 ryo ID_AA64ISAR0_EL1_AES_PMUL = 2;
223 1.9 ryo
224 1.9 ryo AARCH64REG_READ_INLINE(id_aa64isar1_el1)
225 1.9 ryo AARCH64REG_READ_INLINE(id_aa64mmfr0_el1)
226 1.9 ryo
227 1.9 ryo static const uintmax_t
228 1.9 ryo ID_AA64MMFR0_EL1_TGRAN4 = __BITS(31,28),
229 1.9 ryo ID_AA64MMFR0_EL1_TGRAN4_4KB = 0,
230 1.9 ryo ID_AA64MMFR0_EL1_TGRAN4_NONE = 15,
231 1.9 ryo ID_AA64MMFR0_EL1_TGRAN64 = __BITS(24,27),
232 1.9 ryo ID_AA64MMFR0_EL1_TGRAN64_64KB = 0,
233 1.9 ryo ID_AA64MMFR0_EL1_TGRAN64_NONE = 15,
234 1.9 ryo ID_AA64MMFR0_EL1_TGRAN16 = __BITS(20,23),
235 1.9 ryo ID_AA64MMFR0_EL1_TGRAN16_NONE = 0,
236 1.9 ryo ID_AA64MMFR0_EL1_TGRAN16_16KB = 1,
237 1.9 ryo ID_AA64MMFR0_EL1_BIGENDEL0 = __BITS(16,19),
238 1.9 ryo ID_AA64MMFR0_EL1_BIGENDEL0_NONE = 0,
239 1.9 ryo ID_AA64MMFR0_EL1_BIGENDEL0_MIX = 1,
240 1.9 ryo ID_AA64MMFR0_EL1_SNSMEM = __BITS(12,15),
241 1.9 ryo ID_AA64MMFR0_EL1_SNSMEM_NONE = 0,
242 1.9 ryo ID_AA64MMFR0_EL1_SNSMEM_SNSMEM = 1,
243 1.9 ryo ID_AA64MMFR0_EL1_BIGEND = __BITS(8,11),
244 1.9 ryo ID_AA64MMFR0_EL1_BIGEND_NONE = 0,
245 1.9 ryo ID_AA64MMFR0_EL1_BIGEND_MIX = 1,
246 1.9 ryo ID_AA64MMFR0_EL1_ASIDBITS = __BITS(4,7),
247 1.9 ryo ID_AA64MMFR0_EL1_ASIDBITS_8BIT = 0,
248 1.9 ryo ID_AA64MMFR0_EL1_ASIDBITS_16BIT = 2,
249 1.9 ryo ID_AA64MMFR0_EL1_PARANGE = __BITS(0,3),
250 1.9 ryo ID_AA64MMFR0_EL1_PARANGE_4G = 0,
251 1.9 ryo ID_AA64MMFR0_EL1_PARANGE_64G = 1,
252 1.9 ryo ID_AA64MMFR0_EL1_PARANGE_1T = 2,
253 1.9 ryo ID_AA64MMFR0_EL1_PARANGE_4T = 3,
254 1.9 ryo ID_AA64MMFR0_EL1_PARANGE_16T = 4,
255 1.9 ryo ID_AA64MMFR0_EL1_PARANGE_256T = 5;
256 1.9 ryo
257 1.9 ryo AARCH64REG_READ_INLINE(id_aa64mmfr1_el1)
258 1.9 ryo AARCH64REG_READ_INLINE(id_aa64pfr0_el1)
259 1.9 ryo AARCH64REG_READ_INLINE(id_aa64pfr1_el1)
260 1.9 ryo AARCH64REG_READ_INLINE(id_pfr1_el1)
261 1.1 matt AARCH64REG_READ_INLINE(isr_el1)
262 1.1 matt AARCH64REG_READ_INLINE(midr_el1)
263 1.1 matt AARCH64REG_READ_INLINE(mpidr_el1)
264 1.9 ryo
265 1.9 ryo static const uintmax_t
266 1.9 ryo MPIDR_AFF3 = __BITS(32,39),
267 1.9 ryo MPIDR_U = __BIT(30), // 1 = Uni-Processor System
268 1.9 ryo MPIDR_MT = __BIT(24), // 1 = SMT(AFF0 is logical)
269 1.9 ryo MPIDR_AFF2 = __BITS(16,23),
270 1.9 ryo MPIDR_AFF1 = __BITS(8,15),
271 1.9 ryo MPIDR_AFF0 = __BITS(0,7);
272 1.9 ryo
273 1.1 matt AARCH64REG_READ_INLINE(mvfr0_el1)
274 1.9 ryo
275 1.9 ryo static const uintmax_t
276 1.9 ryo MVFR0_FPROUND = __BITS(31,28),
277 1.9 ryo MVFR0_FPROUND_NEAREST = 0,
278 1.9 ryo MVFR0_FPROUND_ALL = 1,
279 1.9 ryo MVFR0_FPSHVEC = __BITS(27,24),
280 1.9 ryo MVFR0_FPSHVEC_NONE = 0,
281 1.9 ryo MVFR0_FPSHVEC_SHVEC = 1,
282 1.9 ryo MVFR0_FPSQRT = __BITS(23,20),
283 1.9 ryo MVFR0_FPSQRT_NONE = 0,
284 1.9 ryo MVFR0_FPSQRT_VSQRT = 1,
285 1.9 ryo MVFR0_FPDIVIDE = __BITS(19,16),
286 1.9 ryo MVFR0_FPDIVIDE_NONE = 0,
287 1.9 ryo MVFR0_FPDIVIDE_VDIV = 1,
288 1.9 ryo MVFR0_FPTRAP = __BITS(15,12),
289 1.9 ryo MVFR0_FPTRAP_NONE = 0,
290 1.9 ryo MVFR0_FPTRAP_TRAP = 1,
291 1.9 ryo MVFR0_FPDP = __BITS(11,8),
292 1.9 ryo MVFR0_FPDP_NONE = 0,
293 1.9 ryo MVFR0_FPDP_VFPV2 = 1,
294 1.9 ryo MVFR0_FPDP_VFPV3 = 2,
295 1.9 ryo MVFR0_FPSP = __BITS(7,4),
296 1.9 ryo MVFR0_FPSP_NONE = 0,
297 1.9 ryo MVFR0_FPSP_VFPV2 = 1,
298 1.9 ryo MVFR0_FPSP_VFPV3 = 2,
299 1.9 ryo MVFR0_SIMDREG = __BITS(3,0),
300 1.9 ryo MVFR0_SIMDREG_NONE = 0,
301 1.9 ryo MVFR0_SIMDREG_16x64 = 1,
302 1.9 ryo MVFR0_SIMDREG_32x64 = 2;
303 1.9 ryo
304 1.1 matt AARCH64REG_READ_INLINE(mvfr1_el1)
305 1.9 ryo
306 1.9 ryo static const uintmax_t
307 1.9 ryo MVFR1_SIMDFMAC = __BITS(31,28),
308 1.9 ryo MVFR1_SIMDFMAC_NONE = 0,
309 1.9 ryo MVFR1_SIMDFMAC_FMAC = 1,
310 1.9 ryo MVFR1_FPHP = __BITS(27,24),
311 1.9 ryo MVFR1_FPHP_NONE = 0,
312 1.9 ryo MVFR1_FPHP_HALF_SINGLE = 1,
313 1.9 ryo MVFR1_FPHP_HALF_DOUBLE = 2,
314 1.9 ryo MVFR1_SIMDHP = __BITS(23,20),
315 1.9 ryo MVFR1_SIMDHP_NONE = 0,
316 1.9 ryo MVFR1_SIMDHP_HALF = 1,
317 1.9 ryo MVFR1_SIMDSP = __BITS(19,16),
318 1.9 ryo MVFR1_SIMDSP_NONE = 0,
319 1.9 ryo MVFR1_SIMDSP_SINGLE = 1,
320 1.9 ryo MVFR1_SIMDINT = __BITS(15,12),
321 1.9 ryo MVFR1_SIMDINT_NONE = 0,
322 1.9 ryo MVFR1_SIMDINT_INTEGER = 1,
323 1.9 ryo MVFR1_SIMDLS = __BITS(11,8),
324 1.9 ryo MVFR1_SIMDLS_NONE = 0,
325 1.9 ryo MVFR1_SIMDLS_LOADSTORE = 1,
326 1.9 ryo MVFR1_FPDNAN = __BITS(7,4),
327 1.9 ryo MVFR1_FPDNAN_NONE = 0,
328 1.9 ryo MVFR1_FPDNAN_NAN = 1,
329 1.9 ryo MVFR1_FPFTZ = __BITS(3,0),
330 1.9 ryo MVFR1_FPFTZ_NONE = 0,
331 1.9 ryo MVFR1_FPFTZ_DENORMAL = 1;
332 1.9 ryo
333 1.1 matt AARCH64REG_READ_INLINE(mvfr2_el1)
334 1.9 ryo
335 1.9 ryo static const uintmax_t
336 1.9 ryo MVFR2_FPMISC = __BITS(7,4),
337 1.9 ryo MVFR2_FPMISC_NONE = 0,
338 1.9 ryo MVFR2_FPMISC_SEL = 1,
339 1.9 ryo MVFR2_FPMISC_DROUND = 2,
340 1.9 ryo MVFR2_FPMISC_ROUNDINT = 3,
341 1.9 ryo MVFR2_FPMISC_MAXMIN = 4,
342 1.9 ryo MVFR2_SIMDMISC = __BITS(3,0),
343 1.9 ryo MVFR2_SIMDMISC_NONE = 0,
344 1.9 ryo MVFR2_SIMDMISC_DROUND = 1,
345 1.9 ryo MVFR2_SIMDMISC_ROUNDINT = 2,
346 1.9 ryo MVFR2_SIMDMISC_MAXMIN = 3;
347 1.9 ryo
348 1.1 matt AARCH64REG_READ_INLINE(revidr_el1)
349 1.1 matt
350 1.1 matt /*
351 1.1 matt * These are read/write registers
352 1.1 matt */
353 1.1 matt AARCH64REG_READ_INLINE(cpacr_el1) // Coprocessor Access Control Regiser
354 1.1 matt AARCH64REG_WRITE_INLINE(cpacr_el1)
355 1.1 matt
356 1.1 matt static const uintmax_t
357 1.1 matt CPACR_TTA = __BIT(28), // System Register Access Traps
358 1.1 matt CPACR_FPEN = __BITS(21,20),
359 1.1 matt CPACR_FPEN_NONE = __SHIFTIN(0, CPACR_FPEN),
360 1.1 matt CPACR_FPEN_EL1 = __SHIFTIN(1, CPACR_FPEN),
361 1.1 matt CPACR_FPEN_NONE_2 = __SHIFTIN(2, CPACR_FPEN),
362 1.1 matt CPACR_FPEN_ALL = __SHIFTIN(3, CPACR_FPEN);
363 1.1 matt
364 1.9 ryo AARCH64REG_READ_INLINE(csselr_el1) // Cache Size Selection Register
365 1.9 ryo AARCH64REG_WRITE_INLINE(csselr_el1)
366 1.9 ryo
367 1.9 ryo static const uintmax_t
368 1.9 ryo CSSELR_LEVEL = __BITS(3,1), // Cache level of required cache
369 1.9 ryo CSSELR_IND = __BIT(0); // Instruction not Data bit
370 1.9 ryo
371 1.9 ryo AARCH64REG_READ_INLINE(daif) // Debug Async Irq Fiq mask register
372 1.9 ryo AARCH64REG_WRITE_INLINE(daif)
373 1.9 ryo AARCH64REG_WRITEIMM_INLINE(daifclr)
374 1.9 ryo AARCH64REG_WRITEIMM_INLINE(daifset)
375 1.9 ryo
376 1.9 ryo static const uintmax_t
377 1.9 ryo DAIF_D = __BIT(9), // Debug Exception Mask
378 1.9 ryo DAIF_A = __BIT(8), // SError Abort Mask
379 1.9 ryo DAIF_I = __BIT(7), // IRQ Mask
380 1.9 ryo DAIF_F = __BIT(6), // FIQ Mask
381 1.9 ryo DAIF_SETCLR_SHIFT = 6; // for daifset/daifclr #imm shift
382 1.9 ryo
383 1.1 matt AARCH64REG_READ_INLINE(elr_el1) // Exception Link Register
384 1.1 matt AARCH64REG_WRITE_INLINE(elr_el1)
385 1.1 matt
386 1.1 matt AARCH64REG_READ_INLINE(esr_el1) // Exception Symdrone Register
387 1.1 matt AARCH64REG_WRITE_INLINE(esr_el1)
388 1.1 matt
389 1.1 matt static const uintmax_t
390 1.1 matt ESR_EC = __BITS(31,26), // Exception Cause
391 1.6 skrll ESR_EC_UNKNOWN = 0x00, // AXX: Unknown Reason
392 1.6 skrll ESR_EC_WFX = 0x01, // AXX: WFI or WFE instruction execution
393 1.6 skrll ESR_EC_CP15_RT = 0x03, // A32: MCR/MRC access to CP15 !EC=0
394 1.6 skrll ESR_EC_CP15_RRT = 0x04, // A32: MCRR/MRRC access to CP15 !EC=0
395 1.6 skrll ESR_EC_CP14_RT = 0x05, // A32: MCR/MRC access to CP14
396 1.6 skrll ESR_EC_CP14_DT = 0x06, // A32: LDC/STC access to CP14
397 1.6 skrll ESR_EC_FP_ACCESS = 0x07, // AXX: Access to SIMD/FP Registers
398 1.6 skrll ESR_EC_FPID = 0x08, // A32: MCR/MRC access to CP10 !EC=7
399 1.6 skrll ESR_EC_CP14_RRT = 0x0c, // A32: MRRC access to CP14
400 1.6 skrll ESR_EC_ILL_STATE = 0x0e, // AXX: Illegal Execution State
401 1.6 skrll ESR_EC_SVC_A32 = 0x11, // A32: SVC Instruction Execution
402 1.6 skrll ESR_EC_HVC_A32 = 0x12, // A32: HVC Instruction Execution
403 1.6 skrll ESR_EC_SMC_A32 = 0x13, // A32: SMC Instruction Execution
404 1.6 skrll ESR_EC_SVC_A64 = 0x15, // A64: SVC Instruction Execution
405 1.6 skrll ESR_EC_HVC_A64 = 0x16, // A64: HVC Instruction Execution
406 1.6 skrll ESR_EC_SMC_A64 = 0x17, // A64: SMC Instruction Execution
407 1.6 skrll ESR_EC_SYS_REG = 0x18, // A64: MSR/MRS/SYS instruction (!EC0/1/7)
408 1.6 skrll ESR_EC_INSN_ABT_EL0 = 0x20, // AXX: Instruction Abort (EL0)
409 1.6 skrll ESR_EC_INSN_ABT_EL1 = 0x21, // AXX: Instruction Abort (EL1)
410 1.6 skrll ESR_EC_PC_ALIGNMENT = 0x22, // AXX: Misaligned PC
411 1.6 skrll ESR_EC_DATA_ABT_EL0 = 0x24, // AXX: Data Abort (EL0)
412 1.6 skrll ESR_EC_DATA_ABT_EL1 = 0x25, // AXX: Data Abort (EL1)
413 1.6 skrll ESR_EC_SP_ALIGNMENT = 0x26, // AXX: Misaligned SP
414 1.6 skrll ESR_EC_FP_TRAP_A32 = 0x28, // A32: FP Exception
415 1.6 skrll ESR_EC_FP_TRAP_A64 = 0x2c, // A64: FP Exception
416 1.6 skrll ESR_EC_SERROR = 0x2f, // AXX: SError Interrupt
417 1.6 skrll ESR_EC_BRKPNT_EL0 = 0x30, // AXX: Breakpoint Exception (EL0)
418 1.6 skrll ESR_EC_BRKPNT_EL1 = 0x31, // AXX: Breakpoint Exception (EL1)
419 1.6 skrll ESR_EC_SW_STEP_EL0 = 0x32, // AXX: Software Step (EL0)
420 1.6 skrll ESR_EC_SW_STEP_EL1 = 0x33, // AXX: Software Step (EL1)
421 1.6 skrll ESR_EC_WTCHPNT_EL0 = 0x34, // AXX: Watchpoint (EL0)
422 1.6 skrll ESR_EC_WTCHPNT_EL1 = 0x35, // AXX: Watchpoint (EL1)
423 1.6 skrll ESR_EC_BKPT_INSN_A32 = 0x38, // A32: BKPT Instruction Execution
424 1.6 skrll ESR_EC_VECTOR_CATCH = 0x3a, // A32: Vector Catch Exception
425 1.6 skrll ESR_EC_BKPT_INSN_A64 = 0x3c, // A64: BKPT Instruction Execution
426 1.1 matt ESR_IL = __BIT(25), // Instruction Length (1=32-bit)
427 1.9 ryo ESR_ISS = __BITS(24,0), // Instruction Specific Syndrome
428 1.9 ryo ESR_ISS_CV = __BIT(24), // common
429 1.9 ryo ESR_ISS_COND = __BITS(23,20), // common
430 1.9 ryo ESR_ISS_WFX_TRAP_INSN = __BIT(0), // for ESR_EC_WFX
431 1.9 ryo ESR_ISS_MRC_OPC2 = __BITS(19,17), // for ESR_EC_CP15_RT
432 1.9 ryo ESR_ISS_MRC_OPC1 = __BITS(16,14), // for ESR_EC_CP15_RT
433 1.9 ryo ESR_ISS_MRC_CRN = __BITS(13,10), // for ESR_EC_CP15_RT
434 1.9 ryo ESR_ISS_MRC_RT = __BITS(9,5), // for ESR_EC_CP15_RT
435 1.9 ryo ESR_ISS_MRC_CRM = __BITS(4,1), // for ESR_EC_CP15_RT
436 1.9 ryo ESR_ISS_MRC_DIRECTION = __BIT(0), // for ESR_EC_CP15_RT
437 1.9 ryo ESR_ISS_MCRR_OPC1 = __BITS(19,16), // for ESR_EC_CP15_RRT
438 1.9 ryo ESR_ISS_MCRR_RT2 = __BITS(14,10), // for ESR_EC_CP15_RRT
439 1.9 ryo ESR_ISS_MCRR_RT = __BITS(9,5), // for ESR_EC_CP15_RRT
440 1.9 ryo ESR_ISS_MCRR_CRM = __BITS(4,1), // for ESR_EC_CP15_RRT
441 1.9 ryo ESR_ISS_MCRR_DIRECTION = __BIT(0), // for ESR_EC_CP15_RRT
442 1.9 ryo ESR_ISS_HVC_IMM16 = __BITS(15,0), // for ESR_EC_{SVC,HVC}
443 1.9 ryo // ...
444 1.9 ryo ESR_ISS_INSNABORT_EA = __BIT(9), // for ESC_RC_INSN_ABT_EL[01]
445 1.9 ryo ESR_ISS_INSNABORT_S1PTW = __BIT(7), // for ESC_RC_INSN_ABT_EL[01]
446 1.9 ryo ESR_ISS_INSNABORT_IFSC = __BITS(0,5), // for ESC_RC_INSN_ABT_EL[01]
447 1.9 ryo ESR_ISS_DATAABORT_ISV = __BIT(24), // for ESC_RC_DATA_ABT_EL[01]
448 1.9 ryo ESR_ISS_DATAABORT_SAS = __BITS(23,22), // for ESC_RC_DATA_ABT_EL[01]
449 1.9 ryo ESR_ISS_DATAABORT_SSE = __BIT(21), // for ESC_RC_DATA_ABT_EL[01]
450 1.9 ryo ESR_ISS_DATAABORT_SRT = __BITS(19,16), // for ESC_RC_DATA_ABT_EL[01]
451 1.9 ryo ESR_ISS_DATAABORT_SF = __BIT(15), // for ESC_RC_DATA_ABT_EL[01]
452 1.9 ryo ESR_ISS_DATAABORT_AR = __BIT(14), // for ESC_RC_DATA_ABT_EL[01]
453 1.9 ryo ESR_ISS_DATAABORT_EA = __BIT(9), // for ESC_RC_DATA_ABT_EL[01]
454 1.9 ryo ESR_ISS_DATAABORT_CM = __BIT(8), // for ESC_RC_DATA_ABT_EL[01]
455 1.9 ryo ESR_ISS_DATAABORT_S1PTW = __BIT(7), // for ESC_RC_DATA_ABT_EL[01]
456 1.9 ryo ESR_ISS_DATAABORT_WnR = __BIT(6), // for ESC_RC_DATA_ABT_EL[01]
457 1.9 ryo ESR_ISS_DATAABORT_DFSC = __BITS(0,5); // for ESC_RC_DATA_ABT_EL[01]
458 1.9 ryo
459 1.9 ryo static const uintmax_t // ESR_ISS_{INSN,DATA}ABORT_FSC
460 1.9 ryo ESR_ISS_FSC_ADDRESS_SIZE_FAULT_0 = 0x00,
461 1.9 ryo ESR_ISS_FSC_ADDRESS_SIZE_FAULT_1 = 0x01,
462 1.9 ryo ESR_ISS_FSC_ADDRESS_SIZE_FAULT_2 = 0x02,
463 1.9 ryo ESR_ISS_FSC_ADDRESS_SIZE_FAULT_3 = 0x03,
464 1.9 ryo ESR_ISS_FSC_TRANSLATION_FAULT_0 = 0x04,
465 1.9 ryo ESR_ISS_FSC_TRANSLATION_FAULT_1 = 0x05,
466 1.9 ryo ESR_ISS_FSC_TRANSLATION_FAULT_2 = 0x06,
467 1.9 ryo ESR_ISS_FSC_TRANSLATION_FAULT_3 = 0x07,
468 1.9 ryo ESR_ISS_FSC_ACCESS_FAULT_0 = 0x08,
469 1.9 ryo ESR_ISS_FSC_ACCESS_FAULT_1 = 0x09,
470 1.9 ryo ESR_ISS_FSC_ACCESS_FAULT_2 = 0x0a,
471 1.9 ryo ESR_ISS_FSC_ACCESS_FAULT_3 = 0x0b,
472 1.9 ryo ESR_ISS_FSC_PERM_FAULT_0 = 0x0c,
473 1.9 ryo ESR_ISS_FSC_PERM_FAULT_1 = 0x0d,
474 1.9 ryo ESR_ISS_FSC_PERM_FAULT_2 = 0x0e,
475 1.9 ryo ESR_ISS_FSC_PERM_FAULT_3 = 0x0f,
476 1.9 ryo ESR_ISS_FSC_SYNC_EXTERNAL_ABORT = 0x10,
477 1.9 ryo ESR_ISS_FSC_SYNC_EXTERNAL_ABORT_TTWALK_0 = 0x14,
478 1.9 ryo ESR_ISS_FSC_SYNC_EXTERNAL_ABORT_TTWALK_1 = 0x15,
479 1.9 ryo ESR_ISS_FSC_SYNC_EXTERNAL_ABORT_TTWALK_2 = 0x16,
480 1.9 ryo ESR_ISS_FSC_SYNC_EXTERNAL_ABORT_TTWALK_3 = 0x17,
481 1.9 ryo ESR_ISS_FSC_SYNC_PARITY_ERROR = 0x18,
482 1.9 ryo ESR_ISS_FSC_SYNC_PARITY_ERROR_ON_TTWALK_0 = 0x1c,
483 1.9 ryo ESR_ISS_FSC_SYNC_PARITY_ERROR_ON_TTWALK_1 = 0x1d,
484 1.9 ryo ESR_ISS_FSC_SYNC_PARITY_ERROR_ON_TTWALK_2 = 0x1e,
485 1.9 ryo ESR_ISS_FSC_SYNC_PARITY_ERROR_ON_TTWALK_3 = 0x1f,
486 1.9 ryo ESR_ISS_FSC_ALIGNMENT_FAULT = 0x21,
487 1.9 ryo ESR_ISS_FSC_TLB_CONFLICT_FAULT = 0x30,
488 1.9 ryo ESR_ISS_FSC_LOCKDOWN_ABORT = 0x34,
489 1.9 ryo ESR_ISS_FSC_UNSUPPORTED_EXCLUSIVE = 0x35,
490 1.9 ryo ESR_ISS_FSC_FIRST_LEVEL_DOMAIN_FAULT = 0x3d,
491 1.9 ryo ESR_ISS_FSC_SECOND_LEVEL_DOMAIN_FAULT = 0x3e;
492 1.1 matt
493 1.1 matt
494 1.1 matt AARCH64REG_READ_INLINE(far_el1) // Fault Address Register
495 1.1 matt AARCH64REG_WRITE_INLINE(far_el1)
496 1.1 matt
497 1.9 ryo AARCH64REG_READ_INLINE2(l2ctlr_el1, s3_1_c11_c0_2) // Cortex-A53,57,72,73
498 1.9 ryo AARCH64REG_WRITE_INLINE2(l2ctlr_el1, s3_1_c11_c0_2) // Cortex-A53,57,72,73
499 1.9 ryo
500 1.9 ryo static const uintmax_t
501 1.9 ryo L2CTLR_NUMOFCORE = __BITS(25,24),// Number of cores
502 1.9 ryo L2CTLR_CPUCACHEPROT = __BIT(22), // CPU Cache Protection
503 1.9 ryo L2CTLR_SCUL2CACHEPROT = __BIT(21), // SCU-L2 Cache Protection
504 1.9 ryo L2CTLR_L2_INPUT_LATENCY = __BIT(5), // L2 Data RAM input latency
505 1.9 ryo L2CTLR_L2_OUTPUT_LATENCY = __BIT(0); // L2 Data RAM output latency
506 1.9 ryo
507 1.9 ryo AARCH64REG_READ_INLINE(mair_el1) // Memory Attribute Indirection Register
508 1.1 matt AARCH64REG_WRITE_INLINE(mair_el1)
509 1.1 matt
510 1.9 ryo static const uintmax_t
511 1.9 ryo MAIR_ATTR0 = __BITS(7,0),
512 1.9 ryo MAIR_ATTR1 = __BITS(15,8),
513 1.9 ryo MAIR_ATTR2 = __BITS(23,16),
514 1.9 ryo MAIR_ATTR3 = __BITS(31,24),
515 1.9 ryo MAIR_ATTR4 = __BITS(39,32),
516 1.9 ryo MAIR_ATTR5 = __BITS(47,40),
517 1.9 ryo MAIR_ATTR6 = __BITS(55,48),
518 1.9 ryo MAIR_ATTR7 = __BITS(63,56),
519 1.9 ryo MAIR_DEVICE_nGnRnE = 0x00, // NoGathering,NoReordering,NoEarlyWriteAck.
520 1.9 ryo MAIR_NORMAL_NC = 0x44,
521 1.9 ryo MAIR_NORMAL_WT = 0xbb,
522 1.9 ryo MAIR_NORMAL_WB = 0xff;
523 1.9 ryo
524 1.1 matt AARCH64REG_READ_INLINE(par_el1) // Physical Address Register
525 1.1 matt AARCH64REG_WRITE_INLINE(par_el1)
526 1.1 matt
527 1.1 matt static const uintmax_t
528 1.1 matt PAR_ATTR = __BITS(63,56),// F=0 memory attributes
529 1.1 matt PAR_PA = __BITS(47,12),// F=0 physical address
530 1.1 matt PAR_NS = __BIT(9), // F=0 non-secure
531 1.1 matt PAR_S = __BIT(9), // F=1 failure stage
532 1.1 matt PAR_SHA = __BITS(8,7), // F=0 shareability attribute
533 1.1 matt PAR_SHA_NONE = 0,
534 1.1 matt PAR_SHA_OUTER = 2,
535 1.1 matt PAR_SHA_INNER = 3,
536 1.1 matt PAR_PTW = __BIT(8), // F=1 partial table walk
537 1.1 matt PAR_FST = __BITS(6,1), // F=1 fault status code
538 1.1 matt PAR_F = __BIT(0); // translation failed
539 1.1 matt
540 1.1 matt AARCH64REG_READ_INLINE(rmr_el1) // Reset Management Register
541 1.1 matt AARCH64REG_WRITE_INLINE(rmr_el1)
542 1.1 matt
543 1.1 matt AARCH64REG_READ_INLINE(rvbar_el1) // Reset Vector Base Address Register
544 1.1 matt AARCH64REG_WRITE_INLINE(rvbar_el1)
545 1.1 matt
546 1.2 skrll AARCH64REG_READ_INLINE(sctlr_el1) // System Control Register
547 1.2 skrll AARCH64REG_WRITE_INLINE(sctlr_el1)
548 1.1 matt
549 1.9 ryo static const uintmax_t
550 1.9 ryo SCTLR_RES0 = 0xc8222400, // Reserved ARMv8.0, write 0
551 1.9 ryo SCTLR_RES1 = 0x30d00800, // Reserved ARMv8.0, write 1
552 1.9 ryo SCTLR_M = __BIT(0),
553 1.9 ryo SCTLR_A = __BIT(1),
554 1.9 ryo SCTLR_C = __BIT(2),
555 1.9 ryo SCTLR_SA = __BIT(3),
556 1.9 ryo SCTLR_SA0 = __BIT(4),
557 1.9 ryo SCTLR_CP15BEN = __BIT(5),
558 1.9 ryo SCTLR_THEE = __BIT(6),
559 1.9 ryo SCTLR_ITD = __BIT(7),
560 1.9 ryo SCTLR_SED = __BIT(8),
561 1.9 ryo SCTLR_UMA = __BIT(9),
562 1.9 ryo SCTLR_I = __BIT(12),
563 1.9 ryo SCTLR_DZE = __BIT(14),
564 1.9 ryo SCTLR_UCT = __BIT(15),
565 1.9 ryo SCTLR_nTWI = __BIT(16),
566 1.9 ryo SCTLR_nTWE = __BIT(18),
567 1.9 ryo SCTLR_WXN = __BIT(19),
568 1.9 ryo SCTLR_IESB = __BIT(21),
569 1.9 ryo SCTLR_SPAN = __BIT(23),
570 1.9 ryo SCTLR_EOE = __BIT(24),
571 1.9 ryo SCTLR_EE = __BIT(25),
572 1.9 ryo SCTLR_UCI = __BIT(26),
573 1.9 ryo SCTLR_nTLSMD = __BIT(28),
574 1.9 ryo SCTLR_LSMAOE = __BIT(29);
575 1.9 ryo
576 1.9 ryo // current EL stack pointer
577 1.9 ryo static uint64_t inline
578 1.9 ryo reg_sp_read(void)
579 1.9 ryo {
580 1.9 ryo uint64_t __rv;
581 1.9 ryo __asm __volatile ("mov %0, sp" : "=r"(__rv));
582 1.9 ryo return __rv;
583 1.9 ryo }
584 1.9 ryo
585 1.9 ryo AARCH64REG_READ_INLINE(sp_el0) // EL0 Stack Pointer
586 1.1 matt AARCH64REG_WRITE_INLINE(sp_el0)
587 1.1 matt
588 1.9 ryo AARCH64REG_READ_INLINE(spsel) // Stack Pointer Select
589 1.9 ryo AARCH64REG_WRITE_INLINE(spsel)
590 1.1 matt
591 1.1 matt static const uintmax_t
592 1.9 ryo SPSEL_SP = __BIT(0); // use SP_EL0 at all exception levels
593 1.1 matt
594 1.1 matt AARCH64REG_READ_INLINE(spsr_el1) // Saved Program Status Register
595 1.1 matt AARCH64REG_WRITE_INLINE(spsr_el1)
596 1.1 matt
597 1.1 matt static const uintmax_t
598 1.1 matt SPSR_NZCV = __BITS(31,28), // mask of N Z C V
599 1.3 skrll SPSR_N = __BIT(31), // Negative
600 1.1 matt SPSR_Z = __BIT(30), // Zero
601 1.1 matt SPSR_C = __BIT(29), // Carry
602 1.1 matt SPSR_V = __BIT(28), // oVerflow
603 1.1 matt SPSR_A32_Q = __BIT(27), // A32: Overflow
604 1.1 matt SPSR_A32_J = __BIT(24), // A32: Jazelle Mode
605 1.1 matt SPSR_A32_IT1 = __BIT(23), // A32: IT[1]
606 1.1 matt SPSR_A32_IT0 = __BIT(22), // A32: IT[0]
607 1.1 matt SPSR_SS = __BIT(21), // Software Step
608 1.1 matt SPSR_IL = __BIT(20), // Instruction Length
609 1.1 matt SPSR_GE = __BITS(19,16), // A32: SIMD GE
610 1.1 matt SPSR_IT7 = __BIT(15), // A32: IT[7]
611 1.1 matt SPSR_IT6 = __BIT(14), // A32: IT[6]
612 1.1 matt SPSR_IT5 = __BIT(13), // A32: IT[5]
613 1.1 matt SPSR_IT4 = __BIT(12), // A32: IT[4]
614 1.1 matt SPSR_IT3 = __BIT(11), // A32: IT[3]
615 1.1 matt SPSR_IT2 = __BIT(10), // A32: IT[2]
616 1.1 matt SPSR_A64_D = __BIT(9), // A64: Debug Exception Mask
617 1.1 matt SPSR_A32_E = __BIT(9), // A32: BE Endian Mode
618 1.1 matt SPSR_A = __BIT(8), // Async abort (SError) Mask
619 1.1 matt SPSR_I = __BIT(7), // IRQ Mask
620 1.1 matt SPSR_F = __BIT(6), // FIQ Mask
621 1.1 matt SPSR_A32_T = __BIT(5), // A32 Thumb Mode
622 1.1 matt SPSR_M = __BITS(4,0), // Execution State
623 1.1 matt SPSR_M_EL3H = 0x0d,
624 1.1 matt SPSR_M_EL3T = 0x0c,
625 1.1 matt SPSR_M_EL2H = 0x09,
626 1.1 matt SPSR_M_EL2T = 0x08,
627 1.1 matt SPSR_M_EL1H = 0x05,
628 1.1 matt SPSR_M_EL1T = 0x04,
629 1.1 matt SPSR_M_EL0T = 0x00,
630 1.1 matt SPSR_M_SYS32 = 0x1f,
631 1.1 matt SPSR_M_UND32 = 0x1b,
632 1.1 matt SPSR_M_ABT32 = 0x17,
633 1.1 matt SPSR_M_SVC32 = 0x13,
634 1.1 matt SPSR_M_IRQ32 = 0x12,
635 1.1 matt SPSR_M_FIQ32 = 0x11,
636 1.1 matt SPSR_M_USR32 = 0x10;
637 1.1 matt
638 1.1 matt AARCH64REG_READ_INLINE(tcr_el1) // Translation Control Register
639 1.1 matt AARCH64REG_WRITE_INLINE(tcr_el1)
640 1.1 matt
641 1.9 ryo #define TCR_PAGE_SIZE1(tcr) (1L << ((1L << __SHIFTOUT(tcr, TCR_TG1)) + 8))
642 1.1 matt
643 1.1 matt AARCH64REG_READ_INLINE(tpidr_el1) // Thread ID Register (EL1)
644 1.1 matt AARCH64REG_WRITE_INLINE(tpidr_el1)
645 1.1 matt
646 1.1 matt AARCH64REG_WRITE_INLINE(tpidrro_el0) // Thread ID Register (RO for EL0)
647 1.1 matt
648 1.9 ryo AARCH64REG_READ_INLINE(ttbr0_el1) // Translation Table Base Register 0 EL1
649 1.1 matt AARCH64REG_WRITE_INLINE(ttbr0_el1)
650 1.1 matt
651 1.9 ryo AARCH64REG_READ_INLINE(ttbr1_el1) // Translation Table Base Register 1 EL1
652 1.1 matt AARCH64REG_WRITE_INLINE(ttbr1_el1)
653 1.1 matt
654 1.1 matt AARCH64REG_READ_INLINE(vbar_el1) // Vector Base Address Register
655 1.1 matt AARCH64REG_WRITE_INLINE(vbar_el1)
656 1.1 matt
657 1.9 ryo /*
658 1.9 ryo * From here on, these are DEBUG registers
659 1.9 ryo */
660 1.9 ryo AARCH64REG_READ_INLINE(dbgbcr0_el1) // Debug Breakpoint Control Register 0
661 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbcr0_el1)
662 1.9 ryo AARCH64REG_READ_INLINE(dbgbcr1_el1) // Debug Breakpoint Control Register 1
663 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbcr1_el1)
664 1.9 ryo AARCH64REG_READ_INLINE(dbgbcr2_el1) // Debug Breakpoint Control Register 2
665 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbcr2_el1)
666 1.9 ryo AARCH64REG_READ_INLINE(dbgbcr3_el1) // Debug Breakpoint Control Register 3
667 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbcr3_el1)
668 1.9 ryo AARCH64REG_READ_INLINE(dbgbcr4_el1) // Debug Breakpoint Control Register 4
669 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbcr4_el1)
670 1.9 ryo AARCH64REG_READ_INLINE(dbgbcr5_el1) // Debug Breakpoint Control Register 5
671 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbcr5_el1)
672 1.9 ryo AARCH64REG_READ_INLINE(dbgbcr6_el1) // Debug Breakpoint Control Register 6
673 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbcr6_el1)
674 1.9 ryo AARCH64REG_READ_INLINE(dbgbcr7_el1) // Debug Breakpoint Control Register 7
675 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbcr7_el1)
676 1.9 ryo AARCH64REG_READ_INLINE(dbgbcr8_el1) // Debug Breakpoint Control Register 8
677 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbcr8_el1)
678 1.9 ryo AARCH64REG_READ_INLINE(dbgbcr9_el1) // Debug Breakpoint Control Register 9
679 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbcr9_el1)
680 1.9 ryo AARCH64REG_READ_INLINE(dbgbcr10_el1) // Debug Breakpoint Control Register 10
681 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbcr10_el1)
682 1.9 ryo AARCH64REG_READ_INLINE(dbgbcr11_el1) // Debug Breakpoint Control Register 11
683 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbcr11_el1)
684 1.9 ryo AARCH64REG_READ_INLINE(dbgbcr12_el1) // Debug Breakpoint Control Register 12
685 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbcr12_el1)
686 1.9 ryo AARCH64REG_READ_INLINE(dbgbcr13_el1) // Debug Breakpoint Control Register 13
687 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbcr13_el1)
688 1.9 ryo AARCH64REG_READ_INLINE(dbgbcr14_el1) // Debug Breakpoint Control Register 14
689 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbcr14_el1)
690 1.9 ryo AARCH64REG_READ_INLINE(dbgbcr15_el1) // Debug Breakpoint Control Register 15
691 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbcr15_el1)
692 1.9 ryo
693 1.9 ryo static const uintmax_t
694 1.9 ryo DBGBCR_BT = __BITS(23,20),
695 1.9 ryo DBGBCR_LBN = __BITS(19,16),
696 1.9 ryo DBGBCR_SSC = __BITS(15,14),
697 1.9 ryo DBGBCR_HMC = __BIT(13),
698 1.9 ryo DBGBCR_BAS = __BITS(8,5),
699 1.9 ryo DBGBCR_PMC = __BITS(2,1),
700 1.9 ryo DBGBCR_E = __BIT(0);
701 1.9 ryo
702 1.9 ryo AARCH64REG_READ_INLINE(dbgbvr0_el1) // Debug Breakpoint Value Register 0
703 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbvr0_el1)
704 1.9 ryo AARCH64REG_READ_INLINE(dbgbvr1_el1) // Debug Breakpoint Value Register 1
705 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbvr1_el1)
706 1.9 ryo AARCH64REG_READ_INLINE(dbgbvr2_el1) // Debug Breakpoint Value Register 2
707 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbvr2_el1)
708 1.9 ryo AARCH64REG_READ_INLINE(dbgbvr3_el1) // Debug Breakpoint Value Register 3
709 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbvr3_el1)
710 1.9 ryo AARCH64REG_READ_INLINE(dbgbvr4_el1) // Debug Breakpoint Value Register 4
711 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbvr4_el1)
712 1.9 ryo AARCH64REG_READ_INLINE(dbgbvr5_el1) // Debug Breakpoint Value Register 5
713 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbvr5_el1)
714 1.9 ryo AARCH64REG_READ_INLINE(dbgbvr6_el1) // Debug Breakpoint Value Register 6
715 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbvr6_el1)
716 1.9 ryo AARCH64REG_READ_INLINE(dbgbvr7_el1) // Debug Breakpoint Value Register 7
717 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbvr7_el1)
718 1.9 ryo AARCH64REG_READ_INLINE(dbgbvr8_el1) // Debug Breakpoint Value Register 8
719 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbvr8_el1)
720 1.9 ryo AARCH64REG_READ_INLINE(dbgbvr9_el1) // Debug Breakpoint Value Register 9
721 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbvr9_el1)
722 1.9 ryo AARCH64REG_READ_INLINE(dbgbvr10_el1) // Debug Breakpoint Value Register 10
723 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbvr10_el1)
724 1.9 ryo AARCH64REG_READ_INLINE(dbgbvr11_el1) // Debug Breakpoint Value Register 11
725 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbvr11_el1)
726 1.9 ryo AARCH64REG_READ_INLINE(dbgbvr12_el1) // Debug Breakpoint Value Register 12
727 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbvr12_el1)
728 1.9 ryo AARCH64REG_READ_INLINE(dbgbvr13_el1) // Debug Breakpoint Value Register 13
729 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbvr13_el1)
730 1.9 ryo AARCH64REG_READ_INLINE(dbgbvr14_el1) // Debug Breakpoint Value Register 14
731 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbvr14_el1)
732 1.9 ryo AARCH64REG_READ_INLINE(dbgbvr15_el1) // Debug Breakpoint Value Register 15
733 1.9 ryo AARCH64REG_WRITE_INLINE(dbgbvr15_el1)
734 1.9 ryo
735 1.9 ryo AARCH64REG_READ_INLINE(dbgwcr0_el1) // Debug Watchpoint Control Register 0
736 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwcr0_el1)
737 1.9 ryo AARCH64REG_READ_INLINE(dbgwcr1_el1) // Debug Watchpoint Control Register 1
738 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwcr1_el1)
739 1.9 ryo AARCH64REG_READ_INLINE(dbgwcr2_el1) // Debug Watchpoint Control Register 2
740 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwcr2_el1)
741 1.9 ryo AARCH64REG_READ_INLINE(dbgwcr3_el1) // Debug Watchpoint Control Register 3
742 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwcr3_el1)
743 1.9 ryo AARCH64REG_READ_INLINE(dbgwcr4_el1) // Debug Watchpoint Control Register 4
744 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwcr4_el1)
745 1.9 ryo AARCH64REG_READ_INLINE(dbgwcr5_el1) // Debug Watchpoint Control Register 5
746 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwcr5_el1)
747 1.9 ryo AARCH64REG_READ_INLINE(dbgwcr6_el1) // Debug Watchpoint Control Register 6
748 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwcr6_el1)
749 1.9 ryo AARCH64REG_READ_INLINE(dbgwcr7_el1) // Debug Watchpoint Control Register 7
750 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwcr7_el1)
751 1.9 ryo AARCH64REG_READ_INLINE(dbgwcr8_el1) // Debug Watchpoint Control Register 8
752 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwcr8_el1)
753 1.9 ryo AARCH64REG_READ_INLINE(dbgwcr9_el1) // Debug Watchpoint Control Register 9
754 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwcr9_el1)
755 1.9 ryo AARCH64REG_READ_INLINE(dbgwcr10_el1) // Debug Watchpoint Control Register 10
756 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwcr10_el1)
757 1.9 ryo AARCH64REG_READ_INLINE(dbgwcr11_el1) // Debug Watchpoint Control Register 11
758 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwcr11_el1)
759 1.9 ryo AARCH64REG_READ_INLINE(dbgwcr12_el1) // Debug Watchpoint Control Register 12
760 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwcr12_el1)
761 1.9 ryo AARCH64REG_READ_INLINE(dbgwcr13_el1) // Debug Watchpoint Control Register 13
762 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwcr13_el1)
763 1.9 ryo AARCH64REG_READ_INLINE(dbgwcr14_el1) // Debug Watchpoint Control Register 14
764 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwcr14_el1)
765 1.9 ryo AARCH64REG_READ_INLINE(dbgwcr15_el1) // Debug Watchpoint Control Register 15
766 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwcr15_el1)
767 1.9 ryo
768 1.9 ryo static const uintmax_t
769 1.9 ryo DBGWCR_MASK = __BITS(28,24),
770 1.9 ryo DBGWCR_WT = __BIT(20),
771 1.9 ryo DBGWCR_LBN = __BITS(19,16),
772 1.9 ryo DBGWCR_SSC = __BITS(15,14),
773 1.9 ryo DBGWCR_HMC = __BIT(13),
774 1.9 ryo DBGWCR_BAS = __BITS(12,5),
775 1.9 ryo DBGWCR_LSC = __BITS(4,3),
776 1.9 ryo DBGWCR_PAC = __BITS(2,1),
777 1.9 ryo DBGWCR_E = __BIT(0);
778 1.9 ryo
779 1.9 ryo AARCH64REG_READ_INLINE(dbgwvr0_el1) // Debug Watchpoint Value Register 0
780 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwvr0_el1)
781 1.9 ryo AARCH64REG_READ_INLINE(dbgwvr1_el1) // Debug Watchpoint Value Register 1
782 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwvr1_el1)
783 1.9 ryo AARCH64REG_READ_INLINE(dbgwvr2_el1) // Debug Watchpoint Value Register 2
784 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwvr2_el1)
785 1.9 ryo AARCH64REG_READ_INLINE(dbgwvr3_el1) // Debug Watchpoint Value Register 3
786 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwvr3_el1)
787 1.9 ryo AARCH64REG_READ_INLINE(dbgwvr4_el1) // Debug Watchpoint Value Register 4
788 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwvr4_el1)
789 1.9 ryo AARCH64REG_READ_INLINE(dbgwvr5_el1) // Debug Watchpoint Value Register 5
790 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwvr5_el1)
791 1.9 ryo AARCH64REG_READ_INLINE(dbgwvr6_el1) // Debug Watchpoint Value Register 6
792 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwvr6_el1)
793 1.9 ryo AARCH64REG_READ_INLINE(dbgwvr7_el1) // Debug Watchpoint Value Register 7
794 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwvr7_el1)
795 1.9 ryo AARCH64REG_READ_INLINE(dbgwvr8_el1) // Debug Watchpoint Value Register 8
796 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwvr8_el1)
797 1.9 ryo AARCH64REG_READ_INLINE(dbgwvr9_el1) // Debug Watchpoint Value Register 9
798 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwvr9_el1)
799 1.9 ryo AARCH64REG_READ_INLINE(dbgwvr10_el1) // Debug Watchpoint Value Register 10
800 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwvr10_el1)
801 1.9 ryo AARCH64REG_READ_INLINE(dbgwvr11_el1) // Debug Watchpoint Value Register 11
802 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwvr11_el1)
803 1.9 ryo AARCH64REG_READ_INLINE(dbgwvr12_el1) // Debug Watchpoint Value Register 12
804 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwvr12_el1)
805 1.9 ryo AARCH64REG_READ_INLINE(dbgwvr13_el1) // Debug Watchpoint Value Register 13
806 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwvr13_el1)
807 1.9 ryo AARCH64REG_READ_INLINE(dbgwvr14_el1) // Debug Watchpoint Value Register 14
808 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwvr14_el1)
809 1.9 ryo AARCH64REG_READ_INLINE(dbgwvr15_el1) // Debug Watchpoint Value Register 15
810 1.9 ryo AARCH64REG_WRITE_INLINE(dbgwvr15_el1)
811 1.9 ryo
812 1.9 ryo static const uintmax_t
813 1.9 ryo DBGWVR_MASK = __BITS(64,3);
814 1.9 ryo
815 1.9 ryo
816 1.9 ryo AARCH64REG_READ_INLINE(mdscr_el1) // Monitor Debug System Control Register
817 1.9 ryo AARCH64REG_WRITE_INLINE(mdscr_el1)
818 1.9 ryo
819 1.9 ryo AARCH64REG_WRITE_INLINE(oslar_el1) // OS Lock Access Register
820 1.9 ryo
821 1.9 ryo AARCH64REG_READ_INLINE(oslsr_el1) // OS Lock Status Register
822 1.9 ryo
823 1.9 ryo /*
824 1.9 ryo * From here on, these are PMC registers
825 1.9 ryo */
826 1.9 ryo
827 1.1 matt AARCH64REG_READ_INLINE(pmccfiltr_el0)
828 1.1 matt AARCH64REG_WRITE_INLINE(pmccfiltr_el0)
829 1.1 matt
830 1.1 matt static const uintmax_t
831 1.1 matt PMCCFILTR_P = __BIT(31), // Don't count cycles in EL1
832 1.1 matt PMCCFILTR_U = __BIT(30), // Don't count cycles in EL0
833 1.1 matt PMCCFILTR_NSK = __BIT(29), // Don't count cycles in NS EL1
834 1.1 matt PMCCFILTR_NSU = __BIT(28), // Don't count cycles in NS EL0
835 1.1 matt PMCCFILTR_NSH = __BIT(27), // Don't count cycles in NS EL2
836 1.1 matt PMCCFILTR_M = __BIT(26); // Don't count cycles in EL3
837 1.1 matt
838 1.1 matt AARCH64REG_READ_INLINE(pmccntr_el0)
839 1.1 matt
840 1.1 matt AARCH64REG_READ_INLINE(cntfrq_el0)
841 1.1 matt
842 1.9 ryo AARCH64REG_READ_INLINE(cnthctl_el2)
843 1.9 ryo AARCH64REG_WRITE_INLINE(cnthctl_el2)
844 1.9 ryo
845 1.9 ryo static const uintmax_t
846 1.9 ryo CNTHCTL_EVNTDIR = __BIT(3),
847 1.9 ryo CNTHCTL_EVNTEN = __BIT(2),
848 1.9 ryo CNTHCTL_EL1PCEN = __BIT(1),
849 1.9 ryo CNTHCTL_EL1PCTEN = __BIT(0);
850 1.9 ryo
851 1.1 matt AARCH64REG_READ_INLINE(cntkctl_el1)
852 1.1 matt AARCH64REG_WRITE_INLINE(cntkctl_el1)
853 1.1 matt
854 1.1 matt static const uintmax_t
855 1.9 ryo CNTKCTL_EL0PTEN = __BIT(9), // EL0 access for CNTP CVAL/TVAL/CTL
856 1.9 ryo CNTKCTL_PL0PTEN = CNTKCTL_EL0PTEN,
857 1.9 ryo CNTKCTL_EL0VTEN = __BIT(8), // EL0 access for CNTV CVAL/TVAL/CTL
858 1.9 ryo CNTKCTL_PL0VTEN = CNTKCTL_EL0VTEN,
859 1.9 ryo CNTKCTL_ELNTI = __BITS(7,4),
860 1.9 ryo CNTKCTL_EVNTDIR = __BIT(3),
861 1.9 ryo CNTKCTL_EVNTEN = __BIT(2),
862 1.9 ryo CNTKCTL_EL0VCTEN = __BIT(1), // EL0 access for CNTVCT and CNTFRQ
863 1.9 ryo CNTKCTL_PL0VCTEN = CNTKCTL_EL0VCTEN,
864 1.9 ryo CNTKCTL_EL0PCTEN = __BIT(0), // EL0 access for CNTPCT and CNTFRQ
865 1.9 ryo CNTKCTL_PL0PCTEN = CNTKCTL_EL0PCTEN;
866 1.1 matt
867 1.1 matt AARCH64REG_READ_INLINE(cntp_ctl_el0)
868 1.1 matt AARCH64REG_WRITE_INLINE(cntp_ctl_el0)
869 1.1 matt AARCH64REG_READ_INLINE(cntp_cval_el0)
870 1.1 matt AARCH64REG_WRITE_INLINE(cntp_cval_el0)
871 1.1 matt AARCH64REG_READ_INLINE(cntp_tval_el0)
872 1.1 matt AARCH64REG_WRITE_INLINE(cntp_tval_el0)
873 1.1 matt AARCH64REG_READ_INLINE(cntpct_el0)
874 1.1 matt AARCH64REG_WRITE_INLINE(cntpct_el0)
875 1.1 matt
876 1.1 matt AARCH64REG_READ_INLINE(cntps_ctl_el1)
877 1.1 matt AARCH64REG_WRITE_INLINE(cntps_ctl_el1)
878 1.1 matt AARCH64REG_READ_INLINE(cntps_cval_el1)
879 1.1 matt AARCH64REG_WRITE_INLINE(cntps_cval_el1)
880 1.1 matt AARCH64REG_READ_INLINE(cntps_tval_el1)
881 1.1 matt AARCH64REG_WRITE_INLINE(cntps_tval_el1)
882 1.1 matt
883 1.1 matt AARCH64REG_READ_INLINE(cntv_ctl_el0)
884 1.1 matt AARCH64REG_WRITE_INLINE(cntv_ctl_el0)
885 1.1 matt AARCH64REG_READ_INLINE(cntv_cval_el0)
886 1.1 matt AARCH64REG_WRITE_INLINE(cntv_cval_el0)
887 1.1 matt AARCH64REG_READ_INLINE(cntv_tval_el0)
888 1.1 matt AARCH64REG_WRITE_INLINE(cntv_tval_el0)
889 1.1 matt AARCH64REG_READ_INLINE(cntvct_el0)
890 1.1 matt AARCH64REG_WRITE_INLINE(cntvct_el0)
891 1.1 matt
892 1.1 matt static const uintmax_t
893 1.1 matt CNTCTL_ISTATUS = __BIT(2), // Interrupt Asserted
894 1.1 matt CNTCTL_IMASK = __BIT(1), // Timer Interrupt is Masked
895 1.1 matt CNTCTL_ENABLE = __BIT(0); // Timer Enabled
896 1.1 matt
897 1.1 matt
898 1.9 ryo // ID_AA64PFR0_EL1: AArch64 Processor Feature Register 0
899 1.9 ryo static const uintmax_t
900 1.9 ryo ID_AA64PFR0_EL1_GIC = __BITS(24,27), // GIC CPU IF
901 1.9 ryo ID_AA64PFR0_EL1_GIC_SHIFT = 24,
902 1.9 ryo ID_AA64PFR0_EL1_GIC_CPUIF_EN = 1,
903 1.9 ryo ID_AA64PFR0_EL1_GIC_CPUIF_NONE = 0,
904 1.9 ryo ID_AA64PFR0_EL1_ADVSIMD = __BITS(23,20), // SIMD
905 1.9 ryo ID_AA64PFR0_EL1_ADV_SIMD_IMPL = 0x0,
906 1.9 ryo ID_AA64PFR0_EL1_ADV_SIMD_NONE = 0xf,
907 1.9 ryo ID_AA64PFR0_EL1_FP = __BITS(19,16), // FP
908 1.9 ryo ID_AA64PFR0_EL1_FP_IMPL = 0x0,
909 1.9 ryo ID_AA64PFR0_EL1_FP_NONE = 0xf,
910 1.9 ryo ID_AA64PFR0_EL1_EL3 = __BITS(15,12), // EL3 handling
911 1.9 ryo ID_AA64PFR0_EL1_EL3_NONE = 0,
912 1.9 ryo ID_AA64PFR0_EL1_EL3_64 = 1,
913 1.9 ryo ID_AA64PFR0_EL1_EL3_64_32 = 2,
914 1.9 ryo ID_AA64PFR0_EL1_EL2 = __BITS(11,8), // EL2 handling
915 1.9 ryo ID_AA64PFR0_EL1_EL2_NONE = 0,
916 1.9 ryo ID_AA64PFR0_EL1_EL2_64 = 1,
917 1.9 ryo ID_AA64PFR0_EL1_EL2_64_32 = 2,
918 1.9 ryo ID_AA64PFR0_EL1_EL1 = __BITS(7,4), // EL1 handling
919 1.9 ryo ID_AA64PFR0_EL1_EL1_64 = 1,
920 1.9 ryo ID_AA64PFR0_EL1_EL1_64_32 = 2,
921 1.9 ryo ID_AA64PFR0_EL1_EL0 = __BITS(3,0), // EL0 handling
922 1.9 ryo ID_AA64PFR0_EL1_EL0_64 = 1,
923 1.9 ryo ID_AA64PFR0_EL1_EL0_64_32 = 2;
924 1.9 ryo
925 1.9 ryo // ICC_SRE_EL1: Interrupt Controller System Register Enable register
926 1.9 ryo static const uintmax_t
927 1.9 ryo ICC_SRE_EL1_SRE = __BIT(0),
928 1.9 ryo ICC_SRE_EL1_DFB = __BIT(1),
929 1.9 ryo ICC_SRE_EL1_DIB = __BIT(2);
930 1.9 ryo
931 1.9 ryo // ICC_SRE_EL2: Interrupt Controller System Register Enable register
932 1.9 ryo static const uintmax_t
933 1.9 ryo ICC_SRE_EL2_SRE = __BIT(0),
934 1.9 ryo ICC_SRE_EL2_DFB = __BIT(1),
935 1.9 ryo ICC_SRE_EL2_DIB = __BIT(2),
936 1.9 ryo ICC_SRE_EL2_EN = __BIT(3);
937 1.9 ryo
938 1.9 ryo
939 1.9 ryo /*
940 1.9 ryo * GENERIC TIMER REGISTER ACCESS
941 1.9 ryo */
942 1.9 ryo static inline uint32_t
943 1.9 ryo gtmr_cntfrq_read(void)
944 1.9 ryo {
945 1.9 ryo
946 1.9 ryo return reg_cntfrq_el0_read();
947 1.9 ryo }
948 1.9 ryo
949 1.9 ryo static inline uint32_t
950 1.9 ryo gtmr_cntk_ctl_read(void)
951 1.9 ryo {
952 1.1 matt
953 1.9 ryo return reg_cntkctl_el1_read();
954 1.9 ryo }
955 1.9 ryo
956 1.9 ryo static inline void
957 1.9 ryo gtmr_cntk_ctl_write(uint32_t val)
958 1.9 ryo {
959 1.9 ryo
960 1.9 ryo reg_cntkctl_el1_write(val);
961 1.9 ryo }
962 1.9 ryo
963 1.9 ryo /*
964 1.9 ryo * Counter-timer Virtual Count timer
965 1.9 ryo */
966 1.9 ryo static inline uint64_t
967 1.9 ryo gtmr_cntpct_read(void)
968 1.9 ryo {
969 1.9 ryo
970 1.9 ryo return reg_cntpct_el0_read();
971 1.9 ryo }
972 1.9 ryo
973 1.9 ryo static inline uint64_t
974 1.9 ryo gtmr_cntvct_read(void)
975 1.9 ryo {
976 1.9 ryo
977 1.9 ryo return reg_cntvct_el0_read();
978 1.9 ryo }
979 1.9 ryo
980 1.9 ryo /*
981 1.9 ryo * Counter-timer Virtual Timer Control register
982 1.9 ryo */
983 1.9 ryo static inline uint32_t
984 1.9 ryo gtmr_cntv_ctl_read(void)
985 1.9 ryo {
986 1.9 ryo
987 1.9 ryo return reg_cntv_ctl_el0_read();
988 1.9 ryo }
989 1.9 ryo
990 1.9 ryo static inline void
991 1.9 ryo gtmr_cntv_ctl_write(uint32_t val)
992 1.9 ryo {
993 1.9 ryo
994 1.9 ryo reg_cntv_ctl_el0_write(val);
995 1.9 ryo }
996 1.9 ryo
997 1.9 ryo static inline void
998 1.9 ryo gtmr_cntp_ctl_write(uint32_t val)
999 1.9 ryo {
1000 1.9 ryo
1001 1.9 ryo
1002 1.9 ryo reg_cntp_ctl_el0_write(val);
1003 1.9 ryo }
1004 1.9 ryo
1005 1.9 ryo /*
1006 1.9 ryo * Counter-timer Virtual Timer TimerValue register
1007 1.9 ryo */
1008 1.9 ryo static inline void
1009 1.9 ryo gtmr_cntv_tval_write(uint32_t val)
1010 1.9 ryo {
1011 1.9 ryo
1012 1.9 ryo reg_cntv_tval_el0_write(val);
1013 1.9 ryo }
1014 1.9 ryo
1015 1.9 ryo
1016 1.9 ryo /*
1017 1.9 ryo * Counter-timer Virtual Timer CompareValue register
1018 1.9 ryo */
1019 1.9 ryo static inline uint64_t
1020 1.9 ryo gtmr_cntv_cval_read(void)
1021 1.9 ryo {
1022 1.9 ryo
1023 1.9 ryo return reg_cntv_cval_el0_read();
1024 1.9 ryo }
1025 1.1 matt
1026 1.1 matt #endif /* _AARCH64_ARMREG_H_ */
1027