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.

Signed-off-by: Josh Poimboeuf <jpoim...@kernel.org>
---
 include/linux/annotate.h            | 49 ++++++++++++++++++++++-------
 include/linux/objtool_types.h       |  2 ++
 tools/include/linux/objtool_types.h |  2 ++
 3 files changed, 41 insertions(+), 12 deletions(-)

diff --git a/include/linux/annotate.h b/include/linux/annotate.h
index ccb445496331c..7c10d34d198cf 100644
--- a/include/linux/annotate.h
+++ b/include/linux/annotate.h
@@ -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 */
diff --git a/include/linux/objtool_types.h b/include/linux/objtool_types.h
index aceac94632c8a..c6def4049b1ae 100644
--- a/include/linux/objtool_types.h
+++ b/include/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 */
diff --git a/tools/include/linux/objtool_types.h 
b/tools/include/linux/objtool_types.h
index aceac94632c8a..c6def4049b1ae 100644
--- a/tools/include/linux/objtool_types.h
+++ b/tools/include/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 */
-- 
2.50.0


Reply via email to