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

objtool: Convert ANNOTATE_IGNORE_ALTERNATIVE to ANNOTATE

parent 18aa6118
Loading
Loading
Loading
Loading
+3 −11
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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 */
+1 −0
Original line number Diff line number Diff line
@@ -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 */
+10 −35
Original line number Diff line number Diff line
@@ -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.
@@ -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)
@@ -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;