coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
lib_helpers.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * lib_helpers.h: All library function prototypes and macros are defined in this
4  * file.
5  */
6 
7 #ifndef __ARCH_LIB_HELPERS_H__
8 #define __ARCH_LIB_HELPERS_H__
9 
10 #define EL0 0
11 #define EL1 1
12 #define EL2 2
13 #define EL3 3
14 
15 #define CURRENT_EL_MASK 0x3
16 #define CURRENT_EL_SHIFT 2
17 
18 #define SPSR_USE_L 0
19 #define SPSR_USE_H 1
20 #define SPSR_L_H_MASK 1
21 #define SPSR_M_SHIFT 4
22 #define SPSR_ERET_32 (1 << SPSR_M_SHIFT)
23 #define SPSR_ERET_64 (0 << SPSR_M_SHIFT)
24 #define SPSR_FIQ (1 << 6)
25 #define SPSR_IRQ (1 << 7)
26 #define SPSR_SERROR (1 << 8)
27 #define SPSR_DEBUG (1 << 9)
28 #define SPSR_EXCEPTION_MASK (SPSR_FIQ | SPSR_IRQ | SPSR_SERROR | SPSR_DEBUG)
29 
30 #define SCR_NS (1 << 0) /* EL0/1 are non-secure */
31 #define SCR_IRQ (1 << 1) /* Take IRQs in EL3 */
32 #define SCR_FIQ (1 << 2) /* Take FIQs in EL3 */
33 #define SCR_EA (1 << 3) /* Take EA/SError in EL3 */
34 #define SCR_SMD (1 << 7) /* Disable SMC instruction */
35 #define SCR_HCE (1 << 8) /* Enable HVC instruction */
36 #define SCR_SIF (1 << 9) /* Forbid insns from NS memory */
37 #define SCR_RW (1 << 10) /* Lower ELs are AArch64 */
38 #define SCR_ST (1 << 11) /* Don't trap secure CNTPS */
39 #define SCR_TWI (1 << 12) /* Trap WFI to EL3 */
40 #define SCR_TWE (1 << 13) /* Trap WFE to EL3 */
41 #define SCR_TLOR (1 << 14) /* Trap LOR accesses to EL3 */
42 #define SCR_TERR (1 << 15) /* Trap ERR accesses to EL3 */
43 #define SCR_APK (1 << 16) /* Don't trap ptrauth keys */
44 #define SCR_API (1 << 17) /* Don't trap ptrauth insn */
45 #define SCR_EEL2 (1 << 18) /* Enable secure EL2 */
46 #define SCR_EASE (1 << 19) /* Sync EAs use SError vector */
47 #define SCR_NMEA (1 << 20) /* Disallow EL3 SError masking */
48 #define SCR_FIEN (1 << 21) /* Don't trap EXRPFG */
49 #define SCR_RES1 (3 << 4)
50 
51 #define HCR_RW_SHIFT 31
52 #define HCR_LOWER_AARCH64 (1 << HCR_RW_SHIFT)
53 #define HCR_LOWER_AARCH32 (0 << HCR_RW_SHIFT)
54 
55 #define SCTLR_M (1 << 0) /* MMU enable */
56 #define SCTLR_A (1 << 1) /* Alignment check enable */
57 #define SCTLR_C (1 << 2) /* Data/unified cache enable */
58 #define SCTLR_SA (1 << 3) /* Stack alignment check enable */
59 #define SCTLR_NAA (1 << 6) /* non-aligned access STA/LDR */
60 #define SCTLR_I (1 << 12) /* Instruction cache enable */
61 #define SCTLR_ENDB (1 << 13) /* Pointer auth (data B) */
62 #define SCTLR_WXN (1 << 19) /* Write permission implies XN */
63 #define SCTLR_IESB (1 << 21) /* Implicit error sync event */
64 #define SCTLR_EE (1 << 25) /* Exception endianness (BE) */
65 #define SCTLR_ENDA (1 << 27) /* Pointer auth (data A) */
66 #define SCTLR_ENIB (1 << 30) /* Pointer auth (insn B) */
67 #define SCTLR_ENIA (1 << 31) /* Pointer auth (insn A) */
68 #define SCTLR_RES1 ((0x3 << 4) | (0x1 << 11) | (0x1 << 16) | \
69  (0x1 << 18) | (0x3 << 22) | (0x3 << 28))
70 
71 #define CPTR_EL3_TCPAC_SHIFT (31)
72 #define CPTR_EL3_TTA_SHIFT (20)
73 #define CPTR_EL3_TFP_SHIFT (10)
74 #define CPTR_EL3_TCPAC_DISABLE (0 << CPTR_EL3_TCPAC_SHIFT)
75 #define CPTR_EL3_TCPAC_ENABLE (1 << CPTR_EL3_TCPAC_SHIFT)
76 #define CPTR_EL3_TTA_DISABLE (0 << CPTR_EL3_TTA_SHIFT)
77 #define CPTR_EL3_TTA_ENABLE (1 << CPTR_EL3_TTA_SHIFT)
78 #define CPTR_EL3_TFP_DISABLE (0 << CPTR_EL3_TFP_SHIFT)
79 #define CPTR_EL3_TFP_ENABLE (1 << CPTR_EL3_TFP_SHIFT)
80 
81 #define CPACR_TTA_SHIFT (28)
82 #define CPACR_TTA_ENABLE (1 << CPACR_TTA_SHIFT)
83 #define CPACR_TTA_DISABLE (0 << CPACR_TTA_SHIFT)
84 #define CPACR_FPEN_SHIFT (20)
85 /*
86  * ARMv8-A spec: Values 0b00 and 0b10 both seem to enable traps from el0 and el1
87  * for fp reg access.
88  */
89 #define CPACR_TRAP_FP_EL0_EL1 (0 << CPACR_FPEN_SHIFT)
90 #define CPACR_TRAP_FP_EL0 (1 << CPACR_FPEN_SHIFT)
91 #define CPACR_TRAP_FP_DISABLE (3 << CPACR_FPEN_SHIFT)
92 
93 #define DAIF_DBG_BIT (1<<3)
94 #define DAIF_ABT_BIT (1<<2)
95 #define DAIF_IRQ_BIT (1<<1)
96 #define DAIF_FIQ_BIT (1<<0)
97 
98 #ifndef __ASSEMBLER__
99 
100 #include <stdint.h>
101 
102 #define MAKE_REGISTER_ACCESSORS(reg) \
103  static inline uint64_t raw_read_##reg(void) \
104  { \
105  uint64_t value; \
106  __asm__ __volatile__("mrs %0, " #reg "\n\t" \
107  : "=r" (value) : : "memory"); \
108  return value; \
109  } \
110  static inline void raw_write_##reg(uint64_t value) \
111  { \
112  __asm__ __volatile__("msr " #reg ", %0\n\t" \
113  : : "r" (value) : "memory"); \
114  }
115 
116 #define MAKE_REGISTER_ACCESSORS_EL123(reg) \
117  MAKE_REGISTER_ACCESSORS(reg##_el1) \
118  MAKE_REGISTER_ACCESSORS(reg##_el2) \
119  MAKE_REGISTER_ACCESSORS(reg##_el3)
120 
121 /* Architectural register accessors */
125 MAKE_REGISTER_ACCESSORS(aidr_el1)
127 MAKE_REGISTER_ACCESSORS(ccsidr_el1)
128 MAKE_REGISTER_ACCESSORS(clidr_el1)
129 MAKE_REGISTER_ACCESSORS(cntfrq_el0)
130 MAKE_REGISTER_ACCESSORS(cnthctl_el2)
131 MAKE_REGISTER_ACCESSORS(cnthp_ctl_el2)
132 MAKE_REGISTER_ACCESSORS(cnthp_cval_el2)
133 MAKE_REGISTER_ACCESSORS(cnthp_tval_el2)
134 MAKE_REGISTER_ACCESSORS(cntkctl_el1)
135 MAKE_REGISTER_ACCESSORS(cntp_ctl_el0)
136 MAKE_REGISTER_ACCESSORS(cntp_cval_el0)
137 MAKE_REGISTER_ACCESSORS(cntp_tval_el0)
138 MAKE_REGISTER_ACCESSORS(cntpct_el0)
139 MAKE_REGISTER_ACCESSORS(cntps_ctl_el1)
140 MAKE_REGISTER_ACCESSORS(cntps_cval_el1)
141 MAKE_REGISTER_ACCESSORS(cntps_tval_el1)
142 MAKE_REGISTER_ACCESSORS(cntv_ctl_el0)
143 MAKE_REGISTER_ACCESSORS(cntv_cval_el0)
144 MAKE_REGISTER_ACCESSORS(cntv_tval_el0)
145 MAKE_REGISTER_ACCESSORS(cntvct_el0)
146 MAKE_REGISTER_ACCESSORS(cntvoff_el2)
147 MAKE_REGISTER_ACCESSORS(contextidr_el1)
148 MAKE_REGISTER_ACCESSORS(cpacr_el1)
149 MAKE_REGISTER_ACCESSORS(cptr_el2)
150 MAKE_REGISTER_ACCESSORS(cptr_el3)
151 MAKE_REGISTER_ACCESSORS(csselr_el1)
153 MAKE_REGISTER_ACCESSORS(currentel)
155 MAKE_REGISTER_ACCESSORS(dczid_el0)
161 MAKE_REGISTER_ACCESSORS(hacr_el2)
163 MAKE_REGISTER_ACCESSORS(hpfar_el2)
164 MAKE_REGISTER_ACCESSORS(hstr_el2)
169 MAKE_REGISTER_ACCESSORS(midr_el1)
170 MAKE_REGISTER_ACCESSORS(mpidr_el1)
172 MAKE_REGISTER_ACCESSORS(oslar_el1)
173 MAKE_REGISTER_ACCESSORS(oslsr_el1)
175 MAKE_REGISTER_ACCESSORS(revdir_el1)
185 MAKE_REGISTER_ACCESSORS(spsr_abt)
186 MAKE_REGISTER_ACCESSORS(spsr_fiq)
187 MAKE_REGISTER_ACCESSORS(spsr_irq)
188 MAKE_REGISTER_ACCESSORS(spsr_und)
192 MAKE_REGISTER_ACCESSORS(ttbr1_el1)
194 MAKE_REGISTER_ACCESSORS(vmpidr_el2)
195 MAKE_REGISTER_ACCESSORS(vpidr_el2)
196 MAKE_REGISTER_ACCESSORS(vtcr_el2)
197 MAKE_REGISTER_ACCESSORS(vttbr_el2)
198 
199 /* Special DAIF accessor functions */
200 static inline void enable_debug_exceptions(void)
201 {
202  __asm__ __volatile__("msr DAIFClr, %0\n\t"
203  : : "i" (DAIF_DBG_BIT) : "memory");
204 }
205 
206 static inline void enable_serror_exceptions(void)
207 {
208  __asm__ __volatile__("msr DAIFClr, %0\n\t"
209  : : "i" (DAIF_ABT_BIT) : "memory");
210 }
211 
212 static inline void enable_irq(void)
213 {
214  __asm__ __volatile__("msr DAIFClr, %0\n\t"
215  : : "i" (DAIF_IRQ_BIT) : "memory");
216 }
217 
218 static inline void enable_fiq(void)
219 {
220  __asm__ __volatile__("msr DAIFClr, %0\n\t"
221  : : "i" (DAIF_FIQ_BIT) : "memory");
222 }
223 
224 static inline void disable_debug_exceptions(void)
225 {
226  __asm__ __volatile__("msr DAIFSet, %0\n\t"
227  : : "i" (DAIF_DBG_BIT) : "memory");
228 }
229 
230 static inline void disable_serror_exceptions(void)
231 {
232  __asm__ __volatile__("msr DAIFSet, %0\n\t"
233  : : "i" (DAIF_ABT_BIT) : "memory");
234 }
235 
236 static inline void disable_irq(void)
237 {
238  __asm__ __volatile__("msr DAIFSet, %0\n\t"
239  : : "i" (DAIF_IRQ_BIT) : "memory");
240 }
241 
242 static inline void disable_fiq(void)
243 {
244  __asm__ __volatile__("msr DAIFSet, %0\n\t"
245  : : "i" (DAIF_FIQ_BIT) : "memory");
246 }
247 
248 /* Cache maintenance system instructions */
249 static inline void dccisw(uint64_t cisw)
250 {
251  __asm__ __volatile__("dc cisw, %0\n\t" : : "r" (cisw) : "memory");
252 }
253 
254 static inline void dccivac(uint64_t civac)
255 {
256  __asm__ __volatile__("dc civac, %0\n\t" : : "r" (civac) : "memory");
257 }
258 
259 static inline void dccsw(uint64_t csw)
260 {
261  __asm__ __volatile__("dc csw, %0\n\t" : : "r" (csw) : "memory");
262 }
263 
264 static inline void dccvac(uint64_t cvac)
265 {
266  __asm__ __volatile__("dc cvac, %0\n\t" : : "r" (cvac) : "memory");
267 }
268 
269 static inline void dccvau(uint64_t cvau)
270 {
271  __asm__ __volatile__("dc cvau, %0\n\t" : : "r" (cvau) : "memory");
272 }
273 
274 static inline void dcisw(uint64_t isw)
275 {
276  __asm__ __volatile__("dc isw, %0\n\t" : : "r" (isw) : "memory");
277 }
278 
279 static inline void dcivac(uint64_t ivac)
280 {
281  __asm__ __volatile__("dc ivac, %0\n\t" : : "r" (ivac) : "memory");
282 }
283 
284 static inline void dczva(uint64_t zva)
285 {
286  __asm__ __volatile__("dc zva, %0\n\t" : : "r" (zva) : "memory");
287 }
288 
289 static inline void iciallu(void)
290 {
291  __asm__ __volatile__("ic iallu\n\t" : : : "memory");
292 }
293 
294 static inline void icialluis(void)
295 {
296  __asm__ __volatile__("ic ialluis\n\t" : : : "memory");
297 }
298 
299 static inline void icivau(uint64_t ivau)
300 {
301  __asm__ __volatile__("ic ivau, %0\n\t" : : "r" (ivau) : "memory");
302 }
303 
304 /* TLB maintenance instructions */
305 static inline void tlbiall_el1(void)
306 {
307  __asm__ __volatile__("tlbi alle1\n\t" : : : "memory");
308 }
309 
310 static inline void tlbiall_el2(void)
311 {
312  __asm__ __volatile__("tlbi alle2\n\t" : : : "memory");
313 }
314 
315 static inline void tlbiall_el3(void)
316 {
317  __asm__ __volatile__("tlbi alle3\n\t" : : : "memory");
318 }
319 
320 static inline void tlbiallis_el1(void)
321 {
322  __asm__ __volatile__("tlbi alle1is\n\t" : : : "memory");
323 }
324 
325 static inline void tlbiallis_el2(void)
326 {
327  __asm__ __volatile__("tlbi alle2is\n\t" : : : "memory");
328 }
329 
330 static inline void tlbiallis_el3(void)
331 {
332  __asm__ __volatile__("tlbi alle3is\n\t" : : : "memory");
333 }
334 
335 static inline void tlbivaa_el1(uint64_t va)
336 {
337  __asm__ __volatile__("tlbi vaae1, %0\n\t" : : "r" (va) : "memory");
338 }
339 
340 #endif /* __ASSEMBLER__ */
341 
342 #endif /* __ARCH_LIB_HELPERS_H__ */
static void icialluis(void)
Definition: lib_helpers.h:294
static void tlbiallis_el3(void)
Definition: lib_helpers.h:330
static void tlbiallis_el2(void)
Definition: lib_helpers.h:325
static void tlbiallis_el1(void)
Definition: lib_helpers.h:320
static void tlbiall_el1(void)
Definition: lib_helpers.h:305
#define DAIF_DBG_BIT
Definition: lib_helpers.h:93
static void disable_fiq(void)
Definition: lib_helpers.h:242
static void dccivac(uint64_t civac)
Definition: lib_helpers.h:254
static void dccisw(uint64_t cisw)
Definition: lib_helpers.h:249
static void icivau(uint64_t ivau)
Definition: lib_helpers.h:299
#define DAIF_FIQ_BIT
Definition: lib_helpers.h:96
static void dccvac(uint64_t cvac)
Definition: lib_helpers.h:264
static void dczva(uint64_t zva)
Definition: lib_helpers.h:284
#define DAIF_ABT_BIT
Definition: lib_helpers.h:94
static void dccvau(uint64_t cvau)
Definition: lib_helpers.h:269
static void dcivac(uint64_t ivac)
Definition: lib_helpers.h:279
static void tlbivaa_el1(uint64_t va)
Definition: lib_helpers.h:335
static void tlbiall_el3(void)
Definition: lib_helpers.h:315
static void enable_irq(void)
Definition: lib_helpers.h:212
static void disable_debug_exceptions(void)
Definition: lib_helpers.h:224
static void enable_serror_exceptions(void)
Definition: lib_helpers.h:206
static void tlbiall_el2(void)
Definition: lib_helpers.h:310
static void enable_fiq(void)
Definition: lib_helpers.h:218
static void disable_serror_exceptions(void)
Definition: lib_helpers.h:230
static void iciallu(void)
Definition: lib_helpers.h:289
#define DAIF_IRQ_BIT
Definition: lib_helpers.h:95
static void disable_irq(void)
Definition: lib_helpers.h:236
#define MAKE_REGISTER_ACCESSORS_EL123(reg)
Definition: lib_helpers.h:116
static void enable_debug_exceptions(void)
Definition: lib_helpers.h:200
static void dccsw(uint64_t csw)
Definition: lib_helpers.h:259
static void dcisw(uint64_t isw)
Definition: lib_helpers.h:274
#define MAKE_REGISTER_ACCESSORS(reg)
Definition: lib_helpers.h:102
unsigned long long uint64_t
Definition: stdint.h:17