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)
91MAKE_REG_HELPER_EL123(actlr)
92MAKE_REG_HELPER_EL123(cpacr)
93MAKE_REG_HELPER_EL123(cptr)
94MAKE_REG_HELPER_EL123(elr)
95MAKE_REG_HELPER_EL123(esr)
96MAKE_REG_HELPER_EL123(far)
97MAKE_REG_HELPER_EL123(mair)
98MAKE_REG_HELPER_EL123(sctlr)
99MAKE_REG_HELPER_EL123(spsr)
100MAKE_REG_HELPER_EL123(tcr)
101MAKE_REG_HELPER_EL123(ttbr0)
102MAKE_REG_HELPER_EL123(vbar)
103MAKE_REG_HELPER_EL123(zcr)
105#if defined(CONFIG_ARM_MPU)
107#define mpuir_el1 S3_0_c0_c0_4
108#define prselr_el1 S3_0_c6_c2_1
109#define prbar_el1 S3_0_c6_c8_0
110#define prlar_el1 S3_0_c6_c8_1
120 __asm__
volatile (
"msr DAIFClr, %0"
121 ::
"i" (DAIFCLR_DBG_BIT) :
"memory");
126 __asm__
volatile (
"msr DAIFSet, %0"
127 ::
"i" (DAIFSET_DBG_BIT) :
"memory");
132 __asm__
volatile (
"msr DAIFClr, %0"
133 ::
"i" (DAIFCLR_ABT_BIT) :
"memory");
138 __asm__
volatile (
"msr DAIFSet, %0"
139 ::
"i" (DAIFSET_ABT_BIT) :
"memory");
144 __asm__
volatile (
"msr DAIFClr, %0"
145 ::
"i" (DAIFCLR_IRQ_BIT) :
"memory");
150 __asm__
volatile (
"msr DAIFSet, %0"
151 ::
"i" (DAIFSET_IRQ_BIT) :
"memory");
156 __asm__
volatile (
"msr DAIFClr, %0"
157 ::
"i" (DAIFCLR_FIQ_BIT) :
"memory");
162 __asm__
volatile (
"msr DAIFSet, %0"
163 ::
"i" (DAIFSET_FIQ_BIT) :
"memory");
166#define sev() __asm__ volatile("sev" : : : "memory")
167#define wfe() __asm__ volatile("wfe" : : : "memory")
168#define wfi() __asm__ volatile("wfi" : : : "memory")
169#define wfet(v) __asm__ volatile("msr S0_3_C1_C0_0, %0" :: "r"(v) : "memory")
170#define wfit(v) __asm__ volatile("msr S0_3_C1_C0_1, %0" :: "r"(v) : "memory")
172static inline bool is_wfxt_implemented(
void)
174 return ((read_id_aa64isar2_el1() >> ID_AA64ISAR2_WFXT_SHIFT)
175 & ID_AA64ISAR2_WFXT_MASK) != 0;
178static inline bool is_el_implemented(
unsigned int el)
186 shift = ID_AA64PFR0_EL1_SHIFT * el;
188 return (((read_id_aa64pfr0_el1() >> shift) & ID_AA64PFR0_ELX_MASK) != 0U);
191static inline bool is_el_highest_implemented(
void)
196 el_highest = read_id_aa64pfr0_el1() & 0xFFFF;
197 el_highest = (31U - __builtin_clz(el_highest)) / 4;
199 curr_el = GET_EL(read_currentel());
201 if (curr_el < el_highest) {
208static inline bool is_el2_sec_supported(
void)
210 return (((read_id_aa64pfr0_el1() >> ID_AA64PFR0_SEL2_SHIFT) &
211 ID_AA64PFR0_SEL2_MASK) != 0U);
214static inline bool is_in_secure_state(
void)
220static inline bool is_sve_implemented(
void)
222 return (((read_id_aa64pfr0_el1() >> ID_AA64PFR0_SVE_SHIFT) & ID_AA64PFR0_SVE_MASK) != 0U);
225#if defined(CONFIG_ARM64_PMUV3)
#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:154
__UINT32_TYPE__ uint32_t
Definition stdint.h:90