Messages in this thread | | | Date | Thu, 13 Apr 2023 13:24:26 +0200 | From | Peter Zijlstra <> | Subject | Re: [PATCH 3/3] objtool: Generate ORC data for __pfx code |
| |
On Wed, Apr 12, 2023 at 01:26:15PM -0700, Josh Poimboeuf wrote: > 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> > --- > tools/objtool/check.c | 16 +++++++++++++++- > 1 file changed, 15 insertions(+), 1 deletion(-) > > diff --git a/tools/objtool/check.c b/tools/objtool/check.c > index 2f3136145b2e..3f27a0278bf8 100644 > --- a/tools/objtool/check.c > +++ b/tools/objtool/check.c > @@ -4123,6 +4123,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) > @@ -4151,6 +4152,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; > }
FWIW, this makes the whole thing hard rely on the prefix being single byte NOPs -- which they are, but perhaps we should assert this?
| |