7#ifndef ZEPHYR_INCLUDE_ARCH_ARM64_LIB_HELPERS_H_
8#define ZEPHYR_INCLUDE_ARCH_ARM64_LIB_HELPERS_H_
19#define read_sysreg(reg) \
22 __asm__ volatile ("mrs %0, " STRINGIFY(reg) \
23 : "=r" (reg_val) :: "memory"); \
27#define write_sysreg(val, reg) \
29 uint64_t reg_val = val; \
30 __asm__ volatile ("msr " STRINGIFY(reg) ", %0" \
31 :: "r" (reg_val) : "memory"); \
34#define zero_sysreg(reg) \
36 __asm__ volatile ("msr " STRINGIFY(reg) ", xzr" \
40#define MAKE_REG_HELPER(reg) \
41 static ALWAYS_INLINE uint64_t read_##reg(void) \
43 return read_sysreg(reg); \
45 static ALWAYS_INLINE void write_##reg(uint64_t val) \
47 write_sysreg(val, reg); \
49 static ALWAYS_INLINE void zero_##reg(void) \
54#define MAKE_REG_HELPER_EL123(reg) \
55 MAKE_REG_HELPER(reg##_el1) \
56 MAKE_REG_HELPER(reg##_el2) \
57 MAKE_REG_HELPER(reg##_el3)
83#if !defined(CONFIG_ARMV8_R)
90MAKE_REG_HELPER_EL123(actlr)
91MAKE_REG_HELPER_EL123(cpacr)
92MAKE_REG_HELPER_EL123(cptr)
93MAKE_REG_HELPER_EL123(elr)
94MAKE_REG_HELPER_EL123(esr)
95MAKE_REG_HELPER_EL123(far)
96MAKE_REG_HELPER_EL123(mair)
97MAKE_REG_HELPER_EL123(sctlr)
98MAKE_REG_HELPER_EL123(spsr)
99MAKE_REG_HELPER_EL123(tcr)
100MAKE_REG_HELPER_EL123(ttbr0)
101MAKE_REG_HELPER_EL123(vbar)
102MAKE_REG_HELPER_EL123(zcr)
104#if defined(CONFIG_ARM_MPU)
106#define mpuir_el1 S3_0_c0_c0_4
107#define prselr_el1 S3_0_c6_c2_1
108#define prbar_el1 S3_0_c6_c8_0
109#define prlar_el1 S3_0_c6_c8_1
119 __asm__
volatile (
"msr DAIFClr, %0"
120 ::
"i" (DAIFCLR_DBG_BIT) :
"memory");
125 __asm__
volatile (
"msr DAIFSet, %0"
126 ::
"i" (DAIFSET_DBG_BIT) :
"memory");
131 __asm__
volatile (
"msr DAIFClr, %0"
132 ::
"i" (DAIFCLR_ABT_BIT) :
"memory");
137 __asm__
volatile (
"msr DAIFSet, %0"
138 ::
"i" (DAIFSET_ABT_BIT) :
"memory");
143 __asm__
volatile (
"msr DAIFClr, %0"
144 ::
"i" (DAIFCLR_IRQ_BIT) :
"memory");
149 __asm__
volatile (
"msr DAIFSet, %0"
150 ::
"i" (DAIFSET_IRQ_BIT) :
"memory");
155 __asm__
volatile (
"msr DAIFClr, %0"
156 ::
"i" (DAIFCLR_FIQ_BIT) :
"memory");
161 __asm__
volatile (
"msr DAIFSet, %0"
162 ::
"i" (DAIFSET_FIQ_BIT) :
"memory");
165#define sev() __asm__ volatile("sev" : : : "memory")
166#define wfe() __asm__ volatile("wfe" : : : "memory")
167#define wfi() __asm__ volatile("wfi" : : : "memory")
169static inline bool is_el_implemented(
unsigned int el)
177 shift = ID_AA64PFR0_EL1_SHIFT * el;
179 return (((read_id_aa64pfr0_el1() >> shift) & ID_AA64PFR0_ELX_MASK) != 0U);
182static inline bool is_el_highest_implemented(
void)
187 el_highest = read_id_aa64pfr0_el1() & 0xFFFF;
188 el_highest = (31U - __builtin_clz(el_highest)) / 4;
190 curr_el = GET_EL(read_currentel());
192 if (curr_el < el_highest) {
199static inline bool is_el2_sec_supported(
void)
201 return (((read_id_aa64pfr0_el1() >> ID_AA64PFR0_SEL2_SHIFT) &
202 ID_AA64PFR0_SEL2_MASK) != 0U);
205static inline bool is_in_secure_state(
void)
211static inline bool is_sve_implemented(
void)
213 return (((read_id_aa64pfr0_el1() >> ID_AA64PFR0_SVE_SHIFT) & ID_AA64PFR0_SVE_MASK) != 0U);
#define MAKE_REG_HELPER(reg, op1, CRn, CRm, op2)
Definition lib_helpers.h:45
#define IS_ENABLED(config_macro)
Check for macro definition in compiler-visible expressions.
Definition util_macro.h:148
__UINT32_TYPE__ uint32_t
Definition stdint.h:90