at v6.19-rc2 4.3 kB view raw
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 */