mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
objtool: Add ANNOTATE_DATA_SPECIAL
In preparation for the objtool klp diff subcommand, add an ANNOTATE_DATA_SPECIAL macro which annotates special section entries so that objtool can determine their size and location and extract them when needed. Acked-by: Petr Mladek <pmladek@suse.com> Tested-by: Joe Lawrence <joe.lawrence@redhat.com> Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
This commit is contained in:
@@ -8,34 +8,52 @@
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#define __ASM_ANNOTATE(label, type) \
|
||||
".pushsection .discard.annotate_insn,\"M\",@progbits,8\n\t" \
|
||||
#define __ASM_ANNOTATE(section, label, type) \
|
||||
".pushsection " section ",\"M\", @progbits, 8\n\t" \
|
||||
".long " __stringify(label) " - .\n\t" \
|
||||
".long " __stringify(type) "\n\t" \
|
||||
".popsection\n\t"
|
||||
|
||||
#define ASM_ANNOTATE_LABEL(label, type) \
|
||||
__ASM_ANNOTATE(".discard.annotate_insn", label, type)
|
||||
|
||||
#define ASM_ANNOTATE(type) \
|
||||
"911:\n\t" \
|
||||
__ASM_ANNOTATE(911b, type)
|
||||
ASM_ANNOTATE_LABEL(911b, type)
|
||||
|
||||
#define ASM_ANNOTATE_DATA(type) \
|
||||
"912:\n\t" \
|
||||
__ASM_ANNOTATE(".discard.annotate_data", 912b, type)
|
||||
|
||||
#else /* __ASSEMBLY__ */
|
||||
|
||||
.macro ANNOTATE type:req
|
||||
.macro __ANNOTATE section, type
|
||||
.Lhere_\@:
|
||||
.pushsection .discard.annotate_insn,"M",@progbits,8
|
||||
.pushsection \section, "M", @progbits, 8
|
||||
.long .Lhere_\@ - .
|
||||
.long \type
|
||||
.popsection
|
||||
.endm
|
||||
|
||||
.macro ANNOTATE type
|
||||
__ANNOTATE ".discard.annotate_insn", \type
|
||||
.endm
|
||||
|
||||
.macro ANNOTATE_DATA type
|
||||
__ANNOTATE ".discard.annotate_data", \type
|
||||
.endm
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#else /* !CONFIG_OBJTOOL */
|
||||
#ifndef __ASSEMBLY__
|
||||
#define __ASM_ANNOTATE(label, type) ""
|
||||
#define ASM_ANNOTATE_LABEL(label, type) ""
|
||||
#define ASM_ANNOTATE(type)
|
||||
#define ASM_ANNOTATE_DATA(type)
|
||||
#else /* __ASSEMBLY__ */
|
||||
.macro ANNOTATE type:req
|
||||
.macro ANNOTATE type
|
||||
.endm
|
||||
.macro ANNOTATE_DATA type
|
||||
.endm
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* !CONFIG_OBJTOOL */
|
||||
@@ -47,7 +65,7 @@
|
||||
* these relocations will never be used for indirect calls.
|
||||
*/
|
||||
#define ANNOTATE_NOENDBR ASM_ANNOTATE(ANNOTYPE_NOENDBR)
|
||||
#define ANNOTATE_NOENDBR_SYM(sym) asm(__ASM_ANNOTATE(sym, ANNOTYPE_NOENDBR))
|
||||
#define ANNOTATE_NOENDBR_SYM(sym) asm(ASM_ANNOTATE_LABEL(sym, ANNOTYPE_NOENDBR))
|
||||
|
||||
/*
|
||||
* This should be used immediately before an indirect jump/call. It tells
|
||||
@@ -58,8 +76,8 @@
|
||||
/*
|
||||
* 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)
|
||||
#define ANNOTATE_INSTR_BEGIN(label) ASM_ANNOTATE_LABEL(label, ANNOTYPE_INSTR_BEGIN)
|
||||
#define ANNOTATE_INSTR_END(label) ASM_ANNOTATE_LABEL(label, ANNOTYPE_INSTR_END)
|
||||
/*
|
||||
* objtool annotation to ignore the alternatives and only consider the original
|
||||
* instruction(s).
|
||||
@@ -83,7 +101,7 @@
|
||||
* terminating, like a noreturn CALL or UD2 when we know they are not -- eg
|
||||
* WARN using UD2.
|
||||
*/
|
||||
#define ANNOTATE_REACHABLE(label) __ASM_ANNOTATE(label, ANNOTYPE_REACHABLE)
|
||||
#define ANNOTATE_REACHABLE(label) ASM_ANNOTATE_LABEL(label, ANNOTYPE_REACHABLE)
|
||||
/*
|
||||
* This should not be used; it annotates away CFI violations. There are a few
|
||||
* valid use cases like kexec handover to the next kernel image, and there is
|
||||
@@ -92,7 +110,13 @@
|
||||
* There are also a few real issues annotated away, like EFI because we can't
|
||||
* control the EFI code.
|
||||
*/
|
||||
#define ANNOTATE_NOCFI_SYM(sym) asm(__ASM_ANNOTATE(sym, ANNOTYPE_NOCFI))
|
||||
#define ANNOTATE_NOCFI_SYM(sym) asm(ASM_ANNOTATE_LABEL(sym, ANNOTYPE_NOCFI))
|
||||
|
||||
/*
|
||||
* Annotate a special section entry. This emables livepatch module generation
|
||||
* to find and extract individual special section entries as needed.
|
||||
*/
|
||||
#define ANNOTATE_DATA_SPECIAL ASM_ANNOTATE_DATA(ANNOTYPE_DATA_SPECIAL)
|
||||
|
||||
#else /* __ASSEMBLY__ */
|
||||
#define ANNOTATE_NOENDBR ANNOTATE type=ANNOTYPE_NOENDBR
|
||||
@@ -104,6 +128,7 @@
|
||||
#define ANNOTATE_UNRET_BEGIN ANNOTATE type=ANNOTYPE_UNRET_BEGIN
|
||||
#define ANNOTATE_REACHABLE ANNOTATE type=ANNOTYPE_REACHABLE
|
||||
#define ANNOTATE_NOCFI_SYM ANNOTATE type=ANNOTYPE_NOCFI
|
||||
#define ANNOTATE_DATA_SPECIAL ANNOTATE_DATA type=ANNOTYPE_DATA_SPECIAL
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* _LINUX_ANNOTATE_H */
|
||||
|
||||
@@ -67,4 +67,6 @@ struct unwind_hint {
|
||||
#define ANNOTYPE_REACHABLE 8
|
||||
#define ANNOTYPE_NOCFI 9
|
||||
|
||||
#define ANNOTYPE_DATA_SPECIAL 1
|
||||
|
||||
#endif /* _LINUX_OBJTOOL_TYPES_H */
|
||||
|
||||
@@ -67,4 +67,6 @@ struct unwind_hint {
|
||||
#define ANNOTYPE_REACHABLE 8
|
||||
#define ANNOTYPE_NOCFI 9
|
||||
|
||||
#define ANNOTYPE_DATA_SPECIAL 1
|
||||
|
||||
#endif /* _LINUX_OBJTOOL_TYPES_H */
|
||||
|
||||
Reference in New Issue
Block a user