xref: /linux/include/linux/annotate.h (revision 08b8ddac1f4339fbf950df45590a032578ec35f7)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _LINUX_ANNOTATE_H
3 #define _LINUX_ANNOTATE_H
4 
5 #include <linux/objtool_types.h>
6 
7 #ifdef CONFIG_OBJTOOL
8 
9 #define __ASM_ANNOTATE(section, label, type)				\
10 	.pushsection section, "M", @progbits, 8;			\
11 	.long label - ., type;						\
12 	.popsection
13 
14 #ifndef __ASSEMBLY__
15 
16 #define ASM_ANNOTATE_LABEL(label, type)					\
17 	__stringify(__ASM_ANNOTATE(.discard.annotate_insn, label, type))
18 
19 #define ASM_ANNOTATE(type)						\
20 	"911: "								\
21 	__stringify(__ASM_ANNOTATE(.discard.annotate_insn, 911b, type))
22 
23 #define ASM_ANNOTATE_DATA(type)						\
24 	"912: "								\
25 	__stringify(__ASM_ANNOTATE(.discard.annotate_data, 912b, type))
26 
27 #else /* __ASSEMBLY__ */
28 
29 .macro ANNOTATE type
30 .Lhere_\@:
31 	__ASM_ANNOTATE(.discard.annotate_insn, .Lhere_\@, \type)
32 .endm
33 
34 .macro ANNOTATE_DATA type
35 .Lhere_\@:
36 	__ASM_ANNOTATE(.discard.annotate_data, .Lhere_\@, \type)
37 .endm
38 
39 #endif /* __ASSEMBLY__ */
40 
41 #else /* !CONFIG_OBJTOOL */
42 #ifndef __ASSEMBLY__
43 #define ASM_ANNOTATE_LABEL(label, type) ""
44 #define ASM_ANNOTATE(type)
45 #define ASM_ANNOTATE_DATA(type)
46 #else /* __ASSEMBLY__ */
47 .macro ANNOTATE type
48 .endm
49 .macro ANNOTATE_DATA type
50 .endm
51 #endif /* __ASSEMBLY__ */
52 #endif /* !CONFIG_OBJTOOL */
53 
54 #ifndef __ASSEMBLY__
55 
56 /*
57  * Annotate away the various 'relocation to !ENDBR` complaints; knowing that
58  * these relocations will never be used for indirect calls.
59  */
60 #define ANNOTATE_NOENDBR		ASM_ANNOTATE(ANNOTYPE_NOENDBR)
61 #define ANNOTATE_NOENDBR_SYM(sym)	asm(ASM_ANNOTATE_LABEL(sym, ANNOTYPE_NOENDBR))
62 
63 /*
64  * This should be used immediately before an indirect jump/call. It tells
65  * objtool the subsequent indirect jump/call is vouched safe for retpoline
66  * builds.
67  */
68 #define ANNOTATE_RETPOLINE_SAFE		ASM_ANNOTATE(ANNOTYPE_RETPOLINE_SAFE)
69 /*
70  * See linux/instrumentation.h
71  */
72 #define ANNOTATE_INSTR_BEGIN(label)	ASM_ANNOTATE_LABEL(label, ANNOTYPE_INSTR_BEGIN)
73 #define ANNOTATE_INSTR_END(label)	ASM_ANNOTATE_LABEL(label, ANNOTYPE_INSTR_END)
74 /*
75  * objtool annotation to ignore the alternatives and only consider the original
76  * instruction(s).
77  */
78 #define ANNOTATE_IGNORE_ALTERNATIVE	ASM_ANNOTATE(ANNOTYPE_IGNORE_ALTS)
79 /*
80  * This macro indicates that the following intra-function call is valid.
81  * Any non-annotated intra-function call will cause objtool to issue a warning.
82  */
83 #define ANNOTATE_INTRA_FUNCTION_CALL	ASM_ANNOTATE(ANNOTYPE_INTRA_FUNCTION_CALL)
84 /*
85  * Use objtool to validate the entry requirement that all code paths do
86  * VALIDATE_UNRET_END before RET.
87  *
88  * NOTE: The macro must be used at the beginning of a global symbol, otherwise
89  * it will be ignored.
90  */
91 #define ANNOTATE_UNRET_BEGIN		ASM_ANNOTATE(ANNOTYPE_UNRET_BEGIN)
92 /*
93  * This should be used to refer to an instruction that is considered
94  * terminating, like a noreturn CALL or UD2 when we know they are not -- eg
95  * WARN using UD2.
96  */
97 #define ANNOTATE_REACHABLE(label)	ASM_ANNOTATE_LABEL(label, ANNOTYPE_REACHABLE)
98 /*
99  * This should not be used; it annotates away CFI violations. There are a few
100  * valid use cases like kexec handover to the next kernel image, and there is
101  * no security concern there.
102  *
103  * There are also a few real issues annotated away, like EFI because we can't
104  * control the EFI code.
105  */
106 #define ANNOTATE_NOCFI_SYM(sym)		asm(ASM_ANNOTATE_LABEL(sym, ANNOTYPE_NOCFI))
107 
108 /*
109  * Annotate a special section entry.  This emables livepatch module generation
110  * to find and extract individual special section entries as needed.
111  */
112 #define ANNOTATE_DATA_SPECIAL		ASM_ANNOTATE_DATA(ANNOTYPE_DATA_SPECIAL)
113 
114 #else /* __ASSEMBLY__ */
115 #define ANNOTATE_NOENDBR		ANNOTATE type=ANNOTYPE_NOENDBR
116 #define ANNOTATE_RETPOLINE_SAFE		ANNOTATE type=ANNOTYPE_RETPOLINE_SAFE
117 /*	ANNOTATE_INSTR_BEGIN		ANNOTATE type=ANNOTYPE_INSTR_BEGIN */
118 /*	ANNOTATE_INSTR_END		ANNOTATE type=ANNOTYPE_INSTR_END */
119 #define ANNOTATE_IGNORE_ALTERNATIVE	ANNOTATE type=ANNOTYPE_IGNORE_ALTS
120 #define ANNOTATE_INTRA_FUNCTION_CALL	ANNOTATE type=ANNOTYPE_INTRA_FUNCTION_CALL
121 #define ANNOTATE_UNRET_BEGIN		ANNOTATE type=ANNOTYPE_UNRET_BEGIN
122 #define ANNOTATE_REACHABLE		ANNOTATE type=ANNOTYPE_REACHABLE
123 #define ANNOTATE_NOCFI_SYM		ANNOTATE type=ANNOTYPE_NOCFI
124 #define ANNOTATE_DATA_SPECIAL		ANNOTATE_DATA type=ANNOTYPE_DATA_SPECIAL
125 #endif /* __ASSEMBLY__ */
126 
127 #endif /* _LINUX_ANNOTATE_H */
128