xref: /optee_os/lib/libutee/include/arm64_user_sysreg.h (revision e9c008240fe674e78186c0362a89eb306b571154)
14486d586SSumit Garg /* SPDX-License-Identifier: BSD-2-Clause */
24486d586SSumit Garg /*
34486d586SSumit Garg  * Copyright (c) 2019, Linaro Limited
44486d586SSumit Garg  */
54486d586SSumit Garg #ifndef ARM64_USER_SYSREG_H
64486d586SSumit Garg #define ARM64_USER_SYSREG_H
74486d586SSumit Garg 
84486d586SSumit Garg #include <compiler.h>
94486d586SSumit Garg #include <stdint.h>
104486d586SSumit Garg 
114486d586SSumit Garg /*
124486d586SSumit Garg  * Templates for register read/write functions based on mrs/msr
134486d586SSumit Garg  */
144486d586SSumit Garg 
154486d586SSumit Garg #define DEFINE_REG_READ_FUNC_(reg, type, asmreg)		\
164486d586SSumit Garg static inline __noprof type read_##reg(void)			\
174486d586SSumit Garg {								\
1870ed8fd5SJerome Forissier 	uint64_t val64 = 0;					\
194486d586SSumit Garg 								\
2070ed8fd5SJerome Forissier 	asm volatile("mrs %0, " #asmreg : "=r" (val64));	\
2170ed8fd5SJerome Forissier 	return val64;						\
224486d586SSumit Garg }
234486d586SSumit Garg 
244486d586SSumit Garg #define DEFINE_REG_WRITE_FUNC_(reg, type, asmreg)		\
254486d586SSumit Garg static inline __noprof void write_##reg(type val)		\
264486d586SSumit Garg {								\
2770ed8fd5SJerome Forissier 	uint64_t val64 = val;					\
2870ed8fd5SJerome Forissier 								\
2970ed8fd5SJerome Forissier 	asm volatile("msr " #asmreg ", %0" : : "r" (val64));	\
304486d586SSumit Garg }
314486d586SSumit Garg 
324486d586SSumit Garg /* ARM Generic timer functions */
334486d586SSumit Garg DEFINE_REG_READ_FUNC_(cntfrq, uint32_t, cntfrq_el0)
344486d586SSumit Garg DEFINE_REG_READ_FUNC_(cntpct, uint64_t, cntpct_el0)
35*e9c00824SJerome Forissier DEFINE_REG_READ_FUNC_(tpidr_el0, uint64_t, tpidr_el0)
36*e9c00824SJerome Forissier DEFINE_REG_WRITE_FUNC_(tpidr_el0, uint64_t, tpidr_el0)
374486d586SSumit Garg 
384486d586SSumit Garg #endif /*ARM64_USER_SYSREG_H*/
39