Loading arch/x86/include/asm/nospec-branch.h +2 −11 Original line number Diff line number Diff line Loading @@ -184,12 +184,7 @@ * objtool the subsequent indirect jump/call is vouched safe for retpoline * builds. */ .macro ANNOTATE_RETPOLINE_SAFE .Lhere_\@: .pushsection .discard.retpoline_safe .long .Lhere_\@ .popsection .endm #define ANNOTATE_RETPOLINE_SAFE ANNOTATE type=ANNOTYPE_RETPOLINE_SAFE /* * (ab)use RETPOLINE_SAFE on RET to annotate away 'bare' RET instructions Loading Loading @@ -350,11 +345,7 @@ #else /* __ASSEMBLY__ */ #define ANNOTATE_RETPOLINE_SAFE \ "999:\n\t" \ ".pushsection .discard.retpoline_safe\n\t" \ ".long 999b\n\t" \ ".popsection\n\t" #define ANNOTATE_RETPOLINE_SAFE ASM_ANNOTATE(ANNOTYPE_RETPOLINE_SAFE) typedef u8 retpoline_thunk_t[RETPOLINE_THUNK_SIZE]; extern retpoline_thunk_t __x86_indirect_thunk_array[]; Loading include/linux/objtool_types.h +1 −0 Original line number Diff line number Diff line Loading @@ -58,5 +58,6 @@ struct unwind_hint { * Annotate types */ #define ANNOTYPE_NOENDBR 1 #define ANNOTYPE_RETPOLINE_SAFE 2 #endif /* _LINUX_OBJTOOL_TYPES_H */ tools/include/linux/objtool_types.h +1 −0 Original line number Diff line number Diff line Loading @@ -58,5 +58,6 @@ struct unwind_hint { * Annotate types */ #define ANNOTYPE_NOENDBR 1 #define ANNOTYPE_RETPOLINE_SAFE 2 #endif /* _LINUX_OBJTOOL_TYPES_H */ tools/objtool/check.c +18 −34 Original line number Diff line number Diff line Loading @@ -2373,12 +2373,12 @@ static int read_unwind_hints(struct objtool_file *file) return 0; } static int read_annotate(struct objtool_file *file, void (*func)(int type, struct instruction *insn)) static int read_annotate(struct objtool_file *file, int (*func)(int type, struct instruction *insn)) { struct section *sec; struct instruction *insn; struct reloc *reloc; int type; int type, ret; sec = find_section_by_name(file->elf, ".discard.annotate_insn"); if (!sec) Loading Loading @@ -2406,42 +2406,28 @@ static int read_annotate(struct objtool_file *file, void (*func)(int type, struc return -1; } func(type, insn); ret = func(type, insn); if (ret < 0) return ret; } return 0; } static void __annotate_noendbr(int type, struct instruction *insn) static int __annotate_noendbr(int type, struct instruction *insn) { if (type != ANNOTYPE_NOENDBR) return; return 0; insn->noendbr = 1; return 0; } static int read_retpoline_hints(struct objtool_file *file) static int __annotate_retpoline_safe(int type, struct instruction *insn) { struct section *rsec; struct instruction *insn; struct reloc *reloc; rsec = find_section_by_name(file->elf, ".rela.discard.retpoline_safe"); if (!rsec) if (type != ANNOTYPE_RETPOLINE_SAFE) 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.retpoline_safe entry"); return -1; } if (insn->type != INSN_JUMP_DYNAMIC && insn->type != INSN_CALL_DYNAMIC && insn->type != INSN_RETURN && Loading @@ -2451,8 +2437,6 @@ static int read_retpoline_hints(struct objtool_file *file) } insn->retpoline_safe = true; } return 0; } Loading Loading @@ -2742,7 +2726,7 @@ static int decode_sections(struct objtool_file *file) if (ret) return ret; ret = read_retpoline_hints(file); ret = read_annotate(file, __annotate_retpoline_safe); if (ret) return ret; Loading Loading
arch/x86/include/asm/nospec-branch.h +2 −11 Original line number Diff line number Diff line Loading @@ -184,12 +184,7 @@ * objtool the subsequent indirect jump/call is vouched safe for retpoline * builds. */ .macro ANNOTATE_RETPOLINE_SAFE .Lhere_\@: .pushsection .discard.retpoline_safe .long .Lhere_\@ .popsection .endm #define ANNOTATE_RETPOLINE_SAFE ANNOTATE type=ANNOTYPE_RETPOLINE_SAFE /* * (ab)use RETPOLINE_SAFE on RET to annotate away 'bare' RET instructions Loading Loading @@ -350,11 +345,7 @@ #else /* __ASSEMBLY__ */ #define ANNOTATE_RETPOLINE_SAFE \ "999:\n\t" \ ".pushsection .discard.retpoline_safe\n\t" \ ".long 999b\n\t" \ ".popsection\n\t" #define ANNOTATE_RETPOLINE_SAFE ASM_ANNOTATE(ANNOTYPE_RETPOLINE_SAFE) typedef u8 retpoline_thunk_t[RETPOLINE_THUNK_SIZE]; extern retpoline_thunk_t __x86_indirect_thunk_array[]; Loading
include/linux/objtool_types.h +1 −0 Original line number Diff line number Diff line Loading @@ -58,5 +58,6 @@ struct unwind_hint { * Annotate types */ #define ANNOTYPE_NOENDBR 1 #define ANNOTYPE_RETPOLINE_SAFE 2 #endif /* _LINUX_OBJTOOL_TYPES_H */
tools/include/linux/objtool_types.h +1 −0 Original line number Diff line number Diff line Loading @@ -58,5 +58,6 @@ struct unwind_hint { * Annotate types */ #define ANNOTYPE_NOENDBR 1 #define ANNOTYPE_RETPOLINE_SAFE 2 #endif /* _LINUX_OBJTOOL_TYPES_H */
tools/objtool/check.c +18 −34 Original line number Diff line number Diff line Loading @@ -2373,12 +2373,12 @@ static int read_unwind_hints(struct objtool_file *file) return 0; } static int read_annotate(struct objtool_file *file, void (*func)(int type, struct instruction *insn)) static int read_annotate(struct objtool_file *file, int (*func)(int type, struct instruction *insn)) { struct section *sec; struct instruction *insn; struct reloc *reloc; int type; int type, ret; sec = find_section_by_name(file->elf, ".discard.annotate_insn"); if (!sec) Loading Loading @@ -2406,42 +2406,28 @@ static int read_annotate(struct objtool_file *file, void (*func)(int type, struc return -1; } func(type, insn); ret = func(type, insn); if (ret < 0) return ret; } return 0; } static void __annotate_noendbr(int type, struct instruction *insn) static int __annotate_noendbr(int type, struct instruction *insn) { if (type != ANNOTYPE_NOENDBR) return; return 0; insn->noendbr = 1; return 0; } static int read_retpoline_hints(struct objtool_file *file) static int __annotate_retpoline_safe(int type, struct instruction *insn) { struct section *rsec; struct instruction *insn; struct reloc *reloc; rsec = find_section_by_name(file->elf, ".rela.discard.retpoline_safe"); if (!rsec) if (type != ANNOTYPE_RETPOLINE_SAFE) 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.retpoline_safe entry"); return -1; } if (insn->type != INSN_JUMP_DYNAMIC && insn->type != INSN_CALL_DYNAMIC && insn->type != INSN_RETURN && Loading @@ -2451,8 +2437,6 @@ static int read_retpoline_hints(struct objtool_file *file) } insn->retpoline_safe = true; } return 0; } Loading Loading @@ -2742,7 +2726,7 @@ static int decode_sections(struct objtool_file *file) if (ret) return ret; ret = read_retpoline_hints(file); ret = read_annotate(file, __annotate_retpoline_safe); if (ret) return ret; Loading