1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _LINUX_LINKAGE_H 3 #define _LINUX_LINKAGE_H 4 5 #include <linux/compiler_types.h> 6 #include <linux/stringify.h> 7 #include <linux/export.h> 8 #include <asm/linkage.h> 9 10 /* Some toolchains use other characters (e.g. '`') to mark new line in macro */ 11 #ifndef ASM_NL 12 #define ASM_NL ; 13 #endif 14 15 #ifdef __cplusplus 16 #define CPP_ASMLINKAGE extern "C" 17 #else 18 #define CPP_ASMLINKAGE 19 #endif 20 21 #ifndef asmlinkage 22 #define asmlinkage CPP_ASMLINKAGE 23 #endif 24 25 #ifndef cond_syscall 26 #define cond_syscall(x) asm( \ 27 ".weak " __stringify(x) "\n\t" \ 28 ".set " __stringify(x) "," \ 29 __stringify(sys_ni_syscall)) 30 #endif 31 32 #ifndef SYSCALL_ALIAS 33 #define SYSCALL_ALIAS(alias, name) asm( \ 34 ".globl " __stringify(alias) "\n\t" \ 35 ".set " __stringify(alias) "," \ 36 __stringify(name)) 37 #endif 38 39 #define __page_aligned_data __section(.data..page_aligned) __aligned(PAGE_SIZE) 40 #define __page_aligned_bss __section(.bss..page_aligned) __aligned(PAGE_SIZE) 41 42 /* 43 * For assembly routines. 44 * 45 * Note when using these that you must specify the appropriate 46 * alignment directives yourself 47 */ 48 #define __PAGE_ALIGNED_DATA .section ".data..page_aligned", "aw" 49 #define __PAGE_ALIGNED_BSS .section ".bss..page_aligned", "aw" 50 51 /* 52 * This is used by architectures to keep arguments on the stack 53 * untouched by the compiler by keeping them live until the end. 54 * The argument stack may be owned by the assembly-language 55 * caller, not the callee, and gcc doesn't always understand 56 * that. 57 * 58 * We have the return value, and a maximum of six arguments. 59 * 60 * This should always be followed by a "return ret" for the 61 * protection to work (ie no more work that the compiler might 62 * end up needing stack temporaries for). 63 */ 64 /* Assembly files may be compiled with -traditional .. */ 65 #ifndef __ASSEMBLY__ 66 #ifndef asmlinkage_protect 67 # define asmlinkage_protect(n, ret, args...) do { } while (0) 68 #endif 69 #endif 70 71 #ifndef __ALIGN 72 #define __ALIGN .align 4,0x90 73 #define __ALIGN_STR ".align 4,0x90" 74 #endif 75 76 #ifdef __ASSEMBLY__ 77 78 /* SYM_T_FUNC -- type used by assembler to mark functions */ 79 #ifndef SYM_T_FUNC 80 #define SYM_T_FUNC STT_FUNC 81 #endif 82 83 /* SYM_T_OBJECT -- type used by assembler to mark data */ 84 #ifndef SYM_T_OBJECT 85 #define SYM_T_OBJECT STT_OBJECT 86 #endif 87 88 /* SYM_T_NONE -- type used by assembler to mark entries of unknown type */ 89 #ifndef SYM_T_NONE 90 #define SYM_T_NONE STT_NOTYPE 91 #endif 92 93 /* SYM_A_* -- align the symbol? */ 94 #define SYM_A_ALIGN ALIGN 95 #define SYM_A_NONE /* nothing */ 96 97 /* SYM_L_* -- linkage of symbols */ 98 #define SYM_L_GLOBAL(name) .globl name 99 #define SYM_L_WEAK(name) .weak name 100 #define SYM_L_LOCAL(name) /* nothing */ 101 102 #ifndef LINKER_SCRIPT 103 #define ALIGN __ALIGN 104 #define ALIGN_STR __ALIGN_STR 105 106 /* === DEPRECATED annotations === */ 107 108 #ifndef CONFIG_X86 109 #ifndef GLOBAL 110 /* deprecated, use SYM_DATA*, SYM_ENTRY, or similar */ 111 #define GLOBAL(name) \ 112 .globl name ASM_NL \ 113 name: 114 #endif 115 #endif 116 117 #ifndef ENTRY 118 /* deprecated, use SYM_FUNC_START */ 119 #define ENTRY(name) \ 120 SYM_FUNC_START(name) 121 #endif 122 #endif /* LINKER_SCRIPT */ 123 124 #ifndef WEAK 125 /* deprecated, use SYM_FUNC_START_WEAK* */ 126 #define WEAK(name) \ 127 SYM_FUNC_START_WEAK(name) 128 #endif 129 130 #ifndef END 131 /* deprecated, use SYM_FUNC_END, SYM_DATA_END, or SYM_END */ 132 #define END(name) \ 133 .size name, .-name 134 #endif 135 136 /* If symbol 'name' is treated as a subroutine (gets called, and returns) 137 * then please use ENDPROC to mark 'name' as STT_FUNC for the benefit of 138 * static analysis tools such as stack depth analyzer. 139 */ 140 #ifndef ENDPROC 141 /* deprecated, use SYM_FUNC_END */ 142 #define ENDPROC(name) \ 143 SYM_FUNC_END(name) 144 #endif 145 146 /* === generic annotations === */ 147 148 /* SYM_ENTRY -- use only if you have to for non-paired symbols */ 149 #ifndef SYM_ENTRY 150 #define SYM_ENTRY(name, linkage, align...) \ 151 linkage(name) ASM_NL \ 152 align ASM_NL \ 153 name: 154 #endif 155 156 /* SYM_START -- use only if you have to */ 157 #ifndef SYM_START 158 #define SYM_START(name, linkage, align...) \ 159 SYM_ENTRY(name, linkage, align) 160 #endif 161 162 /* SYM_END -- use only if you have to */ 163 #ifndef SYM_END 164 #define SYM_END(name, sym_type) \ 165 .type name sym_type ASM_NL \ 166 .size name, .-name 167 #endif 168 169 /* === code annotations === */ 170 171 /* 172 * FUNC -- C-like functions (proper stack frame etc.) 173 * CODE -- non-C code (e.g. irq handlers with different, special stack etc.) 174 * 175 * Objtool validates stack for FUNC, but not for CODE. 176 * Objtool generates debug info for both FUNC & CODE, but needs special 177 * annotations for each CODE's start (to describe the actual stack frame). 178 * 179 * ALIAS -- does not generate debug info -- the aliased function will 180 */ 181 182 /* SYM_INNER_LABEL_ALIGN -- only for labels in the middle of code */ 183 #ifndef SYM_INNER_LABEL_ALIGN 184 #define SYM_INNER_LABEL_ALIGN(name, linkage) \ 185 .type name SYM_T_NONE ASM_NL \ 186 SYM_ENTRY(name, linkage, SYM_A_ALIGN) 187 #endif 188 189 /* SYM_INNER_LABEL -- only for labels in the middle of code */ 190 #ifndef SYM_INNER_LABEL 191 #define SYM_INNER_LABEL(name, linkage) \ 192 .type name SYM_T_NONE ASM_NL \ 193 SYM_ENTRY(name, linkage, SYM_A_NONE) 194 #endif 195 196 /* 197 * SYM_FUNC_START_LOCAL_ALIAS -- use where there are two local names for one 198 * function 199 */ 200 #ifndef SYM_FUNC_START_LOCAL_ALIAS 201 #define SYM_FUNC_START_LOCAL_ALIAS(name) \ 202 SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN) 203 #endif 204 205 /* 206 * SYM_FUNC_START_ALIAS -- use where there are two global names for one 207 * function 208 */ 209 #ifndef SYM_FUNC_START_ALIAS 210 #define SYM_FUNC_START_ALIAS(name) \ 211 SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) 212 #endif 213 214 /* SYM_FUNC_START -- use for global functions */ 215 #ifndef SYM_FUNC_START 216 /* 217 * The same as SYM_FUNC_START_ALIAS, but we will need to distinguish these two 218 * later. 219 */ 220 #define SYM_FUNC_START(name) \ 221 SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) 222 #endif 223 224 /* SYM_FUNC_START_NOALIGN -- use for global functions, w/o alignment */ 225 #ifndef SYM_FUNC_START_NOALIGN 226 #define SYM_FUNC_START_NOALIGN(name) \ 227 SYM_START(name, SYM_L_GLOBAL, SYM_A_NONE) 228 #endif 229 230 /* SYM_FUNC_START_LOCAL -- use for local functions */ 231 #ifndef SYM_FUNC_START_LOCAL 232 /* the same as SYM_FUNC_START_LOCAL_ALIAS, see comment near SYM_FUNC_START */ 233 #define SYM_FUNC_START_LOCAL(name) \ 234 SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN) 235 #endif 236 237 /* SYM_FUNC_START_LOCAL_NOALIGN -- use for local functions, w/o alignment */ 238 #ifndef SYM_FUNC_START_LOCAL_NOALIGN 239 #define SYM_FUNC_START_LOCAL_NOALIGN(name) \ 240 SYM_START(name, SYM_L_LOCAL, SYM_A_NONE) 241 #endif 242 243 /* SYM_FUNC_START_WEAK -- use for weak functions */ 244 #ifndef SYM_FUNC_START_WEAK 245 #define SYM_FUNC_START_WEAK(name) \ 246 SYM_START(name, SYM_L_WEAK, SYM_A_ALIGN) 247 #endif 248 249 /* SYM_FUNC_START_WEAK_NOALIGN -- use for weak functions, w/o alignment */ 250 #ifndef SYM_FUNC_START_WEAK_NOALIGN 251 #define SYM_FUNC_START_WEAK_NOALIGN(name) \ 252 SYM_START(name, SYM_L_WEAK, SYM_A_NONE) 253 #endif 254 255 /* SYM_FUNC_END_ALIAS -- the end of LOCAL_ALIASed or ALIASed function */ 256 #ifndef SYM_FUNC_END_ALIAS 257 #define SYM_FUNC_END_ALIAS(name) \ 258 SYM_END(name, SYM_T_FUNC) 259 #endif 260 261 /* 262 * SYM_FUNC_END -- the end of SYM_FUNC_START_LOCAL, SYM_FUNC_START, 263 * SYM_FUNC_START_WEAK, ... 264 */ 265 #ifndef SYM_FUNC_END 266 /* the same as SYM_FUNC_END_ALIAS, see comment near SYM_FUNC_START */ 267 #define SYM_FUNC_END(name) \ 268 SYM_END(name, SYM_T_FUNC) 269 #endif 270 271 /* SYM_CODE_START -- use for non-C (special) functions */ 272 #ifndef SYM_CODE_START 273 #define SYM_CODE_START(name) \ 274 SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) 275 #endif 276 277 /* SYM_CODE_START_NOALIGN -- use for non-C (special) functions, w/o alignment */ 278 #ifndef SYM_CODE_START_NOALIGN 279 #define SYM_CODE_START_NOALIGN(name) \ 280 SYM_START(name, SYM_L_GLOBAL, SYM_A_NONE) 281 #endif 282 283 /* SYM_CODE_START_LOCAL -- use for local non-C (special) functions */ 284 #ifndef SYM_CODE_START_LOCAL 285 #define SYM_CODE_START_LOCAL(name) \ 286 SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN) 287 #endif 288 289 /* 290 * SYM_CODE_START_LOCAL_NOALIGN -- use for local non-C (special) functions, 291 * w/o alignment 292 */ 293 #ifndef SYM_CODE_START_LOCAL_NOALIGN 294 #define SYM_CODE_START_LOCAL_NOALIGN(name) \ 295 SYM_START(name, SYM_L_LOCAL, SYM_A_NONE) 296 #endif 297 298 /* SYM_CODE_END -- the end of SYM_CODE_START_LOCAL, SYM_CODE_START, ... */ 299 #ifndef SYM_CODE_END 300 #define SYM_CODE_END(name) \ 301 SYM_END(name, SYM_T_NONE) 302 #endif 303 304 /* === data annotations === */ 305 306 /* SYM_DATA_START -- global data symbol */ 307 #ifndef SYM_DATA_START 308 #define SYM_DATA_START(name) \ 309 SYM_START(name, SYM_L_GLOBAL, SYM_A_NONE) 310 #endif 311 312 /* SYM_DATA_START -- local data symbol */ 313 #ifndef SYM_DATA_START_LOCAL 314 #define SYM_DATA_START_LOCAL(name) \ 315 SYM_START(name, SYM_L_LOCAL, SYM_A_NONE) 316 #endif 317 318 /* SYM_DATA_END -- the end of SYM_DATA_START symbol */ 319 #ifndef SYM_DATA_END 320 #define SYM_DATA_END(name) \ 321 SYM_END(name, SYM_T_OBJECT) 322 #endif 323 324 /* SYM_DATA_END_LABEL -- the labeled end of SYM_DATA_START symbol */ 325 #ifndef SYM_DATA_END_LABEL 326 #define SYM_DATA_END_LABEL(name, linkage, label) \ 327 linkage(label) ASM_NL \ 328 .type label SYM_T_OBJECT ASM_NL \ 329 label: \ 330 SYM_END(name, SYM_T_OBJECT) 331 #endif 332 333 /* SYM_DATA -- start+end wrapper around simple global data */ 334 #ifndef SYM_DATA 335 #define SYM_DATA(name, data...) \ 336 SYM_DATA_START(name) ASM_NL \ 337 data ASM_NL \ 338 SYM_DATA_END(name) 339 #endif 340 341 /* SYM_DATA_LOCAL -- start+end wrapper around simple local data */ 342 #ifndef SYM_DATA_LOCAL 343 #define SYM_DATA_LOCAL(name, data...) \ 344 SYM_DATA_START_LOCAL(name) ASM_NL \ 345 data ASM_NL \ 346 SYM_DATA_END(name) 347 #endif 348 349 #endif /* __ASSEMBLY__ */ 350 351 #endif /* _LINUX_LINKAGE_H */ 352