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 | #ifndef LINKER_SCRIPT |
79 | #define ALIGN __ALIGN |
80 | #define ALIGN_STR __ALIGN_STR |
81 | |
82 | #ifndef GLOBAL |
83 | #define GLOBAL(name) \ |
84 | .globl name ASM_NL \ |
85 | name: |
86 | #endif |
87 | |
88 | #ifndef ENTRY |
89 | #define ENTRY(name) \ |
90 | .globl name ASM_NL \ |
91 | ALIGN ASM_NL \ |
92 | name: |
93 | #endif |
94 | #endif /* LINKER_SCRIPT */ |
95 | |
96 | #ifndef WEAK |
97 | #define WEAK(name) \ |
98 | .weak name ASM_NL \ |
99 | ALIGN ASM_NL \ |
100 | name: |
101 | #endif |
102 | |
103 | #ifndef END |
104 | #define END(name) \ |
105 | .size name, .-name |
106 | #endif |
107 | |
108 | /* If symbol 'name' is treated as a subroutine (gets called, and returns) |
109 | * then please use ENDPROC to mark 'name' as STT_FUNC for the benefit of |
110 | * static analysis tools such as stack depth analyzer. |
111 | */ |
112 | #ifndef ENDPROC |
113 | #define ENDPROC(name) \ |
114 | .type name, @function ASM_NL \ |
115 | END(name) |
116 | #endif |
117 | |
118 | #endif |
119 | |
120 | #endif |
121 | |