Loading include/linux/instrumentation.h +5 −6 Original line number Diff line number Diff line Loading @@ -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__) Loading Loading @@ -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 */ Loading include/linux/objtool.h +9 −3 Original line number Diff line number Diff line Loading @@ -51,13 +51,18 @@ ".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__ */ Loading Loading @@ -161,6 +166,7 @@ #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 Loading include/linux/objtool_types.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 */ tools/include/linux/objtool_types.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 */ tools/objtool/check.c +10 −39 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading
include/linux/instrumentation.h +5 −6 Original line number Diff line number Diff line Loading @@ -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__) Loading Loading @@ -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 */ Loading
include/linux/objtool.h +9 −3 Original line number Diff line number Diff line Loading @@ -51,13 +51,18 @@ ".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__ */ Loading Loading @@ -161,6 +166,7 @@ #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 Loading
include/linux/objtool_types.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 */
tools/include/linux/objtool_types.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 */
tools/objtool/check.c +10 −39 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading