Add commentary about the new "asmlinkage_protect()" macro
[firefly-linux-kernel-4.4.55.git] / include / linux / linkage.h
1 #ifndef _LINUX_LINKAGE_H
2 #define _LINUX_LINKAGE_H
3
4 #include <asm/linkage.h>
5
6 #ifdef __cplusplus
7 #define CPP_ASMLINKAGE extern "C"
8 #else
9 #define CPP_ASMLINKAGE
10 #endif
11
12 #ifndef asmlinkage
13 #define asmlinkage CPP_ASMLINKAGE
14 #endif
15
16 #ifndef asmregparm
17 # define asmregparm
18 #endif
19
20 /*
21  * This is used by architectures to keep arguments on the stack
22  * untouched by the compiler by keeping them live until the end.
23  * The argument stack may be owned by the assembly-language
24  * caller, not the callee, and gcc doesn't always understand
25  * that.
26  *
27  * We have the return value, and a maximum of six arguments.
28  *
29  * This should always be followed by a "return ret" for the
30  * protection to work (ie no more work that the compiler might
31  * end up needing stack temporaries for).
32  */
33 #ifndef asmlinkage_protect
34 # define asmlinkage_protect(n, ret, args...)    do { } while (0)
35 #endif
36
37 #ifndef __ALIGN
38 #define __ALIGN         .align 4,0x90
39 #define __ALIGN_STR     ".align 4,0x90"
40 #endif
41
42 #ifdef __ASSEMBLY__
43
44 #define ALIGN __ALIGN
45 #define ALIGN_STR __ALIGN_STR
46
47 #ifndef ENTRY
48 #define ENTRY(name) \
49   .globl name; \
50   ALIGN; \
51   name:
52 #endif
53
54 #ifndef WEAK
55 #define WEAK(name)         \
56         .weak name;        \
57         name:
58 #endif
59
60 #define KPROBE_ENTRY(name) \
61   .pushsection .kprobes.text, "ax"; \
62   ENTRY(name)
63
64 #define KPROBE_END(name) \
65   END(name);             \
66   .popsection
67
68 #ifndef END
69 #define END(name) \
70   .size name, .-name
71 #endif
72
73 /* If symbol 'name' is treated as a subroutine (gets called, and returns)
74  * then please use ENDPROC to mark 'name' as STT_FUNC for the benefit of
75  * static analysis tools such as stack depth analyzer.
76  */
77 #ifndef ENDPROC
78 #define ENDPROC(name) \
79   .type name, @function; \
80   END(name)
81 #endif
82
83 #endif
84
85 #define NORET_TYPE    /**/
86 #define ATTRIB_NORET  __attribute__((noreturn))
87 #define NORET_AND     noreturn,
88
89 #endif