Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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 */