File Index
Files and directories
Sign in
FILE

annotate.h

File preview with syntax highlighting.

linux-6.19.14/include/linux/annotate.h C
  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 */
~/ Read-only file preview.