diff options
author | Josh Poimboeuf <jpoimboe@kernel.org> | 2023-04-12 23:26:15 +0300 |
---|---|---|
committer | Peter Zijlstra <peterz@infradead.org> | 2023-04-14 17:08:30 +0300 |
commit | 5743654f5e2ebd56df99f56fca5ba4b23fe3c815 (patch) | |
tree | ecebac1bcca601698a3504bb04fe39985b335ca7 /tools/objtool | |
parent | 4a2c3448ed3d362431c249ec0eb0f90281804ea8 (diff) | |
download | linux-5743654f5e2ebd56df99f56fca5ba4b23fe3c815.tar.xz |
objtool: Generate ORC data for __pfx code
Allow unwinding from prefix code by copying the CFI from the starting
instruction of the corresponding function. Even when the NOPs are
replaced, they're still stack-invariant instructions so the same ORC
entry can be reused everywhere.
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/bc3344e51f3e87102f1301a0be0f72a7689ea4a4.1681331135.git.jpoimboe@kernel.org
Diffstat (limited to 'tools/objtool')
-rw-r--r-- | tools/objtool/check.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 8ee4d51de6fa..df634dafefc4 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -4117,6 +4117,7 @@ static bool ignore_unreachable_insn(struct objtool_file *file, struct instructio static int add_prefix_symbol(struct objtool_file *file, struct symbol *func) { struct instruction *insn, *prev; + struct cfi_state *cfi; insn = find_insn(file, func->sec, func->offset); if (!insn) @@ -4145,6 +4146,19 @@ static int add_prefix_symbol(struct objtool_file *file, struct symbol *func) if (!prev) return -1; + if (!insn->cfi) { + /* + * This can happen if stack validation isn't enabled or the + * function is annotated with STACK_FRAME_NON_STANDARD. + */ + return 0; + } + + /* Propagate insn->cfi to the prefix code */ + cfi = cfi_hash_find_or_add(insn->cfi); + for (; prev != insn; prev = next_insn_same_sec(file, prev)) + prev->cfi = cfi; + return 0; } |