Commit 18aa6118 authored by Peter Zijlstra's avatar Peter Zijlstra
Browse files
parent 317f2a64
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -130,15 +130,12 @@
 * NOTE: The macro must be used at the beginning of a global symbol, otherwise
 * it will be ignored.
 */
.macro VALIDATE_UNRET_BEGIN
#if defined(CONFIG_NOINSTR_VALIDATION) && \
	(defined(CONFIG_MITIGATION_UNRET_ENTRY) || defined(CONFIG_MITIGATION_SRSO))
.Lhere_\@:
	.pushsection .discard.validate_unret
	.long	.Lhere_\@ - .
	.popsection
#define VALIDATE_UNRET_BEGIN	ANNOTATE type=ANNOTYPE_UNRET_BEGIN
#else
#define VALIDATE_UNRET_BEGIN
#endif
.endm

.macro REACHABLE
.Lhere_\@:
+1 −0
Original line number Diff line number Diff line
@@ -61,5 +61,6 @@ struct unwind_hint {
#define ANNOTYPE_RETPOLINE_SAFE		2
#define ANNOTYPE_INSTR_BEGIN		3
#define ANNOTYPE_INSTR_END		4
#define ANNOTYPE_UNRET_BEGIN		5

#endif /* _LINUX_OBJTOOL_TYPES_H */
+1 −0
Original line number Diff line number Diff line
@@ -61,5 +61,6 @@ struct unwind_hint {
#define ANNOTYPE_RETPOLINE_SAFE		2
#define ANNOTYPE_INSTR_BEGIN		3
#define ANNOTYPE_INSTR_END		4
#define ANNOTYPE_UNRET_BEGIN		5

#endif /* _LINUX_OBJTOOL_TYPES_H */
+5 −23
Original line number Diff line number Diff line
@@ -2458,33 +2458,15 @@ static int __annotate_instr(int type, struct instruction *insn)
	return 0;
}

static int read_validate_unret_hints(struct objtool_file *file)
static int __annotate_unret(int type, struct instruction *insn)
{
	struct section *rsec;
	struct instruction *insn;
	struct reloc *reloc;

	rsec = find_section_by_name(file->elf, ".rela.discard.validate_unret");
	if (!rsec)
	if (type != ANNOTYPE_UNRET_BEGIN)
		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;
		}
	insn->unret = 1;
	}

	return 0;
}

}

static int read_intra_function_calls(struct objtool_file *file)
{
@@ -2705,7 +2687,7 @@ static int decode_sections(struct objtool_file *file)
	if (ret)
		return ret;

	ret = read_validate_unret_hints(file);
	ret = read_annotate(file, __annotate_unret);
	if (ret)
		return ret;