mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-28 16:52:18 +00:00
objtool: Convert ANNOTATE_IGNORE_ALTERNATIVE 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.465691316@infradead.org
This commit is contained in:
parent
18aa6118a1
commit
f0cd57c35a
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user