xref: /optee_os/lib/libutee/include/arm64_user_sysreg.h (revision 4486d5866e231c6bdb1993d08be67e6c029910c8)
1*4486d586SSumit Garg /* SPDX-License-Identifier: BSD-2-Clause */
2*4486d586SSumit Garg /*
3*4486d586SSumit Garg  * Copyright (c) 2019, Linaro Limited
4*4486d586SSumit Garg  */
5*4486d586SSumit Garg #ifndef ARM64_USER_SYSREG_H
6*4486d586SSumit Garg #define ARM64_USER_SYSREG_H
7*4486d586SSumit Garg 
8*4486d586SSumit Garg #include <compiler.h>
9*4486d586SSumit Garg #include <stdint.h>
10*4486d586SSumit Garg 
11*4486d586SSumit Garg /*
12*4486d586SSumit Garg  * Templates for register read/write functions based on mrs/msr
13*4486d586SSumit Garg  */
14*4486d586SSumit Garg 
15*4486d586SSumit Garg #define DEFINE_REG_READ_FUNC_(reg, type, asmreg)	\
16*4486d586SSumit Garg static inline __noprof type read_##reg(void)		\
17*4486d586SSumit Garg {							\
18*4486d586SSumit Garg 	type val;					\
19*4486d586SSumit Garg 							\
20*4486d586SSumit Garg 	asm volatile("mrs %0, " #asmreg : "=r" (val));	\
21*4486d586SSumit Garg 	return val;					\
22*4486d586SSumit Garg }
23*4486d586SSumit Garg 
24*4486d586SSumit Garg #define DEFINE_REG_WRITE_FUNC_(reg, type, asmreg)		\
25*4486d586SSumit Garg static inline __noprof void write_##reg(type val)		\
26*4486d586SSumit Garg {								\
27*4486d586SSumit Garg 	asm volatile("msr " #asmreg ", %0" : : "r" (val));	\
28*4486d586SSumit Garg }
29*4486d586SSumit Garg 
30*4486d586SSumit Garg /* ARM Generic timer functions */
31*4486d586SSumit Garg DEFINE_REG_READ_FUNC_(cntfrq, uint32_t, cntfrq_el0)
32*4486d586SSumit Garg DEFINE_REG_READ_FUNC_(cntpct, uint64_t, cntpct_el0)
33*4486d586SSumit Garg 
34*4486d586SSumit Garg #endif /*ARM64_USER_SYSREG_H*/
35