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