Loading arch/x86/include/asm/alternative.h +3 −11 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ #include <linux/types.h> #include <linux/stringify.h> #include <linux/objtool.h> #include <asm/asm.h> #define ALT_FLAGS_SHIFT 16 Loading Loading @@ -58,11 +59,7 @@ * objtool annotation to ignore the alternatives and only consider the original * instruction(s). */ #define ANNOTATE_IGNORE_ALTERNATIVE \ "999:\n\t" \ ".pushsection .discard.ignore_alts\n\t" \ ".long 999b\n\t" \ ".popsection\n\t" #define ANNOTATE_IGNORE_ALTERNATIVE ASM_ANNOTATE(ANNOTYPE_IGNORE_ALTS) /* * The patching flags are part of the upper bits of the @ft_flags parameter when Loading Loading @@ -314,12 +311,7 @@ void nop_func(void); * objtool annotation to ignore the alternatives and only consider the original * instruction(s). */ .macro ANNOTATE_IGNORE_ALTERNATIVE .Lannotate_\@: .pushsection .discard.ignore_alts .long .Lannotate_\@ .popsection .endm #define ANNOTATE_IGNORE_ALTERNATIVE ANNOTATE type=ANNOTYPE_IGNORE_ALTS /* * Issue one struct alt_instr descriptor entry (need to put it into Loading include/linux/objtool_types.h +1 −0 Original line number Diff line number Diff line Loading @@ -62,5 +62,6 @@ struct unwind_hint { #define ANNOTYPE_INSTR_BEGIN 3 #define ANNOTYPE_INSTR_END 4 #define ANNOTYPE_UNRET_BEGIN 5 #define ANNOTYPE_IGNORE_ALTS 6 #endif /* _LINUX_OBJTOOL_TYPES_H */ tools/include/linux/objtool_types.h +1 −0 Original line number Diff line number Diff line Loading @@ -62,5 +62,6 @@ struct unwind_hint { #define ANNOTYPE_INSTR_BEGIN 3 #define ANNOTYPE_INSTR_END 4 #define ANNOTYPE_UNRET_BEGIN 5 #define ANNOTYPE_IGNORE_ALTS 6 #endif /* _LINUX_OBJTOOL_TYPES_H */ tools/objtool/check.c +10 −35 Original line number Diff line number Diff line Loading @@ -1309,40 +1309,6 @@ static void add_uaccess_safe(struct objtool_file *file) } } /* * FIXME: For now, just ignore any alternatives which add retpolines. This is * a temporary hack, as it doesn't allow ORC to unwind from inside a retpoline. * But it at least allows objtool to understand the control flow *around* the * retpoline. */ static int add_ignore_alternatives(struct objtool_file *file) { struct section *rsec; struct reloc *reloc; struct instruction *insn; rsec = find_section_by_name(file->elf, ".rela.discard.ignore_alts"); 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.ignore_alts entry"); return -1; } insn->ignore_alts = true; } return 0; } /* * Symbols that replace INSN_CALL_DYNAMIC, every (tail) call to such a symbol * will be added to the .retpoline_sites section. Loading Loading @@ -2414,6 +2380,15 @@ static int read_annotate(struct objtool_file *file, int (*func)(int type, struct return 0; } static int __annotate_ignore_alts(int type, struct instruction *insn) { if (type != ANNOTYPE_IGNORE_ALTS) return 0; insn->ignore_alts = true; return 0; } static int __annotate_noendbr(int type, struct instruction *insn) { if (type != ANNOTYPE_NOENDBR) Loading Loading @@ -2626,7 +2601,7 @@ static int decode_sections(struct objtool_file *file) add_ignores(file); add_uaccess_safe(file); ret = add_ignore_alternatives(file); ret = read_annotate(file, __annotate_ignore_alts); if (ret) return ret; Loading Loading
arch/x86/include/asm/alternative.h +3 −11 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ #include <linux/types.h> #include <linux/stringify.h> #include <linux/objtool.h> #include <asm/asm.h> #define ALT_FLAGS_SHIFT 16 Loading Loading @@ -58,11 +59,7 @@ * objtool annotation to ignore the alternatives and only consider the original * instruction(s). */ #define ANNOTATE_IGNORE_ALTERNATIVE \ "999:\n\t" \ ".pushsection .discard.ignore_alts\n\t" \ ".long 999b\n\t" \ ".popsection\n\t" #define ANNOTATE_IGNORE_ALTERNATIVE ASM_ANNOTATE(ANNOTYPE_IGNORE_ALTS) /* * The patching flags are part of the upper bits of the @ft_flags parameter when Loading Loading @@ -314,12 +311,7 @@ void nop_func(void); * objtool annotation to ignore the alternatives and only consider the original * instruction(s). */ .macro ANNOTATE_IGNORE_ALTERNATIVE .Lannotate_\@: .pushsection .discard.ignore_alts .long .Lannotate_\@ .popsection .endm #define ANNOTATE_IGNORE_ALTERNATIVE ANNOTATE type=ANNOTYPE_IGNORE_ALTS /* * Issue one struct alt_instr descriptor entry (need to put it into Loading
include/linux/objtool_types.h +1 −0 Original line number Diff line number Diff line Loading @@ -62,5 +62,6 @@ struct unwind_hint { #define ANNOTYPE_INSTR_BEGIN 3 #define ANNOTYPE_INSTR_END 4 #define ANNOTYPE_UNRET_BEGIN 5 #define ANNOTYPE_IGNORE_ALTS 6 #endif /* _LINUX_OBJTOOL_TYPES_H */
tools/include/linux/objtool_types.h +1 −0 Original line number Diff line number Diff line Loading @@ -62,5 +62,6 @@ struct unwind_hint { #define ANNOTYPE_INSTR_BEGIN 3 #define ANNOTYPE_INSTR_END 4 #define ANNOTYPE_UNRET_BEGIN 5 #define ANNOTYPE_IGNORE_ALTS 6 #endif /* _LINUX_OBJTOOL_TYPES_H */
tools/objtool/check.c +10 −35 Original line number Diff line number Diff line Loading @@ -1309,40 +1309,6 @@ static void add_uaccess_safe(struct objtool_file *file) } } /* * FIXME: For now, just ignore any alternatives which add retpolines. This is * a temporary hack, as it doesn't allow ORC to unwind from inside a retpoline. * But it at least allows objtool to understand the control flow *around* the * retpoline. */ static int add_ignore_alternatives(struct objtool_file *file) { struct section *rsec; struct reloc *reloc; struct instruction *insn; rsec = find_section_by_name(file->elf, ".rela.discard.ignore_alts"); 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.ignore_alts entry"); return -1; } insn->ignore_alts = true; } return 0; } /* * Symbols that replace INSN_CALL_DYNAMIC, every (tail) call to such a symbol * will be added to the .retpoline_sites section. Loading Loading @@ -2414,6 +2380,15 @@ static int read_annotate(struct objtool_file *file, int (*func)(int type, struct return 0; } static int __annotate_ignore_alts(int type, struct instruction *insn) { if (type != ANNOTYPE_IGNORE_ALTS) return 0; insn->ignore_alts = true; return 0; } static int __annotate_noendbr(int type, struct instruction *insn) { if (type != ANNOTYPE_NOENDBR) Loading Loading @@ -2626,7 +2601,7 @@ static int decode_sections(struct objtool_file *file) add_ignores(file); add_uaccess_safe(file); ret = add_ignore_alternatives(file); ret = read_annotate(file, __annotate_ignore_alts); if (ret) return ret; Loading