objtool: Re-add UNWIND_HINT_{SAVE_RESTORE}
commit 8faea26e611189e933ea2281975ff4dc7c1106b6 upstream.
Commit
c536ed2fff
("objtool: Remove SAVE/RESTORE hints")
removed the save/restore unwind hints because they were no longer
needed. Now they're going to be needed again so re-add them.
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Borislav Petkov <bp@suse.de>
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
1dbefa5772
commit
df93717a32
@@ -1752,6 +1752,17 @@ static int read_unwind_hints(struct objtool_file *file)
|
||||
|
||||
insn->hint = true;
|
||||
|
||||
if (hint->type == UNWIND_HINT_TYPE_SAVE) {
|
||||
insn->hint = false;
|
||||
insn->save = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (hint->type == UNWIND_HINT_TYPE_RESTORE) {
|
||||
insn->restore = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (hint->type == UNWIND_HINT_TYPE_REGS_PARTIAL) {
|
||||
struct symbol *sym = find_symbol_by_offset(insn->sec, insn->offset);
|
||||
|
||||
@@ -2847,6 +2858,35 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
|
||||
state.instr += insn->instr;
|
||||
|
||||
if (insn->hint) {
|
||||
if (insn->restore) {
|
||||
struct instruction *save_insn, *i;
|
||||
|
||||
i = insn;
|
||||
save_insn = NULL;
|
||||
|
||||
sym_for_each_insn_continue_reverse(file, func, i) {
|
||||
if (i->save) {
|
||||
save_insn = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!save_insn) {
|
||||
WARN_FUNC("no corresponding CFI save for CFI restore",
|
||||
sec, insn->offset);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!save_insn->visited) {
|
||||
WARN_FUNC("objtool isn't smart enough to handle this CFI save/restore combo",
|
||||
sec, insn->offset);
|
||||
return 1;
|
||||
}
|
||||
|
||||
insn->cfi = save_insn->cfi;
|
||||
nr_cfi_reused++;
|
||||
}
|
||||
|
||||
state.cfi = *insn->cfi;
|
||||
} else {
|
||||
/* XXX track if we actually changed state.cfi */
|
||||
|
@@ -47,6 +47,7 @@ struct instruction {
|
||||
unsigned long immediate;
|
||||
bool dead_end, ignore, ignore_alts;
|
||||
bool hint;
|
||||
bool save, restore;
|
||||
bool retpoline_safe;
|
||||
bool entry;
|
||||
s8 instr;
|
||||
|
Reference in New Issue
Block a user