]> www.infradead.org Git - linux.git/commitdiff
objtool: Convert instrumentation_{begin,end}() to ANNOTATE
authorPeter Zijlstra <peterz@infradead.org>
Thu, 28 Nov 2024 09:38:55 +0000 (10:38 +0100)
committerPeter Zijlstra <peterz@infradead.org>
Mon, 2 Dec 2024 11:01:41 +0000 (12:01 +0100)
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Josh Poimboeuf <jpoimboe@kernel.org>
Link: https://lore.kernel.org/r/20241128094311.245980207@infradead.org
include/linux/instrumentation.h
include/linux/objtool.h
include/linux/objtool_types.h
tools/include/linux/objtool_types.h
tools/objtool/check.c

index bc7babe91b2e6492073b82d5c013c687e6ccca0b..c8f866cf02d8821752c3a23aafd1a003520ba0de 100644 (file)
@@ -4,14 +4,14 @@
 
 #ifdef CONFIG_NOINSTR_VALIDATION
 
+#include <linux/objtool.h>
 #include <linux/stringify.h>
 
 /* Begin/end of an instrumentation safe region */
 #define __instrumentation_begin(c) ({                                  \
        asm volatile(__stringify(c) ": nop\n\t"                         \
-                    ".pushsection .discard.instr_begin\n\t"            \
-                    ".long " __stringify(c) "b - .\n\t"                \
-                    ".popsection\n\t" : : "i" (c));                    \
+                    __ASM_ANNOTATE(__ASM_BREF(c), ANNOTYPE_INSTR_BEGIN)\
+                    : : "i" (c));                                      \
 })
 #define instrumentation_begin() __instrumentation_begin(__COUNTER__)
 
@@ -48,9 +48,8 @@
  */
 #define __instrumentation_end(c) ({                                    \
        asm volatile(__stringify(c) ": nop\n\t"                         \
-                    ".pushsection .discard.instr_end\n\t"              \
-                    ".long " __stringify(c) "b - .\n\t"                \
-                    ".popsection\n\t" : : "i" (c));                    \
+                    __ASM_ANNOTATE(__ASM_BREF(c), ANNOTYPE_INSTR_END)  \
+                    : : "i" (c));                                      \
 })
 #define instrumentation_end() __instrumentation_end(__COUNTER__)
 #else /* !CONFIG_NOINSTR_VALIDATION */
index b5e9c0ab4048e9c8cc3fadcb45d46ae2982f521f..89c67cd7eebebf1d22d36aaaa4f7fe18f38e9e2c 100644 (file)
        ".long 998b\n\t"                                                \
        ".popsection\n\t"
 
-#define ASM_ANNOTATE(type)                                             \
-       "911:\n\t"                                                      \
+#define __ASM_BREF(label)      label ## b
+
+#define __ASM_ANNOTATE(label, type)                                    \
        ".pushsection .discard.annotate_insn,\"M\",@progbits,8\n\t"     \
-       ".long 911b - .\n\t"                                            \
+       ".long " __stringify(label) " - .\n\t"                  \
        ".long " __stringify(type) "\n\t"                               \
        ".popsection\n\t"
 
+#define ASM_ANNOTATE(type)                                             \
+       "911:\n\t"                                              \
+       __ASM_ANNOTATE(911b, type)
+
 #define ANNOTATE_NOENDBR       ASM_ANNOTATE(ANNOTYPE_NOENDBR)
 
 #else /* __ASSEMBLY__ */
 #define UNWIND_HINT(type, sp_reg, sp_offset, signal) "\n\t"
 #define STACK_FRAME_NON_STANDARD(func)
 #define STACK_FRAME_NON_STANDARD_FP(func)
+#define __ASM_ANNOTATE(label, type)
 #define ASM_ANNOTATE(type)
 #define ANNOTATE_NOENDBR
 #define ASM_REACHABLE
index 1b348361ad1d7f28c674ba192d530957fe41a135..d4d68dd36f7a1467c1ee8b5a99bfb9d0896da9b7 100644 (file)
@@ -59,5 +59,7 @@ struct unwind_hint {
  */
 #define ANNOTYPE_NOENDBR               1
 #define ANNOTYPE_RETPOLINE_SAFE                2
+#define ANNOTYPE_INSTR_BEGIN           3
+#define ANNOTYPE_INSTR_END             4
 
 #endif /* _LINUX_OBJTOOL_TYPES_H */
index 1b348361ad1d7f28c674ba192d530957fe41a135..d4d68dd36f7a1467c1ee8b5a99bfb9d0896da9b7 100644 (file)
@@ -59,5 +59,7 @@ struct unwind_hint {
  */
 #define ANNOTYPE_NOENDBR               1
 #define ANNOTYPE_RETPOLINE_SAFE                2
+#define ANNOTYPE_INSTR_BEGIN           3
+#define ANNOTYPE_INSTR_END             4
 
 #endif /* _LINUX_OBJTOOL_TYPES_H */
index c5b52309b80dc05e89342a9131fee02df391366c..8e39c7f484d80e8e385268d0b2c0972f5843f577 100644 (file)
@@ -2440,48 +2440,19 @@ static int __annotate_retpoline_safe(int type, struct instruction *insn)
        return 0;
 }
 
-static int read_instr_hints(struct objtool_file *file)
+static int __annotate_instr(int type, struct instruction *insn)
 {
-       struct section *rsec;
-       struct instruction *insn;
-       struct reloc *reloc;
-
-       rsec = find_section_by_name(file->elf, ".rela.discard.instr_end");
-       if (!rsec)
-               return 0;
-
-       for_each_reloc(rsec, reloc) {
-               if (reloc->sym->type != STT_SECTION) {
-                       WARN("unexpected relocation symbol type in %s", rsec->name);
-                       return -1;
-               }
-
-               insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
-               if (!insn) {
-                       WARN("bad .discard.instr_end entry");
-                       return -1;
-               }
+       switch (type) {
+       case ANNOTYPE_INSTR_BEGIN:
+               insn->instr++;
+               break;
 
+       case ANNOTYPE_INSTR_END:
                insn->instr--;
-       }
-
-       rsec = find_section_by_name(file->elf, ".rela.discard.instr_begin");
-       if (!rsec)
-               return 0;
-
-       for_each_reloc(rsec, reloc) {
-               if (reloc->sym->type != STT_SECTION) {
-                       WARN("unexpected relocation symbol type in %s", rsec->name);
-                       return -1;
-               }
-
-               insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
-               if (!insn) {
-                       WARN("bad .discard.instr_begin entry");
-                       return -1;
-               }
+               break;
 
-               insn->instr++;
+       default:
+               break;
        }
 
        return 0;
@@ -2730,7 +2701,7 @@ static int decode_sections(struct objtool_file *file)
        if (ret)
                return ret;
 
-       ret = read_instr_hints(file);
+       ret = read_annotate(file, __annotate_instr);
        if (ret)
                return ret;