7 #ifndef __ARCH_LIB_HELPERS_H__
8 #define __ARCH_LIB_HELPERS_H__
15 #define CURRENT_EL_MASK 0x3
16 #define CURRENT_EL_SHIFT 2
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)
30 #define SCR_NS (1 << 0)
31 #define SCR_IRQ (1 << 1)
32 #define SCR_FIQ (1 << 2)
33 #define SCR_EA (1 << 3)
34 #define SCR_SMD (1 << 7)
35 #define SCR_HCE (1 << 8)
36 #define SCR_SIF (1 << 9)
37 #define SCR_RW (1 << 10)
38 #define SCR_ST (1 << 11)
39 #define SCR_TWI (1 << 12)
40 #define SCR_TWE (1 << 13)
41 #define SCR_TLOR (1 << 14)
42 #define SCR_TERR (1 << 15)
43 #define SCR_APK (1 << 16)
44 #define SCR_API (1 << 17)
45 #define SCR_EEL2 (1 << 18)
46 #define SCR_EASE (1 << 19)
47 #define SCR_NMEA (1 << 20)
48 #define SCR_FIEN (1 << 21)
49 #define SCR_RES1 (3 << 4)
51 #define HCR_RW_SHIFT 31
52 #define HCR_LOWER_AARCH64 (1 << HCR_RW_SHIFT)
53 #define HCR_LOWER_AARCH32 (0 << HCR_RW_SHIFT)
55 #define SCTLR_M (1 << 0)
56 #define SCTLR_A (1 << 1)
57 #define SCTLR_C (1 << 2)
58 #define SCTLR_SA (1 << 3)
59 #define SCTLR_NAA (1 << 6)
60 #define SCTLR_I (1 << 12)
61 #define SCTLR_ENDB (1 << 13)
62 #define SCTLR_WXN (1 << 19)
63 #define SCTLR_IESB (1 << 21)
64 #define SCTLR_EE (1 << 25)
65 #define SCTLR_ENDA (1 << 27)
66 #define SCTLR_ENIB (1 << 30)
67 #define SCTLR_ENIA (1 << 31)
68 #define SCTLR_RES1 ((0x3 << 4) | (0x1 << 11) | (0x1 << 16) | \
69 (0x1 << 18) | (0x3 << 22) | (0x3 << 28))
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)
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)
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)
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)
102 #define MAKE_REGISTER_ACCESSORS(reg) \
103 static inline uint64_t raw_read_##reg(void) \
106 __asm__ __volatile__("mrs %0, " #reg "\n\t" \
107 : "=r" (value) : : "memory"); \
110 static inline void raw_write_##reg(uint64_t value) \
112 __asm__ __volatile__("msr " #reg ", %0\n\t" \
113 : : "r" (value) : "memory"); \
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)
202 __asm__ __volatile__(
"msr DAIFClr, %0\n\t"
208 __asm__ __volatile__(
"msr DAIFClr, %0\n\t"
214 __asm__ __volatile__(
"msr DAIFClr, %0\n\t"
220 __asm__ __volatile__(
"msr DAIFClr, %0\n\t"
226 __asm__ __volatile__(
"msr DAIFSet, %0\n\t"
232 __asm__ __volatile__(
"msr DAIFSet, %0\n\t"
238 __asm__ __volatile__(
"msr DAIFSet, %0\n\t"
244 __asm__ __volatile__(
"msr DAIFSet, %0\n\t"
251 __asm__ __volatile__(
"dc cisw, %0\n\t" : :
"r" (cisw) :
"memory");
256 __asm__ __volatile__(
"dc civac, %0\n\t" : :
"r" (civac) :
"memory");
261 __asm__ __volatile__(
"dc csw, %0\n\t" : :
"r" (csw) :
"memory");
266 __asm__ __volatile__(
"dc cvac, %0\n\t" : :
"r" (cvac) :
"memory");
271 __asm__ __volatile__(
"dc cvau, %0\n\t" : :
"r" (cvau) :
"memory");
276 __asm__ __volatile__(
"dc isw, %0\n\t" : :
"r" (isw) :
"memory");
281 __asm__ __volatile__(
"dc ivac, %0\n\t" : :
"r" (ivac) :
"memory");
286 __asm__ __volatile__(
"dc zva, %0\n\t" : :
"r" (zva) :
"memory");
291 __asm__ __volatile__(
"ic iallu\n\t" : : :
"memory");
296 __asm__ __volatile__(
"ic ialluis\n\t" : : :
"memory");
301 __asm__ __volatile__(
"ic ivau, %0\n\t" : :
"r" (ivau) :
"memory");
307 __asm__ __volatile__(
"tlbi alle1\n\t" : : :
"memory");
312 __asm__ __volatile__(
"tlbi alle2\n\t" : : :
"memory");
317 __asm__ __volatile__(
"tlbi alle3\n\t" : : :
"memory");
322 __asm__ __volatile__(
"tlbi alle1is\n\t" : : :
"memory");
327 __asm__ __volatile__(
"tlbi alle2is\n\t" : : :
"memory");
332 __asm__ __volatile__(
"tlbi alle3is\n\t" : : :
"memory");
337 __asm__ __volatile__(
"tlbi vaae1, %0\n\t" : :
"r" (va) :
"memory");
static void icialluis(void)
static void tlbiallis_el3(void)
static void tlbiallis_el2(void)
static void tlbiallis_el1(void)
static void tlbiall_el1(void)
static void disable_fiq(void)
static void dccivac(uint64_t civac)
static void dccisw(uint64_t cisw)
static void icivau(uint64_t ivau)
static void dccvac(uint64_t cvac)
static void dczva(uint64_t zva)
static void dccvau(uint64_t cvau)
static void dcivac(uint64_t ivac)
static void tlbivaa_el1(uint64_t va)
static void tlbiall_el3(void)
static void enable_irq(void)
static void disable_debug_exceptions(void)
static void enable_serror_exceptions(void)
static void tlbiall_el2(void)
static void enable_fiq(void)
static void disable_serror_exceptions(void)
static void iciallu(void)
static void disable_irq(void)
#define MAKE_REGISTER_ACCESSORS_EL123(reg)
static void enable_debug_exceptions(void)
static void dccsw(uint64_t csw)
static void dcisw(uint64_t isw)
#define MAKE_REGISTER_ACCESSORS(reg)
unsigned long long uint64_t