mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-29 17:22:07 +00:00
objtool: Collect more annotations in objtool.h
Suggested-by: Josh Poimboeuf <jpoimboe@redhat.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Josh Poimboeuf <jpoimboe@kernel.org> Link: https://lore.kernel.org/r/20241128094311.786598147@infradead.org
This commit is contained in:
parent
a8a330dd99
commit
bb81700674
@ -55,12 +55,6 @@
|
|||||||
#define LOCK_PREFIX ""
|
#define LOCK_PREFIX ""
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* objtool annotation to ignore the alternatives and only consider the original
|
|
||||||
* instruction(s).
|
|
||||||
*/
|
|
||||||
#define ANNOTATE_IGNORE_ALTERNATIVE ASM_ANNOTATE(ANNOTYPE_IGNORE_ALTS)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The patching flags are part of the upper bits of the @ft_flags parameter when
|
* The patching flags are part of the upper bits of the @ft_flags parameter when
|
||||||
* specifying them. The split is currently like this:
|
* specifying them. The split is currently like this:
|
||||||
@ -307,12 +301,6 @@ void nop_func(void);
|
|||||||
.endm
|
.endm
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* objtool annotation to ignore the alternatives and only consider the original
|
|
||||||
* instruction(s).
|
|
||||||
*/
|
|
||||||
#define ANNOTATE_IGNORE_ALTERNATIVE ANNOTATE type=ANNOTYPE_IGNORE_ALTS
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Issue one struct alt_instr descriptor entry (need to put it into
|
* Issue one struct alt_instr descriptor entry (need to put it into
|
||||||
* the section .altinstructions, see below). This entry contains
|
* the section .altinstructions, see below). This entry contains
|
||||||
|
@ -179,13 +179,6 @@
|
|||||||
|
|
||||||
#ifdef __ASSEMBLY__
|
#ifdef __ASSEMBLY__
|
||||||
|
|
||||||
/*
|
|
||||||
* This should be used immediately before an indirect jump/call. It tells
|
|
||||||
* objtool the subsequent indirect jump/call is vouched safe for retpoline
|
|
||||||
* builds.
|
|
||||||
*/
|
|
||||||
#define ANNOTATE_RETPOLINE_SAFE ANNOTATE type=ANNOTYPE_RETPOLINE_SAFE
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (ab)use RETPOLINE_SAFE on RET to annotate away 'bare' RET instructions
|
* (ab)use RETPOLINE_SAFE on RET to annotate away 'bare' RET instructions
|
||||||
* vs RETBleed validation.
|
* vs RETBleed validation.
|
||||||
@ -345,8 +338,6 @@
|
|||||||
|
|
||||||
#else /* __ASSEMBLY__ */
|
#else /* __ASSEMBLY__ */
|
||||||
|
|
||||||
#define ANNOTATE_RETPOLINE_SAFE ASM_ANNOTATE(ANNOTYPE_RETPOLINE_SAFE)
|
|
||||||
|
|
||||||
typedef u8 retpoline_thunk_t[RETPOLINE_THUNK_SIZE];
|
typedef u8 retpoline_thunk_t[RETPOLINE_THUNK_SIZE];
|
||||||
extern retpoline_thunk_t __x86_indirect_thunk_array[];
|
extern retpoline_thunk_t __x86_indirect_thunk_array[];
|
||||||
extern retpoline_thunk_t __x86_indirect_call_thunk_array[];
|
extern retpoline_thunk_t __x86_indirect_call_thunk_array[];
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
/* Begin/end of an instrumentation safe region */
|
/* Begin/end of an instrumentation safe region */
|
||||||
#define __instrumentation_begin(c) ({ \
|
#define __instrumentation_begin(c) ({ \
|
||||||
asm volatile(__stringify(c) ": nop\n\t" \
|
asm volatile(__stringify(c) ": nop\n\t" \
|
||||||
__ASM_ANNOTATE(__ASM_BREF(c), ANNOTYPE_INSTR_BEGIN)\
|
ANNOTATE_INSTR_BEGIN(__ASM_BREF(c)) \
|
||||||
: : "i" (c)); \
|
: : "i" (c)); \
|
||||||
})
|
})
|
||||||
#define instrumentation_begin() __instrumentation_begin(__COUNTER__)
|
#define instrumentation_begin() __instrumentation_begin(__COUNTER__)
|
||||||
@ -48,7 +48,7 @@
|
|||||||
*/
|
*/
|
||||||
#define __instrumentation_end(c) ({ \
|
#define __instrumentation_end(c) ({ \
|
||||||
asm volatile(__stringify(c) ": nop\n\t" \
|
asm volatile(__stringify(c) ": nop\n\t" \
|
||||||
__ASM_ANNOTATE(__ASM_BREF(c), ANNOTYPE_INSTR_END) \
|
ANNOTATE_INSTR_END(__ASM_BREF(c)) \
|
||||||
: : "i" (c)); \
|
: : "i" (c)); \
|
||||||
})
|
})
|
||||||
#define instrumentation_end() __instrumentation_end(__COUNTER__)
|
#define instrumentation_end() __instrumentation_end(__COUNTER__)
|
||||||
|
@ -63,8 +63,6 @@
|
|||||||
"911:\n\t" \
|
"911:\n\t" \
|
||||||
__ASM_ANNOTATE(911b, type)
|
__ASM_ANNOTATE(911b, type)
|
||||||
|
|
||||||
#define ANNOTATE_NOENDBR ASM_ANNOTATE(ANNOTYPE_NOENDBR)
|
|
||||||
|
|
||||||
#else /* __ASSEMBLY__ */
|
#else /* __ASSEMBLY__ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -113,19 +111,6 @@
|
|||||||
#endif
|
#endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/*
|
|
||||||
* Use objtool to validate the entry requirement that all code paths do
|
|
||||||
* VALIDATE_UNRET_END before RET.
|
|
||||||
*
|
|
||||||
* NOTE: The macro must be used at the beginning of a global symbol, otherwise
|
|
||||||
* it will be ignored.
|
|
||||||
*/
|
|
||||||
#if defined(CONFIG_NOINSTR_VALIDATION) && \
|
|
||||||
(defined(CONFIG_MITIGATION_UNRET_ENTRY) || defined(CONFIG_MITIGATION_SRSO))
|
|
||||||
#define VALIDATE_UNRET_BEGIN ANNOTATE type=ANNOTYPE_UNRET_BEGIN
|
|
||||||
#else
|
|
||||||
#define VALIDATE_UNRET_BEGIN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
.macro REACHABLE
|
.macro REACHABLE
|
||||||
.Lhere_\@:
|
.Lhere_\@:
|
||||||
@ -142,14 +127,6 @@
|
|||||||
.popsection
|
.popsection
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
#define ANNOTATE_NOENDBR ANNOTATE type=ANNOTYPE_NOENDBR
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This macro indicates that the following intra-function call is valid.
|
|
||||||
* Any non-annotated intra-function call will cause objtool to issue a warning.
|
|
||||||
*/
|
|
||||||
#define ANNOTATE_INTRA_FUNCTION_CALL ANNOTATE type=ANNOTYPE_INTRA_FUNCTION_CALL
|
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
#else /* !CONFIG_OBJTOOL */
|
#else /* !CONFIG_OBJTOOL */
|
||||||
@ -161,16 +138,12 @@
|
|||||||
#define STACK_FRAME_NON_STANDARD_FP(func)
|
#define STACK_FRAME_NON_STANDARD_FP(func)
|
||||||
#define __ASM_ANNOTATE(label, type)
|
#define __ASM_ANNOTATE(label, type)
|
||||||
#define ASM_ANNOTATE(type)
|
#define ASM_ANNOTATE(type)
|
||||||
#define ANNOTATE_NOENDBR
|
|
||||||
#define ASM_REACHABLE
|
#define ASM_REACHABLE
|
||||||
#else
|
#else
|
||||||
#define ANNOTATE_INTRA_FUNCTION_CALL
|
|
||||||
.macro UNWIND_HINT type:req sp_reg=0 sp_offset=0 signal=0
|
.macro UNWIND_HINT type:req sp_reg=0 sp_offset=0 signal=0
|
||||||
.endm
|
.endm
|
||||||
.macro STACK_FRAME_NON_STANDARD func:req
|
.macro STACK_FRAME_NON_STANDARD func:req
|
||||||
.endm
|
.endm
|
||||||
.macro ANNOTATE_NOENDBR
|
|
||||||
.endm
|
|
||||||
.macro REACHABLE
|
.macro REACHABLE
|
||||||
.endm
|
.endm
|
||||||
.macro ANNOTATE type:req
|
.macro ANNOTATE type:req
|
||||||
@ -179,4 +152,57 @@
|
|||||||
|
|
||||||
#endif /* CONFIG_OBJTOOL */
|
#endif /* CONFIG_OBJTOOL */
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
/*
|
||||||
|
* Annotate away the various 'relocation to !ENDBR` complaints; knowing that
|
||||||
|
* these relocations will never be used for indirect calls.
|
||||||
|
*/
|
||||||
|
#define ANNOTATE_NOENDBR ASM_ANNOTATE(ANNOTYPE_NOENDBR)
|
||||||
|
/*
|
||||||
|
* This should be used immediately before an indirect jump/call. It tells
|
||||||
|
* objtool the subsequent indirect jump/call is vouched safe for retpoline
|
||||||
|
* builds.
|
||||||
|
*/
|
||||||
|
#define ANNOTATE_RETPOLINE_SAFE ASM_ANNOTATE(ANNOTYPE_RETPOLINE_SAFE)
|
||||||
|
/*
|
||||||
|
* See linux/instrumentation.h
|
||||||
|
*/
|
||||||
|
#define ANNOTATE_INSTR_BEGIN(label) __ASM_ANNOTATE(label, ANNOTYPE_INSTR_BEGIN)
|
||||||
|
#define ANNOTATE_INSTR_END(label) __ASM_ANNOTATE(label, ANNOTYPE_INSTR_END)
|
||||||
|
/*
|
||||||
|
* objtool annotation to ignore the alternatives and only consider the original
|
||||||
|
* instruction(s).
|
||||||
|
*/
|
||||||
|
#define ANNOTATE_IGNORE_ALTERNATIVE ASM_ANNOTATE(ANNOTYPE_IGNORE_ALTS)
|
||||||
|
/*
|
||||||
|
* This macro indicates that the following intra-function call is valid.
|
||||||
|
* Any non-annotated intra-function call will cause objtool to issue a warning.
|
||||||
|
*/
|
||||||
|
#define ANNOTATE_INTRA_FUNCTION_CALL ASM_ANNOTATE(ANNOTYPE_INTRA_FUNCTION_CALL)
|
||||||
|
/*
|
||||||
|
* Use objtool to validate the entry requirement that all code paths do
|
||||||
|
* VALIDATE_UNRET_END before RET.
|
||||||
|
*
|
||||||
|
* NOTE: The macro must be used at the beginning of a global symbol, otherwise
|
||||||
|
* it will be ignored.
|
||||||
|
*/
|
||||||
|
#define ANNOTATE_UNRET_BEGIN ASM_ANNOTATE(ANNOTYPE_UNRET_BEGIN)
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define ANNOTATE_NOENDBR ANNOTATE type=ANNOTYPE_NOENDBR
|
||||||
|
#define ANNOTATE_RETPOLINE_SAFE ANNOTATE type=ANNOTYPE_RETPOLINE_SAFE
|
||||||
|
/* ANNOTATE_INSTR_BEGIN ANNOTATE type=ANNOTYPE_INSTR_BEGIN */
|
||||||
|
/* ANNOTATE_INSTR_END ANNOTATE type=ANNOTYPE_INSTR_END */
|
||||||
|
#define ANNOTATE_IGNORE_ALTERNATIVE ANNOTATE type=ANNOTYPE_IGNORE_ALTS
|
||||||
|
#define ANNOTATE_INTRA_FUNCTION_CALL ANNOTATE type=ANNOTYPE_INTRA_FUNCTION_CALL
|
||||||
|
#define ANNOTATE_UNRET_BEGIN ANNOTATE type=ANNOTYPE_UNRET_BEGIN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_NOINSTR_VALIDATION) && \
|
||||||
|
(defined(CONFIG_MITIGATION_UNRET_ENTRY) || defined(CONFIG_MITIGATION_SRSO))
|
||||||
|
#define VALIDATE_UNRET_BEGIN ANNOTATE_UNRET_BEGIN
|
||||||
|
#else
|
||||||
|
#define VALIDATE_UNRET_BEGIN
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _LINUX_OBJTOOL_H */
|
#endif /* _LINUX_OBJTOOL_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user