xref: /OK3568_Linux_fs/kernel/include/linux/linkage.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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