arm64: ftrace: fix building without CONFIG_MODULES
When CONFIG_MODULES is disabled, we cannot dereference a module pointer:
arch/arm64/kernel/ftrace.c: In function 'ftrace_make_call':
arch/arm64/kernel/ftrace.c:107:36: error: dereferencing pointer to incomplete type 'struct module'
trampoline = (unsigned long *)mod->arch.ftrace_trampoline;
Also, the within_module() function is not defined:
arch/arm64/kernel/ftrace.c: In function 'ftrace_make_nop':
arch/arm64/kernel/ftrace.c:171:8: error: implicit declaration of function 'within_module'; did you mean 'init_module'? [-Werror=implicit-function-declaration]
This addresses both by adding replacing the IS_ENABLED(CONFIG_ARM64_MODULE_PLTS)
checks with #ifdef versions.
Fixes: e71a4e1beb
("arm64: ftrace: add support for far branches to dynamic ftrace")
Reported-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
This commit is contained in:
parent
1eb34b6e51
commit
687644209a
|
@ -71,11 +71,12 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
|
||||||
int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
|
int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
|
||||||
{
|
{
|
||||||
unsigned long pc = rec->ip;
|
unsigned long pc = rec->ip;
|
||||||
long offset = (long)pc - (long)addr;
|
|
||||||
u32 old, new;
|
u32 old, new;
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_ARM64_MODULE_PLTS) &&
|
#ifdef CONFIG_ARM64_MODULE_PLTS
|
||||||
(offset < -SZ_128M || offset >= SZ_128M)) {
|
long offset = (long)pc - (long)addr;
|
||||||
|
|
||||||
|
if (offset < -SZ_128M || offset >= SZ_128M) {
|
||||||
unsigned long *trampoline;
|
unsigned long *trampoline;
|
||||||
struct module *mod;
|
struct module *mod;
|
||||||
|
|
||||||
|
@ -121,6 +122,7 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
|
||||||
}
|
}
|
||||||
addr = (unsigned long)&trampoline[1];
|
addr = (unsigned long)&trampoline[1];
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_ARM64_MODULE_PLTS */
|
||||||
|
|
||||||
old = aarch64_insn_gen_nop();
|
old = aarch64_insn_gen_nop();
|
||||||
new = aarch64_insn_gen_branch_imm(pc, addr, AARCH64_INSN_BRANCH_LINK);
|
new = aarch64_insn_gen_branch_imm(pc, addr, AARCH64_INSN_BRANCH_LINK);
|
||||||
|
@ -135,12 +137,13 @@ int ftrace_make_nop(struct module *mod, struct dyn_ftrace *rec,
|
||||||
unsigned long addr)
|
unsigned long addr)
|
||||||
{
|
{
|
||||||
unsigned long pc = rec->ip;
|
unsigned long pc = rec->ip;
|
||||||
long offset = (long)pc - (long)addr;
|
|
||||||
bool validate = true;
|
bool validate = true;
|
||||||
u32 old = 0, new;
|
u32 old = 0, new;
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_ARM64_MODULE_PLTS) &&
|
#ifdef CONFIG_ARM64_MODULE_PLTS
|
||||||
(offset < -SZ_128M || offset >= SZ_128M)) {
|
long offset = (long)pc - (long)addr;
|
||||||
|
|
||||||
|
if (offset < -SZ_128M || offset >= SZ_128M) {
|
||||||
u32 replaced;
|
u32 replaced;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -177,6 +180,7 @@ int ftrace_make_nop(struct module *mod, struct dyn_ftrace *rec,
|
||||||
old = aarch64_insn_gen_branch_imm(pc, addr,
|
old = aarch64_insn_gen_branch_imm(pc, addr,
|
||||||
AARCH64_INSN_BRANCH_LINK);
|
AARCH64_INSN_BRANCH_LINK);
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_ARM64_MODULE_PLTS */
|
||||||
|
|
||||||
new = aarch64_insn_gen_nop();
|
new = aarch64_insn_gen_nop();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue