Commit bf5febeb authored by Peter Zijlstra's avatar Peter Zijlstra
Browse files

objtool: Convert ANNOTATE_RETPOLINE_SAFE to ANNOTATE

parent 22c3d580
Loading
Loading
Loading
Loading
+2 −11
Original line number Diff line number Diff line
@@ -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[];
+1 −0
Original line number Diff line number Diff line
@@ -58,5 +58,6 @@ struct unwind_hint {
 * Annotate types
 */
#define ANNOTYPE_NOENDBR		1
#define ANNOTYPE_RETPOLINE_SAFE		2

#endif /* _LINUX_OBJTOOL_TYPES_H */
+1 −0
Original line number Diff line number Diff line
@@ -58,5 +58,6 @@ struct unwind_hint {
 * Annotate types
 */
#define ANNOTYPE_NOENDBR		1
#define ANNOTYPE_RETPOLINE_SAFE		2

#endif /* _LINUX_OBJTOOL_TYPES_H */
+18 −34
Original line number Diff line number Diff line
@@ -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,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 &&
@@ -2451,8 +2437,6 @@ static int read_retpoline_hints(struct objtool_file *file)
	}

	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;