objtool: Convert ANNOTATE_RETPOLINE_SAFE to ANNOTATE

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Josh Poimboeuf <jpoimboe@kernel.org>
Link: https://lore.kernel.org/r/20241128094311.145275669@infradead.org
This commit is contained in:
Peter Zijlstra 2024-11-28 10:38:54 +01:00
parent 22c3d58079
commit bf5febebd9
4 changed files with 25 additions and 48 deletions

View File

@ -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
@ -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[];

View File

@ -58,5 +58,6 @@ struct unwind_hint {
* Annotate types
*/
#define ANNOTYPE_NOENDBR 1
#define ANNOTYPE_RETPOLINE_SAFE 2
#endif /* _LINUX_OBJTOOL_TYPES_H */

View File

@ -58,5 +58,6 @@ struct unwind_hint {
* Annotate types
*/
#define ANNOTYPE_NOENDBR 1
#define ANNOTYPE_RETPOLINE_SAFE 2
#endif /* _LINUX_OBJTOOL_TYPES_H */

View File

@ -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)
@ -2406,53 +2406,37 @@ 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;
insn->noendbr = 1;
}
static int read_retpoline_hints(struct objtool_file *file)
{
struct section *rsec;
struct instruction *insn;
struct reloc *reloc;
rsec = find_section_by_name(file->elf, ".rela.discard.retpoline_safe");
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->noendbr = 1;
return 0;
}
insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
if (!insn) {
WARN("bad .discard.retpoline_safe entry");
return -1;
}
static int __annotate_retpoline_safe(int type, struct instruction *insn)
{
if (type != ANNOTYPE_RETPOLINE_SAFE)
return 0;
if (insn->type != INSN_JUMP_DYNAMIC &&
insn->type != INSN_CALL_DYNAMIC &&
insn->type != INSN_RETURN &&
insn->type != INSN_NOP) {
WARN_INSN(insn, "retpoline_safe hint not an indirect jump/call/ret/nop");
return -1;
}
insn->retpoline_safe = true;
if (insn->type != INSN_JUMP_DYNAMIC &&
insn->type != INSN_CALL_DYNAMIC &&
insn->type != INSN_RETURN &&
insn->type != INSN_NOP) {
WARN_INSN(insn, "retpoline_safe hint not an indirect jump/call/ret/nop");
return -1;
}
insn->retpoline_safe = true;
return 0;
}
@ -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;