1#ifndef _LINUX_LINKAGE_H
2#define _LINUX_LINKAGE_H
3
4#include <linux/compiler.h>
5#include <linux/stringify.h>
6#include <linux/export.h>
7#include <asm/linkage.h>
8
9/* Some toolchains use other characters (e.g. '`') to mark new line in macro */
10#ifndef ASM_NL
11#define ASM_NL		 ;
12#endif
13
14#ifdef __cplusplus
15#define CPP_ASMLINKAGE extern "C"
16#else
17#define CPP_ASMLINKAGE
18#endif
19
20#ifndef asmlinkage
21#define asmlinkage CPP_ASMLINKAGE
22#endif
23
24#ifndef cond_syscall
25#define cond_syscall(x)	asm(				\
26	".weak " VMLINUX_SYMBOL_STR(x) "\n\t"		\
27	".set  " VMLINUX_SYMBOL_STR(x) ","		\
28		 VMLINUX_SYMBOL_STR(sys_ni_syscall))
29#endif
30
31#ifndef SYSCALL_ALIAS
32#define SYSCALL_ALIAS(alias, name) asm(			\
33	".globl " VMLINUX_SYMBOL_STR(alias) "\n\t"	\
34	".set   " VMLINUX_SYMBOL_STR(alias) ","		\
35		  VMLINUX_SYMBOL_STR(name))
36#endif
37
38#define __page_aligned_data	__section(.data..page_aligned) __aligned(PAGE_SIZE)
39#define __page_aligned_bss	__section(.bss..page_aligned) __aligned(PAGE_SIZE)
40
41/*
42 * For assembly routines.
43 *
44 * Note when using these that you must specify the appropriate
45 * alignment directives yourself
46 */
47#define __PAGE_ALIGNED_DATA	.section ".data..page_aligned", "aw"
48#define __PAGE_ALIGNED_BSS	.section ".bss..page_aligned", "aw"
49
50/*
51 * This is used by architectures to keep arguments on the stack
52 * untouched by the compiler by keeping them live until the end.
53 * The argument stack may be owned by the assembly-language
54 * caller, not the callee, and gcc doesn't always understand
55 * that.
56 *
57 * We have the return value, and a maximum of six arguments.
58 *
59 * This should always be followed by a "return ret" for the
60 * protection to work (ie no more work that the compiler might
61 * end up needing stack temporaries for).
62 */
63/* Assembly files may be compiled with -traditional .. */
64#ifndef __ASSEMBLY__
65#ifndef asmlinkage_protect
66# define asmlinkage_protect(n, ret, args...)	do { } while (0)
67#endif
68#endif
69
70#ifndef __ALIGN
71#define __ALIGN		.align 4,0x90
72#define __ALIGN_STR	".align 4,0x90"
73#endif
74
75#ifdef __ASSEMBLY__
76
77#ifndef LINKER_SCRIPT
78#define ALIGN __ALIGN
79#define ALIGN_STR __ALIGN_STR
80
81#ifndef ENTRY
82#define ENTRY(name) \
83	.globl name ASM_NL \
84	ALIGN ASM_NL \
85	name:
86#endif
87#endif /* LINKER_SCRIPT */
88
89#ifndef WEAK
90#define WEAK(name)	   \
91	.weak name ASM_NL   \
92	name:
93#endif
94
95#ifndef END
96#define END(name) \
97	.size name, .-name
98#endif
99
100/* If symbol 'name' is treated as a subroutine (gets called, and returns)
101 * then please use ENDPROC to mark 'name' as STT_FUNC for the benefit of
102 * static analysis tools such as stack depth analyzer.
103 */
104#ifndef ENDPROC
105#define ENDPROC(name) \
106	.type name, @function ASM_NL \
107	END(name)
108#endif
109
110#endif
111
112#endif
113