Commit 58f36a57 authored by Josh Poimboeuf's avatar Josh Poimboeuf
Browse files

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: default avatarPetr Mladek <pmladek@suse.com>
Tested-by: default avatarJoe Lawrence <joe.lawrence@redhat.com>
Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
parent d2c60bde
Loading
Loading
Loading
Loading
+37 −12
Original line number Diff line number Diff line
@@ -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 */
+2 −0
Original line number Diff line number Diff line
@@ -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 */
+2 −0
Original line number Diff line number Diff line
@@ -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 */