diff options
author | Julien Thierry <jthierry@redhat.com> | 2020-10-14 09:38:01 +0200 |
---|---|---|
committer | Josh Poimboeuf <jpoimboe@redhat.com> | 2021-01-14 01:13:10 +0100 |
commit | 468af56a7bbaa626da5a4578bedc930d731fba13 (patch) | |
tree | d928c9ef930731168ca94e101e24b2b2e8704abf /tools | |
parent | objtool: Fully validate the stack frame (diff) | |
download | linux-468af56a7bbaa626da5a4578bedc930d731fba13.tar.xz linux-468af56a7bbaa626da5a4578bedc930d731fba13.zip |
objtool: Support addition to set CFA base
On arm64, the compiler can set the frame pointer either
with a move operation or with and add operation like:
add (SP + constant), BP
For a simple move operation, the CFA base is changed from SP to BP.
Handle also changing the CFA base when the frame pointer is set with
an addition instruction.
Signed-off-by: Julien Thierry <jthierry@redhat.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/objtool/check.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 88210b0856f7..00d00f904536 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -1960,6 +1960,17 @@ static int update_cfi_state(struct instruction *insn, struct cfi_state *cfi, break; } + if (!cfi->drap && op->src.reg == CFI_SP && + op->dest.reg == CFI_BP && cfa->base == CFI_SP && + check_reg_frame_pos(®s[CFI_BP], -cfa->offset + op->src.offset)) { + + /* lea disp(%rsp), %rbp */ + cfa->base = CFI_BP; + cfa->offset -= op->src.offset; + cfi->bp_scratch = false; + break; + } + if (op->src.reg == CFI_SP && cfa->base == CFI_SP) { /* drap: lea disp(%rsp), %drap */ |