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