1 #ifndef __ASM_LINKAGE_H
2 #define __ASM_LINKAGE_H
3 
4 #define __ALIGN		.align 2
5 #define __ALIGN_STR	".align 2"
6 
7 #if defined(CONFIG_ARM64_BTI_KERNEL) && defined(__aarch64__)
8 
9 /*
10  * Since current versions of gas reject the BTI instruction unless we
11  * set the architecture version to v8.5 we use the hint instruction
12  * instead.
13  */
14 #define BTI_C hint 34 ;
15 
16 /*
17  * When using in-kernel BTI we need to ensure that PCS-conformant assembly
18  * functions have suitable annotations.  Override SYM_FUNC_START to insert
19  * a BTI landing pad at the start of everything.
20  */
21 #define SYM_FUNC_START(name)				\
22 	SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN)	\
23 	BTI_C
24 
25 #define SYM_FUNC_START_NOALIGN(name)			\
26 	SYM_START(name, SYM_L_GLOBAL, SYM_A_NONE)	\
27 	BTI_C
28 
29 #define SYM_FUNC_START_LOCAL(name)			\
30 	SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN)	\
31 	BTI_C
32 
33 #define SYM_FUNC_START_LOCAL_NOALIGN(name)		\
34 	SYM_START(name, SYM_L_LOCAL, SYM_A_NONE)	\
35 	BTI_C
36 
37 #define SYM_FUNC_START_WEAK(name)			\
38 	SYM_START(name, SYM_L_WEAK, SYM_A_ALIGN)	\
39 	BTI_C
40 
41 #define SYM_FUNC_START_WEAK_NOALIGN(name)		\
42 	SYM_START(name, SYM_L_WEAK, SYM_A_NONE)		\
43 	BTI_C
44 
45 #endif
46 
47 /*
48  * Annotate a function as position independent, i.e., safe to be called before
49  * the kernel virtual mapping is activated.
50  */
51 #define SYM_FUNC_START_PI(x)			\
52 		SYM_FUNC_START_ALIAS(__pi_##x);	\
53 		SYM_FUNC_START(x)
54 
55 #define SYM_FUNC_START_WEAK_PI(x)		\
56 		SYM_FUNC_START_ALIAS(__pi_##x);	\
57 		SYM_FUNC_START_WEAK(x)
58 
59 #define SYM_FUNC_START_WEAK_ALIAS_PI(x)		\
60 		SYM_FUNC_START_ALIAS(__pi_##x);	\
61 		SYM_START(x, SYM_L_WEAK, SYM_A_ALIGN)
62 
63 #define SYM_FUNC_END_PI(x)			\
64 		SYM_FUNC_END(x);		\
65 		SYM_FUNC_END_ALIAS(__pi_##x)
66 
67 #define SYM_FUNC_END_ALIAS_PI(x)		\
68 		SYM_FUNC_END_ALIAS(x);		\
69 		SYM_FUNC_END_ALIAS(__pi_##x)
70 
71 #endif
72