diff options
author | Ard Biesheuvel <ard.biesheuvel@linaro.org> | 2019-04-07 21:06:16 +0200 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2019-04-08 16:58:13 +0100 |
commit | 5a3ae7b314a2259b1188b22b392f5eba01e443ee (patch) | |
tree | 43d55b1ab816545f622a3c6330fad1898b78426c /arch/arm64/kernel/ftrace.c | |
parent | 15ade5d2e7775667cf191cf2f94327a4889f8b9d (diff) | |
download | linux-5a3ae7b314a2259b1188b22b392f5eba01e443ee.tar.gz linux-5a3ae7b314a2259b1188b22b392f5eba01e443ee.tar.bz2 linux-5a3ae7b314a2259b1188b22b392f5eba01e443ee.zip |
arm64/ftrace: fix inadvertent BUG() in trampoline check
The ftrace trampoline code (which deals with modules loaded out of
BL range of the core kernel) uses plt_entries_equal() to check whether
the per-module trampoline equals a zero buffer, to decide whether the
trampoline has already been initialized.
This triggers a BUG() in the opcode manipulation code, since we end
up checking the ADRP offset of a 0x0 opcode, which is not an ADRP
instruction.
So instead, add a helper to check whether a PLT is initialized, and
call that from the frace code.
Cc: <stable@vger.kernel.org> # v5.0
Fixes: bdb85cd1d206 ("arm64/module: switch to ADRP/ADD sequences for PLT entries")
Acked-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch/arm64/kernel/ftrace.c')
-rw-r--r-- | arch/arm64/kernel/ftrace.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/arch/arm64/kernel/ftrace.c b/arch/arm64/kernel/ftrace.c index 8e4431a8821f..07b298120182 100644 --- a/arch/arm64/kernel/ftrace.c +++ b/arch/arm64/kernel/ftrace.c @@ -107,8 +107,7 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) trampoline = get_plt_entry(addr, mod->arch.ftrace_trampoline); if (!plt_entries_equal(mod->arch.ftrace_trampoline, &trampoline)) { - if (!plt_entries_equal(mod->arch.ftrace_trampoline, - &(struct plt_entry){})) { + if (plt_entry_is_initialized(mod->arch.ftrace_trampoline)) { pr_err("ftrace: far branches to multiple entry points unsupported inside a single module\n"); return -EINVAL; } |